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 9546 - (show annotations) (download) (as text)
Sat Nov 27 13:48:57 2021 UTC (2 years, 4 months ago) by zmatsuo
File MIME type: text/x-csrc
File size: 36114 byte(s)
Visual Studio 2005 でビルドできるよう修正

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

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