src/packagemanager.py
changeset 911 0a13415002e4
parent 906 3d0200073211
child 912 3bd0aa91041e
--- a/src/packagemanager.py	Thu Mar 05 08:43:46 2009 +0000
+++ b/src/packagemanager.py	Thu Mar 05 11:32:01 2009 +0000
@@ -167,13 +167,16 @@
                 self.progress_stop_timer_thread = False
                 self.progress_fraction_time_count = 0
                 self.progress_canceled = False
+                self.catalog_loaded = False
                 self.image_dir_arg = None
                 self.update_all_proceed = False
                 self.ua_be_name = None
                 self.application_path = None
                 self.default_authority = None
                 self.first_run = True
-                self.selected_pkgname = None
+                self.selected_pkgstem = None
+                self.selected_model = None
+                self.selected_path = None
                 self.info_cache = {}
                 self.selected = 0
                 self.selected_pkgs = {}
@@ -1050,6 +1053,8 @@
                 self.application_list_filter.refilter()
                 self.w_application_treeview.set_model(model)
                 gobject.idle_add(self.__enable_disable_selection_menus)
+                gobject.idle_add(self.__enable_disable_install_remove)
+                gobject.idle_add(self.__set_empty_details_panel)
                 self.application_treeview_initialized = True
                 self.application_treeview_range = None
                 if self.visible_status_id == 0:
@@ -1272,8 +1277,8 @@
                 model, itr = self.package_selection.get_selected()
                 if itr:
                         self.__enable_disable_install_remove()
-                        self.selected_pkgname = \
-                               model.get_value(itr, enumerations.NAME_COLUMN)
+                        self.selected_pkgstem = \
+                               model.get_value(itr, enumerations.STEM_COLUMN)
                         if self.show_info_id != 0:
                                 gobject.source_remove(self.show_info_id)
                                 self.show_info_id = 0
@@ -1390,6 +1395,7 @@
                 self.cancelled = True
                 self.in_setup = True
                 self.set_busy_cursor()
+                self.__set_empty_details_panel()
                 auth = [active_authority, ]
                 Thread(target = self.__setup_authority, args = [auth]).start()
                 self.__set_main_view_package_list()
@@ -1420,9 +1426,8 @@
                                         self.__add_pkgs_to_lists_from_cache(authority, 
                                             application_list, category_list, 
                                             section_list)
-                        except UnpicklingError:
+                        except (UnpicklingError, EOFError):
                                 #Most likely cache is corrupted, silently load list from api.
-                                #raise
                                 application_list = self.__get_new_application_liststore()
                                 category_list = self.__get_new_category_liststore()
                                 uptodate = False
@@ -1430,7 +1435,9 @@
                                 if first_loop == True:
                                         first_loop = False
                                         gobject.idle_add(self.setup_progressdialog_show)
+                                self.catalog_loaded = False
                                 self.api_o.img.load_catalogs(self.pr)
+                                self.catalog_loaded = True
                                 self.__add_pkgs_to_lists_from_api(authority, application_list, 
                                     category_list, section_list)
                                 category_list.prepend([0, _('All'), None, None, False, 
@@ -1726,6 +1733,22 @@
                 for pkg_stem in remove_auth:
                         self.__remove_pkg_stem_from_list(pkg_stem)
 
+        def __set_empty_details_panel(self):
+                if self.show_info_id != 0:
+                        gobject.source_remove(self.show_info_id)
+                        self.show_info_id = 0
+                if self.show_licenses_id != 0:
+                        gobject.source_remove(self.show_licenses_id)
+                        self.show_licenses_id = 0
+                pkg_name = _("Package Name")
+                self.w_packagename_label.set_markup("<b>" + pkg_name + "</b>")
+                self.w_general_info_label.set_markup("<b>" + pkg_name + "</b>")
+                self.w_installedfiles_textview.get_buffer().set_text("")
+                self.w_dependencies_textview.get_buffer().set_text("")
+                self.w_generalinfo_textview.get_buffer().set_text("")
+                self.w_license_textview.get_buffer().set_text("")
+                return
+
         def __show_fetching_package_info(self, pkg):
                 pkg_name = pkg.get_name()
                 self.w_packagename_label.set_markup("<b>" + pkg_name + "</b>")
@@ -1778,14 +1801,21 @@
                 infobuffer = self.w_generalinfo_textview.get_buffer()
 
                 if not local_info and not remote_info:
+                        network_str = \
+                            _("\nThis might be caused by network problem "
+                            "while accessing the repository.")
                         self.w_shortdescription_label.set_text(
-                            _("Description not available for this package..."))
+                            _("Description not available for this package...") +
+                            network_str)
                         instbuffer.set_text( \
-                            _("Files Details not available for this package..."))
+                            _("Files Details not available for this package...") +
+                            network_str)
                         depbuffer.set_text(_(
-                            "Dependencies info not available for this package..."))
+                            "Dependencies info not available for this package...") +
+                            network_str)
                         infobuffer.set_text(
-                            _("Information not available for this package..."))
+                            _("Information not available for this package...") +
+                            network_str)
                         return
 
                 if not local_info:
@@ -1874,14 +1904,32 @@
                 licbuffer.set_text(lic_u)
 
         def __show_licenses(self):
-                self.show_licenses_id = 0
-                Thread(target = self.__show_package_licenses).start()
+                if self.catalog_loaded == False:
+                        return
+                Thread(target = self.__show_package_licenses, 
+                    args = (self.show_licenses_id,)).start()
 
