OSDN Git Service

Multithreads are abandoned. Alternatly, The asyncore substitutes.(#16776)
[fukui-no-namari/fukui-no-namari.git] / src / FukuiNoNamari / board_window.py
index e5dae3f..16ad091 100644 (file)
@@ -35,7 +35,6 @@ from BbsType import bbs_type_judge_uri
 import config
 import session
 import winwrapbase
-from misc import ThreadInvoker
 import bookmark_list
 import bookmark_window
 import board_plugins
@@ -66,6 +65,8 @@ class WinWrap(winwrapbase.WinWrapBase, board_data.BoardData):
 
     def __init__(self, uri):
 
+        self.lock_obj = False
+
         self.bbs_type = bbs_type_judge_uri.get_type(uri)
         board_data.BoardData.__init__(self, self.bbs_type)
 
@@ -105,6 +106,19 @@ class WinWrap(winwrapbase.WinWrapBase, board_data.BoardData):
             "bonobodockitem_filterbar")
         self.entry_filterbar = self.widget_tree.get_widget("entry_filterbar")
 
+    def lock(self):
+        if self.lock_obj:
+            print "locked, try later."
+            return False
+        else:
+            print "get lock"
+            self.lock_obj = True
+            return True
+
+    def un_lock(self):
+        self.lock_obj = False
+        print "unlock"
+
     def set_status(self, text):
         self.statusbar.set_status(text)
 
@@ -118,6 +132,12 @@ class WinWrap(winwrapbase.WinWrapBase, board_data.BoardData):
     def get_uri(self):
         return self.bbs_type.get_uri_base()
 
+    def show(self):
+        self.window.deiconify()
+
+    def hide(self):
+        self.window.iconify()
+
     def open_thread(self):
         treeselection = self.treeview.get_selection()
         model, iter = treeselection.get_selected()
@@ -171,37 +191,64 @@ class WinWrap(winwrapbase.WinWrapBase, board_data.BoardData):
 
     def load(self, update=False):
 
+        def on_end():
+            self.progress.set_fraction(0.0)
+            self.progress.hide()
+            self.un_lock()
+
         def set_id(thread_id, item_dict):
             item_dict["id"] = thread_id
             return item_dict
 
-        def conv_dictdict_to_listdict(dictdict):
+        def conv_dictdict_to_listdict(dictdict, listdict):
             key_iter = dictdict.iterkeys()
             value_iter = dictdict.itervalues()
             iterable = itertools.imap(set_id, key_iter, value_iter)
-            return [item_dict for item_dict in iterable]
+
+            # remove not in subject.txt and not cache.
+            iterable = itertools.ifilter(
+                lambda dic: dic["num"] > 0 or dic["lineCount"] > 0, iterable)
+
+            iterable = itertools.imap(listdict.append, iterable)
+            for i in iterable:
+                yield
+
+            self.update_datastore(listdict)
 
         def load_local():
-            datalist = self.load_idxfiles()
-            self.merge_local_subjecttxt(datalist)
-            new_list = conv_dictdict_to_listdict(datalist)
-            gobject.idle_add(self.update_datastore, new_list)
+            datalist = {}
+            new_lst = []
+            iterable = self.load_idxfiles(datalist)
+            iterable = itertools.chain(iterable,
+                self.merge_local_subjecttxt(datalist))
+            iterable = itertools.chain(iterable,
+                conv_dictdict_to_listdict(datalist, new_lst))
+
+            misc.chain(lambda *args: None, on_end, iterable)
 
         def get_remote(datalist):
-            print "start get subject.txt"
-            self.merge_remote_subjecttxt(datalist)
-            new_list = conv_dictdict_to_listdict(datalist)
-            gobject.idle_add(self.update_datastore, new_list)
 
-        def on_end():
-            def reset_progress():
-                self.progress.set_fraction(0.0)
-                self.progress.hide()
-            gobject.idle_add(reset_progress)
+            def on_received(response):
+                new_lst = []
+                iterable = self.progress_response(response)
+                iterable = self.merge_remote_subjecttxt(datalist, iterable)
+                iterable = itertools.chain(iterable,
+                    conv_dictdict_to_listdict(datalist, new_lst))
+                misc.chain(lambda *args: None, on_end, iterable)
+
+            print "start get subject.txt"
+            try:
+                self.get_subjecttxt(on_received)
+            except board_data.NothingToDoException:
+                on_end()
+            except:
+                on_end()
+                self.set_status(str(sys.exc_info()))
 
         def deep_copy():
             def init_some(dic):
                 dic["num"] = 0
+                dic["oldRes"] = dic["res"]
                 dic["res"] = 0
                 dic["average"] = 0
                 return dic
@@ -210,9 +257,6 @@ class WinWrap(winwrapbase.WinWrapBase, board_data.BoardData):
             if model:
                 iterable = model.original_list
 
-                # unmerge subject.txt
-                iterable = itertools.ifilter(
-                    lambda dic: dic["lineCount"] > 0, iterable)
                 iterable = itertools.imap(lambda dic: dic.copy(), iterable)
                 iterable = itertools.imap(init_some, iterable)
 
@@ -221,6 +265,9 @@ class WinWrap(winwrapbase.WinWrapBase, board_data.BoardData):
                 new_dict = {}
             return new_dict
 
+        if not self.lock():
+            return
+
         sbj_path = misc.get_board_subjecttxt_path(self.bbs_type)
         sbj_exists = os.path.exists(sbj_path)
 
@@ -228,11 +275,9 @@ class WinWrap(winwrapbase.WinWrapBase, board_data.BoardData):
 
         if update or not sbj_exists:
             new_dict = deep_copy()
-            t = ThreadInvoker(on_end, lambda *x: get_remote(new_dict))
-            t.start()
+            get_remote(new_dict)
         else:
-            t = ThreadInvoker(on_end, load_local)
-            t.start()
+            load_local()
 
     def save(self):
         try:
@@ -281,8 +326,12 @@ class WinWrap(winwrapbase.WinWrapBase, board_data.BoardData):
         try:
             states_dict = board_states.states_file_to_dict(self.bbs_type)
 
-            self.treeview.get_model().sort(
-                states_dict["sort_column"], True, states_dict["sort_reverse"])
+            try:
+                self.treeview.get_model().sort(
+                    states_dict["sort_column"], True,
+                    states_dict["sort_reverse"])
+            except:
+                pass
 
             # set column order before set column width
             treeviewcolumn = dict(