Add shell_get_file_contents_utf8_sync(), use it instead of gio temporarily
Adding correct annotations to Gio.File.load_contents revealed that gjs doesn't actually support array+length combinations. For 3.0 this would be invasive to fix, so add a method to ShellGlobal which does what we need. https://bugzilla.gnome.org/show_bug.cgi?id=646333
This commit is contained in:
parent
d19f2bb6d2
commit
92f09a60f6
@ -67,7 +67,13 @@ function loadExtension(dir, enabled, type) {
|
||||
return;
|
||||
}
|
||||
|
||||
let [success, metadataContents, len, etag] = metadataFile.load_contents(null);
|
||||
let metadataContents;
|
||||
try {
|
||||
metadataContents = Shell.get_file_contents_utf8_sync(metadataFile.get_path());
|
||||
} catch (e) {
|
||||
global.logError(baseErrorString + 'Failed to load metadata.json: ' + e);
|
||||
return;
|
||||
}
|
||||
let meta;
|
||||
try {
|
||||
meta = JSON.parse(metadataContents);
|
||||
|
@ -274,24 +274,18 @@ OpenSearchSystem.prototype = {
|
||||
},
|
||||
|
||||
_addProvider: function(fileName) {
|
||||
let file = Gio.file_new_for_path(global.datadir + '/search_providers/' + fileName);
|
||||
let source = '';
|
||||
|
||||
file.load_contents_async(null, Lang.bind(this, function (obj, res) {
|
||||
let [success, source] = file.load_contents_finish(res);
|
||||
if (source) {
|
||||
let [success, name, url, langs, icon_uri] = global.parse_search_provider(source);
|
||||
let provider ={ name: name,
|
||||
url: url,
|
||||
id: this._providers.length,
|
||||
icon_uri: icon_uri,
|
||||
langs: langs };
|
||||
if (this._checkSupportedProviderLanguage(provider)) {
|
||||
this._providers.push(provider);
|
||||
this.emit('changed');
|
||||
}
|
||||
}
|
||||
}));
|
||||
let path = global.datadir + '/search_providers/' + fileName;
|
||||
let source = Shell.get_file_contents_utf8_sync(path);
|
||||
let [success, name, url, langs, icon_uri] = global.parse_search_provider(source);
|
||||
let provider ={ name: name,
|
||||
url: url,
|
||||
id: this._providers.length,
|
||||
icon_uri: icon_uri,
|
||||
langs: langs };
|
||||
if (this._checkSupportedProviderLanguage(provider)) {
|
||||
this._providers.push(provider);
|
||||
this.emit('changed');
|
||||
}
|
||||
},
|
||||
|
||||
_refresh: function() {
|
||||
|
@ -2229,3 +2229,36 @@ shell_get_contact_events (TplLogManager *log_manager,
|
||||
NULL, NULL,
|
||||
callback, NULL);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* shell_get_file_contents_utf8_sync:
|
||||
* @path: UTF-8 encoded filename path
|
||||
* @error: a #GError
|
||||
*
|
||||
* Synchronously load the contents of a file as a NUL terminated
|
||||
* string, validating it as UTF-8. Embedded NUL characters count as
|
||||
* invalid content.
|
||||
*
|
||||
* Returns: (transfer full): File contents
|
||||
*/
|
||||
char *
|
||||
shell_get_file_contents_utf8_sync (const char *path,
|
||||
GError **error)
|
||||
{
|
||||
char *contents;
|
||||
gsize len;
|
||||
if (!g_file_get_contents (path, &contents, &len, error))
|
||||
return NULL;
|
||||
if (!g_utf8_validate (contents, len, NULL))
|
||||
{
|
||||
g_free (contents);
|
||||
g_set_error (error,
|
||||
G_IO_ERROR,
|
||||
G_IO_ERROR_FAILED,
|
||||
"File %s contains invalid UTF-8",
|
||||
path);
|
||||
return NULL;
|
||||
}
|
||||
return contents;
|
||||
}
|
||||
|
@ -185,6 +185,9 @@ void shell_get_contact_events (TplLogManager *log_manager,
|
||||
guint num_events,
|
||||
GAsyncReadyCallback callback);
|
||||
|
||||
char *shell_get_file_contents_utf8_sync (const char *path,
|
||||
GError **error);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __SHELL_GLOBAL_H__ */
|
||||
|
Loading…
Reference in New Issue
Block a user