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
This commit is contained in:
parent
4589da957b
commit
58806359ee
@ -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()];
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user