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

Commit 516d11b

Browse files
committed
Implement ios ASCII encoded data fs method
1 parent a01301d commit 516d11b

File tree

2 files changed

+89
-10
lines changed

2 files changed

+89
-10
lines changed

src/fs.js

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,23 @@ function session(name:string):RNFetchBlobSession {
5656
}
5757

5858
function createFile(path:string, data:string, encoding: 'base64' | 'ascii' | 'utf8'):Promise {
59+
encoding = encoding || 'utf8'
5960
return new Promise((resolve, reject) => {
60-
RNFetchBlob.createFile(path, data, encoding, (err) => {
61+
let handler = (err) => {
6162
if(err)
62-
reject(err)
63+
reject(err)
6364
else
64-
resolve()
65-
})
65+
resolve()
66+
}
67+
if(encoding.toLowerCase() === 'ascii') {
68+
if(Array.isArray(data))
69+
RNFetchBlob.createFileASCII(path, data, handler)
70+
else
71+
reject('`data` of ASCII file must be an array contains numbers')
72+
}
73+
else {
74+
RNFetchBlob.createFile(path, data, encoding, handler)
75+
}
6676
})
6777
}
6878

@@ -80,13 +90,13 @@ function writeStream(
8090
):Promise<WriteStream> {
8191
if(!path)
8292
throw Error('RNFetchBlob could not open file stream with empty `path`')
83-
encoding = encoding || 'base64'
93+
8494
return new Promise((resolve, reject) => {
8595
RNFetchBlob.writeStream(path, encoding || 'base64', append || false, (err, streamId:string) => {
8696
if(err)
8797
reject(err)
8898
else
89-
resolve(new WriteStream(streamId))
99+
resolve(new WriteStream(streamId, encoding))
90100
})
91101
})
92102
}
@@ -108,8 +118,14 @@ function readStream(
108118
throw Error('RNFetchBlob could not open file stream with empty `path`')
109119
encoding = encoding || 'utf8'
110120
let stream:RNFetchBlobStream = {
121+
// parse JSON array when encoding is ASCII
111122
onData : function(fn) {
112-
this._onData = fn
123+
if(encoding.toLowerCase() === 'ascii')
124+
this._onData = (data) => {
125+
fn(JSON.parse(data))
126+
}
127+
else
128+
this._onData = fn
113129
},
114130
onError : function(fn) {
115131
this._onError = fn
@@ -313,7 +329,12 @@ class WriteStream {
313329
write(data:string) {
314330
return new Promise((resolve, reject) => {
315331
try {
316-
RNFetchBlob.writeChunk(this.id, data, (error) => {
332+
let method = this.encoding === 'ascii' ? 'writeArrayChunk' : 'writeChunk'
333+
if(this.encoding.toLocaleLowerCase() === 'ascii' && !Array.isArray(data)) {
334+
reject('ascii input data must be an Array')
335+
return
336+
}
337+
RNFetchBlob[method](this.id, data, (error) => {
317338
if(error)
318339
reject(error)
319340
else

src/ios/RNFetchBlob/RNFetchBlob.m

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,18 +261,44 @@ - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
261261
// still have data in stream
262262
if(len) {
263263
[chunkData appendBytes:(const void *)buf length:len];
264-
// TODO : file read progress ?
265264
// dispatch data event
266265
NSString * encodedChunk = [NSString alloc];
267266
if( [[self.encoding lowercaseString] isEqualToString:@"utf8"] ) {
268267
encodedChunk = [encodedChunk initWithData:chunkData encoding:NSUTF8StringEncoding];
269268
}
269+
// when encoding is ASCII, send byte array data
270270
else if ( [[self.encoding lowercaseString] isEqualToString:@"ascii"] ) {
271-
encodedChunk = [encodedChunk initWithData:chunkData encoding:NSASCIIStringEncoding];
271+
// RCTBridge only emits string data, so we have to create JSON byte array string
272+
NSString * asciiStr = @"[";
273+
if (chunkData.length > 0)
274+
{
275+
unsigned char *bytePtr = (unsigned char *)[chunkData bytes];
276+
NSInteger byteLen = chunkData.length/sizeof(uint8_t);
277+
for (int i = 0; i < byteLen; i++)
278+
{
279+
uint8_t * byteFromArray = chunkData.bytes;
280+
NSInteger val = bytePtr[i];
281+
if(i+1 < byteLen)
282+
asciiStr = [asciiStr stringByAppendingFormat:@"%d,", val];
283+
else
284+
asciiStr = [asciiStr stringByAppendingFormat:@"%d", val];
285+
}
286+
}
287+
asciiStr = [asciiStr stringByAppendingString:@"]"];
288+
[self.bridge.eventDispatcher
289+
sendDeviceEventWithName:streamEventCode
290+
body:@{
291+
@"event": FS_EVENT_DATA,
292+
@"detail": asciiStr
293+
}
294+
];
295+
return;
272296
}
297+
// convert byte array to base64 data chunks
273298
else if ( [[self.encoding lowercaseString] isEqualToString:@"base64"] ) {
274299
encodedChunk = [chunkData base64EncodedStringWithOptions:0];
275300
}
301+
// unknown encoding, send erro event
276302
else {
277303
[self.bridge.eventDispatcher
278304
sendDeviceEventWithName:streamEventCode
@@ -676,6 +702,26 @@ - (id) init {
676702

677703
}
678704

705+
// method for create file with ASCII content
706+
RCT_EXPORT_METHOD(createFileASCII:(NSString *)path data:(NSArray *)dataArray callback:(RCTResponseSenderBlock)callback) {
707+
708+
NSFileManager * fm = [NSFileManager defaultManager];
709+
NSMutableData * fileContent = [NSMutableData alloc];
710+
711+
char bytes[[dataArray count]];
712+
for(int i = 0; i < dataArray.count; i++) {
713+
bytes[i] = [[dataArray objectAtIndex:i] charValue];
714+
}
715+
[fileContent appendBytes:bytes length:dataArray.count];
716+
BOOL success = [fm createFileAtPath:path contents:fileContent attributes:NULL];
717+
718+
if(success == YES)
719+
callback(@[[NSNull null]]);
720+
else
721+
callback(@[[NSString stringWithFormat:@"failed to create new file at path %@ please ensure the folder exists"]]);
722+
723+
}
724+
679725

680726
RCT_EXPORT_METHOD(exists:(NSString *)path callback:(RCTResponseSenderBlock)callback) {
681727
BOOL isDir = NO;
@@ -709,6 +755,18 @@ - (id) init {
709755
callback(@[[NSNull null], streamId]);
710756
}
711757

758+
RCT_EXPORT_METHOD(writeArrayChunk:(NSString *)streamId withArray:(NSArray *)dataArray callback:(RCTResponseSenderBlock) callback) {
759+
FetchBlobFS *fs = [[FetchBlobFS getFileStreams] valueForKey:streamId];
760+
char bytes[[dataArray count]];
761+
for(int i = 0; i < dataArray.count; i++) {
762+
bytes[i] = [[dataArray objectAtIndex:i] charValue];
763+
}
764+
NSMutableData * data = [NSMutableData alloc];
765+
[data appendBytes:bytes length:dataArray.count];
766+
[fs write:data];
767+
callback(@[[NSNull null]]);
768+
}
769+
712770
RCT_EXPORT_METHOD(writeChunk:(NSString *)streamId withData:(NSString *)data callback:(RCTResponseSenderBlock) callback) {
713771
FetchBlobFS *fs = [[FetchBlobFS getFileStreams] valueForKey:streamId];
714772
[fs writeEncodeChunk:data];

0 commit comments

Comments
 (0)