Skip to content

Commit

Permalink
Refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
nathancorvussolis committed Jul 7, 2016
1 parent 0d8dae6 commit c2309d3
Show file tree
Hide file tree
Showing 8 changed files with 157 additions and 122 deletions.
9 changes: 5 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -144,10 +144,11 @@ UTF-16 (LE, BOMあり) のSKKユーザー辞書フォーマットで書き込ま

辞書管理プロセスを直接実行することも可能です。

ユーザー辞書は、辞書管理プロセスの起動時にメモリ上に読み込まれ、追加、変更、削除があったとき、かつ、以下のいずれかのときに上書きされます。
ユーザー辞書は、辞書管理プロセスの起動時にメモリ上に読み込まれ、候補の確定、登録、削除があったとき、かつ、以下のいずれかのときに上書きされます。

* IME ON 状態から OFF 状態にするとき
* IME ON OFF のとき
* IME ON 状態のアプリケーションが終了するとき
* IME ON 状態で別の IME に切り替えるとき
* アプリケーションがフォーカスを失うとき
* 辞書管理プロセスが終了するとき
* スリープ、休止状態に移行するとき
Expand Down Expand Up @@ -641,9 +642,9 @@ ASCII, JIS X 0201, JIS X 0213に変換できない文字が含まれていた場

### 開発環境

Visual Studio Community 2015 Update 2
Visual Studio Community 2015 Update 3

WiX Toolset v3.10.2
WiX Toolset v3.10.3

pandoc 1.17.1

Expand Down
4 changes: 4 additions & 0 deletions imcrvcnf/imcrvcnf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmd
hMutex = CreateMutexW(nullptr, FALSE, cnfmutexname);
if(hMutex == nullptr || GetLastError() == ERROR_ALREADY_EXISTS)
{
if(hMutex != nullptr)
{
CloseHandle(hMutex);
}
return 0;
}

Expand Down
2 changes: 1 addition & 1 deletion imcrvmgr/SearchDictionary.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -508,7 +508,7 @@ int lua_delete(lua_State *lua)

int lua_save(lua_State *lua)
{
StartSaveSKKUserDic(TRUE);
StartSaveUserDic(TRUE);

return 0;
}
134 changes: 88 additions & 46 deletions imcrvmgr/SearchUserDictionary.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ KEYORDER complements;
//補完なし
KEYORDER accompaniments;

void AddKeyOrder(const std::wstring &searchkey, KEYORDER &keyorder);
void DelKeyOrder(const std::wstring &searchkey, KEYORDER &keyorder);
HANDLE hThreadUserDic = INVALID_HANDLE_VALUE;

std::wstring SearchUserDic(const std::wstring &searchkey, const std::wstring &okuri)
{
Expand Down Expand Up @@ -146,6 +145,28 @@ void SearchComplementSearchCandidate(SKKDICCANDIDATES &sc, int max)
}
}

void DelKeyOrder(const std::wstring &searchkey, KEYORDER &keyorder)
{
if(!keyorder.empty())
{
FORWARD_ITERATION_I(keyorder_itr, keyorder)
{
if(searchkey == *keyorder_itr)
{
keyorder.erase(keyorder_itr);
break;
}
}
}
}

void AddKeyOrder(const std::wstring &searchkey, KEYORDER &keyorder)
{
DelKeyOrder(searchkey, keyorder);

keyorder.push_back(searchkey);
}

void AddUserDic(WCHAR command, const std::wstring &searchkey, const std::wstring &candidate, const std::wstring &annotation, const std::wstring &okuri)
{
SKKDICENTRY userdicentry;
Expand Down Expand Up @@ -321,29 +342,7 @@ void DelUserDic(WCHAR command, const std::wstring &searchkey, const std::wstring
}
}

void AddKeyOrder(const std::wstring &searchkey, KEYORDER &keyorder)
{
DelKeyOrder(searchkey, keyorder);

keyorder.push_back(searchkey);
}

void DelKeyOrder(const std::wstring &searchkey, KEYORDER &keyorder)
{
if(!keyorder.empty())
{
FORWARD_ITERATION_I(keyorder_itr, keyorder)
{
if(searchkey == *keyorder_itr)
{
keyorder.erase(keyorder_itr);
break;
}
}
}
}

BOOL LoadSKKUserDic()
BOOL LoadUserDic()
{
FILE *fp;
std::wstring key, empty;
Expand All @@ -352,10 +351,12 @@ BOOL LoadSKKUserDic()
SKKDICOKURIBLOCKS so;
USEROKURIENTRY userokurientry;

userdic.clear();
userokuri.clear();
complements.clear();
accompaniments.clear();

_wfopen_s(&fp, pathuserdic, RccsUTF8);
_wfopen_s(&fp, pathuserdic, RccsUTF8); //UTF-8 or UTF-16LE(with BOM)
if(fp == nullptr)
{
return FALSE;
Expand Down Expand Up @@ -505,7 +506,7 @@ BOOL LoadSKKUserDic()
return TRUE;
}

void WriteSKKUserDicEntry(FILE *fp, const std::wstring &key, const SKKDICCANDIDATES &sc, const SKKDICOKURIBLOCKS &so)
void WriteUserDicEntry(FILE *fp, const std::wstring &key, const SKKDICCANDIDATES &sc, const SKKDICOKURIBLOCKS &so)
{
std::wstring line;

Expand Down Expand Up @@ -533,13 +534,18 @@ void WriteSKKUserDicEntry(FILE *fp, const std::wstring &key, const SKKDICCANDIDA
fwprintf(fp, L"%s\n", line.c_str());
}

void SaveSKKUserDic(void *p)
unsigned int __stdcall SaveUserDic(void *p)
{
USERDATA *userdata = (USERDATA *)p;
FILE *fp;
SKKDICOKURIBLOCKS so;

EnterCriticalSection(&csUserDataSave); // !
if(userdata == nullptr)
{
return 0;
}

EnterCriticalSection(&csSaveUserDic); // !

_wfopen_s(&fp, pathuserdic, WccsUTF16);
if(fp == nullptr)
Expand All @@ -561,7 +567,7 @@ void SaveSKKUserDic(void *p)
{
so = userokuri_itr->second.o;
}
WriteSKKUserDicEntry(fp, userdic_itr->first, userdic_itr->second, so);
WriteUserDicEntry(fp, userdic_itr->first, userdic_itr->second, so);
}
}

Expand All @@ -575,55 +581,91 @@ void SaveSKKUserDic(void *p)
auto userdic_itr = userdata->userdic.find(*keyorder_ritr);
if(userdic_itr != userdata->userdic.end())
{
WriteSKKUserDicEntry(fp, userdic_itr->first, userdic_itr->second, so);
WriteUserDicEntry(fp, userdic_itr->first, userdic_itr->second, so);
}
}

