Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEduardo Silva <edsiper@gmail.com>2007-10-30 13:05:51 (GMT)
committer Eduardo Silva <edsiper@gmail.com>2007-10-30 13:05:51 (GMT)
commit2d572d48623da6d0978c2303ff09f22c14f36d8f (patch)
treeb68f2ddce4f65c584951fad0a95eeb7b92812dfd
parent7be570bd51282bc52f324da5612cb3c360cff0d6 (diff)
Drop presence and network
-rw-r--r--NEWS8
-rw-r--r--activity/activity.info2
-rw-r--r--logviewer.py42
-rw-r--r--netdevice.py94
-rw-r--r--network.py100
-rw-r--r--ps_watcher.py724
-rw-r--r--treeview.py73
7 files changed, 11 insertions, 1032 deletions
diff --git a/NEWS b/NEWS
index 2e3dbef..8c2d428 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
-* 2007/10/24:
- - Initial Version
+2
+* Drop presence and network
+
+1
+
+* Initial Version
diff --git a/activity/activity.info b/activity/activity.info
index 6c8a50c..d68d534 100644
--- a/activity/activity.info
+++ b/activity/activity.info
@@ -1,6 +1,6 @@
[Activity]
name = Log Viewer
-activity_version = 1
+activity_version = 2
service_name = org.laptop.LogViewer
exec = sugar-activity logviewer.LogHandler -s
icon = activity-log
diff --git a/logviewer.py b/logviewer.py
index 903d515..968f42a 100644
--- a/logviewer.py
+++ b/logviewer.py
@@ -30,8 +30,6 @@ import gnomevfs
from sugar.activity import activity
from sugar import env
from sugar.graphics.toolbutton import ToolButton
-from ps_watcher import PresenceServiceNameWatcher
-from network import NetworkView
class MultiLogView(gtk.VBox):
def __init__(self, path, extra_files):
@@ -236,8 +234,6 @@ class LogHandler(activity.Activity):
ext_files.append("/var/log/messages")
self._viewer = MultiLogView(main_path, ext_files).hbox
- self._ps = PresenceServiceNameWatcher(dbus.SessionBus())
- self._network = NetworkView()
self._box = gtk.HBox()
self._box.pack_start(self._viewer)
@@ -249,9 +245,9 @@ class LogHandler(activity.Activity):
toolbox = activity.ActivityToolbox(self)
toolbox.show()
- toolbar = LogToolbar(self)
- toolbox.add_toolbar(_('Interfaces'), toolbar)
- toolbar.show()
+ #toolbar = LogToolbar(self)
+ #toolbox.add_toolbar(_('Interfaces'), toolbar)
+ #toolbar.show()
self.set_toolbox(toolbox)
self.show()
@@ -261,23 +257,11 @@ class LogHandler(activity.Activity):
toolbar.share.hide()
toolbar.keep.hide()
+ # Keeping this method to add new funcs later
def switch_to_logviewer(self):
self._clean_box()
self._box.pack_start(self._viewer)
- def switch_to_presence(self):
- self._clean_box()
- self._box.pack_start(self._ps)
-
- def switch_to_network(self):
- self._clean_box()
- self._box.pack_start(self._network)
-
- def _clean_box(self):
- childs = self._box.get_children()
- for c in childs:
- self._box.remove(c)
-
class LogToolbar(gtk.Toolbar):
def __init__(self, handler):
gtk.Toolbar.__init__(self)
@@ -289,23 +273,5 @@ class LogToolbar(gtk.Toolbar):
self.insert(logviewer, -1)
logviewer.show()
- network = ToolButton('network-wireless-060')
- network.set_tooltip(_('Network Status'))
- network.connect('clicked', self._on_network_clicked_cb)
- self.insert(network, -1)
- network.show()
-
- presence = ToolButton('computer-xo')
- presence.set_tooltip(_('Presence Service'))
- presence.connect('clicked', self._on_presence_clicked_cb)
- self.insert(presence, -1)
- presence.show()
-
def _on_logviewer_clicked_cb(self, widget):
self._handler.switch_to_logviewer()
-
- def _on_presence_clicked_cb(self, widget):
- self._handler.switch_to_presence()
-
- def _on_network_clicked_cb(self, widget):
- self._handler.switch_to_network()
diff --git a/netdevice.py b/netdevice.py
deleted file mode 100644
index c739ba3..0000000
--- a/netdevice.py
+++ /dev/null
@@ -1,94 +0,0 @@
-# Copyright (C) 2007, Eduardo Silva <edsiper@gmail.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 of the License, 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-import socket
-import fcntl
-import struct
-import string
-
-class NetDevice(object):
- def __init__(self):
- self._dev = self.get_interfaces()
-
- def get_interfaces(self):
- netdevfile = "/proc/net/dev"
- dev = []
-
- try:
- infile = file(netdevfile, "r")
- except:
- print "Error trying " + netdevfile
-
- skip = 0
- for line in infile:
- # Skip first two lines
- skip += 1
- if skip <= 2:
- continue
-
- iface = string.split(line, ":",1)
- arr = string.split(iface[1])
-
- if len(arr) < 10:
- continue
-
- info = {'interface': iface[0].strip(), \
- 'bytes_recv': arr[0],\
- 'bytes_sent': arr[8],\
- 'packets_recv': arr[1],
- 'packets_sent': arr[9]}
-
- dev.append(info)
- return dev
-
- def get_iface_info(self, ifname):
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- hwaddr = []
- try:
- ip = socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, \
- struct.pack('256s', ifname[:15]))[20:24])
- except:
- ip = None
-
- try:
- netmask = socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x891b, \
- struct.pack('256s', ifname[:15]))[20:24])
- except:
- netmask = None
-
- try:
- mac = []
- info = fcntl.ioctl(s.fileno(), 0x8927, \
- struct.pack('256s', ifname[:15]))
- for char in info[18:24]:
- hdigit = hex(ord(char))[2:]
- if len(hdigit):
- mac.append(hdigit)
- except:
- mac = None
-
- mac_string = self.mac_to_string(mac)
- return [ip, netmask, mac_string]
-
- def mac_to_string(self, hexa):
- string = ''
- for value in hexa:
- if len(string)==0:
- string = value
- else:
- string += ':'+value
-
- return string
diff --git a/network.py b/network.py
deleted file mode 100644
index 2bd867d..0000000
--- a/network.py
+++ /dev/null
@@ -1,100 +0,0 @@
-# Copyright (C) 2007, Eduardo Silva <edsiper@gmail.com>
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the
-# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-import gobject
-from netdevice import NetDevice
-from treeview import TreeView
-
-class NetworkView(TreeView):
- def __init__(self):
- col_names = []
- col_names.append({'index': 0, 'name': 'Interface'})
- col_names.append({'index': 1, 'name': 'IP Address'})
- col_names.append({'index': 2, 'name': 'NetMask'})
- col_names.append({'index': 3, 'name': 'MAC Address'})
- col_names.append({'index': 4, 'name': 'Bytes Recv'})
- col_names.append({'index': 5, 'name': 'Bytes Sent'})
- col_names.append({'index': 6, 'name': 'Packets Recv'})
- col_names.append({'index': 7, 'name': 'Packets Sent'})
-
- self._iface_iter = []
- cols_type = [str, str, str, str, str, str, str, str]
- TreeView.__init__(self, cols_type, col_names)
-
- self._dev = NetDevice()
- self.show_all()
- gobject.timeout_add(1500, self._update_data)
-
- def _update_data(self):
- interfaces = self._dev.get_interfaces()
- for iface in interfaces:
- info = self._dev.get_iface_info(iface['interface'])
- row = []
- row.append({'index':0, 'info': iface['interface']})
-
- if info[0]:
- row.append({'index':1, 'info': info[0]})
- if info[1]:
- row.append({'index':2, 'info': info[1]})
- if info[2]:
- row.append({'index':3, 'info': info[2]})
-
- row.append({'index': 4, 'info': iface['bytes_sent']})
- row.append({'index': 5, 'info': iface['packets_sent']})
- row.append({'index': 6, 'info': iface['bytes_recv']})
- row.append({'index': 7, 'info': iface['packets_recv']})
-
- iter = self._get_iface_iter(iface['interface'])
- if not iter:
- iter = self.add_row(row)
- self._set_iface_iter(iter, iface['interface'])
- else:
- self.update_row(iter, row)
-
- self._clear_down_interfaces(interfaces)
- return True
-
- def _set_iface_iter(self, iter, iface):
- self._iface_iter.append([iter, iface])
-
- def _remove_iface_iter(self, search_iter):
- i = 0
- for [iter, interface] in self._iface_iter:
- if iter == search_iter:
- del self._iface_iter[i]
- return
- i+=1
-
- def _get_iface_iter(self, iface):
- for [iter, interface] in self._iface_iter:
- if iface == interface:
- return iter
-
- return None
-
- def _clear_down_interfaces(self, interfaces):
- for [iter, iface] in self._iface_iter:
- found = False
- for dev in interfaces:
- if dev['interface']==iface:
- found = True
- break
-
- if not found:
- self.remove_row(iter)
- self._remove_iface_iter(iter)
-
diff --git a/ps_watcher.py b/ps_watcher.py
deleted file mode 100644
index 5fdec77..0000000
--- a/ps_watcher.py
+++ /dev/null
@@ -1,724 +0,0 @@
-# Copyright (C) 2007 Collabora Ltd. <http://www.collabora.co.uk/>
-#
-# 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 of the License, 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-import logging
-from hashlib import sha1
-
-import dbus
-from gtk import VBox, Label, TreeView, Expander, ListStore, CellRendererText,\
- ScrolledWindow, CellRendererToggle, TextView, VPaned
-from gobject import timeout_add
-
-
-logger = logging.getLogger('ps_watcher')
-#logging.basicConfig(filename='/tmp/ps_watcher.log')
-#logging.getLogger().setLevel(1)
-
-
-PS_NAME = 'org.laptop.Sugar.Presence'
-PS_PATH = '/org/laptop/Sugar/Presence'
-PS_IFACE = PS_NAME
-ACTIVITY_IFACE = PS_IFACE + '.Activity'
-BUDDY_IFACE = PS_IFACE + '.Buddy'
-
-# keep these in sync with the calls to ListStore()
-ACT_COL_PATH = 0
-ACT_COL_WEIGHT = 1
-ACT_COL_STRIKE = 2
-ACT_COL_ID = 3
-ACT_COL_COLOR = 4
-ACT_COL_TYPE = 5
-ACT_COL_NAME = 6
-ACT_COL_CONN = 7
-ACT_COL_CHANNELS = 8
-ACT_COL_BUDDIES = 9
-BUDDY_COL_PATH = 0
-BUDDY_COL_WEIGHT = 1
-BUDDY_COL_STRIKE = 2
-BUDDY_COL_NICK = 3
-BUDDY_COL_OWNER = 4
-BUDDY_COL_COLOR = 5
-BUDDY_COL_IP4 = 6
-BUDDY_COL_CUR_ACT = 7
-BUDDY_COL_KEY_ID = 8
-BUDDY_COL_ACTIVITIES = 9
-BUDDY_COL_HANDLES = 10
-
-
-class ActivityWatcher(object):
-
- def __init__(self, ps_watcher, object_path):
- self.ps_watcher = ps_watcher
- self.bus = ps_watcher.bus
- self.proxy = self.bus.get_object(self.ps_watcher.unique_name,
- object_path)
- self.iface = dbus.Interface(self.proxy, ACTIVITY_IFACE)
- self.object_path = object_path
- self.appearing = True
- self.disappearing = False
- timeout_add(5000, self._finish_appearing)
-
- self.id = '?'
- self.color = '?'
- self.type = '?'
- self.name = '?'
- self.conn = '?'
- self.channels = None
- self.buddies = None
-
- self.iter = self.ps_watcher.add_activity(self)
-
- self.iface.GetId(reply_handler=self._on_get_id_success,
- error_handler=self._on_get_id_failure)
-
- self.iface.GetColor(reply_handler=self._on_get_color_success,
- error_handler=self._on_get_color_failure)
-
- self.iface.GetType(reply_handler=self._on_get_type_success,
- error_handler=self._on_get_type_failure)
-
- self.iface.GetName(reply_handler=self._on_get_name_success,
- error_handler=self._on_get_name_failure)
-
- self.iface.connect_to_signal('NewChannel', self._on_new_channel)
- self.iface.GetChannels(reply_handler=self._on_get_channels_success,
- error_handler=self._on_get_channels_failure)
-
- self.iface.connect_to_signal('BuddyJoined', self._on_buddy_joined)
- self.iface.connect_to_signal('BuddyLeft', self._on_buddy_left)
- self.iface.GetJoinedBuddies(reply_handler=self._on_get_buddies_success,
- error_handler=self._on_get_buddies_failure)
-
- def _on_buddy_joined(self, buddy):
- if self.buddies is None:
- return
- if buddy.startswith('/org/laptop/Sugar/Presence/Buddies/'):
- buddy = '.../' + buddy[35:]
- self.ps_watcher.log('INFO: Activity %s emitted BuddyJoined("%s") '
- 'or mentioned the buddy in GetJoinedBuddies',
- self.object_path, buddy)
- self.buddies.append(buddy)
- self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_BUDDIES,
- ' '.join(self.buddies))
-
- def _on_buddy_left(self, buddy):
- if self.buddies is None:
- return
- if buddy.startswith('/org/laptop/Sugar/Presence/Buddies/'):
- buddy = '.../' + buddy[35:]
- self.ps_watcher.log('INFO: Activity %s emitted BuddyLeft("%s")',
- self.object_path, buddy)
- try:
- self.buddies.remove(buddy)
- except ValueError:
- pass
- self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_BUDDIES,
- ' '.join(self.buddies))
-
- def _on_get_buddies_success(self, buddies):
- self.buddies = []
- for buddy in buddies:
- self._on_buddy_joined(buddy)
-
- def _on_get_buddies_failure(self, e):
- self.log('ERROR: <Activity %s>.GetJoinedBuddies(): %s',
- self.object_path, e)
- self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_BUDDIES,
- '!')
-
- def _on_new_channel(self, channel):
- if self.channels is None:
- return
- if channel.startswith(self.full_conn):
- channel = '...' + channel[len(self.full_conn):]
- self.ps_watcher.log('INFO: Activity %s emitted NewChannel("%s") '
- 'or mentioned the channel in GetChannels()',
- self.object_path, channel)
- self.channels.append(channel)
- # FIXME: listen for Telepathy Closed signal!
- self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_CHANNELS,
- ' '.join(self.channels))
-
- def _on_get_channels_success(self, service, conn, channels):
- self.full_conn = conn
- if conn.startswith('/org/freedesktop/Telepathy/Connection/'):
- self.conn = '.../' + conn[38:]
- else:
- self.conn = conn
- self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_CONN,
- self.conn)
- self.channels = []
- for channel in channels:
- self._on_new_channel(channel)
- self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_CHANNELS,
- ' '.join(self.channels))
-
- def _on_get_channels_failure(self, e):
- self.ps_watcher.log('ERROR: <Activity %s>.GetChannels(): %s',
- self.object_path, e)
- self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_CONN,
- '!')
- self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_CHANNELS,
- '!')
-
- def _on_get_id_success(self, ident):
- self.id = ident
- self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_ID, ident)
-
- def _on_get_id_failure(self, e):
- self.ps_watcher.log('ERROR: <Activity %s>.GetId(): %s',
- self.object_path, e)
- self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_ID,
- '!')
-
- def _on_get_color_success(self, color):
- self.color = color
- self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_COLOR,
- color)
-
- def _on_get_color_failure(self, e):
- self.ps_watcher.log('ERROR: <Activity %s>.GetColor(): %s',
- self.object_path, e)
- self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_COLOR,
- '!')
-
- def _on_get_type_success(self, type_):
- self.type = type_
- self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_TYPE,
- type_)
-
- def _on_get_type_failure(self, e):
- self.ps_watcher.log('ERROR: <Activity %s>.GetType(): %s',
- self.object_path, e)
- self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_TYPE,
- '!')
-
- def _on_get_name_success(self, name):
- self.name = name
- self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_NAME,
- name)
-
- def _on_get_name_failure(self, e):
- self.ps_watcher.log('ERROR: <Activity %s>.GetName(): %s',
- self.object_path, e)
- self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_NAME,
- '!')
-
- def _finish_appearing(self):
- self.appearing = False
- self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_WEIGHT,
- 400)
- return False
-
- def disappear(self):
- self.disappearing = True
- self.ps_watcher.activities_list_store.set(self.iter, ACT_COL_STRIKE,
- True)
- timeout_add(5000, self._finish_disappearing)
-
- def _finish_disappearing(self):
- self.ps_watcher.remove_activity(self)
- return False
-
-
-class BuddyWatcher(object):
-
- def __init__(self, ps_watcher, object_path):
- self.ps_watcher = ps_watcher
- self.bus = ps_watcher.bus
- self.proxy = self.bus.get_object(self.ps_watcher.unique_name,
- object_path)
- self.iface = dbus.Interface(self.proxy, BUDDY_IFACE)
- self.object_path = object_path
- self.appearing = True
- self.disappearing = False
- timeout_add(5000, self._finish_appearing)
-
- self.nick = '?'
- self.owner = False
- self.color = '?'
- self.ipv4 = '?'
- self.cur_act = '?'
- self.keyid = '?'
- self.activities = None
- self.handles = None
-
- self.iter = self.ps_watcher.add_buddy(self)
-
- self.iface.connect_to_signal('PropertyChanged', self._on_props_changed,
- byte_arrays=True)
- self.ps_watcher.log('Calling <Buddy %s>.GetProperties()', object_path)
- self.iface.GetProperties(reply_handler=self._on_get_props_success,
- error_handler=self._on_get_props_failure,
- byte_arrays=True)
-
- self.iface.connect_to_signal('JoinedActivity', self._on_joined)
- self.iface.connect_to_signal('LeftActivity', self._on_left)
- self.ps_watcher.log('Calling <Buddy %s>.GetJoinedActivities()',
- object_path)
- self.iface.GetJoinedActivities(reply_handler=self._on_get_acts_success,
- error_handler=self._on_get_acts_failure)
-
- self.iface.connect_to_signal('TelepathyHandleAdded',
- self._on_handle_added)
- self.iface.connect_to_signal('TelepathyHandleRemoved',
- self._on_handle_removed)
- self.ps_watcher.log('Calling <Buddy %s>.GetTelepathyHandles()',
- object_path)
- self.iface.GetTelepathyHandles(
- reply_handler=self._on_get_handles_success,
- error_handler=self._on_get_handles_failure)
-
- def _on_handle_added(self, service, conn, handle):
- if self.handles is None:
- return
- self.ps_watcher.log('INFO: Buddy %s emitted Telepathy HandleAdded('
- '"%s", "%s", %u) or mentioned the handle in '
- 'GetTelepathyHandles()',
- self.object_path, service, conn, handle)
- if conn.startswith('/org/freedesktop/Telepathy/Connection/'):
- conn = '.../' + conn[38:]
- self.handles.append('%u@%s' % (handle, conn))
- self.ps_watcher.buddies_list_store.set(self.iter,
- BUDDY_COL_HANDLES,
- ' '.join(self.handles))
-
- def _on_handle_removed(self, service, conn, handle):
- if self.handles is None:
- return
- if conn.startswith('/org/freedesktop/Telepathy/Connection/'):
- conn = '.../' + conn[38:]
- self.ps_watcher.log('INFO: Buddy %s emitted HandleRemoved("%s", '
- '"%s", %u)', self.object_path, service, conn,
- handle)
- try:
- self.handles.remove('%u@%s' % (handle, conn))
- except ValueError:
- pass
- self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_HANDLES,
- ' '.join(self.handles))
-
- def _on_get_handles_success(self, handles):
- self.handles = []
- for service, conn, handle in handles:
- self._on_handle_added(service, conn, handle)
-
- def _on_get_handles_failure(self, e):
- self.ps_watcher.log('ERROR: <Buddy %s>.GetTelepathyHandles(): %s',
- self.object_path, e)
- self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_HANDLES,
- '!')
-
- def _on_joined(self, act):
- if self.activities is None:
- return
- if act.startswith('/org/laptop/Sugar/Presence/Activities/'):
- act = '.../' + act[38:]
- self.ps_watcher.log('INFO: Buddy %s emitted ActivityJoined("%s") '
- 'or mentioned it in GetJoinedActivities()',
- self.object_path, act)
- self.activities.append(act)
- self.ps_watcher.buddies_list_store.set(self.iter,
- BUDDY_COL_ACTIVITIES,
- ' '.join(self.activities))
-
- def _on_left(self, act):
- if self.activities is None:
- return
- if act.startswith('/org/laptop/Sugar/Presence/Activities/'):
- act = '.../' + act[38:]
- self.ps_watcher.log('INFO: Buddy %s emitted ActivityLeft("%s")',
- self.object_path, act)
- try:
- self.activities.remove(act)
- except ValueError:
- pass
- self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_ACTIVITIES,
- ' '.join(self.activities))
-
- def _on_get_acts_success(self, activities):
- self.activities = []
- for act in activities:
- self._on_joined(act)
-
- def _on_get_acts_failure(self, e):
- self.ps_watcher.log('ERROR: <Buddy %s>.GetJoinedActivities(): %s',
- self.object_path, e)
- self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_ACTIVITIES,
- '!')
-
- def _on_props_changed(self, props):
- try:
- logger.debug('PropertyChanged(%s, %s)', self, props)
- self.ps_watcher.log('INFO: <Buddy %s> emitted PropertyChanged(%r)',
- self.object_path, props)
- self._props_changed(props)
- except Exception, e:
- self.ps_watcher.log('INTERNAL ERROR: %s', e)
-
- def _on_get_props_success(self, props):
- try:
- logger.debug('GetProperties(%s, %s)', self, props)
- self.ps_watcher.log('INFO: <Buddy %s>.GetProperties() -> %r',
- self.object_path, props)
- self._props_changed(props)
- except Exception, e:
- self.ps_watcher.log('INTERNAL ERROR: %s', e)
-
- def _props_changed(self, props):
- logger.debug('Begin _props_changed')
- if 'nick' in props:
- self.nick = props.get('nick', '?')
- self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_NICK,
- self.nick)
- if 'owner' in props:
- self.owner = bool(props.get('owner', False))
- self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_OWNER,
- self.owner)
- if 'color' in props:
- self.color = props.get('color', '?')
- self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_COLOR,
- self.color)
- if 'ip4-address' in props:
- self.ipv4 = props.get('ip4-address', '?')
- self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_IP4,
- self.ipv4)
- if 'current-activity' in props:
- self.cur_act = props.get('current-activity', '?')
- self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_CUR_ACT,
- self.cur_act)
- if 'key' in props:
- key = props.get('key', None)
- if key:
- self.keyid = '%d bytes, sha1 %s' % (len(key),
- sha1(key).hexdigest())
- else:
- # could be '' (present, empty value) or None (absent). Either way:
- self.keyid = '?'
- self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_KEY_ID,
- self.keyid)
- logger.debug('End _props_changed')
-
- def _on_get_props_failure(self, e):
- self.ps_watcher.log('ERROR: <Buddy %s>.GetProperties(): %s',
- self.object_path, e)
- self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_NICK, '!')
- self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_OWNER,
- False)
- self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_COLOR, '!')
- self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_IP4, '!')
- self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_CUR_ACT,
- '!')
- self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_KEY_ID,
- '!')
-
- def _finish_appearing(self):
- self.appearing = False
- self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_WEIGHT,
- 400)
- return False
-
- def disappear(self):
- self.disappearing = True
- self.ps_watcher.buddies_list_store.set(self.iter, BUDDY_COL_STRIKE,
- True)
- timeout_add(5000, self._finish_disappearing)
-
- def _finish_disappearing(self):
- self.ps_watcher.remove_buddy(self)
- return False
-
-
-class PresenceServiceWatcher(VBox):
-
- def __init__(self, bus, unique_name, log):
- VBox.__init__(self)
-
- self.bus = bus
- self.unique_name = unique_name
- self.proxy = bus.get_object(unique_name, PS_PATH)
- self.iface = dbus.Interface(self.proxy, PS_IFACE)
- self.log = log
-
- self.activities = None
- self.iface.connect_to_signal('ActivityAppeared',
- self._on_activity_appeared)
- self.iface.connect_to_signal('ActivityDisappeared',
- self._on_activity_disappeared)
- self.iface.GetActivities(reply_handler=self._on_get_activities_success,
- error_handler=self._on_get_activities_failure)
-
- self.buddies = None
- self.iface.connect_to_signal('BuddyAppeared',
- self._on_buddy_appeared)
- self.iface.connect_to_signal('BuddyDisappeared',
- self._on_buddy_disappeared)
- self.iface.GetBuddies(reply_handler=self._on_get_buddies_success,
- error_handler=self._on_get_buddies_failure)
-
- # keep this in sync with the ACT_COL_ constants
- self.activities_list_store = ListStore(str, # object path
- int, # weight (bold if new)
- bool, # strikethrough (dead)
- str, # ID
- str, # color
- str, # type
- str, # name
- str, # conn
- str, # channels
- str, # buddies
- )
-
- self.pack_start(Label('Activities:'), False, False)
-
- self.activities_list = TreeView(self.activities_list_store)
- c = self.activities_list.insert_column_with_attributes(0,
- 'Object path', CellRendererText(), text=ACT_COL_PATH,
- weight=ACT_COL_WEIGHT, strikethrough=ACT_COL_STRIKE)
- c.set_resizable(True)
- c.set_sort_column_id(ACT_COL_PATH)
- c = self.activities_list.insert_column_with_attributes(1, 'ID',
- CellRendererText(), text=ACT_COL_ID,
- weight=ACT_COL_WEIGHT, strikethrough=ACT_COL_STRIKE)
- c.set_resizable(True)
- c.set_sort_column_id(ACT_COL_ID)
- c = self.activities_list.insert_column_with_attributes(2, 'Color',
- CellRendererText(), text=ACT_COL_COLOR,
- weight=ACT_COL_WEIGHT, strikethrough=ACT_COL_STRIKE)
- c.set_resizable(True)
- c.set_sort_column_id(ACT_COL_COLOR)
- c = self.activities_list.insert_column_with_attributes(3, 'Type',
- CellRendererText(), text=ACT_COL_TYPE, weight=ACT_COL_WEIGHT,
- strikethrough=ACT_COL_STRIKE)
- c.set_resizable(True)
- c.set_sort_column_id(ACT_COL_TYPE)
- c = self.activities_list.insert_column_with_attributes(4, 'Name',
- CellRendererText(), text=ACT_COL_NAME, weight=ACT_COL_WEIGHT,
- strikethrough=ACT_COL_STRIKE)
- c.set_resizable(True)
- c.set_sort_column_id(ACT_COL_NAME)
- c = self.activities_list.insert_column_with_attributes(5, 'Connection',
- CellRendererText(), text=ACT_COL_CONN, weight=ACT_COL_WEIGHT,
- strikethrough=ACT_COL_STRIKE)
- c.set_resizable(True)
- c.set_sort_column_id(ACT_COL_CONN)
- c = self.activities_list.insert_column_with_attributes(6, 'Channels',
- CellRendererText(), text=ACT_COL_CHANNELS, weight=ACT_COL_WEIGHT,
- strikethrough=ACT_COL_STRIKE)
- c.set_resizable(True)
- c = self.activities_list.insert_column_with_attributes(7, 'Buddies',
- CellRendererText(), text=ACT_COL_BUDDIES, weight=ACT_COL_WEIGHT,
- strikethrough=ACT_COL_STRIKE)
- c.set_resizable(True)
-
- scroller = ScrolledWindow()
- scroller.add(self.activities_list)
- self.pack_start(scroller)
-
- # keep this in sync with the BUDDY_COL_ constants
- self.buddies_list_store = ListStore(str, int, bool, str, bool,
- str, str, str, str, str, str)
-
- self.pack_start(Label('Buddies:'), False, False)
- self.buddies_list = TreeView(self.buddies_list_store)
- c = self.buddies_list.insert_column_with_attributes(0, 'Object path',
- CellRendererText(), text=BUDDY_COL_PATH,
- weight=BUDDY_COL_WEIGHT, strikethrough=BUDDY_COL_STRIKE)
- c.set_resizable(True)
- c.set_sort_column_id(BUDDY_COL_PATH)
- c = self.buddies_list.insert_column_with_attributes(1, 'Pubkey',
- CellRendererText(), text=BUDDY_COL_KEY_ID,
- weight=BUDDY_COL_WEIGHT, strikethrough=BUDDY_COL_STRIKE)
- c.set_resizable(True)
- c.set_sort_column_id(BUDDY_COL_KEY_ID)
- c = self.buddies_list.insert_column_with_attributes(2, 'Nick',
- CellRendererText(), text=BUDDY_COL_NICK,
- weight=BUDDY_COL_WEIGHT, strikethrough=BUDDY_COL_STRIKE)
- c.set_resizable(True)
- c.set_sort_column_id(BUDDY_COL_NICK)
- c = self.buddies_list.insert_column_with_attributes(3, 'Owner',
- CellRendererToggle(), active=BUDDY_COL_OWNER)
- c = self.buddies_list.insert_column_with_attributes(4, 'Color',
- CellRendererText(), text=BUDDY_COL_COLOR,
- weight=BUDDY_COL_WEIGHT, strikethrough=BUDDY_COL_STRIKE)
- c.set_resizable(True)
- c.set_sort_column_id(BUDDY_COL_OWNER)
- c = self.buddies_list.insert_column_with_attributes(5, 'IPv4',
- CellRendererText(), text=BUDDY_COL_IP4,
- weight=BUDDY_COL_WEIGHT, strikethrough=BUDDY_COL_STRIKE)
- c.set_resizable(True)
- c.set_sort_column_id(BUDDY_COL_IP4)
- c = self.buddies_list.insert_column_with_attributes(6, 'CurAct',
- CellRendererText(), text=BUDDY_COL_CUR_ACT,
- weight=BUDDY_COL_WEIGHT, strikethrough=BUDDY_COL_STRIKE)
- c.set_resizable(True)
- c.set_sort_column_id(BUDDY_COL_CUR_ACT)
- c = self.buddies_list.insert_column_with_attributes(7, 'Activities',
- CellRendererText(), text=BUDDY_COL_ACTIVITIES,
- weight=BUDDY_COL_WEIGHT, strikethrough=BUDDY_COL_STRIKE)
- c.set_resizable(True)
- c.set_sort_column_id(BUDDY_COL_ACTIVITIES)
- c = self.buddies_list.insert_column_with_attributes(8, 'Handles',
- CellRendererText(), text=BUDDY_COL_HANDLES,
- weight=BUDDY_COL_WEIGHT, strikethrough=BUDDY_COL_STRIKE)
- c.set_resizable(True)
- c.set_sort_column_id(BUDDY_COL_HANDLES)
-
- scroller = ScrolledWindow()
- scroller.add(self.buddies_list)
- self.pack_start(scroller)
-
- self.iface.connect_to_signal('ActivityInvitation',
- self._on_activity_invitation)
- self.iface.connect_to_signal('PrivateInvitation',
- self._on_private_invitation)
-
- def _on_get_activities_success(self, paths):
- self.log('INFO: PS GetActivities() returned %r', paths)
- self.activities = {}
- for path in paths:
- self.activities[path] = ActivityWatcher(self, path)
-
- def _on_get_activities_failure(self, e):
- self.log('ERROR: PS GetActivities() failed with %s', e)
-
- def add_activity(self, act):
- path = act.object_path
- if path.startswith('/org/laptop/Sugar/Presence/Activities/'):
- path = '.../' + path[38:]
- return self.activities_list_store.append((path, 700, False,
- act.id, act.color, act.type, act.name, act.conn, '?', '?'))
-
- def remove_activity(self, act):
- self.activities.pop(act.object_path, None)
- self.activities_list_store.remove(act.iter)
-
- def _on_activity_appeared(self, path):
- if self.activities is None:
- return
- self.log('INFO: PS emitted ActivityAppeared("%s")', path)
- self.activities[path] = ActivityWatcher(self, path)
-
- def _on_activity_disappeared(self, path):
- if self.activities is None:
- return
- self.log('INFO: PS emitted ActivityDisappeared("%s")', path)
- act = self.activities.get(path)
- if act is None:
- self.log('WARNING: Trying to remove activity "%s" which is '
- 'already absent', path)
- else:
- # we don't remove the activity straight away, just cross it out
- act.disappear()
-
- def _on_activity_invitation(self, path):
- self.log('INFO: PS emitted ActivityInvitation("%s")', path)
-
- def _on_private_invitation(self, bus_name, conn, channel):
- self.log('INFO: PS emitted PrivateInvitation("%s", "%s", "%s")',
- bus_name, conn, channel)
-
- def _on_get_buddies_success(self, paths):
- self.log('INFO: PS GetBuddies() returned %r', paths)
- self.buddies = {}
- for path in paths:
- self.buddies[path] = BuddyWatcher(self, path)
-
- def _on_get_buddies_failure(self, e):
- self.log('ERROR: PS GetBuddies() failed with %s', e)
-
- def add_buddy(self, b):
- path = b.object_path
- if path.startswith('/org/laptop/Sugar/Presence/Buddies/'):
- path = '.../' + path[35:]
- return self.buddies_list_store.append((path, 700, False,
- b.nick, b.owner, b.color, b.ipv4, b.cur_act, b.keyid,
- '?', '?'))
-
- def remove_buddy(self, b):
- self.buddies.pop(b.object_path, None)
- self.buddies_list_store.remove(b.iter)
-
- def _on_buddy_appeared(self, path):
- if self.buddies is None:
- return
- self.log('INFO: PS emitted BuddyAppeared("%s")', path)
- self.buddies[path] = BuddyWatcher(self, path)
-
- def _on_buddy_disappeared(self, path):
- if self.buddies is None:
- return
- self.log('INFO: PS emitted BuddyDisappeared("%s")', path)
- b = self.buddies.get(path)
- if b is None:
- self.log('ERROR: Trying to remove buddy "%s" which is already '
- 'absent', path)
- else:
- # we don't remove the activity straight away, just cross it out
- b.disappear()
-
-
-class PresenceServiceNameWatcher(VBox):
-
- def __init__(self, bus):
- VBox.__init__(self)
-
- self.bus = bus
-
- logger.debug('Running...')
- self.label = Label('Looking for Presence Service...')
- self.errors = ListStore(str)
-
- errors_tree = TreeView(model=self.errors)
- errors_tree.insert_column_with_attributes(0, 'Log', CellRendererText(),
- text=0)
- scroller = ScrolledWindow()
- scroller.add(errors_tree)
-
- self.paned = VPaned()
- self.paned.pack1(scroller)
-
- self.pack_start(self.label, False, False)
- self.pack_end(self.paned)
-
- bus.watch_name_owner(PS_NAME, self.on_name_owner_change)
- self.ps_watcher = Label('-')
- self.paned.pack2(self.ps_watcher)
-
- self.show_all()
-
- def log(self, format, *args):
- self.errors.append((format % args,))
-
- def on_name_owner_change(self, owner):
- try:
- if owner:
- self.label.set_text('Presence Service running: unique name %s'
- % owner)
- if self.ps_watcher is not None:
- self.paned.remove(self.ps_watcher)
- self.ps_watcher = PresenceServiceWatcher(self.bus, owner,
- self.log)
- self.paned.pack2(self.ps_watcher)
- self.show_all()
- else:
- self.label.set_text('Presence Service not running')
- if self.ps_watcher is not None:
- self.paned.remove(self.ps_watcher)
- self.ps_watcher = Label('-')
- self.paned.pack2(self.ps_watcher)
- except Exception, e:
- self.log('ERROR: %s', e)
diff --git a/treeview.py b/treeview.py
deleted file mode 100644
index 5f5dc96..0000000
--- a/treeview.py
+++ /dev/null
@@ -1,73 +0,0 @@
-# Copyright (C) 2007, Eduardo Silva <edsiper@gmail.com>
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the
-# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-import gtk
-
-class TreeView(gtk.ScrolledWindow):
- iters = [] # Iters index
-
- # Create a window with a treeview object
- #
- # cols = List of dicts, ex:
- #
- # cols = []
- # cols.append({'index': integer_index_position, 'name': string_col_name})
- def __init__(self, cols_def, cols_name):
- gtk.ScrolledWindow.__init__(self)
-
- self._iters = []
- self._treeview = gtk.TreeView()
-
- # Creating column data types
- self._store = gtk.TreeStore(*cols_def)
-
- # Columns definition
- cell = gtk.CellRendererText()
- tv_cols = []
-
- i=0
- for col in cols_name:
- col_tv = gtk.TreeViewColumn(col['name'], cell, text=i)
- col_tv.set_reorderable(True)
- col_tv.set_resizable(True)
- tv_cols.append(col_tv)
- i+=1
-
- # Setting treeview properties
- self._treeview.set_model(self._store)
- self._treeview.set_enable_search(True)
- self._treeview.set_rules_hint(True)
-
- for col in tv_cols:
- self._treeview.append_column(col)
- self.add(self._treeview)
-
- def add_row(self, cols_data):
- iter = self._store.insert_after(None, None)
- for col in cols_data:
- print col['index'],col['info']
- self._store.set_value(iter, int(col['index']) , col['info'])
-
- self.iters.append(iter)
- return iter
-
- def update_row(self, iter, cols_data):
- for col in cols_data:
- self._store.set_value(iter, int(col['index']) , str(col['info']))
-
- def remove_row(self, iter):
- self._store.remove(iter)