Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucian Branescu Mihaila <lucian.branescu@gmail.com>2010-06-24 11:52:15 (GMT)
committer Lucian Branescu Mihaila <lucian.branescu@gmail.com>2010-06-24 11:52:15 (GMT)
commit792c135e9aee821bf22640649228d3e5d035f568 (patch)
tree411af24daa25bb00983f7ad0b36abc2cc95ece68
parent980eaede8bf725f571fb81020d83e3e7702d8c42 (diff)
Prototype implementation of downloadmanager. Fix initial load bug. Introduce many other bugs. Not tested enough.
-rw-r--r--browser.py19
-rw-r--r--downloadmanager.py43
-rw-r--r--model.py4
-rw-r--r--webactivity.py10
-rw-r--r--webtoolbar.py55
5 files changed, 65 insertions, 66 deletions
diff --git a/browser.py b/browser.py
index ff77f64..75edeeb 100644
--- a/browser.py
+++ b/browser.py
@@ -42,7 +42,7 @@ class TabbedView(gtk.Notebook):
AGENT_SHEET = os.path.join(activity.get_bundle_path(),
'agent-stylesheet.css')
- USER_SHEET = os.path.join(env.get_profile_path(), 'gecko',
+ USER_SHEET = os.path.join(env.get_profile_path(), 'webkit',
'user-stylesheet.css')
HOME_PAGE = 'http://sugarlabs.org'
@@ -136,9 +136,7 @@ class TabLabel(gtk.HBox):
gobject.GObject.__init__(self)
self._browser = browser
- self._browser.connect('notify::load-status', self.__browser_is_setup_cb)
- self._browser.connect('notify::title', self.__title_changed_cb)
- self._browser.connect('notify::uri', self.__location_changed_cb)
+ self._browser.connect('load-finished', self.__browser_is_setup_cb)
self._label = gtk.Label('')
self.pack_start(self._label)
@@ -160,16 +158,15 @@ class TabLabel(gtk.HBox):
def __button_clicked_cb(self, button):
self.emit('tab-close', self._browser)
- def __browser_is_setup_cb(self, browser):
- browser.progress.connect('notify::location',
- self.__location_changed_cb)
+ def __browser_is_setup_cb(self, browser, load_status):
+ browser.connect('notify::uri', self.__location_changed_cb)
browser.connect('notify::title', self.__title_changed_cb)
- def __location_changed_cb(self, browser):
- sefl._label.set_text(browser.props.uri)
+ def __location_changed_cb(self, browser, uri):
+ sefl._label.set_text(uri)
- def __title_changed_cb(self, browser):
- self._label.set_text(browser.props.title)
+ def __title_changed_cb(self, browser, title):
+ self._label.set_text(title)
class Browser(webkit.WebView):
diff --git a/downloadmanager.py b/downloadmanager.py
index 3dca415..1c6d10c 100644
--- a/downloadmanager.py
+++ b/downloadmanager.py
@@ -66,18 +66,31 @@ def remove_all_downloads():
class Download(object):
def __init__(self, download):
self._download = download
- self.datastore_deleted_handler = None
-
+ self._source = download.get_uri()
+
self._download.connect('notify::progress', self.__progress_change_cb)
self._download.connect('notify::status', self.__state_change_cb)
self._download.connect('error', self.__error_cb)
+ self.datastore_deleted_handler = None
+
self.dl_jobject = None
self._object_id = None
self._last_update_time = 0
self._last_update_percent = 0
self._stop_alert = None
+ # figure out download URI
+ self._dest_uri = os.path.join(activity.get_activity_root(), 'instance',
+ download.props.suggested_filename)
+
+ if not os.path.exists(self._dest_uri):
+ os.makedirs(self._dest_uri)
+
+ # start download
+ self._download.set_destination_uri(self._dest_uri)
+ self._download.start()
+
def __progress_change_cb(self, download, progress):
self.dl_jobject.metadata['progress'] = str(int(progress * 100))
datastore.write(self.dl_jobject)
@@ -113,13 +126,13 @@ class Download(object):
self.dl_jobject.metadata['title'] = self._get_file_name()
self.dl_jobject.metadata['description'] = _('From: %s') \
- % self._source.spec
+ % self._source
self.dl_jobject.metadata['progress'] = '100'
- self.dl_jobject.file_path = self._target_file.path
+ self.dl_jobject.file_path = self._dest_uri
if self._mime_type in ['application/octet-stream',
'application/x-zip']:
- sniffed_mime_type = mime.get_for_file(self._target_file.path)
+ sniffed_mime_type = mime.get_for_file(self._dest_uri)
self.dl_jobject.metadata['mime_type'] = sniffed_mime_type
datastore.write(self.dl_jobject,
@@ -169,20 +182,17 @@ class Download(object):
self.dl_jobject = None
def _get_file_name(self):
- if self._display_name:
- return self._display_name
- elif self._source.scheme == 'data':
+ src = urlparse.urlparse(self._source)
+
+ if src.scheme == 'data':
return 'Data URI'
else:
- path = urlparse.urlparse(self._source.spec).path
- location, file_name = os.path.split(path)
- file_name = urllib.unquote(file_name.encode('utf-8', 'replace'))
- return file_name
+ return self._download.get_suggested_filename()
def _create_journal_object(self):
self.dl_jobject = datastore.create()
self.dl_jobject.metadata['title'] = _('Downloading %s from \n%s.') % \
- (self._get_file_name(), self._source.spec)
+ (self._get_file_name(), self._source)
self.dl_jobject.metadata['progress'] = '0'
self.dl_jobject.metadata['keep'] = '0'
@@ -210,10 +220,5 @@ class Download(object):
_active_downloads.remove(self)
def save_link(download, user_data):
- dest_uri = os.path.join(activity.get_activity_root(), 'instance',
- download.props.suggested_filename)
-
- if not os.path.exists(dest_uri):
- os.makedirs(temp_path)
- dl = Download(download, dest_uri) \ No newline at end of file
+ dl = Download(download) \ No newline at end of file
diff --git a/model.py b/model.py
index 48e7bdb..38154c4 100644
--- a/model.py
+++ b/model.py
@@ -17,9 +17,9 @@
#
import cjson
-import sha
import gobject
import base64
+from hashlib import sha1
class Model(gobject.GObject):
@@ -45,7 +45,7 @@ class Model(gobject.GObject):
break
self.data['shared_links'].insert(index,
- {'hash':sha.new(str(url)).hexdigest(),
+ {'hash':sha1.new(str(url)).hexdigest(),
'url':str(url), 'title':str(title),
'thumb':base64.b64encode(thumb),
'owner':str(owner),
diff --git a/webactivity.py b/webactivity.py
index a68cc49..bb5a7c6 100644
--- a/webactivity.py
+++ b/webactivity.py
@@ -23,7 +23,6 @@ import gobject
gobject.threads_init()
import gtk
-import sha
import base64
import time
import shutil
@@ -31,6 +30,7 @@ import sqlite3
import cjson
import gconf
import locale
+from hashlib import sha1
import webkit
@@ -49,7 +49,7 @@ from sugar import mime
PROFILE_VERSION = 2
_profile_version = 0
-_profile_path = os.path.join(activity.get_activity_root(), 'data/gecko')
+_profile_path = os.path.join(activity.get_activity_root(), 'data/webkit')
_version_file = os.path.join(_profile_path, 'version')
if os.path.exists(_version_file):
@@ -83,7 +83,7 @@ def _seed_xs_cookie():
pubkey = profile.get_profile().pubkey
cookie_data = {'color': profile.get_color().to_string(),
- 'pkey_hash': sha.new(pubkey).hexdigest()}
+ 'pkey_hash': sha1.new(pubkey).hexdigest()}
db_path = os.path.join(_profile_path, 'cookies.sqlite')
try:
@@ -441,9 +441,9 @@ class WebActivity(activity.Activity):
uri = browser.props.uri
for link in self.model.data['shared_links']:
- if link['hash'] == sha.new(uri).hexdigest():
+ if link['hash'] == sha1.new(uri).hexdigest():
_logger.debug('_add_link: link exist already a=%s b=%s' %(
- link['hash'], sha.new(uri).hexdigest()))
+ link['hash'], sha1.new(uri).hexdigest()))
return
buf = self._get_screenshot()
timestamp = time.time()
diff --git a/webtoolbar.py b/webtoolbar.py
index 2ac520d..a241f6b 100644
--- a/webtoolbar.py
+++ b/webtoolbar.py
@@ -21,6 +21,7 @@ from gettext import gettext as _
import gobject
import gtk
import pango
+import webkit
from sugar.graphics.toolbutton import ToolButton
from sugar.graphics.menuitem import MenuItem
@@ -216,7 +217,7 @@ class WebEntry(AddressEntry):
else:
self._search_popup()
-#TODO
+
class PrimaryToolbar(ToolbarBox):
__gtype_name__ = 'PrimaryToolbar'
@@ -277,7 +278,6 @@ class PrimaryToolbar(ToolbarBox):
stop_button = StopButton(self._activity)
self.toolbar.insert(stop_button, -1)
- self._progress_listener = None
self._history = None
self._browser = None
@@ -296,25 +296,24 @@ class PrimaryToolbar(ToolbarBox):
self._connect_to_browser(tabbed_view.props.current_browser)
def _connect_to_browser(self, browser):
- if self._progress_listener is not None:
- self._progress_listener.disconnect(self._location_changed_hid)
- self._progress_listener.disconnect(self._loading_changed_hid)
- self._progress_listener.disconnect(self._progress_changed_hid)
-
- self._progress_listener = browser.progress
- self._set_progress(self._progress_listener.progress)
- if self._progress_listener.location:
- self._set_address(self._progress_listener.location)
+ if self._browser:
+ self._browser.disconnect(self._location_changed_hid)
+ self._browser.disconnect(self._loading_changed_hid)
+ self._browser.disconnect(self._progress_changed_hid)
+
+ self._set_progress(self._browser.props.progress)
+ if self._browser.props.uri:
+ self._set_address(self._browser.props.uri)
else:
self._set_address(None)
- self._set_loading(self._progress_listener.loading)
+ self._set_loading(self._browser.props.load_status)
self._update_navigation_buttons()
- self._location_changed_hid = self._progress_listener.connect(
+ self._location_changed_hid = self._browser.connect(
'notify::location', self.__location_changed_cb)
- self._loading_changed_hid = self._progress_listener.connect(
- 'notify::loading', self.__loading_changed_cb)
- self._progress_changed_hid = self._progress_listener.connect(
+ self._loading_changed_hid = self._browser.connect(
+ 'notify::load-status', self.__loading_changed_cb)
+ self._progress_changed_hid = self._browser.connect(
'notify::progress', self.__progress_changed_cb)
if self._history is not None:
@@ -337,15 +336,15 @@ class PrimaryToolbar(ToolbarBox):
# We have to wait until the history info is updated.
gobject.idle_add(self._reload_session_history, current_page_index)
- def __location_changed_cb(self, progress_listener, pspec):
- self._set_address(progress_listener.location)
+ def __location_changed_cb(self, browser, uri):
+ self._set_address(uri)
self._update_navigation_buttons()
filepicker.cleanup_temp_files()
- def __loading_changed_cb(self, progress_listener, pspec):
- if progress_listener.loading:
+ def __loading_changed_cb(self, browser, uri):
+ if browser.props.load_status != webkit.LOAD_FINISHED:
self._set_title(None)
- self._set_loading(progress_listener.loading)
+ self._set_loading()
self._update_navigation_buttons()
def __progress_changed_cb(self, progress_listener, pspec):
@@ -368,12 +367,10 @@ class PrimaryToolbar(ToolbarBox):
def _update_navigation_buttons(self):
browser = self._tabbed_view.props.current_browser
+ history = browser.get_back_forward_list()
- can_go_back = browser.web_navigation.canGoBack
- self._back.props.sensitive = can_go_back
-
- can_go_forward = browser.web_navigation.canGoForward
- self._forward.props.sensitive = can_go_forward
+ self._back.props.sensitive = history.get_back_length > 0
+ self._forward.props.sensitive = history.get_forward_length > 0
def _entry_activate_cb(self, entry):
browser = self._tabbed_view.props.current_browser
@@ -382,18 +379,18 @@ class PrimaryToolbar(ToolbarBox):
def _go_back_cb(self, button):
browser = self._tabbed_view.props.current_browser
- browser.web_navigation.goBack()
+ browser.get_back_forward_list().go_back()
def _go_forward_cb(self, button):
browser = self._tabbed_view.props.current_browser
- browser.web_navigation.goForward()
+ browser.get_back_forward_list().go_forward()
def _title_changed_cb(self, embed, spec):
self._set_title(embed.props.title)
def _stop_and_reload_cb(self, button):
browser = self._tabbed_view.props.current_browser
- if self._loading:
+ if browser.props.load_status != webkit.LOAD_FINISHED:
browser.stop()
else:
browser.reload()