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 9337 - (hide annotations) (download) (as text)
Sun Aug 1 05:36:29 2021 UTC (2 years, 8 months ago) by zmatsuo
File MIME type: text/x-csrc
File size: 34389 byte(s)
chmファイル名をUnicode化

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

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