summaryrefslogtreecommitdiff
path: root/src/managers/permissions/DynamicPermissionManager.cpp
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2025-04-27 00:03:32 +0100
committerVaxry <vaxry@vaxry.net>2025-04-27 13:28:06 +0100
commit0302bfdc2207f9b5482fb07aa6052e7f6cb237ca (patch)
treec2039f2d4f01327b23b39493bc03b90d195fa6d3 /src/managers/permissions/DynamicPermissionManager.cpp
parent4f868a1f3c1edfc1f5998f7d21e46e7c23aeb02f (diff)
async: add Promise and use it for AsyncDialogBox
Diffstat (limited to 'src/managers/permissions/DynamicPermissionManager.cpp')
-rw-r--r--src/managers/permissions/DynamicPermissionManager.cpp36
1 files changed, 35 insertions, 1 deletions
diff --git a/src/managers/permissions/DynamicPermissionManager.cpp b/src/managers/permissions/DynamicPermissionManager.cpp
index cf1fd1a0..c23f1fdb 100644
--- a/src/managers/permissions/DynamicPermissionManager.cpp
+++ b/src/managers/permissions/DynamicPermissionManager.cpp
@@ -48,6 +48,7 @@ static const char* permissionToString(eDynamicPermissionType type) {
switch (type) {
case PERMISSION_TYPE_UNKNOWN: return "PERMISSION_TYPE_UNKNOWN";
case PERMISSION_TYPE_SCREENCOPY: return "PERMISSION_TYPE_SCREENCOPY";
+ case PERMISSION_TYPE_PLUGIN: return "PERMISSION_TYPE_PLUGIN";
}
return "error";
@@ -57,6 +58,7 @@ static const char* permissionToHumanString(eDynamicPermissionType type) {
switch (type) {
case PERMISSION_TYPE_UNKNOWN: return "requesting an unknown permission";
case PERMISSION_TYPE_SCREENCOPY: return "trying to capture your screen";
+ case PERMISSION_TYPE_PLUGIN: return "trying to load a plugin";
}
return "error";
@@ -210,10 +212,22 @@ void CDynamicPermissionManager::askForPermission(wl_client* client, const std::s
return;
}
- rule->m_dialogBox->open([r = WP<CDynamicPermissionRule>(rule), binaryPath](std::string result) {
+ rule->m_promise = rule->m_dialogBox->open();
+ rule->m_promise->then([r = WP<CDynamicPermissionRule>(rule), binaryPath](SP<CPromiseResult<std::string>> pr) {
if (!r)
return;
+ if (pr->hasError()) {
+ // not reachable for now
+ Debug::log(TRACE, "CDynamicPermissionRule: error spawning dialog box");
+ if (r->m_promiseResolverForExternal)
+ r->m_promiseResolverForExternal->reject("error spawning dialog box");
+ r->m_promiseResolverForExternal.reset();
+ return;
+ }
+
+ const std::string& result = pr->result();
+
Debug::log(TRACE, "CDynamicPermissionRule: user returned {}", result);
if (result.starts_with("Allow once"))
@@ -226,9 +240,29 @@ void CDynamicPermissionManager::askForPermission(wl_client* client, const std::s
r->m_binaryPath = binaryPath;
} else if (result.starts_with("Allow"))
r->m_allowMode = PERMISSION_RULE_ALLOW_MODE_ALLOW;
+
+ if (r->m_promiseResolverForExternal)
+ r->m_promiseResolverForExternal->resolve(r->m_allowMode);
+
+ r->m_promise.reset();
+ r->m_promiseResolverForExternal.reset();
});
}
+SP<CPromise<eDynamicPermissionAllowMode>> CDynamicPermissionManager::promiseFor(wl_client* client, eDynamicPermissionType permission) {
+ auto rule = std::ranges::find_if(m_rules, [client, permission](const auto& e) { return e->m_client == client && e->m_type == permission; });
+ if (rule == m_rules.end())
+ return nullptr;
+
+ if (!(*rule)->m_promise)
+ return nullptr;
+
+ if ((*rule)->m_promiseResolverForExternal)
+ return nullptr;
+
+ return CPromise<eDynamicPermissionAllowMode>::make([rule](SP<CPromiseResolver<eDynamicPermissionAllowMode>> r) { (*rule)->m_promiseResolverForExternal = r; });
+}
+
void CDynamicPermissionManager::removeRulesForClient(wl_client* client) {
std::erase_if(m_rules, [client](const auto& e) { return e->m_client == client; });
}