00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
#include "precomp.h"
00012
#pragma hdrstop
00013
00014
00015
UINT
00016
JTransCompositionA(
00017 LPINPUTCONTEXT lpIMC,
00018 LPCOMPOSITIONSTRING lpCompStrA,
00019 PTRANSMSG pTransMsgSrc,
00020 PTRANSMSG pTransMsgDest
00021 );
00022
00023
UINT
00024
JTransCompositionW(
00025 LPINPUTCONTEXT lpIMC,
00026 LPCOMPOSITIONSTRING lpCompStrW,
00027 PTRANSMSG pTransMsgSrc,
00028 PTRANSMSG pTransMsgDest
00029 );
00030
00031
DWORD
00032
CompStrWToUndetW(
00033 DWORD dwGCS,
00034 LPCOMPOSITIONSTRING lpCompStrW,
00035 LPUNDETERMINESTRUCT lpUndetW
00036 );
00037
00038
DWORD
00039
CompStrWToUndetA(
00040 DWORD dwGCS,
00041 LPCOMPOSITIONSTRING lpCompStrW,
00042 LPUNDETERMINESTRUCT lpUndetA
00043 );
00044
00045
DWORD
00046
CompStrWToStringExW(
00047 DWORD dwGCS,
00048 LPCOMPOSITIONSTRING lpCompStrW,
00049 LPSTRINGEXSTRUCT lpStringExW
00050 );
00051
00052
DWORD
00053
CompStrWToStringExA(
00054 DWORD dwGCS,
00055 LPCOMPOSITIONSTRING lpCompStrW,
00056 LPSTRINGEXSTRUCT lpStringExA
00057 );
00058
00059
DWORD
00060
CompStrWToStringW(
00061 LPCOMPOSITIONSTRING lpCompStrW,
00062 LPWSTR lpStringW
00063 );
00064
00065
DWORD
00066
CompStrWToStringA(
00067 LPCOMPOSITIONSTRING lpCompStrW,
00068 LPSTR lpStringA
00069 );
00070
00071
VOID
00072
CompStrWToCharW(
00073 HWND hWnd,
00074 LPCOMPOSITIONSTRING lpCompStrW
00075 );
00076
00077
VOID
00078
CompStrWToCharA(
00079 HWND hWnd,
00080 LPCOMPOSITIONSTRING lpCompStrW
00081 );
00082
00083
DWORD
00084
CompStrAToUndetA(
00085 DWORD dwGCS,
00086 LPCOMPOSITIONSTRING lpCompStrA,
00087 LPUNDETERMINESTRUCT lpUndetA
00088 );
00089
00090
DWORD
00091
CompStrAToUndetW(
00092 DWORD dwGCS,
00093 LPCOMPOSITIONSTRING lpCompStrA,
00094 LPUNDETERMINESTRUCT lpUndetW
00095 );
00096
00097
DWORD
00098
CompStrAToStringExA(
00099 DWORD dwGCS,
00100 LPCOMPOSITIONSTRING lpCompStrA,
00101 LPSTRINGEXSTRUCT lpStringExA
00102 );
00103
00104
DWORD
00105
CompStrAToStringExW(
00106 DWORD dwGCS,
00107 LPCOMPOSITIONSTRING lpCompStrA,
00108 LPSTRINGEXSTRUCT lpStringExW
00109 );
00110
00111
DWORD
00112
CompStrAToStringA(
00113 LPCOMPOSITIONSTRING lpCompStrA,
00114 LPSTR lpStringA
00115 );
00116
00117
DWORD
00118
CompStrAToStringW(
00119 LPCOMPOSITIONSTRING lpCompStrA,
00120 LPWSTR lpStringW
00121 );
00122
00123
VOID
00124
CompStrAToCharA(
00125 HWND hWnd,
00126 LPCOMPOSITIONSTRING lpCompStrA
00127 );
00128
00129
VOID
00130
CompStrAToCharW(
00131 HWND hWnd,
00132 LPCOMPOSITIONSTRING lpCompStrA
00133 );
00134
00135
00136
UINT
00137 JTransCompositionA(
00138 LPINPUTCONTEXT lpIMC,
00139 LPCOMPOSITIONSTRING lpCompStrA,
00140 PTRANSMSG pTransMsgSrc,
00141 PTRANSMSG pTransMsgDest
00142 )
00143 {
00144
UINT i = 0;
00145
int iNum = 0;
00146
DWORD dwSize;
00147 HWND
hWnd;
00148 WORD wTextLen = 0;
00149
BOOL fDoneUndet =
FALSE;
00150
BOOL fDoneDet =
FALSE;
00151
DWORD dwGCS;
00152
BOOL bAnsiWnd;
00153
00154
hWnd = (HWND)lpIMC->hWnd;
00155
00156
if (!
IsWindow(
hWnd))
00157
return 0;
00158
00159 bAnsiWnd = (!
IsWindowUnicode(
hWnd)) ?
TRUE :
FALSE;
00160
00161 dwGCS = (
DWORD)pTransMsgSrc->lParam;
00162
00163
if (lpIMC->fdw31Compat & F31COMPAT_MCWHIDDEN)
00164 {
00165
if (bAnsiWnd) {
00166 dwSize =
CompStrAToUndetA(dwGCS, lpCompStrA,
NULL);
00167
if (dwSize != 0) {
00168 HGLOBAL hUndetA =
NULL;
00169 LPUNDETERMINESTRUCT lpUndetA;
00170
00171
if (hUndetA = GlobalAlloc(GHND | GMEM_SHARE, dwSize)) {
00172
if (lpUndetA = (LPUNDETERMINESTRUCT)GlobalLock(hUndetA)) {
00173
CompStrAToUndetA(dwGCS, lpCompStrA, lpUndetA);
00174 fDoneUndet =
TRUE;
00175 GlobalUnlock(hUndetA);
00176
00177
if (SendMessageA(
hWnd,WM_IME_REPORT,IR_UNDETERMINE, (LPARAM)hUndetA)) {
00178 GlobalFree(hUndetA);
00179
return 0;
00180 }
00181 }
00182 GlobalFree(hUndetA);
00183 }
00184 }
00185 }
00186
else {
00187 dwSize =
CompStrAToUndetW(dwGCS, lpCompStrA,
NULL);
00188
if (dwSize != 0) {
00189 HGLOBAL hUndetW =
NULL;
00190 LPUNDETERMINESTRUCT lpUndetW;
00191
00192
if (hUndetW = GlobalAlloc(GHND | GMEM_SHARE, dwSize)) {
00193
if (lpUndetW = (LPUNDETERMINESTRUCT)GlobalLock(hUndetW)) {
00194
CompStrAToUndetW(dwGCS, lpCompStrA, lpUndetW);
00195 fDoneUndet =
TRUE;
00196 GlobalUnlock(hUndetW);
00197
00198
if (SendMessageW(
hWnd,WM_IME_REPORT,IR_UNDETERMINE, (LPARAM)hUndetW)) {
00199 GlobalFree(hUndetW);
00200
return 0;
00201 }
00202 }
00203 GlobalFree(hUndetW);
00204 }
00205 }
00206 }
00207 }
00208
00209
00210
00211
00212
00213
00214
if (dwGCS & GCS_RESULTSTR)
00215 {
00216
00217
00218
00219
00220
if (dwGCS & GCS_RESULTREADSTR)
00221 {
00222
if (bAnsiWnd) {
00223 dwSize =
CompStrAToStringExA(dwGCS, lpCompStrA,
NULL);
00224
if (dwSize != 0) {
00225 HGLOBAL hStringExA =
NULL;
00226 LPSTRINGEXSTRUCT lpStringExA;
00227
00228
if (hStringExA = GlobalAlloc(GHND | GMEM_SHARE, dwSize)) {
00229
if (lpStringExA = (LPSTRINGEXSTRUCT)GlobalLock(hStringExA)) {
00230
CompStrAToStringExA(dwGCS, lpCompStrA, lpStringExA);
00231 GlobalUnlock(hStringExA);
00232
00233
if (SendMessageA(
hWnd,WM_IME_REPORT,IR_STRINGEX, (LPARAM)hStringExA))
00234 {
00235 GlobalFree(hStringExA);
00236 fDoneDet =
TRUE;
00237
goto jtc_exit_30;
00238 }
00239 }
00240 GlobalFree(hStringExA);
00241 }
00242 }
00243 }
00244
else {
00245 dwSize =
CompStrAToStringExW(dwGCS, lpCompStrA,
NULL);
00246
if (dwSize != 0) {
00247 HGLOBAL hStringExW =
NULL;
00248 LPSTRINGEXSTRUCT lpStringExW;
00249
00250
if (hStringExW = GlobalAlloc(GHND | GMEM_SHARE, dwSize)) {
00251
if (lpStringExW = (LPSTRINGEXSTRUCT)GlobalLock(hStringExW)) {
00252
CompStrAToStringExW(dwGCS, lpCompStrA, lpStringExW);
00253 GlobalUnlock(hStringExW);
00254
00255
if (SendMessageW(
hWnd,WM_IME_REPORT,IR_STRINGEX, (LPARAM)hStringExW))
00256 {
00257 GlobalFree(hStringExW);
00258 fDoneDet =
TRUE;
00259
goto jtc_exit_30;
00260 }
00261 }
00262 GlobalFree(hStringExW);
00263 }
00264 }
00265 }
00266 }
00267
00268
00269
00270
00271
00272
if (bAnsiWnd) {
00273 dwSize =
CompStrAToStringA(lpCompStrA,
NULL);
00274
if (dwSize != 0) {
00275 HGLOBAL hStringA =
NULL;
00276 LPSTR lpStringA;
00277
00278
if (hStringA = GlobalAlloc(GHND | GMEM_SHARE, dwSize)) {
00279
if (lpStringA = (LPSTR)GlobalLock(hStringA)) {
00280
CompStrAToStringA(lpCompStrA, lpStringA);
00281 GlobalUnlock(hStringA);
00282
00283
if (SendMessageA(
hWnd,WM_IME_REPORT,IR_STRING, (LPARAM)hStringA))
00284 {
00285 GlobalFree(hStringA);
00286 fDoneDet =
TRUE;
00287
goto jtc_exit_30;
00288 }
00289 }
00290 GlobalFree(hStringA);
00291 }
00292 }
00293
else {
00294
return 0;
00295 }
00296 }
00297
else {
00298 dwSize =
CompStrAToStringW(lpCompStrA,
NULL);
00299
if (dwSize != 0) {
00300 HGLOBAL hStringW =
NULL;
00301 LPWSTR lpStringW;
00302
00303
if (hStringW = GlobalAlloc(GHND | GMEM_SHARE, dwSize)) {
00304
if (lpStringW = (LPWSTR)GlobalLock(hStringW)) {
00305
CompStrAToStringW(lpCompStrA, lpStringW);
00306 GlobalUnlock(hStringW);
00307
00308
if (SendMessageW(
hWnd,WM_IME_REPORT,IR_STRING, (LPARAM)hStringW))
00309 {
00310 GlobalFree(hStringW);
00311 fDoneDet =
TRUE;
00312
goto jtc_exit_30;
00313 }
00314 }
00315 GlobalFree(hStringW);
00316 }
00317 }
00318
else {
00319
return 0;
00320 }
00321 }
00322
00323
00324
00325
00326
00327
if (bAnsiWnd) {
00328
CompStrAToCharA(
hWnd, lpCompStrA);
00329 }
00330
else {
00331
CompStrAToCharW(
hWnd, lpCompStrA);
00332 }
00333
00334 fDoneDet =
TRUE;
00335 }
00336
00337
00338
if (!fDoneUndet && !fDoneDet)
00339 {
00340 *pTransMsgDest = *pTransMsgSrc;
00341 iNum++;
00342 }
00343
00344 jtc_exit_30:
00345
00346
if (!fDoneUndet && fDoneDet && (dwGCS & GCS_COMPSTR))
00347 {
00348 pTransMsgDest->message = pTransMsgSrc->message;
00349 pTransMsgDest->wParam = pTransMsgSrc->wParam;
00350 pTransMsgDest->lParam = (LPARAM)(dwGCS & ~(GCS_RESULT | GCS_RESULTREAD));
00351 iNum++;
00352 }
00353
00354
return iNum;
00355 }
00356
00357
00358
UINT
00359 JTransCompositionW(
00360 LPINPUTCONTEXT lpIMC,
00361 LPCOMPOSITIONSTRING lpCompStrW,
00362 PTRANSMSG pTransMsgSrc,
00363 PTRANSMSG pTransMsgDest
00364 )
00365 {
00366
UINT i = 0;
00367
int iNum = 0;
00368
DWORD dwSize;
00369 HWND
hWnd;
00370 WORD wTextLen = 0;
00371
BOOL fDoneUndet =
FALSE;
00372
BOOL fDoneDet =
FALSE;
00373
DWORD dwGCS;
00374
BOOL bAnsiWnd;
00375
00376
hWnd = (HWND)lpIMC->hWnd;
00377
00378
if (!
IsWindow(
hWnd))
00379
return 0;
00380
00381 bAnsiWnd = (!
IsWindowUnicode(
hWnd)) ?
TRUE :
FALSE;
00382
00383 dwGCS = (
DWORD)pTransMsgSrc->lParam;
00384
00385
if (lpIMC->fdw31Compat & F31COMPAT_MCWHIDDEN)
00386 {
00387
if (bAnsiWnd) {
00388 dwSize =
CompStrWToUndetA(dwGCS, lpCompStrW,
NULL);
00389
if (dwSize != 0) {
00390 HGLOBAL hUndetA =
NULL;
00391 LPUNDETERMINESTRUCT lpUndetA;
00392
00393
if (hUndetA = GlobalAlloc(GHND | GMEM_SHARE, dwSize)) {
00394
if (lpUndetA = (LPUNDETERMINESTRUCT)GlobalLock(hUndetA)) {
00395
CompStrWToUndetA(dwGCS, lpCompStrW, lpUndetA);
00396 fDoneUndet =
TRUE;
00397 GlobalUnlock(hUndetA);
00398
00399
if (SendMessageA(
hWnd,WM_IME_REPORT,IR_UNDETERMINE, (LPARAM)hUndetA)) {
00400 GlobalFree(hUndetA);
00401
return 0;
00402 }
00403 }
00404 GlobalFree(hUndetA);
00405 }
00406 }
00407 }
00408
else {
00409 dwSize =
CompStrWToUndetW(dwGCS, lpCompStrW,
NULL);
00410
if (dwSize != 0) {
00411 HGLOBAL hUndetW =
NULL;
00412 LPUNDETERMINESTRUCT lpUndetW;
00413
00414
if (hUndetW = GlobalAlloc(GHND | GMEM_SHARE, dwSize)) {
00415
if (lpUndetW = (LPUNDETERMINESTRUCT)GlobalLock(hUndetW)) {
00416
CompStrWToUndetW(dwGCS, lpCompStrW, lpUndetW);
00417 fDoneUndet =
TRUE;
00418 GlobalUnlock(hUndetW);
00419
00420
if (SendMessageW(
hWnd,WM_IME_REPORT,IR_UNDETERMINE, (LPARAM)hUndetW)) {
00421 GlobalFree(hUndetW);
00422
return 0;
00423 }
00424 }
00425 GlobalFree(hUndetW);
00426 }
00427 }
00428 }
00429 }
00430
00431
00432
00433
00434
00435
00436
if (dwGCS & GCS_RESULTSTR)
00437 {
00438
00439
00440
00441
00442
if (dwGCS & GCS_RESULTREADSTR)
00443 {
00444
if (bAnsiWnd) {
00445 dwSize =
CompStrWToStringExA(dwGCS, lpCompStrW,
NULL);
00446
if (dwSize != 0) {
00447 HGLOBAL hStringExA =
NULL;
00448 LPSTRINGEXSTRUCT lpStringExA;
00449
00450
if (hStringExA = GlobalAlloc(GHND | GMEM_SHARE, dwSize)) {
00451
if (lpStringExA = (LPSTRINGEXSTRUCT)GlobalLock(hStringExA)) {
00452
CompStrWToStringExA(dwGCS, lpCompStrW, lpStringExA);
00453 GlobalUnlock(hStringExA);
00454
00455
if (SendMessageA(
hWnd,WM_IME_REPORT,IR_STRINGEX, (LPARAM)hStringExA))
00456 {
00457 GlobalFree(hStringExA);
00458 fDoneDet =
TRUE;
00459
goto jtc_exit_30;
00460 }
00461 }
00462 GlobalFree(hStringExA);
00463 }
00464 }
00465 }
00466
else {
00467 dwSize =
CompStrWToStringExW(dwGCS, lpCompStrW,
NULL);
00468
if (dwSize != 0) {
00469 HGLOBAL hStringExW =
NULL;
00470 LPSTRINGEXSTRUCT lpStringExW;
00471
00472
if (hStringExW = GlobalAlloc(GHND | GMEM_SHARE, dwSize)) {
00473
if (lpStringExW = (LPSTRINGEXSTRUCT)GlobalLock(hStringExW)) {
00474
CompStrWToStringExW(dwGCS, lpCompStrW, lpStringExW);
00475 GlobalUnlock(hStringExW);
00476
00477
if (SendMessageW(
hWnd,WM_IME_REPORT,IR_STRINGEX, (LPARAM)hStringExW))
00478 {
00479 GlobalFree(hStringExW);
00480 fDoneDet =
TRUE;
00481
goto jtc_exit_30;
00482 }
00483 }
00484 GlobalFree(hStringExW);
00485 }
00486 }
00487 }
00488 }
00489
00490
00491
00492
00493
00494
if (bAnsiWnd) {
00495 dwSize =
CompStrWToStringA(lpCompStrW,
NULL);
00496
if (dwSize != 0) {
00497 HGLOBAL hStringA =
NULL;
00498 LPSTR lpStringA;
00499
00500
if (hStringA = GlobalAlloc(GHND | GMEM_SHARE, dwSize)) {
00501
if (lpStringA = (LPSTR)GlobalLock(hStringA)) {
00502
CompStrWToStringA(lpCompStrW, lpStringA);
00503 GlobalUnlock(hStringA);
00504
00505
if (SendMessageA(
hWnd,WM_IME_REPORT,IR_STRING, (LPARAM)hStringA))
00506 {
00507 GlobalFree(hStringA);
00508 fDoneDet =
TRUE;
00509
goto jtc_exit_30;
00510 }
00511 }
00512 GlobalFree(hStringA);
00513 }
00514 }
00515
else {
00516
return 0;
00517 }
00518 }
00519
else {
00520 dwSize =
CompStrWToStringW(lpCompStrW,
NULL);
00521
if (dwSize != 0) {
00522 HGLOBAL hStringW =
NULL;
00523 LPWSTR lpStringW;
00524
00525
if (hStringW = GlobalAlloc(GHND | GMEM_SHARE, dwSize)) {
00526
if (lpStringW = (LPWSTR)GlobalLock(hStringW)) {
00527
CompStrWToStringW(lpCompStrW, lpStringW);
00528 GlobalUnlock(hStringW);
00529
00530
if (SendMessageW(
hWnd,WM_IME_REPORT,IR_STRING, (LPARAM)hStringW))
00531 {
00532 GlobalFree(hStringW);
00533 fDoneDet =
TRUE;
00534
goto jtc_exit_30;
00535 }
00536 }
00537 GlobalFree(hStringW);
00538 }
00539 }
00540
else {
00541
return 0;
00542 }
00543 }
00544
00545
00546
00547
00548
00549
if (bAnsiWnd) {
00550
CompStrWToCharA(
hWnd, lpCompStrW);
00551 }
00552
else {
00553
CompStrWToCharW(
hWnd, lpCompStrW);
00554 }
00555
00556 fDoneDet =
TRUE;
00557 }
00558
00559
00560
if (!fDoneUndet && !fDoneDet)
00561 {
00562 *pTransMsgDest = *pTransMsgSrc;
00563 iNum++;
00564 }
00565
00566 jtc_exit_30:
00567
00568
if (!fDoneUndet && fDoneDet && (dwGCS & GCS_COMPSTR))
00569 {
00570 pTransMsgDest->message = pTransMsgSrc->message;
00571 pTransMsgDest->wParam = pTransMsgSrc->wParam;
00572 pTransMsgDest->lParam = (LPARAM)(dwGCS & ~(GCS_RESULT | GCS_RESULTREAD));
00573 iNum++;
00574 }
00575
00576
return iNum;
00577 }
00578
00579
00580
00581
UINT
00582 WINNLSTranslateMessageJ(
00583 UINT uiNumMsg,
00584 PTRANSMSG pTransMsg,
00585 LPINPUTCONTEXT lpIMC,
00586 LPCOMPOSITIONSTRING lpCompStr,
00587 BOOL bAnsiIMC
00588 )
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600 {
00601 PTRANSMSG pTransMsgBuf, pTransMsgTemp;
00602
UINT uiNewNum = 0;
00603
UINT uiTempNum;
00604
DWORD dwTempSize;
00605 HWND hDefIMEWnd;
00606
UINT i;
00607
BOOL bAnsiWnd;
00608
00609 hDefIMEWnd =
ImmGetDefaultIMEWnd((HWND)lpIMC->hWnd);
00610
00611 bAnsiWnd = (!
IsWindowUnicode(lpIMC->hWnd)) ?
TRUE :
FALSE;
00612
00613 dwTempSize = uiNumMsg *
sizeof(TRANSMSG);
00614
00615
00616
00617
00618
00619 pTransMsgBuf = (PTRANSMSG)
ImmLocalAlloc( HEAP_ZERO_MEMORY,
00620 dwTempSize +
sizeof(TRANSMSG)
00621 );
00622
if ( pTransMsgBuf ==
NULL )
00623
goto wtmsg2_j_10;
00624
00625 RtlCopyMemory(pTransMsgBuf, pTransMsg, dwTempSize);
00626 pTransMsgTemp = pTransMsgBuf;
00627
00628
00629
00630
00631
00632
00633
00634
if (lpIMC->fdw31Compat & F31COMPAT_MCWHIDDEN) {
00635
00636
for (i = 0; i < uiNumMsg; i++, pTransMsgTemp++) {
00637
if (pTransMsgTemp->message == WM_IME_ENDCOMPOSITION) {
00638
break;
00639 }
00640 }
00641
00642
if (pTransMsgTemp->message == WM_IME_ENDCOMPOSITION) {
00643
00644 PTRANSMSG pTransMsgSrc = pTransMsgTemp + 1;
00645
00646
while (pTransMsgSrc->message != 0) {
00647 *pTransMsgTemp++ = *pTransMsgSrc++;
00648 }
00649
00650 pTransMsgTemp->message = WM_IME_ENDCOMPOSITION;
00651 pTransMsgTemp->wParam = 0
L;
00652 pTransMsgTemp->lParam = 0
L;
00653
00654 }
00655
00656 pTransMsgTemp = pTransMsgBuf;
00657 }
00658
00659
while (pTransMsgTemp->message != 0) {
00660
00661
switch (pTransMsgTemp->message)
00662 {
00663
case WM_IME_COMPOSITION:
00664
00665
if (bAnsiIMC)
00666 uiTempNum =
JTransCompositionA(lpIMC,lpCompStr,pTransMsgTemp,pTransMsg);
00667
else
00668 uiTempNum =
JTransCompositionW(lpIMC,lpCompStr,pTransMsgTemp,pTransMsg);
00669
00670 uiNewNum += uiTempNum;
00671 pTransMsg += uiTempNum;
00672
00673
if ( !(lpIMC->fdw31Compat & F31COMPAT_MCWHIDDEN) )
00674 {
00675
if ( lpIMC->cfCompForm.dwStyle != CFS_DEFAULT ) {
00676
SendMessage((HWND)lpIMC->hWnd, WM_IME_REPORT, IR_CHANGECONVERT, 0
L);
00677 }
00678 }
00679
00680
break;
00681
00682
case WM_IME_STARTCOMPOSITION:
00683
00684
if ( !(lpIMC->fdw31Compat & F31COMPAT_MCWHIDDEN) )
00685 {
00686
if ( lpIMC->cfCompForm.dwStyle != CFS_DEFAULT ) {
00687
SendMessage((HWND)lpIMC->hWnd, WM_IME_REPORT, IR_OPENCONVERT, 0
L);
00688 }
00689
00690 *pTransMsg++ = *pTransMsgTemp;
00691 uiNewNum++;
00692 }
00693
00694
break;
00695
00696
case WM_IME_ENDCOMPOSITION:
00697
00698
if ( !(lpIMC->fdw31Compat & F31COMPAT_MCWHIDDEN) )
00699 {
00700
if ( lpIMC->cfCompForm.dwStyle != CFS_DEFAULT ) {
00701
SendMessage((HWND)lpIMC->hWnd, WM_IME_REPORT, IR_CLOSECONVERT, 0
L);
00702 }
00703
00704 *pTransMsg++ = *pTransMsgTemp;
00705 uiNewNum++;
00706
00707 }
00708
else {
00709
00710 HWND
hWnd = (HWND)lpIMC->hWnd;
00711 HGLOBAL hUndet = 0
L;
00712
00713
if (hUndet = GlobalAlloc(GHND | GMEM_SHARE,
sizeof(UNDETERMINESTRUCT)))
00714 {
00715
if (!
IsWindowUnicode(lpIMC->hWnd))
00716 SendMessageA(
hWnd,WM_IME_REPORT, IR_UNDETERMINE, (LPARAM)hUndet);
00717
else
00718 SendMessageW(
hWnd,WM_IME_REPORT, IR_UNDETERMINE, (LPARAM)hUndet);
00719
00720 GlobalFree(hUndet);
00721 }
00722 }
00723
00724
break;
00725
00726
case WM_IME_NOTIFY:
00727
00728
switch (pTransMsgTemp->wParam)
00729 {
00730
case IMN_OPENCANDIDATE:
00731
00732
00733
00734
00735
00736
00737
00738
00739
if (
IsWindow((HWND)lpIMC->hWnd) &&
00740 (lpIMC->fdw31Compat & F31COMPAT_MCWHIDDEN)) {
00741 CANDIDATEFORM cfCandForm;
00742
DWORD i;
00743
DWORD dwNumCand = 0;
00744
00745
for (i = 0; i < 32; i++)
00746 {
00747
00748
00749
00750
if (!(pTransMsgTemp->lParam & (01
L << i)))
00751
continue;
00752
00753 cfCandForm.dwIndex = i;
00754 cfCandForm.dwStyle = CFS_EXCLUDE;
00755 cfCandForm.ptCurrentPos = lpIMC->cfCompForm.ptCurrentPos;
00756 cfCandForm.rcArea = lpIMC->cfCompForm.rcArea;
00757
SendMessage(hDefIMEWnd, WM_IME_CONTROL, IMC_SETCANDIDATEPOS,
00758 (LPARAM)(LPCANDIDATEFORM)&cfCandForm);
00759 }
00760 }
00761
00762
break;
00763
00764
default :
00765
break;
00766 }
00767
00768
if (!(lpIMC->fdw31Compat & F31COMPAT_MCWHIDDEN)) {
00769 *pTransMsg++ = *pTransMsgTemp;
00770 uiNewNum++;
00771 }
00772
else {
00773
00774
00775
00776
00777
00778
SendMessage( hDefIMEWnd,
00779 pTransMsgTemp->message,
00780 pTransMsgTemp->wParam,
00781 pTransMsgTemp->lParam
00782 );
00783 }
00784
00785
break;
00786
00787
default :
00788 *pTransMsg++ = *pTransMsgTemp;
00789 uiNewNum++;
00790
break;
00791 }
00792
00793 pTransMsgTemp++;
00794 }
00795
00796
ImmLocalFree(pTransMsgBuf);
00797
00798 wtmsg2_j_10:
00799
return (uiNewNum);
00800 }
00801
00802
00803
DWORD
00804 CompStrAToUndetA(
00805 DWORD dwGCS,
00806 LPCOMPOSITIONSTRING lpCompStrA,
00807 LPUNDETERMINESTRUCT lpUndetA
00808 )
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822 {
00823
DWORD dwPos;
00824
DWORD dwSize;
00825
UINT i;
00826
00827 dwSize =
DWORD_ALIGN((
sizeof(UNDETERMINESTRUCT)+1)) +
00828
DWORD_ALIGN(((lpCompStrA->dwResultStrLen+1) *
sizeof(
CHAR))) +
00829
DWORD_ALIGN((lpCompStrA->dwResultClauseLen+1)) +
00830
DWORD_ALIGN(((lpCompStrA->dwResultReadStrLen+1) *
sizeof(
CHAR))) +
00831
DWORD_ALIGN((lpCompStrA->dwResultReadClauseLen+1)) +
00832
DWORD_ALIGN((lpCompStrA->dwCompAttrLen+1)) +
00833
DWORD_ALIGN(((lpCompStrA->dwCompStrLen+1) *
sizeof(
CHAR)));
00834
00835
if (lpUndetA ==
NULL) {
00836
return dwSize;
00837 }
00838
00839 dwPos =
DWORD_ALIGN((
sizeof(UNDETERMINESTRUCT) + 1));
00840 lpUndetA->dwSize = dwSize;
00841
00842
if (dwGCS & GCS_COMPSTR)
00843 {
00844 lpUndetA->uUndetTextLen = lpCompStrA->dwCompStrLen;
00845 lpUndetA->uUndetTextPos = dwPos;
00846 memcpy((
PBYTE)lpUndetA + dwPos,
00847 (
PBYTE)lpCompStrA + lpCompStrA->dwCompStrOffset,
00848 lpCompStrA->dwCompStrLen *
sizeof(
CHAR)
00849 );
00850 *(LPSTR)((
PBYTE)lpUndetA + dwPos + lpCompStrA->dwCompStrLen*
sizeof(
CHAR)) =
'\0';
00851 dwPos +=
DWORD_ALIGN(((lpUndetA->uUndetTextLen+1)*
sizeof(
CHAR)));
00852
00853
00854
00855
00856
if (lpCompStrA->dwCompAttrLen && !(dwGCS & GCS_COMPATTR))
00857 dwGCS |= GCS_COMPATTR;
00858 }
00859
00860
if (dwGCS & GCS_COMPATTR)
00861 {
00862 lpUndetA->uUndetAttrPos = dwPos;
00863 memcpy((
PBYTE)lpUndetA + dwPos,
00864 (
PBYTE)lpCompStrA + lpCompStrA->dwCompAttrOffset,
00865 lpCompStrA->dwCompAttrLen
00866 );
00867 dwPos +=
DWORD_ALIGN((lpUndetA->uUndetTextLen + 1));
00868 }
00869
00870
if (dwGCS & GCS_CURSORPOS)
00871 {
00872 lpUndetA->uCursorPos = lpCompStrA->dwCursorPos;
00873 }
00874
00875
if (dwGCS & GCS_DELTASTART)
00876 {
00877 lpUndetA->uDeltaStart = lpCompStrA->dwDeltaStart;
00878 }
00879
00880
if (dwGCS & GCS_RESULTSTR)
00881 {
00882 lpUndetA->uDetermineTextLen = lpCompStrA->dwResultStrLen;
00883 lpUndetA->uDetermineTextPos = dwPos;
00884 memcpy((
PBYTE)lpUndetA + dwPos,
00885 (
PBYTE)lpCompStrA + lpCompStrA->dwResultStrOffset,
00886 lpCompStrA->dwResultStrLen *
sizeof(
CHAR)
00887 );
00888 *(LPSTR)((
PBYTE)lpUndetA + dwPos + lpCompStrA->dwResultStrLen*
sizeof(
CHAR)) =
'\0';
00889 dwPos +=
DWORD_ALIGN(((lpUndetA->uDetermineTextLen + 1)*
sizeof(
CHAR)));
00890 }
00891
00892
if ( (dwGCS & GCS_RESULTCLAUSE) &&
00893 (lpCompStrA->dwResultClauseLen > 0) )
00894 {
00895 LPDWORD lpw;
00896 LPDWORD lpdw;
00897
00898 lpUndetA->uDetermineDelimPos = dwPos;
00899
00900 lpw = (LPDWORD)((
PBYTE)lpUndetA + dwPos);
00901 lpdw = (LPDWORD)((
PBYTE)lpCompStrA + lpCompStrA->dwResultClauseOffset);
00902
for (i = 0; i < (lpCompStrA->dwResultClauseLen /
sizeof(
DWORD)); i++)
00903 *lpw++ = *lpdw++;
00904
00905 dwPos +=
DWORD_ALIGN((lpCompStrA->dwResultClauseLen + 1));
00906 }
00907
00908
if (dwGCS & GCS_RESULTREADSTR)
00909 {
00910 lpUndetA->uYomiTextLen = lpCompStrA->dwResultReadStrLen;
00911 lpUndetA->uYomiTextPos = dwPos;
00912 memcpy((
PBYTE)lpUndetA + dwPos,
00913 (
PBYTE)lpCompStrA + lpCompStrA->dwResultReadStrOffset,
00914 lpCompStrA->dwResultReadStrLen *
sizeof(
CHAR)
00915 );
00916 *(LPSTR)((
PBYTE)lpUndetA + dwPos + lpCompStrA->dwResultReadStrLen*
sizeof(
CHAR)) =
'\0';
00917 dwPos +=
DWORD_ALIGN(((lpUndetA->uYomiTextLen + 1)*
sizeof(
CHAR)));
00918 }
00919
00920
if ( (dwGCS & GCS_RESULTREADCLAUSE) &&
00921 (lpCompStrA->dwResultReadClauseLen > 0) )
00922 {
00923 LPDWORD lpw;
00924 LPDWORD lpdw;
00925
00926 lpUndetA->uYomiDelimPos = dwPos;
00927
00928 lpw = (LPDWORD)((
PBYTE)lpUndetA + dwPos);
00929 lpdw = (LPDWORD)((
PBYTE)lpCompStrA + lpCompStrA->dwResultReadClauseOffset);
00930
for (i = 0; i < (lpCompStrA->dwResultReadClauseLen /
sizeof(
DWORD)); i++)
00931 *lpw++ = *lpdw++;
00932
00933 dwPos +=
DWORD_ALIGN((lpCompStrA->dwResultReadClauseLen + 1));
00934 }
00935
00936
return dwSize;
00937 }
00938
00939
DWORD
00940 CompStrAToUndetW(
00941 DWORD dwGCS,
00942 LPCOMPOSITIONSTRING lpCompStrA,
00943 LPUNDETERMINESTRUCT lpUndetW
00944 )
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958 {
00959
DWORD dwPos;
00960
DWORD dwSize;
00961
UINT i;
00962
00963 dwSize =
DWORD_ALIGN((
sizeof(UNDETERMINESTRUCT)+1)) +
00964
DWORD_ALIGN(((lpCompStrA->dwResultStrLen+1) *
sizeof(WCHAR))) +
00965
DWORD_ALIGN((lpCompStrA->dwResultClauseLen+1)) +
00966
DWORD_ALIGN(((lpCompStrA->dwResultReadStrLen+1) *
sizeof(WCHAR))) +
00967
DWORD_ALIGN((lpCompStrA->dwResultReadClauseLen+1)) +
00968
DWORD_ALIGN((lpCompStrA->dwCompAttrLen * 2)) +
00969
DWORD_ALIGN(((lpCompStrA->dwCompStrLen+1) *
sizeof(WCHAR)));
00970
00971
if (lpUndetW ==
NULL) {
00972
return dwSize;
00973 }
00974
00975 dwPos =
DWORD_ALIGN((
sizeof(UNDETERMINESTRUCT) + 1));
00976 lpUndetW->dwSize = dwSize;
00977
00978
if (dwGCS & GCS_COMPSTR)
00979 {
00980 i = MultiByteToWideChar( CP_ACP,
00981 (
DWORD)MB_PRECOMPOSED,
00982 (LPSTR)((
PBYTE)lpCompStrA + lpCompStrA->dwCompStrOffset),
00983 (
INT)lpCompStrA->dwCompStrLen,
00984 (LPWSTR)((
PBYTE)lpUndetW + dwPos),
00985 (
INT)dwSize - dwPos);
00986 ((LPWSTR)((
PBYTE)lpUndetW + dwPos))[i] =
L'\0';
00987 lpUndetW->uUndetTextLen = i;
00988 lpUndetW->uUndetTextPos = dwPos;
00989 dwPos +=
DWORD_ALIGN(((lpUndetW->uUndetTextLen + 1)*
sizeof(WCHAR)));
00990
00991
00992
00993
00994
if (lpCompStrA->dwCompAttrLen && !(dwGCS & GCS_COMPATTR))
00995 dwGCS |= GCS_COMPATTR;
00996 }
00997
00998
if (dwGCS & GCS_COMPATTR)
00999 {
01000
if (lpUndetW->uUndetTextLen != 0) {
01001 LPWSTR lpwszUndetText;
01002
PBYTE lpAttrW;
01003
PBYTE lpAttrA;
01004 WCHAR wc;
01005 ULONG MultiByteSize;
01006
01007 lpwszUndetText = (LPWSTR)((
PBYTE)lpUndetW + lpUndetW->uUndetTextPos);
01008 lpAttrA = (
PBYTE)lpCompStrA + lpCompStrA->dwCompAttrOffset;
01009 lpAttrW = (
PBYTE)lpUndetW + dwPos;
01010
01011
while (wc=*lpwszUndetText++) {
01012
RtlUnicodeToMultiByteSize(&MultiByteSize, &wc,
sizeof(WCHAR));
01013
if (MultiByteSize == 2) {
01014 *lpAttrW++ = *lpAttrA;
01015 lpAttrA += 2;
01016 }
01017
else {
01018 *lpAttrW++ = *lpAttrA++;
01019 }
01020 }
01021
01022 lpUndetW->uUndetAttrPos = dwPos;
01023 dwPos +=
DWORD_ALIGN((lpUndetW->uUndetTextLen + 1));
01024 }
01025 }
01026
01027
if (dwGCS & GCS_CURSORPOS)
01028 {
01029
if (lpCompStrA->dwCursorPos != -1) {
01030 lpUndetW->uCursorPos =
CalcCharacterPositionAtoW(lpCompStrA->dwCursorPos,
01031 (LPSTR)((
PBYTE)lpCompStrA + lpCompStrA->dwCompStrOffset),
01032 CP_ACP
01033 );
01034 }
01035
else {
01036 lpUndetW->uCursorPos = lpCompStrA->dwCursorPos;
01037 }
01038 }
01039
01040
if (dwGCS & GCS_DELTASTART)
01041 {
01042
if (lpCompStrA->dwDeltaStart != -1) {
01043 lpUndetW->uDeltaStart =
CalcCharacterPositionAtoW(lpCompStrA->dwDeltaStart,
01044 (LPSTR)((
PBYTE)lpCompStrA + lpCompStrA->dwCompStrOffset),
01045 CP_ACP
01046 );
01047 }
01048
else {
01049 lpUndetW->uDeltaStart = lpCompStrA->dwDeltaStart;
01050 }
01051 }
01052
01053
if (dwGCS & GCS_RESULTSTR)
01054 {
01055 i = MultiByteToWideChar( CP_ACP,
01056 (
DWORD)MB_PRECOMPOSED,
01057 (LPSTR)((
PBYTE)lpCompStrA + lpCompStrA->dwResultStrOffset),
01058 (
INT)lpCompStrA->dwResultStrLen,
01059 (LPWSTR)((
PBYTE)lpUndetW + dwPos),
01060 (
INT)dwSize - dwPos);
01061 ((LPWSTR)((
PBYTE)lpUndetW + dwPos))[i] =
L'\0';
01062 lpUndetW->uDetermineTextLen = i;
01063 lpUndetW->uDetermineTextPos = dwPos;
01064 dwPos +=
DWORD_ALIGN(((lpUndetW->uDetermineTextLen + 1)*
sizeof(WCHAR)));
01065 }
01066
01067
if ( (dwGCS & GCS_RESULTCLAUSE) &&
01068 (lpCompStrA->dwResultClauseLen > 0) )
01069 {
01070
if (lpUndetW->uDetermineTextLen != 0) {
01071 LPDWORD lpw;
01072 LPDWORD lpdw;
01073
01074 lpw = (LPDWORD)((
PBYTE)lpUndetW + dwPos);
01075 lpdw = (LPDWORD)((
PBYTE)lpCompStrA + lpCompStrA->dwResultClauseOffset);
01076
01077
for (i = 0; i < (lpCompStrA->dwResultClauseLen /
sizeof(
DWORD)); i++) {
01078 *lpw++ =
CalcCharacterPositionAtoW(*lpdw++,
01079 (LPSTR)((
PBYTE)lpCompStrA + lpCompStrA->dwResultStrOffset),
01080 CP_ACP
01081 );
01082 }
01083
01084 lpUndetW->uDetermineDelimPos = dwPos;
01085 dwPos +=
DWORD_ALIGN((lpCompStrA->dwResultClauseLen + 1));
01086 }
01087 }
01088
01089
if (dwGCS & GCS_RESULTREADSTR)
01090 {
01091 i = MultiByteToWideChar( CP_ACP,
01092 (
DWORD)MB_PRECOMPOSED,
01093 (LPSTR)((
PBYTE)lpCompStrA + lpCompStrA->dwResultReadStrOffset),
01094 (
INT)lpCompStrA->dwResultReadStrLen,
01095 (LPWSTR)((
PBYTE)lpUndetW + dwPos),
01096 (
INT)dwSize - dwPos);
01097 ((LPWSTR)((
PBYTE)lpUndetW + dwPos))[i] =
L'\0';
01098 lpUndetW->uYomiTextLen = i;
01099 lpUndetW->uYomiTextPos = dwPos;
01100 dwPos +=
DWORD_ALIGN(((lpUndetW->uYomiTextLen + 1)*
sizeof(WCHAR)));
01101 }
01102
01103
if ( (dwGCS & GCS_RESULTREADCLAUSE) &&
01104 (lpCompStrA->dwResultReadClauseLen > 0) )
01105 {
01106
if (lpUndetW->uYomiTextLen != 0) {
01107 LPDWORD lpw;
01108 LPDWORD lpdw;
01109
01110 lpw = (LPDWORD)((
PBYTE)lpUndetW + dwPos);
01111 lpdw = (LPDWORD)((
PBYTE)lpCompStrA + lpCompStrA->dwResultReadClauseOffset);
01112
01113
for (i = 0; i < (lpCompStrA->dwResultReadClauseLen /
sizeof(
DWORD)); i++) {
01114 *lpw++ =
CalcCharacterPositionAtoW(*lpdw++,
01115 (LPSTR)((
PBYTE)lpCompStrA + lpCompStrA->dwResultReadStrOffset),
01116 CP_ACP
01117 );
01118 }
01119
01120 lpUndetW->uYomiDelimPos = dwPos;
01121 dwPos +=
DWORD_ALIGN((lpCompStrA->dwResultReadClauseLen + 1));
01122 }
01123 }
01124
01125
return dwSize;
01126 }
01127
01128
01129
DWORD
01130 CompStrAToStringExA(
01131 DWORD dwGCS,
01132 LPCOMPOSITIONSTRING lpCompStrA,
01133 LPSTRINGEXSTRUCT lpStringExA
01134 )
01135
01136
01137
01138
01139
01140
01141
01142
01143
01144
01145
01146
01147
01148 {
01149
DWORD dwPos;
01150
DWORD dwSize;
01151
UINT i;
01152
01153 dwSize =
DWORD_ALIGN((
sizeof(STRINGEXSTRUCT)+1)) +
01154
DWORD_ALIGN(((lpCompStrA->dwResultStrLen+1) *
sizeof(
CHAR))) +
01155
DWORD_ALIGN(lpCompStrA->dwResultClauseLen+1) +
01156
DWORD_ALIGN(((lpCompStrA->dwResultReadStrLen+1) *
sizeof(
CHAR))) +
01157
DWORD_ALIGN(lpCompStrA->dwResultReadClauseLen+1);
01158
01159
if (lpStringExA ==
NULL) {
01160
return dwSize;
01161 }
01162
01163 dwPos =
DWORD_ALIGN(
sizeof(STRINGEXSTRUCT) + 1);
01164 lpStringExA->dwSize = dwSize;
01165
01166 lpStringExA->uDeterminePos = dwPos;
01167 memcpy((
PBYTE)lpStringExA + dwPos,
01168 (
PBYTE)lpCompStrA + lpCompStrA->dwResultStrOffset,
01169 lpCompStrA->dwResultStrLen *
sizeof(
CHAR)
01170 );
01171 *(LPSTR)((
PBYTE)lpStringExA + dwPos + lpCompStrA->dwResultStrLen*
sizeof(
CHAR)) =
'\0';
01172 dwPos +=
DWORD_ALIGN(((lpCompStrA->dwResultStrLen + 1)*
sizeof(
CHAR)));
01173
01174
if ( (dwGCS & GCS_RESULTCLAUSE) &&
01175 (lpCompStrA->dwResultClauseLen > 0) )
01176 {
01177 LPDWORD lpw;
01178 LPDWORD lpdw;
01179
01180 lpStringExA->uDetermineDelimPos = dwPos;
01181
01182 lpw = (LPDWORD)((
PBYTE)lpStringExA + dwPos);
01183 lpdw = (LPDWORD)((
PBYTE)lpCompStrA + lpCompStrA->dwResultClauseOffset);
01184
for (i = 0; i < (lpCompStrA->dwResultClauseLen /
sizeof(
DWORD)); i++)
01185 *lpw++ = *lpdw++;
01186
01187 dwPos +=
DWORD_ALIGN((lpCompStrA->dwResultClauseLen + 1));
01188 }
01189
01190 lpStringExA->uYomiPos = dwPos;
01191 memcpy((
PBYTE)lpStringExA + dwPos,
01192 (
PBYTE)lpCompStrA + lpCompStrA->dwResultReadStrOffset,
01193 lpCompStrA->dwResultReadStrLen *
sizeof(
CHAR)
01194 );
01195 *(LPSTR)((
PBYTE)lpStringExA + dwPos + lpCompStrA->dwResultReadStrLen*
sizeof(
CHAR)) =
'\0';
01196 dwPos +=
DWORD_ALIGN(((lpCompStrA->dwResultReadStrLen + 1)*
sizeof(
CHAR)));
01197
01198
if ( (dwGCS & GCS_RESULTREADCLAUSE) &&
01199 (lpCompStrA->dwResultReadClauseLen > 0) )
01200 {
01201 LPDWORD lpw;
01202 LPDWORD lpdw;
01203
01204 lpStringExA->uYomiDelimPos = dwPos;
01205
01206 lpw = (LPDWORD)((
PBYTE)lpStringExA + dwPos);
01207 lpdw = (LPDWORD)((
PBYTE)lpCompStrA + lpCompStrA->dwResultReadClauseOffset);
01208
for (i = 0; i < (lpCompStrA->dwResultReadClauseLen /
sizeof(
DWORD)); i++)
01209 *lpw++ = *lpdw++;
01210 }
01211
01212
return dwSize;
01213 }
01214
01215
DWORD
01216 CompStrAToStringExW(
01217 DWORD dwGCS,
01218 LPCOMPOSITIONSTRING lpCompStrA,
01219 LPSTRINGEXSTRUCT lpStringExW
01220 )
01221
01222
01223
01224
01225
01226
01227
01228
01229
01230
01231
01232
01233
01234 {
01235
DWORD dwPos;
01236
DWORD dwSize;
01237
DWORD dwLen;
01238
UINT i;
01239
01240 dwSize =
DWORD_ALIGN((
sizeof(STRINGEXSTRUCT)+1)) +
01241 (lpCompStrA->dwResultStrLen > 0 ?
DWORD_ALIGN(((lpCompStrA->dwResultStrLen+1) *
sizeof(WCHAR))) : 0) +
01242 (lpCompStrA->dwResultClauseLen > 0 ?
DWORD_ALIGN(lpCompStrA->dwResultClauseLen+1) : 0) +
01243 (lpCompStrA->dwResultReadStrLen > 0 ?
DWORD_ALIGN(((lpCompStrA->dwResultReadStrLen+1) *
sizeof(WCHAR))) : 0)+
01244 (lpCompStrA->dwResultReadClauseLen > 0 ?
DWORD_ALIGN(lpCompStrA->dwResultReadClauseLen+1) : 0);
01245
01246
if (lpStringExW ==
NULL) {
01247
return dwSize;
01248 }
01249
01250 dwPos =
DWORD_ALIGN(
sizeof(STRINGEXSTRUCT) + 1);
01251 lpStringExW->dwSize = dwSize;
01252
01253
if (lpCompStrA->dwResultStrLen > 0) {
01254 i = MultiByteToWideChar( CP_ACP,
01255 (
DWORD)MB_PRECOMPOSED,
01256 (LPSTR)((
PBYTE)lpCompStrA + lpCompStrA->dwResultStrOffset),
01257 (
INT)lpCompStrA->dwResultStrLen,
01258 (LPWSTR)((
PBYTE)lpStringExW + dwPos),
01259 (
INT)dwSize - dwPos);
01260 ((LPWSTR)((
PBYTE)lpStringExW + dwPos))[i] =
L'\0';
01261 dwLen = i;
01262 lpStringExW->uDeterminePos = dwPos;
01263 dwPos +=
DWORD_ALIGN(((dwLen + 1)*
sizeof(WCHAR)));
01264 }
else {
01265 dwLen = 0;
01266 lpStringExW->uDeterminePos = 0;
01267 }
01268
01269
if ( (dwGCS & GCS_RESULTCLAUSE) &&
01270 (lpCompStrA->dwResultClauseLen > 0) )
01271 {
01272
if (dwLen != 0 && lpCompStrA->dwResultClauseLen > 0) {
01273 LPDWORD lpw;
01274 LPDWORD lpdw;
01275
01276 lpw = (LPDWORD)((
PBYTE)lpStringExW + dwPos);
01277 lpdw = (LPDWORD)((
PBYTE)lpCompStrA + lpCompStrA->dwResultClauseOffset);
01278
01279
for (i = 0; i < (lpCompStrA->dwResultClauseLen /
sizeof(
DWORD)); i++) {
01280 *lpw++ =
CalcCharacterPositionAtoW(*lpdw++,
01281 (LPSTR)((
PBYTE)lpCompStrA + lpCompStrA->dwResultStrOffset),
01282 CP_ACP
01283 );
01284 }
01285
01286 lpStringExW->uDetermineDelimPos = dwPos;
01287 dwPos +=
DWORD_ALIGN((lpCompStrA->dwResultClauseLen + 1));
01288 }
01289 }
01290
01291
if (lpCompStrA->dwResultReadStrLen > 0) {
01292 i = MultiByteToWideChar( CP_ACP,
01293 (
DWORD)MB_PRECOMPOSED,
01294 (LPSTR)((
PBYTE)lpCompStrA + lpCompStrA->dwResultReadStrOffset),
01295 (
INT)lpCompStrA->dwResultReadStrLen,
01296 (LPWSTR)((
PBYTE)lpStringExW + dwPos),
01297 (
INT)dwSize - dwPos);
01298 ((LPWSTR)((
PBYTE)lpStringExW + dwPos))[i] =
L'\0';
01299 dwLen = i;
01300 lpStringExW->uYomiPos = dwPos;
01301 dwPos +=
DWORD_ALIGN(((dwLen + 1)*
sizeof(WCHAR)));
01302 }
else {
01303 dwLen = 0;
01304 lpStringExW->uYomiPos = 0;
01305 }
01306
01307
if ( (dwGCS & GCS_RESULTREADCLAUSE) &&
01308 (lpCompStrA->dwResultReadClauseLen > 0) )
01309 {
01310
if (dwLen != 0 && lpCompStrA->dwResultReadClauseLen > 0) {
01311 LPDWORD lpw;
01312 LPDWORD lpdw;
01313
01314 lpw = (LPDWORD)((
PBYTE)lpStringExW + dwPos);
01315 lpdw = (LPDWORD)((
PBYTE)lpCompStrA + lpCompStrA->dwResultReadClauseOffset);
01316
01317
for (i = 0; i < (lpCompStrA->dwResultReadClauseLen /
sizeof(
DWORD)); i++) {
01318 *lpw++ =
CalcCharacterPositionAtoW(*lpdw++,
01319 (LPSTR)((
PBYTE)lpCompStrA + lpCompStrA->dwResultReadStrOffset),
01320 CP_ACP
01321 );
01322 }
01323
01324 lpStringExW->uYomiDelimPos = dwPos;
01325 dwPos +=
DWORD_ALIGN((lpCompStrA->dwResultReadClauseLen + 1));
01326 }
01327 }
01328
01329
return dwSize;
01330 }
01331
01332
DWORD
01333 CompStrAToStringA(
01334 LPCOMPOSITIONSTRING lpCompStrA,
01335 LPSTR lpStringA
01336 )
01337
01338
01339
01340
01341
01342
01343
01344
01345
01346
01347
01348
01349
01350 {
01351 LPSTR lpszString;
01352
DWORD dwSize;
01353
01354 lpszString = (LPSTR)((
PBYTE)lpCompStrA + lpCompStrA->dwResultStrOffset);
01355 dwSize = lpCompStrA->dwResultStrLen;
01356
01357
if (lpStringA ==
NULL) {
01358
return ((dwSize + 1) *
sizeof(
CHAR));
01359 }
01360
01361 memcpy((
PBYTE)lpStringA,
01362 (
PBYTE)lpszString,
01363 (dwSize *
sizeof(
CHAR))
01364 );
01365 lpStringA[dwSize] =
'\0';
01366
01367
return ((dwSize + 1) *
sizeof(
CHAR));
01368 }
01369
01370
DWORD
01371 CompStrAToStringW(
01372 LPCOMPOSITIONSTRING lpCompStrA,
01373 LPWSTR lpStringW
01374 )
01375
01376
01377
01378
01379
01380
01381
01382
01383
01384
01385
01386
01387
01388 {
01389 LPSTR lpszString;
01390
DWORD dwSize;
01391
UINT i;
01392
01393 lpszString = (LPSTR)((
PBYTE)lpCompStrA + lpCompStrA->dwResultStrOffset);
01394
01395 i = MultiByteToWideChar( CP_ACP,
01396 (
DWORD)MB_PRECOMPOSED,
01397 (LPSTR)lpszString,
01398 (
INT)lpCompStrA->dwResultStrLen,
01399 (LPWSTR)lpStringW,
01400 (
INT)0);
01401
01402
if (lpStringW ==
NULL) {
01403 dwSize = (i+1) *
sizeof(WCHAR);
01404 }
01405
else {
01406 dwSize = (i+1) *
sizeof(WCHAR);
01407
01408 i = MultiByteToWideChar( CP_ACP,
01409 (
DWORD)MB_PRECOMPOSED,
01410 (LPSTR)lpszString,
01411 (
INT)lpCompStrA->dwResultStrLen,
01412 (LPWSTR)lpStringW,
01413 (
INT)dwSize);
01414
01415 lpStringW[i] =
L'\0';
01416 dwSize = (i+1) *
sizeof(WCHAR);
01417 }
01418
01419
return dwSize;
01420 }
01421
01422
VOID
01423 CompStrAToCharA(
01424 HWND hWnd,
01425 LPCOMPOSITIONSTRING lpCompStrA
01426 )
01427
01428
01429
01430
01431
01432
01433
01434
01435
01436
01437
01438
01439
01440 {
01441 LPSTR lpszString;
01442
BOOL fDBCSWmChar =
FALSE;
01443 WORD wDBCSChar;
01444
BYTE szAscii[3];
01445
01446 lpszString = (LPSTR)((
PBYTE)lpCompStrA + lpCompStrA->dwResultStrOffset);
01447
01448
01449
01450
if (
GetClientInfo()->dwExpWinVer >= 0x030A ) {
01451 fDBCSWmChar = (
BOOL)SendMessageA(
hWnd,WM_IME_REPORT,IR_DBCSCHAR, 0
L);
01452 }
01453
01454
01455 PostMessageA(
hWnd, WM_IME_REPORT, IR_STRINGSTART, 0
L );
01456
01457
01458
while(szAscii[0]=*lpszString)
01459 {
01460
if( *
CharNextA(lpszString) == 0 )
01461 {
01462 PostMessageA(
hWnd, WM_IME_REPORT, IR_STRINGEND, 0
L );
01463 }
01464
if( IsDBCSLeadByte( szAscii[0] ) )
01465 {
01466 szAscii[1] = *((
PBYTE)(lpszString+1));
01467
01468
01469
01470
if ( fDBCSWmChar )
01471 {
01472
01473
01474 wDBCSChar = MAKEWORD(szAscii[1], szAscii[0]);
01475 PostMessageA(
hWnd, WM_CHAR, (WPARAM)wDBCSChar|
WMCR_IR_DBCSCHAR, 1
L );
01476 }
01477
else
01478 {
01479
01480 PostMessageA(
hWnd, WM_CHAR, (WPARAM)(szAscii[0]), 1
L);
01481 PostMessageA(
hWnd, WM_CHAR, (WPARAM)(szAscii[1]), 1
L);
01482 }
01483 }
01484
else
01485 {
01486 PostMessageA(
hWnd, WM_CHAR, (WPARAM)(szAscii[0]), 1
L);
01487 }
01488 lpszString =
CharNextA(lpszString);
01489 }
01490 }
01491
01492
VOID
01493 CompStrAToCharW(
01494 HWND hWnd,
01495 LPCOMPOSITIONSTRING lpCompStrA
01496 )
01497
01498
01499
01500
01501
01502
01503
01504
01505
01506
01507
01508
01509
01510 {
01511 LPSTR lpszString;
01512
UINT i;
01513
BYTE c;
01514 WORD wszUnicode[2];
01515
01516 lpszString = (LPSTR)((
PBYTE)lpCompStrA + lpCompStrA->dwResultStrOffset);
01517
01518
01519
01520
01521
01522
01523 PostMessageW(
hWnd, WM_IME_REPORT, IR_STRINGSTART, 0
L );
01524
01525
01526
while(
c=*lpszString)
01527 {
01528
if( *
CharNextA(lpszString) == 0 )
01529 {
01530 PostMessageW(
hWnd, WM_IME_REPORT, IR_STRINGEND, 0
L );
01531 }
01532
if( IsDBCSLeadByte(
c ) ) {
01533 i = MultiByteToWideChar( CP_ACP,
01534 (
DWORD)MB_PRECOMPOSED,
01535 (LPSTR)lpszString,
01536 (
INT)2,
01537 (LPWSTR)wszUnicode,
01538 (
INT)
sizeof(wszUnicode));
01539 }
01540
else {
01541 i = MultiByteToWideChar( CP_ACP,
01542 (
DWORD)MB_PRECOMPOSED,
01543 (LPSTR)lpszString,
01544 (
INT)1,
01545 (LPWSTR)wszUnicode,
01546 (
INT)
sizeof(wszUnicode));
01547 }
01548
if (i != 0) {
01549 PostMessageW(
hWnd, WM_CHAR, (WPARAM)(wszUnicode[0]), 1
L);
01550 }
01551 lpszString =
CharNextA(lpszString);
01552 }
01553 }
01554
01555
DWORD
01556 CompStrWToUndetW(
01557 DWORD dwGCS,
01558 LPCOMPOSITIONSTRING lpCompStrW,
01559 LPUNDETERMINESTRUCT lpUndetW
01560 )
01561
01562
01563
01564
01565
01566
01567
01568
01569
01570
01571
01572
01573
01574 {
01575
DWORD dwPos;
01576
DWORD dwSize;
01577
UINT i;
01578
01579 dwSize =
DWORD_ALIGN((
sizeof(UNDETERMINESTRUCT)+1)) +
01580
DWORD_ALIGN(((lpCompStrW->dwResultStrLen+1) *
sizeof(WCHAR))) +
01581
DWORD_ALIGN((lpCompStrW->dwResultClauseLen+1)) +
01582
DWORD_ALIGN(((lpCompStrW->dwResultReadStrLen+1) *
sizeof(WCHAR))) +
01583
DWORD_ALIGN((lpCompStrW->dwResultReadClauseLen+1)) +
01584
DWORD_ALIGN((lpCompStrW->dwCompAttrLen+1)) +
01585
DWORD_ALIGN(((lpCompStrW->dwCompStrLen+1) *
sizeof(WCHAR)));
01586
01587
if (lpUndetW ==
NULL) {
01588
return dwSize;
01589 }
01590
01591 dwPos =
DWORD_ALIGN((
sizeof(UNDETERMINESTRUCT) + 1));
01592 lpUndetW->dwSize = dwSize;
01593
01594
if (dwGCS & GCS_COMPSTR)
01595 {
01596 lpUndetW->uUndetTextLen = lpCompStrW->dwCompStrLen;
01597 lpUndetW->uUndetTextPos = dwPos;
01598 memcpy((
PBYTE)lpUndetW + dwPos,
01599 (
PBYTE)lpCompStrW + lpCompStrW->dwCompStrOffset,
01600 lpCompStrW->dwCompStrLen *
sizeof(WCHAR)
01601 );
01602 *(LPWSTR)((
PBYTE)lpUndetW + dwPos + lpCompStrW->dwCompStrLen*
sizeof(WCHAR)) =
L'\0';
01603 dwPos +=
DWORD_ALIGN(((lpUndetW->uUndetTextLen+1)*
sizeof(WCHAR)));
01604
01605
01606
01607
01608
if (lpCompStrW->dwCompAttrLen && !(dwGCS & GCS_COMPATTR))
01609 dwGCS |= GCS_COMPATTR;
01610 }
01611
01612
if (dwGCS & GCS_COMPATTR)
01613 {
01614 lpUndetW->uUndetAttrPos = dwPos;
01615 memcpy((
PBYTE)lpUndetW + dwPos,
01616 (
PBYTE)lpCompStrW + lpCompStrW->dwCompAttrOffset,
01617 lpCompStrW->dwCompAttrLen
01618 );
01619 dwPos +=
DWORD_ALIGN((lpUndetW->uUndetTextLen + 1));
01620 }
01621
01622
if (dwGCS & GCS_CURSORPOS)
01623 {
01624 lpUndetW->uCursorPos = lpCompStrW->dwCursorPos;
01625 }
01626
01627
if (dwGCS & GCS_DELTASTART)
01628 {
01629 lpUndetW->uDeltaStart = lpCompStrW->dwDeltaStart;
01630 }
01631
01632
if (dwGCS & GCS_RESULTSTR)
01633 {
01634 lpUndetW->uDetermineTextLen = lpCompStrW->dwResultStrLen;
01635 lpUndetW->uDetermineTextPos = dwPos;
01636 memcpy((
PBYTE)lpUndetW + dwPos,
01637 (
PBYTE)lpCompStrW + lpCompStrW->dwResultStrOffset,
01638 lpCompStrW->dwResultStrLen *
sizeof(WCHAR)
01639 );
01640 *(LPWSTR)((
PBYTE)lpUndetW + dwPos + lpCompStrW->dwResultStrLen*
sizeof(WCHAR)) =
L'\0';
01641 dwPos +=
DWORD_ALIGN(((lpUndetW->uDetermineTextLen + 1)*
sizeof(WCHAR)));
01642 }
01643
01644
if ( (dwGCS & GCS_RESULTCLAUSE) &&
01645 (lpCompStrW->dwResultClauseLen > 0) )
01646 {
01647 LPDWORD lpw;
01648 LPDWORD lpdw;
01649
01650 lpUndetW->uDetermineDelimPos = dwPos;
01651
01652 lpw = (LPDWORD)((
PBYTE)lpUndetW + dwPos);
01653 lpdw = (LPDWORD)((
PBYTE)lpCompStrW + lpCompStrW->dwResultClauseOffset);
01654
for (i = 0; i < (lpCompStrW->dwResultClauseLen /
sizeof(
DWORD)); i++)
01655 *lpw++ = *lpdw++;
01656
01657 dwPos +=
DWORD_ALIGN((lpCompStrW->dwResultClauseLen + 1));
01658 }
01659
01660
if (dwGCS & GCS_RESULTREADSTR)
01661 {
01662 lpUndetW->uYomiTextLen = lpCompStrW->dwResultReadStrLen;
01663 lpUndetW->uYomiTextPos = dwPos;
01664 memcpy((
PBYTE)lpUndetW + dwPos,
01665 (
PBYTE)lpCompStrW + lpCompStrW->dwResultReadStrOffset,
01666 lpCompStrW->dwResultReadStrLen *
sizeof(WCHAR)
01667 );
01668 *(LPWSTR)((
PBYTE)lpUndetW + dwPos + lpCompStrW->dwResultReadStrLen*
sizeof(WCHAR)) =
L'\0';
01669 dwPos +=
DWORD_ALIGN(((lpUndetW->uYomiTextLen + 1)*
sizeof(WCHAR)));
01670 }
01671
01672
if ( (dwGCS & GCS_RESULTREADCLAUSE) &&
01673 (lpCompStrW->dwResultReadClauseLen > 0) )
01674 {
01675 LPDWORD lpw;
01676 LPDWORD lpdw;
01677
01678 lpUndetW->uYomiDelimPos = dwPos;
01679
01680 lpw = (LPDWORD)((
PBYTE)lpUndetW + dwPos);
01681 lpdw = (LPDWORD)((
PBYTE)lpCompStrW + lpCompStrW->dwResultReadClauseOffset);
01682
for (i = 0; i < (lpCompStrW->dwResultReadClauseLen /
sizeof(
DWORD)); i++)
01683 *lpw++ = *lpdw++;
01684
01685 dwPos +=
DWORD_ALIGN((lpCompStrW->dwResultReadClauseLen + 1));
01686 }
01687
01688
return dwSize;
01689 }
01690
01691
DWORD
01692 CompStrWToUndetA(
01693 DWORD dwGCS,
01694 LPCOMPOSITIONSTRING lpCompStrW,
01695 LPUNDETERMINESTRUCT lpUndetA
01696 )
01697
01698
01699
01700
01701
01702
01703
01704
01705
01706
01707
01708
01709
01710 {
01711
DWORD dwPos;
01712
DWORD dwSize;
01713
UINT i;
01714
BOOL bUDC;
01715
01716 dwSize =
DWORD_ALIGN((
sizeof(UNDETERMINESTRUCT)+1)) +
01717
DWORD_ALIGN(((lpCompStrW->dwResultStrLen+1) *
sizeof(WCHAR))) +
01718
DWORD_ALIGN((lpCompStrW->dwResultClauseLen+1)) +
01719
DWORD_ALIGN(((lpCompStrW->dwResultReadStrLen+1) *
sizeof(WCHAR))) +
01720
DWORD_ALIGN((lpCompStrW->dwResultReadClauseLen+1)) +
01721
DWORD_ALIGN((lpCompStrW->dwCompAttrLen * 2)) +
01722
DWORD_ALIGN(((lpCompStrW->dwCompStrLen+1) *
sizeof(WCHAR)));
01723
01724
if (lpUndetA ==
NULL) {
01725
return dwSize;
01726 }
01727
01728 dwPos =
DWORD_ALIGN((
sizeof(UNDETERMINESTRUCT) + 1));
01729 lpUndetA->dwSize = dwSize;
01730
01731
if (dwGCS & GCS_COMPSTR)
01732 {
01733 i = WideCharToMultiByte( CP_ACP,
01734 (
DWORD)0,
01735 (LPWSTR)((
PBYTE)lpCompStrW + lpCompStrW->dwCompStrOffset),
01736 (
INT)lpCompStrW->dwCompStrLen,
01737 (LPSTR)((
PBYTE)lpUndetA + dwPos),
01738 (
INT)dwSize - dwPos,
01739 (LPSTR)
NULL,
01740 (LPBOOL)&bUDC);
01741 ((LPSTR)((
PBYTE)lpUndetA + dwPos))[i] =
'\0';
01742 lpUndetA->uUndetTextLen = i;
01743 lpUndetA->uUndetTextPos = dwPos;
01744 dwPos +=
DWORD_ALIGN(((lpUndetA->uUndetTextLen + 1)*
sizeof(
CHAR)));
01745
01746
01747
01748
01749
if (lpCompStrW->dwCompAttrLen && !(dwGCS & GCS_COMPATTR))
01750 dwGCS |= GCS_COMPATTR;
01751 }
01752
01753
if (dwGCS & GCS_COMPATTR)
01754 {
01755
if (lpUndetA->uUndetTextLen != 0) {
01756 LPSTR lpszUndetText;
01757
PBYTE lpAttrW;
01758
PBYTE lpAttrA;
01759
BYTE c;
01760
01761 lpszUndetText = (LPSTR)((
PBYTE)lpUndetA + lpUndetA->uUndetTextPos);
01762 lpAttrW = (
PBYTE)lpCompStrW + lpCompStrW->dwCompAttrOffset;
01763 lpAttrA = (
PBYTE)lpUndetA + dwPos;
01764
01765
while (
c=*lpszUndetText++) {
01766
if (IsDBCSLeadByte(
c)) {
01767 *lpAttrA++ = *lpAttrW;
01768 *lpAttrA++ = *lpAttrW;
01769 lpszUndetText++;
01770 }
01771
else {
01772 *lpAttrA++ = *lpAttrW;
01773 }
01774 lpAttrW++;
01775 }
01776
01777 lpUndetA->uUndetAttrPos = dwPos;
01778 dwPos +=
DWORD_ALIGN((lpUndetA->uUndetTextLen + 1));
01779 }
01780 }
01781
01782
if (dwGCS & GCS_CURSORPOS)
01783 {
01784
if (lpCompStrW->dwCursorPos != -1) {
01785 lpUndetA->uCursorPos =
CalcCharacterPositionWtoA(lpCompStrW->dwCursorPos,
01786 (LPWSTR)((
PBYTE)lpCompStrW + lpCompStrW->dwCompStrOffset),
01787 CP_ACP
01788 );
01789 }
01790
else {
01791 lpUndetA->uCursorPos = lpCompStrW->dwCursorPos;
01792 }
01793 }
01794
01795
if (dwGCS & GCS_DELTASTART)
01796 {
01797
if (lpCompStrW->dwDeltaStart != -1) {
01798 lpUndetA->uDeltaStart =
CalcCharacterPositionWtoA(lpCompStrW->dwDeltaStart,
01799 (LPWSTR)((
PBYTE)lpCompStrW + lpCompStrW->dwCompStrOffset),
01800 CP_ACP
01801 );
01802 }
01803
else {
01804 lpUndetA->uDeltaStart = lpCompStrW->dwDeltaStart;
01805 }
01806 }
01807
01808
if (dwGCS & GCS_RESULTSTR)
01809 {
01810 i = WideCharToMultiByte( CP_ACP,
01811 (
DWORD)0,
01812 (LPWSTR)((
PBYTE)lpCompStrW + lpCompStrW->dwResultStrOffset),
01813 (
INT)lpCompStrW->dwResultStrLen,
01814 (LPSTR)((
PBYTE)lpUndetA + dwPos),
01815 (
INT)dwSize - dwPos,
01816 (LPSTR)
NULL,
01817 (LPBOOL)&bUDC);
01818 ((LPSTR)((
PBYTE)lpUndetA + dwPos))[i] =
'\0';
01819 lpUndetA->uDetermineTextLen = i;
01820 lpUndetA->uDetermineTextPos = dwPos;
01821 dwPos +=
DWORD_ALIGN(((lpUndetA->uDetermineTextLen + 1)*
sizeof(
CHAR)));
01822 }
01823
01824
if ( (dwGCS & GCS_RESULTCLAUSE) &&
01825 (lpCompStrW->dwResultClauseLen > 0) )
01826 {
01827
if (lpUndetA->uDetermineTextLen != 0) {
01828 LPDWORD lpw;
01829 LPDWORD lpdw;
01830
01831 lpw = (LPDWORD)((
PBYTE)lpUndetA + dwPos);
01832 lpdw = (LPDWORD)((
PBYTE)lpCompStrW + lpCompStrW->dwResultClauseOffset);
01833
01834
for (i = 0; i < (lpCompStrW->dwResultClauseLen /
sizeof(
DWORD)); i++) {
01835 *lpw++ =
CalcCharacterPositionWtoA(*lpdw++,
01836 (LPWSTR)((
PBYTE)lpCompStrW + lpCompStrW->dwResultStrOffset),
01837 CP_ACP
01838 );
01839 }
01840
01841 lpUndetA->uDetermineDelimPos = dwPos;
01842 dwPos +=
DWORD_ALIGN((lpCompStrW->dwResultClauseLen + 1));
01843 }
01844 }
01845
01846
if (dwGCS & GCS_RESULTREADSTR)
01847 {
01848 i = WideCharToMultiByte( CP_ACP,
01849 (
DWORD)0,
01850 (LPWSTR)((
PBYTE)lpCompStrW + lpCompStrW->dwResultReadStrOffset),
01851 (
INT)lpCompStrW->dwResultReadStrLen,
01852 (LPSTR)((
PBYTE)lpUndetA + dwPos),
01853 (
INT)dwSize - dwPos,
01854 (LPSTR)
NULL,
01855 (LPBOOL)&bUDC);
01856 ((LPSTR)((
PBYTE)lpUndetA + dwPos))[i] =
'\0';
01857 lpUndetA->uYomiTextLen = i;
01858 lpUndetA->uYomiTextPos = dwPos;
01859 dwPos +=
DWORD_ALIGN(((lpUndetA->uYomiTextLen + 1)*
sizeof(
CHAR)));
01860 }
01861
01862
if ( (dwGCS & GCS_RESULTREADCLAUSE) &&
01863 (lpCompStrW->dwResultReadClauseLen > 0) )
01864 {
01865
if (lpUndetA->uYomiTextLen != 0) {
01866 LPDWORD lpw;
01867 LPDWORD lpdw;
01868
01869 lpw = (LPDWORD)((
PBYTE)lpUndetA + dwPos);
01870 lpdw = (LPDWORD)((
PBYTE)lpCompStrW + lpCompStrW->dwResultReadClauseOffset);
01871
01872
for (i = 0; i < (lpCompStrW->dwResultReadClauseLen /
sizeof(
DWORD)); i++) {
01873 *lpw++ =
CalcCharacterPositionWtoA(*lpdw++,
01874 (LPWSTR)((
PBYTE)lpCompStrW + lpCompStrW->dwResultReadStrOffset),
01875 CP_ACP
01876 );
01877 }
01878
01879 lpUndetA->uYomiDelimPos = dwPos;
01880 dwPos +=
DWORD_ALIGN((lpCompStrW->dwResultReadClauseLen + 1));
01881 }
01882 }
01883
01884
return dwSize;
01885 }
01886
01887
01888
DWORD
01889 CompStrWToStringExW(
01890 DWORD dwGCS,
01891 LPCOMPOSITIONSTRING lpCompStrW,
01892 LPSTRINGEXSTRUCT lpStringExW
01893 )
01894
01895
01896
01897
01898
01899
01900
01901
01902
01903
01904
01905
01906
01907 {
01908
DWORD dwPos;
01909
DWORD dwSize;
01910
UINT i;
01911
01912 dwSize =
DWORD_ALIGN((
sizeof(STRINGEXSTRUCT)+1)) +
01913
DWORD_ALIGN(((lpCompStrW->dwResultStrLen+1) *
sizeof(WCHAR))) +
01914
DWORD_ALIGN(lpCompStrW->dwResultClauseLen+1) +
01915
DWORD_ALIGN(((lpCompStrW->dwResultReadStrLen+1) *
sizeof(WCHAR))) +
01916
DWORD_ALIGN(lpCompStrW->dwResultReadClauseLen+1);
01917
01918
if (lpStringExW ==
NULL) {
01919
return dwSize;
01920 }
01921
01922 dwPos =
DWORD_ALIGN(
sizeof(STRINGEXSTRUCT) + 1);
01923 lpStringExW->dwSize = dwSize;
01924
01925 lpStringExW->uDeterminePos = dwPos;
01926 memcpy((
PBYTE)lpStringExW + dwPos,
01927 (
PBYTE)lpCompStrW + lpCompStrW->dwResultStrOffset,
01928 lpCompStrW->dwResultStrLen *
sizeof(WCHAR)
01929 );
01930 *(LPWSTR)((
PBYTE)lpStringExW + dwPos + lpCompStrW->dwResultStrLen*
sizeof(WCHAR)) =
L'\0';
01931 dwPos +=
DWORD_ALIGN(((lpCompStrW->dwResultStrLen + 1)*
sizeof(WCHAR)));
01932
01933
if ( (dwGCS & GCS_RESULTCLAUSE) &&
01934 (lpCompStrW->dwResultClauseLen > 0) )
01935 {
01936 LPDWORD lpw;
01937 LPDWORD lpdw;
01938
01939 lpStringExW->uDetermineDelimPos = dwPos;
01940
01941 lpw = (LPDWORD)((
PBYTE)lpStringExW + dwPos);
01942 lpdw = (LPDWORD)((
PBYTE)lpCompStrW + lpCompStrW->dwResultClauseOffset);
01943
for (i = 0; i < (lpCompStrW->dwResultClauseLen /
sizeof(
DWORD)); i++)
01944 *lpw++ = *lpdw++;
01945
01946 dwPos +=
DWORD_ALIGN((lpCompStrW->dwResultClauseLen + 1));
01947 }
01948
01949 lpStringExW->uYomiPos = dwPos;
01950 memcpy((
PBYTE)lpStringExW + dwPos,
01951 (
PBYTE)lpCompStrW + lpCompStrW->dwResultReadStrOffset,
01952 lpCompStrW->dwResultReadStrLen *
sizeof(WCHAR)
01953 );
01954 *(LPWSTR)((
PBYTE)lpStringExW + dwPos + lpCompStrW->dwResultReadStrLen*
sizeof(WCHAR)) =
L'\0';
01955 dwPos +=
DWORD_ALIGN(((lpCompStrW->dwResultReadStrLen + 1)*
sizeof(WCHAR)));
01956
01957
if ( (dwGCS & GCS_RESULTREADCLAUSE) &&
01958 (lpCompStrW->dwResultReadClauseLen > 0) )
01959 {
01960 LPDWORD lpw;
01961 LPDWORD lpdw;
01962
01963 lpStringExW->uYomiDelimPos = dwPos;
01964
01965 lpw = (LPDWORD)((
PBYTE)lpStringExW + dwPos);
01966 lpdw = (LPDWORD)((
PBYTE)lpCompStrW + lpCompStrW->dwResultReadClauseOffset);
01967
for (i = 0; i < (lpCompStrW->dwResultReadClauseLen /
sizeof(
DWORD)); i++)
01968 *lpw++ = *lpdw++;
01969 }
01970
01971
return dwSize;
01972 }
01973
01974
DWORD
01975 CompStrWToStringExA(
01976 DWORD dwGCS,
01977 LPCOMPOSITIONSTRING lpCompStrW,
01978 LPSTRINGEXSTRUCT lpStringExA
01979 )
01980
01981
01982
01983
01984
01985
01986
01987
01988
01989
01990
01991
01992
01993 {
01994
DWORD dwPos;
01995
DWORD dwSize;
01996
DWORD dwLen;
01997
UINT i;
01998
BOOL bUDC;
01999
02000 dwSize =
DWORD_ALIGN((
sizeof(STRINGEXSTRUCT)+1)) +
02001 (lpCompStrW->dwResultStrLen > 0 ?
DWORD_ALIGN(((lpCompStrW->dwResultStrLen+1) *
sizeof(WCHAR))) : 0) +
02002 (lpCompStrW->dwResultClauseLen > 0 ?
DWORD_ALIGN(lpCompStrW->dwResultClauseLen+1) : 0) +
02003 (lpCompStrW->dwResultReadStrLen > 0 ?
DWORD_ALIGN(((lpCompStrW->dwResultReadStrLen+1) *
sizeof(WCHAR))) : 0)+
02004 (lpCompStrW->dwResultReadClauseLen > 0 ?
DWORD_ALIGN(lpCompStrW->dwResultReadClauseLen+1) : 0);
02005
02006
if (lpStringExA ==
NULL) {
02007
return dwSize;
02008 }
02009
02010 dwPos =
DWORD_ALIGN(
sizeof(STRINGEXSTRUCT) + 1);
02011 lpStringExA->dwSize = dwSize;
02012
02013
if (lpCompStrW->dwResultStrLen > 0) {
02014 i = WideCharToMultiByte( CP_ACP,
02015 (
DWORD)0,
02016 (LPWSTR)((
PBYTE)lpCompStrW + lpCompStrW->dwResultStrOffset),
02017 (
INT)lpCompStrW->dwResultStrLen,
02018 (LPSTR)((
PBYTE)lpStringExA + dwPos),
02019 (
INT)dwSize - dwPos,
02020 (LPSTR)
NULL,
02021 (LPBOOL)&bUDC);
02022 ((LPSTR)((
PBYTE)lpStringExA + dwPos))[i] =
'\0';
02023 dwLen = i;
02024 lpStringExA->uDeterminePos = dwPos;
02025 dwPos +=
DWORD_ALIGN(((dwLen + 1)*
sizeof(
CHAR)));
02026 }
else {
02027 dwLen = 0;
02028 lpStringExA->uDeterminePos = 0;
02029 }
02030
02031
if ( (dwGCS & GCS_RESULTCLAUSE) &&
02032 (lpCompStrW->dwResultClauseLen > 0) )
02033 {
02034
if (dwLen != 0 && lpCompStrW->dwResultClauseLen > 0) {
02035 LPDWORD lpw;
02036 LPDWORD lpdw;
02037
02038 lpw = (LPDWORD)((
PBYTE)lpStringExA + dwPos);
02039 lpdw = (LPDWORD)((
PBYTE)lpCompStrW + lpCompStrW->dwResultClauseOffset);
02040
02041
for (i = 0; i < (lpCompStrW->dwResultClauseLen /
sizeof(
DWORD)); i++) {
02042 *lpw++ =
CalcCharacterPositionWtoA(*lpdw++,
02043 (LPWSTR)((
PBYTE)lpCompStrW + lpCompStrW->dwResultStrOffset),
02044 CP_ACP
02045 );
02046 }
02047
02048 lpStringExA->uDetermineDelimPos = dwPos;
02049 dwPos +=
DWORD_ALIGN((lpCompStrW->dwResultClauseLen + 1));
02050 }
02051 }
02052
02053
if (lpCompStrW->dwResultReadStrLen > 0) {
02054 i = WideCharToMultiByte( CP_ACP,
02055 (
DWORD)0,
02056 (LPWSTR)((
PBYTE)lpCompStrW + lpCompStrW->dwResultReadStrOffset),
02057 (
INT)lpCompStrW->dwResultReadStrLen,
02058 (LPSTR)((
PBYTE)lpStringExA + dwPos),
02059 (
INT)dwSize - dwPos,
02060 (LPSTR)
NULL,
02061 (LPBOOL)&bUDC);
02062 ((LPSTR)((
PBYTE)lpStringExA + dwPos))[i] =
'\0';
02063 dwLen = i;
02064 lpStringExA->uYomiPos = dwPos;
02065 dwPos +=
DWORD_ALIGN(((dwLen + 1)*
sizeof(
CHAR)));
02066 }
else {
02067 dwLen = 0;
02068 lpStringExA->uYomiPos = 0;
02069 }
02070
02071
if ( (dwGCS & GCS_RESULTREADCLAUSE) &&
02072 (lpCompStrW->dwResultReadClauseLen > 0) )
02073 {
02074
if (dwLen != 0 && lpCompStrW->dwResultReadClauseLen > 0) {
02075 LPDWORD lpw;
02076 LPDWORD lpdw;
02077
02078 lpw = (LPDWORD)((
PBYTE)lpStringExA + dwPos);
02079 lpdw = (LPDWORD)((
PBYTE)lpCompStrW + lpCompStrW->dwResultReadClauseOffset);
02080
02081
for (i = 0; i < (lpCompStrW->dwResultReadClauseLen /
sizeof(
DWORD)); i++) {
02082 *lpw++ =
CalcCharacterPositionWtoA(*lpdw++,
02083 (LPWSTR)((
PBYTE)lpCompStrW + lpCompStrW->dwResultReadStrOffset),
02084 CP_ACP
02085 );
02086 }
02087
02088 lpStringExA->uYomiDelimPos = dwPos;
02089 dwPos +=
DWORD_ALIGN((lpCompStrW->dwResultReadClauseLen + 1));
02090 }
02091 }
02092
02093
return dwSize;
02094 }
02095
02096
DWORD
02097 CompStrWToStringW(
02098 LPCOMPOSITIONSTRING lpCompStrW,
02099 LPWSTR lpStringW
02100 )
02101
02102
02103
02104
02105
02106
02107
02108
02109
02110
02111
02112
02113
02114 {
02115 LPWSTR lpwszString;
02116
DWORD dwSize;
02117
02118 lpwszString = (LPWSTR)((
PBYTE)lpCompStrW + lpCompStrW->dwResultStrOffset);
02119 dwSize = lpCompStrW->dwResultStrLen;
02120
02121
if (lpStringW ==
NULL) {
02122
return ((dwSize + 1) *
sizeof(WCHAR));
02123 }
02124
02125 memcpy((
PBYTE)lpStringW,
02126 (
PBYTE)lpwszString,
02127 (dwSize *
sizeof(WCHAR))
02128 );
02129 lpStringW[dwSize] =
L'\0';
02130
02131
return ((dwSize + 1) *
sizeof(WCHAR));
02132 }
02133
02134
DWORD
02135 CompStrWToStringA(
02136 LPCOMPOSITIONSTRING lpCompStrW,
02137 LPSTR lpStringA
02138 )
02139
02140
02141
02142
02143
02144
02145
02146
02147
02148
02149
02150
02151
02152 {
02153 LPWSTR lpwszString;
02154
DWORD dwSize;
02155
UINT i;
02156
BOOL bUDC;
02157
02158 lpwszString = (LPWSTR)((
PBYTE)lpCompStrW + lpCompStrW->dwResultStrOffset);
02159
02160 i = WideCharToMultiByte( CP_ACP,
02161 (
DWORD)0,
02162 (LPWSTR)lpwszString,
02163 (
INT)lpCompStrW->dwResultStrLen,
02164 (LPSTR)lpStringA,
02165 (
INT)0,
02166 (LPSTR)
NULL,
02167 (LPBOOL)&bUDC);
02168
02169
if (lpStringA ==
NULL) {
02170 dwSize = (i+1) *
sizeof(
CHAR);
02171 }
02172
else {
02173 dwSize = (i+1) *
sizeof(
CHAR);
02174
02175 i = WideCharToMultiByte( CP_ACP,
02176 (
DWORD)0,
02177 (LPWSTR)lpwszString,
02178 (
INT)lpCompStrW->dwResultStrLen,
02179 (LPSTR)lpStringA,
02180 (
INT)dwSize,
02181 (LPSTR)
NULL,
02182 (LPBOOL)&bUDC);
02183
02184 lpStringA[i] =
'\0';
02185 dwSize = (i+1) *
sizeof(
CHAR);
02186 }
02187
02188
return dwSize;
02189 }
02190
02191
VOID
02192 CompStrWToCharW(
02193 HWND hWnd,
02194 LPCOMPOSITIONSTRING lpCompStrW
02195 )
02196
02197
02198
02199
02200
02201
02202
02203
02204
02205
02206
02207
02208
02209 {
02210 LPWSTR lpwszString;
02211
02212 lpwszString = (LPWSTR)((
PBYTE)lpCompStrW + lpCompStrW->dwResultStrOffset);
02213
02214
02215
02216
02217
02218
02219 PostMessageW(
hWnd, WM_IME_REPORT, IR_STRINGSTART, 0
L );
02220
02221
02222
while(*lpwszString)
02223 {
02224
if( *
CharNextW(lpwszString) == 0 )
02225 {
02226 PostMessageW(
hWnd, WM_IME_REPORT, IR_STRINGEND, 0
L );
02227 }
02228 PostMessageW(
hWnd, WM_CHAR, *lpwszString, 1
L);
02229 lpwszString =
CharNextW(lpwszString);
02230 }
02231 }
02232
02233
VOID
02234 CompStrWToCharA(
02235 HWND hWnd,
02236 LPCOMPOSITIONSTRING lpCompStrW
02237 )
02238
02239
02240
02241
02242
02243
02244
02245
02246
02247
02248
02249
02250
02251 {
02252 LPWSTR lpwszString;
02253
BOOL fDBCSWmChar =
FALSE;
02254 WORD wDBCSChar;
02255
UINT i;
02256
BOOL bUDC;
02257
BYTE szAscii[3];
02258
02259 lpwszString = (LPWSTR)((
PBYTE)lpCompStrW + lpCompStrW->dwResultStrOffset);
02260
02261
02262
02263
02264
02265
02266
02267
if (
GetClientInfo()->dwExpWinVer >= 0x030A ) {
02268 fDBCSWmChar = (
BOOL)SendMessageA(
hWnd,WM_IME_REPORT,IR_DBCSCHAR, 0
L);
02269 }
02270
02271
02272
02273
02274
02275 PostMessageA(
hWnd, WM_IME_REPORT, IR_STRINGSTART, 0
L );
02276
02277
02278
while (*lpwszString) {
02279
02280
if ( *
CharNextW(lpwszString) == 0 ) {
02281 PostMessageA(
hWnd, WM_IME_REPORT, IR_STRINGEND, 0
L );
02282 }
02283
02284 i = WideCharToMultiByte( CP_ACP,
02285 (
DWORD)0,
02286 (LPWSTR)lpwszString,
02287 (
INT)1,
02288 (LPSTR)szAscii,
02289 (
INT)
sizeof(szAscii),
02290 (LPSTR)
NULL,
02291 (LPBOOL)&bUDC);
02292
02293
if (i != 0) {
02294
02295
if ( IsDBCSLeadByte( szAscii[0] ) ) {
02296
02297
02298
02299
02300
02301
02302
if ( fDBCSWmChar )
02303 {
02304
02305
02306
02307
02308
02309 wDBCSChar = MAKEWORD(szAscii[1], szAscii[0]);
02310 PostMessageA(
hWnd, WM_CHAR, wDBCSChar|
WMCR_IR_DBCSCHAR, 1
L );
02311 }
02312
else
02313 {
02314
02315
02316
02317
02318 PostMessageA(
hWnd, WM_CHAR, (WPARAM)(szAscii[0]), 1
L);
02319 PostMessageA(
hWnd, WM_CHAR, (WPARAM)(szAscii[1]), 1
L);
02320 }
02321 }
02322
else
02323 {
02324 PostMessageA(
hWnd, WM_CHAR, (WPARAM)(szAscii[0]), 1
L);
02325 }
02326 }
02327
02328 lpwszString =
CharNextW(lpwszString);
02329 }
02330
02331 }