dynamsoft-capture-vision-react-native 3.4.1300 → 3.4.3000

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/LICENSE +4 -4
  2. package/README.md +62 -62
  3. package/android/README.md +14 -14
  4. package/android/build.gradle +167 -163
  5. package/android/gradle.properties +20 -20
  6. package/android/settings.gradle +5 -5
  7. package/android/src/main/AndroidManifest.xml +6 -6
  8. package/android/src/main/AndroidManifest_noPackage.xml +5 -5
  9. package/android/src/main/cpp/CMakeLists.txt +21 -21
  10. package/android/src/main/cpp/ImgHO.cpp +94 -94
  11. package/android/src/main/cpp/ImgHO.h +34 -34
  12. package/android/src/main/cpp/JsiCore.cpp +296 -296
  13. package/android/src/main/cpp/JsiCore.h +51 -51
  14. package/android/src/main/cpp/JsiCvr.cpp +332 -332
  15. package/android/src/main/cpp/JsiCvr.h +54 -54
  16. package/android/src/main/cpp/JsiDbr.cpp +283 -283
  17. package/android/src/main/cpp/JsiDbr.h +26 -26
  18. package/android/src/main/cpp/JsiDce.cpp +59 -59
  19. package/android/src/main/cpp/JsiDce.h +17 -17
  20. package/android/src/main/cpp/JsiDcp.cpp +51 -51
  21. package/android/src/main/cpp/JsiDcp.h +31 -31
  22. package/android/src/main/cpp/JsiDdn.cpp +50 -50
  23. package/android/src/main/cpp/JsiDdn.h +28 -28
  24. package/android/src/main/cpp/JsiDlr.cpp +60 -60
  25. package/android/src/main/cpp/JsiDlr.h +26 -26
  26. package/android/src/main/cpp/JsiUtility.cpp +604 -604
  27. package/android/src/main/cpp/JsiUtility.h +26 -26
  28. package/android/src/main/cpp/RawBuffer.cpp +23 -23
  29. package/android/src/main/cpp/RawBuffer.h +24 -24
  30. package/android/src/main/cpp/android_log.h +14 -14
  31. package/android/src/main/dysJniLibs/debug/arm64-v8a/librn_dys.so +0 -0
  32. package/android/src/main/dysJniLibs/debug/armeabi-v7a/librn_dys.so +0 -0
  33. package/android/src/main/dysJniLibs/debug/x86/librn_dys.so +0 -0
  34. package/android/src/main/dysJniLibs/debug/x86_64/librn_dys.so +0 -0
  35. package/android/src/main/dysJniLibs/release/arm64-v8a/librn_dys.so +0 -0
  36. package/android/src/main/dysJniLibs/release/armeabi-v7a/librn_dys.so +0 -0
  37. package/android/src/main/dysJniLibs/release/x86/librn_dys.so +0 -0
  38. package/android/src/main/dysJniLibs/release/x86_64/librn_dys.so +0 -0
  39. package/android/src/main/dysJniLibsFor81/debug/arm64-v8a/librn_dys.so +0 -0
  40. package/android/src/main/dysJniLibsFor81/debug/armeabi-v7a/librn_dys.so +0 -0
  41. package/android/src/main/dysJniLibsFor81/debug/x86/librn_dys.so +0 -0
  42. package/android/src/main/dysJniLibsFor81/debug/x86_64/librn_dys.so +0 -0
  43. package/android/src/main/dysJniLibsFor81/release/arm64-v8a/librn_dys.so +0 -0
  44. package/android/src/main/dysJniLibsFor81/release/armeabi-v7a/librn_dys.so +0 -0
  45. package/android/src/main/dysJniLibsFor81/release/x86/librn_dys.so +0 -0
  46. package/android/src/main/dysJniLibsFor81/release/x86_64/librn_dys.so +0 -0
  47. package/android/src/main/dysJniLibsFor82/debug/arm64-v8a/librn_dys.so +0 -0
  48. package/android/src/main/dysJniLibsFor82/debug/armeabi-v7a/librn_dys.so +0 -0
  49. package/android/src/main/dysJniLibsFor82/debug/x86/librn_dys.so +0 -0
  50. package/android/src/main/dysJniLibsFor82/debug/x86_64/librn_dys.so +0 -0
  51. package/android/src/main/dysJniLibsFor82/release/arm64-v8a/librn_dys.so +0 -0
  52. package/android/src/main/dysJniLibsFor82/release/armeabi-v7a/librn_dys.so +0 -0
  53. package/android/src/main/dysJniLibsFor82/release/x86/librn_dys.so +0 -0
  54. package/android/src/main/dysJniLibsFor82/release/x86_64/librn_dys.so +0 -0
  55. package/android/src/main/dysJniLibsFor86/debug/arm64-v8a/librn_dys.so +3 -0
  56. package/android/src/main/dysJniLibsFor86/debug/armeabi-v7a/librn_dys.so +3 -0
  57. package/android/src/main/dysJniLibsFor86/debug/x86/librn_dys.so +3 -0
  58. package/android/src/main/dysJniLibsFor86/debug/x86_64/librn_dys.so +3 -0
  59. package/android/src/main/dysJniLibsFor86/release/arm64-v8a/librn_dys.so +3 -0
  60. package/android/src/main/dysJniLibsFor86/release/armeabi-v7a/librn_dys.so +3 -0
  61. package/android/src/main/dysJniLibsFor86/release/x86/librn_dys.so +3 -0
  62. package/android/src/main/dysJniLibsFor86/release/x86_64/librn_dys.so +3 -0
  63. package/android/src/main/java/com/dynamsoft/reactnativelib/CVRModule.kt +137 -137
  64. package/android/src/main/java/com/dynamsoft/reactnativelib/CameraViewManager.kt +62 -62
  65. package/android/src/main/java/com/dynamsoft/reactnativelib/DCEModule.kt +125 -125
  66. package/android/src/main/java/com/dynamsoft/reactnativelib/DynamsoftBaseModule.kt +8 -8
  67. package/android/src/main/java/com/dynamsoft/reactnativelib/ISAModule.kt +73 -73
  68. package/android/src/main/java/com/dynamsoft/reactnativelib/ImageEditorViewManager.kt +14 -14
  69. package/android/src/main/java/com/dynamsoft/reactnativelib/ImageEditorViewModule.kt +35 -35
  70. package/android/src/main/java/com/dynamsoft/reactnativelib/ImageManagerModule.kt +15 -15
  71. package/android/src/main/java/com/dynamsoft/reactnativelib/LicenseModule.kt +29 -29
  72. package/android/src/main/java/com/dynamsoft/reactnativelib/MultiCrossFilterModule.kt +83 -83
  73. package/android/src/main/java/com/dynamsoft/reactnativelib/ReactNativeDcvPackage.kt +32 -32
  74. package/android/src/main/java/com/dynamsoft/reactnativelib/VersionsModule.kt +41 -41
  75. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/Basic.kt +44 -44
  76. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForCore.kt +50 -50
  77. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForCvr.kt +129 -129
  78. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForDBR.kt +157 -157
  79. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForDCE.kt +110 -110
  80. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForDCP.kt +49 -49
  81. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForDDN.kt +85 -85
  82. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForDLR.kt +72 -72
  83. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ImageUtil.kt +58 -58
  84. package/android/src/main/java/com/dynamsoft/reactnativelib/core/ImageSourceAdapterModuleImpl.kt +120 -120
  85. package/android/src/main/java/com/dynamsoft/reactnativelib/cvr/CaptureVisionRouterModuleImpl.kt +306 -306
  86. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraEnhancerModuleImpl.kt +247 -247
  87. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraLifeCycleOwner.java +14 -14
  88. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraViewManagerImpl.kt +77 -77
  89. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/ImageEditorViewManagerImpl.kt +15 -15
  90. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/ImageEditorViewModuleImpl.kt +110 -110
  91. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/RNCameraView.kt +20 -20
  92. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/RNImageEditorView.kt +19 -19
  93. package/android/src/main/java/com/dynamsoft/reactnativelib/license/LicenseModuleImpl.kt +39 -39
  94. package/android/src/main/java/com/dynamsoft/reactnativelib/utility/ImageManagerModuleImpl.kt +120 -120
  95. package/android/src/main/java/com/dynamsoft/reactnativelib/utility/MultiCrossFilterModuleImpl.kt +111 -111
  96. package/app.plugin.js +21 -21
  97. package/dynamsoft-capture-vision-react-native.podspec +24 -24
  98. package/ios/CPP/DSImageData+HostObject.h +18 -18
  99. package/ios/CPP/DSImageData+HostObject.mm +38 -38
  100. package/ios/CPP/ImageDataHostObject.cpp +87 -87
  101. package/ios/CPP/ImageDataHostObject.hpp +35 -35
  102. package/ios/CPP/MutableRawBuffer.cpp +23 -23
  103. package/ios/CPP/MutableRawBuffer.hpp +23 -23
  104. package/ios/CPP/RNDynamsoft+JSI.h +22 -22
  105. package/ios/CPP/RNDynamsoft+JSI.mm +303 -303
  106. package/ios/CPP/RNDynamsoft+Json.h +93 -93
  107. package/ios/CPP/RNDynamsoft+Json.m +733 -733
  108. package/ios/CPP/YeetJSIUtils.h +56 -56
  109. package/ios/CPP/YeetJSIUtils.mm +208 -208
  110. package/ios/RNDynamsoftCameraView.h +31 -31
  111. package/ios/RNDynamsoftCameraView.m +108 -108
  112. package/ios/RNDynamsoftCameraViewManager.h +14 -14
  113. package/ios/RNDynamsoftCameraViewManager.m +195 -195
  114. package/ios/RNDynamsoftCaptureVisionRouter.h +18 -18
  115. package/ios/RNDynamsoftCaptureVisionRouter.mm +532 -532
  116. package/ios/RNDynamsoftImageEditorView.h +17 -17
  117. package/ios/RNDynamsoftImageEditorView.m +25 -25
  118. package/ios/RNDynamsoftImageEditorViewManager.h +14 -14
  119. package/ios/RNDynamsoftImageEditorViewManager.mm +183 -183
  120. package/ios/RNDynamsoftImageManager.h +14 -14
  121. package/ios/RNDynamsoftImageManager.mm +369 -369
  122. package/ios/RNDynamsoftImageSourceAdapter.h +19 -19
  123. package/ios/RNDynamsoftImageSourceAdapter.mm +255 -255
  124. package/ios/RNDynamsoftLicense.h +14 -14
  125. package/ios/RNDynamsoftLicense.m +62 -62
  126. package/ios/RNDynamsoftMultiCrossFilter.h +14 -14
  127. package/ios/RNDynamsoftMultiCrossFilter.m +145 -145
  128. package/ios/RNDynamsoftVersions.h +13 -13
  129. package/ios/RNDynamsoftVersions.m +27 -27
  130. package/package.json +48 -48
  131. package/src/NativeDynamsoftVersionsModule.tsx +20 -20
  132. package/src/VersionsModule.tsx +7 -7
  133. package/src/core/CapturedResultBase.tsx +18 -18
  134. package/src/core/CapturedResultItem.tsx +23 -23
  135. package/src/core/CoreModule.tsx +9 -9
  136. package/src/core/DSRect.tsx +29 -29
  137. package/src/core/EnumCaptureResultItemType.tsx +52 -52
  138. package/src/core/EnumColourChannelUsageType.tsx +26 -26
  139. package/src/core/EnumCrossVerificationStatus.tsx +46 -46
  140. package/src/core/EnumGrayscaleEnhancementMode.tsx +46 -46
  141. package/src/core/EnumGrayscaleTransformationMode.tsx +35 -35
  142. package/src/core/EnumImageFileFormat.tsx +6 -6
  143. package/src/core/EnumPixelFormat.tsx +53 -53
  144. package/src/core/ImageData.tsx +87 -87
  145. package/src/core/ImageSourceAdapter.tsx +160 -160
  146. package/src/core/NativeDynamsoftImageSourceAdapterModule.tsx +29 -29
  147. package/src/core/Point.tsx +13 -13
  148. package/src/core/Quadrilateral.tsx +12 -12
  149. package/src/core/index.tsx +18 -18
  150. package/src/cvr/CaptureVisionRouter.tsx +683 -683
  151. package/src/cvr/CaptureVisionRouterModule.tsx +9 -9
  152. package/src/cvr/CapturedResult.tsx +123 -123
  153. package/src/cvr/CapturedResultFilter.tsx +13 -13
  154. package/src/cvr/CapturedResultReceiver.tsx +71 -71
  155. package/src/cvr/EnumPresetTemplate.tsx +81 -81
  156. package/src/cvr/NativeDynamsoftCaptureVisionRouterModule.tsx +25 -25
  157. package/src/cvr/SimplifiedCaptureVisionSettings.tsx +61 -61
  158. package/src/cvr/index.tsx +11 -11
  159. package/src/dbr/BarcodeDetails.tsx +51 -51
  160. package/src/dbr/BarcodeReaderModule.tsx +9 -9
  161. package/src/dbr/BarcodeResultItem.tsx +65 -65
  162. package/src/dbr/DecodedBarcodesResult.tsx +14 -14
  163. package/src/dbr/ECISegment.tsx +23 -23
  164. package/src/dbr/EnumBarcodeFormat.tsx +112 -112
  165. package/src/dbr/EnumDeblurMode.tsx +29 -29
  166. package/src/dbr/EnumLocalizationMode.tsx +27 -27
  167. package/src/dbr/EnumQRCodeErrorCorrectionLevel.tsx +6 -6
  168. package/src/dbr/SimplifiedBarcodeReaderSettings.tsx +80 -80
  169. package/src/dbr/index.tsx +9 -9
  170. package/src/dce/CameraEnhancer.tsx +254 -254
  171. package/src/dce/CameraEnhancerModule.tsx +9 -9
  172. package/src/dce/CameraView.tsx +100 -100
  173. package/src/dce/DynamsoftCameraViewNativeComponent.ts +96 -96
  174. package/src/dce/DynamsoftImageEditorViewNativeComponent.ts +9 -9
  175. package/src/dce/EnumCameraPosition.tsx +25 -25
  176. package/src/dce/EnumDrawingLayerId.tsx +17 -17
  177. package/src/dce/EnumEnhancedFeatures.tsx +24 -24
  178. package/src/dce/EnumFocusMode.tsx +6 -6
  179. package/src/dce/EnumResolution.tsx +8 -8
  180. package/src/dce/EnumTorchState.tsx +10 -10
  181. package/src/dce/FeedBack.tsx +28 -28
  182. package/src/dce/ImageEditorView.tsx +131 -131
  183. package/src/dce/NativeDynamsoftCameraViewModule.tsx +47 -47
  184. package/src/dce/NativeDynamsoftImageEditorViewModule.ts +9 -9
  185. package/src/dce/index.tsx +13 -13
  186. package/src/dcp/CodeParserDedicatorModule.tsx +9 -9
  187. package/src/dcp/CodeParserModule.tsx +9 -9
  188. package/src/dcp/EnumMappingStatus.tsx +14 -14
  189. package/src/dcp/EnumValidationStatus.tsx +14 -14
  190. package/src/dcp/ParsedResult.tsx +14 -14
  191. package/src/dcp/ParsedResultItem.tsx +50 -50
  192. package/src/dcp/index.tsx +8 -8
  193. package/src/ddn/DeskewedImageResultItem.tsx +40 -40
  194. package/src/ddn/DetectedQuadResultItem.tsx +31 -31
  195. package/src/ddn/DocumentNormalizerModule.tsx +9 -9
  196. package/src/ddn/EnhancedImageResultItem.tsx +20 -20
  197. package/src/ddn/EnumImageColourMode.tsx +14 -14
  198. package/src/ddn/ProcessedDocumentResult.tsx +27 -27
  199. package/src/ddn/SimplifiedDocumentNormalizerSettings.tsx +65 -65
  200. package/src/ddn/index.tsx +11 -11
  201. package/src/dip/ImageProcessingModule.tsx +9 -9
  202. package/src/dip/index.tsx +1 -1
  203. package/src/dlr/CharacterResult.tsx +28 -28
  204. package/src/dlr/LabelRecognizerModule.tsx +9 -9
  205. package/src/dlr/RecognizedTextLinesResult.tsx +19 -19
  206. package/src/dlr/SimplifiedLabelRecognizerSettings.tsx +33 -33
  207. package/src/dlr/TextLineResultItem.tsx +41 -41
  208. package/src/dlr/index.tsx +8 -8
  209. package/src/index.tsx +13 -13
  210. package/src/license/LicenseManager.tsx +49 -49
  211. package/src/license/LicenseModule.tsx +9 -9
  212. package/src/license/NativeDynamsoftLicenseModule.tsx +7 -7
  213. package/src/license/index.tsx +7 -7
  214. package/src/utility/CrossVerificationCriteria.tsx +11 -11
  215. package/src/utility/EnumFilterType.tsx +5 -5
  216. package/src/utility/ImageManager.tsx +348 -348
  217. package/src/utility/MultiFrameResultCrossFilter.tsx +183 -183
  218. package/src/utility/NativeDynamsoftImageManagerModule.tsx +7 -7
  219. package/src/utility/NativeDynamsoftMultiCrossFilterModule.tsx +18 -18
  220. package/src/utility/UtilityModule.tsx +9 -9
  221. package/src/utility/index.tsx +4 -4
  222. package/android/.gitignore +0 -4
