[gnome-shell/message-tray: 1/5] Add some very minimal telepathy support



commit c985c3cf785d954e68541509d99af8f354848c42
Author: Dan Winship <danw gnome org>
Date:   Tue Oct 27 11:49:21 2009 -0400

    Add some very minimal telepathy support
    
    Original code from Will Thompson
    
    https://bugzilla.gnome.org/show_bug.cgi?id=599193

 js/ui/main.js      |    3 +
 js/ui/messaging.js |  168 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 171 insertions(+), 0 deletions(-)
---
diff --git a/js/ui/main.js b/js/ui/main.js
index aac2672..6922630 100644
--- a/js/ui/main.js
+++ b/js/ui/main.js
@@ -14,6 +14,7 @@ const St = imports.gi.St;
 
 const Chrome = imports.ui.chrome;
 const Environment = imports.ui.environment;
+const Messaging = imports.ui.messaging;
 const Overview = imports.ui.overview;
 const Panel = imports.ui.panel;
 const RunDialog = imports.ui.runDialog;
@@ -32,6 +33,7 @@ let overview = null;
 let runDialog = null;
 let lookingGlass = null;
 let wm = null;
+let messaging = null;
 let recorder = null;
 let shellDBusService = null;
 let modalCount = 0;
@@ -101,6 +103,7 @@ function start() {
     panel = new Panel.Panel();
     sidebar = new Sidebar.Sidebar();
     wm = new WindowManager.WindowManager();
+    messaging = new Messaging.Messaging();
 
     global.screen.connect('toggle-recording', function() {
         if (recorder == null) {
diff --git a/js/ui/messaging.js b/js/ui/messaging.js
new file mode 100644
index 0000000..190d6e6
--- /dev/null
+++ b/js/ui/messaging.js
@@ -0,0 +1,168 @@
+const DBus = imports.dbus;
+const Shell = imports.gi.Shell;
+
+const TELEPATHY = "org.freedesktop.Telepathy.";
+const CONN = TELEPATHY + "Connection";
+const CHANNEL = TELEPATHY + "Channel";
+const CHANNELTEXT = CHANNEL + ".Type.Text";
+
+const ClientIface = {
+    name: TELEPATHY + "Client",
+    properties: [{ name: "Interfaces",
+                   signature: "as",
+                   access: "read" }]
+};
+
+const ClientObserverIface = {
+    name: TELEPATHY + "Client.Observer",
+    methods: [{ name: "ObserveChannels",
+                inSignature: "ooa(oa{sv})oaoa{sv}",
+                outSignature: "" }],
+    properties: [{ name: "ObserverChannelFilter",
+                   signature: "aa{sv}",
+                   access: "read" }]
+};
+
+const ConnectionIface = {
+    name: CONN
+};
+
+const ConnectionAvatarsIface = {
+    name: CONN + '.Interface.Avatars',
+    methods: [
+        { name: 'RequestAvatar',
+          inSignature: 'u',
+          outSignature: 'ays'
+        }
+    ]
+};
+
+function Connection(path) {
+    this._init(path);
+};
+
+Connection.prototype = {
+    _init: function(path) {
+        DBus.session.proxifyObject(this, nameify(path), path);
+    }
+};
+
+DBus.proxifyPrototype(Connection.prototype, ConnectionIface);
+DBus.proxifyPrototype(Connection.prototype, ConnectionAvatarsIface);
+
+const ChannelIface = {
+    name: CHANNEL,
+    signals: [
+        { name: 'Closed', inSignature: '' }
+    ]
+};
+
+function Channel(name, path) {
+    this._init(name, path);
+};
+
+Channel.prototype = {
+    _init: function(name, path) {
+        DBus.session.proxifyObject(this, name, path);
+    }
+};
+
+DBus.proxifyPrototype(Channel.prototype, ChannelIface);
+
+const ChannelTextIface = {
+    name: CHANNELTEXT,
+    signals: [
+        { name: 'Received', inSignature: 'uuuuus' }
+    ]
+};
+
+function ChannelText(name, path) {
+    this._init(name, path);
+};
+
+ChannelText.prototype = {
+    _init: function(name, path) {
+        DBus.session.proxifyObject(this, name, path);
+    }
+};
+
+DBus.proxifyPrototype(ChannelText.prototype, ChannelTextIface);
+
+let nameify = function(path) {
+    return path.substr(1).replace('/', '.', 'g');
+};
+
+let pathify = function(name) {
+    return '/' + name.replace('.', '/', 'g');
+};
+
+function Messaging() {
+    this._init();
+};
+
+Messaging.prototype = {
+    _init : function() {
+        let name = TELEPATHY + "Client.GnomeShell";
+        DBus.session.exportObject(pathify(name), this);
+        DBus.session.acquire_name(name, DBus.SINGLE_INSTANCE,
+            function(name){log("Acquired name " + name);},
+            function(name){log("Lost name " + name);});
+    },
+
+    get Interfaces() {
+        return [TELEPATHY + "Client.Observer"];
+    },
+
+    get ObserverChannelFilter() {
+        return [
+            { 'org.freedesktop.Telepathy.Channel.ChannelType': CHANNELTEXT }
+        ];
+    },
+
+    ObserveChannels: function(account, conn_path, channels,
+                              dispatch_operation, requests_satisfied,
+                              observer_info) {
+        log('observing ' + conn_path);
+        let conn = new Connection(conn_path);
+        let conn_name = conn_path.substr(1).replace('/','.','g');
+
+        for (var i = 0; i < channels.length; i++) {
+            let path = channels[i][0];
+            let props = channels[i][1];
+
+            let targethandle = props[CHANNEL + '.TargetHandle'];
+            let targetid = props[CHANNEL + '.TargetID'];
+
+            // conn.RequestAvatarRemote(targethandle,
+            //     function(result, excp) {
+            //         log("called for " + targetid);
+            //         let avatar;
+            //         if (result) {
+            //             let bytes = result[0];
+            //             avatar = Shell.TextureCache.get_default().load_from_data(bytes, bytes.length, -1, TRAY_HEIGHT);
+            //         } else {
+            //             // fallback avatar
+            //             avatar = Shell.TextureCache.get_default().load_icon_name("stock_person", TRAY_HEIGHT);
+            //         }
+	    // 	});
+
+            let channel = new Channel(conn_name, path);
+            let id = channel.connect('Closed',
+		function(emitter) {
+                    log('closed');
+                    channel.disconnect(id);
+                });
+
+            let text = new ChannelText(conn_name, path);
+	    text.connect('Received',
+		function(chan, id, timestamp, sender, type, flags, text) {
+		    log('Received: id ' + id + ', time ' + timestamp + ', sender ' + sender + ', type ' + type + ', flags ' + flags + ': ' + text);
+		});
+        }
+
+        return [true];
+    }
+};
+
+DBus.conformExport(Messaging.prototype, ClientIface);
+DBus.conformExport(Messaging.prototype, ClientObserverIface);



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