[gnome-shell/zeitgeist: 19/22] Add JavaScript bindings for Zeitgeist



commit 41c70293dff9dde7d1bf3b5be262849734acbb6c
Author: Siegfried-Angel Gevatter Pujals <rainct ubuntu com>
Date:   Fri Jan 28 18:37:37 2011 +0100

    Add JavaScript bindings for Zeitgeist
    
    Co-authored-by: Seif Lotfy <seif lotfy com>
    Co-authored-by: Federico Mena Quintero <federico gnome org>

 js/Makefile.am        |    2 +
 js/misc/semantic.js   |   43 +++++++++
 js/misc/zeitgeist.js  |  234 +++++++++++++++++++++++++++++++++++++++++++++++++
 js/ui/lookingGlass.js |    2 +
 4 files changed, 281 insertions(+), 0 deletions(-)
---
diff --git a/js/Makefile.am b/js/Makefile.am
index 55bb111..2c1bfb6 100644
--- a/js/Makefile.am
+++ b/js/Makefile.am
@@ -9,7 +9,9 @@ nobase_dist_js_DATA = 	\
 	misc/gnomeSession.js	\
 	misc/history.js		\
 	misc/params.js		\
+	misc/semantic.js	\
 	misc/util.js		\
+	misc/zeitgeist.js	\
 	perf/core.js		\
 	ui/altTab.js		\
 	ui/appDisplay.js	\
