報告一下目前的進度和計畫,我開了一個新 branch: split-tsf
我把 M$ 的 TSF code 獨立出來,預計之後要改成 dynamic linking
變成獨立的 dll,例如 TSFHelper.dll
建立下列 abstract classes
CImeEngine: 把 CTextService 的部分 implementation detail,redirect 到
CImeEngine,有點像 pimpl 的 pattern
CImeContext: 把原先直接呼叫 ChewingContext 的部分,改呼叫 CImeContext,包括 key
handler,讓 CImeContext 來進行事件處理
CImeUI: 把原先建立 UI,Candidate windows 等 code,redirect 到 CImeUI,由 Ime UI
class 來進行真正的 UI 操作,這樣未來可抽換 UI
以上部分,留在 TSF helper library 裡面,使用 MS-LPL 授權
跟新酷音相關部分,可以留在 ChewingService.dll 內,這部分維持 LGPL
實作
CImeEngine => ChewingImeEngine
CImeContext => ChewingImeContext
CImeUI => ChewingImeUI
然後只在這些 class 裡面呼叫 chewing API
這樣作有幾個優點:
1. 不用浪費時間學 Windows COM 和重新發明輪子,可直接重用 MS 範例碼,大幅度加速開發,TSF lib 為 MS-LPL
授權,我們的 cheiwng 部分可以維持 LGPL 授權,互相不影響
2. TSF lib 不會有 libchewing dependency
3. 可抽換的實作,例如可以幫 metro app 重寫不同的 UI 實作 (如果有可能支援的話)
4. TSF helper library 未來可給其他輸入法 reuse (例: gcin, openvanilla, ...)
如果一切順利,就只剩下 hash 的問題沒解決
多個 process 同時讀寫 hash.dat 會造成無法預期的結果
解決方式如下:
1. 用 sqlite 取代 hash.dat,速度會慢一點,但是使用者詞庫數量不多,頂多數千,用 sqlite 綽綽有餘,或可用其他
lightweight 的 key/value db 實作
2. 用 mutex,在 Windows 下,named Mutex 可以跨 process,所以可以用來同步各個 process,這比
file locking 方便。我們用 cross-process mutex 保護 hash.dat 的讀寫就不會相衝了。問題是,一個
process 更新了檔案,另一個 process 並不會更新已讀到記憶體的部分。如果每次都檢查檔案是否更新,然後
reload,那效率也不好,不如用 sqlite
不知道大家覺得如何?
Comments are needed!
2013/9/1 PCMan <
pcma...@gmail.com>: