Get back mesh chat (for the everyone tab)

This commit is contained in:
Marco Pesenti Gritti 2006-06-21 23:49:37 -04:00
parent e956f22597
commit 974ef81c1e
5 changed files with 82 additions and 26 deletions

View File

@ -10,7 +10,8 @@ import gobject
import sugar.util import sugar.util
from sugar.chat.ChatWindow import ChatWindow from sugar.chat.ChatWindow import ChatWindow
from sugar.chat.GroupChat import GroupChat from sugar.chat.ActivityChat import ActivityChat
from sugar.chat.MeshChat import MeshChat
from sugar.LogWriter import LogWriter from sugar.LogWriter import LogWriter
from Owner import ShellOwner from Owner import ShellOwner
@ -82,7 +83,7 @@ class ActivityHost(dbus.service.Object):
notebook.set_current_page(index) notebook.set_current_page(index)
def _create_chat(self): def _create_chat(self):
self._group_chat = GroupChat(self) self._group_chat = ActivityChat(self)
def get_chat(self): def get_chat(self):
return self._group_chat return self._group_chat
@ -323,6 +324,8 @@ class ActivityContainer(dbus.service.Object):
self._chat_wm.set_position(WindowManager.TOP) self._chat_wm.set_position(WindowManager.TOP)
self._chat_wm.manage() self._chat_wm.manage()
self._mesh_chat = MeshChat()
def show(self): def show(self):
self.window.show() self.window.show()
@ -339,6 +342,8 @@ class ActivityContainer(dbus.service.Object):
if activity: if activity:
host_chat = activity.get_chat() host_chat = activity.get_chat()
self._chat_window.set_chat(host_chat) self._chat_window.set_chat(host_chat)
else:
self._chat_window.set_chat(self._mesh_chat)
# For some reason the substitution screw up window position # For some reason the substitution screw up window position
self._chat_wm.update() self._chat_wm.update()

View File

@ -0,0 +1,26 @@
import logging
from sugar.chat.GroupChat import GroupChat
class ActivityChat(GroupChat):
SERVICE_TYPE = "_olpc_activity_chat._udp"
SERVICE_PORT = 6200
def __init__(self, activity):
GroupChat.__init__(self)
self._activity = activity
self._pservice.connect('service-appeared', self._service_appeared_cb)
self._pservice.track_service_type(ActivityChat.SERVICE_TYPE)
service = self._pservice.get_activity_service(activity, ActivityChat.SERVICE_TYPE)
if service is not None:
self._service_appeared_cb(self._pservice, None, service)
def _service_appeared_cb(self, pservice, buddy, service):
if service.get_activity_uid() == self._activity.get_id():
if service.get_type() == ActivityChat.SERVICE_TYPE:
logging.debug('Group chat service appeared, setup the stream.')
self._setup_stream(service)
def publish(self):
service = self._pservice.share_activity(self._activity,
stype = ActivityChat.SERVICE_TYPE, port = ActivityChat.SERVICE_PORT)

View File

@ -3,33 +3,14 @@ import logging
from sugar.chat.Chat import Chat from sugar.chat.Chat import Chat
from sugar.p2p.Stream import Stream from sugar.p2p.Stream import Stream
from sugar.presence.PresenceService import PresenceService from sugar.presence.PresenceService import PresenceService
import sugar.env
class GroupChat(Chat): class GroupChat(Chat):
SERVICE_TYPE = "_olpc_group_chat._udp" def __init__(self):
SERVICE_PORT = 6200
def __init__(self, activity):
Chat.__init__(self) Chat.__init__(self)
self._chats = {}
self._activity = activity
self._pservice = PresenceService.get_instance() self._pservice = PresenceService.get_instance()
self._pservice.start() self._pservice.start()
self._pservice.connect('service-appeared', self._service_appeared_cb) self._group_stream = None
self._pservice.track_service_type(GroupChat.SERVICE_TYPE)
service = self._pservice.get_activity_service(activity, GroupChat.SERVICE_TYPE)
if service is not None:
self._service_appeared_cb(self._pservice, None, service)
def _service_appeared_cb(self, pservice, buddy, service):
if service.get_activity_uid() == self._activity.get_id():
if service.get_type() == GroupChat.SERVICE_TYPE:
logging.debug('Group chat service appeared, setup the stream.')
self._setup_stream(service)
def publish(self):
service = self._pservice.share_activity(self._activity,
stype = GroupChat.SERVICE_TYPE, port = GroupChat.SERVICE_PORT)
def _setup_stream(self, service): def _setup_stream(self, service):
self._group_stream = Stream.new_from_service(service) self._group_stream = Stream.new_from_service(service)

36
sugar/chat/MeshChat.py Normal file
View File

@ -0,0 +1,36 @@
import logging
import random
from sugar.chat.GroupChat import GroupChat
from sugar.presence.Service import Service
import sugar.env
class MeshChat(GroupChat):
SERVICE_TYPE = "_olpc_mesh_chat._udp"
SERVICE_PORT = 6301
def __init__(self):
GroupChat.__init__(self)
self._pservice.connect('service-appeared', self._service_appeared_cb)
self._pservice.track_service_type(MeshChat.SERVICE_TYPE)
self._publish()
service = self._pservice.get_service(MeshChat.SERVICE_TYPE)
if service is not None:
self._service_appeared_cb(self._pservice, None, service)
def _service_appeared_cb(self, pservice, buddy, service):
if self._group_stream == None:
if service.get_type() == MeshChat.SERVICE_TYPE:
logging.debug('Mesh chat service appeared, setup the stream.')
self._setup_stream(service)
def _publish(self):
# Use random currently unassigned multicast address
address = "232.%d.%d.%d" % (random.randint(0, 254), random.randint(1, 254),
random.randint(1, 254))
service = Service(sugar.env.get_nick_name(), MeshChat.SERVICE_TYPE,
'local', address, MeshChat.SERVICE_PORT)
self._pservice.register_service(service)

View File

@ -123,6 +123,14 @@ class PresenceService(gobject.GObject):
self._server = dbus.Interface(self._bus.get_object(avahi.DBUS_NAME, self._server = dbus.Interface(self._bus.get_object(avahi.DBUS_NAME,
avahi.DBUS_PATH_SERVER), avahi.DBUS_INTERFACE_SERVER) avahi.DBUS_PATH_SERVER), avahi.DBUS_INTERFACE_SERVER)
def get_service(self, full_stype):
"""Find a particular service by full service type."""
services = self._find_service_adv(stype = full_stype)
if len(services) > 0:
return services[0]
else:
return None
def get_activity_service(self, activity, short_stype): def get_activity_service(self, activity, short_stype):
"""Find a particular service by activity and service type.""" """Find a particular service by activity and service type."""
# Decompose service type if we can # Decompose service type if we can