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