From 59f25b07418e5f1143d9ddf94b5497ca9436f8d9 Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Thu, 22 Jun 2006 22:07:54 +0000 Subject: Get one-to-one chat to actually work... --- (limited to 'sugar') diff --git a/sugar/chat/BuddyChat.py b/sugar/chat/BuddyChat.py index 6d4633e..35b440d 100644 --- a/sugar/chat/BuddyChat.py +++ b/sugar/chat/BuddyChat.py @@ -1,15 +1,14 @@ -from sugar.activity.Activity import Activity +from sugar.chat.Chat import Chat +from sugar.p2p.Stream import Stream -class BuddyChat(Activity): +class BuddyChat(Chat): SERVICE_TYPE = "_olpc_buddy_chat._tcp" def __init__(self, service): Chat.__init__(self) - self._stream = Stream.new_from_service(service) - self._stream.set_data_listener(self._recv_message) - self._stream_writer = self._group_stream.new_writer() + self._stream = Stream.new_from_service(service, False) + self._stream_writer = self._stream.new_writer(service) - def recv_message(self, address, msg): - print msg -# Chat.recv_message(self, self._buddy, msg) + def _recv_message_cb(self, address, msg): + self.recv_message(msg) diff --git a/sugar/chat/Chat.py b/sugar/chat/Chat.py index ec51f2f..325fa7f 100644 --- a/sugar/chat/Chat.py +++ b/sugar/chat/Chat.py @@ -28,6 +28,9 @@ class Chat(gtk.VBox): def __init__(self): gtk.VBox.__init__(self, False, 6) + self._pservice = PresenceService.get_instance() + self._pservice.start() + self._stream_writer = None self.set_border_width(12) @@ -193,13 +196,16 @@ class Chat(gtk.VBox): return msg[desc_start:svg_last + len(tag_svg_end)] return None - def recv_message(self, buddy, msg): + def recv_message(self, message): """Insert a remote chat message into the chat buffer.""" + [nick, msg] = Chat.deserialize_message(message) + buddy = self._pservice.get_buddy_by_nick_name(nick) if not buddy: + logging.error('The buddy %s is not present.' % (nick)) return # FIXME a better way to compare buddies? - owner = PresenceService.get_instance().get_owner() + owner = self._pservice.get_owner() if buddy.get_nick_name() == owner.get_nick_name(): return @@ -236,5 +242,7 @@ class Chat(gtk.VBox): owner = PresenceService.get_instance().get_owner() return owner.get_nick_name() + '||' + message - def deserialize_message(self, message): + def deserialize_message(message): return message.split('||', 1) + + deserialize_message = staticmethod(deserialize_message) diff --git a/sugar/chat/GroupChat.py b/sugar/chat/GroupChat.py index a269552..a2a3352 100644 --- a/sugar/chat/GroupChat.py +++ b/sugar/chat/GroupChat.py @@ -8,8 +8,6 @@ import sugar.env class GroupChat(Chat): def __init__(self): Chat.__init__(self) - self._pservice = PresenceService.get_instance() - self._pservice.start() self._group_stream = None def _setup_stream(self, service): @@ -18,10 +16,4 @@ class GroupChat(Chat): self._stream_writer = self._group_stream.new_writer() def _group_recv_message(self, address, msg): - pservice = PresenceService.get_instance() - [nick, msg] = self.deserialize_message(msg) - buddy = pservice.get_buddy_by_nick_name(nick) - if buddy: - self.recv_message(buddy, msg) - else: - logging.error('The buddy %s is not present.' % (nick)) + self.recv_message(msg) diff --git a/sugar/presence/Buddy.py b/sugar/presence/Buddy.py index 6bbd787..c4dd0a5 100644 --- a/sugar/presence/Buddy.py +++ b/sugar/presence/Buddy.py @@ -142,8 +142,8 @@ class Buddy(gobject.GObject): for service in self._services.values(): if service.get_type() == stype and service.get_activity_id() == actid: return service - if self._services.has_key(short_stype): - return self._services[short_stype] + if self._services.has_key(stype): + return self._services[stype] return None def is_valid(self): diff --git a/sugar/presence/Service.py b/sugar/presence/Service.py index 56246bb..c82d019 100644 --- a/sugar/presence/Service.py +++ b/sugar/presence/Service.py @@ -69,9 +69,6 @@ def deserialize(sdict): stype = sdict['stype'] if type(stype) == type(u""): stype = stype.encode() - activity_id = sdict['activity_id'] - if type(activity_id) == type(u""): - activity_id = activity_id.encode() domain = sdict['domain'] if type(domain) == type(u""): domain = domain.encode() @@ -87,7 +84,18 @@ def deserialize(sdict): address = address.encode() except KeyError: pass - name = compose_service_name(name, activity_id) + + activity_id = None + try: + activity_id = sdict['activity_id'] + if type(activity_id) == type(u""): + activity_id = activity_id.encode() + except KeyError: + pass + + if activity_id is not None: + name = compose_service_name(name, activity_id) + return Service(name, stype, domain, address=address, port=port, properties=properties) @@ -152,7 +160,8 @@ class Service(object): else: sdict['name'] = dbus.Variant(self._name) sdict['stype'] = dbus.Variant(self._stype) - sdict['activity_id'] = dbus.Variant(self._activity_id) + if self._activity_id: + sdict['activity_id'] = dbus.Variant(self._activity_id) sdict['domain'] = dbus.Variant(self._domain) if self._address: sdict['address'] = dbus.Variant(self._address) -- cgit v0.9.1