1/* 2 * Copyright (c) Meta Platforms, Inc. and affiliates. 3 * 4 * This source code is licensed under the MIT license found in the 5 * LICENSE file in the root directory of this source tree. 6 */ 7 8 9#import <ABI47_0_0React/ABI47_0_0RCTFileReaderModule.h> 10 11#import <ABI47_0_0FBReactNativeSpec/ABI47_0_0FBReactNativeSpec.h> 12#import <ABI47_0_0React/ABI47_0_0RCTBridge.h> 13#import <ABI47_0_0React/ABI47_0_0RCTConvert.h> 14 15#import <ABI47_0_0React/ABI47_0_0RCTBlobManager.h> 16 17#import "ABI47_0_0RCTBlobPlugins.h" 18 19@interface ABI47_0_0RCTFileReaderModule() <ABI47_0_0NativeFileReaderModuleSpec> 20@end 21 22@implementation ABI47_0_0RCTFileReaderModule 23 24ABI47_0_0RCT_EXPORT_MODULE(FileReaderModule) 25 26@synthesize moduleRegistry = _moduleRegistry; 27 28ABI47_0_0RCT_EXPORT_METHOD(readAsText:(NSDictionary<NSString *, id> *)blob 29 encoding:(NSString *)encoding 30 resolve:(ABI47_0_0RCTPromiseResolveBlock)resolve 31 reject:(ABI47_0_0RCTPromiseRejectBlock)reject) 32{ 33 ABI47_0_0RCTBlobManager *blobManager = [_moduleRegistry moduleForName:"BlobModule"]; 34 dispatch_async(blobManager.methodQueue, ^{ 35 NSData *data = [blobManager resolve:blob]; 36 37 if (data == nil) { 38 reject(ABI47_0_0RCTErrorUnspecified, 39 [NSString stringWithFormat:@"Unable to resolve data for blob: %@", [ABI47_0_0RCTConvert NSString:blob[@"blobId"]]], nil); 40 } else { 41 NSStringEncoding stringEncoding; 42 43 if (encoding == nil) { 44 stringEncoding = NSUTF8StringEncoding; 45 } else { 46 stringEncoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef) encoding)); 47 } 48 49 NSString *text = [[NSString alloc] initWithData:data encoding:stringEncoding]; 50 51 resolve(text); 52 } 53 }); 54} 55 56ABI47_0_0RCT_EXPORT_METHOD(readAsDataURL:(NSDictionary<NSString *, id> *)blob 57 resolve:(ABI47_0_0RCTPromiseResolveBlock)resolve 58 reject:(ABI47_0_0RCTPromiseRejectBlock)reject) 59{ 60 ABI47_0_0RCTBlobManager *blobManager = [_moduleRegistry moduleForName:"BlobModule"]; 61 dispatch_async(blobManager.methodQueue, ^{ 62 NSData *data = [blobManager resolve:blob]; 63 64 if (data == nil) { 65 reject(ABI47_0_0RCTErrorUnspecified, 66 [NSString stringWithFormat:@"Unable to resolve data for blob: %@", [ABI47_0_0RCTConvert NSString:blob[@"blobId"]]], nil); 67 } else { 68 NSString *type = [ABI47_0_0RCTConvert NSString:blob[@"type"]]; 69 NSString *text = [NSString stringWithFormat:@"data:%@;base64,%@", 70 type != nil && [type length] > 0 ? type : @"application/octet-stream", 71 [data base64EncodedStringWithOptions:0]]; 72 73 resolve(text); 74 } 75 }); 76} 77 78- (std::shared_ptr<ABI47_0_0facebook::ABI47_0_0React::TurboModule>)getTurboModule:(const ABI47_0_0facebook::ABI47_0_0React::ObjCTurboModule::InitParams &)params 79{ 80 return std::make_shared<ABI47_0_0facebook::ABI47_0_0React::NativeFileReaderModuleSpecJSI>(params); 81} 82 83@end 84 85Class ABI47_0_0RCTFileReaderModuleCls(void) 86{ 87 return ABI47_0_0RCTFileReaderModule.class; 88} 89