Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qohosudmf.cpp
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include <qohosudmf.h>
5
6#include <QtCore/private/qohoslogger_p.h>
7#include <qarkui/qarkuiutils.h>
8#include <qohosutils.h>
9#include <typeinfo>
10
12
13namespace
14{
15
16template<typename T, typename Deleter>
17std::unique_ptr<T, Deleter> makeNonNullUniquePtrOrFail(T *ptr, Deleter &&deleter)
18{
19 if (ptr == nullptr) {
20 qOhosReportFatalErrorAndAbort(
21 "%s: got null pointer with deleter of type '%s'",
22 Q_FUNC_INFO, typeid(deleter).name());
23 }
24
25 return std::unique_ptr<T, Deleter>(ptr, deleter);
26}
27
29{
30 return {
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),
36 udmfRecordProvider);
37 }
38 };
39}
40
42 std::function<void *(const char *)> dataFetchFunc)
43{
44 using DataFetchFunc = std::function<void *(const char *)>;
45
46 auto udmfRecordProvider = createUdmfRecordProvider();
47
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);
55 },
56 [](void *context) {
57 auto *dataFetchFuncPtr = static_cast<DataFetchFunc *>(context);
58 delete dataFetchFuncPtr;
59 });
60
61 return udmfRecordProvider;
62}
63
64}
65
73
74QOhosUdmfRecord::QOhosUdmfRecord(
75 std::unique_ptr<::OH_UdmfRecord, void (*)(::OH_UdmfRecord *)> &&nativePtr)
76 : m_nativePtr(std::move(nativePtr))
77{
78}
79
81{
82 if (m_invalidated) {
83 qOhosPrintfError("%s: This record is invalidated. Returning empty value.", Q_FUNC_INFO);
84 return {};
85 }
86
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);
95 }
96
97 return types != nullptr
98 ? std::vector<std::string>(types, types + typesCount)
99 : std::vector<std::string>();
100}
101
102QOhosUdmfRecord QOhosUdmfRecord::makeAsView(::OH_UdmfRecord *nativePtr)
103{
104 return QOhosUdmfRecord(
105 std::unique_ptr<::OH_UdmfRecord, void (*)(::OH_UdmfRecord *)>(
106 nativePtr,
107 [](::OH_UdmfRecord *) {
108 }));
109}
110
111::OH_UdmfRecord *QOhosUdmfRecord::release() &&
112{
113 return m_nativePtr.release();
114}
115
117 std::vector<std::string> typeIds, std::function<void *(const char *)> dataFetchFunc)
118{
119 std::vector<const char *> typeIdsCStrs;
120 for (const auto &typeId : typeIds)
121 typeIdsCStrs.push_back(typeId.c_str());
122
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());
127}
128
130 const std::string &typeId, std::uint8_t *buff, std::uint32_t buffSize)
131{
132 if (m_invalidated) {
133 qOhosPrintfError("%s: This record is invalidated. Ignoring.", Q_FUNC_INFO);
134 return;
135 }
136
137 QArkUi::callArkUiOrFailOnErrorResult(
138 Q_OHOS_NAMED_FUNC(::OH_UdmfRecord_AddGeneralEntry),
139 m_nativePtr.get(), QArkUi::CZString(typeId.c_str()), buff, buffSize);
140}
141
143 const std::string &typeId)
144{
145 if (m_invalidated) {
146 qOhosPrintfError("%s: This record is invalidated. Returning empty value.", Q_FUNC_INFO);
148 }
149
150 auto availableTypes = getTypes();
151 auto foundTypeIt = std::find(std::begin(availableTypes), std::end(availableTypes), typeId);
152 if (foundTypeIt == std::end(availableTypes))
154
155 std::uint8_t *buff;
156 std::uint32_t buffSize;
157 if (::OH_UdmfRecord_GetGeneralEntry(m_nativePtr.get(), typeId.c_str(), &buff, &buffSize)
158 != ::Udmf_ErrCode::UDMF_E_OK) {
159 qOhosPrintfError(
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;
166
168 }
169
170 return makeQOhosOptional(QSpan(buff, buffSize));
171}
172
174{
175 return getTypes().size() == 0;
176}
177
178QOhosUdmfData QOhosUdmfData::takeOwnership(::OH_UdmfData *nativePtr)
179{
180 return QOhosUdmfData(nativePtr);
181}
182
189
190QOhosUdmfData::QOhosUdmfData(::OH_UdmfData *nativePtr)
191 : m_nativePtr(makeNonNullUniquePtrOrFail(nativePtr, ::OH_UdmfData_Destroy))
192{
193}
194
196{
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);
205 }
206
207 return types != nullptr
208 ? std::vector<std::string>(types, types + typesCount)
209 : std::vector<std::string>();
210}
211
213{
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);
222 }
223
224 std::vector<QOhosUdmfRecord> resultRecords;
225 for (std::uint32_t i = 0; i < recordsNum; ++i)
226 resultRecords.push_back(QOhosUdmfRecord::makeAsView(records[i]));
227
228 return resultRecords;
229}
230
232{
233 if (record.m_invalidated) {
234 qOhosPrintfError("%s: Cannot add an invalidated record. Ignoring.", Q_FUNC_INFO);
235 return;
236 }
237
238 QArkUi::callArkUiOrFailOnErrorResult(
239 Q_OHOS_NAMED_FUNC(::OH_UdmfData_AddRecord),
240 m_nativePtr.get(), std::move(record).release());
241}
242
244{
245 return m_nativePtr.release();
246}
247
249{
250 return m_nativePtr.get();
251}
252
253QT_END_NAMESPACE
::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)
bool isEmpty() const
QOhosOptional< QSpan< std::uint8_t > > tryGetGeneralEntry(const std::string &typeId)
std::vector< std::string > getTypes() const
Definition qohosudmf.cpp:80
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)
Definition qohosudmf.cpp:17
std::unique_ptr<::OH_UdmfRecordProvider, void(*)(::OH_UdmfRecordProvider *)> createUdmfRecordProvider()
Definition qohosudmf.cpp:28
std::unique_ptr<::OH_UdmfRecordProvider, void(*)(::OH_UdmfRecordProvider *)> createUdmfRecordProviderForDataFetchFunction(std::function< void *(const char *)> dataFetchFunc)
Definition qohosudmf.cpp:41
QOhosOptional< void > makeEmptyQOhosOptional()