Initial model and totems code
This commit is contained in:
parent
343761bd8c
commit
aba40b2fd9
@ -11,6 +11,7 @@ import gtk
|
|||||||
import geckoembed
|
import geckoembed
|
||||||
|
|
||||||
from sugar.shell import activity
|
from sugar.shell import activity
|
||||||
|
from sugar.p2p.Group import LocalGroup
|
||||||
import sugar.env
|
import sugar.env
|
||||||
|
|
||||||
class AddressToolbar(gtk.Toolbar):
|
class AddressToolbar(gtk.Toolbar):
|
||||||
@ -88,11 +89,12 @@ class AddressEntry(gtk.HBox):
|
|||||||
self.set_folded(True)
|
self.set_folded(True)
|
||||||
|
|
||||||
class NavigationToolbar(gtk.Toolbar):
|
class NavigationToolbar(gtk.Toolbar):
|
||||||
def __init__(self, embed):
|
def __init__(self, browser):
|
||||||
gtk.Toolbar.__init__(self)
|
gtk.Toolbar.__init__(self)
|
||||||
self.embed = embed
|
self._browser = browser
|
||||||
|
self._embed = self._browser.get_embed()
|
||||||
|
|
||||||
self.set_style(gtk.TOOLBAR_ICONS)
|
self.set_style(gtk.TOOLBAR_BOTH_HORIZ)
|
||||||
|
|
||||||
self.back = gtk.ToolButton(gtk.STOCK_GO_BACK)
|
self.back = gtk.ToolButton(gtk.STOCK_GO_BACK)
|
||||||
self.back.connect("clicked", self.__go_back_cb)
|
self.back.connect("clicked", self.__go_back_cb)
|
||||||
@ -113,7 +115,9 @@ class NavigationToolbar(gtk.Toolbar):
|
|||||||
self.insert(separator, -1)
|
self.insert(separator, -1)
|
||||||
separator.show()
|
separator.show()
|
||||||
|
|
||||||
share = gtk.ToolButton("Share")
|
share = gtk.ToolButton(None, "Share")
|
||||||
|
share.set_icon_name('stock_shared-by-me')
|
||||||
|
share.set_is_important(True)
|
||||||
share.connect("clicked", self.__share_cb)
|
share.connect("clicked", self.__share_cb)
|
||||||
self.insert(share, -1)
|
self.insert(share, -1)
|
||||||
share.show()
|
share.show()
|
||||||
@ -128,34 +132,40 @@ class NavigationToolbar(gtk.Toolbar):
|
|||||||
|
|
||||||
self._update_sensitivity()
|
self._update_sensitivity()
|
||||||
|
|
||||||
self.embed.connect("location", self.__location_changed)
|
self._embed.connect("location", self.__location_changed)
|
||||||
|
|
||||||
def _update_sensitivity(self):
|
def _update_sensitivity(self):
|
||||||
self.back.set_sensitive(self.embed.can_go_back())
|
self.back.set_sensitive(self._embed.can_go_back())
|
||||||
self.forward.set_sensitive(self.embed.can_go_forward())
|
self.forward.set_sensitive(self._embed.can_go_forward())
|
||||||
|
|
||||||
def __go_back_cb(self, button):
|
def __go_back_cb(self, button):
|
||||||
self.embed.go_back()
|
self._embed.go_back()
|
||||||
|
|
||||||
def __go_forward_cb(self, button):
|
def __go_forward_cb(self, button):
|
||||||
self.embed.go_forward()
|
self._embed.go_forward()
|
||||||
|
|
||||||
def __reload_cb(self, button):
|
def __reload_cb(self, button):
|
||||||
self.embed.reload()
|
self._embed.reload()
|
||||||
|
|
||||||
def __share_cb(self, button):
|
def __share_cb(self, button):
|
||||||
pass
|
self._browser.share()
|
||||||
|
|
||||||
def __location_changed(self, embed):
|
def __location_changed(self, embed):
|
||||||
self._update_sensitivity()
|
self._update_sensitivity()
|
||||||
|
|
||||||
def __open_address_cb(self, address):
|
def __open_address_cb(self, address):
|
||||||
self.embed.load_address(address)
|
self._embed.load_address(address)
|
||||||
|
|
||||||
class BrowserActivity(activity.Activity):
|
class BrowserActivity(activity.Activity):
|
||||||
def __init__(self, uri):
|
def __init__(self, group, uri):
|
||||||
activity.Activity.__init__(self)
|
activity.Activity.__init__(self)
|
||||||
self.uri = uri
|
self.uri = uri
|
||||||
|
self._group = group
|
||||||
|
|
||||||
|
def _setup_shared(self, uri):
|
||||||
|
self._model = self._group.get_store().get_model(uri)
|
||||||
|
if self._model:
|
||||||
|
print self._model.get_value('current_address')
|
||||||
|
|
||||||
def activity_on_connected_to_shell(self):
|
def activity_on_connected_to_shell(self):
|
||||||
self.activity_set_ellipsize_tab(True)
|
self.activity_set_ellipsize_tab(True)
|
||||||
@ -173,7 +183,7 @@ class BrowserActivity(activity.Activity):
|
|||||||
self.embed.show()
|
self.embed.show()
|
||||||
self.embed.load_address(self.uri)
|
self.embed.load_address(self.uri)
|
||||||
|
|
||||||
nav_toolbar = NavigationToolbar(self.embed)
|
nav_toolbar = NavigationToolbar(self)
|
||||||
vbox.pack_start(nav_toolbar, False)
|
vbox.pack_start(nav_toolbar, False)
|
||||||
nav_toolbar.show()
|
nav_toolbar.show()
|
||||||
|
|
||||||
@ -186,6 +196,17 @@ class BrowserActivity(activity.Activity):
|
|||||||
def get_embed(self):
|
def get_embed(self):
|
||||||
return self.embed
|
return self.embed
|
||||||
|
|
||||||
|
def share(self):
|
||||||
|
address = self.embed.get_address()
|
||||||
|
self._model = self._group.get_store().create_model(address)
|
||||||
|
self._model.set_value('current_address', address)
|
||||||
|
|
||||||
|
bus = dbus.SessionBus()
|
||||||
|
proxy_obj = bus.get_object('com.redhat.Sugar.Chat', '/com/redhat/Sugar/Chat')
|
||||||
|
chat_shell = dbus.Interface(proxy_obj, 'com.redhat.Sugar.ChatShell')
|
||||||
|
chat_shell.send_message('<richtext><link href="' + address + '">' +
|
||||||
|
self.embed.get_title() + '</link></richtext>')
|
||||||
|
|
||||||
def __title_cb(self, embed):
|
def __title_cb(self, embed):
|
||||||
self.activity_set_tab_text(embed.get_title())
|
self.activity_set_tab_text(embed.get_title())
|
||||||
|
|
||||||
@ -249,6 +270,7 @@ class BrowserShell(dbus.service.Object):
|
|||||||
dbus.service.Object.__init__(self, bus_name, object_path)
|
dbus.service.Object.__init__(self, bus_name, object_path)
|
||||||
|
|
||||||
self.__browsers = []
|
self.__browsers = []
|
||||||
|
self._group = LocalGroup()
|
||||||
|
|
||||||
def open_web_activity(self):
|
def open_web_activity(self):
|
||||||
web_activity = WebActivity()
|
web_activity = WebActivity()
|
||||||
@ -267,7 +289,7 @@ class BrowserShell(dbus.service.Object):
|
|||||||
|
|
||||||
@dbus.service.method('com.redhat.Sugar.BrowserShell')
|
@dbus.service.method('com.redhat.Sugar.BrowserShell')
|
||||||
def open_browser(self, uri):
|
def open_browser(self, uri):
|
||||||
browser = BrowserActivity(uri)
|
browser = BrowserActivity(self._group, uri)
|
||||||
self.__browsers.append(browser)
|
self.__browsers.append(browser)
|
||||||
browser.activity_connect_to_shell()
|
browser.activity_connect_to_shell()
|
||||||
|
|
||||||
|
@ -387,12 +387,12 @@ class ChatShell(dbus.service.Object):
|
|||||||
dbus.service.Object.__init__(self, bus_name, object_path)
|
dbus.service.Object.__init__(self, bus_name, object_path)
|
||||||
|
|
||||||
def open_group_chat(self):
|
def open_group_chat(self):
|
||||||
group_chat = GroupChat()
|
self._group_chat = GroupChat()
|
||||||
group_chat.activity_connect_to_shell()
|
self._group_chat.activity_connect_to_shell()
|
||||||
|
|
||||||
@dbus.service.method('com.redhat.Sugar.ChatShell')
|
@dbus.service.method('com.redhat.Sugar.ChatShell')
|
||||||
def send_message(self, message):
|
def send_message(self, message):
|
||||||
pass
|
self._group_chat.send_message(message)
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
ChatShell.get_instance().open_group_chat()
|
ChatShell.get_instance().open_group_chat()
|
||||||
|
@ -3,6 +3,7 @@ import avahi
|
|||||||
import presence
|
import presence
|
||||||
from Buddy import *
|
from Buddy import *
|
||||||
from Service import *
|
from Service import *
|
||||||
|
import Model
|
||||||
|
|
||||||
SERVICE_ADDED = "service_added"
|
SERVICE_ADDED = "service_added"
|
||||||
SERVICE_REMOVED = "service_removed"
|
SERVICE_REMOVED = "service_removed"
|
||||||
@ -14,6 +15,10 @@ class Group:
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._service_listeners = []
|
self._service_listeners = []
|
||||||
self._presence_listeners = []
|
self._presence_listeners = []
|
||||||
|
self._store = Model.Store(self)
|
||||||
|
|
||||||
|
def get_store(self):
|
||||||
|
return self._store
|
||||||
|
|
||||||
def join(self, buddy):
|
def join(self, buddy):
|
||||||
pass
|
pass
|
||||||
|
76
sugar/p2p/Model.py
Normal file
76
sugar/p2p/Model.py
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
MODEL_SERVICE_TYPE = "_olpc_model._tcp"
|
||||||
|
MODEL_SERVICE_PORT = 6300
|
||||||
|
|
||||||
|
class RemoteModel:
|
||||||
|
def __init__(self, service):
|
||||||
|
self._service = service
|
||||||
|
|
||||||
|
addr = "http://%s:%d" % (service.get_address(), service.get_port())
|
||||||
|
self._client = xmlrpclib.ServerProxy(addr)
|
||||||
|
|
||||||
|
def get_value(self, key):
|
||||||
|
self._client.get_value(key)
|
||||||
|
|
||||||
|
def set_value(self, key, value):
|
||||||
|
self._client.set_value(key, value)
|
||||||
|
|
||||||
|
class ModelRequestHandler(object):
|
||||||
|
def __init__(self, model):
|
||||||
|
self._model = model
|
||||||
|
|
||||||
|
def get_value(self, key):
|
||||||
|
return self._model.get_value(key)
|
||||||
|
|
||||||
|
def set_value(self, key, value):
|
||||||
|
return self._model.set_value(key, value)
|
||||||
|
|
||||||
|
class LocalModel:
|
||||||
|
def __init__(self, model_id):
|
||||||
|
self._model_id = model_id
|
||||||
|
self._values = {}
|
||||||
|
|
||||||
|
def get_value(self, key):
|
||||||
|
return self._values[key]
|
||||||
|
|
||||||
|
def set_value(self, key, value):
|
||||||
|
self._values[key] = value
|
||||||
|
|
||||||
|
def _setup_service(self):
|
||||||
|
service = Service(self._model_id, MODEL_SERVICE_TYPE,
|
||||||
|
'', MODEL_SERVICE_PORT)
|
||||||
|
self._setup_server(service)
|
||||||
|
|
||||||
|
# FIXME this is duplicated with StreamReader
|
||||||
|
def _setup_server(self, service):
|
||||||
|
started = False
|
||||||
|
tries = 10
|
||||||
|
port = service.get_port()
|
||||||
|
while not started and tries > 0:
|
||||||
|
try:
|
||||||
|
p2p_server = network.GlibXMLRPCServer(("", port))
|
||||||
|
p2p_server.register_instance(StreamReaderRequestHandler(self))
|
||||||
|
started = True
|
||||||
|
except:
|
||||||
|
port = port + 1
|
||||||
|
tries = tries - 1
|
||||||
|
service.set_port(port)
|
||||||
|
|
||||||
|
class Store:
|
||||||
|
def __init__(self, group):
|
||||||
|
self._group = group
|
||||||
|
self._local_models = {}
|
||||||
|
|
||||||
|
def create_model(self, model_id):
|
||||||
|
model = LocalModel(model_id)
|
||||||
|
self._local_models[model_id] = model
|
||||||
|
return model
|
||||||
|
|
||||||
|
def get_model(self, model_id):
|
||||||
|
if self._local_models.has_key(model_id):
|
||||||
|
return self._local_models(model_id)
|
||||||
|
else:
|
||||||
|
service = self._group.get_service(model_id, MODEL_SERVICE_TYPE)
|
||||||
|
if service:
|
||||||
|
return RemoteModel(service)
|
||||||
|
else:
|
||||||
|
return None
|
Loading…
Reference in New Issue
Block a user