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

Commit 23b9577

Browse files
committed
Add #27 IOS implementation
1 parent d445429 commit 23b9577

File tree

3 files changed

+121
-13
lines changed

3 files changed

+121
-13
lines changed

src/ios/RNFetchBlob/RNFetchBlob.m

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ - (NSDictionary *)constantsToExport
213213
NSMutableData * fileContent = [NSMutableData alloc];
214214
// prevent stack overflow, alloc on heap
215215
char * bytes = (char*) malloc([dataArray count]);
216-
// char bytes[[dataArray count]];
216+
217217
for(int i = 0; i < dataArray.count; i++) {
218218
bytes[i] = [[dataArray objectAtIndex:i] charValue];
219219
}
@@ -411,6 +411,18 @@ - (NSDictionary *)constantsToExport
411411
callback(@[[NSNull null]]);
412412
}
413413

414+
RCT_EXPORT_METHOD(readFile:(NSString *)path encoding:(NSString *)encoding resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject {
415+
[RNFetchBlobFS readFile:path encoding:encoding resolver:resolve rejecter:reject];
416+
})
417+
418+
RCT_EXPORT_METHOD(writeFile:(NSString *)path encoding:(NSString *)encoding data:(NSString *)data resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject {
419+
[RNFetchBlobFS writeFile:path encoding:encoding data:data resolver:resolve rejecter:reject];
420+
})
421+
422+
RCT_EXPORT_METHOD(writeFileArray:(NSString *)path data:(NSArray *)data resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject {
423+
[RNFetchBlobFS writeFileArray:path data:data resolver:resolve rejecter:reject];
424+
})
425+
414426
RCT_EXPORT_METHOD(getEnvironmentDirs:(RCTResponseSenderBlock) callback) {
415427

416428
callback(@[

src/ios/RNFetchBlobFS.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@
4848
+ (BOOL) mkdir:(NSString *) path;
4949
+ (NSDictionary *) stat:(NSString *) path error:(NSError **) error;
5050
+ (BOOL) exists:(NSString *) path;
51+
+ (void) writeFileArray:(NSString *)path data:(NSArray *)data resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject;
52+
+ (void) writeFile:(NSString *)path encoding:(NSString *)encoding data:(NSString *)data resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject;
53+
+ (void) readFile:(NSString *)path encoding:(NSString *)encoding resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject;
5154

5255
// constructor
5356
- (id) init;

src/ios/RNFetchBlobFS.m

Lines changed: 105 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ + (NSString *) getPictureDir {
6969
return [NSSearchPathForDirectoriesInDomains(NSPicturesDirectory, NSUserDomainMask, YES) firstObject];
7070
}
7171

72-
7372
+ (NSString *) getTempPath {
7473

7574
return [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingString:@"/RNFetchBlob_tmp"];
@@ -85,6 +84,103 @@ + (NSString *) getTempPath:(NSString*)taskId withExtension:(NSString *)ext {
8584
return tempPath;
8685
}
8786

87+
+ (void) writeFile:(NSString *)path encoding:(NSString *)encoding data:(NSString *)data resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject {
88+
@try {
89+
NSFileManager * fm = [NSFileManager defaultManager];
90+
NSError * err = nil;
91+
NSString * folder = [path stringByDeletingLastPathComponent];
92+
if(![fm fileExistsAtPath:folder]) {
93+
[fm createDirectoryAtPath:folder withIntermediateDirectories:YES attributes:NULL error:&err];
94+
}
95+
if(![fm fileExistsAtPath:path]) {
96+
if([[encoding lowercaseString] isEqualToString:@"base64"]){
97+
NSData * byteData = [[NSData alloc] initWithBase64EncodedString:data options:0];
98+
[fm createFileAtPath:path contents:byteData attributes:NULL];
99+
}
100+
else
101+
[fm createFileAtPath:path contents:[data dataUsingEncoding:NSUTF8StringEncoding] attributes:NULL];
102+
}
103+
else {
104+
NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:path];
105+
[fileHandle seekToEndOfFile];
106+
if([[encoding lowercaseString] isEqualToString:@"base64"]) {
107+
NSData * byteData = [[NSData alloc] initWithBase64EncodedString:data options:0];
108+
[fileHandle writeData:byteData];
109+
}
110+
else
111+
[fileHandle writeData:[data dataUsingEncoding:NSUTF8StringEncoding]];
112+
[fileHandle closeFile];
113+
}
114+
fm = nil;
115+
resolve([NSNull null]);
116+
}
117+
@catch (NSException * e)
118+
{
119+
reject(@"RNFetchBlob writeFile Error", @"Error", [e description]);
120+
}
121+
}
122+
123+
+ (void) writeFileArray:(NSString *)path data:(NSArray *)data resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject {
124+
@try {
125+
NSFileManager * fm = [NSFileManager defaultManager];
126+
NSMutableData * fileContent = [NSMutableData alloc];
127+
// prevent stack overflow, alloc on heap
128+
char * bytes = (char*) malloc([data count]);
129+
for(int i = 0; i < data.count; i++) {
130+
bytes[i] = [[data objectAtIndex:i] charValue];
131+
}
132+
// if append == NO
133+
// BOOL success = [fm createFileAtPath:path contents:fileContent attributes:NULL];
134+
[fileContent appendBytes:bytes length:data.count];
135+
NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:path];
136+
[fileHandle seekToEndOfFile];
137+
[fileHandle writeData:fileContent];
138+
[fileHandle closeFile];
139+
free(bytes);
140+
fm = nil;
141+
resolve([NSNull null]);
142+
}
143+
@catch (NSException * e)
144+
{
145+
reject(@"RNFetchBlob writeFile Error", @"Error", [e description]);
146+
}
147+
}
148+
149+
+ (void) readFile:(NSString *)path encoding:(NSString *)encoding resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject {
150+
@try
151+
{
152+
NSFileManager * fm = [NSFileManager defaultManager];
153+
NSError *err = nil;
154+
BOOL exists = [fm fileExistsAtPath:path];
155+
if(!exists) {
156+
@throw @"RNFetchBlobFS readFile error", @"file not exists", path;
157+
return;
158+
}
159+
if([[encoding lowercaseString] isEqualToString:@"utf8"]) {
160+
NSString * utf8Result = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&err];
161+
resolve(utf8Result);
162+
}
163+
else if ([[encoding lowercaseString] isEqualToString:@"base64"]) {
164+
NSData * fileData = [NSData dataWithContentsOfFile:path];
165+
resolve([fileData base64EncodedStringWithOptions:0]);
166+
}
167+
else if ([[encoding lowercaseString] isEqualToString:@"ascii"]) {
168+
NSData * resultData = [NSData dataWithContentsOfFile:path];
169+
NSMutableArray * resultArray = [NSMutableArray array];
170+
char * bytes = [resultData bytes];
171+
for(int i=0;i<[resultData length];i++) {
172+
[resultArray addObject:[NSNumber numberWithChar:bytes[i]]];
173+
}
174+
resolve(resultArray);
175+
}
176+
177+
}
178+
@catch(NSException * e)
179+
{
180+
reject(@"RNFetchBlobFS readFile error", @"error", [e description]);
181+
}
182+
}
183+
88184
+ (BOOL) mkdir:(NSString *) path {
89185
BOOL isDir;
90186
NSError * err = nil;
@@ -278,31 +374,28 @@ - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
278374
// when encoding is ASCII, send byte array data
279375
else if ( [[self.encoding lowercaseString] isEqualToString:@"ascii"] ) {
280376
// RCTBridge only emits string data, so we have to create JSON byte array string
281-
NSString * asciiStr = @"[";
377+
NSMutableArray * asciiArray = [NSMutableArray array];
378+
unsigned char *bytePtr;
282379
if (chunkData.length > 0)
283380
{
284-
unsigned char *bytePtr = (unsigned char *)[chunkData bytes];
381+
bytePtr = (unsigned char *)[chunkData bytes];
285382
NSInteger byteLen = chunkData.length/sizeof(uint8_t);
286383
for (int i = 0; i < byteLen; i++)
287384
{
288-
NSInteger val = bytePtr[i];
289-
if(i+1 < byteLen)
290-
asciiStr = [asciiStr stringByAppendingFormat:@"%d,", val];
291-
else
292-
asciiStr = [asciiStr stringByAppendingFormat:@"%d", val];
385+
[asciiArray addObject:[NSNumber numberWithChar:bytePtr[i]]];
293386
}
294-
free(bytePtr);
295387
}
296-
asciiStr = [asciiStr stringByAppendingString:@"]"];
388+
297389
[self.bridge.eventDispatcher
298390
sendDeviceEventWithName:streamEventCode
299391
body: @{
300392
@"event": FS_EVENT_DATA,
301-
@"detail": asciiStr
393+
@"detail": asciiArray
302394
}
303395
];
304396
free(buf);
305-
asciiStr = nil;
397+
bytePtr = nil;
398+
asciiArray = nil;
306399
buf = nil;
307400
chunkData = nil;
308401
return;

0 commit comments

Comments
 (0)