From ca0ee2ae90e29ead3f8862c238d29aec5144949c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Wed, 31 Jan 2024 16:28:24 +0100 Subject: [PATCH] dbusErrors: Add utility module for handling remote errors We sometimes return custom D-Bus errors. Right now those errors are ad-hoc, which means receivers don't have a proper way of checking whether a thrown GLib.Error corresponds to a particular remote error. In order to change that, we should define proper error enums and domains, and register them with GDBus, so that there is an automatic mapping between D-Bus errors and GLib.Errors. The new module doesn't export any domains or enums yet, but provides internal tooling to make these exports more convenient. Part-of: --- js/js-resources.gresource.xml | 1 + js/misc/dbusErrors.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 js/misc/dbusErrors.js diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml index f6b8b7e78..ad83acc30 100644 --- a/js/js-resources.gresource.xml +++ b/js/js-resources.gresource.xml @@ -17,6 +17,7 @@ misc/animationUtils.js misc/config.js misc/dateUtils.js + misc/dbusErrors.js misc/dbusUtils.js misc/dependencies.js misc/errorUtils.js diff --git a/js/misc/dbusErrors.js b/js/misc/dbusErrors.js new file mode 100644 index 000000000..5e4d62e2c --- /dev/null +++ b/js/misc/dbusErrors.js @@ -0,0 +1,29 @@ +/* eslint-disable no-unused-vars */ +import GLib from 'gi://GLib'; +import Gio from 'gi://Gio'; + +function decamelcase(str, sep) { + return str.replace(/(.)([A-Z])/g, `$1${sep}$2`); +} + +function registerErrorDomain(domain, errorNames, prefix = 'org.gnome.Shell') { + const domainName = + `shell-${decamelcase(domain, '-').toLowerCase()}-error`; + const quark = GLib.quark_from_string(domainName); + + for (const [code, name] of errorNames.entries()) { + Gio.dbus_error_register_error(quark, + code, `${prefix}.${domain}.Error.${name}`); + } + return quark; +} + +function createErrorEnum(errorNames) { + const obj = {}; + + for (const [code, name] of errorNames.entries()) { + const propName = decamelcase(name, '_').toUpperCase(); + obj[propName] = code; + } + return obj; +}