Skip to content
This repository was archived by the owner on Mar 16, 2019. It is now read-only.

Commit 4960f0a

Browse files
committed
Add Android implementation for #27
1 parent 5bbe990 commit 4960f0a

File tree

3 files changed

+141
-33
lines changed

3 files changed

+141
-33
lines changed

src/android/src/main/java/com/RNFetchBlob/RNFetchBlob.java

Lines changed: 17 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,14 @@
11
package com.RNFetchBlob;
22

3-
import android.app.DownloadManager;
4-
import android.content.Context;
5-
import android.net.Uri;
6-
import android.os.Environment;
7-
8-
import com.facebook.react.bridge.Arguments;
93
import com.facebook.react.bridge.Callback;
4+
import com.facebook.react.bridge.Promise;
105
import com.facebook.react.bridge.ReactApplicationContext;
116
import com.facebook.react.bridge.ReactContextBaseJavaModule;
127
import com.facebook.react.bridge.ReactMethod;
138
import com.facebook.react.bridge.ReadableArray;
149
import com.facebook.react.bridge.ReadableMap;
15-
import com.facebook.react.bridge.ReadableMapKeySetIterator;
16-
import com.facebook.react.bridge.WritableArray;
17-
import com.facebook.react.bridge.WritableMap;
18-
import com.facebook.react.modules.core.DeviceEventManagerModule;
19-
import com.loopj.android.http.AsyncHttpClient;
20-
import com.loopj.android.http.AsyncHttpResponseHandler;
21-
import com.loopj.android.http.Base64;
22-
import com.loopj.android.http.MySSLSocketFactory;
23-
import com.loopj.android.http.RequestParams;
24-
25-
import java.io.ByteArrayOutputStream;
26-
import java.io.File;
27-
import java.security.KeyStore;
28-
import java.util.HashMap;
29-
import java.util.Map;
3010

31-
import cz.msebera.android.httpclient.HttpEntity;
32-
import cz.msebera.android.httpclient.entity.AbstractHttpEntity;
33-
import cz.msebera.android.httpclient.entity.ByteArrayEntity;
34-
import cz.msebera.android.httpclient.entity.ContentType;
35-
import cz.msebera.android.httpclient.entity.FileEntity;
36-
import cz.msebera.android.httpclient.entity.mime.MultipartEntityBuilder;
37-
import cz.msebera.android.httpclient.entity.mime.content.ContentBody;
11+
import java.util.Map;
3812