-        def __show_package_licenses(self):
-                if self.selected_pkgname == None:
+        def __show_package_licenses(self, license_id):
+                if self.selected_pkgstem == None:
                         gobject.idle_add(self.__update_package_license, None)
                         return
-                info = self.api_o.info([self.selected_pkgname], True, True)
+                info = None
+                try:
+                        info = self.api_o.info([self.selected_pkgstem],
+                            True, True)
+                except (misc.TransportFailures, retrieve.ManifestRetrievalError):
+                        pass
+                if license_id != self.show_licenses_id:
+                        return
+                if not info:
+                        # Package not installed
+                        try:
+                                info = self.api_o.info([self.selected_pkgstem],
+                                    False, True)
+                        except (misc.TransportFailures, retrieve.ManifestRetrievalError):
+                                pass
+                if license_id != self.show_licenses_id:
+                        return
                 pkgs_info = None
                 package_info = None
                 no_licenses = 0
@@ -1898,9 +1946,13 @@
                         gobject.idle_add(self.__update_package_license,
                             package_info.licenses)
 
-        def __get_pkg_info(self, pkg_name, local):
-                info = self.api_o.info([pkg_name], local, get_licenses=False,
-                    get_action_info=True)
+        def __get_pkg_info(self, pkg_stem, local):
+                info = None
+                try:
+                        info = self.api_o.info([pkg_stem], local,
+                            get_licenses=False, get_action_info=True)
+                except (misc.TransportFailures, retrieve.ManifestRetrievalError):
+                        return info
                 pkgs_info = None
                 package_info = None
                 if info:
@@ -1913,30 +1965,37 @@
                         return None
 
         def __show_info(self, model, path):
-                self.show_info_id = 0
+                if self.catalog_loaded == False:
+                        self.selected_model = model
+                        self.selected_path = path
+                        return
                 Thread(target = self.__show_package_info,
-                    args = (model, path)).start()
+                    args = (model, path, self.show_info_id)).start()
 
-        def __show_package_info(self, model, path):
+        def __show_package_info(self, model, path, show_id):
+                if not (model and path):
+                        return
                 itr = model.get_iter(path)
                 pkg = model.get_value(itr, enumerations.FMRI_COLUMN)
                 pkg_stem = model.get_value(itr, enumerations.STEM_COLUMN)
                 pkg_status = model.get_value(itr, enumerations.STATUS_COLUMN)
                 if self.info_cache.has_key(pkg_stem):
                         return
-
                 img = self.api_o.img
                 img.history.operation_name = "info"
                 local_info = None
                 remote_info = None
-                if pkg_status == enumerations.INSTALLED or pkg_status == \
-                    enumerations.UPDATABLE:
-                        local_info = self.__get_pkg_info(pkg.get_name(), True)
-                if pkg_status == enumerations.NOT_INSTALLED or pkg_status == \
-                    enumerations.UPDATABLE:
-                        remote_info = self.__get_pkg_info(pkg.get_name(), False)
-                gobject.idle_add(self.__update_package_info, pkg, 
-                    local_info, remote_info)
+                if show_id == self.show_info_id and (pkg_status == 
+                    enumerations.INSTALLED or pkg_status ==
+                    enumerations.UPDATABLE):
+                        local_info = self.__get_pkg_info(pkg_stem, True)
+                if show_id == self.show_info_id and (pkg_status == 
+                    enumerations.NOT_INSTALLED or pkg_status ==
+                    enumerations.UPDATABLE):
+                        remote_info = self.__get_pkg_info(pkg_stem, False)
+                if show_id == self.show_info_id:
+                        gobject.idle_add(self.__update_package_info, pkg, 
+                            local_info, remote_info)
                 img.history.operation_result = history.RESULT_SUCCEEDED
                 return
 
@@ -2123,12 +2182,18 @@
                 gobject.idle_add(self.w_updateall_menuitem.set_sensitive, False)
                 update_available = self.__check_if_updates_available()
                 gobject.idle_add(self.__g_enable_disable_update_all, update_available)
+                self.show_info_id = -1
+                gobject.idle_add(self.__show_package_info, 
+                    self.selected_model, self.selected_path, -1)
+                gobject.idle_add(self.__show_licenses)
                 return False
 
         def __check_if_updates_available(self):
                 try:
                         img = self.api_o.img
+                        self.catalog_loaded = False
                         img.load_catalogs(self.pr)
+                        self.catalog_loaded = True
                         pargs = []
                         all_known = False
                         all_versions = False
@@ -2159,7 +2224,9 @@
                 full_refresh = True
                 try:
                         self.api_o.refresh(full_refresh)
+                        self.catalog_loaded = False
                         self.api_o.img.load_catalogs(self.pr)
+                        self.catalog_loaded = True
                 except api_errors.UnrecognizedAuthorityException:
                         # In current implementation, this will never happen
                         # We are not refrehsing specific authority
@@ -2690,7 +2757,9 @@
                 visible_repository = self.__get_visible_repository_name()
                 default_authority = self.default_authority
                 img.clear_pkg_state()
+                self.catalog_loaded = False
                 img.load_catalogs(self.pr)
+                self.catalog_loaded = True
                 installed_icon = gui_misc.get_icon_pixbuf(self.application_dir, 
                     "status_installed")
                 visible_list = update_list.get(visible_repository)