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
qohosapppermissions.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
5#include <QtCore/private/qohoscommon_p.h>
6#include <QtCore/private/qohoslogger_p.h>
7#include <optional>
8
9QT_BEGIN_NAMESPACE
10
12
13namespace {
14
15void tryGetBundleAccessTokenIdWithConsumer(
16 QOhosJsState &jsState, QOhosConsumer<QOhosJsState &, std::optional<int>> resultConsumer)
17{
18 auto bundleFlags = jsState.eval<QNapi::Number>(
19 "@ohos.bundle.bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION");
20
21 auto sharedResultConsumer = QtOhos::moveToSharedPtr(std::move(resultConsumer));
22 jsState.evalToPromiseOrRejectOnThrow(
23 "@ohos.bundle.bundleManager.getBundleInfoForSelf(*)", {bundleFlags})
24 .onThen([sharedResultConsumer](const QOhosCallbackInfo &cbInfo) {
25 QNapi::Object bundleInfo = cbInfo.getFirstArg<QNapi::Object>(Q_FUNC_INFO);
26 (*sharedResultConsumer)(
27 cbInfo.jsState(),
28 std::optional<int>(bundleInfo.eval<QNapi::Number>("appInfo.accessTokenId")));
29 })
30 .onCatch([sharedResultConsumer](const QOhosCallbackInfo &cbInfo) {
31 QtOhos::logJsCallbackError(cbInfo, "Got error from getBundleInfoForSelf()");
32 (*sharedResultConsumer)(cbInfo.jsState(), {});
33 });
34}
35
36void checkAppPermissionStatusGrantedWithConsumer(
37 QOhosJsState &jsState, int bundleAccessToken, const std::string &permissionName,
38 QOhosConsumer<QOhosJsState &, bool> resultConsumer)
39{
40 auto sharedResultConsumer = QtOhos::moveToSharedPtr(std::move(resultConsumer));
41 jsState.evalToPromiseOrRejectOnThrow(
42 "@ohos.abilityAccessCtrl.createAtManager().checkAccessToken(*)",
43 {bundleAccessToken, permissionName})
44 .onThen([sharedResultConsumer](const QOhosCallbackInfo &cbInfo) {
45 auto status = cbInfo.getFirstArg<QNapi::Number>(Q_FUNC_INFO);
46 auto permissionGrantedStatus = cbInfo.jsState().eval<QNapi::Number>(
47 "@ohos.abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED");
48 (*sharedResultConsumer)(cbInfo.jsState(), status == permissionGrantedStatus);
49 })
50 .onCatch([sharedResultConsumer](const QOhosCallbackInfo &cbInfo) {
51 QtOhos::logJsCallbackError(cbInfo, "Got error from checkAccessToken()");
52 (*sharedResultConsumer)(cbInfo.jsState(), false);
53 });
54}
55
56}
57
59 QOhosJsState &jsState, const std::string &permissionName,
60 QOhosConsumer<QOhosJsState &, bool> resultConsumer)
61{
62 tryGetBundleAccessTokenIdWithConsumer(
63 jsState,
64 [permissionName, resultConsumer = std::move(resultConsumer)](
65 QOhosJsState &jsState, std::optional<int> bundleAccessTokenId) mutable {
66 if (bundleAccessTokenId.has_value()) {
67 checkAppPermissionStatusGrantedWithConsumer(
68 jsState, bundleAccessTokenId.value(), permissionName,
69 std::move(resultConsumer));
70 } else {
71 qOhosPrintfError(
72 "Cannot check permission: '%s': cannot get bundle access token id.",
73 permissionName.c_str());
74 resultConsumer(jsState, false);
75 }
76 });
77}
78
80 QOhosJsState &jsState, const std::string &permissionName,
81 QOhosConsumer<QOhosJsState &, bool> resultConsumer)
82{
83 auto optQAbility = jsState.defaultQAbility();
84 if (!optQAbility) {
85 qOhosPrintfError(
86 "Cannot request permission: '%s': no default QAbility.", permissionName.c_str());
87 resultConsumer(jsState, false);
88 return;
89 }
90
91 requestAppPermissionFromUser(
92 jsState, optQAbility.value(), permissionName, std::move(resultConsumer));
93}
94
96 QOhosJsState &jsState, QNapi::Object qAbility, const std::string &permissionName,
97 QOhosConsumer<QOhosJsState &, bool> resultConsumer)
98{
99 requestAppPermissionsFromUserWithResult(
100 jsState, qAbility, {permissionName},
101 [resultConsumer = std::move(resultConsumer)](QOhosJsState &jsState, std::vector<QOhosAppPermissions::AppPermissionResult> result) {
102 resultConsumer(jsState, result.size() == 1 && result.front().permissionGranted);
103 });
104}
105
107 QOhosJsState &jsState, const std::vector<std::string> &permissionNames,
109{
110 auto optQAbility = jsState.defaultQAbility();
111 if (!optQAbility) {
112 qOhosPrintfError("Cannot request permissions from user: no default QAbility.");
113 resultConsumer(
114 jsState,
115 std::vector<AppPermissionResult>(
116 permissionNames.size(),
117 AppPermissionResult {
118 .permissionGranted = false,
119 .dialogShown = false
120 }));
121 return;
122 }
123
124 requestAppPermissionsFromUserWithResult(
125 jsState, optQAbility.value(), permissionNames, std::move(resultConsumer));
126}
127
129 QOhosJsState &jsState, QNapi::Object qAbility,
130 const std::vector<std::string> &permissionNames,
132{
133 auto sharedResultConsumer = QtOhos::moveToSharedPtr(std::move(resultConsumer));
134 jsState.evalToPromiseOrRejectOnThrow(
135 "@ohos.abilityAccessCtrl.createAtManager().requestPermissionsFromUser(*)",
136 {
137 qAbility.eval<QNapi::Object>("context"),
138 QNapi::makeArray(
139 jsState.env(),
140 std::vector<QNapi::ValueWrapper>(permissionNames.begin(), permissionNames.end()))
141 })
142 .onThen(
143 [permissionNames, sharedResultConsumer](const QOhosCallbackInfo &cbInfo) {
144 QNapi::Object resultObj = cbInfo.getFirstArg<QNapi::Object>(Q_FUNC_INFO);
145
146 auto resultPermissionsNames =
147 QNapi::getArrayElements<std::vector<std::string>, QNapi::String>(
148 resultObj.get<QNapi::Array>("permissions"));
149 auto resultAuthResults =
150 QNapi::getArrayElements<std::vector<int>, QNapi::Number>(
151 resultObj.get<QNapi::Array>("authResults"));
152
153 auto dialogShownResultsOrEmpty = QNapi::getOptionalPropOrEmpty<QNapi::Array>(resultObj, "dialogShownResults");
154 auto dialogShownResultsVector =
155 !dialogShownResultsOrEmpty.IsEmpty()
156 ? QNapi::getArrayElements<std::vector<bool>, QNapi::Boolean>(dialogShownResultsOrEmpty)
157 : std::vector<bool>();
158
159 int permissionGrantedStatus = cbInfo.jsState().eval<QNapi::Number>(
160 "@ohos.abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED");
161
162 const std::size_t totalPermissions = permissionNames.size();
163 std::vector<AppPermissionResult> appPermissionResults(
164 totalPermissions,
165 AppPermissionResult {
166 .permissionGranted = false,
167 .dialogShown = false
168 });
169 if (resultPermissionsNames.size() == totalPermissions && resultAuthResults.size() == totalPermissions
170 && dialogShownResultsVector.size() == totalPermissions) {
171 for (const auto &permissionName : permissionNames) {
172 const auto it = std::find(resultPermissionsNames.begin(), resultPermissionsNames.end(), permissionName);
173 if (it != resultPermissionsNames.end()) {
174 const int index = std::distance(resultPermissionsNames.begin(), it);
175 appPermissionResults[index].permissionGranted = (resultAuthResults[index] == permissionGrantedStatus);
176 appPermissionResults[index].dialogShown = dialogShownResultsVector[index];
177 }
178 }
179 }
180 (*sharedResultConsumer)(cbInfo.jsState(), appPermissionResults);
181 })
182 .onCatch(
183 [permissionNames, sharedResultConsumer](const QOhosCallbackInfo &cbInfo) {
184 QtOhos::logJsCallbackError(cbInfo, "Got error from requestPermissionsFromUser()");
185 const std::size_t totalPermissions = permissionNames.size();
186 std::vector<AppPermissionResult> appPermissionResults(
187 totalPermissions,
188 AppPermissionResult {
189 .permissionGranted = false,
190 .dialogShown = false
191 });
192 (*sharedResultConsumer)(cbInfo.jsState(), appPermissionResults);
193 });
194}
195
197 QOhosJsState &jsState, const std::vector<std::string> &permissionNames,
199{
200 auto optQAbility = jsState.defaultQAbility();
201 if (!optQAbility) {
202 qOhosPrintfError("Cannot request permissions on setting: no default QAbility.");
203 resultConsumer(jsState, std::vector<bool>(permissionNames.size(), false));
204 return;
205 }
206
207 requestAppPermissionsOnSetting(
208 jsState, optQAbility.value(), permissionNames, std::move(resultConsumer));
209}
210
212 QOhosJsState &jsState, QNapi::Object qAbility,
213 const std::vector<std::string> &permissionNames,
215{
216 auto sharedResultConsumer = QtOhos::moveToSharedPtr(std::move(resultConsumer));
217 jsState.evalToPromiseOrRejectOnThrow(
218 "@ohos.abilityAccessCtrl.createAtManager().requestPermissionOnSetting(*)",
219 {
220 qAbility.eval<QNapi::Object>("context"),
221 QNapi::makeArray(
222 jsState.env(),
223 std::vector<QNapi::ValueWrapper>(permissionNames.begin(), permissionNames.end()))
224 })
225 .onThen(
226 [permissionNames, sharedResultConsumer](const QOhosCallbackInfo &cbInfo) {
227 QNapi::Array resultArray = cbInfo.getFirstArg<QNapi::Array>(Q_FUNC_INFO);
228
229 auto resultAuthResults = QNapi::getArrayElements<std::vector<int>, QNapi::Number>(resultArray);
230
231 int permissionGrantedStatus = cbInfo.jsState().eval<QNapi::Number>(
232 "@ohos.abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED");
233
234 const std::size_t totalPermissions = permissionNames.size();
235 std::vector<bool> settingsPermissionResults(totalPermissions, false);
236 if (resultAuthResults.size() == totalPermissions) {
237 for (std::size_t permIndex = 0; permIndex < totalPermissions; permIndex++)
238 settingsPermissionResults[permIndex] = (resultAuthResults[permIndex] == permissionGrantedStatus);
239 }
240
241 (*sharedResultConsumer)(cbInfo.jsState(), settingsPermissionResults);
242 })
243 .onCatch(
244 [permissionNames, sharedResultConsumer](const QOhosCallbackInfo &cbInfo) {
245 QtOhos::logJsCallbackError(cbInfo, "Got error from requestPermissionOnSetting()");
246 std::vector<bool> settingsPermissionResults(permissionNames.size(), false);
247 (*sharedResultConsumer)(cbInfo.jsState(), settingsPermissionResults);
248 });
249}
250
251}
252
253QT_END_NAMESPACE
void requestAppPermissionsOnSetting(QOhosJsState &jsState, QNapi::Object qAbility, const std::vector< std::string > &permissionNames, QOhosConsumer< QOhosJsState &, std::vector< bool > > resultConsumer)
void requestAppPermissionsFromUserWithResult(QOhosJsState &jsState, const std::vector< std::string > &permissionNames, QOhosConsumer< QOhosJsState &, std::vector< AppPermissionResult > > resultConsumer)
void requestAppPermissionsOnSetting(QOhosJsState &jsState, const std::vector< std::string > &permissionNames, QOhosConsumer< QOhosJsState &, std::vector< bool > > resultConsumer)
void requestAppPermissionFromUser(QOhosJsState &jsState, QNapi::Object qAbility, const std::string &permissionName, QOhosConsumer< QOhosJsState &, bool > resultConsumer)
void requestAppPermissionsFromUserWithResult(QOhosJsState &jsState, QNapi::Object qAbility, const std::vector< std::string > &permissionNames, QOhosConsumer< QOhosJsState &, std::vector< AppPermissionResult > > resultConsumer)
void checkAppPermissionGrantedWithConsumer(QOhosJsState &jsState, const std::string &permissionName, QOhosConsumer< QOhosJsState &, bool > resultConsumer)
void requestAppPermissionFromUser(QOhosJsState &jsState, const std::string &permissionName, QOhosConsumer< QOhosJsState &, bool > resultConsumer)