[gnome-shell] Add shell_get_file_contents_utf8_sync(), use it instead of gio temporarily
- From: Owen Taylor <otaylor src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] Add shell_get_file_contents_utf8_sync(), use it instead of gio temporarily
- Date: Mon, 4 Apr 2011 13:09:17 +0000 (UTC)
commit 92f09a60f6b3f1c25dc0b3ad2f5e67e177c7880b
Author: Colin Walters <walters verbum org>
Date: Thu Mar 31 16:13:07 2011 -0400
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
js/ui/extensionSystem.js | 8 +++++++-
js/ui/search.js | 30 ++++++++++++------------------
src/shell-global.c | 33 +++++++++++++++++++++++++++++++++
src/shell-global.h | 3 +++
4 files changed, 55 insertions(+), 19 deletions(-)
---
diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js
index f2b88a5..eb82bc3 100644
--- a/js/ui/extensionSystem.js
+++ b/js/ui/extensionSystem.js
@@ -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);
diff --git a/js/ui/search.js b/js/ui/search.js
index 7e30fc0..1244def 100644
--- a/js/ui/search.js
+++ b/js/ui/search.js
@@ -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() {
diff --git a/src/shell-global.c b/src/shell-global.c
index 2123e8a..29caaa9 100644
--- a/src/shell-global.c
+++ b/src/shell-global.c
@@ -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;
+}
diff --git a/src/shell-global.h b/src/shell-global.h
index 6e16abe..f965e2b 100644
--- a/src/shell-global.h
+++ b/src/shell-global.h
@@ -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__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]