Some work getting the one-to-one chat back
This commit is contained in:
parent
49aa3ffcba
commit
0a305004b0
84
activities/chat/ChatActivity.py
Normal file
84
activities/chat/ChatActivity.py
Normal 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()
|
2
activities/chat/chat.activity
Normal file
2
activities/chat/chat.activity
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[Activity]
|
||||||
|
python_class = ChatActivity
|
@ -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
15
sugar/chat/BuddyChat.py
Normal 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)
|
@ -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
|
||||||
|
@ -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()
|
||||||
|
Loading…
Reference in New Issue
Block a user