diff options
| author | Vaxry <vaxry@vaxry.net> | 2025-04-27 00:03:32 +0100 |
|---|---|---|
| committer | Vaxry <vaxry@vaxry.net> | 2025-04-27 13:28:06 +0100 |
| commit | 0302bfdc2207f9b5482fb07aa6052e7f6cb237ca (patch) | |
| tree | c2039f2d4f01327b23b39493bc03b90d195fa6d3 /src/managers/permissions/DynamicPermissionManager.cpp | |
| parent | 4f868a1f3c1edfc1f5998f7d21e46e7c23aeb02f (diff) | |
async: add Promise and use it for AsyncDialogBox
Diffstat (limited to 'src/managers/permissions/DynamicPermissionManager.cpp')
| -rw-r--r-- | src/managers/permissions/DynamicPermissionManager.cpp | 36 |
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; }); } |
