Develop and Download Open Source Software

Browse Subversion Repository

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9805 - (hide 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 doda 6806 /*
2     * Copyright (C) 1994-1998 T. Teranishi
3 nmaya 9048 * (C) 2004- TeraTerm Project
4 doda 6806 * All rights reserved.
5     *
6 doda 6841 * Redistribution and use in source and binary forms, with or without
7     * modification, are permitted provided that the following conditions
8     * are met:
9 doda 6806 *
10 doda 6841 * 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 doda 6806 *
18 doda 6841 * 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 doda 6806 */
29 maya 3227
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 maya 5308 #include <htmlhelp.h>
37 doda 8445 #include <assert.h>
38     #include <crtdbg.h>
39 zmatsuo 9570 #include <time.h>
40 maya 3227
41 zmatsuo 7536 #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 yutakapon 4915 #include "tt_res.h"
49 zmatsuo 7412 #include "codeconv.h"
50 doda 8445 #include "compat_win.h"
51 zmatsuo 9568 #include "win32helper.h"
52 zmatsuo 9337 #include "asprintf.h"
53 zmatsuo 9570 #include "fileread.h"
54 zmatsuo 9598 #include "../teraterm/unicode.h"
55 maya 3227
56 zmatsuo 9547 #include "ttcmn_dup.h"
57    
58 zmatsuo 7536 #define DllExport __declspec(dllexport)
59     #include "ttcommon.h"
60    
61 zmatsuo 8828 /* 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 zmatsuo 9547 // Duplicate Teraterm data
79     HANDLE DuplicateDataHandle;
80     DWORD DuplicateDataSizeLow;
81 zmatsuo 8828 } TMap;
82     typedef TMap *PMap;
83 zmatsuo 7536
84 zmatsuo 7304 // 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 maya 3227 /* 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 zmatsuo 9292 #define VTCLASSNAME "VTWin32"
98     #define TEKCLASSNAME "TEKWin32"
99 maya 3227
100 yutakapon 5299 enum window_style {
101     WIN_CASCADE,
102     WIN_STACKED,
103     WIN_SIDEBYSIDE,
104     };
105    
106 zmatsuo 9547 static const char DupDataName[] = "dupdata";
107 yutakapon 5299
108 zmatsuo 7305 void WINAPI CopyShmemToTTSet(PTTSet ts)
109 maya 3227 {
110 zmatsuo 9547 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 maya 3227 }
118    
119 zmatsuo 7305 void WINAPI CopyTTSetToShmem(PTTSet ts)
120 maya 3227 {
121 zmatsuo 9547 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 maya 3227 }
139    
140 zmatsuo 9532 static void CopyFiles(const wchar_t *file_list[], const wchar_t *src_dir, const wchar_t *dest_dir)
141     {
142     for (;;) {
143 zmatsuo 9546 wchar_t *dest;
144     size_t len;
145 zmatsuo 9532 const wchar_t *filename = *file_list;
146     file_list++;
147     if (filename == NULL) {
148     break;
149     }
150    
151 zmatsuo 9546 dest = NULL;
152 zmatsuo 9532 awcscats(&dest, dest_dir, L"\\", filename, NULL);
153    
154 zmatsuo 9546 len = wcslen(dest);
155 zmatsuo 9532 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 zmatsuo 9570 static void ConvertIniFiles(const wchar_t *filelist[], const wchar_t *dir, const wchar_t *date_str)
170     {
171     while(1) {
172 zmatsuo 9598 wchar_t *fname;
173 zmatsuo 9570 if (*filelist == NULL) {
174     break;
175     }
176    
177 zmatsuo 9598 fname = NULL;
178 zmatsuo 9570 awcscats(&fname, dir, L"\\", *filelist, NULL);
179     ConvertIniFileCharCode(fname, date_str);
180     free(fname);
181     filelist++;
182     }
183     }
184    
185 zmatsuo 7305 BOOL WINAPI StartTeraTerm(PTTSet ts)
186 maya 3227 {
187     if (FirstInstance) {
188     // init window list
189     pm->NWin = 0;
190     }
191     else {
192     /* only the first instance uses saved position */
193 zmatsuo 9547 ts->VTPos.x = CW_USEDEFAULT;
194     ts->VTPos.y = CW_USEDEFAULT;
195     ts->TEKPos.x = CW_USEDEFAULT;
196     ts->TEKPos.y = CW_USEDEFAULT;
197 maya 3227 }
198    
199     // if (FirstInstance) { �������������� (2008.3.13 maya)
200     // �N���������A���L�������� HomeDir �� SetupFName ����������
201 zmatsuo 9306 /* Get home directory (ttermpro.exe���t�H���_) */
202 zmatsuo 9501 ts->ExeDirW = GetExeDirW(hInst);
203    
204     // LogDir
205 zmatsuo 9727 ts->LogDirW = GetLogDirW(hInst);
206 zmatsuo 9501
207     // HomeDir
208 zmatsuo 9306 ts->HomeDirW = GetHomeDirW(hInst);
209     WideCharToACP_t(ts->HomeDirW, ts->HomeDir, _countof(ts->HomeDir));
210 zmatsuo 9501 SetCurrentDirectoryW(ts->HomeDirW); // TODO �K�v??
211 maya 3227
212 zmatsuo 9532 // 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 zmatsuo 9501
217 zmatsuo 9532 // 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 zmatsuo 9501
222 zmatsuo 9805 // �|�[�^�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 zmatsuo 9532 static const wchar_t *filelist[] = {
228     L"TERATERM.INI",
229     L"KEYBOARD.CNF",
230     L"cygterm.cfg",
231 zmatsuo 9805 L"ssh_known_hosts",
232 zmatsuo 9532 #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 zmatsuo 9501 #endif
245 zmatsuo 9532 NULL,
246     };
247     CopyFiles(filelist, ts->ExeDirW, ts->HomeDirW);
248 zmatsuo 9501 }
249 zmatsuo 9306
250 zmatsuo 9570 // 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 zmatsuo 9584 wchar_t *date_str = MakeISO8601Str(0);
260     awcscat(&date_str, L"_");
261 zmatsuo 9570
262     // ini�t�@�C������������
263 zmatsuo 9584 ConvertIniFiles(filelist, ts->HomeDirW, date_str);
264    
265     free(date_str);
266 zmatsuo 9570 }
267    
268 maya 3227 if (FirstInstance) {
269     FirstInstance = FALSE;
270     return TRUE;
271     }
272 maya 3392 else {
273 maya 3227 return FALSE;
274 maya 3392 }
275 maya 3227 }
276    
277 yutakapon 4915 // �����t�@�C�����f�B�X�N���������ATera Term�{�������N�������B
278     // (2012.4.30 yutaka)
279 zmatsuo 9568 // �g����������?
280 zmatsuo 7305 void WINAPI RestartTeraTerm(HWND hwnd, PTTSet ts)
281 yutakapon 4915 {
282 zmatsuo 9568 wchar_t *path;
283 yutakapon 4916 int ret;
284 yutakapon 4915
285 zmatsuo 8616 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 zmatsuo 9342 L"Are you sure that you want to relaunch Tera Term?",
291     MB_YESNO | MB_ICONEXCLAMATION | MB_DEFBUTTON2
292 zmatsuo 8616 };
293 zmatsuo 9342 ret = TTMessageBoxA(hwnd, &info, ts->UILanguageFile);
294 doda 6435 if (ret != IDYES)
295 yutakapon 4916 return;
296    
297 yutakapon 4915 SendMessage(hwnd, WM_COMMAND, ID_SETUP_SAVE, 0);
298 yutakapon 4919 // 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 yutakapon 4915
302 yutakapon 4919 // ���v���Z�X�����N���B
303 zmatsuo 9568 if (hGetModuleFileNameW(NULL, &path) == 0) {
304     TTWinExec(path);
305     free(path);
306 yutakapon 4915 }
307     }
308    
309 zmatsuo 7305 void WINAPI SetCOMFlag(int Com)
310 maya 3227 {
311     pm->ComFlag[(Com-1)/CHAR_BIT] |= 1 << ((Com-1)%CHAR_BIT);
312     }
313    
314 zmatsuo 7305 void WINAPI ClearCOMFlag(int Com)
315 maya 3227 {
316     pm->ComFlag[(Com-1)/CHAR_BIT] &= ~(1 << ((Com-1)%CHAR_BIT));
317     }
318    
319 zmatsuo 7305 int WINAPI CheckCOMFlag(int Com)
320 maya 3227 {
321     return ((pm->ComFlag[(Com-1)/CHAR_BIT] & 1 << (Com-1)%CHAR_BIT) > 0);
322     }
323    
324 zmatsuo 7305 int WINAPI RegWin(HWND HWinVT, HWND HWinTEK)
325 maya 3227 {
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 yutakapon 5223 memset(&pm->WinPrevRect[pm->NWin - 1], 0, sizeof(pm->WinPrevRect[pm->NWin - 1])); // RECT clear
346 maya 3392 if (pm->NWin==1) {
347 maya 3227 return 1;
348 maya 3392 }
349     else {
350 maya 3227 return (int)(SendMessage(pm->WinList[pm->NWin-2],
351 maya 3392 WM_USER_GETSERIALNO,0,0)+1);
352     }
353 maya 3227 }
354    
355 zmatsuo 7305 void WINAPI UnregWin(HWND HWin)
356 maya 3227 {
357     int i, j;
358    
359     i = 0;
360 maya 3392 while ((i<pm->NWin) && (pm->WinList[i]!=HWin)) {
361 maya 3227 i++;
362 maya 3392 }
363     if (pm->WinList[i]!=HWin) {
364 maya 3227 return;
365 maya 3392 }
366     for (j=i ; j<pm->NWin-1 ; j++) {
367 maya 3227 pm->WinList[j] = pm->WinList[j+1];
368 yutakapon 5223 pm->WinPrevRect[j] = pm->WinPrevRect[j+1]; // RECT shift
369 maya 3392 }
370     if (pm->NWin>0) {
371 maya 3227 pm->NWin--;
372 maya 3392 }
373 maya 3227 }
374    
375 doda 6435 char GetWindowTypeChar(HWND Hw, HWND HWin)
376 doda 4073 {
377 doda 4076 #if 0
378 doda 4073 if (HWin == Hw)
379     return '*';
380     else if (!IsWindowVisible(Hw))
381 doda 4076 #else
382     if (!IsWindowVisible(Hw))
383     #endif
384 doda 4073 return '#';
385     else if (IsIconic(Hw))
386     return '-';
387     else if (IsZoomed(Hw))
388     return '@';
389     else
390     return '+';
391     }
392    
393 zmatsuo 7305 void WINAPI SetWinMenu(HMENU menu, PCHAR buf, int buflen, PCHAR langFile, int VTFlag)
394 maya 3227 {
395     int i;
396     char Temp[MAXPATHLEN];
397     HWND Hw;
398 zmatsuo 8496 wchar_t uimsg[MAX_UIMSG];
399 maya 3227
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 doda 4073 Temp[3] = GetWindowTypeChar(Hw, NULL);
418     Temp[4] = ' ';
419     GetWindowText(Hw,&Temp[5],sizeof(Temp)-6);
420 maya 3227 AppendMenu(menu,MF_ENABLED | MF_STRING,ID_WINDOW_1+i,Temp);
421     i++;
422 maya 3392 if (i>8) {
423 maya 3227 i = pm->NWin;
424 maya 3392 }
425 maya 3227 }
426 maya 3392 else {
427 maya 3227 UnregWin(Hw);
428 maya 3392 }
429 maya 3227 }
430     if (VTFlag == 1) {
431 zmatsuo 8496 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 maya 4655 AppendMenu(menu, MF_SEPARATOR, 0, NULL);
441 zmatsuo 8496 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 doda 4647
448 zmatsuo 8496 SetI18nMenuStrs("Tera Term", menu, MenuTextInfo, _countof(MenuTextInfo), langFile);
449 doda 4647
450 yutakapon 5299 if (pm->WinUndoFlag) {
451     if (pm->WinUndoStyle == WIN_CASCADE)
452 zmatsuo 8496 get_lang_msgW("MENU_WINDOW_CASCADE_UNDO", uimsg, _countof(uimsg), L"&Undo - Cascade", langFile);
453 yutakapon 5299 else if (pm->WinUndoStyle == WIN_STACKED)
454 zmatsuo 8496 get_lang_msgW("MENU_WINDOW_STACKED_UNDO", uimsg, _countof(uimsg), L"&Undo - Stacked", langFile);
455 yutakapon 5299 else
456 zmatsuo 8496 get_lang_msgW("MENU_WINDOW_SIDEBYSIDE_UNDO", uimsg, _countof(uimsg), L"&Undo - Side by Side", langFile);
457 zmatsuo 9324 AppendMenuW(menu, MF_ENABLED | MF_STRING, ID_WINDOW_UNDO, uimsg); // TODO UNICODE
458 yutakapon 5299 }
459    
460 maya 3227 }
461     else {
462 zmatsuo 8496 get_lang_msgW("MENU_WINDOW_WINDOW", uimsg, _countof(uimsg), L"&Window", langFile);
463 zmatsuo 9324 AppendMenuW(menu,MF_ENABLED | MF_STRING,ID_TEKWINDOW_WINDOW, uimsg);
464 maya 3227 }
465     }
466    
467 zmatsuo 7305 void WINAPI SetWinList(HWND HWin, HWND HDlg, int IList)
468 maya 3227 {
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 doda 4073 Temp[0] = GetWindowTypeChar(Hw, HWin);
479     Temp[1] = ' ';
480     GetWindowText(Hw,&Temp[2],sizeof(Temp)-3);
481 maya 3227 SendDlgItemMessage(HDlg, IList, LB_ADDSTRING,
482 zmatsuo 7896 0, (LPARAM)Temp);
483 maya 3392 if (Hw==HWin) {
484     SendDlgItemMessage(HDlg, IList, LB_SETCURSEL, i,0);
485     }
486 maya 3227 }
487 maya 3392 else {
488 maya 3227 UnregWin(Hw);
489 maya 3392 }
490 maya 3227 }
491     }
492    
493 zmatsuo 7305 void WINAPI SelectWin(int WinId)
494 maya 3227 {
495     if ((WinId>=0) && (WinId<pm->NWin)) {
496 yutakapon 3673 /* �E�B���h�E�����������������������������������A���������������������������A
497     * SW_SHOWNORMAL ���� SW_SHOW �����X�����B
498     * (2009.11.8 yutaka)
499 maya 3675 * �E�B���h�E�����������������������������T�C�Y������(SW_RESTORE)�����������B
500     * (2009.11.9 maya)
501 yutakapon 3673 */
502 maya 3675 if (IsIconic(pm->WinList[WinId])) {
503     ShowWindow(pm->WinList[WinId],SW_RESTORE);
504     }
505     else {
506     ShowWindow(pm->WinList[WinId],SW_SHOW);
507     }
508 maya 3227 SetForegroundWindow(pm->WinList[WinId]);
509     }
510     }
511    
512 zmatsuo 7305 void WINAPI SelectNextWin(HWND HWin, int Next, BOOL SkipIconic)
513 maya 3227 {
514     int i;
515    
516     i = 0;
517 doda 3950 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 doda 4030 break;
535 doda 3950 }
536 doda 4030 } while ((SkipIconic && IsIconic(pm->WinList[i])) || !IsWindowVisible(pm->WinList[i]));
537 doda 3950
538     SelectWin(i);
539     }
540    
541 zmatsuo 7305 void WINAPI ShowAllWin(int stat) {
542 doda 4647 int i;
543 doda 5280
544     for (i=0; i < pm->NWin; i++) {
545     ShowWindow(pm->WinList[i], stat);
546     }
547     }
548    
549 zmatsuo 7305 void WINAPI UndoAllWin(void) {
550 doda 5280 int i;
551 yutakapon 5223 WINDOWPLACEMENT rc0;
552     RECT rc;
553 yutakapon 5299 int stat = SW_RESTORE;
554 yutakapon 5407 int multi_mon = 0;
555 doda 4647
556 yutakapon 6286 if (HasMultiMonitorSupport()) {
557 yutakapon 5407 multi_mon = 1;
558     }
559    
560 yutakapon 5299 // ���x�A�����������t���O���������B
561     pm->WinUndoFlag = FALSE;
562    
563 yutakapon 5223 memset(&rc0, 0, sizeof(rc0));
564    
565 doda 4647 for (i=0; i < pm->NWin; i++) {
566 yutakapon 5223 // �����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 yutakapon 5407 // NT4.0, 95 ���}���`���j�^API��������
571     if (multi_mon) {
572     // �������j�^������������
573 zmatsuo 8517 HMONITOR hMonitor;
574     MONITORINFO mi;
575     hMonitor = pMonitorFromRect(&rc, MONITOR_DEFAULTTONEAREST);
576 yutakapon 5407 mi.cbSize = sizeof(MONITORINFO);
577 zmatsuo 8517 pGetMonitorInfoA(hMonitor, &mi);
578 yutakapon 5223
579 yutakapon 5407 // ���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 yutakapon 5223 }
597    
598     // �E�B���h�E���u����
599     SetWindowPos(
600 doda 6435 pm->WinList[i], NULL,
601     rc.left,
602 yutakapon 5223 rc.top,
603 doda 6435 rc.right - rc.left,
604 yutakapon 5223 rc.bottom - rc.top,
605     SWP_NOZORDER);
606    
607 yutakapon 5230 // �E�B���h�E����������
608     ShowWindow(pm->WinList[i], pm->WinPrevRect[i].showCmd);
609 yutakapon 5223
610     } else {
611     ShowWindow(pm->WinList[i], stat);
612     }
613 doda 4647 }
614     }
615    
616 zmatsuo 7305 void WINAPI OpenHelp(UINT Command, DWORD Data, char *UILanguageFile)
617 maya 5308 {
618 zmatsuo 9337 wchar_t Temp[MAX_PATH];
619 maya 5308 HWND HWin;
620 zmatsuo 9337 wchar_t *HelpFN;
621 zmatsuo 8496 wchar_t uimsg[MAX_UIMSG];
622 zmatsuo 8516 wchar_t *HomeDirW;
623 maya 5308
624 zmatsuo 9337 /* Get home directory TODO ts.HomeDirW ���������� */
625     if (GetModuleFileNameW(NULL,Temp,_countof(Temp)) == 0) {
626 maya 5308 return;
627     }
628 zmatsuo 9337 HomeDirW = ExtractDirNameW(Temp);
629 zmatsuo 8496 get_lang_msgW("HELPFILE", uimsg, _countof(uimsg), L"teraterm.chm", UILanguageFile);
630 zmatsuo 9337 aswprintf(&HelpFN, L"%s\\%s", HomeDirW, uimsg);
631 zmatsuo 8516 free(HomeDirW);
632 maya 5308
633     // �w���v���I�[�i�[�������f�X�N�g�b�v������ (2007.5.12 maya)
634     HWin = GetDesktopWindow();
635 zmatsuo 8576 if (_HtmlHelpW(HWin, HelpFN, Command, Data) == NULL) {
636 zmatsuo 8516 // �w���v���J����������
637 zmatsuo 8616 static const TTMessageBoxInfoW info = {
638     "Tera Term",
639     NULL, L"Tera Term: HTML help",
640 zmatsuo 9342 "MSG_OPENHELP_ERROR", L"Can't open HTML help file(%s).",
641     MB_OK | MB_ICONERROR };
642     TTMessageBoxA(HWin, &info, UILanguageFile, HelpFN);
643 zmatsuo 8496 }
644 zmatsuo 9337 free(HelpFN);
645 maya 5308 }
646    
647 zmatsuo 7305 HWND WINAPI GetNthWin(int n)
648 maya 3227 {
649 maya 3392 if (n<pm->NWin) {
650 maya 3227 return pm->WinList[n];
651 maya 3392 }
652     else {
653 maya 3227 return NULL;
654 maya 3392 }
655 maya 3227 }
656    
657 zmatsuo 7725 int WINAPI GetRegisteredWindowCount(void)
658 doda 6888 {
659     return (pm->NWin);
660     }
661 yutakapon 5222
662 yutakapon 5223 // �L�����E�B���h�E���T���A�������u���L�������������B
663 yutakapon 5299 static void get_valid_window_and_memorize_rect(HWND myhwnd, HWND hwnd[], int *num, int style)
664 yutakapon 5222 {
665 yutakapon 5223 int i, n;
666     WINDOWPLACEMENT wndPlace;
667 yutakapon 5222
668 yutakapon 5299 // ��������(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 yutakapon 5222 n = 0;
682     for (i = 0 ; i < pm->NWin ; i++) {
683 yutakapon 5223 // �������u���o���������B
684     wndPlace.length = sizeof(WINDOWPLACEMENT);
685     GetWindowPlacement(pm->WinList[i], &wndPlace);
686     pm->WinPrevRect[i] = wndPlace;
687    
688     // �������g�������������B
689 yutakapon 5222 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 yutakapon 5223 *num = n;
698     }
699 yutakapon 5222
700 yutakapon 5223 // �E�B���h�E�����E���������\������(Show Windows Side by Side)
701 zmatsuo 7305 void WINAPI ShowAllWinSidebySide(HWND myhwnd)
702 yutakapon 5223 {
703     int n;
704     HWND hwnd[MAXNWIN];
705    
706 yutakapon 5299 get_valid_window_and_memorize_rect(myhwnd, hwnd, &n, WIN_SIDEBYSIDE);
707 yutakapon 5251 TileWindows(NULL, MDITILE_VERTICAL, NULL, n, hwnd);
708 yutakapon 5222 }
709    
710     // �E�B���h�E���������������\������(Show Windows Stacked)
711 zmatsuo 7305 void WINAPI ShowAllWinStacked(HWND myhwnd)
712 yutakapon 5222 {
713 yutakapon 5223 int n;
714 yutakapon 5222 HWND hwnd[MAXNWIN];
715    
716 yutakapon 5299 get_valid_window_and_memorize_rect(myhwnd, hwnd, &n, WIN_STACKED);
717 yutakapon 5251 TileWindows(NULL, MDITILE_HORIZONTAL, NULL, n, hwnd);
718 yutakapon 5222 }
719    
720     // �E�B���h�E���d�����\������(Cascade)
721 zmatsuo 7305 void WINAPI ShowAllWinCascade(HWND myhwnd)
722 yutakapon 5222 {
723 yutakapon 5223 int n;
724     HWND hwnd[MAXNWIN];
725    
726 yutakapon 5299 get_valid_window_and_memorize_rect(myhwnd, hwnd, &n, WIN_CASCADE);
727 yutakapon 5251 CascadeWindows(NULL, MDITILE_SKIPDISABLED, NULL, n, hwnd);
728 yutakapon 5222 }
729    
730 yutakapon 5232 // �STera Term���I���w�����o���B
731 zmatsuo 7305 void WINAPI BroadcastClosingMessage(HWND myhwnd)
732 yutakapon 5232 {
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 doda 6435 if (hwnd[i] == myhwnd)
746 yutakapon 5232 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 zmatsuo 7305 int WINAPI CommReadRawByte(PComVar cv, LPBYTE b)
755 maya 3227 {
756 maya 3392 if ( ! cv->Ready ) {
757 maya 3227 return 0;
758 maya 3392 }
759 maya 3227
760     if ( cv->InBuffCount>0 ) {
761     *b = cv->InBuff[cv->InPtr];
762     cv->InPtr++;
763     cv->InBuffCount--;
764 maya 3392 if ( cv->InBuffCount==0 ) {
765 maya 3227 cv->InPtr = 0;
766 maya 3392 }
767 maya 3227 return 1;
768     }
769     else {
770     cv->InPtr = 0;
771     return 0;
772     }
773     }
774    
775 zmatsuo 8897 static void LogBinSkip(PComVar cv, int add)
776     {
777     if (cv->LogBinSkip != NULL) {
778     cv->LogBinSkip(add);
779     }
780     }
781    
782 zmatsuo 7305 void WINAPI CommInsert1Byte(PComVar cv, BYTE b)
783 maya 3227 {
784 maya 3392 if ( ! cv->Ready ) {
785 maya 3227 return;
786 maya 3392 }
787 maya 3227
788 maya 3392 if (cv->InPtr == 0) {
789 maya 3227 memmove(&(cv->InBuff[1]),&(cv->InBuff[0]),cv->InBuffCount);
790 maya 3392 }
791     else {
792 maya 3227 cv->InPtr--;
793 maya 3392 }
794 maya 3227 cv->InBuff[cv->InPtr] = b;
795     cv->InBuffCount++;
796    
797 zmatsuo 8897 LogBinSkip(cv, 1);
798 maya 3227 }
799    
800 zmatsuo 8897 static void Log1Bin(PComVar cv, BYTE b)
801 maya 3227 {
802 zmatsuo 8897 if (cv->Log1Bin != NULL) {
803     cv->Log1Bin(b);
804 maya 3392 }
805 maya 3227 }
806    
807 zmatsuo 7305 int WINAPI CommRead1Byte(PComVar cv, LPBYTE b)
808 maya 3227 {
809     int c;
810    
811 maya 3392 if ( ! cv->Ready ) {
812 maya 3227 return 0;
813 maya 3392 }
814 maya 3227
815 maya 3392 if ( cv->TelMode ) {
816 maya 3227 c = 0;
817 maya 3392 }
818     else {
819 maya 3227 c = CommReadRawByte(cv,b);
820 maya 3392 }
821 maya 3227
822     if ((c==1) && cv->TelCRFlag) {
823     cv->TelCRFlag = FALSE;
824 maya 3392 if (*b==0) {
825     c = 0;
826     }
827 maya 3227 }
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 zmatsuo 8897 LogBinSkip(cv, -1);
836 maya 3227 c = 0;
837     }
838     }
839     else if ((cv->PortType==IdTCPIP) && (*b==0xFF)) {
840 maya 3392 if (!cv->TelFlag && cv->TelAutoDetect) { /* TTPLUG */
841 maya 3227 cv->TelFlag = TRUE;
842 maya 3392 }
843 maya 3227 if (cv->TelFlag) {
844     cv->IACFlag = TRUE;
845     c = 0;
846     }
847     }
848 maya 3392 else if (cv->TelFlag && ! cv->TelBinRecv && (*b==0x0D)) {
849 maya 3227 cv->TelCRFlag = TRUE;
850 maya 3392 }
851 maya 3227 }
852    
853 zmatsuo 8897 if (c == 1) {
854 maya 3227 Log1Bin(cv, *b);
855 maya 3392 }
856 maya 3227
857     return c;
858     }
859    
860 doda 8445 int WINAPI CommRawOut(PComVar cv, /*const*/ PCHAR B, int C)
861 maya 3227 {
862     int a;
863    
864 maya 3392 if ( ! cv->Ready ) {
865 maya 3227 return C;
866 maya 3392 }
867 maya 3227
868 maya 3392 if (C > OutBuffSize - cv->OutBuffCount) {
869 maya 3227 a = OutBuffSize - cv->OutBuffCount;
870 maya 3392 }
871     else {
872 maya 3227 a = C;
873 maya 3392 }
874 maya 3227 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 zmatsuo 7305 int WINAPI CommBinaryOut(PComVar cv, PCHAR B, int C)
884 maya 3227 {
885     int a, i, Len;
886     char d[3];
887    
888 maya 3392 if ( ! cv->Ready ) {
889 maya 3227 return C;
890 maya 3392 }
891 maya 3227
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 doda 3505 if ( cv->TelFlag && (B[i]=='\x0d') && ! cv->TelBinSend ) {
901     d[Len++] = '\x00';
902 maya 3227 }
903 doda 3505 else if ( cv->TelFlag && (B[i]=='\xff') ) {
904     d[Len++] = '\xff';
905     }
906 maya 3227
907 doda 3505 if ( OutBuffSize - cv->OutBuffCount - Len >= 0 ) {
908     CommRawOut(cv, d, Len);
909 maya 3227 a = 1;
910     }
911 maya 3392 else {
912 maya 3227 a = 0;
913 maya 3392 }
914 maya 3227
915 doda 3505 i += a;
916 maya 3227 }
917     return i;
918     }
919    
920 doda 8445 /**
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 zmatsuo 7305 int WINAPI CommBinaryBuffOut(PComVar cv, PCHAR B, int C)
1003 doda 3505 {
1004 doda 8445 int a, i, Len;
1005 doda 3505 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 doda 8445 if (WriteOutBuff(cv, d, Len)) {
1032     a = 1;
1033     i++;
1034     } else {
1035     a = 0;
1036 doda 3505 }
1037     }
1038     return i;
1039     }
1040    
1041 doda 8445 /**
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 doda 3494 if (cv->TelLineMode) {
1087 doda 8445 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 doda 3494 }
1209     }
1210 doda 8445
1211     if (states->JIS7Katakana == 1) {
1212     if (cv->SendCode == IdKatakana) {
1213     TempStr[TempLen++] = SO;
1214     }
1215 doda 3494 }
1216 doda 8445
1217     states->SendCode = IdASCII;
1218 maya 3227 }
1219 doda 8445 }
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 zmatsuo 9499 (cv->Language == IdKorean && states->KanjiCode == IdUTF8) ||
1229     (cv->Language == IdChinese && states->KanjiCode == IdUTF8))
1230 doda 8445 {
1231     // UTF-8 ���o��
1232     size_t utf8_len = sizeof(TempStr);
1233     utf8_len = UTF32ToUTF8(u32, TempStr, utf8_len);
1234     TempLen += utf8_len;
1235 zmatsuo 9314 } else if (cv->Language == IdJapanese) {
1236 doda 8445 // ���{��
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 doda 3494 }
1309     }
1310 doda 8445 } 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 zmatsuo 9497 b = RussConv(IdWindows, states->KanjiCode, mb_char[0]);
1320 doda 8445 }
1321     TempStr[TempLen++] = b;
1322 zmatsuo 9314 } else if (cv->Language == IdKorean || cv->Language == IdChinese) {
1323     int code_page;
1324 doda 8445 char mb_char[2];
1325 zmatsuo 9314 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 zmatsuo 9463 code_page = 936;
1339 zmatsuo 9314 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 doda 8445 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 zmatsuo 9598 char byte;
1356     int part = KanjiCodeToISO8859Part(states->KanjiCode);
1357     int r = UnicodeToISO8859(part, u32, &byte);
1358     TempStr[TempLen++] = byte;
1359 doda 8445 } else {
1360 zmatsuo 9314 assert(FALSE);
1361 doda 8445 }
1362 maya 3227
1363 doda 8445 *TempLen_ = TempLen;
1364     return output_char_count;
1365 maya 3227 }
1366    
1367 doda 8445
1368     /**
1369     * CommTextOut() �� wchar_t ��
1370     *
1371     * @retval �o��������(wchar_t�P��)
1372     */
1373 zmatsuo 7484 int WINAPI CommTextOutW(PComVar cv, const wchar_t *B, int C)
1374     {
1375 doda 8445 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 zmatsuo 7484 }
1401    
1402 doda 8445 /**
1403     * CommTextEcho() �� wchar_t ��
1404     *
1405     * @retval �o��������(wchar_t�P��)
1406     */
1407 zmatsuo 7484 int WINAPI CommTextEchoW(PComVar cv, const wchar_t *B, int C)
1408     {
1409 doda 8445 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 zmatsuo 7484 }
1435    
1436 zmatsuo 7305 int WINAPI CommBinaryEcho(PComVar cv, PCHAR B, int C)
1437 maya 3227 {
1438     int a, i, Len;
1439     char d[3];
1440    
1441     if ( ! cv->Ready )
1442     return C;
1443    
1444 doda 8445 PackInBuff(cv);
1445 maya 3227
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 doda 8445 if (WriteInBuff(cv, d, Len)) {
1466 maya 3227 a = 1;
1467 doda 8445 i++;
1468     } else {
1469     a = 0;
1470 maya 3227 }
1471     }
1472     return i;
1473     }
1474    
1475 yutakapon 8188 /*
1476 zmatsuo 7304 * @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 zmatsuo 7306 TMap *map;
1489 zmatsuo 7304 _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 zmatsuo 7306 map = (TMap *)MapViewOfFile(hMap,FILE_MAP_WRITE,0,0,0);
1499 zmatsuo 7304 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 maya 3227 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 zmatsuo 9314 #ifdef _DEBUG
1536     _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
1537     #endif
1538 maya 3227 hInst = hInstance;
1539 zmatsuo 7304 if (OpenSharedMemory(&FirstInstance) == FALSE) {
1540     // dll���[�h���s�Ateraterm���N��������
1541 maya 3227 return FALSE;
1542 maya 3392 }
1543 doda 8445 WinCompatInit();
1544 maya 3227 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