From 792c135e9aee821bf22640649228d3e5d035f568 Mon Sep 17 00:00:00 2001 From: Lucian Branescu Mihaila Date: Thu, 24 Jun 2010 11:52:15 +0000 Subject: Prototype implementation of downloadmanager. Fix initial load bug. Introduce many other bugs. Not tested enough. --- 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() -- cgit v0.9.1