// // Copyright (c) 1997-1999 Microsoft Corporation. // #include #include #include "resource.h" #include "imeblink.h" #define UNICODE_CP 1200 /************************************************************/ /* MatchImeName() */ /************************************************************/ HKL MatchImeName( LPCTSTR szStr) { TCHAR szImeName[16]; int nLayout; HKL hKL; HGLOBAL hMem; HKL FAR * lpMem; int i; nLayout = GetKeyboardLayoutList(0, NULL); // alloc temp buffer hMem = GlobalAlloc(GHND, sizeof(HKL) * nLayout); if (!hMem) { return (NULL); } lpMem = (HKL FAR *)GlobalLock(hMem); if (!lpMem) { GlobalFree(hMem); return (NULL); } // get all keyboard layouts, it includes all IMEs GetKeyboardLayoutList(nLayout, lpMem); for (i = 0; i < nLayout; i++) { LRESULT lRet; hKL = *(lpMem + i); lRet = ImmEscape(hKL, (HIMC)NULL, IME_ESC_IME_NAME, szImeName); if (!lRet) { // this hKL can not ask name continue; } if (lstrcmp(szStr, szImeName) == 0) { goto MatchOvr; } } hKL = NULL; MatchOvr: GlobalUnlock(hMem); GlobalFree(hMem); return (hKL); } /************************************************************/ /* RegisterTable() */ /************************************************************/ HKL RegisterTable( HWND hWnd, LPUSRDICIMHDR lpIsvUsrDic, DWORD dwFileSize, UINT uCodePage) { HKL hKL; // HDC hDC; // SIZE lTextSize; // RECT rcProcess; DWORD i; LPBYTE lpCurr, lpEnd; BOOL fRet; TCHAR szStr[16]; // TCHAR szProcessFmt[32]; // TCHAR szResult[2][32]; // TCHAR szProcessInfo[48]; WORD wInternalCode[256]; WORD wAltInternalCode[256]; #ifdef UNICODE if (uCodePage == UNICODE_CP) { LPUNATSTR lpszMethodName; lpszMethodName = (LPUNATSTR)lpIsvUsrDic->achMethodName; for (i = 0; i < sizeof(lpIsvUsrDic->achMethodName) / sizeof(TCHAR); i++) { szStr[i] = *lpszMethodName++; } szStr[i] = '\0'; } else { UINT uLen; uLen = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, (LPCSTR)lpIsvUsrDic->achMethodName, sizeof(lpIsvUsrDic->achMethodName), szStr, sizeof(szStr) / sizeof(TCHAR)); if (uLen == 0) { uCodePage = CP_ACP; uLen = MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, (LPCSTR)lpIsvUsrDic->achMethodName, sizeof(lpIsvUsrDic->achMethodName), szStr, sizeof(szStr) / sizeof(TCHAR)); } szStr[uLen] = '\0'; } #else for (i = 0; i < sizeof(lpIsvUsrDic->achMethodName); i++) { szStr[i] = lpIsvUsrDic->achMethodName[i]; } szStr[i] = '\0'; #endif hKL = MatchImeName(szStr); if (!hKL) { return (hKL); } // convert sequence code to internal code for (i = 0; i < sizeof(wInternalCode) / sizeof(WORD); i++) { LRESULT lRet; lRet = ImmEscape(hKL, (HIMC)NULL, IME_ESC_SEQUENCE_TO_INTERNAL, &i); if (HIWORD(lRet) == 0xFFFF) { // This is caused by sign extent in Win9x in the return value of // ImmEscape, it causes an invalid internal code. wAltInternalCode[i] = 0; } else { wAltInternalCode[i] = HIWORD(lRet); } wInternalCode[i] = LOWORD(lRet); #ifndef UNICODE if (wAltInternalCode[i] > 0xFF) { // convert to multi byte string wAltInternalCode[i] = LOBYTE(wAltInternalCode[i]) << 8 | HIBYTE(wAltInternalCode[i]); } if (wInternalCode[i] > 0xFF) { // convert to multi byte string wInternalCode[i] = LOBYTE(wInternalCode[i]) << 8 | HIBYTE(wInternalCode[i]); } #endif } // check for each record and register it // get to the first record and skip the Bank ID lpCurr = (LPBYTE)(lpIsvUsrDic + 1) + sizeof(WORD); lpEnd = (LPBYTE)lpIsvUsrDic + dwFileSize; for (; lpCurr < lpEnd; // internal code + sequence code + Bank ID of next record lpCurr += sizeof(WORD) + lpIsvUsrDic->cMethodKeySize + sizeof(WORD)) { int j; // quick way to init \0 for the register string *(LPDWORD)szStr = 0; #ifdef UNICODE if (uCodePage == UNICODE_CP) { szStr[0] = *(LPUNATSTR)lpCurr; } else { CHAR szMultiByte[4]; szMultiByte[0] = HIBYTE(*(LPTSTR)lpCurr); szMultiByte[1] = LOBYTE(*(LPTSTR)lpCurr); MultiByteToWideChar(uCodePage, MB_PRECOMPOSED, szMultiByte, 2, szStr, 2); } #else szStr[1] = *lpCurr; szStr[0] = *(lpCurr + 1); #endif for (i = 0, j = 0; i < lpIsvUsrDic->cMethodKeySize; i++) { if (!wAltInternalCode[*(LPBYTE)(lpCurr + sizeof(WORD) + i)]) { } else if (wAltInternalCode[*(LPBYTE)(lpCurr + sizeof(WORD) + i)] < 0xFF) { *(LPTSTR)&szStr[4 + j] = (TCHAR) wAltInternalCode[*(LPBYTE)(lpCurr + sizeof(WORD) + i)]; j += sizeof(TCHAR) / sizeof(TCHAR); } else { *(LPWSTR)&szStr[4 + j] = (WCHAR) wAltInternalCode[*(LPBYTE)(lpCurr + sizeof(WORD) + i)]; j += sizeof(WCHAR) / sizeof(TCHAR); } if (wInternalCode[*(LPBYTE)(lpCurr + sizeof(WORD) + i)] < 0xFF) { *(LPTSTR)&szStr[4 + j] = (TCHAR) wInternalCode[*(LPBYTE)(lpCurr + sizeof(WORD) + i)]; j += sizeof(TCHAR) / sizeof(TCHAR); } else { *(LPWSTR)&szStr[4 + j] = (WCHAR) wInternalCode[*(LPBYTE)(lpCurr + sizeof(WORD) + i)]; j += sizeof(WCHAR) / sizeof(TCHAR); } } szStr[4 + j] = szStr[4 + j + 1] = szStr[4 + j + 2] = '\0'; fRet = ImmRegisterWord(hKL, &szStr[4], IME_REGWORD_STYLE_EUDC, szStr); } return (hKL); }