Develop and Download Open Source Software

Browse Subversion Repository

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9314 - (show annotations) (download) (as text)
Sun Jun 20 01:07:54 2021 UTC (2 years, 9 months ago) by zmatsuo
File MIME type: text/x-csrc
File size: 34459 byte(s)
ComVar 構造体から CodePage メンバを削除

- Language, KanjiCode から文字コードを判定
1 /*
2 * Copyright (C) 1994-1998 T. Teranishi
3 * (C) 2004- TeraTerm Project
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30 /* TTCMN.DLL, main */
31 #include <direct.h>
32 #include <string.h>
33 #include <stdio.h>
34 #include <windows.h>
35 #include <setupapi.h>
36 #include <htmlhelp.h>
37 #include <assert.h>
38 #include <crtdbg.h>
39
40 #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 #include "tt_res.h"
48 #include "codeconv.h"
49 #include "compat_win.h"
50
51 #define DllExport __declspec(dllexport)
52 #include "ttcommon.h"
53 #include "layer_for_unicode.h"
54
55 /* 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
77 // 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 /* 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 #define VTCLASSNAME "VTWin32"
91 #define TEKCLASSNAME "TEKWin32"
92
93 enum window_style {
94 WIN_CASCADE,
95 WIN_STACKED,
96 WIN_SIDEBYSIDE,
97 };
98
99
100 void WINAPI CopyShmemToTTSet(PTTSet ts)
101 {
102 // ���������������L�����������R�s�[����
103 memcpy(ts, &pm->ts, sizeof(TTTSet));
104 }
105
106 void WINAPI CopyTTSetToShmem(PTTSet ts)
107 {
108 // ���������������L���������R�s�[����
109 memcpy(&pm->ts, ts, sizeof(TTTSet));
110 }
111
112 BOOL WINAPI StartTeraTerm(PTTSet ts)
113 {
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 /* 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
135 ts->SetupFNameW = GetDefaultSetupFNameW(ts->HomeDirW);
136 WideCharToACP_t(ts->SetupFNameW, ts->SetupFName, _countof(ts->SetupFName));
137
138 ts->KeyCnfFNW = GetDefaultFNameW(ts->HomeDirW, L"KEYBOARD.CNF");
139 WideCharToACP_t(ts->KeyCnfFNW, ts->KeyCnfFN, _countof(ts->KeyCnfFN));
140
141 if (FirstInstance) {
142 FirstInstance = FALSE;
143 return TRUE;
144 }
145 else {
146 return FALSE;
147 }
148 }
149
150 // �����t�@�C�����f�B�X�N���������ATera Term�{�������N�������B
151 // (2012.4.30 yutaka)
152 void WINAPI RestartTeraTerm(HWND hwnd, PTTSet ts)
153 {
154 char path[1024];
155 STARTUPINFO si;
156 PROCESS_INFORMATION pi;
157 int ret;
158
159 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 if (ret != IDYES)
168 return;
169
170 SendMessage(hwnd, WM_COMMAND, ID_SETUP_SAVE, 0);
171 // 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
175 // ���v���Z�X�����N���B
176 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 void WINAPI SetCOMFlag(int Com)
188 {
189 pm->ComFlag[(Com-1)/CHAR_BIT] |= 1 << ((Com-1)%CHAR_BIT);
190 }
191
192 void WINAPI ClearCOMFlag(int Com)
193 {
194 pm->ComFlag[(Com-1)/CHAR_BIT] &= ~(1 << ((Com-1)%CHAR_BIT));
195 }
196
197 int WINAPI CheckCOMFlag(int Com)
198 {
199 return ((pm->ComFlag[(Com-1)/CHAR_BIT] & 1 << (Com-1)%CHAR_BIT) > 0);
200 }
201
202 int WINAPI RegWin(HWND HWinVT, HWND HWinTEK)
203 {
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 memset(&pm->WinPrevRect[pm->NWin - 1], 0, sizeof(pm->WinPrevRect[pm->NWin - 1])); // RECT clear
224 if (pm->NWin==1) {
225 return 1;
226 }
227 else {
228 return (int)(SendMessage(pm->WinList[pm->NWin-2],
229 WM_USER_GETSERIALNO,0,0)+1);
230 }
231 }
232
233 void WINAPI UnregWin(HWND HWin)
234 {
235 int i, j;
236
237 i = 0;
238 while ((i<pm->NWin) && (pm->WinList[i]!=HWin)) {
239 i++;
240 }
241 if (pm->WinList[i]!=HWin) {
242 return;
243 }
244 for (j=i ; j<pm->NWin-1 ; j++) {
245 pm->WinList[j] = pm->WinList[j+1];
246 pm->WinPrevRect[j] = pm->WinPrevRect[j+1]; // RECT shift
247 }
248 if (pm->NWin>0) {
249 pm->NWin--;
250 }
251 }
252
253 char GetWindowTypeChar(HWND Hw, HWND HWin)
254 {
255 #if 0
256 if (HWin == Hw)
257 return '*';
258 else if (!IsWindowVisible(Hw))
259 #else
260 if (!IsWindowVisible(Hw))
261 #endif
262 return '#';
263 else if (IsIconic(Hw))
264 return '-';
265 else if (IsZoomed(Hw))
266 return '@';
267 else
268 return '+';
269 }
270
271 void WINAPI SetWinMenu(HMENU menu, PCHAR buf, int buflen, PCHAR langFile, int VTFlag)
272 {
273 int i;
274 char Temp[MAXPATHLEN];
275 HWND Hw;
276 wchar_t uimsg[MAX_UIMSG];
277
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 Temp[3] = GetWindowTypeChar(Hw, NULL);
296 Temp[4] = ' ';
297 GetWindowText(Hw,&Temp[5],sizeof(Temp)-6);
298 AppendMenu(menu,MF_ENABLED | MF_STRING,ID_WINDOW_1+i,Temp);
299 i++;
300 if (i>8) {
301 i = pm->NWin;
302 }
303 }
304 else {
305 UnregWin(Hw);
306 }
307 }
308 if (VTFlag == 1) {
309 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 AppendMenu(menu, MF_SEPARATOR, 0, NULL);
319 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
326 SetI18nMenuStrs("Tera Term", menu, MenuTextInfo, _countof(MenuTextInfo), langFile);
327
328 if (pm->WinUndoFlag) {
329 if (pm->WinUndoStyle == WIN_CASCADE)
330 get_lang_msgW("MENU_WINDOW_CASCADE_UNDO", uimsg, _countof(uimsg), L"&Undo - Cascade", langFile);
331 else if (pm->WinUndoStyle == WIN_STACKED)
332 get_lang_msgW("MENU_WINDOW_STACKED_UNDO", uimsg, _countof(uimsg), L"&Undo - Stacked", langFile);
333 else
334 get_lang_msgW("MENU_WINDOW_SIDEBYSIDE_UNDO", uimsg, _countof(uimsg), L"&Undo - Side by Side", langFile);
335 _AppendMenuW(menu, MF_ENABLED | MF_STRING, ID_WINDOW_UNDO, uimsg); // TODO UNICODE
336 }
337
338 }
339 else {
340 get_lang_msgW("MENU_WINDOW_WINDOW", uimsg, _countof(uimsg), L"&Window", langFile);
341 _AppendMenuW(menu,MF_ENABLED | MF_STRING,ID_TEKWINDOW_WINDOW, uimsg);
342 }
343 }
344
345 void WINAPI SetWinList(HWND HWin, HWND HDlg, int IList)
346 {
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 Temp[0] = GetWindowTypeChar(Hw, HWin);
357 Temp[1] = ' ';
358 GetWindowText(Hw,&Temp[2],sizeof(Temp)-3);
359 SendDlgItemMessage(HDlg, IList, LB_ADDSTRING,
360 0, (LPARAM)Temp);
361 if (Hw==HWin) {
362 SendDlgItemMessage(HDlg, IList, LB_SETCURSEL, i,0);
363 }
364 }
365 else {
366 UnregWin(Hw);
367 }
368 }
369 }
370
371 void WINAPI SelectWin(int WinId)
372 {
373 if ((WinId>=0) && (WinId<pm->NWin)) {
374 /* �E�B���h�E�����������������������������������A���������������������������A
375 * SW_SHOWNORMAL ���� SW_SHOW �����X�����B
376 * (2009.11.8 yutaka)
377 * �E�B���h�E�����������������������������T�C�Y������(SW_RESTORE)�����������B
378 * (2009.11.9 maya)
379 */
380 if (IsIconic(pm->WinList[WinId])) {
381 ShowWindow(pm->WinList[WinId],SW_RESTORE);
382 }
383 else {
384 ShowWindow(pm->WinList[WinId],SW_SHOW);
385 }
386 SetForegroundWindow(pm->WinList[WinId]);
387 }
388 }
389
390 void WINAPI SelectNextWin(HWND HWin, int Next, BOOL SkipIconic)
391 {
392 int i;
393
394 i = 0;
395 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 break;
413 }
414 } while ((SkipIconic && IsIconic(pm->WinList[i])) || !IsWindowVisible(pm->WinList[i]));
415
416 SelectWin(i);
417 }
418
419 void WINAPI ShowAllWin(int stat) {
420 int i;
421
422 for (i=0; i < pm->NWin; i++) {
423 ShowWindow(pm->WinList[i], stat);
424 }
425 }
426
427 void WINAPI UndoAllWin(void) {
428 int i;
429 WINDOWPLACEMENT rc0;
430 RECT rc;
431 int stat = SW_RESTORE;
432 int multi_mon = 0;
433
434 if (HasMultiMonitorSupport()) {
435 multi_mon = 1;
436 }
437
438 // ���x�A�����������t���O���������B
439 pm->WinUndoFlag = FALSE;
440
441 memset(&rc0, 0, sizeof(rc0));
442
443 for (i=0; i < pm->NWin; i++) {
444 // �����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 // NT4.0, 95 ���}���`���j�^API��������
449 if (multi_mon) {
450 // �������j�^������������
451 HMONITOR hMonitor;
452 MONITORINFO mi;
453 hMonitor = pMonitorFromRect(&rc, MONITOR_DEFAULTTONEAREST);
454 mi.cbSize = sizeof(MONITORINFO);
455 pGetMonitorInfoA(hMonitor, &mi);
456
457 // ���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 }
475
476 // �E�B���h�E���u����
477 SetWindowPos(
478 pm->WinList[i], NULL,
479 rc.left,
480 rc.top,
481 rc.right - rc.left,
482 rc.bottom - rc.top,
483 SWP_NOZORDER);
484
485 // �E�B���h�E����������
486 ShowWindow(pm->WinList[i], pm->WinPrevRect[i].showCmd);
487
488 } else {
489 ShowWindow(pm->WinList[i], stat);
490 }
491 }
492 }
493
494 void WINAPI OpenHelp(UINT Command, DWORD Data, char *UILanguageFile)
495 {
496 char HomeDir[MAX_PATH];
497 char Temp[MAX_PATH];
498 HWND HWin;
499 wchar_t HelpFN[MAX_PATH];
500 wchar_t uimsg[MAX_UIMSG];
501 wchar_t *HomeDirW;
502
503 /* Get home directory */
504 if (GetModuleFileNameA(NULL,Temp,_countof(Temp)) == 0) {
505 return;
506 }
507 ExtractDirName(Temp, HomeDir);
508 HomeDirW = ToWcharA(HomeDir);
509 get_lang_msgW("HELPFILE", uimsg, _countof(uimsg), L"teraterm.chm", UILanguageFile);
510 _snwprintf_s(HelpFN, _countof(HelpFN), _TRUNCATE, L"%s\\%s", HomeDirW, uimsg);
511 free(HomeDirW);
512
513 // �w���v���I�[�i�[�������f�X�N�g�b�v������ (2007.5.12 maya)
514 HWin = GetDesktopWindow();
515 if (_HtmlHelpW(HWin, HelpFN, Command, Data) == NULL) {
516 // �w���v���J����������
517 static const TTMessageBoxInfoW info = {
518 "Tera Term",
519 NULL, L"Tera Term: HTML help",
520 "MSG_OPENHELP_ERROR", L"Can't open HTML help file(%s)." };
521 TTMessageBoxW(HWin, &info, MB_OK | MB_ICONERROR, UILanguageFile, HelpFN);
522 return;
523 }
524 }
525
526 HWND WINAPI GetNthWin(int n)
527 {
528 if (n<pm->NWin) {
529 return pm->WinList[n];
530 }
531 else {
532 return NULL;
533 }
534 }
535
536 int WINAPI GetRegisteredWindowCount(void)
537 {
538 return (pm->NWin);
539 }
540
541 // �L�����E�B���h�E���T���A�������u���L�������������B
542 static void get_valid_window_and_memorize_rect(HWND myhwnd, HWND hwnd[], int *num, int style)
543 {
544 int i, n;
545 WINDOWPLACEMENT wndPlace;
546
547 // ��������(Undo)���j���[�����x�����\���������B
548 if (pm->WinUndoFlag == FALSE) {
549 pm->WinUndoFlag = TRUE;
550 } else {
551 // ���������j���[���\�������������A�������O�������X�^�C�����I�����������A
552 // ���j���[�������B
553 // Windows8�����A�������A�����������X�^�C�����I�����������j���[�����������������A
554 // Tera Term�������j���[���\�������������A�������������B
555 if (pm->WinUndoStyle == style)
556 pm->WinUndoFlag = FALSE;
557 }
558 pm->WinUndoStyle = style;
559
560 n = 0;
561 for (i = 0 ; i < pm->NWin ; i++) {
562 // �������u���o���������B
563 wndPlace.length = sizeof(WINDOWPLACEMENT);
564 GetWindowPlacement(pm->WinList[i], &wndPlace);
565 pm->WinPrevRect[i] = wndPlace;
566
567 // �������g�������������B
568 if (pm->WinList[i] == myhwnd) {
569 hwnd[n] = hwnd[0];
570 hwnd[0] = myhwnd;
571 } else {
572 hwnd[n] = pm->WinList[i];
573 }
574 n++;
575 }
576 *num = n;
577 }
578
579 // �E�B���h�E�����E���������\������(Show Windows Side by Side)
580 void WINAPI ShowAllWinSidebySide(HWND myhwnd)
581 {
582 int n;
583 HWND hwnd[MAXNWIN];
584
585 get_valid_window_and_memorize_rect(myhwnd, hwnd, &n, WIN_SIDEBYSIDE);
586 TileWindows(NULL, MDITILE_VERTICAL, NULL, n, hwnd);
587 }
588
589 // �E�B���h�E���������������\������(Show Windows Stacked)
590 void WINAPI ShowAllWinStacked(HWND myhwnd)
591 {
592 int n;
593 HWND hwnd[MAXNWIN];
594
595 get_valid_window_and_memorize_rect(myhwnd, hwnd, &n, WIN_STACKED);
596 TileWindows(NULL, MDITILE_HORIZONTAL, NULL, n, hwnd);
597 }
598
599 // �E�B���h�E���d�����\������(Cascade)
600 void WINAPI ShowAllWinCascade(HWND myhwnd)
601 {
602 int n;
603 HWND hwnd[MAXNWIN];
604
605 get_valid_window_and_memorize_rect(myhwnd, hwnd, &n, WIN_CASCADE);
606 CascadeWindows(NULL, MDITILE_SKIPDISABLED, NULL, n, hwnd);
607 }
608
609 // �STera Term���I���w�����o���B
610 void WINAPI BroadcastClosingMessage(HWND myhwnd)
611 {
612 int i, max;
613 HWND hwnd[MAXNWIN];
614
615 // Tera Term���I�����������A���L���������������������A
616 // ���������o�b�t�@���R�s�[���������B
617 max = pm->NWin;
618 for (i = 0 ; i < pm->NWin ; i++) {
619 hwnd[i] = pm->WinList[i];
620 }
621
622 for (i = 0 ; i < max ; i++) {
623 // �������g�������������B
624 if (hwnd[i] == myhwnd)
625 continue;
626
627 PostMessage(hwnd[i], WM_USER_NONCONFIRM_CLOSE, 0, 0);
628 }
629 PostMessage(myhwnd, WM_USER_NONCONFIRM_CLOSE, 0, 0);
630 }
631
632
633 int WINAPI CommReadRawByte(PComVar cv, LPBYTE b)
634 {
635 if ( ! cv->Ready ) {
636 return 0;
637 }
638
639 if ( cv->InBuffCount>0 ) {
640 *b = cv->InBuff[cv->InPtr];
641 cv->InPtr++;
642 cv->InBuffCount--;
643 if ( cv->InBuffCount==0 ) {
644 cv->InPtr = 0;
645 }
646 return 1;
647 }
648 else {
649 cv->InPtr = 0;
650 return 0;
651 }
652 }
653
654 static void LogBinSkip(PComVar cv, int add)
655 {
656 if (cv->LogBinSkip != NULL) {
657 cv->LogBinSkip(add);
658 }
659 }
660
661 void WINAPI CommInsert1Byte(PComVar cv, BYTE b)
662 {
663 if ( ! cv->Ready ) {
664 return;
665 }
666
667 if (cv->InPtr == 0) {
668 memmove(&(cv->InBuff[1]),&(cv->InBuff[0]),cv->InBuffCount);
669 }
670 else {
671 cv->InPtr--;
672 }
673 cv->InBuff[cv->InPtr] = b;
674 cv->InBuffCount++;
675
676 LogBinSkip(cv, 1);
677 }
678
679 static void Log1Bin(PComVar cv, BYTE b)
680 {
681 if (cv->Log1Bin != NULL) {
682 cv->Log1Bin(b);
683 }
684 }
685
686 int WINAPI CommRead1Byte(PComVar cv, LPBYTE b)
687 {
688 int c;
689
690 if ( ! cv->Ready ) {
691 return 0;
692 }
693
694 if ( cv->TelMode ) {
695 c = 0;
696 }
697 else {
698 c = CommReadRawByte(cv,b);
699 }
700
701 if ((c==1) && cv->TelCRFlag) {
702 cv->TelCRFlag = FALSE;
703 if (*b==0) {
704 c = 0;
705 }
706 }
707
708 if ( c==1 ) {
709 if ( cv->IACFlag ) {
710 cv->IACFlag = FALSE;
711 if ( *b != 0xFF ) {
712 cv->TelMode = TRUE;
713 CommInsert1Byte(cv,*b);
714 LogBinSkip(cv, -1);
715 c = 0;
716 }
717 }
718 else if ((cv->PortType==IdTCPIP) && (*b==0xFF)) {
719 if (!cv->TelFlag && cv->TelAutoDetect) { /* TTPLUG */
720 cv->TelFlag = TRUE;
721 }
722 if (cv->TelFlag) {
723 cv->IACFlag = TRUE;
724 c = 0;
725 }
726 }
727 else if (cv->TelFlag && ! cv->TelBinRecv && (*b==0x0D)) {
728 cv->TelCRFlag = TRUE;
729 }
730 }
731
732 if (c == 1) {
733 Log1Bin(cv, *b);
734 }
735
736 return c;
737 }
738
739 int WINAPI CommRawOut(PComVar cv, /*const*/ PCHAR B, int C)
740 {
741 int a;
742
743 if ( ! cv->Ready ) {
744 return C;
745 }
746
747 if (C > OutBuffSize - cv->OutBuffCount) {
748 a = OutBuffSize - cv->OutBuffCount;
749 }
750 else {
751 a = C;
752 }
753 if ( cv->OutPtr > 0 ) {
754 memmove(&(cv->OutBuff[0]),&(cv->OutBuff[cv->OutPtr]),cv->OutBuffCount);
755 cv->OutPtr = 0;
756 }
757 memcpy(&(cv->OutBuff[cv->OutBuffCount]),B,a);
758 cv->OutBuffCount = cv->OutBuffCount + a;
759 return a;
760 }
761
762 int WINAPI CommBinaryOut(PComVar cv, PCHAR B, int C)
763 {
764 int a, i, Len;
765 char d[3];
766
767 if ( ! cv->Ready ) {
768 return C;
769 }
770
771 i = 0;
772 a = 1;
773 while ((a>0) && (i<C)) {
774 Len = 0;
775
776 d[Len] = B[i];
777 Len++;
778
779 if ( cv->TelFlag && (B[i]=='\x0d') && ! cv->TelBinSend ) {
780 d[Len++] = '\x00';
781 }
782 else if ( cv->TelFlag && (B[i]=='\xff') ) {
783 d[Len++] = '\xff';
784 }
785
786 if ( OutBuffSize - cv->OutBuffCount - Len >= 0 ) {
787 CommRawOut(cv, d, Len);
788 a = 1;
789 }
790 else {
791 a = 0;
792 }
793
794 i += a;
795 }
796 return i;
797 }
798
799 /**
800 * �f�[�^(������)���o���o�b�t�@����������
801 *
802 * �w���f�[�^��������������������������������������
803 * CommRawOut() ��������������������������
804 *
805 * @retval TRUE �o��������
806 * @retval FALSE �o��������������(buffer full)
807 */
808 static BOOL WriteOutBuff(PComVar cv, const char *TempStr, int TempLen)
809 {
810 BOOL output;
811
812 if (TempLen == 0) {
813 // ����0������������������������
814 return TRUE;
815 }
816
817 output = FALSE;
818 if (cv->TelLineMode) {
819 const BOOL Full = OutBuffSize - cv->LineModeBuffCount - TempLen < 0;
820 if (!Full) {
821 output = TRUE;
822 memcpy(&(cv->LineModeBuff[cv->LineModeBuffCount]), TempStr, TempLen);
823 cv->LineModeBuffCount += TempLen;
824 if (cv->Flush) {
825 cv->FlushLen = cv->LineModeBuffCount;
826 }
827 }
828 if (cv->FlushLen > 0) {
829 const int OutLen = CommRawOut(cv, cv->LineModeBuff, cv->FlushLen);
830 cv->FlushLen -= OutLen;
831 cv->LineModeBuffCount -= OutLen;
832 memmove(cv->LineModeBuff, &(cv->LineModeBuff[OutLen]), cv->LineModeBuffCount);
833 }
834 cv->Flush = FALSE;
835 }
836 else {
837 const BOOL Full = OutBuffSize-cv->OutBuffCount-TempLen < 0;
838 if (! Full) {
839 output = TRUE;
840 CommRawOut(cv, (char *)TempStr, TempLen);
841 }
842 }
843 return output;
844 }
845
846 /**
847 * �f�[�^(������)�������o�b�t�@����������
848 * �����o�b�t�@�������� -> �G�R�[������
849 *
850 * @retval TRUE �o��������
851 * @retval FALSE �o��������������(buffer full)
852 */
853 static BOOL WriteInBuff(PComVar cv, const char *TempStr, int TempLen)
854 {
855 BOOL Full;
856
857 if (TempLen == 0) {
858 return TRUE;
859 }
860
861 Full = InBuffSize-cv->InBuffCount-TempLen < 0;
862 if (! Full) {
863 memcpy(&(cv->InBuff[cv->InBuffCount]),TempStr,TempLen);
864 cv->InBuffCount = cv->InBuffCount + TempLen;
865 return TRUE;
866 }
867 return FALSE;
868 }
869
870 /**
871 * �����o�b�t�@�����������������������l����
872 */
873 static void PackInBuff(PComVar cv)
874 {
875 if ( (cv->InPtr>0) && (cv->InBuffCount>0) ) {
876 memmove(cv->InBuff,&(cv->InBuff[cv->InPtr]),cv->InBuffCount);
877 cv->InPtr = 0;
878 }
879 }
880
881 int WINAPI CommBinaryBuffOut(PComVar cv, PCHAR B, int C)
882 {
883 int a, i, Len;
884 char d[3];
885
886 if ( ! cv->Ready ) {
887 return C;
888 }
889
890 i = 0;
891 a = 1;
892 while ((a>0) && (i<C)) {
893 Len = 0;
894
895 d[Len] = B[i];
896 Len++;
897
898 if (B[i] == CR) {
899 if ( cv->TelFlag && ! cv->TelBinSend ) {
900 d[Len++] = '\x00';
901 }
902 if (cv->TelLineMode) {
903 cv->Flush = TRUE;
904 }
905 }
906 else if ( cv->TelFlag && (B[i]=='\xff') ) {
907 d[Len++] = '\xff';
908 }
909
910 if (WriteOutBuff(cv, d, Len)) {
911 a = 1;
912 i++;
913 } else {
914 a = 0;
915 }
916 }
917 return i;
918 }
919
920 /**
921 * @retval true ���{�������p�J�^�J�i
922 * @retval false ������
923 */
924 static BOOL IsHalfWidthKatakana(unsigned int u32)
925 {
926 // Halfwidth CJK punctuation (U+FF61�`FF64)
927 // Halfwidth Katakana variants (U+FF65�`FF9F)
928 return (0xff61 <= u32 && u32 <= 0xff9f);
929 }
930
931 /**
932 * �o���p�A TODO echo�p������
933 * @param cv
934 * @param u32 ��������
935 * @param check_only TRUE���������s�����A
936 * @param TempStr �o��������
937 * @param StrLen TempStr�����o��������
938 * @retval �������s����
939 */
940 static BOOL OutControl(PComVar cv, unsigned int u32, BOOL check_only, char *TempStr, size_t *StrLen)
941 {
942 const wchar_t d = u32;
943 size_t TempLen = 0;
944 BOOL retval = FALSE;
945 if (check_only == TRUE) {
946 /* �`�F�b�N���� */
947 if (d == CR || d == BS || d == 0x15/*ctrl-u*/) {
948 return TRUE;
949 } else {
950 return FALSE;
951 }
952 }
953 if (d==CR) {
954 TempStr[TempLen++] = 0x0d;
955 if (cv->CRSend==IdCRLF) {
956 TempStr[TempLen++] = 0x0a;
957 }
958 else if ((cv->CRSend ==IdCR) &&
959 cv->TelFlag && ! cv->TelBinSend) {
960 TempStr[TempLen++] = 0;
961 }
962 else if (cv->CRSend == IdLF) {
963 TempStr[TempLen-1] = 0x0a;
964 }
965 if (cv->TelLineMode) {
966 cv->Flush = TRUE;
967 }
968 retval = TRUE;
969 }
970 else if (d== BS) {
971 if (cv->TelLineMode) {
972 if (cv->FlushLen < cv->LineModeBuffCount) {
973 cv->LineModeBuffCount--;
974 }
975 }
976 else {
977 TempStr[TempLen++] = BS;
978 }
979 retval = TRUE;
980 }
981 else if (d==0x15) { // ctrl-u
982 if (cv->TelLineMode) {
983 cv->LineModeBuffCount = cv->FlushLen;
984 }
985 else {
986 TempStr[TempLen++] = 0x15;
987 }
988 retval = TRUE;
989 }
990 *StrLen = TempLen;
991 return retval;
992 }
993 static BOOL ControlEcho(PComVar cv, unsigned int u32, BOOL check_only, char *TempStr, size_t *StrLen)
994 {
995 const wchar_t d = u32;
996 size_t TempLen = 0;
997 BOOL retval = FALSE;
998 if (check_only == TRUE) {
999 /* �`�F�b�N���� */
1000 if (d == CR || (d == 0x15/*ctrl-u*/ && cv->TelLineMode)) {
1001 return TRUE;
1002 } else {
1003 return FALSE;
1004 }
1005 }
1006 if (d==CR) {
1007 TempStr[TempLen++] = 0x0d;
1008 if (cv->CRSend==IdCRLF) {
1009 TempStr[TempLen++] = 0x0a;
1010 }
1011 else if ((cv->CRSend ==IdCR) && cv->TelFlag && ! cv->TelBinSend) {
1012 TempStr[TempLen++] = 0;
1013 }
1014 else if (cv->CRSend == IdLF) {
1015 TempStr[TempLen-1] = 0x0a;
1016 }
1017 retval = TRUE;
1018 }
1019 else if (d==0x15/*ctrl-u*/ && cv->TelLineMode) {
1020 // Move to top of line (CHA "\033[G") and erase line (EL "\033[K")
1021 memcpy(TempStr, "\033[G\033[K", 6);
1022 TempLen += 6;
1023 retval = TRUE;
1024 }
1025 *StrLen = TempLen;
1026 return retval;
1027 }
1028
1029 /**
1030 * �o���p����������������
1031 *
1032 * @retval ��������������
1033 */
1034 typedef struct {
1035 int KanjiCode; // [in]�o�������R�[�h(sjis,jis����)
1036 BOOL (*ControlOut)(PComVar cv, unsigned int u32, BOOL check_only, char *TempStr, size_t *StrLen);
1037 // state�����������K�v�����������R�[�h���g�p
1038 BOOL JIS7Katakana; // [in](Kanji JIS)kana
1039 int SendCode; // [in,out](Kanji JIS)���O�����M�R�[�h Ascii/Kana/Kanji
1040 BOOL KanjiFlag; // [in,out](MBCS)���O��1byte��������������?(2byte������������?)
1041 BYTE KanjiFirst; // [in,out](MBCS)���O��1byte
1042 } OutputCharState;
1043
1044 /**
1045 * unicode(UTF-16)����unicode(UTF-32)��1���������o����
1046 * �o���f�[�^(TempStr)����������
1047 */
1048 static size_t MakeOutputString(PComVar cv, OutputCharState *states,
1049 const wchar_t *B, int C,
1050 char *TempStr, int *TempLen_)
1051 {
1052 BOOL (*ControlOut)(PComVar cv, unsigned int u32, BOOL check_only, char *TempStr, size_t *StrLen)
1053 = states->ControlOut;
1054 //
1055 int TempLen = 0;
1056 size_t TempLen2;
1057 size_t output_char_count; // ��������������
1058
1059 // UTF-32 ��1���������o��
1060 unsigned int u32;
1061 size_t u16_len = UTF16ToUTF32(B, C, &u32);
1062 if (u16_len == 0) {
1063 // �f�R�[�h��������? ����������������?
1064 assert(FALSE);
1065 u32 = '?';
1066 u16_len = 1;
1067 }
1068 output_char_count = u16_len;
1069
1070 // �e���V�t�g����������������
1071 if (u32 < 0x100 || ControlOut(cv, u32, TRUE, NULL, NULL)) {
1072 if (cv->Language == IdJapanese && states->KanjiCode == IdJIS) {
1073 // �����������A���{��,JIS��������
1074 if (cv->SendCode == IdKanji) {
1075 // �����������������A����OUT
1076 TempStr[TempLen++] = 0x1B;
1077 TempStr[TempLen++] = '(';
1078 switch (cv->KanjiOut) {
1079 case IdKanjiOutJ:
1080 TempStr[TempLen++] = 'J';
1081 break;
1082 case IdKanjiOutH:
1083 TempStr[TempLen++] = 'H';
1084 break;
1085 default:
1086 TempStr[TempLen++] = 'B';
1087 }
1088 }
1089
1090 if (states->JIS7Katakana == 1) {
1091 if (cv->SendCode == IdKatakana) {
1092 TempStr[TempLen++] = SO;
1093 }
1094 }
1095
1096 states->SendCode = IdASCII;
1097 }
1098 }
1099
1100 // 1������������
1101 if (ControlOut(cv, u32, FALSE, TempStr, &TempLen2)) {
1102 // ��������������������
1103 TempLen += TempLen2;
1104 output_char_count = 1;
1105 } else if (cv->Language == IdUtf8 ||
1106 (cv->Language == IdJapanese && states->KanjiCode == IdUTF8) ||
1107 (cv->Language == IdKorean && states->KanjiCode == IdUTF8))
1108 {
1109 // UTF-8 ���o��
1110 size_t utf8_len = sizeof(TempStr);
1111 utf8_len = UTF32ToUTF8(u32, TempStr, utf8_len);
1112 TempLen += utf8_len;
1113 } else if (cv->Language == IdJapanese) {
1114 // ���{��
1115 // ���� CP932(SJIS) ���������������o��
1116 char mb_char[2];
1117 size_t mb_len = sizeof(mb_char);
1118 mb_len = UTF32ToMBCP(u32, 932, mb_char, mb_len);
1119 if (mb_len == 0) {
1120 // SJIS��������������
1121 TempStr[TempLen++] = '?';
1122 } else {
1123 switch (states->KanjiCode) {
1124 case IdEUC:
1125 // TODO ���p�J�i
1126 if (mb_len == 1) {
1127 TempStr[TempLen++] = mb_char[0];
1128 } else {
1129 WORD K;
1130 K = (((WORD)(unsigned char)mb_char[0]) << 8) +
1131 (WORD)(unsigned char)mb_char[1];
1132 K = SJIS2EUC(K);
1133 TempStr[TempLen++] = HIBYTE(K);
1134 TempStr[TempLen++] = LOBYTE(K);
1135 }
1136 break;
1137 case IdJIS:
1138 if (u32 < 0x100) {
1139 // ASCII
1140 TempStr[TempLen++] = mb_char[0];
1141 states->SendCode = IdASCII;
1142 } else if (IsHalfWidthKatakana(u32)) {
1143 // ���p�J�^�J�i
1144 if (states->JIS7Katakana==1) {
1145 if (cv->SendCode != IdKatakana) {
1146 TempStr[TempLen++] = SI;
1147 }
1148 TempStr[TempLen++] = mb_char[0] & 0x7f;
1149 } else {
1150 TempStr[TempLen++] = mb_char[0];
1151 }
1152 states->SendCode = IdKatakana;
1153 } else {
1154 // ����
1155 WORD K;
1156 K = (((WORD)(unsigned char)mb_char[0]) << 8) +
1157 (WORD)(unsigned char)mb_char[1];
1158 K = SJIS2JIS(K);
1159 if (states->SendCode != IdKanji) {
1160 // ����IN
1161 TempStr[TempLen++] = 0x1B;
1162 TempStr[TempLen++] = '$';
1163 if (cv->KanjiIn == IdKanjiInB) {
1164 TempStr[TempLen++] = 'B';
1165 }
1166 else {
1167 TempStr[TempLen++] = '@';
1168 }
1169 states->SendCode = IdKanji;
1170 }
1171 TempStr[TempLen++] = HIBYTE(K);
1172 TempStr[TempLen++] = LOBYTE(K);
1173 }
1174 break;
1175 case IdSJIS:
1176 if (mb_len == 1) {
1177 TempStr[TempLen++] = mb_char[0];
1178 } else {
1179 TempStr[TempLen++] = mb_char[0];
1180 TempStr[TempLen++] = mb_char[1];
1181 }
1182 break;
1183 default:
1184 assert(FALSE);
1185 break;
1186 }
1187 }
1188 } else if (cv->Language == IdRussian) {
1189 /* ����CP1251�����������o�� */
1190 char mb_char[2];
1191 size_t mb_len = sizeof(mb_char);
1192 BYTE b;
1193 mb_len = UTF32ToMBCP(u32, 1251, mb_char, mb_len);
1194 if (mb_len != 1) {
1195 b = '?';
1196 } else {
1197 b = RussConv(IdWindows, cv->RussHost, mb_char[0]);
1198 }
1199 TempStr[TempLen++] = b;
1200 } else if (cv->Language == IdKorean || cv->Language == IdChinese) {
1201 int code_page;
1202 char mb_char[2];
1203 size_t mb_len;
1204 if (cv->Language == IdKorean) {
1205 code_page = 51949;
1206 } else if (cv->Language == IdChinese) {
1207 switch (states->KanjiCode) {
1208 case IdCnGB2312:
1209 code_page = 936;
1210 break;
1211 case IdCnBig5:
1212 code_page = 950;
1213 break;
1214 default:
1215 assert(FALSE);
1216 break;
1217 }
1218 }
1219 /* code_page �����������o�� */
1220 mb_len = sizeof(mb_char);
1221 mb_len = UTF32ToMBCP(u32, code_page, mb_char, mb_len);
1222 if (mb_len == 0) {
1223 TempStr[TempLen++] = '?';
1224 }
1225 else if (mb_len == 1) {
1226 TempStr[TempLen++] = mb_char[0];
1227 } else {
1228 TempStr[TempLen++] = mb_char[0];
1229 TempStr[TempLen++] = mb_char[1];
1230 }
1231 } else if (cv->Language == IdEnglish) {
1232 TempStr[TempLen++] = u32;
1233 } else {
1234 assert(FALSE);
1235 }
1236
1237 *TempLen_ = TempLen;
1238 return output_char_count;
1239 }
1240
1241
1242 /**
1243 * CommTextOut() �� wchar_t ��
1244 *
1245 * @retval �o��������(wchar_t�P��)
1246 */
1247 int WINAPI CommTextOutW(PComVar cv, const wchar_t *B, int C)
1248 {
1249 char TempStr[12];
1250 BOOL Full = FALSE;
1251 int i = 0;
1252 while (! Full && (i < C)) {
1253 // �o���p�f�[�^������
1254 int TempLen = 0;
1255 size_t output_char_count; // ��������������
1256 OutputCharState state;
1257 state.KanjiCode = cv->KanjiCodeSend;
1258 state.ControlOut = OutControl;
1259 state.SendCode = cv->SendCode;
1260 state.JIS7Katakana = cv->JIS7KatakanaSend;
1261 output_char_count = MakeOutputString(cv, &state, &B[i], C-i, TempStr, &TempLen);
1262
1263 // �f�[�^���o���o�b�t�@��
1264 if (WriteOutBuff(cv, TempStr, TempLen)) {
1265 i += output_char_count; // output_char_count ������ ��������
1266 // ��������������������
1267 cv->SendCode = state.SendCode;
1268 } else {
1269 Full = TRUE;
1270 }
1271 } // end of "while {}"
1272 _CrtCheckMemory();
1273 return i;
1274 }
1275
1276 /**
1277 * CommTextEcho() �� wchar_t ��
1278 *
1279 * @retval �o��������(wchar_t�P��)
1280 */
1281 int WINAPI CommTextEchoW(PComVar cv, const wchar_t *B, int C)
1282 {
1283 char TempStr[12];
1284 BOOL Full = FALSE;
1285 int i = 0;
1286 while (! Full && (i < C)) {
1287 // �o���p�f�[�^������
1288 int TempLen = 0;
1289 size_t output_char_count; // ��������������
1290 OutputCharState state;
1291 state.KanjiCode = cv->KanjiCodeEcho;
1292 state.ControlOut = ControlEcho;
1293 state.SendCode = cv->EchoCode;
1294 state.JIS7Katakana = cv->JIS7KatakanaEcho;
1295 output_char_count = MakeOutputString(cv, &state, &B[i], C-i, TempStr, &TempLen);
1296
1297 // �f�[�^���o���o�b�t�@��
1298 if (WriteInBuff(cv, TempStr, TempLen)) {
1299 i += output_char_count; // output_char_count ������ ��������
1300 // ��������������������
1301 cv->EchoCode = state.SendCode;
1302 } else {
1303 Full = TRUE;
1304 }
1305 } // end of "while {}"
1306 _CrtCheckMemory();
1307 return i;
1308 }
1309
1310 int WINAPI CommBinaryEcho(PComVar cv, PCHAR B, int C)
1311 {
1312 int a, i, Len;
1313 char d[3];
1314
1315 if ( ! cv->Ready )
1316 return C;
1317
1318 PackInBuff(cv);
1319
1320 i = 0;
1321 a = 1;
1322 while ((a>0) && (i<C)) {
1323 Len = 0;
1324
1325 d[Len] = B[i];
1326 Len++;
1327
1328 if ( cv->TelFlag && (B[i]=='\x0d') &&
1329 ! cv->TelBinSend ) {
1330 d[Len] = 0x00;
1331 Len++;
1332 }
1333
1334 if ( cv->TelFlag && (B[i]=='\xff') ) {
1335 d[Len] = '\xff';
1336 Len++;
1337 }
1338
1339 if (WriteInBuff(cv, d, Len)) {
1340 a = 1;
1341 i++;
1342 } else {
1343 a = 0;
1344 }
1345 }
1346 return i;
1347 }
1348
1349 /*
1350 * @return �G���[���L������ FALSE
1351 * @param[in] BOOL first_instance
1352 */
1353 static BOOL OpenSharedMemory(BOOL *first_instance_)
1354 {
1355 int i;
1356 HMap = NULL;
1357 pm = NULL;
1358 for (i = 0; i < 100; i++) {
1359 char tmp[32];
1360 HANDLE hMap;
1361 BOOL first_instance;
1362 TMap *map;
1363 _snprintf_s(tmp, sizeof(tmp), _TRUNCATE, i == 0 ? "%s" : "%s_%d", TT_FILEMAPNAME, i);
1364 hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,
1365 0, sizeof(TMap), tmp);
1366 if (hMap == NULL) {
1367 return FALSE;
1368 }
1369
1370 first_instance = (GetLastError() != ERROR_ALREADY_EXISTS);
1371
1372 map = (TMap *)MapViewOfFile(hMap,FILE_MAP_WRITE,0,0,0);
1373 if (map == NULL) {
1374 return FALSE;
1375 }
1376
1377 if (first_instance ||
1378 (map->size_tmap == sizeof(TMap) &&
1379 map->size_tttset == sizeof(TTTSet)))
1380 {
1381 map->size_tmap = sizeof(TMap);
1382 map->size_tttset = sizeof(TTTSet);
1383 HMap = hMap;
1384 pm = map;
1385 *first_instance_ = first_instance;
1386 return TRUE;
1387 }
1388
1389 // next try
1390 UnmapViewOfFile(map);
1391 CloseHandle(hMap);
1392 }
1393 return FALSE;
1394 }
1395
1396 BOOL WINAPI DllMain(HANDLE hInstance,
1397 ULONG ul_reason_for_call,
1398 LPVOID lpReserved)
1399 {
1400 switch( ul_reason_for_call ) {
1401 case DLL_THREAD_ATTACH:
1402 /* do thread initialization */
1403 break;
1404 case DLL_THREAD_DETACH:
1405 /* do thread cleanup */
1406 break;
1407 case DLL_PROCESS_ATTACH:
1408 /* do process initialization */
1409 #ifdef _DEBUG
1410 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
1411 #endif
1412 hInst = hInstance;
1413 if (OpenSharedMemory(&FirstInstance) == FALSE) {
1414 // dll���[�h���s�Ateraterm���N��������
1415 return FALSE;
1416 }
1417 WinCompatInit();
1418 break;
1419 case DLL_PROCESS_DETACH:
1420 /* do process cleanup */
1421 UnmapViewOfFile(pm);
1422 CloseHandle(HMap);
1423 break;
1424 }
1425 return TRUE;
1426 }

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