Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/browser.py
diff options
context:
space:
mode:
Diffstat (limited to 'browser.py')
-rw-r--r--browser.py96
1 files changed, 96 insertions, 0 deletions
diff --git a/browser.py b/browser.py
index 828e783..c8e9af5 100644
--- a/browser.py
+++ b/browser.py
@@ -16,18 +16,56 @@
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
import logging
+from gettext import gettext as _
import gobject
import gtk
+import tempfile
+import os
+import time
import xpcom
from xpcom.nsError import *
from xpcom import components
from xpcom.components import interfaces
from hulahop.webview import WebView
+from sugar.datastore import datastore
+from sugar import profile
+from sugar.activity import activityfactory
+
import sessionstore
from dnd import DragDropHooks
+class GetSourceListener(gobject.GObject):
+ _com_interfaces_ = interfaces.nsIWebProgressListener
+
+ __gsignals__ = {
+ 'finished': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
+ ([]))
+ }
+
+ def __init__(self, persist):
+ gobject.GObject.__init__(self)
+ self._persist = persist
+
+ def onStateChange(self, progress, request, flags, status):
+ finished = interfaces.nsIWebBrowserPersist.PERSIST_STATE_FINISHED
+ if self._persist.currentState == finished:
+ self.emit('finished')
+
+ def onProgressChange(self, progress, request, curSelfProgress,
+ maxSelfProgress, curTotalProgress, maxTotalProgress):
+ pass
+
+ def onLocationChange(self, progress, request, location):
+ pass
+
+ def onStatusChange(self, progress, request, status, message):
+ pass
+
+ def onSecurityChange(progress, request, state):
+ pass
+
class Browser(WebView):
def __init__(self):
WebView.__init__(self)
@@ -56,6 +94,64 @@ class Browser(WebView):
def set_session(self, data):
return sessionstore.set_session(self, data)
+ def get_source(self):
+ cls = components.classes['@mozilla.org/embedding/browser/nsWebBrowserPersist;1']
+ persist = cls.createInstance(interfaces.nsIWebBrowserPersist)
+ # get the source from the cache
+ persist.persistFlags = interfaces.nsIWebBrowserPersist.PERSIST_FLAGS_FROM_CACHE
+
+ progresslistener = GetSourceListener(persist)
+ persist.progressListener = xpcom.server.WrapObject(
+ progresslistener, interfaces.nsIWebProgressListener)
+ progresslistener.connect('finished', self._have_source_cb)
+
+ file_path = os.path.join(tempfile.gettempdir(), '%i' % time.time())
+ cls = components.classes["@mozilla.org/file/local;1"]
+ local_file = cls.createInstance(interfaces.nsILocalFile)
+ local_file.initWithPath(file_path)
+
+ uri = self.web_navigation.currentURI
+ persist.saveURI(uri, self.doc_shell, None, None, None, local_file)
+ self._create_journal_object(file_path)
+ self._jobject.file_path = file_path
+
+ def _have_source_cb(self, progress_listener):
+ logging.debug("Finished getting source - writing to datastore")
+ datastore.write(self._jobject,
+ reply_handler=self._internal_save_cb,
+ error_handler=self._internal_save_error_cb)
+
+ def _create_journal_object(self, file_path):
+ self._jobject = datastore.create()
+ title = _('Source') + ': ' + self.props.title
+ self._jobject.metadata['title'] = title
+ self._jobject.metadata['keep'] = '0'
+ self._jobject.metadata['buddies'] = ''
+ self._jobject.metadata['preview'] = ''
+ self._jobject.metadata['icon-color'] = profile.get_color().to_string()
+ self._jobject.metadata['mime_type'] = 'text/plain'
+ self._jobject.file_path = ''
+ datastore.write(self._jobject)
+
+ def _internal_save_cb(self):
+ logging.debug("Saved source object to datastore.")
+ id = self._jobject.object_id
+ service_name = 'org.laptop.AbiWordActivity'
+ self._cleanup_jobject()
+ activityfactory.create_with_object_id(service_name, id)
+
+ def _internal_save_error_cb(self, err):
+ logging.debug("Error saving source object to datastore: %s" % err)
+ self._cleanup_jobject()
+
+ def _cleanup_jobject(self):
+ if self._jobject:
+ if os.path.isfile(self._jobject.file_path):
+ logging.debug('_cleanup_jobject: removing %r' % self._jobject.file_path)
+ os.remove(self._jobject.file_path)
+ self._jobject.destroy()
+ self._jobject = None
+
class WindowCreator:
_com_interfaces_ = interfaces.nsIWindowCreator