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

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 (198) 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/dysJniLibsFor86/debug/arm64-v8a/librn_dys.so +0 -0
  32. package/android/src/main/dysJniLibsFor86/debug/armeabi-v7a/librn_dys.so +0 -0
  33. package/android/src/main/dysJniLibsFor86/debug/x86/librn_dys.so +0 -0
  34. package/android/src/main/dysJniLibsFor86/debug/x86_64/librn_dys.so +0 -0
  35. package/android/src/main/dysJniLibsFor86/release/arm64-v8a/librn_dys.so +0 -0
  36. package/android/src/main/dysJniLibsFor86/release/armeabi-v7a/librn_dys.so +0 -0
  37. package/android/src/main/dysJniLibsFor86/release/x86/librn_dys.so +0 -0
  38. package/android/src/main/dysJniLibsFor86/release/x86_64/librn_dys.so +0 -0
  39. package/android/src/main/java/com/dynamsoft/reactnativelib/CVRModule.kt +137 -137
  40. package/android/src/main/java/com/dynamsoft/reactnativelib/CameraViewManager.kt +62 -62
  41. package/android/src/main/java/com/dynamsoft/reactnativelib/DCEModule.kt +125 -125
  42. package/android/src/main/java/com/dynamsoft/reactnativelib/DynamsoftBaseModule.kt +8 -8
  43. package/android/src/main/java/com/dynamsoft/reactnativelib/ISAModule.kt +73 -73
  44. package/android/src/main/java/com/dynamsoft/reactnativelib/ImageEditorViewManager.kt +14 -14
  45. package/android/src/main/java/com/dynamsoft/reactnativelib/ImageEditorViewModule.kt +35 -35
  46. package/android/src/main/java/com/dynamsoft/reactnativelib/ImageManagerModule.kt +15 -15
  47. package/android/src/main/java/com/dynamsoft/reactnativelib/LicenseModule.kt +29 -29
  48. package/android/src/main/java/com/dynamsoft/reactnativelib/MultiCrossFilterModule.kt +83 -83
  49. package/android/src/main/java/com/dynamsoft/reactnativelib/ReactNativeDcvPackage.kt +32 -32
  50. package/android/src/main/java/com/dynamsoft/reactnativelib/VersionsModule.kt +41 -41
  51. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/Basic.kt +44 -44
  52. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForCore.kt +50 -50
  53. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForCvr.kt +129 -129
  54. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForDBR.kt +157 -157
  55. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForDCE.kt +110 -110
  56. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForDCP.kt +49 -49
  57. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForDDN.kt +85 -85
  58. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ForDLR.kt +72 -72
  59. package/android/src/main/java/com/dynamsoft/reactnativelib/basicutils/ImageUtil.kt +58 -58
  60. package/android/src/main/java/com/dynamsoft/reactnativelib/core/ImageSourceAdapterModuleImpl.kt +120 -120
  61. package/android/src/main/java/com/dynamsoft/reactnativelib/cvr/CaptureVisionRouterModuleImpl.kt +306 -306
  62. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraEnhancerModuleImpl.kt +247 -247
  63. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraLifeCycleOwner.java +14 -14
  64. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/CameraViewManagerImpl.kt +77 -77
  65. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/ImageEditorViewManagerImpl.kt +15 -15
  66. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/ImageEditorViewModuleImpl.kt +110 -110
  67. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/RNCameraView.kt +20 -20
  68. package/android/src/main/java/com/dynamsoft/reactnativelib/dce/RNImageEditorView.kt +19 -19
  69. package/android/src/main/java/com/dynamsoft/reactnativelib/license/LicenseModuleImpl.kt +39 -39
  70. package/android/src/main/java/com/dynamsoft/reactnativelib/utility/ImageManagerModuleImpl.kt +120 -120
  71. package/android/src/main/java/com/dynamsoft/reactnativelib/utility/MultiCrossFilterModuleImpl.kt +111 -111
  72. package/app.plugin.js +21 -21
  73. package/dynamsoft-capture-vision-react-native.podspec +24 -24
  74. package/ios/CPP/DSImageData+HostObject.h +18 -18
  75. package/ios/CPP/DSImageData+HostObject.mm +38 -38
  76. package/ios/CPP/ImageDataHostObject.cpp +87 -87
  77. package/ios/CPP/ImageDataHostObject.hpp +35 -35
  78. package/ios/CPP/MutableRawBuffer.cpp +23 -23
  79. package/ios/CPP/MutableRawBuffer.hpp +23 -23
  80. package/ios/CPP/RNDynamsoft+JSI.h +22 -22
  81. package/ios/CPP/RNDynamsoft+JSI.mm +303 -303
  82. package/ios/CPP/RNDynamsoft+Json.h +93 -93
  83. package/ios/CPP/RNDynamsoft+Json.m +733 -733
  84. package/ios/CPP/YeetJSIUtils.h +56 -56
  85. package/ios/CPP/YeetJSIUtils.mm +208 -208
  86. package/ios/RNDynamsoftCameraView.h +31 -31
  87. package/ios/RNDynamsoftCameraView.m +108 -108
  88. package/ios/RNDynamsoftCameraViewManager.h +14 -14
  89. package/ios/RNDynamsoftCameraViewManager.m +195 -195
  90. package/ios/RNDynamsoftCaptureVisionRouter.h +18 -18
  91. package/ios/RNDynamsoftCaptureVisionRouter.mm +532 -532
  92. package/ios/RNDynamsoftImageEditorView.h +17 -17
  93. package/ios/RNDynamsoftImageEditorView.m +25 -25
  94. package/ios/RNDynamsoftImageEditorViewManager.h +14 -14
  95. package/ios/RNDynamsoftImageEditorViewManager.mm +183 -183
  96. package/ios/RNDynamsoftImageManager.h +14 -14
  97. package/ios/RNDynamsoftImageManager.mm +369 -369
  98. package/ios/RNDynamsoftImageSourceAdapter.h +19 -19
  99. package/ios/RNDynamsoftImageSourceAdapter.mm +255 -255
  100. package/ios/RNDynamsoftLicense.h +14 -14
  101. package/ios/RNDynamsoftLicense.m +62 -62
  102. package/ios/RNDynamsoftMultiCrossFilter.h +14 -14
  103. package/ios/RNDynamsoftMultiCrossFilter.m +145 -145
  104. package/ios/RNDynamsoftVersions.h +13 -13
  105. package/ios/RNDynamsoftVersions.m +27 -27
  106. package/package.json +48 -48
  107. package/src/NativeDynamsoftVersionsModule.tsx +20 -20
  108. package/src/VersionsModule.tsx +7 -7
  109. package/src/core/CapturedResultBase.tsx +18 -18
  110. package/src/core/CapturedResultItem.tsx +23 -23
  111. package/src/core/CoreModule.tsx +9 -9
  112. package/src/core/DSRect.tsx +29 -29
  113. package/src/core/EnumCaptureResultItemType.tsx +52 -52
  114. package/src/core/EnumColourChannelUsageType.tsx +26 -26
  115. package/src/core/EnumCrossVerificationStatus.tsx +46 -46
  116. package/src/core/EnumGrayscaleEnhancementMode.tsx +46 -46
  117. package/src/core/EnumGrayscaleTransformationMode.tsx +35 -35
  118. package/src/core/EnumImageFileFormat.tsx +6 -6
  119. package/src/core/EnumPixelFormat.tsx +53 -53
  120. package/src/core/ImageData.tsx +87 -87
  121. package/src/core/ImageSourceAdapter.tsx +160 -160
  122. package/src/core/NativeDynamsoftImageSourceAdapterModule.tsx +29 -29
  123. package/src/core/Point.tsx +13 -13
  124. package/src/core/Quadrilateral.tsx +12 -12
  125. package/src/core/index.tsx +18 -18
  126. package/src/cvr/CaptureVisionRouter.tsx +683 -683
  127. package/src/cvr/CaptureVisionRouterModule.tsx +9 -9
  128. package/src/cvr/CapturedResult.tsx +123 -123
  129. package/src/cvr/CapturedResultFilter.tsx +13 -13
  130. package/src/cvr/CapturedResultReceiver.tsx +71 -71
  131. package/src/cvr/EnumPresetTemplate.tsx +81 -81
  132. package/src/cvr/NativeDynamsoftCaptureVisionRouterModule.tsx +25 -25
  133. package/src/cvr/SimplifiedCaptureVisionSettings.tsx +61 -61
  134. package/src/cvr/index.tsx +11 -11
  135. package/src/dbr/BarcodeDetails.tsx +51 -51
  136. package/src/dbr/BarcodeReaderModule.tsx +9 -9
  137. package/src/dbr/BarcodeResultItem.tsx +65 -65
  138. package/src/dbr/DecodedBarcodesResult.tsx +14 -14
  139. package/src/dbr/ECISegment.tsx +23 -23
  140. package/src/dbr/EnumBarcodeFormat.tsx +112 -112
  141. package/src/dbr/EnumDeblurMode.tsx +29 -29
  142. package/src/dbr/EnumLocalizationMode.tsx +27 -27
  143. package/src/dbr/EnumQRCodeErrorCorrectionLevel.tsx +6 -6
  144. package/src/dbr/SimplifiedBarcodeReaderSettings.tsx +80 -80
  145. package/src/dbr/index.tsx +9 -9
  146. package/src/dce/CameraEnhancer.tsx +254 -254
  147. package/src/dce/CameraEnhancerModule.tsx +9 -9
  148. package/src/dce/CameraView.tsx +100 -100
  149. package/src/dce/DynamsoftCameraViewNativeComponent.ts +96 -96
  150. package/src/dce/DynamsoftImageEditorViewNativeComponent.ts +9 -9
  151. package/src/dce/EnumCameraPosition.tsx +25 -25
  152. package/src/dce/EnumDrawingLayerId.tsx +17 -17
  153. package/src/dce/EnumEnhancedFeatures.tsx +24 -24
  154. package/src/dce/EnumFocusMode.tsx +6 -6
  155. package/src/dce/EnumResolution.tsx +8 -8
  156. package/src/dce/EnumTorchState.tsx +10 -10
  157. package/src/dce/FeedBack.tsx +28 -28
  158. package/src/dce/ImageEditorView.tsx +131 -131
  159. package/src/dce/NativeDynamsoftCameraViewModule.tsx +47 -47
  160. package/src/dce/NativeDynamsoftImageEditorViewModule.ts +9 -9
  161. package/src/dce/index.tsx +13 -13
  162. package/src/dcp/CodeParserDedicatorModule.tsx +9 -9
  163. package/src/dcp/CodeParserModule.tsx +9 -9
  164. package/src/dcp/EnumMappingStatus.tsx +14 -14
  165. package/src/dcp/EnumValidationStatus.tsx +14 -14
  166. package/src/dcp/ParsedResult.tsx +14 -14
  167. package/src/dcp/ParsedResultItem.tsx +50 -50
  168. package/src/dcp/index.tsx +8 -8
  169. package/src/ddn/DeskewedImageResultItem.tsx +40 -40
  170. package/src/ddn/DetectedQuadResultItem.tsx +31 -31
  171. package/src/ddn/DocumentNormalizerModule.tsx +9 -9
  172. package/src/ddn/EnhancedImageResultItem.tsx +20 -20
  173. package/src/ddn/EnumImageColourMode.tsx +14 -14
  174. package/src/ddn/ProcessedDocumentResult.tsx +27 -27
  175. package/src/ddn/SimplifiedDocumentNormalizerSettings.tsx +65 -65
  176. package/src/ddn/index.tsx +11 -11
  177. package/src/dip/ImageProcessingModule.tsx +9 -9
  178. package/src/dip/index.tsx +1 -1
  179. package/src/dlr/CharacterResult.tsx +28 -28
  180. package/src/dlr/LabelRecognizerModule.tsx +9 -9
  181. package/src/dlr/RecognizedTextLinesResult.tsx +19 -19
  182. package/src/dlr/SimplifiedLabelRecognizerSettings.tsx +33 -33
  183. package/src/dlr/TextLineResultItem.tsx +41 -41
  184. package/src/dlr/index.tsx +8 -8
  185. package/src/index.tsx +13 -13
  186. package/src/license/LicenseManager.tsx +49 -49
  187. package/src/license/LicenseModule.tsx +9 -9
  188. package/src/license/NativeDynamsoftLicenseModule.tsx +7 -7
  189. package/src/license/index.tsx +7 -7
  190. package/src/utility/CrossVerificationCriteria.tsx +11 -11
  191. package/src/utility/EnumFilterType.tsx +5 -5
  192. package/src/utility/ImageManager.tsx +348 -348
  193. package/src/utility/MultiFrameResultCrossFilter.tsx +183 -183
  194. package/src/utility/NativeDynamsoftImageManagerModule.tsx +7 -7
  195. package/src/utility/NativeDynamsoftMultiCrossFilterModule.tsx +18 -18
  196. package/src/utility/UtilityModule.tsx +9 -9
  197. package/src/utility/index.tsx +4 -4
  198. 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
+