From 0b171f1ff2a98b5d972c7a7cfa2dac250991b3a5 Mon Sep 17 00:00:00 2001 From: Andreas Gampe Date: Tue, 4 Apr 2017 20:02:25 -0700 Subject: [PATCH] CameraProvider: Refactor legacy name regex code The match will use iterators that will be invalidated when the used string input goes out of scope. Refactor the API to return the two components of the match. Bug: 36871785 Test: m && m SANITIZE_TARGET=address Change-Id: I2418541234a09e53856ea61e0fbc4b67d8036308 --- camera/provider/2.4/default/CameraProvider.cpp | 50 ++++++++++++++------------ camera/provider/2.4/default/CameraProvider.h | 1 - 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/camera/provider/2.4/default/CameraProvider.cpp b/camera/provider/2.4/default/CameraProvider.cpp index 8701ec1d..9f4d1883 100644 --- a/camera/provider/2.4/default/CameraProvider.cpp +++ b/camera/provider/2.4/default/CameraProvider.cpp @@ -40,6 +40,22 @@ const char *kHAL1_0 = "1.0"; const int kMaxCameraDeviceNameLen = 128; const int kMaxCameraIdLen = 16; +bool matchDeviceName(const hidl_string& deviceName, std::string* deviceVersion, + std::string* cameraId) { + std::string deviceNameStd(deviceName.c_str()); + std::smatch sm; + if (std::regex_match(deviceNameStd, sm, kDeviceNameRE)) { + if (deviceVersion != nullptr) { + *deviceVersion = sm[1]; + } + if (cameraId != nullptr) { + *cameraId = sm[2]; + } + return true; + } + return false; +} + } // anonymous namespace using ::android::hardware::camera::common::V1_0::CameraMetadataType; @@ -112,30 +128,22 @@ Status CameraProvider::getHidlStatus(int status) { } } -bool CameraProvider::matchDeviceName(const hidl_string& deviceName, std::smatch& sm) { - std::string deviceNameStd(deviceName.c_str()); - return std::regex_match(deviceNameStd, sm, kDeviceNameRE); -} - std::string CameraProvider::getLegacyCameraId(const hidl_string& deviceName) { - std::smatch sm; - bool match = matchDeviceName(deviceName, sm); - if (!match) { - return std::string(""); - } - return sm[2]; + std::string cameraId; + matchDeviceName(deviceName, nullptr, &cameraId); + return cameraId; } int CameraProvider::getCameraDeviceVersion(const hidl_string& deviceName) { - std::smatch sm; - bool match = matchDeviceName(deviceName, sm); + std::string deviceVersion; + bool match = matchDeviceName(deviceName, &deviceVersion, nullptr); if (!match) { return -1; } - if (sm[1].compare(kHAL3_2) == 0) { + if (deviceVersion == kHAL3_2) { // maybe switched to 3.4 or define the hidl version enum later return CAMERA_DEVICE_API_VERSION_3_2; - } else if (sm[1].compare(kHAL1_0) == 0) { + } else if (deviceVersion == kHAL1_0) { return CAMERA_DEVICE_API_VERSION_1_0; } return 0; @@ -322,15 +330,13 @@ Return CameraProvider::isSetTorchModeSupported(isSetTorchModeSupported_cb Return CameraProvider::getCameraDeviceInterface_V1_x( const hidl_string& cameraDeviceName, getCameraDeviceInterface_V1_x_cb _hidl_cb) { - std::smatch sm; - bool match = matchDeviceName(cameraDeviceName, sm); + std::string cameraId, deviceVersion; + bool match = matchDeviceName(cameraDeviceName, &deviceVersion, &cameraId); if (!match) { _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr); return Void(); } - std::string cameraId = sm[2]; - std::string deviceVersion = sm[1]; std::string deviceName(cameraDeviceName.c_str()); ssize_t index = mCameraDeviceNames.indexOf(std::make_pair(cameraId, deviceName)); if (index == NAME_NOT_FOUND) { // Either an illegal name or a device version mismatch @@ -377,15 +383,13 @@ Return CameraProvider::getCameraDeviceInterface_V1_x( Return CameraProvider::getCameraDeviceInterface_V3_x( const hidl_string& cameraDeviceName, getCameraDeviceInterface_V3_x_cb _hidl_cb) { - std::smatch sm; - bool match = matchDeviceName(cameraDeviceName, sm); + std::string cameraId, deviceVersion; + bool match = matchDeviceName(cameraDeviceName, &deviceVersion, &cameraId); if (!match) { _hidl_cb(Status::ILLEGAL_ARGUMENT, nullptr); return Void(); } - std::string cameraId = sm[2]; - std::string deviceVersion = sm[1]; std::string deviceName(cameraDeviceName.c_str()); ssize_t index = mCameraDeviceNames.indexOf(std::make_pair(cameraId, deviceName)); if (index == NAME_NOT_FOUND) { // Either an illegal name or a device version mismatch diff --git a/camera/provider/2.4/default/CameraProvider.h b/camera/provider/2.4/default/CameraProvider.h index 2a43e2f3..d7b0ea6d 100644 --- a/camera/provider/2.4/default/CameraProvider.h +++ b/camera/provider/2.4/default/CameraProvider.h @@ -91,7 +91,6 @@ private: bool setUpVendorTags(); // extract legacy camera ID/device version from a HIDL device name - static bool matchDeviceName(const hidl_string& deviceName, std::smatch& sm); static std::string getLegacyCameraId(const hidl_string& deviceName); static int getCameraDeviceVersion(const hidl_string& deviceName); -- 2.11.0