@@ -1,532 +1,532 @@
1
- /*
2
- * Copyright © Dynamsoft Corporation. All rights reserved.
3
- */
4
-
5
- #import "RNDynamsoftCaptureVisionRouter.h"
6
- #import <DynamsoftCaptureVisionBundle/DynamsoftCaptureVisionBundle.h>
7
- #import <React/RCTUIManager.h>
8
- #import "RNDynamsoftImageSourceAdapter.h"
9
- #import "RNDynamsoft+Json.h"
10
- #import "RNDynamsoft+JSI.h"
11
- #import <jsi/jsi.h>
12
- #import <React/RCTBridge+Private.h>
13
- #import "DSImageData+HostObject.h"
14
- #import "YeetJSIUtils.h"
15
-
16
- using namespace facebook::jsi;
17
- using namespace facebook;
18
- using namespace std;
19
-
20
- @interface RNDynamsoftCaptureVisionRouter () <DSCapturedResultReceiver>
21
-
22
- @property (nonatomic, strong) DSCaptureVisionRouter *cvr;
23
-
24
- @property (nonatomic, strong) NSMutableArray<DSImageData *> *deskewedImageDataArray;
25
-
26
- @property (nonatomic, strong) NSMutableArray<DSImageData *> *enhancedImageDataArray;
27
-
28
- @property (nonatomic, strong) NSMutableDictionary<NSString *, NSNumber *> *receiveDictionary;
29
-
30
- @end
31
-
32
- @implementation RNDynamsoftCaptureVisionRouter {
33
- BOOL hasListeners;
34
- dispatch_semaphore_t semaphore;
35
- }
36
-
37
- RCT_EXPORT_MODULE(DynamsoftCaptureVisionRouterModule)
38
-
39
- - (instancetype)init
40
- {
41
- self = [super init];
42
- if (self) {
43
- semaphore = dispatch_semaphore_create(0);
44
- }
45
- return self;
46
- }
47
-
48
- - (void)dealloc
49
- {
50
- _cvr = nil;
51
- }
52
-
53
- RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(createInstance) {
54
- self.cvr = [[DSCaptureVisionRouter alloc] init];
55
- return @true;
56
- }
57
-
58
- RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(destroyInstance) {
59
- self.cvr = nil;
60
- return @true;
61
- }
62
-
63
- RCT_EXPORT_METHOD(setGlobalIntraOpNumThreads:(NSInteger)intraOpNumThreads) {
64
- [DSCaptureVisionRouter setGlobalIntraOpNumThreads:intraOpNumThreads];
65
- }
66
-
67
- RCT_EXPORT_METHOD(clearDLModelBuffers) {
68
- [DSCaptureVisionRouter clearDLModelBuffers];
69
- }
70
-
71
- RCT_EXPORT_METHOD(switchCapturingTemplate:(NSString *)templateName
72
- resolve:(RCTPromiseResolveBlock)resolve
73
- rejecter: (RCTPromiseRejectBlock)reject)
74
- {
75
- NSError *error = nil;
76
- [self.cvr switchCapturingTemplate:templateName error:&error];
77
- if (error) {
78
- NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
79
- reject(code, error.localizedDescription, error);
80
- } else {
81
- resolve(@(true));
82
- }
83
- }
84
-
85
- RCT_EXPORT_METHOD(startCapturing:(NSString *)templateName
86
- resolve:(RCTPromiseResolveBlock)resolve
87
- rejecter: (RCTPromiseRejectBlock)reject)
88
- {
89
- [self.cvr startCapturing:templateName completionHandler:^(BOOL isSuccess, NSError * _Nullable error) {
90
- if (!isSuccess && error) {
91
- NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
92
- reject(code, error.localizedDescription, error);
93
- } else {
94
- self->semaphore = dispatch_semaphore_create(0);
95
- resolve(@(true));
96
- }
97
- }];
98
- }
99
-
100
- RCT_EXPORT_METHOD(stopCapturing:(RCTPromiseResolveBlock)resolve
101
- rejecter:(RCTPromiseRejectBlock)reject)
102
- {
103
- [self continueCRR];
104
- [self.cvr stopCapturing];
105
- resolve(@(true));
106
- }
107
-
108
- RCT_EXPORT_METHOD(setInput:(NSString *)key) {
109
- RNDynamsoftImageSourceAdapter *rnAdapter = [self.bridge moduleForClass:[RNDynamsoftImageSourceAdapter class]];
110
- DSImageSourceAdapter *isa = [rnAdapter.isaDictionary valueForKey:key];
111
- NSError *error;
112
- BOOL isSuccess = [self.cvr setInput:isa error:&error];
113
- if (!isSuccess && error) {
114
- __unused NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
115
- } else {
116
-
117
- }
118
- }
119
-
120
- RCT_EXPORT_METHOD(getSimplifiedSettings:(NSString *)name
121
- resolve:(RCTPromiseResolveBlock)resolve
122
- rejecter: (RCTPromiseRejectBlock)reject)
123
- {
124
- NSError *error;
125
- DSSimplifiedCaptureVisionSettings *settings = [self.cvr getSimplifiedSettings:name error:&error];
126
- if (error) {
127
- NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
128
- reject(code, error.localizedDescription, error);
129
- } else {
130
- resolve([settings toJson]);
131
- }
132
- }
133
-
134
- RCT_EXPORT_METHOD(updateSettings:(NSDictionary *)dictionary
135
- templateName:(NSString *)templateName
136
- resolve:(RCTPromiseResolveBlock)resolve
137
- rejecter: (RCTPromiseRejectBlock)reject)
138
- {
139
- NSError *error;
140
- DSSimplifiedCaptureVisionSettings *settings = [self.cvr getSimplifiedSettings:templateName error:nil];
141
- [settings updateWithDicitionary:dictionary];
142
- BOOL isSuccess = [self.cvr updateSettings:templateName settings:settings error:&error];
143
- if (!isSuccess && error) {
144
- NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
145
- reject(code, error.localizedDescription, error);
146
- } else {
147
- resolve(@(true));
148
- }
149
- }
150
-
151
- RCT_EXPORT_METHOD(resetSettings:(RCTPromiseResolveBlock)resolve
152
- rejecter: (RCTPromiseRejectBlock)reject)
153
- {
154
- NSError *error;
155
- BOOL isSuccess = [self.cvr resetSettings:&error];
156
- if (!isSuccess && error) {
157
- NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
158
- reject(code, error.localizedDescription, error);
159
- } else {
160
- resolve(@(true));
161
- }
162
- }
163
-
164
- RCT_EXPORT_METHOD(initSettings:(NSString *)content
165
- resolve:(RCTPromiseResolveBlock)resolve
166
- rejecter: (RCTPromiseRejectBlock)reject) {
167
- NSError *error;
168
- BOOL isSuccess = [self.cvr initSettings:content error:&error];
169
- if (!isSuccess && error) {
170
- NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
171
- reject(code, error.localizedDescription, error);
172
- } else {
173
- resolve(@(true));
174
- }
175
- }
176
-
177
- RCT_EXPORT_METHOD(initSettingsFromFile:(NSString *)path
178
- resolve:(RCTPromiseResolveBlock)resolve
179
- rejecter: (RCTPromiseRejectBlock)reject) {
180
- NSError *error;
181
- BOOL isSuccess = [self.cvr initSettingsFromFile:path error:&error];
182
- if (!isSuccess && error) {
183
- NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
184
- reject(code, error.localizedDescription, error);
185
- } else {
186
- resolve(@(true));
187
- }
188
- }
189
-
190
- RCT_EXPORT_METHOD(outputSettings:(NSString *)name
191
- includeDefaultValues:(BOOL)includeDefaultValues
192
- resolve:(RCTPromiseResolveBlock)resolve
193
- rejecter: (RCTPromiseRejectBlock)reject)
194
- {
195
- NSError *error;
196
- NSString *setting = [self.cvr outputSettings:name includeDefaultValues:includeDefaultValues error:&error];
197
- if (error) {
198
- NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
199
- reject(code, error.localizedDescription, error);
200
- } else {
201
- resolve(setting);
202
- }
203
- }
204
-
205
- RCT_EXPORT_METHOD(outputSettingsToFile:(NSString *)name
206
- file:(NSString *)path
207
- includeDefaultValues:(BOOL)includeDefaultValues
208
- resolve:(RCTPromiseResolveBlock)resolve
209
- rejecter: (RCTPromiseRejectBlock)reject)
210
- {
211
- NSError *error;
212
- BOOL isSuccess = [self.cvr outputSettingsToFile:name filePath:path includeDefaultValues:includeDefaultValues error:&error];
213
- if (!isSuccess && error) {
214
- NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
215
- reject(code, error.localizedDescription, error);
216
- } else {
217
- resolve(@(true));
218
- }
219
- }
220
-
221
- #pragma mark - Listener
222
- RCT_EXPORT_METHOD(continueCRR) {
223
- dispatch_semaphore_signal(semaphore);
224
- }
225
-
226
- RCT_EXPORT_METHOD(addResultReceiver:(NSString *)event) {
227
- [self.receiveDictionary setValue:@(true) forKey:event];
228
- }
229
-
230
- RCT_EXPORT_METHOD(removeResultReceiver:(NSString *)event) {
231
- [self.receiveDictionary removeObjectForKey:event];
232
- }
233
-
234
- RCT_EXPORT_METHOD(removeAllResultListeners) {
235
- [self.cvr removeResultReceiver:self];
236
- }
237
-
238
- RCT_EXPORT_METHOD(addFilter:(NSString *)key) {
239
- [self.cvr addResultFilter:[self.filterDictionary valueForKey:key]];
240
- }
241
-
242
- RCT_EXPORT_METHOD(removeFilter:(NSString *)key) {
243
- [self.cvr removeResultFilter:[self.filterDictionary valueForKey:key]];
244
- }
245
-
246
- - (NSArray<NSString *> *)supportedEvents
247
- {
248
- return @[@"onCapturedResultReceived",
249
- @"onDecodedBarcodesReceived",
250
- @"onProcessedDocumentResultReceived",
251
- @"onRecognizedTextLinesReceived",
252
- @"onParsedResultsReceived"];
253
- }
254
-
255
- -(void)startObserving {
256
- hasListeners = YES;
257
- [self.cvr addResultReceiver:self];
258
- }
259
-
260
- -(void)stopObserving {
261
- hasListeners = NO;
262
- [self.cvr removeResultReceiver:self];
263
- }
264
-
265
- - (void)onCapturedResultReceived:(DSCapturedResult *)result {
266
- if (hasListeners && [self.receiveDictionary valueForKey:@"onCapturedResultReceived"].boolValue) {
267
- DSProcessedDocumentResult *imageResult = result.processedDocumentResult;
268
- [self.deskewedImageDataArray removeAllObjects];
269
- for (DSDeskewedImageResultItem *item in imageResult.deskewedImageResultItems) {
270
- DSImageData *data = item.imageData;
271
- if (data) {
272
- [self.deskewedImageDataArray addObject:data];
273
- }
274
- }
275
- [self.enhancedImageDataArray removeAllObjects];
276
- for (DSEnhancedImageResultItem *item in imageResult.enhancedImageResultItems) {
277
- DSImageData *data = item.imageData;
278
- if (data) {
279
- [self.enhancedImageDataArray addObject:data];
280
- }
281
- }
282
- [self sendEventWithName:@"onCapturedResultReceived" body:[result toJson]];
283
- dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
284
- __unused long result = dispatch_semaphore_wait(semaphore, timeout);
285
- }
286
- }
287
-
288
- - (void)onDecodedBarcodesReceived:(DSDecodedBarcodesResult *)result {
289
- if (hasListeners && [self.receiveDictionary valueForKey:@"onDecodedBarcodesReceived"].boolValue) {
290
- [self sendEventWithName:@"onDecodedBarcodesReceived" body:[result toJson]];
291
- dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
292
- __unused long result = dispatch_semaphore_wait(semaphore, timeout);
293
- }
294
- }
295
-
296
- - (void)onProcessedDocumentResultReceived:(DSProcessedDocumentResult *)result {
297
- if (hasListeners && [self.receiveDictionary valueForKey:@"onProcessedDocumentResultReceived"].boolValue) {
298
- [self.deskewedImageDataArray removeAllObjects];
299
- for (DSDeskewedImageResultItem *item in result.deskewedImageResultItems) {
300
- DSImageData *data = item.imageData;
301
- if (data) {
302
- [self.deskewedImageDataArray addObject:data];
303
- }
304
- }
305
- [self.enhancedImageDataArray removeAllObjects];
306
- for (DSEnhancedImageResultItem *item in result.enhancedImageResultItems) {
307
- DSImageData *data = item.imageData;
308
- if (data) {
309
- [self.enhancedImageDataArray addObject:data];
310
- }
311
- }
312
- [self sendEventWithName:@"onProcessedDocumentResultReceived" body:[result toJson]];
313
- dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
314
- __unused long result = dispatch_semaphore_wait(semaphore, timeout);
315
- }
316
- }
317
-
318
- - (void)onRecognizedTextLinesReceived:(DSRecognizedTextLinesResult *)result {
319
- if (hasListeners && [self.receiveDictionary valueForKey:@"onRecognizedTextLinesReceived"].boolValue) {
320
- [self sendEventWithName:@"onRecognizedTextLinesReceived" body:[result toJson]];
321
- dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
322
- __unused long result = dispatch_semaphore_wait(semaphore, timeout);
323
- }
324
- }
325
-
326
- - (void)onParsedResultsReceived:(DSParsedResult *)result {
327
- if (hasListeners && [self.receiveDictionary valueForKey:@"onParsedResultsReceived"].boolValue) {
328
- [self sendEventWithName:@"onParsedResultsReceived" body:[result toJson]];
329
- dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
330
- __unused long result = dispatch_semaphore_wait(semaphore, timeout);
331
- }
332
- }
333
-
334
- #pragma mark - Private
335
- - (NSMutableArray<DSImageData *> *)deskewedImageDataArray {
336
- if (!_deskewedImageDataArray) {
337
- _deskewedImageDataArray = [NSMutableArray array];
338
- }
339
- return _deskewedImageDataArray;
340
- }
341
-
342
- - (NSMutableArray<DSImageData *> *)enhancedImageDataArray {
343
- if (!_enhancedImageDataArray) {
344
- _enhancedImageDataArray = [NSMutableArray array];
345
- }
346
- return _enhancedImageDataArray;
347
- }
348
-
349
- - (NSMutableDictionary<NSString *,DSMultiFrameResultCrossFilter *> *)filterDictionary {
350
- if (!_filterDictionary) {
351
- _filterDictionary = [NSMutableDictionary dictionary];
352
- }
353
- return _filterDictionary;
354
- }
355
-
356
- - (NSMutableDictionary<NSString *,NSNumber *> *)receiveDictionary {
357
- if (!_receiveDictionary) {
358
- _receiveDictionary = [NSMutableDictionary dictionary];
359
- }
360
- return _receiveDictionary;
361
- }
362
-
363
- - (DSImageData *)getOriginalImage:(NSString *)imageHashId {
364
- return [[self.cvr getIntermediateResultManager] getOriginalImage:imageHashId];
365
- }
366
-
367
- #pragma mark - Global JSI
368
- // --- RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install) ---
369
- RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
370
- {
371
- RCTBridge *bridge = self.bridge;
372
-
373
- if ([bridge respondsToSelector:NSSelectorFromString(@"parentBridge")]) {
374
- bridge = [bridge valueForKey:@"parentBridge"];
375
- }
376
-
377
- RCTCxxBridge *cxxBridge = (RCTCxxBridge *)bridge;
378
- if (cxxBridge == nil || cxxBridge.runtime == nil) {
379
- return @false;
380
- }
381
-
382
- auto jsiRuntime = (jsi::Runtime*) cxxBridge.runtime;
383
- if (jsiRuntime == nil) {
384
- return @false;
385
- }
386
-
387
- install(*(facebook::jsi::Runtime *)cxxBridge.runtime, self);
388
- return @true;
389
- }
390
-
391
- // --- Helper Functions and Macros ---
392
- static void installHostFunction(
393
- jsi::Runtime &jsiRuntime,
394
- const char* name,
395
- unsigned int argCount,
396
- HostFunctionType hostFunction) {
397
-
398
- auto func = Function::createFromHostFunction(
399
- jsiRuntime,
400
- PropNameID::forAscii(jsiRuntime, name),
401
- argCount,
402
- std::move(hostFunction)
403
- );
404
- jsiRuntime.global().setProperty(jsiRuntime, name, std::move(func));
405
- }
406
-
407
- // --- JSI Installation Logic ---
408
- static void install(jsi::Runtime &jsiRuntime, RNDynamsoftCaptureVisionRouter *rnCapture) {
409
-
410
- // 1. captureImageData(imageDataHostObject, templateName)
411
- installHostFunction(jsiRuntime, "captureImageData", 2,
412
- [rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
413
- // Argument check
414
- if (count != 2 || !arguments[1].isString() || !arguments[0].isObject()) {
415
- return Value(false); // Or throw a JSI exception
416
- }
417
-
418
- NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
419
- Object obj = arguments[0].getObject(runtime);
420
-
421
- if (obj.isHostObject<ImageDataHostObject>(runtime)) {
422
- // Assuming ImageDataHostObject::getHOFromObject returns a non-owning copy or reference
423
- ImageDataHostObject hostObject = ImageDataHostObject::getHOFromObject(runtime, obj);
424
-
425
- // Get the Objective-C object from the HostObject
426
- DSImageData *data = [DSImageData imageDataFromHostObject:hostObject];
427
-
428
- DSCapturedResult *result = [rnCapture.cvr captureFromBuffer:data templateName:name];
429
- return [result convertToJSIObject:runtime];
430
- }
431
- return Value(false);
432
- }
433
- );
434
-
435
- // 2. captureFile(filePath, templateName)
436
- installHostFunction(jsiRuntime, "captureFile", 2,
437
- [rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
438
- // Argument check
439
- if (count != 2 || !arguments[0].isString() || !arguments[1].isString()) {
440
- return Value(false);
441
- }
442
-
443
- NSString *file = convertJSIStringToNSString(runtime, arguments[0].getString(runtime));
444
- NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
445
-
446
- DSCapturedResult *result = [rnCapture.cvr captureFromFile:file templateName:name];
447
- return [result convertToJSIObject:runtime];
448
- }
449
- );
450
-
451
- // 3. captureFileBytes(arrayBuffer, templateName)
452
- installHostFunction(jsiRuntime, "captureFileBytes", 2,
453
- [rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
454
- // Argument check
455
- if (count != 2 || !arguments[0].isObject() || !arguments[1].isString()) {
456
- return Value(false);
457
- }
458
-
459
- Object obj = arguments[0].asObject(runtime);
460
- if (!obj.isArrayBuffer(runtime)) {
461
- return Value(false);
462
- }
463
-
464
- ArrayBuffer buffer = obj.getArrayBuffer(runtime);
465
- NSData *data = convertArrayBufferToNSData(runtime, buffer);
466
- NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
467
-
468
- DSCapturedResult *result = [rnCapture.cvr captureFromFileBytes:data templateName:name];
469
- return [result convertToJSIObject:runtime];
470
- }
471
- );
472
-
473
- // --- Image Data Array Accessors ---
474
-
475
- // Generic lambda for getting a list of images (deskewed or enhanced)
476
- auto getImageArrayFunc = [rnCapture](Runtime &runtime, NSArray<DSImageData *> *imageDataArray) -> Value {
477
- Array array(runtime, imageDataArray.count);
478
- for (int i = 0; i < imageDataArray.count; i++) {
479
- // Create a new JSI Host Object wrapping the existing Objective-C object's data
480
- // This assumes ImageDataHostObject has a suitable constructor/initialization.
481
- ImageDataHostObject hostObject = [[imageDataArray objectAtIndex:i] hostObject];
482
- Object obj = Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(hostObject));
483
- array.setValueAtIndex(runtime, i, obj);
484
- }
485
- return array;
486
- };
487
-
488
- // 4. getCurrentDeskewedImages()
489
- installHostFunction(jsiRuntime, "getCurrentDeskewedImages", 0,
490
- [rnCapture, getImageArrayFunc](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
491
- if (count != 0) {
492
- return Value(Array(runtime, 0));
493
- }
494
- return getImageArrayFunc(runtime, rnCapture.deskewedImageDataArray);
495
- }
496
- );
497
-
498
- // 5. getCurrentEnhancedImages()
499
- installHostFunction(jsiRuntime, "getCurrentEnhancedImages", 0,
500
- [rnCapture, getImageArrayFunc](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
501
- if (count != 0) {
502
- return Value(Array(runtime, 0));
503
- }
504
- return getImageArrayFunc(runtime, rnCapture.enhancedImageDataArray);
505
- }
506
- );
507
-
508
- // 6. cvr_getOriginalImage(imageHashId)
509
- installHostFunction(jsiRuntime, "cvr_getOriginalImage", 1,
510
- [rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
511
- // Argument check
512
- if (count != 1 || !arguments[0].isString()) {
513
- return Value::null(); // Or Value(false) depending on expected JS behavior
514
- }
515
-
516
- NSString *imageHashId = convertJSIStringToNSString(runtime, arguments[0].getString(runtime));
517
-
518
- DSImageData *imageData = [rnCapture getOriginalImage:imageHashId];
519
- if (imageData == nil) {
520
- return Value::null();
521
- }
522
-
523
- ImageDataHostObject hostObject = [imageData hostObject];
524
- // Create a new JSI Host Object wrapper
525
- Object obj = Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(hostObject));
526
- return obj;
527
- }
528
- );
529
- }
530
-
531
- @end
532
-
1
+ /*
2
+ * Copyright © Dynamsoft Corporation. All rights reserved.
3
+ */
4
+
5
+ #import "RNDynamsoftCaptureVisionRouter.h"
6
+ #import <DynamsoftCaptureVisionBundle/DynamsoftCaptureVisionBundle.h>
7
+ #import <React/RCTUIManager.h>
8
+ #import "RNDynamsoftImageSourceAdapter.h"
9
+ #import "RNDynamsoft+Json.h"
10
+ #import "RNDynamsoft+JSI.h"
11
+ #import <jsi/jsi.h>
12
+ #import <React/RCTBridge+Private.h>
13
+ #import "DSImageData+HostObject.h"
14
+ #import "YeetJSIUtils.h"
15
+
16
+ using namespace facebook::jsi;
17
+ using namespace facebook;
18
+ using namespace std;
19
+
20
+ @interface RNDynamsoftCaptureVisionRouter () <DSCapturedResultReceiver>
21
+
22
+ @property (nonatomic, strong) DSCaptureVisionRouter *cvr;
23
+
24
+ @property (nonatomic, strong) NSMutableArray<DSImageData *> *deskewedImageDataArray;
25
+
26
+ @property (nonatomic, strong) NSMutableArray<DSImageData *> *enhancedImageDataArray;
27
+
28
+ @property (nonatomic, strong) NSMutableDictionary<NSString *, NSNumber *> *receiveDictionary;
29
+
30
+ @end
31
+
32
+ @implementation RNDynamsoftCaptureVisionRouter {
33
+ BOOL hasListeners;
34
+ dispatch_semaphore_t semaphore;
35
+ }
36
+
37
+ RCT_EXPORT_MODULE(DynamsoftCaptureVisionRouterModule)
38
+
39
+ - (instancetype)init
40
+ {
41
+ self = [super init];
42
+ if (self) {
43
+ semaphore = dispatch_semaphore_create(0);
44
+ }
45
+ return self;
46
+ }
47
+
48
+ - (void)dealloc
49
+ {
50
+ _cvr = nil;
51
+ }
52
+
53
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(createInstance) {
54
+ self.cvr = [[DSCaptureVisionRouter alloc] init];
55
+ return @true;
56
+ }
57
+
58
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(destroyInstance) {
59
+ self.cvr = nil;
60
+ return @true;
61
+ }
62
+
63
+ RCT_EXPORT_METHOD(setGlobalIntraOpNumThreads:(NSInteger)intraOpNumThreads) {
64
+ [DSCaptureVisionRouter setGlobalIntraOpNumThreads:intraOpNumThreads];
65
+ }
66
+
67
+ RCT_EXPORT_METHOD(clearDLModelBuffers) {
68
+ [DSCaptureVisionRouter clearDLModelBuffers];
69
+ }
70
+
71
+ RCT_EXPORT_METHOD(switchCapturingTemplate:(NSString *)templateName
72
+ resolve:(RCTPromiseResolveBlock)resolve
73
+ rejecter: (RCTPromiseRejectBlock)reject)
74
+ {
75
+ NSError *error = nil;
76
+ [self.cvr switchCapturingTemplate:templateName error:&error];
77
+ if (error) {
78
+ NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
79
+ reject(code, error.localizedDescription, error);
80
+ } else {
81
+ resolve(@(true));
82
+ }
83
+ }
84
+
85
+ RCT_EXPORT_METHOD(startCapturing:(NSString *)templateName
86
+ resolve:(RCTPromiseResolveBlock)resolve
87
+ rejecter: (RCTPromiseRejectBlock)reject)
88
+ {
89
+ [self.cvr startCapturing:templateName completionHandler:^(BOOL isSuccess, NSError * _Nullable error) {
90
+ if (!isSuccess && error) {
91
+ NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
92
+ reject(code, error.localizedDescription, error);
93
+ } else {
94
+ self->semaphore = dispatch_semaphore_create(0);
95
+ resolve(@(true));
96
+ }
97
+ }];
98
+ }
99
+
100
+ RCT_EXPORT_METHOD(stopCapturing:(RCTPromiseResolveBlock)resolve
101
+ rejecter:(RCTPromiseRejectBlock)reject)
102
+ {
103
+ [self continueCRR];
104
+ [self.cvr stopCapturing];
105
+ resolve(@(true));
106
+ }
107
+
108
+ RCT_EXPORT_METHOD(setInput:(NSString *)key) {
109
+ RNDynamsoftImageSourceAdapter *rnAdapter = [self.bridge moduleForClass:[RNDynamsoftImageSourceAdapter class]];
110
+ DSImageSourceAdapter *isa = [rnAdapter.isaDictionary valueForKey:key];
111
+ NSError *error;
112
+ BOOL isSuccess = [self.cvr setInput:isa error:&error];
113
+ if (!isSuccess && error) {
114
+ __unused NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
115
+ } else {
116
+
117
+ }
118
+ }
119
+
120
+ RCT_EXPORT_METHOD(getSimplifiedSettings:(NSString *)name
121
+ resolve:(RCTPromiseResolveBlock)resolve
122
+ rejecter: (RCTPromiseRejectBlock)reject)
123
+ {
124
+ NSError *error;
125
+ DSSimplifiedCaptureVisionSettings *settings = [self.cvr getSimplifiedSettings:name error:&error];
126
+ if (error) {
127
+ NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
128
+ reject(code, error.localizedDescription, error);
129
+ } else {
130
+ resolve([settings toJson]);
131
+ }
132
+ }
133
+
134
+ RCT_EXPORT_METHOD(updateSettings:(NSDictionary *)dictionary
135
+ templateName:(NSString *)templateName
136
+ resolve:(RCTPromiseResolveBlock)resolve
137
+ rejecter: (RCTPromiseRejectBlock)reject)
138
+ {
139
+ NSError *error;
140
+ DSSimplifiedCaptureVisionSettings *settings = [self.cvr getSimplifiedSettings:templateName error:nil];
141
+ [settings updateWithDicitionary:dictionary];
142
+ BOOL isSuccess = [self.cvr updateSettings:templateName settings:settings error:&error];
143
+ if (!isSuccess && error) {
144
+ NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
145
+ reject(code, error.localizedDescription, error);
146
+ } else {
147
+ resolve(@(true));
148
+ }
149
+ }
150
+
151
+ RCT_EXPORT_METHOD(resetSettings:(RCTPromiseResolveBlock)resolve
152
+ rejecter: (RCTPromiseRejectBlock)reject)
153
+ {
154
+ NSError *error;
155
+ BOOL isSuccess = [self.cvr resetSettings:&error];
156
+ if (!isSuccess && error) {
157
+ NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
158
+ reject(code, error.localizedDescription, error);
159
+ } else {
160
+ resolve(@(true));
161
+ }
162
+ }
163
+
164
+ RCT_EXPORT_METHOD(initSettings:(NSString *)content
165
+ resolve:(RCTPromiseResolveBlock)resolve
166
+ rejecter: (RCTPromiseRejectBlock)reject) {
167
+ NSError *error;
168
+ BOOL isSuccess = [self.cvr initSettings:content error:&error];
169
+ if (!isSuccess && error) {
170
+ NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
171
+ reject(code, error.localizedDescription, error);
172
+ } else {
173
+ resolve(@(true));
174
+ }
175
+ }
176
+
177
+ RCT_EXPORT_METHOD(initSettingsFromFile:(NSString *)path
178
+ resolve:(RCTPromiseResolveBlock)resolve
179
+ rejecter: (RCTPromiseRejectBlock)reject) {
180
+ NSError *error;
181
+ BOOL isSuccess = [self.cvr initSettingsFromFile:path error:&error];
182
+ if (!isSuccess && error) {
183
+ NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
184
+ reject(code, error.localizedDescription, error);
185
+ } else {
186
+ resolve(@(true));
187
+ }
188
+ }
189
+
190
+ RCT_EXPORT_METHOD(outputSettings:(NSString *)name
191
+ includeDefaultValues:(BOOL)includeDefaultValues
192
+ resolve:(RCTPromiseResolveBlock)resolve
193
+ rejecter: (RCTPromiseRejectBlock)reject)
194
+ {
195
+ NSError *error;
196
+ NSString *setting = [self.cvr outputSettings:name includeDefaultValues:includeDefaultValues error:&error];
197
+ if (error) {
198
+ NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
199
+ reject(code, error.localizedDescription, error);
200
+ } else {
201
+ resolve(setting);
202
+ }
203
+ }
204
+
205
+ RCT_EXPORT_METHOD(outputSettingsToFile:(NSString *)name
206
+ file:(NSString *)path
207
+ includeDefaultValues:(BOOL)includeDefaultValues
208
+ resolve:(RCTPromiseResolveBlock)resolve
209
+ rejecter: (RCTPromiseRejectBlock)reject)
210
+ {
211
+ NSError *error;
212
+ BOOL isSuccess = [self.cvr outputSettingsToFile:name filePath:path includeDefaultValues:includeDefaultValues error:&error];
213
+ if (!isSuccess && error) {
214
+ NSString *code = [NSString stringWithFormat:@"%ld",(long)error.code];
215
+ reject(code, error.localizedDescription, error);
216
+ } else {
217
+ resolve(@(true));
218
+ }
219
+ }
220
+
221
+ #pragma mark - Listener
222
+ RCT_EXPORT_METHOD(continueCRR) {
223
+ dispatch_semaphore_signal(semaphore);
224
+ }
225
+
226
+ RCT_EXPORT_METHOD(addResultReceiver:(NSString *)event) {
227
+ [self.receiveDictionary setValue:@(true) forKey:event];
228
+ }
229
+
230
+ RCT_EXPORT_METHOD(removeResultReceiver:(NSString *)event) {
231
+ [self.receiveDictionary removeObjectForKey:event];
232
+ }
233
+
234
+ RCT_EXPORT_METHOD(removeAllResultListeners) {
235
+ [self.cvr removeResultReceiver:self];
236
+ }
237
+
238
+ RCT_EXPORT_METHOD(addFilter:(NSString *)key) {
239
+ [self.cvr addResultFilter:[self.filterDictionary valueForKey:key]];
240
+ }
241
+
242
+ RCT_EXPORT_METHOD(removeFilter:(NSString *)key) {
243
+ [self.cvr removeResultFilter:[self.filterDictionary valueForKey:key]];
244
+ }
245
+
246
+ - (NSArray<NSString *> *)supportedEvents
247
+ {
248
+ return @[@"onCapturedResultReceived",
249
+ @"onDecodedBarcodesReceived",
250
+ @"onProcessedDocumentResultReceived",
251
+ @"onRecognizedTextLinesReceived",
252
+ @"onParsedResultsReceived"];
253
+ }
254
+
255
+ -(void)startObserving {
256
+ hasListeners = YES;
257
+ [self.cvr addResultReceiver:self];
258
+ }
259
+
260
+ -(void)stopObserving {
261
+ hasListeners = NO;
262
+ [self.cvr removeResultReceiver:self];
263
+ }
264
+
265
+ - (void)onCapturedResultReceived:(DSCapturedResult *)result {
266
+ if (hasListeners && [self.receiveDictionary valueForKey:@"onCapturedResultReceived"].boolValue) {
267
+ DSProcessedDocumentResult *imageResult = result.processedDocumentResult;
268
+ [self.deskewedImageDataArray removeAllObjects];
269
+ for (DSDeskewedImageResultItem *item in imageResult.deskewedImageResultItems) {
270
+ DSImageData *data = item.imageData;
271
+ if (data) {
272
+ [self.deskewedImageDataArray addObject:data];
273
+ }
274
+ }
275
+ [self.enhancedImageDataArray removeAllObjects];
276
+ for (DSEnhancedImageResultItem *item in imageResult.enhancedImageResultItems) {
277
+ DSImageData *data = item.imageData;
278
+ if (data) {
279
+ [self.enhancedImageDataArray addObject:data];
280
+ }
281
+ }
282
+ [self sendEventWithName:@"onCapturedResultReceived" body:[result toJson]];
283
+ dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
284
+ __unused long result = dispatch_semaphore_wait(semaphore, timeout);
285
+ }
286
+ }
287
+
288
+ - (void)onDecodedBarcodesReceived:(DSDecodedBarcodesResult *)result {
289
+ if (hasListeners && [self.receiveDictionary valueForKey:@"onDecodedBarcodesReceived"].boolValue) {
290
+ [self sendEventWithName:@"onDecodedBarcodesReceived" body:[result toJson]];
291
+ dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
292
+ __unused long result = dispatch_semaphore_wait(semaphore, timeout);
293
+ }
294
+ }
295
+
296
+ - (void)onProcessedDocumentResultReceived:(DSProcessedDocumentResult *)result {
297
+ if (hasListeners && [self.receiveDictionary valueForKey:@"onProcessedDocumentResultReceived"].boolValue) {
298
+ [self.deskewedImageDataArray removeAllObjects];
299
+ for (DSDeskewedImageResultItem *item in result.deskewedImageResultItems) {
300
+ DSImageData *data = item.imageData;
301
+ if (data) {
302
+ [self.deskewedImageDataArray addObject:data];
303
+ }
304
+ }
305
+ [self.enhancedImageDataArray removeAllObjects];
306
+ for (DSEnhancedImageResultItem *item in result.enhancedImageResultItems) {
307
+ DSImageData *data = item.imageData;
308
+ if (data) {
309
+ [self.enhancedImageDataArray addObject:data];
310
+ }
311
+ }
312
+ [self sendEventWithName:@"onProcessedDocumentResultReceived" body:[result toJson]];
313
+ dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
314
+ __unused long result = dispatch_semaphore_wait(semaphore, timeout);
315
+ }
316
+ }
317
+
318
+ - (void)onRecognizedTextLinesReceived:(DSRecognizedTextLinesResult *)result {
319
+ if (hasListeners && [self.receiveDictionary valueForKey:@"onRecognizedTextLinesReceived"].boolValue) {
320
+ [self sendEventWithName:@"onRecognizedTextLinesReceived" body:[result toJson]];
321
+ dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
322
+ __unused long result = dispatch_semaphore_wait(semaphore, timeout);
323
+ }
324
+ }
325
+
326
+ - (void)onParsedResultsReceived:(DSParsedResult *)result {
327
+ if (hasListeners && [self.receiveDictionary valueForKey:@"onParsedResultsReceived"].boolValue) {
328
+ [self sendEventWithName:@"onParsedResultsReceived" body:[result toJson]];
329
+ dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC);
330
+ __unused long result = dispatch_semaphore_wait(semaphore, timeout);
331
+ }
332
+ }
333
+
334
+ #pragma mark - Private
335
+ - (NSMutableArray<DSImageData *> *)deskewedImageDataArray {
336
+ if (!_deskewedImageDataArray) {
337
+ _deskewedImageDataArray = [NSMutableArray array];
338
+ }
339
+ return _deskewedImageDataArray;
340
+ }
341
+
342
+ - (NSMutableArray<DSImageData *> *)enhancedImageDataArray {
343
+ if (!_enhancedImageDataArray) {
344
+ _enhancedImageDataArray = [NSMutableArray array];
345
+ }
346
+ return _enhancedImageDataArray;
347
+ }
348
+
349
+ - (NSMutableDictionary<NSString *,DSMultiFrameResultCrossFilter *> *)filterDictionary {
350
+ if (!_filterDictionary) {
351
+ _filterDictionary = [NSMutableDictionary dictionary];
352
+ }
353
+ return _filterDictionary;
354
+ }
355
+
356
+ - (NSMutableDictionary<NSString *,NSNumber *> *)receiveDictionary {
357
+ if (!_receiveDictionary) {
358
+ _receiveDictionary = [NSMutableDictionary dictionary];
359
+ }
360
+ return _receiveDictionary;
361
+ }
362
+
363
+ - (DSImageData *)getOriginalImage:(NSString *)imageHashId {
364
+ return [[self.cvr getIntermediateResultManager] getOriginalImage:imageHashId];
365
+ }
366
+
367
+ #pragma mark - Global JSI
368
+ // --- RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install) ---
369
+ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)
370
+ {
371
+ RCTBridge *bridge = self.bridge;
372
+
373
+ if ([bridge respondsToSelector:NSSelectorFromString(@"parentBridge")]) {
374
+ bridge = [bridge valueForKey:@"parentBridge"];
375
+ }
376
+
377
+ RCTCxxBridge *cxxBridge = (RCTCxxBridge *)bridge;
378
+ if (cxxBridge == nil || cxxBridge.runtime == nil) {
379
+ return @false;
380
+ }
381
+
382
+ auto jsiRuntime = (jsi::Runtime*) cxxBridge.runtime;
383
+ if (jsiRuntime == nil) {
384
+ return @false;
385
+ }
386
+
387
+ install(*(facebook::jsi::Runtime *)cxxBridge.runtime, self);
388
+ return @true;
389
+ }
390
+
391
+ // --- Helper Functions and Macros ---
392
+ static void installHostFunction(
393
+ jsi::Runtime &jsiRuntime,
394
+ const char* name,
395
+ unsigned int argCount,
396
+ HostFunctionType hostFunction) {
397
+
398
+ auto func = Function::createFromHostFunction(
399
+ jsiRuntime,
400
+ PropNameID::forAscii(jsiRuntime, name),
401
+ argCount,
402
+ std::move(hostFunction)
403
+ );
404
+ jsiRuntime.global().setProperty(jsiRuntime, name, std::move(func));
405
+ }
406
+
407
+ // --- JSI Installation Logic ---
408
+ static void install(jsi::Runtime &jsiRuntime, RNDynamsoftCaptureVisionRouter *rnCapture) {
409
+
410
+ // 1. captureImageData(imageDataHostObject, templateName)
411
+ installHostFunction(jsiRuntime, "captureImageData", 2,
412
+ [rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
413
+ // Argument check
414
+ if (count != 2 || !arguments[1].isString() || !arguments[0].isObject()) {
415
+ return Value(false); // Or throw a JSI exception
416
+ }
417
+
418
+ NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
419
+ Object obj = arguments[0].getObject(runtime);
420
+
421
+ if (obj.isHostObject<ImageDataHostObject>(runtime)) {
422
+ // Assuming ImageDataHostObject::getHOFromObject returns a non-owning copy or reference
423
+ ImageDataHostObject hostObject = ImageDataHostObject::getHOFromObject(runtime, obj);
424
+
425
+ // Get the Objective-C object from the HostObject
426
+ DSImageData *data = [DSImageData imageDataFromHostObject:hostObject];
427
+
428
+ DSCapturedResult *result = [rnCapture.cvr captureFromBuffer:data templateName:name];
429
+ return [result convertToJSIObject:runtime];
430
+ }
431
+ return Value(false);
432
+ }
433
+ );
434
+
435
+ // 2. captureFile(filePath, templateName)
436
+ installHostFunction(jsiRuntime, "captureFile", 2,
437
+ [rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
438
+ // Argument check
439
+ if (count != 2 || !arguments[0].isString() || !arguments[1].isString()) {
440
+ return Value(false);
441
+ }
442
+
443
+ NSString *file = convertJSIStringToNSString(runtime, arguments[0].getString(runtime));
444
+ NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
445
+
446
+ DSCapturedResult *result = [rnCapture.cvr captureFromFile:file templateName:name];
447
+ return [result convertToJSIObject:runtime];
448
+ }
449
+ );
450
+
451
+ // 3. captureFileBytes(arrayBuffer, templateName)
452
+ installHostFunction(jsiRuntime, "captureFileBytes", 2,
453
+ [rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
454
+ // Argument check
455
+ if (count != 2 || !arguments[0].isObject() || !arguments[1].isString()) {
456
+ return Value(false);
457
+ }
458
+
459
+ Object obj = arguments[0].asObject(runtime);
460
+ if (!obj.isArrayBuffer(runtime)) {
461
+ return Value(false);
462
+ }
463
+
464
+ ArrayBuffer buffer = obj.getArrayBuffer(runtime);
465
+ NSData *data = convertArrayBufferToNSData(runtime, buffer);
466
+ NSString *name = convertJSIStringToNSString(runtime, arguments[1].getString(runtime));
467
+
468
+ DSCapturedResult *result = [rnCapture.cvr captureFromFileBytes:data templateName:name];
469
+ return [result convertToJSIObject:runtime];
470
+ }
471
+ );
472
+
473
+ // --- Image Data Array Accessors ---
474
+
475
+ // Generic lambda for getting a list of images (deskewed or enhanced)
476
+ auto getImageArrayFunc = [rnCapture](Runtime &runtime, NSArray<DSImageData *> *imageDataArray) -> Value {
477
+ Array array(runtime, imageDataArray.count);
478
+ for (int i = 0; i < imageDataArray.count; i++) {
479
+ // Create a new JSI Host Object wrapping the existing Objective-C object's data
480
+ // This assumes ImageDataHostObject has a suitable constructor/initialization.
481
+ ImageDataHostObject hostObject = [[imageDataArray objectAtIndex:i] hostObject];
482
+ Object obj = Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(hostObject));
483
+ array.setValueAtIndex(runtime, i, obj);
484
+ }
485
+ return array;
486
+ };
487
+
488
+ // 4. getCurrentDeskewedImages()
489
+ installHostFunction(jsiRuntime, "getCurrentDeskewedImages", 0,
490
+ [rnCapture, getImageArrayFunc](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
491
+ if (count != 0) {
492
+ return Value(Array(runtime, 0));
493
+ }
494
+ return getImageArrayFunc(runtime, rnCapture.deskewedImageDataArray);
495
+ }
496
+ );
497
+
498
+ // 5. getCurrentEnhancedImages()
499
+ installHostFunction(jsiRuntime, "getCurrentEnhancedImages", 0,
500
+ [rnCapture, getImageArrayFunc](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
501
+ if (count != 0) {
502
+ return Value(Array(runtime, 0));
503
+ }
504
+ return getImageArrayFunc(runtime, rnCapture.enhancedImageDataArray);
505
+ }
506
+ );
507
+
508
+ // 6. cvr_getOriginalImage(imageHashId)
509
+ installHostFunction(jsiRuntime, "cvr_getOriginalImage", 1,
510
+ [rnCapture](Runtime &runtime, const Value &thisValue, const Value *arguments, size_t count) -> Value {
511
+ // Argument check
512
+ if (count != 1 || !arguments[0].isString()) {
513
+ return Value::null(); // Or Value(false) depending on expected JS behavior
514
+ }
515
+
516
+ NSString *imageHashId = convertJSIStringToNSString(runtime, arguments[0].getString(runtime));
517
+
518
+ DSImageData *imageData = [rnCapture getOriginalImage:imageHashId];
519
+ if (imageData == nil) {
520
+ return Value::null();
521
+ }
522
+
523
+ ImageDataHostObject hostObject = [imageData hostObject];
524
+ // Create a new JSI Host Object wrapper
525
+ Object obj = Object::createFromHostObject(runtime, std::make_shared<ImageDataHostObject>(hostObject));
526
+ return obj;
527
+ }
528
+ );
529
+ }
530
+
531
+ @end
532
+