react-native-camera/windows/ReactNativeCameraCPP/ReactCameraModule.h
Jon Thysell 2782a24d25
feat(windows): added barcode scanning support (#2930)
Build:
* Fixed issue with edit and continue debug symbols
* Fixed ReactNativeCameraCPP61 builds
* Added dependency on huycn.zxingcpp.winrt for barcode support

ReactNativeCameraCPP RNCamera component:
* Added onBarCodeRead event support
* Added barCodeScannerEnabled property support
* Added barCodeTypes property support
* Added barCodeReadIntervalMS property to alter how often the scan
  occurs when enabled

ReactNativeCameraCPP RNCamera module:
* Added BarCodeType constants

Other:
* Fixed intermittent issue with thread marshalling
* Re-ran clang formatting

Closes #2830
2020-08-11 15:57:00 -03:00

138 lines
5.3 KiB
C++

#pragma once
#include <functional>
#include <sstream>
#include <system_error>
#include "JSValue.h"
#include "NativeModules.h"
#include "ReactCameraConstants.h"
#include "ReactCameraViewManager.h"
using namespace winrt::Microsoft::ReactNative;
#ifdef RNW61
#define JSVALUEOBJECTPARAMETER
#else
#define JSVALUEOBJECTPARAMETER const &
#endif
namespace winrt {
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Media;
using namespace Windows::Media::MediaProperties;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::Foundation;
using namespace winrt::Windows::UI::Core;
using namespace winrt::Windows::Storage::Streams;
} // namespace winrt
namespace winrt::ReactNativeCameraCPP {
REACT_MODULE(RNCameraModule);
struct RNCameraModule {
const std::string Name = "RNCameraModule";
#pragma region Constants
REACT_CONSTANT_PROVIDER(ConstantProvider)
void ConstantProvider(ReactConstantProvider &provider) noexcept {
provider.Add(L"Aspect", ReactCameraConstants::GetAspectConstants());
provider.Add(L"BarCodeType", ReactCameraConstants::GetBarcodeConstants());
provider.Add(L"FaceDetection", ReactCameraConstants::GetFaceDetectionConstants());
provider.Add(L"AutoFocus", ReactCameraConstants::GetAutoFocusConstants());
provider.Add(L"WhiteBalance", ReactCameraConstants::GetWhiteBalanceConstants());
provider.Add(L"Type", ReactCameraConstants::GetTypeConstants());
provider.Add(L"VideoQuality", ReactCameraConstants::GetCaptureQualityConstants());
provider.Add(L"VideoCodec", ReactCameraConstants::GetCaptureCodecConstants());
provider.Add(L"CaptureTarget", ReactCameraConstants::GetCaptureTargetConstants());
provider.Add(L"Orientation", ReactCameraConstants::GetOrientationConstants());
provider.Add(L"FlashMode", ReactCameraConstants::GetFlashModeConstants());
}
#pragma endregion
#pragma region Methods
template <class TPromiseResult>
winrt::AsyncActionCompletedHandler MakeAsyncActionCompletedHandler(
winrt::Microsoft::ReactNative::ReactPromise<TPromiseResult> const &promise) {
return [promise](winrt::IAsyncAction action, winrt::AsyncStatus status) {
if (status == winrt::AsyncStatus::Error) {
std::stringstream errorCode;
errorCode << "0x" << std::hex << action.ErrorCode() << std::endl;
auto error = winrt::Microsoft::ReactNative::ReactError();
error.Message = "HRESULT " + errorCode.str() + ": " + std::system_category().message(action.ErrorCode());
promise.Reject(error);
}
};
}
REACT_METHOD(record)
void record(
winrt::Microsoft::ReactNative::JSValueObject JSVALUEOBJECTPARAMETER options,
int viewTag,
winrt::Microsoft::ReactNative::ReactPromise<winrt::Microsoft::ReactNative::JSValueObject> const
&result) noexcept {
auto asyncOp =
winrt::ReactNativeCameraCPP::implementation::ReactCameraViewManager::RecordAsync(options, viewTag, result);
asyncOp.Completed(MakeAsyncActionCompletedHandler(result));
}
REACT_METHOD(stopRecording)
void stopRecording(int viewTag) noexcept {
auto asyncOp = winrt::ReactNativeCameraCPP::implementation::ReactCameraViewManager::StopRecordAsync(viewTag);
}
REACT_METHOD(isRecording)
void isRecording(int viewTag, winrt::Microsoft::ReactNative::ReactPromise<bool> const &result) noexcept {
auto asyncOp =
winrt::ReactNativeCameraCPP::implementation::ReactCameraViewManager::IsRecordingAsync(viewTag, result);
asyncOp.Completed(MakeAsyncActionCompletedHandler(result));
}
REACT_METHOD(pausePreview)
void pausePreview(int viewTag) noexcept {
auto asyncOp = winrt::ReactNativeCameraCPP::implementation::ReactCameraViewManager::PausePreviewAsync(viewTag);
}
REACT_METHOD(resumePreview)
void resumePreview(int viewTag) noexcept {
auto asyncOp = winrt::ReactNativeCameraCPP::implementation::ReactCameraViewManager::ResumePreviewAsync(viewTag);
}
REACT_METHOD(takePicture)
void takePicture(
winrt::Microsoft::ReactNative::JSValueObject JSVALUEOBJECTPARAMETER options,
int viewTag,
winrt::Microsoft::ReactNative::ReactPromise<winrt::Microsoft::ReactNative::JSValueObject> const
&result) noexcept {
auto asyncOp =
winrt::ReactNativeCameraCPP::implementation::ReactCameraViewManager::TakePictureAsync(options, viewTag, result);
asyncOp.Completed(MakeAsyncActionCompletedHandler(result));
}
REACT_METHOD(checkMediaCapturePermission)
void checkMediaCapturePermission(winrt::Microsoft::ReactNative::ReactPromise<bool> const &result) noexcept {
auto asyncOp =
winrt::ReactNativeCameraCPP::implementation::ReactCameraViewManager::CheckMediaCapturePermissionAsync(result);
asyncOp.Completed(MakeAsyncActionCompletedHandler(result));
}
REACT_METHOD(getCameraIds)
void getCameraIds(
winrt::Microsoft::ReactNative::ReactPromise<winrt::Microsoft::ReactNative::JSValueArray> const &result) noexcept {
auto asyncOp = winrt::ReactNativeCameraCPP::implementation::ReactCameraViewManager::GetCameraIdsAsync(result);
asyncOp.Completed(MakeAsyncActionCompletedHandler(result));
}
#pragma endregion
public:
RNCameraModule() = default;
~RNCameraModule() = default;
};
} // namespace winrt::ReactNativeCameraCPP