diff --git a/js/misc/semantic.js b/js/misc/semantic.js
new file mode 100644
index 0000000..1593c15
--- /dev/null
+++ b/js/misc/semantic.js
@@ -0,0 +1,43 @@
+/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*-
+ *
+ * Semantic-desktop interpretations for various data types
+ *
+ * Authors: Federico Mena Quintero <federico gnome org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+const NFO_AUDIO                   = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Audio";;
+const NFO_DOCUMENT                = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Document";;
+const NFO_HTML_DOCUMENT           = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#HtmlDocument";;
+const NFO_IMAGE                   = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Image";;
+const NFO_MEDIA                   = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Media";;
+const NFO_MIND_MAP                = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#MindMap";;
+const NFO_PAGINATED_TEXT_DOCUMENT = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#PaginatedTextDocument";;
+const NFO_PLAIN_TEXT_DOCUMENT     = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#PlainTextDocument";;
+const NFO_PRESENTATION            = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Presentation";;
+const NFO_RASTER_IMAGE            = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#RasterImage";;
+const NFO_SOURCE_CODE             = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#SourceCode";;
+const NFO_SPREADSHEET             = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Spreadsheet";;
+const NFO_TEXT_DOCUMENT           = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#TextDocument";;
+const NFO_VECTOR_IMAGE            = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#VectorImage";;
+const NFO_VIDEO                   = "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Video";;
+
+const NMM_CURSOR                  = "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#Cursor";;
+const NMM_ICON                    = "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#Icon";;
+const NMM_MOVIE                   = "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#Movie";;
+const NMM_MUSIC_PIECE             = "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#MusicPiece";;
+const NMM_TV_SHOW                 = "http://www.semanticdesktop.org/ontologies/2009/02/19/nmm#TVShow";;
diff --git a/js/misc/zeitgeist.js b/js/misc/zeitgeist.js
new file mode 100644
index 0000000..9fe5831
--- /dev/null
+++ b/js/misc/zeitgeist.js
@@ -0,0 +1,234 @@
+/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*-
+ *
+ * Copyright (C) 2010 Seif Lotfy <seif lotfy com>
+ * Copyright (C) 2011 Siegfried-Angel Gevatter Pujals <siegfried gevatter com>
+ * Copyright (C) 2010-2011 Collabora Ltd.
+ *     Authored by: Seif Lotfy <seif lotfy com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+const DBus = imports.dbus;
+
+const SIG_EVENT = '(asaasay)';
+const MAX_TIMESTAMP = 9999999999999;
+
+// Number of results given by fullTextSearch; 100 is probably enough.
+// Note: We can't currently increase this number to anything above 132, due to
+// https://bugs.launchpad.net/zeitgeist-extensions/+bug/716503
+const MAX_RESULTS = 100;
+
+const ResultType = {
+    // http://zeitgeist-project.com/docs/0.6/datamodel.html#resulttype
+    // We currently only use MOST_POPULAR_SUBJECTS
+    MOST_POPULAR_SUBJECTS: 4,
+};
+
+/* Zeitgeist Subjects (files, people, etc.) */
+
+function Subject(uri, interpretation, manifestation, origin, mimetype, text, storage) {
+    this._init(uri, interpretation, manifestation, origin, mimetype, text, storage);
+};
+
+Subject.prototype = {
+    _init: function(uri, interpretation, manifestation, origin, mimetype, text, storage) {
+        this.uri = uri;
+        this.interpretation = interpretation;
+        this.manifestation = manifestation;
+        this.origin = origin;
+        this.mimetype = mimetype;
+        this.text = text;
+        this.storage = storage;
+    },
+};
+
+Subject.fromPlain = function(rawSubject) {
+    return new Subject(rawSubject[0], // uri
+                       rawSubject[1], // interpretation
+                       rawSubject[2], // manifestation
+                       rawSubject[3], // origin
+                       rawSubject[4], // mimetype
+                       rawSubject[5], // text
+                       rawSubject[6]); // storage
+};
+
+Subject.toPlain = function(subject) {
+    let rawSubject = [];
+    rawSubject[0] = subject.uri;
+    rawSubject[1] = subject.interpretation;
+    rawSubject[2] = subject.manifestation
+    rawSubject[3] = subject.origin;
+    rawSubject[4] = subject.mimetype;
+    rawSubject[5] = subject.text;
+    rawSubject[6] = subject.storage;
+    return rawSubject;
+};
+
+/* Zeitgeist Events */
+
+function Event(interpretation, manifestation, actor, subjects, payload) {
+    this._init(interpretation, manifestation, actor, subjects, payload);
+};
+
+Event.prototype = {
+    _init: function(interpretation, manifestation, actor, subjects, payload) {
+        this.id = 0;
+        this.timestamp = 0;
+        this.actor = actor;
+        this.interpretation = interpretation;
+        this.manifestation = manifestation;
+        this.actor = actor;
+        this.payload = payload;
+        this.subjects = subjects;
+    },
+};
+
+Event.fromPlain = function(rawEvent) {
+    let subjects = rawEvent[1].map(Subject.fromPlain);
+    let event = new Event(rawEvent[0][2], // interpretation
+                          rawEvent[0][3], // manifestation
+                          rawEvent[0][4], // actor
+                          subjects, // subjects
+                          rawEvent[2]);// payload
+    event.id = rawEvent[0][0]; // id
+    event.timestamp = rawEvent[0][1]; // timestamp
+    return event;
+};
+
+Event.toPlain = function(event) {
+    let rawEvent = [];
+    rawEvent[0] = [];
+    rawEvent[0][0] = event.id.toString();
+    rawEvent[0][1] = event.timestamp.toString();
+    rawEvent[0][2] = event.interpretation;
+    rawEvent[0][3] = event.manifestation;
+    rawEvent[0][4] = event.actor;
+    rawEvent[1] = event.subjects.map(Subject.toPlain);
+    rawEvent[2] = event.payload;
+    return rawEvent;
+};
+
+// Zeitgeist D-Bus interface definitions. Note that most of these are
+// incomplete, and only cover the methods/properties/signals that
+// we're currently using.
+
+/* Zeitgeist D-Bus Interface */
+
+const LOG_NAME = 'org.gnome.zeitgeist.Engine';
+const LOG_PATH = '/org/gnome/zeitgeist/log/activity';
+const LogIface = {
+    name: 'org.gnome.zeitgeist.Log',
+    methods: [
+        { name: 'GetEvents',
+          inSignature: 'au',
+          outSignature: 'a'+SIG_EVENT },
+        { name: 'FindRelatedUris',
+          inSignature: 'au',
+          outSignature: '(xx)a(' + SIG_EVENT + ')a'+ SIG_EVENT + 'uuu' },
+        { name: 'FindEventIds',
+          inSignature: '(xx)a' + SIG_EVENT + 'uuu',
+          outSignature: 'au' },
+        { name: 'FindEvents',
+          inSignature: '(xx)a' + SIG_EVENT + 'uuu',
+          outSignature: 'a' + SIG_EVENT },
+        { name: 'InsertEvents',
+          inSignature: 'a' + SIG_EVENT,
+          outSignature: 'au' },
+        { name: 'DeleteEvents',
+          inSignature: 'au',
+          outSignature: '(xx)' },
+        { name: 'DeleteLog',
+          inSignature: '',
+          outSignature: '' },
+        { name: 'Quit',
+          inSignature: '',
+          outSignature: '' },
+        // FIXME: Add missing DBus Methods
+        // - InstallMonitor
+        // - RemoveMonitor
+    ],
+    properties: [
+        { name: 'Get',
+          inSignature: 'ss',
+          outSignature: 'v',
+          access: 'read' },
+        { name: 'Set',
+          inSignature: 'ssv',
+          outSignature: '',
+          access: 'read' },
+        { name: 'GetAll',
+          inSignature: 's',
+          outSignature: 'a{sv}',
+          access: 'read' },
+    ]
+};
+
+const Log = DBus.makeProxyClass(LogIface);
+const _log = new Log(DBus.session, LOG_NAME, LOG_PATH);
+
+function findEvents(timeRange, eventTemplates, storageState, numEvents, resultType, callback) {
+    function handler(results, error) {
+        if (error != null)
+            log("Error querying Zeitgeist for events: "+error);
+        else
+            callback(results.map(Event.fromPlain));
+    }
+    _log.FindEventsRemote(timeRange, eventTemplates.map(Event.toPlain),
+                          storageState, numEvents, resultType, handler);
+}
+
+/* Zeitgeist Full-Text-Search Interface */
+
+const INDEX_NAME = 'org.gnome.zeitgeist.Engine';
+const INDEX_PATH = '/org/gnome/zeitgeist/index/activity';
+const IndexIface = {
+    name: 'org.gnome.zeitgeist.Index',
+    methods: [
+        { name: 'Search',
+          inSignature: 's(xx)a'+SIG_EVENT+'uuu',
+          outSignature: 'a'+SIG_EVENT+'u' },
+    ],
+};
+
+const Index = DBus.makeProxyClass(IndexIface);
+const _index = new Index(DBus.session, INDEX_NAME, INDEX_PATH);
+
+/**
+ * fullTextSearch:
+ *
+ * Asynchronously search Zeitgeist's index for events relating to the query.
+ *
+ * @param query The query string, using asterisks for wildcards. Wildcards must
+ *        be used at the start and/or end of a string to get relevant information.
+ * @param eventTemplates Zeitgeist event templates, see
+ *        http://zeitgeist-project.com/docs/0.6/datamodel.html#event for more
+ *        information
+ * @param callback The callback, takes a list containing Zeitgeist.Event
+ *        objects
+ */
+function fullTextSearch(query, eventTemplates, callback) {
+    function handler(results, error) {
+        if (error != null)
+            log("Error searching with Zeitgeist FTS: "+error);
+        else
+            callback(results[0].map(Event.fromPlain));
+    }
+    _index.SearchRemote(query, [0, MAX_TIMESTAMP],
+                        eventTemplates.map(Event.toPlain),
+                        0, // offset into the search results
+                        MAX_RESULTS,
+                        ResultType.MOST_POPULAR_SUBJECTS, handler);
+}
diff --git a/js/ui/lookingGlass.js b/js/ui/lookingGlass.js
index c98fa22..03b83ec 100644
--- a/js/ui/lookingGlass.js
+++ b/js/ui/lookingGlass.js
@@ -26,10 +26,12 @@ var commandHeader = 'const Clutter = imports.gi.Clutter; ' +
                     'const Gtk = imports.gi.Gtk; ' +
                     'const Mainloop = imports.mainloop; ' +
                     'const Meta = imports.gi.Meta; ' +
+                    'const Semantic = imports.misc.semantic' +
                     'const Shell = imports.gi.Shell; ' +
                     'const Main = imports.ui.main; ' +
                     'const Lang = imports.lang; ' +
                     'const Tweener = imports.ui.tweener; ' +
+                    'const Zeitgeist = imports.misc.zeitgeist; ' +
                     /* Utility functions...we should probably be able to use these
                      * in the shell core code too. */
                     'const stage = global.stage; ' +



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]