44import android .app .DownloadManager ;
55import android .content .Intent ;
66import android .net .Uri ;
7- import android .support .annotation .Nullable ;
87
9- import com .RNFetchBlob .Utils .EncodingResolver ;
10- import com .RNFetchBlob .Utils .RNFBCookieJar ;
8+ import com .RNFetchBlob .Utils .DataConverter ;
119import com .facebook .react .bridge .ActivityEventListener ;
1210import com .facebook .react .bridge .Callback ;
1311import com .facebook .react .bridge .LifecycleEventListener ;
1816import com .facebook .react .bridge .ReadableArray ;
1917import com .facebook .react .bridge .ReadableMap ;
2018import com .facebook .react .bridge .WritableMap ;
21- import com .facebook .react .modules .network .ForwardingCookieHandler ;
2219import com .facebook .react .modules .network .CookieJarContainer ;
20+ import com .facebook .react .modules .network .ForwardingCookieHandler ;
2321import com .facebook .react .modules .network .OkHttpClientProvider ;
24- import okhttp3 .OkHttpClient ;
25- import okhttp3 .JavaNetCookieJar ;
2622
2723import java .util .HashMap ;
2824import java .util .Map ;
2925import java .util .concurrent .LinkedBlockingQueue ;
3026import java .util .concurrent .ThreadPoolExecutor ;
3127import java .util .concurrent .TimeUnit ;
3228
29+ import okhttp3 .JavaNetCookieJar ;
30+ import okhttp3 .OkHttpClient ;
31+
3332import static android .app .Activity .RESULT_OK ;
3433import static com .RNFetchBlob .RNFetchBlobConst .GET_CONTENT_INTENT ;
34+ import static com .RNFetchBlob .RNFetchBlobConst .RNFB_RESPONSE_ASCII ;
35+ import static com .RNFetchBlob .RNFetchBlobConst .RNFB_RESPONSE_BASE64 ;
36+ import static com .RNFetchBlob .RNFetchBlobConst .RNFB_RESPONSE_UTF8 ;
3537
3638public class RNFetchBlob extends ReactContextBaseJavaModule {
3739
@@ -315,39 +317,6 @@ public void run() {
315317 });
316318 }
317319
318- @ ReactMethod
319- public void readChunk (final String path , final String encoding , final int offset , final int length , final Promise promise ) {
320- fsThreadPool .execute (new Runnable () {
321- @ Override
322- public void run () {
323- try {
324- Object result = RNFetchBlobFS .readChunk (path , encoding , offset , length );
325- EncodingResolver .resolve (promise , encoding , result );
326- } catch (Exception e ) {
327- e .printStackTrace ();
328- promise .reject (e .getMessage (), e .getMessage ()) ;
329- }
330- }
331- });
332-
333- }
334-
335- @ ReactMethod
336- public void writeChunk (final String path , final String encoding , final String data , final int offset , final int length , final Promise promise ) {
337- fsThreadPool .execute (new Runnable () {
338- @ Override
339- public void run () {
340- try {
341- RNFetchBlobFS .writeChunk (path , encoding , data , offset );
342- promise .resolve (null );
343- } catch (Exception e ) {
344- e .printStackTrace ();
345- promise .reject (e .getMessage (), e .getMessage ()) ;
346- }
347- }
348- });
349- }
350-
351320
352321 @ ReactMethod
353322 public void enableUploadProgressReport (String taskId , int interval , int count ) {
@@ -366,27 +335,99 @@ public void fetchBlobForm(ReadableMap options, String taskId, String method, Str
366335 }
367336
368337 @ ReactMethod
369- public void read (final String path , final String encoding , final int offset , final int length , final @ Nullable String dest , final Promise promise ) {
338+ public void openFileHandle (final String path , final int mode , final Promise promise ) {
370339 fsThreadPool .execute (new Runnable () {
371340 @ Override
372341 public void run () {
373- RNFetchBlobFS fs = new RNFetchBlobFS (RCTContext );
374- fs .read (path , encoding , offset , length , dest , promise );
342+ RNFetchBlobOpenFile .Mode accessMode = RNFetchBlobOpenFile .Mode .READ ;
343+ if (mode == 1 )
344+ accessMode = RNFetchBlobOpenFile .Mode .READ ;
345+ else if (mode == 2 )
346+ accessMode = RNFetchBlobOpenFile .Mode .WRITE ;
347+ else {
348+ accessMode = RNFetchBlobOpenFile .Mode .READWRITE ;
349+ }
350+ try {
351+ Integer id = RNFetchBlobFS .openFile (path , accessMode );
352+ promise .resolve (id );
353+ }
354+ catch (Exception ex ) {
355+ promise .reject (
356+ "RNFetchBlob failed to open file handle" ,
357+ DataConverter .exceptionToStringStackTrace (ex )
358+ );
359+ }
375360 }
376361 });
377362 }
378363
379364 @ ReactMethod
380- public void write (final String path , final String data , final String encoding , final int offset , final int length , final Promise promise ) {
365+ public void readFromHandle (final int id , final String encoding , final int offset , final int length , final Promise promise ) {
381366 fsThreadPool .execute (new Runnable () {
382367 @ Override
383368 public void run () {
384- RNFetchBlobFS fs = new RNFetchBlobFS (RCTContext );
385- fs .write (path , encoding , data , offset , length , promise );
369+ try {
370+ RNFetchBlobOpenFile handle = RNFetchBlobFS .fileHandles .get (id );
371+ Object result = handle .read (encoding , offset , length );
372+ switch (encoding ) {
373+ case RNFB_RESPONSE_BASE64 :
374+ promise .resolve ((String ) result );
375+ break ;
376+ case RNFB_RESPONSE_UTF8 :
377+ promise .resolve ((String ) result );
378+ break ;
379+ case RNFB_RESPONSE_ASCII :
380+ promise .resolve ((ReadableArray ) result );
381+ break ;
382+ }
383+ }
384+ catch (Exception ex ) {
385+ promise .reject (
386+ "RNFetchBlob failed to read from file handle" ,
387+ DataConverter .exceptionToStringStackTrace (ex )
388+ );
389+ }
390+
386391 }
387392 });
388393 }
389394
395+ @ ReactMethod
396+ public void writeToHandle (final int id , final String encoding , final int offset , final String data , final Promise promise ) {
397+
398+ fsThreadPool .execute (new Runnable () {
399+ @ Override
400+ public void run () {
401+ try {
402+ RNFetchBlobOpenFile handle = RNFetchBlobFS .fileHandles .get (id );
403+ handle .write (encoding , data , offset );
404+ promise .resolve (null );
405+ }
406+ catch (Exception ex ) {
407+ promise .reject (
408+ "RNFetchBlob failed to write tofile handle" ,
409+ DataConverter .exceptionToStringStackTrace (ex )
410+ );
411+ }
412+ }
413+ });
414+ }
415+
416+ @ ReactMethod
417+ public void closeHandle (final int id , Promise promise ) {
418+ try {
419+ RNFetchBlobOpenFile handle = RNFetchBlobFS .fileHandles .get (id );
420+ handle .close ();
421+ promise .resolve (null );
422+ }
423+ catch (Exception ex ) {
424+ promise .reject (
425+ "RNFetchBlob failed to close handle" ,
426+ DataConverter .exceptionToStringStackTrace (ex )
427+ );
428+ }
429+ }
430+
390431 public void getContentIntent (String mime , Promise promise ) {
391432 Intent i = new Intent (Intent .ACTION_GET_CONTENT );
392433 if (mime != null )
0 commit comments