RCTFileReaderModule.mm 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  2. * Copyright (c) Facebook, Inc. and its 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. #import <React/RCTFileReaderModule.h>
  8. #import <FBReactNativeSpec/FBReactNativeSpec.h>
  9. #import <React/RCTBridge.h>
  10. #import <React/RCTConvert.h>
  11. #import <React/RCTBlobManager.h>
  12. #import "RCTBlobPlugins.h"
  13. @interface RCTFileReaderModule() <NativeFileReaderModuleSpec>
  14. @end
  15. @implementation RCTFileReaderModule
  16. RCT_EXPORT_MODULE(FileReaderModule)
  17. @synthesize bridge = _bridge;
  18. RCT_EXPORT_METHOD(readAsText:(NSDictionary<NSString *, id> *)blob
  19. encoding:(NSString *)encoding
  20. resolve:(RCTPromiseResolveBlock)resolve
  21. reject:(RCTPromiseRejectBlock)reject)
  22. {
  23. RCTBlobManager *blobManager = [[self bridge] moduleForClass:[RCTBlobManager class]];
  24. NSData *data = [blobManager resolve:blob];
  25. if (data == nil) {
  26. reject(RCTErrorUnspecified,
  27. [NSString stringWithFormat:@"Unable to resolve data for blob: %@", [RCTConvert NSString:blob[@"blobId"]]], nil);
  28. } else {
  29. NSStringEncoding stringEncoding;
  30. if (encoding == nil) {
  31. stringEncoding = NSUTF8StringEncoding;
  32. } else {
  33. stringEncoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef) encoding));
  34. }
  35. NSString *text = [[NSString alloc] initWithData:data encoding:stringEncoding];
  36. resolve(text);
  37. }
  38. }
  39. RCT_EXPORT_METHOD(readAsDataURL:(NSDictionary<NSString *, id> *)blob
  40. resolve:(RCTPromiseResolveBlock)resolve
  41. reject:(RCTPromiseRejectBlock)reject)
  42. {
  43. RCTBlobManager *blobManager = [[self bridge] moduleForClass:[RCTBlobManager class]];
  44. NSData *data = [blobManager resolve:blob];
  45. if (data == nil) {
  46. reject(RCTErrorUnspecified,
  47. [NSString stringWithFormat:@"Unable to resolve data for blob: %@", [RCTConvert NSString:blob[@"blobId"]]], nil);
  48. } else {
  49. NSString *type = [RCTConvert NSString:blob[@"type"]];
  50. NSString *text = [NSString stringWithFormat:@"data:%@;base64,%@",
  51. type != nil && [type length] > 0 ? type : @"application/octet-stream",
  52. [data base64EncodedStringWithOptions:0]];
  53. resolve(text);
  54. }
  55. }
  56. - (std::shared_ptr<facebook::react::TurboModule>)
  57. getTurboModuleWithJsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker
  58. nativeInvoker:(std::shared_ptr<facebook::react::CallInvoker>)nativeInvoker
  59. perfLogger:(id<RCTTurboModulePerformanceLogger>)perfLogger
  60. {
  61. return std::make_shared<facebook::react::NativeFileReaderModuleSpecJSI>(self, jsInvoker, nativeInvoker, perfLogger);
  62. }
  63. @end
  64. Class RCTFileReaderModuleCls(void)
  65. {
  66. return RCTFileReaderModule.class;
  67. }