3913
public class RNFetchBlob extends ReactContextBaseJavaModule {
4014

@@ -119,6 +93,21 @@ public void removeSession(ReadableArray paths, Callback callback) {
11993
RNFetchBlobFS.removeSession(paths, callback);
12094
}
12195

96+
@ReactMethod
97+
public void readFile(String path, String encoding, Promise promise) {
98+
RNFetchBlobFS.readFile(path, encoding, promise);
99+
}
100+
101+
@ReactMethod
102+
public void writeFileArray(String path, ReadableArray data, Promise promise) {
103+
RNFetchBlobFS.writeFile(path, data, promise);
104+
}
105+
106+
@ReactMethod
107+
public void writeFile(String path, String encoding, String data, Promise promise) {
108+
RNFetchBlobFS.writeFile(path, encoding, data, promise);
109+
}
110+
122111
@ReactMethod
123112
public void lstat(String path, Callback callback) {
124113
RNFetchBlobFS.lstat(path, callback);

src/android/src/main/java/com/RNFetchBlob/RNFetchBlobFS.java

Lines changed: 120 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import com.facebook.react.bridge.Arguments;
1010
import com.facebook.react.bridge.Callback;
11+
import com.facebook.react.bridge.Promise;
1112
import com.facebook.react.bridge.ReactApplicationContext;
1213
import com.facebook.react.bridge.ReadableArray;
1314
import com.facebook.react.bridge.ReadableMap;
@@ -18,16 +19,19 @@
1819

1920
import java.io.File;
2021
import java.io.FileInputStream;
22+
import java.io.FileNotFoundException;
2123
import java.io.FileOutputStream;
2224
import java.io.IOException;
2325
import java.io.InputStream;
2426
import java.io.OutputStream;
2527
import java.io.OutputStreamWriter;
2628
import java.nio.charset.Charset;
2729
import java.nio.charset.StandardCharsets;
30+
import java.util.ArrayList;
2831
import java.util.HashMap;
2932
import java.util.Map;
3033
import java.util.UUID;
34+
import java.util.concurrent.ExecutionException;
3135

3236
import cz.msebera.android.httpclient.util.EncodingUtils;
3337

@@ -48,6 +52,113 @@ public class RNFetchBlobFS {
4852
this.emitter = ctx.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class);
4953
}
5054

55+
/**
56+
* Write string with encoding to file
57+
* @param path Destination file path.
58+
* @param encoding Encoding of the string.
59+
* @param data Array passed from JS context.
60+
* @param promise
61+
*/
62+
static public void writeFile(String path, String encoding, String data, final Promise promise) {
63+
AsyncTask<String, Integer, Integer> task = new AsyncTask<String, Integer, Integer>() {
64+
@Override
65+
protected Integer doInBackground(String... args) {
66+
String path = args[0];
67+
String encoding = args[1];
68+
String data = args[2];
69+
File f = new File(path);
70+
try {
71+
FileOutputStream fout = new FileOutputStream(f);
72+
fout.write(stringToBytes(data, encoding));
73+
fout.close();
74+
promise.resolve(null);
75+
} catch (Exception e) {
76+
promise.reject("RNFetchBlob writeFileError", e.getLocalizedMessage());
77+
}
78+
return null;
79+
}
80+
};
81+
task.execute(path, encoding, data);
82+
}
83+
84+
/**
85+
* Write array of bytes into file
86+
* @param path Destination file path.
87+
* @param data Array passed from JS context.
88+
* @param promise
89+
*/
90+
static public void writeFile(String path, ReadableArray data, final Promise promise) {
91+
AsyncTask<Object, Integer, Integer> task = new AsyncTask<Object, Integer, Integer>() {
92+
@Override
93+
protected Integer doInBackground(Object... args) {
94+
String path = String.valueOf(args[0]);
95+
ReadableArray data = (ReadableArray) args[2];
96+
File f = new File(path);
97+
try {
98+
FileOutputStream os = new FileOutputStream(f);
99+
byte [] bytes = new byte[data.size()];
100+
for(int i=0;i<data.size();i++) {
101+
bytes[i] = (byte) data.getInt(i);
102+
}
103+
os.write(bytes);
104+
os.close();
105+
promise.resolve(null);
106+
} catch (Exception e) {
107+
promise.reject("RNFetchBlob writeFileError", e.getLocalizedMessage());
108+
}
109+
return null;
110+
}
111+
};
112+
task.execute(path, data);
113+
}
114+
115+
/**
116+
* Read file with a buffer that has the same size as the target file.
117+
* @param path Path of the file.
118+
* @param encoding Encoding of read stream.
119+
* @param promise
120+
*/
121+
static public void readFile(String path, String encoding, final Promise promise ) {
122+
AsyncTask task = new AsyncTask<String, Integer, Integer>() {
123+
@Override
124+
protected Integer doInBackground(String... strings) {
125+
try {
126+
String path = strings[0];
127+
String encoding = strings[1];
128+
File f = new File(path);
129+
int length = (int) f.length();
130+
byte[] bytes = new byte[length];
131+
FileInputStream in = new FileInputStream(f);
132+
in.read(bytes);
133+
in.close();
134+
switch (encoding.toLowerCase()) {
135+
case "base64" :
136+
promise.resolve(Base64.encodeToString(bytes, 0));
137+
break;
138+
case "ascii" :
139+
WritableArray asciiResult = Arguments.createArray();
140+
for(byte b : bytes) {
141+
asciiResult.pushInt((int)b);
142+
}
143+
promise.resolve(bytes);
144+
break;
145+
case "utf8" :
146+
promise.resolve(new String(bytes));
147+
break;
148+
default:
149+
promise.resolve(new String(bytes));
150+
break;
151+
}
152+
}
153+
catch(Exception err) {
154+
promise.reject("ReadFile Error", err.getLocalizedMessage());
155+
}
156+
return null;
157+
}
158+
};
159+
task.execute(path, encoding);
160+
}
161+
51162
/**
52163
* Static method that returns system folders to JS context
53164
* @param ctx React Native application context
@@ -106,14 +217,11 @@ protected Integer doInBackground(String ... args) {
106217
}
107218
} else if (encoding.equalsIgnoreCase("ascii")) {
108219
while ((cursor = fs.read(buffer)) != -1) {
109-
String chunk = "[";
220+
WritableArray chunk = Arguments.createArray();
110221
for(int i =0;i<cursor;i++)
111222
{
112-
chunk += (int)buffer[i];
113-
if(i+1 < cursor)
114-
chunk += ",";
223+
chunk.pushInt((int)buffer[i]);
115224
}
116-
chunk = chunk + "]";
117225
emitStreamEvent(eventName, "data", chunk);
118226
}
119227
} else if (encoding.equalsIgnoreCase("base64")) {
@@ -530,6 +638,13 @@ void emitStreamEvent(String streamName, String event, String data) {
530638
this.emitter.emit(streamName, eventData);
531639
}
532640

641+
void emitStreamEvent(String streamName, String event, WritableArray data) {
642+
WritableMap eventData = Arguments.createMap();
643+
eventData.putString("event", event);
644+
eventData.putArray("detail", data);
645+
this.emitter.emit(streamName, eventData);
646+
}
647+
533648
// TODO : should we remove this ?
534649
void emitFSData(String taskId, String event, String data) {
535650
WritableMap eventData = Arguments.createMap();

src/android/src/main/java/com/RNFetchBlob/RNFetchBlobReq.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package com.RNFetchBlob;
22

3+
import android.app.DownloadManager;
4+
import android.content.Context;
5+
import android.net.Uri;
6+
37
import com.facebook.react.bridge.Callback;
48
import com.facebook.react.bridge.ReactApplicationContext;
59
import com.facebook.react.bridge.ReadableArray;

0 commit comments

Comments
 (0)