Some work getting the one-to-one chat back

This commit is contained in:
Marco Pesenti Gritti 2006-06-22 15:59:38 -04:00
parent 49aa3ffcba
commit 0a305004b0
6 changed files with 114 additions and 12 deletions

View File

@ -0,0 +1,84 @@
import dbus
import random
import pygtk
pygtk.require('2.0')
import gtk
from sugar.activity.Activity import Activity
from sugar.LogWriter import LogWriter
from sugar.presence.Service import Service
from sugar.chat.BuddyChat import BuddyChat
from sugar.p2p.Stream import Stream
from sugar.presence.PresenceService import PresenceService
import sugar.env
_CHAT_ACTIVITY_TYPE = "_chat_activity_type._tcp"
class ChatActivity(Activity):
def __init__(self, service):
Activity.__init__(self, _GMAIL_ACTIVITY_TYPE)
self._service = service
def on_connected_to_shell(self):
self.set_can_close(True)
self.set_tab_icon(icon_name="im")
self.set_show_tab_icon(True)
plug = self.gtk_plug()
chat = BuddyChat(self._service)
plug.add(chat)
chat.show()
plug.show()
class ChatShellDbusService(dbus.service.Object):
def __init__(self, parent):
self._parent = parent
session_bus = dbus.SessionBus()
bus_name = dbus.service.BusName('com.redhat.Sugar.Chat', bus=session_bus)
object_path = '/com/redhat/Sugar/Chat'
dbus.service.Object.__init__(self, bus_name, object_path)
@dbus.service.method('com.redhat.Sugar.ChatShell')
def open_chat(self, message):
self._parent.send_text_message(message)
class ChatShell:
instance = None
def get_instance():
if not ChatShell.instance:
ChatShell.instance = ChatShell()
return ChatShell.instance
get_instance = staticmethod(get_instance)
def __init__(self):
self._pservice = PresenceService.get_instance()
self._pservice.start()
self._pservice.track_service_type(BuddyChat.SERVICE_TYPE)
def start(self):
port = random.randint(5000, 65535)
service = Service(sugar.env.get_nick_name(), BuddyChat.SERVICE_TYPE,
'local', '', port)
self._buddy_stream = Stream.new_from_service(service)
self._buddy_stream.set_data_listener(getattr(self, "_recv_message"))
self._pservice.register_service(service)
def _recv_message(self, address, msg):
print msg
def open_chat(self, serialized_service):
service = Service.deserialize(serialized_service)
self._chat = ChatActivity(service)
self._chat.connect_to_shell()
log_writer = LogWriter("Chat")
log_writer.start()
chat_shell = ChatShell.get_instance()
chat_shell.start()
gtk.main()

View File

@ -0,0 +1,2 @@
[Activity]
python_class = ChatActivity

View File

@ -4,6 +4,7 @@ import gtk
import gobject import gobject
from sugar.presence.PresenceService import PresenceService from sugar.presence.PresenceService import PresenceService
from sugar.chat.BuddyChat import BuddyChat
class PresenceWindow(gtk.Window): class PresenceWindow(gtk.Window):
_MODEL_COL_NICK = 0 _MODEL_COL_NICK = 0
@ -20,7 +21,6 @@ class PresenceWindow(gtk.Window):
self._pservice = PresenceService.get_instance() self._pservice = PresenceService.get_instance()
self._pservice.connect("buddy-appeared", self._on_buddy_appeared_cb) self._pservice.connect("buddy-appeared", self._on_buddy_appeared_cb)
self._pservice.connect("buddy-disappeared", self._on_buddy_disappeared_cb) self._pservice.connect("buddy-disappeared", self._on_buddy_disappeared_cb)
self._pservice.set_debug(True)
self._pservice.start() self._pservice.start()
self._setup_ui() self._setup_ui()
@ -110,11 +110,16 @@ class PresenceWindow(gtk.Window):
(model, aniter) = view.get_selection().get_selected() (model, aniter) = view.get_selection().get_selected()
chat = None chat = None
buddy = view.get_model().get_value(aniter, self._MODEL_COL_BUDDY) buddy = view.get_model().get_value(aniter, self._MODEL_COL_BUDDY)
if buddy and not self._chats.has_key(buddy): if buddy:
#chat = BuddyChat(self, buddy) chat_service = buddy.get_service_of_type(BuddyChat.SERVICE_TYPE)
#self._chats[buddy] = chat if chat_service:
#chat.connect_to_shell() bus = dbus.SessionBus()
pass proxy_obj = bus.get_object('com.redhat.Sugar.Chat', '/com/redhat/Sugar/Chat')
chat_shell = dbus.Interface(proxy_obj, 'com.redhat.Sugar.ChatShell')
serialized_service = Service.serialize(chat_service)
chat_shell.open_chat(serialized_service)
else:
print 'Could not find buddy chat'
def __buddy_icon_changed_cb(self, buddy): def __buddy_icon_changed_cb(self, buddy):
it = self._get_iter_for_buddy(buddy) it = self._get_iter_for_buddy(buddy)

15
sugar/chat/BuddyChat.py Normal file
View File

@ -0,0 +1,15 @@
from sugar.activity.Activity import Activity
class BuddyChat(Activity):
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()
def recv_message(self, address, msg):
print msg
# Chat.recv_message(self, self._buddy, msg)

View File

@ -149,6 +149,7 @@ class Buddy(gobject.GObject):
for service in self._services.values(): for service in self._services.values():
if service.get_type() == short_stype and service.get_activity_uid() == uid: if service.get_type() == short_stype and service.get_activity_uid() == uid:
return service return service
print self._services.keys()
if self._services.has_key(short_stype): if self._services.has_key(short_stype):
return self._services[short_stype] return self._services[short_stype]
return None return None

View File

@ -90,10 +90,9 @@ class PresenceService(gobject.GObject):
return PresenceService.__instance return PresenceService.__instance
get_instance = staticmethod(get_instance) get_instance = staticmethod(get_instance)
def __init__(self, debug=True): def __init__(self):
gobject.GObject.__init__(self) gobject.GObject.__init__(self)
self._debug = debug
self._lock = threading.Lock() self._lock = threading.Lock()
self._started = False self._started = False
@ -163,9 +162,6 @@ class PresenceService(gobject.GObject):
db = dbus.Interface(self._bus.get_object(avahi.DBUS_NAME, domain_browser), avahi.DBUS_INTERFACE_DOMAIN_BROWSER) db = dbus.Interface(self._bus.get_object(avahi.DBUS_NAME, domain_browser), avahi.DBUS_INTERFACE_DOMAIN_BROWSER)
db.connect_to_signal('ItemNew', self._new_domain_cb_glue) db.connect_to_signal('ItemNew', self._new_domain_cb_glue)
def set_debug(self, debug):
self._debug = debug
def get_owner(self): def get_owner(self):
"""Return the owner of this machine/instance, if we've recognized them yet.""" """Return the owner of this machine/instance, if we've recognized them yet."""
return self._owner return self._owner
@ -648,7 +644,6 @@ def main():
import pygtk, gtk import pygtk, gtk
global ps global ps
ps = PresenceService.get_instance() ps = PresenceService.get_instance()
ps.set_debug(True)
ps.start() ps.start()
gobject.timeout_add(4000, runTests) gobject.timeout_add(4000, runTests)
gtk.main() gtk.main()