From 58806359ee7f5f8780b0dad3ac81bf81521c453b Mon Sep 17 00:00:00 2001 From: Didier Roche Date: Thu, 1 Nov 2018 13:55:17 +0100 Subject: [PATCH] extensionUtils: Add functions to (de)serialize extensions Serializing an extension for sending over D-Bus is currently done by the appropriate D-Bus method implementations. Split out the code as utility function and add a corresponding deserialization function, which we will soon use when consuming the D-Bus extension API from the extension-prefs tool. https://bugzilla.gnome.org/show_bug.cgi?id=789852 --- js/misc/extensionUtils.js | 55 ++++++++++++++++++++++++++++++++++++--- js/ui/shellDBus.js | 38 ++------------------------- 2 files changed, 54 insertions(+), 39 deletions(-) diff --git a/js/misc/extensionUtils.js b/js/misc/extensionUtils.js index e701e824c..ea094ba73 100644 --- a/js/misc/extensionUtils.js +++ b/js/misc/extensionUtils.js @@ -3,10 +3,11 @@ // Common utils for the extension system and the extension // preferences tool -const Gettext = imports.gettext; -const Signals = imports.signals; +const { Gio, GLib } = imports.gi; -const Gio = imports.gi.Gio; +const Gettext = imports.gettext; +const Lang = imports.lang; +const Signals = imports.signals; const Config = imports.misc.config; const FileUtils = imports.misc.fileUtils; @@ -29,6 +30,8 @@ var ExtensionState = { UNINSTALLED: 99 }; +const SERIALIZED_PROPERTIES = ['type', 'state', 'path', 'error', 'hasPrefs']; + // Maps uuid -> metadata object var extensions = {}; @@ -222,6 +225,52 @@ function createExtensionObject(uuid, dir, type) { return extension; } +function serializeExtension(extension) { + let obj = {}; + Lang.copyProperties(extension.metadata, obj); + + SERIALIZED_PROPERTIES.forEach(prop => { + obj[prop] = extension[prop]; + }); + + let res = {}; + for (let key in obj) { + let val = obj[key]; + let type; + switch (typeof val) { + case 'string': + type = 's'; + break; + case 'number': + type = 'd'; + break; + case 'boolean': + type = 'b'; + break; + default: + continue; + } + res[key] = GLib.Variant.new(type, val); + } + + return res; +} + +function deserializeExtension(variant) { + let res = { metadata: {} }; + for (let prop in variant) { + let val = variant[prop].unpack(); + if (SERIALIZED_PROPERTIES.includes(prop)) + res[prop] = val; + else + res.metadata[prop] = val; + } + // add the 2 additional properties to create a valid extension object, as createExtensionObject() + res.uuid = res.metadata.uuid; + res.dir = Gio.File.new_for_path(res.path); + return res; +} + function installImporter(extension) { let oldSearchPath = imports.searchPath.slice(); // make a copy imports.searchPath = [extension.dir.get_parent().get_path()]; diff --git a/js/ui/shellDBus.js b/js/ui/shellDBus.js index fad3cf0a2..64e80b42f 100644 --- a/js/ui/shellDBus.js +++ b/js/ui/shellDBus.js @@ -1,7 +1,6 @@ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- const { Gio, GLib, Meta, Shell } = imports.gi; -const Lang = imports.lang; const Config = imports.misc.config; const ExtensionDownloader = imports.ui.extensionDownloader; @@ -264,41 +263,8 @@ var GnomeShellExtensions = class { } GetExtensionInfo(uuid) { - let extension = ExtensionUtils.extensions[uuid]; - if (!extension) - return {}; - - let obj = {}; - Lang.copyProperties(extension.metadata, obj); - - // Only serialize the properties that we actually need. - const serializedProperties = ["type", "state", "path", "error", "hasPrefs"]; - - serializedProperties.forEach(prop => { - obj[prop] = extension[prop]; - }); - - let out = {}; - for (let key in obj) { - let val = obj[key]; - let type; - switch (typeof val) { - case 'string': - type = 's'; - break; - case 'number': - type = 'd'; - break; - case 'boolean': - type = 'b'; - break; - default: - continue; - } - out[key] = GLib.Variant.new(type, val); - } - - return out; + let extension = ExtensionUtils.extensions[uuid] || {}; + return ExtensionUtils.serializeExtension(extension); } GetExtensionErrors(uuid) {