fclose(fp);

exit:

LeaveCriticalSection(&csUserDataSave); // !
LeaveCriticalSection(&csSaveUserDic); // !

delete userdata;

return 0;
}

void StartSaveSKKUserDic(BOOL bThread)
void StartSaveUserDic(BOOL bThread)
{
if(hThreadUserDic != INVALID_HANDLE_VALUE)
{
DWORD ws = WaitForSingleObject(hThreadUserDic, (bThread ? 0 : INFINITE));
switch(ws)
{
case WAIT_OBJECT_0:
CloseHandle(hThreadUserDic);
hThreadUserDic = INVALID_HANDLE_VALUE;
break;
case WAIT_TIMEOUT:
return;
break;
default:
break;
}
}

if(bUserDicChg)
{
bUserDicChg = FALSE;
USERDATA *userdata = nullptr;

try
{
USERDATA *userdata = new USERDATA();
userdata = new USERDATA();
userdata->userdic = userdic;
userdata->userokuri = userokuri;
userdata->complements = complements;
userdata->accompaniments = accompaniments;

if(bThread)
}
catch(...)
{
if(userdata != nullptr)
{
_beginthread(SaveSKKUserDic, 0, userdata);
delete userdata;
}
else
return;
}

if(bThread)
{
if(hThreadUserDic == INVALID_HANDLE_VALUE)
{
SaveSKKUserDic(userdata);
hThreadUserDic = (HANDLE)_beginthreadex(nullptr, 0, SaveUserDic, userdata, 0, nullptr);
if(hThreadUserDic == nullptr)
{
delete userdata;
hThreadUserDic = INVALID_HANDLE_VALUE;
}
else
{
bUserDicChg = FALSE;
}
}
}
catch(...)
else
{
SaveUserDic(userdata);
bUserDicChg = FALSE;
}
}
}

void BackUpSKKUserDic()
void BackUpUserDic()
{
EnterCriticalSection(&csUserDataSave); // !

WCHAR oldpath[MAX_PATH];
WCHAR newpath[MAX_PATH];

EnterCriticalSection(&csSaveUserDic); // !

for(int i = BACKUP_GENS; i > 1; i--)
{
_snwprintf_s(oldpath, _TRUNCATE, L"%s%d", pathuserbak, i - 1);
Expand All @@ -636,5 +678,5 @@ void BackUpSKKUserDic()

CopyFileW(pathuserdic, newpath, FALSE);

LeaveCriticalSection(&csUserDataSave); // !
LeaveCriticalSection(&csSaveUserDic); // !
}
17 changes: 8 additions & 9 deletions imcrvmgr/Server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ void SrvProc(WCHAR command, const std::wstring &argument, std::wstring &result)
}
else
{
StartSaveSKKUserDic(TRUE);
StartSaveUserDic(TRUE);
}

result = REP_OK;
Expand Down Expand Up @@ -311,7 +311,7 @@ unsigned int __stdcall SrvThread(void *p)
tedit = std::regex_replace(tedit, re, fmt);

dedit.append(tedit);
SetWindowTextW(hwndEdit, dedit.c_str());
SetWindowTextW(hWndEdit, dedit.c_str());
#endif

SrvProc(command, &pipebuf[2], wspipebuf);
Expand All @@ -327,8 +327,8 @@ unsigned int __stdcall SrvThread(void *p)
tedit = std::regex_replace(tedit, re, fmt);

dedit.append(tedit);
SetWindowTextW(hwndEdit, dedit.c_str());
SendMessageW(hwndEdit, WM_VSCROLL, SB_BOTTOM, 0);
SetWindowTextW(hWndEdit, dedit.c_str());
SendMessageW(hWndEdit, WM_VSCROLL, SB_BOTTOM, 0);

switch(command)
{
Expand Down Expand Up @@ -378,11 +378,10 @@ HANDLE SrvStart()
if(hPipe != INVALID_HANDLE_VALUE)
{
hThread = (HANDLE)_beginthreadex(nullptr, 0, SrvThread, hPipe, 0, nullptr);
}

if(hThread == nullptr)
{
CloseHandle(hPipe);
if(hThread == nullptr)
{
CloseHandle(hPipe);
}
}

return hThread;
Expand Down
Loading

0 comments on commit c2309d3

Please sign in to comment.