OSDN Git Service

Multithreads are abandoned. Alternatly, The asyncore substitutes.(#16776)
[fukui-no-namari/fukui-no-namari.git] / src / FukuiNoNamari / board_window.py
index d03e684..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)
 
@@ -177,11 +191,16 @@ 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)
@@ -190,25 +209,41 @@ class WinWrap(winwrapbase.WinWrapBase, board_data.BoardData):
             iterable = itertools.ifilter(
                 lambda dic: dic["num"] > 0 or dic["lineCount"] > 0, iterable)
 
-            return [item_dict for item_dict in 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):
@@ -230,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)
 
@@ -237,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: