Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/activity.py
diff options
context:
space:
mode:
Diffstat (limited to 'activity.py')
-rw-r--r--activity.py257
1 files changed, 164 insertions, 93 deletions
diff --git a/activity.py b/activity.py
index 8639348..1c07f73 100644
--- a/activity.py
+++ b/activity.py
@@ -14,38 +14,54 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-"""HelloWorld Activity: A case study for developing an activity."""
+"""WebSDK Activity: A studio for developing an activity."""
import gtk
+import gobject
import os
import sys
import logging
import socket
-from time import sleep
+import subprocess
from gettext import gettext as _
-#from multiprocessing import Process
from sugar.activity import activity
-from sugar.graphics.toolbarbox import ToolbarBox
-from sugar.activity.widgets import ActivityButton
-from sugar.activity.widgets import ActivityToolbox
-from sugar.activity.widgets import TitleEntry
-from sugar.activity.widgets import StopButton
-from sugar.activity.widgets import ShareButton
-from sugar.activity.widgets import KeepButton
-from sugar.activity.widgets import ToolButton
+from sugar.activity.activity import get_bundle_path
from about import AboutButton
-try:
- import webkit
-except ImportError:
+USE_GECKO=True
+if not USE_GECKO:
try:
- import webkit_local #from Agubrowser!
+ import webkit
+ from inspector import Inspector
except ImportError:
- print "You need webkit to use WebSDK."
- sys.exit(0)
-from inspector import Inspector
+ try:
+ import websdk.webkit_local as webkit
+ from websdk.inspector import Inspector
+ except ImportError:
+ print "Webkit not found"
+ USE_GECKO=True
+if USE_GECKO:
+ import hulahop
+ hulahop.startup(os.path.join(activity.get_activity_root(), 'data/gecko'))
+ from browser import Browser
+
+def sleep (t):
+ gobject.timeout_add (int (t*1000), gtk.main_quit)
+ gtk.main ()
+
+def yieldsleep(func):
+ def start(*args, **kwds):
+ iterable = func(*args, **kwds)
+ def step(*args, **kwds):
+ try:
+ time = next(iterable)
+ gobject.timeout_add_seconds(time, step)
+ except StopIteration:
+ pass
+ gobject.idle_add(step)
+ return start
def PickUnusedPort():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@@ -54,6 +70,15 @@ def PickUnusedPort():
s.close()
return port
+def isOpen(ip,port):
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ try:
+ s.connect((ip, int(port)))
+ s.shutdown(2)
+ return True
+ except:
+ return False
+
class HelloWorldActivity(activity.Activity):
"""HelloWorldActivity class as specified in activity.info"""
@@ -61,89 +86,135 @@ class HelloWorldActivity(activity.Activity):
"""Set up the HelloWorld activity."""
activity.Activity.__init__(self, handle)
- # we do not have collaboration features
- # make the share option insensitive
- self.max_participants = 1
self.port = PickUnusedPort()
+ self.serverprocess = None
+ self.bundle_dir = get_bundle_path()
+ self.max_participants = 1
- #Potentially this could be a subprocess, need to test more
- #self.serverpid = Process(target=self.server)
- #self.serverpid.start()
- #self.serverpid.join()
-
- self.serverpid = os.fork()
- if self.serverpid==0:
- self.server()
- print "Server quit. Exiting."
- sys.exit(0)
-
-
- # toolbar with the new toolbar redesign
- toolbar_box = ToolbarBox()
-
- activity_button = ActivityButton(self)
- toolbar_box.toolbar.insert(activity_button, 0)
- activity_button.show()
-
- title_entry = TitleEntry(self)
- toolbar_box.toolbar.insert(title_entry, -1)
- title_entry.show()
-
- share_button = ShareButton(self)
- toolbar_box.toolbar.insert(share_button, -1)
- share_button.show()
-
- keep_button = KeepButton(self)
- toolbar_box.toolbar.insert(keep_button, -1)
- keep_button.show()
-
- separator = gtk.SeparatorToolItem()
- separator.props.draw = False
- separator.set_expand(True)
- toolbar_box.toolbar.insert(separator, -1)
- separator.show()
-
- debug_button = ToolButton("activity-debug")
- toolbar_box.toolbar.insert(debug_button, -1)
- debug_button.connect('clicked', self.__debug_button_cb)
- debug_button.show()
-
- about_button = AboutButton(self)
- toolbar_box.toolbar.insert(about_button, -1)
- about_button.show()
-
- stop_button = StopButton(self)
- toolbar_box.toolbar.insert(stop_button, -1)
- stop_button.show()
-
- self.set_toolbar_box(toolbar_box)
- toolbar_box.show()
-
- # label with the text, make the string translatable
- label = gtk.Label(_("Hello World!"))
-
- self.web_view = webkit.WebView()
- sleep(1) # TODO implement throbber and callback
- self.web_view.open("http://localhost:%s/www/index.html" % self.port)
-
- settings = self.web_view.get_settings()
- settings.set_property("enable-developer-extras", True)
- self.inspector = Inspector(self.web_view.get_web_inspector())
- self.inspector.set_title("WebSDK Inspector")
-
+ OLD_TOOLBAR = False
+ try:
+ from sugar.graphics.toolbarbox import ToolbarBox, ToolbarButton, ToolButton
+ from sugar.activity.widgets import ActivityToolbarButton, StopButton, \
+ ShareButton, KeepButton, TitleEntry, ActivityButton
+
+ except ImportError:
+ OLD_TOOLBAR = True
+
+ if not self._shared_activity: #I am the initiator
+ self.start_server()
+ else:
+ self.connect('joined', self._joined_cb)
+ if self.get_shared(): # we have already joined
+ self._joined_cb()
+
+ if OLD_TOOLBAR:
+ from sugar.activity.activity import Activity, ActivityToolbox
+ toolbox = ActivityToolbox(self)
+ self.set_toolbox(toolbox)
+ toolbox.show()
+ else:
+ # toolbar with the new toolbar redesign
+ toolbar_box = ToolbarBox()
+
+ activity_button = ActivityButton(self)
+ toolbar_box.toolbar.insert(activity_button, 0)
+ activity_button.show()
+
+ title_entry = TitleEntry(self)
+ toolbar_box.toolbar.insert(title_entry, -1)
+ title_entry.show()
+
+ share_button = ShareButton(self)
+ toolbar_box.toolbar.insert(share_button, -1)
+ share_button.show()
+
+ separator = gtk.SeparatorToolItem()
+ separator.props.draw = False
+ separator.set_expand(True)
+ toolbar_box.toolbar.insert(separator, -1)
+ separator.show()
+
+ debug_button = ToolButton("activity-debug")
+ toolbar_box.toolbar.insert(debug_button, -1)
+ debug_button.connect('clicked', self.__debug_button_cb)
+ debug_button.show()
+
+ about_button = AboutButton(self)
+ toolbar_box.toolbar.insert(about_button, -1)
+ about_button.show()
+
+ stop_button = StopButton(self)
+ toolbar_box.toolbar.insert(stop_button, -1)
+ stop_button.show()
+
+ self.set_toolbar_box(toolbar_box)
+ toolbar_box.show()
+
+ if not USE_GECKO:
+ self.web_view = webkit.WebView()
+ settings = self.web_view.get_settings()
+ settings.set_property("enable-developer-extras", True)
+ self.inspector = Inspector(self.web_view.get_web_inspector())
+ self.inspector.set_title("WebSDK Inspector")
+ else:
+ self.web_view = Browser()
+
+ self.open("file:///%s/websdk/static/init.html" % self.bundle_dir)
self.set_canvas(self.web_view)
self.web_view.show()
+ self.waitforport()
+
+ def _joined_cb(self, activity):
+ """Joined a shared activity."""
+ if not self._shared_activity:
+ return
+ if len(self._shared_activity.get_joined_buddies())==1:
+ print "We are alone"
def __debug_button_cb(self, widget):
- self.inspector.emit('inspect-web-view')
- self.inspector.show()
+ #self.inspector.emit('inspect-web-view')
+ #self.inspector.show()
+ self.open("file:///home/icarito/Descargas/CHUAS")
return True
+ @yieldsleep
+ def waitforport(self):
+ while 1:
+ if isOpen("127.0.0.1", self.port):
+ print "port is open"
+ if self._shared_activity: # we are shared
+ self.open("http://localhost:%s/" % self.port)
+ else:
+ self.open("http://localhost:%s/" % self.port)
+ break
+ else:
+ yield(1)
+
+ def open(self, url):
+ if not USE_GECKO:
+ self.web_view.open(url)
+ else: #use webkit
+ self.web_view.load_uri(url)
+
def can_close(self):
- #self.serverpid.terminate()
- os.kill(self.serverpid, 15)
+ self.open("http://localhost:%s/shutdown" % self.port)
return True
- def server(self):
- import appservice
- appservice.start(self.port)
+ def start_server(self):
+ self.serverprocess = subprocess.Popen(("python", "websdk/studio.py", str(self.port)))
+ if self._shared_activity:
+ self.share_server()
+
+
+ def share_server(self):
+ # Make a tube for it
+ chan = self._shared_activity.telepathy_tubes_chan
+ iface = chan[telepathy.CHANNEL_TYPE_TUBES]
+ self.httpd_tube_id = iface.OfferStreamTube(
+ READ_STREAM_SERVICE,
+ {},
+ telepathy.SOCKET_ADDRESS_TYPE_IPV4,
+ ('127.0.0.1', dbus.UInt16(self.port)),
+ telepathy.SOCKET_ACCESS_CONTROL_LOCALHOST,
+ 0)
+ return True