add save support
authorPeng Wu <alexepico@gmail.com>
Wed, 26 Oct 2011 02:10:58 +0000 (10:10 +0800)
committerPeng Wu <alexepico@gmail.com>
Thu, 22 Dec 2011 04:23:14 +0000 (12:23 +0800)
src/PYLibPinyin.cc
src/PYLibPinyin.h
src/PYPBopomofoEditor.cc
src/PYPPinyinEditor.cc

index 077e7e0..062b3c9 100644 (file)
@@ -23,6 +23,8 @@
 #include "PYTypes.h"
 #include "PYConfig.h"
 
+#define LIBPINYIN_SAVE_TIMEOUT   (5 * 60)
+
 using namespace PY;
 
 std::unique_ptr<LibPinyinBackEnd> LibPinyinBackEnd::m_instance;
@@ -30,11 +32,19 @@ std::unique_ptr<LibPinyinBackEnd> LibPinyinBackEnd::m_instance;
 static LibPinyinBackEnd libpinyin_backend;
 
 LibPinyinBackEnd::LibPinyinBackEnd () {
+    m_timeout_id = 0;
+    m_timer = g_timer_new();
     m_pinyin_context = NULL;
     m_chewing_context = NULL;
 }
 
 LibPinyinBackEnd::~LibPinyinBackEnd () {
+    g_timer_destroy (m_timer);
+    if (m_timeout_id != 0) {
+        saveUserDB ();
+        g_source_remove (m_timeout_id);
+    }
+
     if (m_pinyin_context)
         pinyin_fini(m_pinyin_context);
     m_pinyin_context = NULL;
@@ -215,3 +225,44 @@ LibPinyinBackEnd::setChewingOptions (Config *config)
     setFuzzyOptions (config, m_chewing_context);
     return TRUE;
 }
+
+void
+LibPinyinBackEnd::modified (void)
+{
+    /* Restart the timer */
+    g_timer_start (m_timer);
+
+    if (m_timeout_id != 0)
+        return;
+
+    m_timeout_id = g_timeout_add_seconds (LIBPINYIN_SAVE_TIMEOUT,
+                                          LibPinyinBackEnd::timeoutCallback,
+                                          static_cast<gpointer> (this));
+}
+
+gboolean
+LibPinyinBackEnd::timeoutCallback (gpointer data)
+{
+    LibPinyinBackEnd *self = static_cast<LibPinyinBackEnd *> (data);
+
+    /* Get the elapsed time since last modification of database. */
+    guint elapsed = (guint)g_timer_elapsed (self->m_timer, NULL);
+
+    if (elapsed >= LIBPINYIN_SAVE_TIMEOUT &&
+        self->saveUserDB ()) {
+        self->m_timeout_id = 0;
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+gboolean
+LibPinyinBackEnd::saveUserDB (void)
+{
+    if (m_pinyin_context)
+        pinyin_save (m_pinyin_context);
+    if (m_chewing_context)
+        pinyin_save (m_chewing_context);
+    return TRUE;
+}
index 44ed727..32919b9 100644 (file)
@@ -42,6 +42,7 @@ public:
     void freePinyinInstance (pinyin_instance_t *instance);
     pinyin_instance_t *allocChewingInstance ();
     void freeChewingInstance (pinyin_instance_t *instance);
+    void modified (void);
 
     /* use static initializer in C++. */
     static LibPinyinBackEnd & instance (void) { return *m_instance; }
@@ -53,10 +54,17 @@ protected:
     gboolean setFuzzyOptions (Config *config, pinyin_context_t *context);
 
 private:
+    gboolean saveUserDB (void);
+    static gboolean timeoutCallback (gpointer data);
+
+private:
     /* libpinyin context */
     pinyin_context_t *m_pinyin_context;
     pinyin_context_t *m_chewing_context;
 
+    guint m_timeout_id;
+    GTimer *m_timer;
+
 private:
     static std::unique_ptr<LibPinyinBackEnd> m_instance;
 };
index 34f3df7..7592e2a 100644 (file)
@@ -297,6 +297,7 @@ LibPinyinBopomofoEditor::commit ()
     }
 
     pinyin_train(m_instance);
+    LibPinyinBackEnd::instance ().modified();
     LibPinyinPhoneticEditor::commit ((const gchar *)m_buffer);
     reset();
 }
index 195d0e3..e676f6d 100644 (file)
@@ -24,6 +24,7 @@
 #include "PYPinyinProperties.h"
 #include "PYSimpTradConverter.h"
 #include "PYHalfFullConverter.h"
+#include "PYLibPinyin.h"
 
 using namespace PY;
 
@@ -229,6 +230,7 @@ LibPinyinPinyinEditor::commit ()
     }
 
     pinyin_train(m_instance);
+    LibPinyinBackEnd::instance ().modified ();
     LibPinyinPhoneticEditor::commit ((const gchar *)m_buffer);
     reset();
 }