Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/teraterm/ttpcmn/ttcmn.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9805 - (show annotations) (download) (as text)
Sat Mar 12 05:39:20 2022 UTC (2 years, 1 month ago) by zmatsuo
File MIME type: text/x-csrc
File size: 37669 byte(s)
ssh_known_hosts を起動時コピー設定ファイルに追加した

- ssh_known_hosts がないときダイアログが表示される
  - 「known_hosts 読み込み中にエラーが発生しました.」
- exeのあるフォルダの ssh_known_hosts を個人フォルダにコピーする
  - インストール直後の ssh_known_hosts はコメントのみが入っている
- ポータブル版ではコピーしないようにした
  - ポータブル版ではexeのフォルダと設定ファイルのあるフォルダが同一
- r9532
1 /*
2 * Copyright (C) 1994-1998 T. Teranishi
3 * (C) 2004- TeraTerm Project
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30 /* TTCMN.DLL, main */
31 #include <direct.h>
32 #include <string.h>
33 #include <stdio.h>
34 #include <windows.h>
35 #include <setupapi.h>
36 #include <htmlhelp.h>
37 #include <assert.h>
38 #include <crtdbg.h>
39 #include <time.h>
40
41 #define DllExport __declspec(dllexport)
42 #include "language.h"
43 #undef DllExport
44
45 #include "teraterm.h"
46 #include "tttypes.h"
47 #include "ttlib.h"
48 #include "tt_res.h"
49 #include "codeconv.h"
50 #include "compat_win.h"
51 #include "win32helper.h"
52 #include "asprintf.h"
53 #include "fileread.h"
54 #include "../teraterm/unicode.h"
55
56 #include "ttcmn_dup.h"
57
58 #define DllExport __declspec(dllexport)
59 #include "ttcommon.h"
60
61 /* shared memory */
62 typedef struct {
63 size_t size_tmap; /* sizeof TMap */
64 size_t size_tttset; /* sizeof TTTSet */
65 // Window list
66 int NWin;
67 HWND WinList[MAXNWIN];
68 /* COM port use flag
69 * bit 8 7 6 5 4 3 2 1
70 * char[0] : COM 8 7 6 5 4 3 2 1
71 * char[1] : COM16 15 14 13 12 11 10 9 ...
72 */
73 unsigned char ComFlag[(MAXCOMPORT-1)/CHAR_BIT+1];
74 /* Previous window rect (Tera Term 4.78 or later) */
75 WINDOWPLACEMENT WinPrevRect[MAXNWIN];
76 BOOL WinUndoFlag;
77 int WinUndoStyle;
78 // Duplicate Teraterm data
79 HANDLE DuplicateDataHandle;
80 DWORD DuplicateDataSizeLow;
81 } TMap;
82 typedef TMap *PMap;
83
84 // TMap ���i�[�����t�@�C���}�b�s���O�I�u�W�F�N�g(���L������)�����O
85 // TMap(�����������o)���X�V�������o�[�W�������������N���������������K�v��������
86 // �A�������o�[�W�����������g�����������X�������A���������������X�����K�v������
87 #define TT_FILEMAPNAME "ttset_memfilemap_" TT_VERSION_STR("_")
88
89 /* first instance flag */
90 static BOOL FirstInstance = TRUE;
91
92 static HINSTANCE hInst;
93
94 static PMap pm;
95
96 static HANDLE HMap = NULL;
97 #define VTCLASSNAME "VTWin32"
98 #define TEKCLASSNAME "TEKWin32"
99
100 enum window_style {
101 WIN_CASCADE,
102 WIN_STACKED,
103 WIN_SIDEBYSIDE,
104 };
105
106 static const char DupDataName[] = "dupdata";
107
108 void WINAPI CopyShmemToTTSet(PTTSet ts)
109 {
110 DWORD size = pm->DuplicateDataSizeLow;
111 HANDLE handle = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, DupDataName);
112 void *ptr = (void *)MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
113 TTCMNUnserialize(ptr, (size_t)size, ts);
114 UnmapViewOfFile(ptr);
115 CloseHandle(handle);
116 pm->DuplicateDataSizeLow = 0;
117 }
118
119 void WINAPI CopyTTSetToShmem(PTTSet ts)
120 {
121 size_t size;
122 void *ptr = TTCMNSerialize(ts, &size);
123 if (ptr != NULL) {
124 HANDLE handle = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, (DWORD)size, DupDataName);
125 void *dest = (void *)MapViewOfFile(handle, FILE_MAP_ALL_ACCESS,0,0,0);
126 memcpy(dest, ptr, size);
127 UnmapViewOfFile(dest);
128 //CloseHandle(handle); do not close, �g�p����������������������������������
129
130 if (pm->DuplicateDataHandle != NULL) {
131 // 1���O����������������
132 CloseHandle(pm->DuplicateDataHandle);
133 }
134 pm->DuplicateDataHandle = handle;
135 pm->DuplicateDataSizeLow = (DWORD)size;
136 free(ptr);
137 }
138 }
139
140 static void CopyFiles(const wchar_t *file_list[], const wchar_t *src_dir, const wchar_t *dest_dir)
141 {
142 for (;;) {
143 wchar_t *dest;
144 size_t len;
145 const wchar_t *filename = *file_list;
146 file_list++;
147 if (filename == NULL) {
148 break;
149 }
150
151 dest = NULL;
152 awcscats(&dest, dest_dir, L"\\", filename, NULL);
153
154 len = wcslen(dest);
155 if (dest[len - 1] == '\\') {
156 // �t�H���_����
157 CreateDirectoryW(dest, NULL);
158 }
159 else {
160 wchar_t *src = NULL;
161 awcscats(&src, src_dir, L"\\", filename, NULL);
162 CopyFileW(src, dest, TRUE); // TRUE = do not copy if exists
163 free(src);
164 }
165 free(dest);
166 }
167 }
168
169 static void ConvertIniFiles(const wchar_t *filelist[], const wchar_t *dir, const wchar_t *date_str)
170 {
171 while(1) {
172 wchar_t *fname;
173 if (*filelist == NULL) {
174 break;
175 }
176
177 fname = NULL;
178 awcscats(&fname, dir, L"\\", *filelist, NULL);
179 ConvertIniFileCharCode(fname, date_str);
180 free(fname);
181 filelist++;
182 }
183 }
184
185 BOOL WINAPI StartTeraTerm(PTTSet ts)
186 {
187 if (FirstInstance) {
188 // init window list
189 pm->NWin = 0;
190 }
191 else {
192 /* only the first instance uses saved position */
193 ts->VTPos.x = CW_USEDEFAULT;
194 ts->VTPos.y = CW_USEDEFAULT;
195 ts->TEKPos.x = CW_USEDEFAULT;
196 ts->TEKPos.y = CW_USEDEFAULT;
197 }
198
199 // if (FirstInstance) { �������������� (2008.3.13 maya)
200 // �N���������A���L�������� HomeDir �� SetupFName ����������
201 /* Get home directory (ttermpro.exe���t�H���_) */
202 ts->ExeDirW = GetExeDirW(hInst);
203
204 // LogDir
205 ts->LogDirW = GetLogDirW(hInst);
206
207 // HomeDir
208 ts->HomeDirW = GetHomeDirW(hInst);
209 WideCharToACP_t(ts->HomeDirW, ts->HomeDir, _countof(ts->HomeDir));
210 SetCurrentDirectoryW(ts->HomeDirW); // TODO �K�v??
211
212 // TERATERM.INI ���t���p�X
213 ts->SetupFNameW = NULL;
214 awcscats(&ts->SetupFNameW, ts->HomeDirW, L"\\TERATERM.INI", NULL);
215 WideCharToACP_t(ts->SetupFNameW, ts->SetupFName, _countof(ts->SetupFName));
216
217 // KEYBOARD.CNF ���t���p�X
218 ts->KeyCnfFNW = NULL;
219 awcscats(&ts->KeyCnfFNW, ts->HomeDirW, L"\\KEYBOARD.CNF", NULL);
220 WideCharToACP_t(ts->KeyCnfFNW, ts->KeyCnfFN, _countof(ts->KeyCnfFN));
221
222 // �|�[�^�u�����[�h���������A
223 // ���l�����t�@�C���������t�H���_ HomeDirW �� TERATERM.INI ����������������
224 if (!IsPortableMode() &&
225 (GetFileAttributesW(ts->SetupFNameW) == INVALID_FILE_ATTRIBUTES)) {
226 // �����t�@�C�������l�t�H���_���R�s�[����
227 static const wchar_t *filelist[] = {
228 L"TERATERM.INI",
229 L"KEYBOARD.CNF",
230 L"cygterm.cfg",
231 L"ssh_known_hosts",
232 #if 0
233 L"theme\\",
234 L"theme\\Advanced.sample",
235 L"theme\\ImageFile.INI",
236 L"theme\\scale\\",
237 L"theme\\scale\\23.jpg",
238 L"theme\\scale\\43.jpg",
239 L"theme\\Scale.INI",
240 L"theme\\tile\\",
241 L"theme\\tile\\03.jpg",
242 L"theme\\tile\\44.jpg",
243 L"theme\\Tile.INI",
244 #endif
245 NULL,
246 };
247 CopyFiles(filelist, ts->ExeDirW, ts->HomeDirW);
248 }
249
250 // ini�t�@�C���������R�[�h����������
251 {
252 static const wchar_t *filelist[] = {
253 L"TERATERM.INI",
254 L"KEYBOARD.CNF",
255 NULL,
256 };
257
258 // backup �t�@�C�������������t������
259 wchar_t *date_str = MakeISO8601Str(0);
260 awcscat(&date_str, L"_");
261
262 // ini�t�@�C������������
263 ConvertIniFiles(filelist, ts->HomeDirW, date_str);
264
265 free(date_str);
266 }
267
268 if (FirstInstance) {
269 FirstInstance = FALSE;
270 return TRUE;
271 }
272 else {
273 return FALSE;
274 }
275 }
276
277 // �����t�@�C�����f�B�X�N���������ATera Term�{�������N�������B
278 // (2012.4.30 yutaka)
279 // �g����������?
280 void WINAPI RestartTeraTerm(HWND hwnd, PTTSet ts)
281 {
282 wchar_t *path;
283 int ret;
284
285 static const TTMessageBoxInfoW info = {
286 "Tera Term",
287 NULL, L"Tera Term: Configuration Warning",
288 "MSG_TT_TAKE_EFFECT",
289 L"This option takes effect the next time a session is started.\n"
290 L"Are you sure that you want to relaunch Tera Term?",
291 MB_YESNO | MB_ICONEXCLAMATION | MB_DEFBUTTON2
292 };
293 ret = TTMessageBoxA(hwnd, &info, ts->UILanguageFile);
294 if (ret != IDYES)
295 return;
296
297 SendMessage(hwnd, WM_COMMAND, ID_SETUP_SAVE, 0);
298 // ID_FILE_EXIT ���b�Z�[�W�����A�v�������������������������AWM_QUIT ���|�X�g�����B
299 //PostMessage(hwnd, WM_COMMAND, ID_FILE_EXIT, 0);
300 PostQuitMessage(0);
301
302 // ���v���Z�X�����N���B
303 if (hGetModuleFileNameW(NULL, &path) == 0) {
304 TTWinExec(path);
305 free(path);
306 }
307 }
308
309 void WINAPI SetCOMFlag(int Com)
310 {
311 pm->ComFlag[(Com-1)/CHAR_BIT] |= 1 << ((Com-1)%CHAR_BIT);
312 }
313
314 void WINAPI ClearCOMFlag(int Com)
315 {
316 pm->ComFlag[(Com-1)/CHAR_BIT] &= ~(1 << ((Com-1)%CHAR_BIT));
317 }
318
319 int WINAPI CheckCOMFlag(int Com)
320 {
321 return ((pm->ComFlag[(Com-1)/CHAR_BIT] & 1 << (Com-1)%CHAR_BIT) > 0);
322 }
323
324 int WINAPI RegWin(HWND HWinVT, HWND HWinTEK)
325 {
326 int i, j;
327
328 if (pm->NWin>=MAXNWIN)
329 return 0;
330 if (HWinVT==NULL)
331 return 0;
332 if (HWinTEK!=NULL) {
333 i = 0;
334 while ((i<pm->NWin) && (pm->WinList[i]!=HWinVT))
335 i++;
336 if (i>=pm->NWin)
337 return 0;
338 for (j=pm->NWin-1 ; j>i ; j--)
339 pm->WinList[j+1] = pm->WinList[j];
340 pm->WinList[i+1] = HWinTEK;
341 pm->NWin++;
342 return 0;
343 }
344 pm->WinList[pm->NWin++] = HWinVT;
345 memset(&pm->WinPrevRect[pm->NWin - 1], 0, sizeof(pm->WinPrevRect[pm->NWin - 1])); // RECT clear
346 if (pm->NWin==1) {
347 return 1;
348 }
349 else {
350 return (int)(SendMessage(pm->WinList[pm->NWin-2],
351 WM_USER_GETSERIALNO,0,0)+1);
352 }
353 }
354
355 void WINAPI UnregWin(HWND HWin)
356 {
357 int i, j;
358
359 i = 0;
360 while ((i<pm->NWin) && (pm->WinList[i]!=HWin)) {
361 i++;
362 }
363 if (pm->WinList[i]!=HWin) {
364 return;
365 }
366 for (j=i ; j<pm->NWin-1 ; j++) {
367 pm->WinList[j] = pm->WinList[j+1];
368 pm->WinPrevRect[j] = pm->WinPrevRect[j+1]; // RECT shift
369 }
370 if (pm->NWin>0) {
371 pm->NWin--;
372 }
373 }
374
375 char GetWindowTypeChar(HWND Hw, HWND HWin)
376 {
377 #if 0
378 if (HWin == Hw)
379 return '*';
380 else if (!IsWindowVisible(Hw))
381 #else
382 if (!IsWindowVisible(Hw))
383 #endif
384 return '#';
385 else if (IsIconic(Hw))
386 return '-';
387 else if (IsZoomed(Hw))
388 return '@';
389 else
390 return '+';
391 }
392
393 void WINAPI SetWinMenu(HMENU menu, PCHAR buf, int buflen, PCHAR langFile, int VTFlag)
394 {
395 int i;
396 char Temp[MAXPATHLEN];
397 HWND Hw;
398 wchar_t uimsg[MAX_UIMSG];
399
400 // delete all items in Window menu
401 i = GetMenuItemCount(menu);
402 if (i>0)
403 do {
404 i--;
405 RemoveMenu(menu,i,MF_BYPOSITION);
406 } while (i>0);
407
408 i = 0;
409 while (i<pm->NWin) {
410 Hw = pm->WinList[i]; // get window handle
411 if ((GetClassName(Hw,Temp,sizeof(Temp))>0) &&
412 ((strcmp(Temp,VTCLASSNAME)==0) ||
413 (strcmp(Temp,TEKCLASSNAME)==0))) {
414 Temp[0] = '&';
415 Temp[1] = (char)(0x31 + i);
416 Temp[2] = ' ';
417 Temp[3] = GetWindowTypeChar(Hw, NULL);
418 Temp[4] = ' ';
419 GetWindowText(Hw,&Temp[5],sizeof(Temp)-6);
420 AppendMenu(menu,MF_ENABLED | MF_STRING,ID_WINDOW_1+i,Temp);
421 i++;
422 if (i>8) {
423 i = pm->NWin;
424 }
425 }
426 else {
427 UnregWin(Hw);
428 }
429 }
430 if (VTFlag == 1) {
431 static const DlgTextInfo MenuTextInfo[] = {
432 { ID_WINDOW_WINDOW, "MENU_WINDOW_WINDOW" },
433 { ID_WINDOW_MINIMIZEALL, "MENU_WINDOW_MINIMIZEALL" },
434 { ID_WINDOW_RESTOREALL, "MENU_WINDOW_RESTOREALL" },
435 { ID_WINDOW_CASCADEALL, "MENU_WINDOW_CASCADE" },
436 { ID_WINDOW_STACKED, "MENU_WINDOW_STACKED" },
437 { ID_WINDOW_SIDEBYSIDE, "MENU_WINDOW_SIDEBYSIDE" },
438 };
439
440 AppendMenu(menu, MF_SEPARATOR, 0, NULL);
441 AppendMenu(menu, MF_ENABLED | MF_STRING, ID_WINDOW_WINDOW, "&Window");
442 AppendMenu(menu, MF_ENABLED | MF_STRING, ID_WINDOW_MINIMIZEALL, "&Minimize All");
443 AppendMenu(menu, MF_ENABLED | MF_STRING, ID_WINDOW_RESTOREALL, "&Restore All");
444 AppendMenu(menu, MF_ENABLED | MF_STRING, ID_WINDOW_CASCADEALL, "&Cascade");
445 AppendMenu(menu, MF_ENABLED | MF_STRING, ID_WINDOW_STACKED, "&Stacked");
446 AppendMenu(menu, MF_ENABLED | MF_STRING, ID_WINDOW_SIDEBYSIDE, "Side &by Side");
447
448 SetI18nMenuStrs("Tera Term", menu, MenuTextInfo, _countof(MenuTextInfo), langFile);
449
450 if (pm->WinUndoFlag) {
451 if (pm->WinUndoStyle == WIN_CASCADE)
452 get_lang_msgW("MENU_WINDOW_CASCADE_UNDO", uimsg, _countof(uimsg), L"&Undo - Cascade", langFile);
453 else if (pm->WinUndoStyle == WIN_STACKED)
454 get_lang_msgW("MENU_WINDOW_STACKED_UNDO", uimsg, _countof(uimsg), L"&Undo - Stacked", langFile);
455 else
456 get_lang_msgW("MENU_WINDOW_SIDEBYSIDE_UNDO", uimsg, _countof(uimsg), L"&Undo - Side by Side", langFile);
457 AppendMenuW(menu, MF_ENABLED | MF_STRING, ID_WINDOW_UNDO, uimsg); // TODO UNICODE
458 }
459
460 }
461 else {
462 get_lang_msgW("MENU_WINDOW_WINDOW", uimsg, _countof(uimsg), L"&Window", langFile);
463 AppendMenuW(menu,MF_ENABLED | MF_STRING,ID_TEKWINDOW_WINDOW, uimsg);
464 }
465 }
466
467 void WINAPI SetWinList(HWND HWin, HWND HDlg, int IList)
468 {
469 int i;
470 char Temp[MAXPATHLEN];
471 HWND Hw;
472
473 for (i=0; i<pm->NWin; i++) {
474 Hw = pm->WinList[i]; // get window handle
475 if ((GetClassName(Hw,Temp,sizeof(Temp))>0) &&
476 ((strcmp(Temp,VTCLASSNAME)==0) ||
477 (strcmp(Temp,TEKCLASSNAME)==0))) {
478 Temp[0] = GetWindowTypeChar(Hw, HWin);
479 Temp[1] = ' ';
480 GetWindowText(Hw,&Temp[2],sizeof(Temp)-3);
481 SendDlgItemMessage(HDlg, IList, LB_ADDSTRING,
482 0, (LPARAM)Temp);
483 if (Hw==HWin) {
484 SendDlgItemMessage(HDlg, IList, LB_SETCURSEL, i,0);
485 }
486 }
487 else {
488 UnregWin(Hw);
489 }
490 }
491 }
492
493 void WINAPI SelectWin(int WinId)
494 {
495 if ((WinId>=0) && (WinId<pm->NWin)) {
496 /* �E�B���h�E�����������������������������������A���������������������������A
497 * SW_SHOWNORMAL ���� SW_SHOW �����X�����B
498 * (2009.11.8 yutaka)
499 * �E�B���h�E�����������������������������T�C�Y������(SW_RESTORE)�����������B
500 * (2009.11.9 maya)
501 */
502 if (IsIconic(pm->WinList[WinId])) {
503 ShowWindow(pm->WinList[WinId],SW_RESTORE);
504 }
505 else {
506 ShowWindow(pm->WinList[WinId],SW_SHOW);
507 }
508 SetForegroundWindow(pm->WinList[WinId]);
509 }
510 }
511
512 void WINAPI SelectNextWin(HWND HWin, int Next, BOOL SkipIconic)
513 {
514 int i;
515
516 i = 0;
517 while ((i < pm->NWin) && (pm->WinList[i]!=HWin)) {
518 i++;
519 }
520 if (pm->WinList[i]!=HWin) {
521 return;
522 }
523
524 do {
525 i += Next;
526 if (i >= pm->NWin) {
527 i = 0;
528 }
529 else if (i < 0) {
530 i = pm->NWin-1;
531 }
532
533 if (pm->WinList[i] == HWin) {
534 break;
535 }
536 } while ((SkipIconic && IsIconic(pm->WinList[i])) || !IsWindowVisible(pm->WinList[i]));
537
538 SelectWin(i);
539 }
540
541 void WINAPI ShowAllWin(int stat) {
542 int i;
543
544 for (i=0; i < pm->NWin; i++) {
545 ShowWindow(pm->WinList[i], stat);
546 }
547 }
548
549 void WINAPI UndoAllWin(void) {
550 int i;
551 WINDOWPLACEMENT rc0;
552 RECT rc;
553 int stat = SW_RESTORE;
554 int multi_mon = 0;
555
556 if (HasMultiMonitorSupport()) {
557 multi_mon = 1;
558 }
559
560 // ���x�A�����������t���O���������B
561 pm->WinUndoFlag = FALSE;
562
563 memset(&rc0, 0, sizeof(rc0));
564
565 for (i=0; i < pm->NWin; i++) {
566 // �����w�����A�O�����������c���������������A�E�B���h�E�����������������B
567 if (stat == SW_RESTORE && memcmp(&pm->WinPrevRect[i], &rc0, sizeof(rc0)) != 0) {
568 rc = pm->WinPrevRect[i].rcNormalPosition;
569
570 // NT4.0, 95 ���}���`���j�^API��������
571 if (multi_mon) {
572 // �������j�^������������
573 HMONITOR hMonitor;
574 MONITORINFO mi;
575 hMonitor = pMonitorFromRect(&rc, MONITOR_DEFAULTTONEAREST);
576 mi.cbSize = sizeof(MONITORINFO);
577 pGetMonitorInfoA(hMonitor, &mi);
578
579 // ���u�����i�����O���������x���������������������������j
580 if (rc.right > mi.rcMonitor.right) {
581 rc.left -= rc.right - mi.rcMonitor.right;
582 rc.right = mi.rcMonitor.right;
583 }
584 if (rc.left < mi.rcMonitor.left) {
585 rc.right += mi.rcMonitor.left - rc.left;
586 rc.left = mi.rcMonitor.left;
587 }
588 if (rc.bottom > mi.rcMonitor.bottom) {
589 rc.top -= rc.bottom - mi.rcMonitor.bottom;
590 rc.bottom = mi.rcMonitor.bottom;
591 }
592 if (rc.top < mi.rcMonitor.top) {
593 rc.bottom += mi.rcMonitor.top - rc.top;
594 rc.top = mi.rcMonitor.top;
595 }
596 }
597
598 // �E�B���h�E���u����
599 SetWindowPos(
600 pm->WinList[i], NULL,
601 rc.left,
602 rc.top,
603 rc.right - rc.left,
604 rc.bottom - rc.top,
605 SWP_NOZORDER);
606
607 // �E�B���h�E����������
608 ShowWindow(pm->WinList[i], pm->WinPrevRect[i].showCmd);
609
610 } else {
611 ShowWindow(pm->WinList[i], stat);
612 }
613 }
614 }
615
616 void WINAPI OpenHelp(UINT Command, DWORD Data, char *UILanguageFile)
617 {
618 wchar_t Temp[MAX_PATH];
619 HWND HWin;
620 wchar_t *HelpFN;
621 wchar_t uimsg[MAX_UIMSG];
622 wchar_t *HomeDirW;
623
624 /* Get home directory TODO ts.HomeDirW ���������� */
625 if (GetModuleFileNameW(NULL,Temp,_countof(Temp)) == 0) {
626 return;
627 }
628 HomeDirW = ExtractDirNameW(Temp);
629 get_lang_msgW("HELPFILE", uimsg, _countof(uimsg), L"teraterm.chm", UILanguageFile);
630 aswprintf(&HelpFN, L"%s\\%s", HomeDirW, uimsg);
631 free(HomeDirW);
632
633 // �w���v���I�[�i�[�������f�X�N�g�b�v������ (2007.5.12 maya)
634 HWin = GetDesktopWindow();
635 if (_HtmlHelpW(HWin, HelpFN, Command, Data) == NULL) {
636 // �w���v���J����������
637 static const TTMessageBoxInfoW info = {
638 "Tera Term",
639 NULL, L"Tera Term: HTML help",
640 "MSG_OPENHELP_ERROR", L"Can't open HTML help file(%s).",
641 MB_OK | MB_ICONERROR };
642 TTMessageBoxA(HWin, &info, UILanguageFile, HelpFN);
643 }
644 free(HelpFN);
645 }
646
647 HWND WINAPI GetNthWin(int n)
648 {
649 if (n<pm->NWin) {
650 return pm->WinList[n];
651 }
652 else {
653 return NULL;
654 }
655 }
656
657 int WINAPI GetRegisteredWindowCount(void)
658 {
659 return (pm->NWin);
660 }
661
662 // �L�����E�B���h�E���T���A�������u���L�������������B
663 static void get_valid_window_and_memorize_rect(HWND myhwnd, HWND hwnd[], int *num, int style)
664 {
665 int i, n;
666 WINDOWPLACEMENT wndPlace;
667
668 // ��������(Undo)���j���[�����x�����\���������B
669 if (pm->WinUndoFlag == FALSE) {
670 pm->WinUndoFlag = TRUE;
671 } else {
672 // ���������j���[���\�������������A�������O�������X�^�C�����I�����������A
673 // ���j���[�������B
674 // Windows8�����A�������A�����������X�^�C�����I�����������j���[�����������������A
675 // Tera Term�������j���[���\�������������A�������������B
676 if (pm->WinUndoStyle == style)
677 pm->WinUndoFlag = FALSE;
678 }
679 pm->WinUndoStyle = style;
680
681 n = 0;
682 for (i = 0 ; i < pm->NWin ; i++) {
683 // �������u���o���������B
684 wndPlace.length = sizeof(WINDOWPLACEMENT);
685 GetWindowPlacement(pm->WinList[i], &wndPlace);
686 pm->WinPrevRect[i] = wndPlace;
687
688 // �������g�������������B
689 if (pm->WinList[i] == myhwnd) {
690 hwnd[n] = hwnd[0];
691 hwnd[0] = myhwnd;
692 } else {
693 hwnd[n] = pm->WinList[i];
694 }
695 n++;
696 }
697 *num = n;
698 }
699
700 // �E�B���h�E�����E���������\������(Show Windows Side by Side)
701 void WINAPI ShowAllWinSidebySide(HWND myhwnd)
702 {
703 int n;
704 HWND hwnd[MAXNWIN];
705
706 get_valid_window_and_memorize_rect(myhwnd, hwnd, &n, WIN_SIDEBYSIDE);
707 TileWindows(NULL, MDITILE_VERTICAL, NULL, n, hwnd);
708 }
709
710 // �E�B���h�E���������������\������(Show Windows Stacked)
711 void WINAPI ShowAllWinStacked(HWND myhwnd)
712 {
713 int n;
714 HWND hwnd[MAXNWIN];
715
716 get_valid_window_and_memorize_rect(myhwnd, hwnd, &n, WIN_STACKED);
717 TileWindows(NULL, MDITILE_HORIZONTAL, NULL, n, hwnd);
718 }
719
720 // �E�B���h�E���d�����\������(Cascade)
721 void WINAPI ShowAllWinCascade(HWND myhwnd)
722 {
723 int n;
724 HWND hwnd[MAXNWIN];
725
726 get_valid_window_and_memorize_rect(myhwnd, hwnd, &n, WIN_CASCADE);
727 CascadeWindows(NULL, MDITILE_SKIPDISABLED, NULL, n, hwnd);
728 }
729
730 // �STera Term���I���w�����o���B
731 void WINAPI BroadcastClosingMessage(HWND myhwnd)
732 {
733 int i, max;
734 HWND hwnd[MAXNWIN];
735
736 // Tera Term���I�����������A���L���������������������A
737 // ���������o�b�t�@���R�s�[���������B
738 max = pm->NWin;
739 for (i = 0 ; i < pm->NWin ; i++) {
740 hwnd[i] = pm->WinList[i];
741 }
742
743 for (i = 0 ; i < max ; i++) {
744 // �������g�������������B
745 if (hwnd[i] == myhwnd)
746 continue;
747
748 PostMessage(hwnd[i], WM_USER_NONCONFIRM_CLOSE, 0, 0);
749 }
750 PostMessage(myhwnd, WM_USER_NONCONFIRM_CLOSE, 0, 0);
751 }
752
753
754 int WINAPI CommReadRawByte(PComVar cv, LPBYTE b)
755 {
756 if ( ! cv->Ready ) {
757 return 0;
758 }
759
760 if ( cv->InBuffCount>0 ) {
761 *b = cv->InBuff[cv->InPtr];
762 cv->InPtr++;
763 cv->InBuffCount--;
764 if ( cv->InBuffCount==0 ) {
765 cv->InPtr = 0;
766 }
767 return 1;
768 }
769 else {
770 cv->InPtr = 0;
771 return 0;
772 }
773 }
774
775 static void LogBinSkip(PComVar cv, int add)
776 {
777 if (cv->LogBinSkip != NULL) {
778 cv->LogBinSkip(add);
779 }
780 }
781
782 void WINAPI CommInsert1Byte(PComVar cv, BYTE b)
783 {
784 if ( ! cv->Ready ) {
785 return;
786 }
787
788 if (cv->InPtr == 0) {
789 memmove(&(cv->InBuff[1]),&(cv->InBuff[0]),cv->InBuffCount);
790 }
791 else {
792 cv->InPtr--;
793 }
794 cv->InBuff[cv->InPtr] = b;
795 cv->InBuffCount++;
796
797 LogBinSkip(cv, 1);
798 }
799
800 static void Log1Bin(PComVar cv, BYTE b)
801 {
802 if (cv->Log1Bin != NULL) {
803 cv->Log1Bin(b);
804 }
805 }
806
807 int WINAPI CommRead1Byte(PComVar cv, LPBYTE b)
808 {
809 int c;
810
811 if ( ! cv->Ready ) {
812 return 0;
813 }
814
815 if ( cv->TelMode ) {
816 c = 0;
817 }
818 else {
819 c = CommReadRawByte(cv,b);
820 }
821
822 if ((c==1) && cv->TelCRFlag) {
823 cv->TelCRFlag = FALSE;
824 if (*b==0) {
825 c = 0;
826 }
827 }
828
829 if ( c==1 ) {
830 if ( cv->IACFlag ) {
831 cv->IACFlag = FALSE;
832 if ( *b != 0xFF ) {
833 cv->TelMode = TRUE;
834 CommInsert1Byte(cv,*b);
835 LogBinSkip(cv, -1);
836 c = 0;
837 }
838 }
839 else if ((cv->PortType==IdTCPIP) && (*b==0xFF)) {
840 if (!cv->TelFlag && cv->TelAutoDetect) { /* TTPLUG */
841 cv->TelFlag = TRUE;
842 }
843 if (cv->TelFlag) {
844 cv->IACFlag = TRUE;
845 c = 0;
846 }
847 }
848 else if (cv->TelFlag && ! cv->TelBinRecv && (*b==0x0D)) {
849 cv->TelCRFlag = TRUE;
850 }
851 }
852
853 if (c == 1) {
854 Log1Bin(cv, *b);
855 }
856
857 return c;
858 }
859
860 int WINAPI CommRawOut(PComVar cv, /*const*/ PCHAR B, int C)
861 {
862 int a;
863
864 if ( ! cv->Ready ) {
865 return C;
866 }
867
868 if (C > OutBuffSize - cv->OutBuffCount) {
869 a = OutBuffSize - cv->OutBuffCount;
870 }
871 else {
872 a = C;
873 }
874 if ( cv->OutPtr > 0 ) {
875 memmove(&(cv->OutBuff[0]),&(cv->OutBuff[cv->OutPtr]),cv->OutBuffCount);
876 cv->OutPtr = 0;
877 }
878 memcpy(&(cv->OutBuff[cv->OutBuffCount]),B,a);
879 cv->OutBuffCount = cv->OutBuffCount + a;
880 return a;
881 }
882
883 int WINAPI CommBinaryOut(PComVar cv, PCHAR B, int C)
884 {
885 int a, i, Len;
886 char d[3];
887
888 if ( ! cv->Ready ) {
889 return C;
890 }
891
892 i = 0;
893 a = 1;
894 while ((a>0) && (i<C)) {
895 Len = 0;
896
897 d[Len] = B[i];
898 Len++;
899
900 if ( cv->TelFlag && (B[i]=='\x0d') && ! cv->TelBinSend ) {
901 d[Len++] = '\x00';
902 }
903 else if ( cv->TelFlag && (B[i]=='\xff') ) {
904 d[Len++] = '\xff';
905 }
906
907 if ( OutBuffSize - cv->OutBuffCount - Len >= 0 ) {
908 CommRawOut(cv, d, Len);
909 a = 1;
910 }
911 else {
912 a = 0;
913 }
914
915 i += a;
916 }
917 return i;
918 }
919
920 /**
921 * �f�[�^(������)���o���o�b�t�@����������
922 *
923 * �w���f�[�^��������������������������������������
924 * CommRawOut() ��������������������������
925 *
926 * @retval TRUE �o��������
927 * @retval FALSE �o��������������(buffer full)
928 */
929 static BOOL WriteOutBuff(PComVar cv, const char *TempStr, int TempLen)
930 {
931 BOOL output;
932
933 if (TempLen == 0) {
934 // ����0������������������������
935 return TRUE;
936 }
937
938 output = FALSE;
939 if (cv->TelLineMode) {
940 const BOOL Full = OutBuffSize - cv->LineModeBuffCount - TempLen < 0;
941 if (!Full) {
942 output = TRUE;
943 memcpy(&(cv->LineModeBuff[cv->LineModeBuffCount]), TempStr, TempLen);
944 cv->LineModeBuffCount += TempLen;
945 if (cv->Flush) {
946 cv->FlushLen = cv->LineModeBuffCount;
947 }
948 }
949 if (cv->FlushLen > 0) {
950 const int OutLen = CommRawOut(cv, cv->LineModeBuff, cv->FlushLen);
951 cv->FlushLen -= OutLen;
952 cv->LineModeBuffCount -= OutLen;
953 memmove(cv->LineModeBuff, &(cv->LineModeBuff[OutLen]), cv->LineModeBuffCount);
954 }
955 cv->Flush = FALSE;
956 }
957 else {
958 const BOOL Full = OutBuffSize-cv->OutBuffCount-TempLen < 0;
959 if (! Full) {
960 output = TRUE;
961 CommRawOut(cv, (char *)TempStr, TempLen);
962 }
963 }
964 return output;
965 }
966
967 /**
968 * �f�[�^(������)�������o�b�t�@����������
969 * �����o�b�t�@�������� -> �G�R�[������
970 *
971 * @retval TRUE �o��������
972 * @retval FALSE �o��������������(buffer full)
973 */
974 static BOOL WriteInBuff(PComVar cv, const char *TempStr, int TempLen)
975 {
976 BOOL Full;
977
978 if (TempLen == 0) {
979 return TRUE;
980 }
981
982 Full = InBuffSize-cv->InBuffCount-TempLen < 0;
983 if (! Full) {
984 memcpy(&(cv->InBuff[cv->InBuffCount]),TempStr,TempLen);
985 cv->InBuffCount = cv->InBuffCount + TempLen;
986 return TRUE;
987 }
988 return FALSE;
989 }
990
991 /**
992 * �����o�b�t�@�����������������������l����
993 */
994 static void PackInBuff(PComVar cv)
995 {
996 if ( (cv->InPtr>0) && (cv->InBuffCount>0) ) {
997 memmove(cv->InBuff,&(cv->InBuff[cv->InPtr]),cv->InBuffCount);
998 cv->InPtr = 0;
999 }
1000 }
1001
1002 int WINAPI CommBinaryBuffOut(PComVar cv, PCHAR B, int C)
1003 {
1004 int a, i, Len;
1005 char d[3];
1006
1007 if ( ! cv->Ready ) {
1008 return C;
1009 }
1010
1011 i = 0;
1012 a = 1;
1013 while ((a>0) && (i<C)) {
1014 Len = 0;
1015
1016 d[Len] = B[i];
1017 Len++;
1018
1019 if (B[i] == CR) {
1020 if ( cv->TelFlag && ! cv->TelBinSend ) {
1021 d[Len++] = '\x00';
1022 }
1023 if (cv->TelLineMode) {
1024 cv->Flush = TRUE;
1025 }
1026 }
1027 else if ( cv->TelFlag && (B[i]=='\xff') ) {
1028 d[Len++] = '\xff';
1029 }
1030
1031 if (WriteOutBuff(cv, d, Len)) {
1032 a = 1;
1033 i++;
1034 } else {
1035 a = 0;
1036 }
1037 }
1038 return i;
1039 }
1040
1041 /**
1042 * @retval true ���{�������p�J�^�J�i
1043 * @retval false ������
1044 */
1045 static BOOL IsHalfWidthKatakana(unsigned int u32)
1046 {
1047 // Halfwidth CJK punctuation (U+FF61�`FF64)
1048 // Halfwidth Katakana variants (U+FF65�`FF9F)
1049 return (0xff61 <= u32 && u32 <= 0xff9f);
1050 }
1051
1052 /**
1053 * �o���p�A TODO echo�p������
1054 * @param cv
1055 * @param u32 ��������
1056 * @param check_only TRUE���������s�����A
1057 * @param TempStr �o��������
1058 * @param StrLen TempStr�����o��������
1059 * @retval �������s����
1060 */
1061 static BOOL OutControl(PComVar cv, unsigned int u32, BOOL check_only, char *TempStr, size_t *StrLen)
1062 {
1063 const wchar_t d = u32;
1064 size_t TempLen = 0;
1065 BOOL retval = FALSE;
1066 if (check_only == TRUE) {
1067 /* �`�F�b�N���� */
1068 if (d == CR || d == BS || d == 0x15/*ctrl-u*/) {
1069 return TRUE;
1070 } else {
1071 return FALSE;
1072 }
1073 }
1074 if (d==CR) {
1075 TempStr[TempLen++] = 0x0d;
1076 if (cv->CRSend==IdCRLF) {
1077 TempStr[TempLen++] = 0x0a;
1078 }
1079 else if ((cv->CRSend ==IdCR) &&
1080 cv->TelFlag && ! cv->TelBinSend) {
1081 TempStr[TempLen++] = 0;
1082 }
1083 else if (cv->CRSend == IdLF) {
1084 TempStr[TempLen-1] = 0x0a;
1085 }
1086 if (cv->TelLineMode) {
1087 cv->Flush = TRUE;
1088 }
1089 retval = TRUE;
1090 }
1091 else if (d== BS) {
1092 if (cv->TelLineMode) {
1093 if (cv->FlushLen < cv->LineModeBuffCount) {
1094 cv->LineModeBuffCount--;
1095 }
1096 }
1097 else {
1098 TempStr[TempLen++] = BS;
1099 }
1100 retval = TRUE;
1101 }
1102 else if (d==0x15) { // ctrl-u
1103 if (cv->TelLineMode) {
1104 cv->LineModeBuffCount = cv->FlushLen;
1105 }
1106 else {
1107 TempStr[TempLen++] = 0x15;
1108 }
1109 retval = TRUE;
1110 }
1111 *StrLen = TempLen;
1112 return retval;
1113 }
1114 static BOOL ControlEcho(PComVar cv, unsigned int u32, BOOL check_only, char *TempStr, size_t *StrLen)
1115 {
1116 const wchar_t d = u32;
1117 size_t TempLen = 0;
1118 BOOL retval = FALSE;
1119 if (check_only == TRUE) {
1120 /* �`�F�b�N���� */
1121 if (d == CR || (d == 0x15/*ctrl-u*/ && cv->TelLineMode)) {
1122 return TRUE;
1123 } else {
1124 return FALSE;
1125 }
1126 }
1127 if (d==CR) {
1128 TempStr[TempLen++] = 0x0d;
1129 if (cv->CRSend==IdCRLF) {
1130 TempStr[TempLen++] = 0x0a;
1131 }
1132 else if ((cv->CRSend ==IdCR) && cv->TelFlag && ! cv->TelBinSend) {
1133 TempStr[TempLen++] = 0;
1134 }
1135 else if (cv->CRSend == IdLF) {
1136 TempStr[TempLen-1] = 0x0a;
1137 }
1138 retval = TRUE;
1139 }
1140 else if (d==0x15/*ctrl-u*/ && cv->TelLineMode) {
1141 // Move to top of line (CHA "\033[G") and erase line (EL "\033[K")
1142 memcpy(TempStr, "\033[G\033[K", 6);
1143 TempLen += 6;
1144 retval = TRUE;
1145 }
1146 *StrLen = TempLen;
1147 return retval;
1148 }
1149
1150 /**
1151 * �o���p����������������
1152 *
1153 * @retval ��������������
1154 */
1155 typedef struct {
1156 int KanjiCode; // [in]�o�������R�[�h(sjis,jis����)
1157 BOOL (*ControlOut)(PComVar cv, unsigned int u32, BOOL check_only, char *TempStr, size_t *StrLen);
1158 // state�����������K�v�����������R�[�h���g�p
1159 BOOL JIS7Katakana; // [in](Kanji JIS)kana
1160 int SendCode; // [in,out](Kanji JIS)���O�����M�R�[�h Ascii/Kana/Kanji
1161 BOOL KanjiFlag; // [in,out](MBCS)���O��1byte��������������?(2byte������������?)
1162 BYTE KanjiFirst; // [in,out](MBCS)���O��1byte
1163 } OutputCharState;
1164
1165 /**
1166 * unicode(UTF-16)����unicode(UTF-32)��1���������o����
1167 * �o���f�[�^(TempStr)����������
1168 */
1169 static size_t MakeOutputString(PComVar cv, OutputCharState *states,
1170 const wchar_t *B, int C,
1171 char *TempStr, int *TempLen_)
1172 {
1173 BOOL (*ControlOut)(PComVar cv, unsigned int u32, BOOL check_only, char *TempStr, size_t *StrLen)
1174 = states->ControlOut;
1175 //
1176 int TempLen = 0;
1177 size_t TempLen2;
1178 size_t output_char_count; // ��������������
1179
1180 // UTF-32 ��1���������o��
1181 unsigned int u32;
1182 size_t u16_len = UTF16ToUTF32(B, C, &u32);
1183 if (u16_len == 0) {
1184 // �f�R�[�h��������? ����������������?
1185 assert(FALSE);
1186 u32 = '?';
1187 u16_len = 1;
1188 }
1189 output_char_count = u16_len;
1190
1191 // �e���V�t�g����������������
1192 if (u32 < 0x100 || ControlOut(cv, u32, TRUE, NULL, NULL)) {
1193 if (cv->Language == IdJapanese && states->KanjiCode == IdJIS) {
1194 // �����������A���{��,JIS��������
1195 if (cv->SendCode == IdKanji) {
1196 // �����������������A����OUT
1197 TempStr[TempLen++] = 0x1B;
1198 TempStr[TempLen++] = '(';
1199 switch (cv->KanjiOut) {
1200 case IdKanjiOutJ:
1201 TempStr[TempLen++] = 'J';
1202 break;
1203 case IdKanjiOutH:
1204 TempStr[TempLen++] = 'H';
1205 break;
1206 default:
1207 TempStr[TempLen++] = 'B';
1208 }
1209 }
1210
1211 if (states->JIS7Katakana == 1) {
1212 if (cv->SendCode == IdKatakana) {
1213 TempStr[TempLen++] = SO;
1214 }
1215 }
1216
1217 states->SendCode = IdASCII;
1218 }
1219 }
1220
1221 // 1������������
1222 if (ControlOut(cv, u32, FALSE, TempStr, &TempLen2)) {
1223 // ��������������������
1224 TempLen += TempLen2;
1225 output_char_count = 1;
1226 } else if (cv->Language == IdUtf8 ||
1227 (cv->Language == IdJapanese && states->KanjiCode == IdUTF8) ||
1228 (cv->Language == IdKorean && states->KanjiCode == IdUTF8) ||
1229 (cv->Language == IdChinese && states->KanjiCode == IdUTF8))
1230 {
1231 // UTF-8 ���o��
1232 size_t utf8_len = sizeof(TempStr);
1233 utf8_len = UTF32ToUTF8(u32, TempStr, utf8_len);
1234 TempLen += utf8_len;
1235 } else if (cv->Language == IdJapanese) {
1236 // ���{��
1237 // ���� CP932(SJIS) ���������������o��
1238 char mb_char[2];
1239 size_t mb_len = sizeof(mb_char);
1240 mb_len = UTF32ToMBCP(u32, 932, mb_char, mb_len);
1241 if (mb_len == 0) {
1242 // SJIS��������������
1243 TempStr[TempLen++] = '?';
1244 } else {
1245 switch (states->KanjiCode) {
1246 case IdEUC:
1247 // TODO ���p�J�i
1248 if (mb_len == 1) {
1249 TempStr[TempLen++] = mb_char[0];
1250 } else {
1251 WORD K;
1252 K = (((WORD)(unsigned char)mb_char[0]) << 8) +
1253 (WORD)(unsigned char)mb_char[1];
1254 K = SJIS2EUC(K);
1255 TempStr[TempLen++] = HIBYTE(K);
1256 TempStr[TempLen++] = LOBYTE(K);
1257 }
1258 break;
1259 case IdJIS:
1260 if (u32 < 0x100) {
1261 // ASCII
1262 TempStr[TempLen++] = mb_char[0];
1263 states->SendCode = IdASCII;
1264 } else if (IsHalfWidthKatakana(u32)) {
1265 // ���p�J�^�J�i
1266 if (states->JIS7Katakana==1) {
1267 if (cv->SendCode != IdKatakana) {
1268 TempStr[TempLen++] = SI;
1269 }
1270 TempStr[TempLen++] = mb_char[0] & 0x7f;
1271 } else {
1272 TempStr[TempLen++] = mb_char[0];
1273 }
1274 states->SendCode = IdKatakana;
1275 } else {
1276 // ����
1277 WORD K;
1278 K = (((WORD)(unsigned char)mb_char[0]) << 8) +
1279 (WORD)(unsigned char)mb_char[1];
1280 K = SJIS2JIS(K);
1281 if (states->SendCode != IdKanji) {
1282 // ����IN
1283 TempStr[TempLen++] = 0x1B;
1284 TempStr[TempLen++] = '$';
1285 if (cv->KanjiIn == IdKanjiInB) {
1286 TempStr[TempLen++] = 'B';
1287 }
1288 else {
1289 TempStr[TempLen++] = '@';
1290 }
1291 states->SendCode = IdKanji;
1292 }
1293 TempStr[TempLen++] = HIBYTE(K);
1294 TempStr[TempLen++] = LOBYTE(K);
1295 }
1296 break;
1297 case IdSJIS:
1298 if (mb_len == 1) {
1299 TempStr[TempLen++] = mb_char[0];
1300 } else {
1301 TempStr[TempLen++] = mb_char[0];
1302 TempStr[TempLen++] = mb_char[1];
1303 }
1304 break;
1305 default:
1306 assert(FALSE);
1307 break;
1308 }
1309 }
1310 } else if (cv->Language == IdRussian) {
1311 /* ����CP1251�����������o�� */
1312 char mb_char[2];
1313 size_t mb_len = sizeof(mb_char);
1314 BYTE b;
1315 mb_len = UTF32ToMBCP(u32, 1251, mb_char, mb_len);
1316 if (mb_len != 1) {
1317 b = '?';
1318 } else {
1319 b = RussConv(IdWindows, states->KanjiCode, mb_char[0]);
1320 }
1321 TempStr[TempLen++] = b;
1322 } else if (cv->Language == IdKorean || cv->Language == IdChinese) {
1323 int code_page;
1324 char mb_char[2];
1325 size_t mb_len;
1326 if (cv->Language == IdKorean) {
1327 code_page = 51949;
1328 } else if (cv->Language == IdChinese) {
1329 switch (states->KanjiCode) {
1330 case IdCnGB2312:
1331 code_page = 936;
1332 break;
1333 case IdCnBig5:
1334 code_page = 950;
1335 break;
1336 default:
1337 assert(FALSE);
1338 code_page = 936;
1339 break;
1340 }
1341 }
1342 /* code_page �����������o�� */
1343 mb_len = sizeof(mb_char);
1344 mb_len = UTF32ToMBCP(u32, code_page, mb_char, mb_len);
1345 if (mb_len == 0) {
1346 TempStr[TempLen++] = '?';
1347 }
1348 else if (mb_len == 1) {
1349 TempStr[TempLen++] = mb_char[0];
1350 } else {
1351 TempStr[TempLen++] = mb_char[0];
1352 TempStr[TempLen++] = mb_char[1];
1353 }
1354 } else if (cv->Language == IdEnglish) {
1355 char byte;
1356 int part = KanjiCodeToISO8859Part(states->KanjiCode);
1357 int r = UnicodeToISO8859(part, u32, &byte);
1358 TempStr[TempLen++] = byte;
1359 } else {
1360 assert(FALSE);
1361 }
1362
1363 *TempLen_ = TempLen;
1364 return output_char_count;
1365 }
1366
1367
1368 /**
1369 * CommTextOut() �� wchar_t ��
1370 *
1371 * @retval �o��������(wchar_t�P��)
1372 */
1373 int WINAPI CommTextOutW(PComVar cv, const wchar_t *B, int C)
1374 {
1375 char TempStr[12];
1376 BOOL Full = FALSE;
1377 int i = 0;
1378 while (! Full && (i < C)) {
1379 // �o���p�f�[�^������
1380 int TempLen = 0;
1381 size_t output_char_count; // ��������������
1382 OutputCharState state;
1383 state.KanjiCode = cv->KanjiCodeSend;
1384 state.ControlOut = OutControl;
1385 state.SendCode = cv->SendCode;
1386 state.JIS7Katakana = cv->JIS7KatakanaSend;
1387 output_char_count = MakeOutputString(cv, &state, &B[i], C-i, TempStr, &TempLen);
1388
1389 // �f�[�^���o���o�b�t�@��
1390 if (WriteOutBuff(cv, TempStr, TempLen)) {
1391 i += output_char_count; // output_char_count ������ ��������
1392 // ��������������������
1393 cv->SendCode = state.SendCode;
1394 } else {
1395 Full = TRUE;
1396 }
1397 } // end of "while {}"
1398 _CrtCheckMemory();
1399 return i;
1400 }
1401
1402 /**
1403 * CommTextEcho() �� wchar_t ��
1404 *
1405 * @retval �o��������(wchar_t�P��)
1406 */
1407 int WINAPI CommTextEchoW(PComVar cv, const wchar_t *B, int C)
1408 {
1409 char TempStr[12];
1410 BOOL Full = FALSE;
1411 int i = 0;
1412 while (! Full && (i < C)) {
1413 // �o���p�f�[�^������
1414 int TempLen = 0;
1415 size_t output_char_count; // ��������������
1416 OutputCharState state;
1417 state.KanjiCode = cv->KanjiCodeEcho;
1418 state.ControlOut = ControlEcho;
1419 state.SendCode = cv->EchoCode;
1420 state.JIS7Katakana = cv->JIS7KatakanaEcho;
1421 output_char_count = MakeOutputString(cv, &state, &B[i], C-i, TempStr, &TempLen);
1422
1423 // �f�[�^���o���o�b�t�@��
1424 if (WriteInBuff(cv, TempStr, TempLen)) {
1425 i += output_char_count; // output_char_count ������ ��������
1426 // ��������������������
1427 cv->EchoCode = state.SendCode;
1428 } else {
1429 Full = TRUE;
1430 }
1431 } // end of "while {}"
1432 _CrtCheckMemory();
1433 return i;
1434 }
1435
1436 int WINAPI CommBinaryEcho(PComVar cv, PCHAR B, int C)
1437 {
1438 int a, i, Len;
1439 char d[3];
1440
1441 if ( ! cv->Ready )
1442 return C;
1443
1444 PackInBuff(cv);
1445
1446 i = 0;
1447 a = 1;
1448 while ((a>0) && (i<C)) {
1449 Len = 0;
1450
1451 d[Len] = B[i];
1452 Len++;
1453
1454 if ( cv->TelFlag && (B[i]=='\x0d') &&
1455 ! cv->TelBinSend ) {
1456 d[Len] = 0x00;
1457 Len++;
1458 }
1459
1460 if ( cv->TelFlag && (B[i]=='\xff') ) {
1461 d[Len] = '\xff';
1462 Len++;
1463 }
1464
1465 if (WriteInBuff(cv, d, Len)) {
1466 a = 1;
1467 i++;
1468 } else {
1469 a = 0;
1470 }
1471 }
1472 return i;
1473 }
1474
1475 /*
1476 * @return �G���[���L������ FALSE
1477 * @param[in] BOOL first_instance
1478 */
1479 static BOOL OpenSharedMemory(BOOL *first_instance_)
1480 {
1481 int i;
1482 HMap = NULL;
1483 pm = NULL;
1484 for (i = 0; i < 100; i++) {
1485 char tmp[32];
1486 HANDLE hMap;
1487 BOOL first_instance;
1488 TMap *map;
1489 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, i == 0 ? "%s" : "%s_%d", TT_FILEMAPNAME, i);
1490 hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,
1491 0, sizeof(TMap), tmp);
1492 if (hMap == NULL) {
1493 return FALSE;
1494 }
1495
1496 first_instance = (GetLastError() != ERROR_ALREADY_EXISTS);
1497
1498 map = (TMap *)MapViewOfFile(hMap,FILE_MAP_WRITE,0,0,0);
1499 if (map == NULL) {
1500 return FALSE;
1501 }
1502
1503 if (first_instance ||
1504 (map->size_tmap == sizeof(TMap) &&
1505 map->size_tttset == sizeof(TTTSet)))
1506 {
1507 map->size_tmap = sizeof(TMap);
1508 map->size_tttset = sizeof(TTTSet);
1509 HMap = hMap;
1510 pm = map;
1511 *first_instance_ = first_instance;
1512 return TRUE;
1513 }
1514
1515 // next try
1516 UnmapViewOfFile(map);
1517 CloseHandle(hMap);
1518 }
1519 return FALSE;
1520 }
1521
1522 BOOL WINAPI DllMain(HANDLE hInstance,
1523 ULONG ul_reason_for_call,
1524 LPVOID lpReserved)
1525 {
1526 switch( ul_reason_for_call ) {
1527 case DLL_THREAD_ATTACH:
1528 /* do thread initialization */
1529 break;
1530 case DLL_THREAD_DETACH:
1531 /* do thread cleanup */
1532 break;
1533 case DLL_PROCESS_ATTACH:
1534 /* do process initialization */
1535 #ifdef _DEBUG
1536 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
1537 #endif
1538 hInst = hInstance;
1539 if (OpenSharedMemory(&FirstInstance) == FALSE) {
1540 // dll���[�h���s�Ateraterm���N��������
1541 return FALSE;
1542 }
1543 WinCompatInit();
1544 break;
1545 case DLL_PROCESS_DETACH:
1546 /* do process cleanup */
1547 UnmapViewOfFile(pm);
1548 CloseHandle(HMap);
1549 break;
1550 }
1551 return TRUE;
1552 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26