Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0b171f1f authored by Andreas Gampe's avatar Andreas Gampe Committed by Yin-Chia Yeh
Browse files

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
parent 73bae67b
Loading
Loading
Loading
Loading
+27 −23
Original line number Diff line number Diff line
@@ -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<void> CameraProvider::isSetTorchModeSupported(isSetTorchModeSupported_cb

Return<void> 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<void> CameraProvider::getCameraDeviceInterface_V1_x(

Return<void> 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
+0 −1
Original line number Diff line number Diff line
@@ -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);