Revision control

++ // Copyright (C) 2025 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
++
++ #ifndef OHOSSENSORUTILS_H
++ #define OHOSSENSORUTILS_H
++
++ #include <QtCore/private/qohoscommon_p.h>
++ #include <QtCore/private/qohoslogger_p.h>
++ #include <memory>
++ #include <optional>
++ #include <sensors/oh_sensor_type.h>
++
++ namespace ohossensorutils_h_details {
++
++ template<typename SensorObjectPtr, typename T>
++ std::optional<T> tryGetSensorDataField(
++ SensorObjectPtr sensorObjectPtr,
++ std::int32_t (*sensorObjDataGetter)(SensorObjectPtr, T *))
++ {
++ T value{};
++ std::int32_t ret = sensorObjDataGetter(sensorObjectPtr, &value);
++ if (ret != ::SENSOR_SUCCESS) {
++ qOhosPrintfError("%s: sensor getter failed, code=%d", Q_FUNC_INFO, ret);
++ return std::nullopt;
++ }
++ return value;
++ }
++
++ }
++
++ template<typename T>
++ std::optional<T> tryGetSensorInfoField(
++ ::Sensor_Info *sensorInfo,
++ std::int32_t (*sensorInfoDataGetter)(::Sensor_Info *, T *));
++
++ template<typename T>
++ std::optional<T> tryGetSensorEventField(
++ ::Sensor_Event *sensorEvent,
++ std::int32_t (*sensorEventDataGetter)(::Sensor_Event *, T *));
++
++ template<typename T>
++ std::shared_ptr<T> tryCreateSensorResource(
++ T *(*sensorResourceCreator)(),
++ std::int32_t (*sensorResourceDeleter)(T *));
++
++ const char *tryMapOhosToQtSensorType(::Sensor_Type sensorType);
++ std::optional<::Sensor_Type> tryMapQtToOhosSensorType(const char *qtType);
++
++ template<typename T>
++ std::optional<T> tryGetSensorInfoField(
++ ::Sensor_Info *sensorInfo,
++ std::int32_t (*sensorInfoDataGetter)(::Sensor_Info *, T *))
++ {
++ return ohossensorutils_h_details::tryGetSensorDataField<::Sensor_Info *, T>(sensorInfo, sensorInfoDataGetter);
++ }
++
++ template<typename T>
++ std::optional<T> tryGetSensorEventField(
++ ::Sensor_Event *sensorEvent,
++ std::int32_t (*sensorEventDataGetter)(::Sensor_Event *, T *))
++ {
++ return ohossensorutils_h_details::tryGetSensorDataField<::Sensor_Event *, T>(sensorEvent, sensorEventDataGetter);
++ }
++
++ template<typename T>
++ std::shared_ptr<T> tryCreateSensorResource(
++ T *(*sensorResourceCreator)(),
++ std::int32_t (*sensorResourceDeleter)(T *))
++ {
++ T *resourcePtr = sensorResourceCreator();
++ return (resourcePtr != nullptr)
++ ? std::shared_ptr<T>(
++ resourcePtr,
++ [sensorResourceDeleter](T *ptr) {
++ auto ret = sensorResourceDeleter(ptr);
++ if (ret != ::SENSOR_SUCCESS) {
++ qOhosPrintfError(
++ "%s: Failed to delete resource, err code=%d", Q_FUNC_INFO, ret);
++ }
++ })
++ : nullptr;
++ }
++
++ #endif