summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeng Wu <alexepico@gmail.com>2011-10-26 10:10:58 +0800
committerPeng Wu <alexepico@gmail.com>2011-12-22 12:23:14 +0800
commit59b266d410cedb70f2b8b2aa8c1619184b2fb0ee (patch)
tree481faf6447b0665fa38843ac5f1d8c0a14ccaba3
parent4d6a548b773ab5d59641208b5668a000287075d3 (diff)
downloadibus-libpinyin-59b266d410cedb70f2b8b2aa8c1619184b2fb0ee.tar.gz
add save support
-rw-r--r--src/PYLibPinyin.cc51
-rw-r--r--src/PYLibPinyin.h8
-rw-r--r--src/PYPBopomofoEditor.cc1
-rw-r--r--src/PYPPinyinEditor.cc2
4 files changed, 62 insertions, 0 deletions
diff --git a/src/PYLibPinyin.cc b/src/PYLibPinyin.cc
index 077e7e0..062b3c9 100644
--- a/src/PYLibPinyin.cc
+++ b/src/PYLibPinyin.cc
@@ -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;
+}
diff --git a/src/PYLibPinyin.h b/src/PYLibPinyin.h
index 44ed727..32919b9 100644
--- a/src/PYLibPinyin.h
+++ b/src/PYLibPinyin.h
@@ -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;
};
diff --git a/src/PYPBopomofoEditor.cc b/src/PYPBopomofoEditor.cc
index 34f3df7..7592e2a 100644
--- a/src/PYPBopomofoEditor.cc
+++ b/src/PYPBopomofoEditor.cc
@@ -297,6 +297,7 @@ LibPinyinBopomofoEditor::commit ()
}
pinyin_train(m_instance);
+ LibPinyinBackEnd::instance ().modified();
LibPinyinPhoneticEditor::commit ((const gchar *)m_buffer);
reset();
}
diff --git a/src/PYPPinyinEditor.cc b/src/PYPPinyinEditor.cc
index 195d0e3..e676f6d 100644
--- a/src/PYPPinyinEditor.cc
+++ b/src/PYPPinyinEditor.cc
@@ -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();
}