6#include <QtCore/private/qohoslogger_p.h>
7#include <qarkui/qarkuiutils.h>
16template<
typename T,
typename Deleter>
20 qOhosReportFatalErrorAndAbort(
21 "%s: got null pointer with deleter of type '%s'",
22 Q_FUNC_INFO,
typeid(deleter).name());
25 return std::unique_ptr<T, Deleter>(ptr, deleter);
31 QArkUi::callArkUiOrFailOnNullResult(
32 Q_OHOS_NAMED_FUNC(::OH_UdmfRecordProvider_Create)),
33 [](::OH_UdmfRecordProvider *udmfRecordProvider) {
34 QArkUi::callArkUiOrFailOnErrorResult(
35 Q_OHOS_NAMED_FUNC(::OH_UdmfRecordProvider_Destroy),
42 std::function<
void *(
const char *)> dataFetchFunc)
44 using DataFetchFunc =
std::function<
void *(
const char *)>;
46 auto udmfRecordProvider = createUdmfRecordProvider();
48 auto *dataFetchFuncPtr =
new DataFetchFunc(std::move(dataFetchFunc));
49 QArkUi::callArkUiOrFailOnErrorResult(
50 Q_OHOS_NAMED_FUNC(::OH_UdmfRecordProvider_SetData),
51 udmfRecordProvider.get(),
static_cast<
void *>(dataFetchFuncPtr),
52 [](
void *context,
const char *type) {
53 auto *dataFetchFuncPtr =
static_cast<DataFetchFunc *>(context);
54 return (*dataFetchFuncPtr)(type);
57 auto *dataFetchFuncPtr =
static_cast<DataFetchFunc *>(context);
58 delete dataFetchFuncPtr;
61 return udmfRecordProvider;
75 std::unique_ptr<::OH_UdmfRecord,
void (*)(::OH_UdmfRecord *)> &&nativePtr)
76 : m_nativePtr(std::move(nativePtr))
83 qOhosPrintfError(
"%s: This record is invalidated. Returning empty value.", Q_FUNC_INFO);
87 char **types =
nullptr;
88 unsigned int typesCount = 0;
89 auto func = Q_OHOS_NAMED_FUNC(::OH_UdmfRecord_GetTypes);
90 types =
QArkUi::callArkUi(func, m_nativePtr.get(), &typesCount);
91 if (types ==
nullptr && typesCount != 0) {
92 qOhosReportFatalErrorAndAbort(
93 "%s: got inconsistent result from %s() call: array is null, size is %u",
94 Q_FUNC_INFO, func.name(), typesCount);
97 return types !=
nullptr
98 ? std::vector<std::string>(types, types + typesCount)
99 : std::vector<std::string>();
104 return QOhosUdmfRecord(
105 std::unique_ptr<::OH_UdmfRecord,
void (*)(::OH_UdmfRecord *)>(
107 [](::OH_UdmfRecord *) {
113 return m_nativePtr.release();
117 std::vector<std::string> typeIds,
std::function<
void *(
const char *)> dataFetchFunc)
119 std::vector<
const char *> typeIdsCStrs;
120 for (
const auto &typeId : typeIds)
121 typeIdsCStrs.push_back(typeId.c_str());
123 QArkUi::callArkUiOrFailOnErrorResult(
124 Q_OHOS_NAMED_FUNC(::OH_UdmfRecord_SetProvider),
125 m_nativePtr.get(), typeIdsCStrs.data(), typeIdsCStrs.size(),
126 createUdmfRecordProviderForDataFetchFunction(std::move(dataFetchFunc)).release());
130 const std::string &typeId,
std::uint8_t *buff,
std::uint32_t buffSize)
133 qOhosPrintfError(
"%s: This record is invalidated. Ignoring.", Q_FUNC_INFO);
137 QArkUi::callArkUiOrFailOnErrorResult(
138 Q_OHOS_NAMED_FUNC(::OH_UdmfRecord_AddGeneralEntry),
139 m_nativePtr.get(),
QArkUi::
CZString(typeId.c_str()), buff, buffSize);
143 const std::string &typeId)
146 qOhosPrintfError(
"%s: This record is invalidated. Returning empty value.", Q_FUNC_INFO);
150 auto availableTypes = getTypes();
151 auto foundTypeIt = std::find(std::begin(availableTypes), std::end(availableTypes), typeId);
152 if (foundTypeIt ==
std::end(availableTypes))
156 std::uint32_t buffSize;
157 if (::OH_UdmfRecord_GetGeneralEntry(m_nativePtr.get(), typeId.c_str(), &buff, &buffSize)
158 != ::Udmf_ErrCode::UDMF_E_OK) {
160 "%s: OH_UdmfRecord_GetGeneralEntry() for typeId=%s resulted in an error even though "
161 "the requested type should have been available. This is abnormal."
162 "OH_UdmfRecord's inner state might have been compromised."
163 "Any further operations done to this record will be ignored or will result in dummy values.",
164 Q_FUNC_INFO, typeId.c_str());
165 m_invalidated =
true;
170 return makeQOhosOptional(QSpan(buff, buffSize));
175 return getTypes().size() == 0;
191 : m_nativePtr(makeNonNullUniquePtrOrFail(nativePtr, ::OH_UdmfData_Destroy))
197 char **types =
nullptr;
198 unsigned int typesCount = 0;
199 auto func = Q_OHOS_NAMED_FUNC(::OH_UdmfData_GetTypes);
200 types =
QArkUi::callArkUi(func, m_nativePtr.get(), &typesCount);
201 if (types ==
nullptr && typesCount != 0) {
202 qOhosReportFatalErrorAndAbort(
203 "%s: got inconsistent result from %s() call: array is null, size is %u",
204 Q_FUNC_INFO, func.name(), typesCount);
207 return types !=
nullptr
208 ? std::vector<std::string>(types, types + typesCount)
209 : std::vector<std::string>();
214 ::OH_UdmfRecord **records =
nullptr;
215 std::uint32_t recordsNum;
216 auto func = Q_OHOS_NAMED_FUNC(::OH_UdmfData_GetRecords);
217 records =
QArkUi::callArkUi(func, m_nativePtr.get(), &recordsNum);
218 if (records ==
nullptr && recordsNum != 0) {
219 qOhosReportFatalErrorAndAbort(
220 "%s: got inconsistent result from %s() call: array is null, size is %u",
221 Q_FUNC_INFO, func.name(), recordsNum);
224 std::vector<QOhosUdmfRecord> resultRecords;
225 for (
std::uint32_t i = 0; i < recordsNum; ++i)
226 resultRecords.push_back(QOhosUdmfRecord::makeAsView(records[i]));
228 return resultRecords;
233 if (record.m_invalidated) {
234 qOhosPrintfError(
"%s: Cannot add an invalidated record. Ignoring.", Q_FUNC_INFO);
238 QArkUi::callArkUiOrFailOnErrorResult(
239 Q_OHOS_NAMED_FUNC(::OH_UdmfData_AddRecord),
240 m_nativePtr.get(),
std::move(record).release());
245 return m_nativePtr.release();
250 return m_nativePtr.get();
::OH_UdmfData * nativePtr()
std::vector< QOhosUdmfRecord > getRecords()
void addRecord(QOhosUdmfRecord &&record)
::OH_UdmfData * release() &&
std::vector< std::string > getTypes() const
void addGeneralEntry(const std::string &typeId, std::uint8_t *buff, std::uint32_t buffSize)
QOhosOptional< QSpan< std::uint8_t > > tryGetGeneralEntry(const std::string &typeId)
std::vector< std::string > getTypes() const
void setProviderForDataFetchFunc(std::vector< std::string > typeIds, std::function< void *(const char *)> dataFetchFunc)
Combined button and popup list for selecting options.
std::unique_ptr< T, Deleter > makeNonNullUniquePtrOrFail(T *ptr, Deleter &&deleter)
std::unique_ptr<::OH_UdmfRecordProvider, void(*)(::OH_UdmfRecordProvider *)> createUdmfRecordProvider()
std::unique_ptr<::OH_UdmfRecordProvider, void(*)(::OH_UdmfRecordProvider *)> createUdmfRecordProviderForDataFetchFunction(std::function< void *(const char *)> dataFetchFunc)
QOhosOptional< void > makeEmptyQOhosOptional()