Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/teraterm/teraterm/filesys_log.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5312 - (show annotations) (download) (as text)
Tue Jun 11 05:58:48 2013 UTC (10 years, 10 months ago) by doda
Original Path: trunk/teraterm/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 39137 byte(s)
ファイル転送(状況)ダイアログを隠せるようにした。
[ttssh2-devel 2332], http://sourceforge.jp/ticket/browse.php?group_id=1412&tid=31547
ToDo: ファイル転送ダイアログで、Hide オプションの on/off を選べるようにする。

1 /* Tera Term
2 Copyright(C) 1994-1998 T. Teranishi
3 All rights reserved. */
4
5 /* TERATERM.EXE, file transfer routines */
6 #include "stdafx.h"
7 #include "teraterm.h"
8 #include "tttypes.h"
9 #include "ttftypes.h"
10 #include "tt_res.h"
11 #include "ftdlg.h"
12 #include "protodlg.h"
13 #include "ttwinman.h"
14 #include "commlib.h"
15 #include "ttcommon.h"
16 #include "ttdde.h"
17 #include "ttlib.h"
18 #include "helpid.h"
19 #include "dlglib.h"
20 #include "vtterm.h"
21
22 #include "filesys.h"
23 #include "ftlib.h"
24
25 #include <io.h>
26 #include <process.h>
27
28 #define FS_BRACKET_NONE 0
29 #define FS_BRACKET_START 1
30 #define FS_BRACKET_END 2
31
32 PFileVar LogVar = NULL;
33 PFileVar SendVar = NULL;
34 PFileVar FileVar = NULL;
35 static PCHAR ProtoVar = NULL;
36 static int ProtoId;
37
38 static BYTE LogLast = 0;
39 BOOL FileLog = FALSE;
40 BOOL BinLog = FALSE;
41 BOOL DDELog = FALSE;
42 static BOOL FileRetrySend, FileRetryEcho, FileCRSend, FileReadEOF, BinaryMode;
43 static BYTE FileByte;
44
45 static int FileBracketMode = FS_BRACKET_NONE;
46 static int FileBracketPtr = 0;
47 static char BracketStartStr[] = "\033[200~";
48 static char BracketEndStr[] = "\033[201~";
49
50 static BOOL FSend = FALSE;
51
52 HWND HWndLog = NULL; //steven add
53
54 static HMODULE HTTFILE = NULL;
55 static int TTFILECount = 0;
56
57 PGetSetupFname GetSetupFname;
58 PGetTransFname GetTransFname;
59 PGetMultiFname GetMultiFname;
60 PGetGetFname GetGetFname;
61 PSetFileVar SetFileVar;
62 PGetXFname GetXFname;
63 PProtoInit ProtoInit;
64 PProtoParse ProtoParse;
65 PProtoTimeOutProc ProtoTimeOutProc;
66 PProtoCancel ProtoCancel;
67
68 #define IdGetSetupFname 1
69 #define IdGetTransFname 2
70 #define IdGetMultiFname 3
71 #define IdGetGetFname 4
72 #define IdSetFileVar 5
73 #define IdGetXFname 6
74
75 #define IdProtoInit 7
76 #define IdProtoParse 8
77 #define IdProtoTimeOutProc 9
78 #define IdProtoCancel 10
79
80 /*
81 Line Head flag for timestamping
82 2007.05.24 Gentaro
83 */
84 enum enumLineEnd {
85 Line_Other = 0,
86 Line_LineHead = 1,
87 Line_FileHead = 2,
88 };
89
90 enum enumLineEnd eLineEnd = Line_LineHead;
91
92
93 // �x�����������p�X���b�h�����b�Z�[�W
94 #define WM_DPC_LOGTHREAD_SEND (WM_APP + 1)
95
96 static void CloseFileSync(PFileVar ptr);
97
98
99 BOOL LoadTTFILE()
100 {
101 BOOL Err;
102
103 if (HTTFILE != NULL)
104 {
105 TTFILECount++;
106 return TRUE;
107 }
108 else
109 TTFILECount = 0;
110
111 HTTFILE = LoadLibrary("TTPFILE.DLL");
112 if (HTTFILE == NULL)
113 return FALSE;
114
115 TTFILESetUILanguageFile(ts.UILanguageFile);
116 TTFILESetFileSendFilter(ts.FileSendFilter);
117
118 Err = FALSE;
119 GetSetupFname = (PGetSetupFname)GetProcAddress(HTTFILE,
120 MAKEINTRESOURCE(IdGetSetupFname));
121 if (GetSetupFname==NULL)
122 Err = TRUE;
123
124 GetTransFname = (PGetTransFname)GetProcAddress(HTTFILE,
125 MAKEINTRESOURCE(IdGetTransFname));
126 if (GetTransFname==NULL)
127 Err = TRUE;
128
129 GetMultiFname = (PGetMultiFname)GetProcAddress(HTTFILE,
130 MAKEINTRESOURCE(IdGetMultiFname));
131 if (GetMultiFname==NULL)
132 Err = TRUE;
133
134 GetGetFname = (PGetGetFname)GetProcAddress(HTTFILE,
135 MAKEINTRESOURCE(IdGetGetFname));
136 if (GetGetFname==NULL)
137 Err = TRUE;
138
139 SetFileVar = (PSetFileVar)GetProcAddress(HTTFILE,
140 MAKEINTRESOURCE(IdSetFileVar));
141 if (SetFileVar==NULL)
142 Err = TRUE;
143
144 GetXFname = (PGetXFname)GetProcAddress(HTTFILE,
145 MAKEINTRESOURCE(IdGetXFname));
146 if (GetXFname==NULL)
147 Err = TRUE;
148
149 ProtoInit = (PProtoInit)GetProcAddress(HTTFILE,
150 MAKEINTRESOURCE(IdProtoInit));
151 if (ProtoInit==NULL)
152 Err = TRUE;
153
154 ProtoParse = (PProtoParse)GetProcAddress(HTTFILE,
155 MAKEINTRESOURCE(IdProtoParse));
156 if (ProtoParse==NULL)
157 Err = TRUE;
158
159 ProtoTimeOutProc = (PProtoTimeOutProc)GetProcAddress(HTTFILE,
160 MAKEINTRESOURCE(IdProtoTimeOutProc));
161 if (ProtoTimeOutProc==NULL)
162 Err = TRUE;
163
164 ProtoCancel = (PProtoCancel)GetProcAddress(HTTFILE,
165 MAKEINTRESOURCE(IdProtoCancel));
166 if (ProtoCancel==NULL)
167 Err = TRUE;
168
169 if (Err)
170 {
171 FreeLibrary(HTTFILE);
172 HTTFILE = NULL;
173 return FALSE;
174 }
175 else {
176 TTFILECount = 1;
177 return TRUE;
178 }
179 }
180
181 BOOL FreeTTFILE()
182 {
183 if (TTFILECount==0)
184 return FALSE;
185 TTFILECount--;
186 if (TTFILECount>0)
187 return TRUE;
188 if (HTTFILE!=NULL)
189 {
190 FreeLibrary(HTTFILE);
191 HTTFILE = NULL;
192 }
193 return TRUE;
194 }
195
196 static PFileTransDlg FLogDlg = NULL;
197 static PFileTransDlg SendDlg = NULL;
198 static PProtoDlg PtDlg = NULL;
199
200 BOOL OpenFTDlg(PFileVar fv)
201 {
202 PFileTransDlg FTDlg;
203 HWND HFTDlg;
204 char uimsg[MAX_UIMSG];
205
206 FTDlg = new CFileTransDlg();
207
208 fv->StartTime = 0;
209 fv->ProgStat = 0;
210 fv->HideDialog = ts.FTHideDialog;
211
212 if (FTDlg!=NULL)
213 {
214 FTDlg->Create(fv, &cv, &ts);
215 FTDlg->RefreshNum();
216 if (fv->OpId == OpLog) {
217 HWndLog = FTDlg->m_hWnd; // steven add
218 }
219 }
220
221 if (fv->OpId==OpLog)
222 FLogDlg = FTDlg; /* Log */
223 else
224 SendDlg = FTDlg; /* File send */
225
226 HFTDlg=FTDlg->GetSafeHwnd();
227
228 GetDlgItemText(HFTDlg, IDC_TRANS_FILENAME, uimsg, sizeof(uimsg));
229 get_lang_msg("DLG_FILETRANS_FILENAME", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
230 SetDlgItemText(HFTDlg, IDC_TRANS_FILENAME, ts.UIMsg);
231 GetDlgItemText(HFTDlg, IDC_FULLPATH_LABEL, uimsg, sizeof(uimsg));
232 get_lang_msg("DLG_FILETRANS_FULLPATH", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
233 SetDlgItemText(HFTDlg, IDC_FULLPATH_LABEL, ts.UIMsg);
234 GetDlgItemText(HFTDlg, IDC_TRANS_TRANS, uimsg, sizeof(uimsg));
235 get_lang_msg("DLG_FILETRANS_TRNAS", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
236 SetDlgItemText(HFTDlg, IDC_TRANS_TRANS, ts.UIMsg);
237 GetDlgItemText(HFTDlg, IDC_TRANS_ELAPSED, uimsg, sizeof(uimsg));
238 get_lang_msg("DLG_FILETRANS_ELAPSED", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
239 SetDlgItemText(HFTDlg, IDC_TRANS_ELAPSED, ts.UIMsg);
240 GetDlgItemText(HFTDlg, IDCANCEL, uimsg, sizeof(uimsg));
241 get_lang_msg("DLG_FILETRANS_CLOSE", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
242 SetDlgItemText(HFTDlg, IDCANCEL, ts.UIMsg);
243 GetDlgItemText(HFTDlg, IDC_TRANSPAUSESTART, uimsg, sizeof(uimsg));
244 get_lang_msg("DLG_FILETRANS_PAUSE", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
245 SetDlgItemText(HFTDlg, IDC_TRANSPAUSESTART, ts.UIMsg);
246 GetDlgItemText(HFTDlg, IDC_TRANSHELP, uimsg, sizeof(uimsg));
247 get_lang_msg("BTN_HELP", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
248 SetDlgItemText(HFTDlg, IDC_TRANSHELP, ts.UIMsg);
249
250 if (fv->OpId == OpSendFile) {
251 fv->StartTime = GetTickCount();
252 InitDlgProgress(HFTDlg, IDC_TRANSPROGRESS, &fv->ProgStat);
253 ShowWindow(GetDlgItem(HFTDlg, IDC_TRANS_ELAPSED), SW_SHOW);
254 }
255
256 return (FTDlg!=NULL);
257 }
258
259 void ShowFTDlg(WORD OpId)
260 {
261 if (OpId == OpLog) {
262 if (FLogDlg != NULL) {
263 FLogDlg->ShowWindow(SW_SHOWNORMAL);
264 SetForegroundWindow(FLogDlg->GetSafeHwnd());
265 }
266 }
267 else {
268 if (SendDlg != NULL) {
269 SendDlg->ShowWindow(SW_SHOWNORMAL);
270 SetForegroundWindow(SendDlg->GetSafeHwnd());
271 }
272 }
273 }
274
275 BOOL NewFileVar(PFileVar *fv)
276 {
277 if ((*fv)==NULL)
278 {
279 *fv = (PFileVar)malloc(sizeof(TFileVar));
280 if ((*fv)!=NULL)
281 {
282 memset(*fv, 0, sizeof(TFileVar));
283 strncpy_s((*fv)->FullName, sizeof((*fv)->FullName),ts.FileDir, _TRUNCATE);
284 AppendSlash((*fv)->FullName,sizeof((*fv)->FullName));
285 (*fv)->DirLen = strlen((*fv)->FullName);
286 (*fv)->FileOpen = FALSE;
287 (*fv)->OverWrite = ((ts.FTFlag & FT_RENAME) == 0);
288 (*fv)->HMainWin = HVTWin;
289 (*fv)->Success = FALSE;
290 (*fv)->NoMsg = FALSE;
291 (*fv)->HideDialog = FALSE;
292 }
293 }
294
295 return ((*fv)!=NULL);
296 }
297
298 void FreeFileVar(PFileVar *fv)
299 {
300 if ((*fv)!=NULL)
301 {
302 CloseFileSync(*fv);
303 //if ((*fv)->FileOpen) _lclose((*fv)->FileHandle);
304 if ((*fv)->FnStrMemHandle>0)
305 {
306 GlobalUnlock((*fv)->FnStrMemHandle);
307 GlobalFree((*fv)->FnStrMemHandle);
308 }
309 free(*fv);
310 *fv = NULL;
311 }
312 }
313
314 // &h ���z�X�g�����u�� (2007.5.14)
315 // &p ��TCP�|�[�g�������u�� (2009.6.12)
316 void ConvertLogname(char *c, int destlen)
317 {
318 char buf[MAXPATHLEN], buf2[MAXPATHLEN], *p = c;
319 char tmphost[1024];
320
321 memset(buf, 0, sizeof(buf));
322
323 while(*p != '\0') {
324 if (*p == '&' && *(p+1) != '\0') {
325 switch (*(p+1)) {
326 case 'h':
327 if (cv.Open) {
328 if (cv.PortType == IdTCPIP) {
329 // �z�X�g����IPv6�A�h���X�����A�t�@�C�������g�p�����������������������A
330 // �]�v�����������������B
331 // (2013.3.9 yutaka)
332 strncpy_s(tmphost, sizeof(tmphost), ts.HostName, _TRUNCATE);
333 //strncpy_s(tmphost, sizeof(tmphost), "2001:0db8:bd05:01d2:288a:1fc0:0001:10ee", _TRUNCATE);
334 replaceInvalidFileNameChar(tmphost, '_');
335 strncat_s(buf,sizeof(buf), tmphost, _TRUNCATE);
336 }
337 else if (cv.PortType == IdSerial) {
338 strncpy_s(buf2,sizeof(buf2),buf,_TRUNCATE);
339 _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%sCOM%d", buf2, ts.ComPort);
340 }
341 }
342 break;
343 case 'p':
344 if (cv.Open) {
345 if (cv.PortType == IdTCPIP) {
346 char port[6];
347 _snprintf_s(port, sizeof(port), _TRUNCATE, "%d", ts.TCPPort);
348 strncat_s(buf,sizeof(buf),port,_TRUNCATE);
349 }
350 }
351 break;
352 default:
353 strncpy_s(buf2,sizeof(buf2),p,2);
354 strncat_s(buf,sizeof(buf),buf2,_TRUNCATE);
355 }
356 p++;
357 }
358 else {
359 strncpy_s(buf2,sizeof(buf2),p,1);
360 strncat_s(buf,sizeof(buf),buf2,_TRUNCATE);
361 }
362 p++;
363 }
364 strncpy_s(c, destlen, buf, _TRUNCATE);
365 }
366
367 void FixLogOption()
368 {
369 if (ts.LogBinary) {
370 ts.LogTypePlainText = false;
371 ts.LogTimestamp = false;
372 }
373 }
374
375
376 // �X���b�h���I�����t�@�C�����N���[�Y
377 static void CloseFileSync(PFileVar ptr)
378 {
379 if (!ptr->FileOpen)
380 return;
381
382 if (ptr->LogThread != (HANDLE)-1) {
383 // �X���b�h���I������
384 PostThreadMessage(ptr->LogThreadId, WM_QUIT, 0, 0);
385 WaitForSingleObject(ptr->LogThread, INFINITE);
386 CloseHandle(ptr->LogThread);
387 ptr->LogThread = (HANDLE)-1;
388 }
389 #ifdef FileVarWin16
390 _lclose(ptr->FileHandle);
391 #else
392 CloseHandle((HANDLE)ptr->FileHandle);
393 #endif
394 }
395
396 // �x�����������p�X���b�h
397 static unsigned _stdcall DeferredLogWriteThread(void *arg)
398 {
399 MSG msg;
400 PFileVar fv = (PFileVar)arg;
401 PCHAR buf;
402 DWORD buflen;
403 DWORD wrote;
404
405 PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
406
407 while (GetMessage(&msg, NULL, 0, 0) > 0) {
408 switch (msg.message) {
409 case WM_DPC_LOGTHREAD_SEND:
410 buf = (PCHAR)msg.wParam;
411 buflen = (DWORD)msg.lParam;
412 #ifdef FileVarWin16
413 _lwrite(fv->FileHandle, buf, buflen );
414 #else
415 WriteFile((HANDLE)LogVar->FileHandle, buf, buflen, &wrote, NULL);
416 #endif
417 free(buf); // ����������������
418 break;
419
420 case WM_QUIT:
421 goto end;
422 break;
423 }
424 }
425
426 end:
427 _endthreadex(0);
428 return (0);
429 }
430
431
432 extern "C" {
433 BOOL LogStart()
434 {
435 LONG Option;
436 char *logdir;
437 unsigned tid;
438
439 if ((FileLog) || (BinLog)) return FALSE;
440
441 if (! LoadTTFILE()) return FALSE;
442 if (! NewFileVar(&LogVar))
443 {
444 FreeTTFILE();
445 return FALSE;
446 }
447 LogVar->OpId = OpLog;
448
449 if (strlen(ts.LogDefaultPath) > 0) {
450 logdir = ts.LogDefaultPath;
451 }
452 else if (strlen(ts.FileDir) > 0) {
453 logdir = ts.FileDir;
454 }
455 else {
456 logdir = ts.HomeDir;
457 }
458
459 if (strlen(&(LogVar->FullName[LogVar->DirLen]))==0)
460 {
461 // LOWORD
462 // 0x0001 = Binary
463 // HIWORD
464 // 0x0001 = Append
465 // 0x1000 = plain text (2005.2.20 yutaka)
466 // 0x2000 = timestamp (2006.7.23 maya)
467 // 0x4000 = hide file transfer dialog (2008.1.30 maya)
468 // teraterm.ini�����������������f�t�H���g�I�v�V�������������B(2005.5.7 yutaka)
469 Option = MAKELONG(ts.LogBinary,
470 ts.Append |
471 (0x1000 * ts.LogTypePlainText) |
472 (0x2000 * ts.LogTimestamp) |
473 (0x4000 * ts.LogHideDialog));
474
475 // ���O���f�t�H���g�t�@�C���������� (2006.8.28 maya)
476 strncat_s(LogVar->FullName, sizeof(LogVar->FullName), ts.LogDefaultName, _TRUNCATE);
477
478 ParseStrftimeFileName(LogVar->FullName, sizeof(LogVar->FullName));
479
480 // &h ���z�X�g�����u�� (2007.5.14)
481 ConvertLogname(LogVar->FullName, sizeof(LogVar->FullName));
482
483 strncpy_s(LogVar->LogDefaultPath, sizeof(LogVar->LogDefaultPath), ts.LogDefaultPath, _TRUNCATE);
484 if (! (*GetTransFname)(LogVar, logdir, GTF_LOG, &Option))
485 {
486 FreeFileVar(&LogVar);
487 FreeTTFILE();
488 return FALSE;
489 }
490 ts.LogBinary = LOWORD(Option);
491 ts.Append = HIWORD(Option);
492
493 if (ts.Append & 0x1000) {
494 ts.LogTypePlainText = 1;
495 } else {
496 ts.LogTypePlainText = 0;
497 }
498
499 if (ts.Append & 0x2000) {
500 ts.LogTimestamp = 1;
501 }
502 else {
503 ts.LogTimestamp = 0;
504 }
505
506 if (ts.Append & 0x4000) {
507 ts.LogHideDialog = 1;
508 }
509 else {
510 ts.LogHideDialog = 0;
511 }
512
513 ts.Append &= 0x1; // 1bit���}�X�N����
514
515 }
516 else {
517 // LogVar->DirLen = 0 ��������������
518 // �t���p�X�E�����p�X������ LogVar->FullName �������������K�v������
519 char FileName[MAX_PATH];
520
521 // �t���p�X��
522 strncpy_s(FileName, sizeof(FileName), LogVar->FullName, _TRUNCATE);
523 ConvFName(logdir,FileName,sizeof(FileName),"",LogVar->FullName,sizeof(LogVar->FullName));
524
525 ParseStrftimeFileName(LogVar->FullName, sizeof(LogVar->FullName));
526
527 // &h ���z�X�g�����u�� (2007.5.14)
528 ConvertLogname(LogVar->FullName, sizeof(LogVar->FullName));
529 (*SetFileVar)(LogVar);
530
531 FixLogOption();
532 }
533
534 if (ts.LogBinary > 0)
535 {
536 BinLog = TRUE;
537 FileLog = FALSE;
538 if (! CreateBinBuf())
539 {
540 FileTransEnd(OpLog);
541 return FALSE;
542 }
543 }
544 else {
545 BinLog = FALSE;
546 FileLog = TRUE;
547 if (! CreateLogBuf())
548 {
549 FileTransEnd(OpLog);
550 return FALSE;
551 }
552 }
553 cv.LStart = cv.LogPtr;
554 cv.LCount = 0;
555 if (ts.LogHideDialog)
556 LogVar->HideDialog = 1;
557
558 HelpId = HlpFileLog;
559 /* 2007.05.24 Gentaro */
560 eLineEnd = Line_LineHead;
561
562 if (ts.Append > 0)
563 {
564 int dwShareMode = FILE_SHARE_READ;
565 if (!ts.LogLockExclusive) {
566 dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
567 }
568 LogVar->FileHandle = (int)CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
569 OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
570 if (LogVar->FileHandle>0){
571 #ifdef FileVarWin16
572 _llseek(LogVar->FileHandle,0,2);
573 #else
574 SetFilePointer((HANDLE)LogVar->FileHandle, 0, NULL, FILE_END);
575 #endif
576 /* 2007.05.24 Gentaro
577 If log file already exists,
578 a newline is inserted before the first timestamp.
579 */
580 eLineEnd = Line_FileHead;
581 }
582 }
583 else {
584 int dwShareMode = FILE_SHARE_READ;
585 if (!ts.LogLockExclusive) {
586 dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
587 }
588 LogVar->FileHandle = (int)CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
589 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
590 }
591 LogVar->FileOpen = (LogVar->FileHandle>0);
592 if (! LogVar->FileOpen)
593 {
594 char msg[128];
595
596 // �t�@�C���I�[�v���G���[�������b�Z�[�W�\�������������B(2008.7.9 yutaka)
597 if (LogVar->NoMsg == FALSE) {
598 _snprintf_s(msg, sizeof(msg), _TRUNCATE, "Can not create a `%s' file. (%d)", LogVar->FullName, GetLastError());
599 MessageBox(NULL, msg, "Tera Term: File open error", MB_OK | MB_ICONERROR);
600 }
601
602 FileTransEnd(OpLog);
603 return FALSE;
604 }
605 LogVar->ByteCount = 0;
606
607 // Log rotate configuration
608 LogVar->RotateMode = ts.LogRotate;
609 LogVar->RotateSize = ts.LogRotateSize;
610 LogVar->RotateStep = ts.LogRotateStep;
611
612 if (! OpenFTDlg(LogVar)) {
613 FileTransEnd(OpLog);
614 return FALSE;
615 }
616
617 // �x�����������p�X���b�h���N�����B
618 // (2013.4.19 yutaka)
619 LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid);
620 LogVar->LogThreadId = tid;
621
622 return TRUE;
623 }
624 }
625
626 void LogPut1(BYTE b)
627 {
628 LogLast = b;
629 cv.LogBuf[cv.LogPtr] = b;
630 cv.LogPtr++;
631 if (cv.LogPtr>=InBuffSize)
632 cv.LogPtr = cv.LogPtr-InBuffSize;
633
634 if (FileLog)
635 {
636 if (cv.LCount>=InBuffSize)
637 {
638 cv.LCount = InBuffSize;
639 cv.LStart = cv.LogPtr;
640 }
641 else
642 cv.LCount++;
643 }
644 else
645 cv.LCount = 0;
646
647 if (DDELog)
648 {
649 if (cv.DCount>=InBuffSize)
650 {
651 cv.DCount = InBuffSize;
652 cv.DStart = cv.LogPtr;
653 }
654 else
655 cv.DCount++;
656 }
657 else {
658 cv.DCount = 0;
659 // ���O���������}�N�����X�g�[���������������C���B
660 // ���O�����������x�}�N�����~�������A�o�b�t�@���C���f�b�N�X�������������������A
661 // ���x�}�N�������������������f�[�^�������������������B
662 // �}�N�������~���������������C���f�b�N�X�����������������������B
663 // (2006.12.26 yutaka)
664 cv.DStart = cv.LogPtr;
665 }
666 }
667
668 void Log1Byte(BYTE b)
669 {
670 if (b==0x0d)
671 {
672 LogLast = b;
673 return;
674 }
675 if ((b==0x0a) && (LogLast==0x0d))
676 LogPut1(0x0d);
677 LogPut1(b);
678 }
679
680 static BOOL Get1(PCHAR Buf, int *Start, int *Count, PBYTE b)
681 {
682 if (*Count<=0) return FALSE;
683 *b = Buf[*Start];
684 (*Start)++;
685 if (*Start>=InBuffSize)
686 *Start = *Start-InBuffSize;
687 (*Count)--;
688 return TRUE;
689 }
690
691
692
693 static CRITICAL_SECTION g_filelog_lock; /* ���b�N�p���� */
694
695 void logfile_lock_initialize(void)
696 {
697 InitializeCriticalSection(&g_filelog_lock);
698 }
699
700 static inline void logfile_lock(void)
701 {
702 EnterCriticalSection(&g_filelog_lock);
703 }
704
705 static inline void logfile_unlock(void)
706 {
707 LeaveCriticalSection(&g_filelog_lock);
708 }
709
710 // �R�����g�����O����������
711 void CommentLogToFile(char *buf, int size)
712 {
713 DWORD wrote;
714
715 if (LogVar == NULL || !LogVar->FileOpen) {
716 char uimsg[MAX_UIMSG];
717 get_lang_msg("MSG_ERROR", uimsg, sizeof(uimsg), "ERROR", ts.UILanguageFile);
718 get_lang_msg("MSG_COMMENT_LOG_OPEN_ERROR", ts.UIMsg, sizeof(ts.UIMsg),
719 "It is not opened by the log file yet.", ts.UILanguageFile);
720 ::MessageBox(NULL, ts.UIMsg, uimsg, MB_OK|MB_ICONEXCLAMATION);
721 return;
722 }
723
724 logfile_lock();
725 WriteFile((HANDLE)LogVar->FileHandle, buf, size, &wrote, NULL);
726 WriteFile((HANDLE)LogVar->FileHandle, "\r\n", 2, &wrote, NULL); // ���s
727 /* Set Line End Flag
728 2007.05.24 Gentaro
729 */
730 eLineEnd = Line_LineHead;
731 logfile_unlock();
732 }
733
734 // ���O�����[�e�[�g�����B
735 // (2013.3.21 yutaka)
736 static void LogRotate(void)
737 {
738 int loopmax = 10000; // XXX
739 char filename[1024];
740 char newfile[1024], oldfile[1024];
741 int i, k;
742 int dwShareMode = FILE_SHARE_READ;
743 unsigned tid;
744
745 if (! LogVar->FileOpen) return;
746
747 if (LogVar->RotateMode == ROTATE_NONE)
748 return;
749
750 if (LogVar->RotateMode == ROTATE_SIZE) {
751 if (LogVar->ByteCount <= LogVar->RotateSize)
752 return;
753 //OutputDebugPrintf("%s: mode %d size %ld\n", __FUNCTION__, LogVar->RotateMode, LogVar->ByteCount);
754 } else {
755 return;
756 }
757
758 logfile_lock();
759 // ���O�T�C�Y���������������B
760 LogVar->ByteCount = 0;
761
762 // �������������t�@�C�����N���[�Y�����A�������t�@�C�����I�[�v�������B
763 CloseFileSync(LogVar);
764 //_lclose(LogVar->FileHandle);
765
766 // �������[�e�[�V�������X�e�b�v�����w����������
767 if (LogVar->RotateStep > 0)
768 loopmax = LogVar->RotateStep;
769
770 for (i = 1 ; i <= loopmax ; i++) {
771 _snprintf_s(filename, sizeof(filename), _TRUNCATE, "%s.%d", LogVar->FullName, i);
772 if (_access_s(filename, 0) != 0)
773 break;
774 }
775 if (i > loopmax) {
776 // �������������������������A�������t�@�C�������p�������B
777 i = loopmax;
778 }
779
780 // ���t�@�C�������l�[���B
781 for (k = i-1 ; k >= 0 ; k--) {
782 if (k == 0)
783 strncpy_s(oldfile, sizeof(oldfile), LogVar->FullName, _TRUNCATE);
784 else
785 _snprintf_s(oldfile, sizeof(oldfile), _TRUNCATE, "%s.%d", LogVar->FullName, k);
786 _snprintf_s(newfile, sizeof(newfile), _TRUNCATE, "%s.%d", LogVar->FullName, k+1);
787 remove(newfile);
788 if (rename(oldfile, newfile) != 0) {
789 OutputDebugPrintf("%s: rename %d\n", __FUNCTION__, errno);
790 }
791 }
792
793 // ���I�[�v��
794 if (!ts.LogLockExclusive) {
795 dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
796 }
797 LogVar->FileHandle = (int)CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
798 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
799
800 // �x�����������p�X���b�h���N�����B
801 // (2013.4.19 yutaka)
802 LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid);
803 LogVar->LogThreadId = tid;
804
805 logfile_unlock();
806
807 }
808
809 void LogToFile()
810 {
811 PCHAR Buf;
812 int Start, Count;
813 BYTE b;
814 PCHAR WriteBuf;
815 DWORD WriteBufMax, WriteBufLen;
816 CHAR tmp[128];
817 DWORD wrote;
818
819 if (! LogVar->FileOpen) return;
820 if (FileLog)
821 {
822 Buf = cv.LogBuf;
823 Start = cv.LStart;
824 Count = cv.LCount;
825 }
826 else if (BinLog)
827 {
828 Buf = cv.BinBuf;
829 Start = cv.BStart;
830 Count = cv.BCount;
831 }
832 else
833 return;
834
835 if (Buf==NULL) return;
836 if (Count==0) return;
837
838 // ���b�N������(2004.8.6 yutaka)
839 logfile_lock();
840
841 if (ts.DeferredLogWriteMode) {
842 WriteBufMax = 8192;
843 WriteBufLen = 0;
844 WriteBuf = (PCHAR)malloc(WriteBufMax);
845 while (Get1(Buf,&Start,&Count,&b)) {
846 if (((cv.FilePause & OpLog)==0) && (! cv.ProtoFlag))
847 {
848 tmp[0] = 0;
849 if ( ts.LogTimestamp && eLineEnd ) {
850 char *strtime = mctimelocal();
851 /* 2007.05.24 Gentaro */
852 if( eLineEnd == Line_FileHead ){
853 strncat_s(tmp, sizeof(tmp), "\r\n", _TRUNCATE);
854 }
855 strncat_s(tmp, sizeof(tmp), "[", _TRUNCATE);
856 strncat_s(tmp, sizeof(tmp), strtime, _TRUNCATE);
857 strncat_s(tmp, sizeof(tmp), "] ", _TRUNCATE);
858 }
859
860 /* 2007.05.24 Gentaro */
861 if( b == 0x0a ){
862 eLineEnd = Line_LineHead; /* set endmark*/
863 }
864 else {
865 eLineEnd = Line_Other; /* clear endmark*/
866 }
867
868 if (WriteBufLen >= (WriteBufMax*4/5)) {
869 WriteBufMax *= 2;
870 WriteBuf = (PCHAR)realloc(WriteBuf, WriteBufMax);
871 }
872 memcpy(&WriteBuf[WriteBufLen], tmp, strlen(tmp));
873 WriteBufLen += strlen(tmp);
874 WriteBuf[WriteBufLen++] = b;
875
876 (LogVar->ByteCount)++;
877 }
878 }
879
880 PostThreadMessage(LogVar->LogThreadId, WM_DPC_LOGTHREAD_SEND, (WPARAM)WriteBuf, WriteBufLen);
881
882 } else {
883
884 while (Get1(Buf,&Start,&Count,&b))
885 {
886 if (((cv.FilePause & OpLog)==0) && (! cv.ProtoFlag))
887 {
888 // �����������o��(2006.7.23 maya)
889 // ���t�t�H�[�}�b�g�����{�����������E�W�������X���� (2006.7.23 yutaka)
890 /* 2007.05.24 Gentaro */
891 // �~���b���\���������������X (2009.5.23 maya)
892 if ( ts.LogTimestamp && eLineEnd ) {
893 #if 1
894 #if 0
895 SYSTEMTIME LocalTime;
896 GetLocalTime(&LocalTime);
897 char strtime[27];
898
899 // format time
900 sprintf(strtime, "[%04d/%02d/%02d %02d:%02d:%02d.%03d] ",
901 LocalTime.wYear, LocalTime.wMonth,LocalTime.wDay,
902 LocalTime.wHour, LocalTime.wMinute, LocalTime.wSecond,
903 LocalTime.wMilliseconds);
904 #else
905 char *strtime = mctimelocal();
906 #endif
907 #else
908 time_t tick = time(NULL);
909 char *strtime = ctime(&tick);
910 #endif
911 /* 2007.05.24 Gentaro */
912 if( eLineEnd == Line_FileHead ){
913 #ifdef FileVarWin16
914 _lwrite(LogVar->FileHandle,"\r\n",2);
915 #else
916 WriteFile((HANDLE)LogVar->FileHandle, "\r\n", 2, &wrote, NULL);
917 #endif
918 }
919 #ifdef FileVarWin16
920 _lwrite(LogVar->FileHandle,"[",1);
921 _lwrite(LogVar->FileHandle, strtime, strlen(strtime));
922 _lwrite(LogVar->FileHandle,"] ",2);
923 #else
924 WriteFile((HANDLE)LogVar->FileHandle, "[", 1, &wrote, NULL);
925 WriteFile((HANDLE)LogVar->FileHandle, strtime, strlen(strtime), &wrote, NULL);
926 WriteFile((HANDLE)LogVar->FileHandle, "] ", 2, &wrote, NULL);
927 #endif
928 }
929
930 /* 2007.05.24 Gentaro */
931 if( b == 0x0a ){
932 eLineEnd = Line_LineHead; /* set endmark*/
933 }
934 else {
935 eLineEnd = Line_Other; /* clear endmark*/
936 }
937
938 #ifdef FileVarWin16
939 _lwrite(LogVar->FileHandle,(PCHAR)&b,1);
940 #else
941 WriteFile((HANDLE)LogVar->FileHandle, (PCHAR)&b, 1, &wrote, NULL);
942 #endif
943 (LogVar->ByteCount)++;
944 }
945 }
946
947 }
948
949 logfile_unlock();
950
951 if (FileLog)
952 {
953 cv.LStart = Start;
954 cv.LCount = Count;
955 }
956 else {
957 cv.BStart = Start;
958 cv.BCount = Count;
959 }
960 if (((cv.FilePause & OpLog) !=0) || cv.ProtoFlag) return;
961 if (FLogDlg!=NULL)
962 FLogDlg->RefreshNum();
963
964 // ���O�E���[�e�[�g
965 LogRotate();
966
967 }
968
969 BOOL CreateLogBuf()
970 {
971 if (cv.HLogBuf==NULL)
972 {
973 cv.HLogBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
974 cv.LogBuf = NULL;
975 cv.LogPtr = 0;
976 cv.LStart = 0;
977 cv.LCount = 0;
978 cv.DStart = 0;
979 cv.DCount = 0;
980 }
981 return (cv.HLogBuf!=NULL);
982 }
983
984 void FreeLogBuf()
985 {
986 if ((cv.HLogBuf==NULL) || FileLog || DDELog)
987 return;
988 if (cv.LogBuf!=NULL)
989 GlobalUnlock(cv.HLogBuf);
990 GlobalFree(cv.HLogBuf);
991 cv.HLogBuf = NULL;
992 cv.LogBuf = NULL;
993 cv.LogPtr = 0;
994 cv.LStart = 0;
995 cv.LCount = 0;
996 cv.DStart = 0;
997 cv.DCount = 0;
998 }
999
1000 BOOL CreateBinBuf()
1001 {
1002 if (cv.HBinBuf==NULL)
1003 {
1004 cv.HBinBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
1005 cv.BinBuf = NULL;
1006 cv.BinPtr = 0;
1007 cv.BStart = 0;
1008 cv.BCount = 0;
1009 }
1010 return (cv.HBinBuf!=NULL);
1011 }
1012
1013 void FreeBinBuf()
1014 {
1015 if ((cv.HBinBuf==NULL) || BinLog)
1016 return;
1017 if (cv.BinBuf!=NULL)
1018 GlobalUnlock(cv.HBinBuf);
1019 GlobalFree(cv.HBinBuf);
1020 cv.HBinBuf = NULL;
1021 cv.BinBuf = NULL;
1022 cv.BinPtr = 0;
1023 cv.BStart = 0;
1024 cv.BCount = 0;
1025 }
1026
1027 extern "C" {
1028 void FileSendStart()
1029 {
1030 LONG Option;
1031
1032 if (! cv.Ready || FSend) return;
1033 if (cv.ProtoFlag)
1034 {
1035 FreeFileVar(&SendVar);
1036 return;
1037 }
1038
1039 if (! LoadTTFILE())
1040 return;
1041 if (! NewFileVar(&SendVar))
1042 {
1043 FreeTTFILE();
1044 return;
1045 }
1046 SendVar->OpId = OpSendFile;
1047
1048 FSend = TRUE;
1049
1050 if (strlen(&(SendVar->FullName[SendVar->DirLen]))==0)
1051 {
1052 Option = MAKELONG(ts.TransBin,0);
1053 SendVar->FullName[0] = 0;
1054 if (! (*GetTransFname)(SendVar, ts.FileDir, GTF_SEND, &Option))
1055 {
1056 FileTransEnd(OpSendFile);
1057 return;
1058 }
1059 ts.TransBin = LOWORD(Option);
1060 }
1061 else
1062 (*SetFileVar)(SendVar);
1063
1064 #ifdef FileVarWin16
1065 SendVar->FileHandle = _lopen(SendVar->FullName,OF_READ);
1066 #else
1067 SendVar->FileHandle = (int)CreateFile(SendVar->FullName, GENERIC_READ, FILE_SHARE_READ, NULL,
1068 OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
1069 #endif
1070 SendVar->FileOpen = (SendVar->FileHandle>0);
1071 if (! SendVar->FileOpen)
1072 {
1073 FileTransEnd(OpSendFile);
1074 return;
1075 }
1076 SendVar->ByteCount = 0;
1077 SendVar->FileSize = GetFSize(SendVar->FullName);
1078
1079 TalkStatus = IdTalkFile;
1080 FileRetrySend = FALSE;
1081 FileRetryEcho = FALSE;
1082 FileCRSend = FALSE;
1083 FileReadEOF = FALSE;
1084
1085 if (BracketedPasteMode()) {
1086 FileBracketMode = FS_BRACKET_START;
1087 FileBracketPtr = 0;
1088 BinaryMode = TRUE;
1089 }
1090 else {
1091 FileBracketMode = FS_BRACKET_NONE;
1092 BinaryMode = ts.TransBin;
1093 }
1094
1095 if (! OpenFTDlg(SendVar))
1096 FileTransEnd(OpSendFile);
1097 }
1098 }
1099
1100 void FileTransEnd(WORD OpId)
1101 /* OpId = 0: close Log and FileSend
1102 OpLog: close Log
1103 OpSendFile: close FileSend */
1104 {
1105 if (((OpId==0) || (OpId==OpLog)) && (FileLog || BinLog))
1106 {
1107 FileLog = FALSE;
1108 BinLog = FALSE;
1109 if (FLogDlg!=NULL)
1110 {
1111 FLogDlg->DestroyWindow();
1112 FLogDlg = NULL;
1113 HWndLog = NULL; // steven add
1114 }
1115 FreeFileVar(&LogVar);
1116 FreeLogBuf();
1117 FreeBinBuf();
1118 FreeTTFILE();
1119 }
1120
1121 if (((OpId==0) || (OpId==OpSendFile)) && FSend)
1122 {
1123 FSend = FALSE;
1124 TalkStatus = IdTalkKeyb;
1125 if (SendDlg!=NULL)
1126 {
1127 SendDlg->DestroyWindow();
1128 SendDlg = NULL;
1129 }
1130 FreeFileVar(&SendVar);
1131 FreeTTFILE();
1132 }
1133
1134 EndDdeCmnd(0);
1135 }
1136
1137 int FSOut1(BYTE b)
1138 {
1139 if (BinaryMode)
1140 return CommBinaryOut(&cv,(PCHAR)&b,1);
1141 else if ((b>=0x20) || (b==0x09) || (b==0x0A) || (b==0x0D))
1142 return CommTextOut(&cv,(PCHAR)&b,1);
1143 else
1144 return 1;
1145 }
1146
1147 int FSEcho1(BYTE b)
1148 {
1149 if (BinaryMode)
1150 return CommBinaryEcho(&cv,(PCHAR)&b,1);
1151 else
1152 return CommTextEcho(&cv,(PCHAR)&b,1);
1153 }
1154
1155 extern "C" {
1156 void FileSend()
1157 {
1158 WORD c, fc;
1159 LONG BCOld;
1160 DWORD read_bytes;
1161
1162 if ((SendDlg==NULL) ||
1163 ((cv.FilePause & OpSendFile) !=0))
1164 return;
1165
1166 BCOld = SendVar->ByteCount;
1167
1168 if (FileRetrySend)
1169 {
1170 FileRetryEcho = (ts.LocalEcho>0);
1171 c = FSOut1(FileByte);
1172 FileRetrySend = (c==0);
1173 if (FileRetrySend)
1174 return;
1175 }
1176
1177 if (FileRetryEcho)
1178 {
1179 c = FSEcho1(FileByte);
1180 FileRetryEcho = (c==0);
1181 if (FileRetryEcho)
1182 return;
1183 }
1184
1185 do {
1186 if (FileBracketMode == FS_BRACKET_START) {
1187 FileByte = BracketStartStr[FileBracketPtr++];
1188 fc = 1;
1189
1190 if (FileBracketPtr >= sizeof(BracketStartStr) - 1) {
1191 FileBracketMode = FS_BRACKET_END;
1192 FileBracketPtr = 0;
1193 BinaryMode = ts.TransBin;
1194 }
1195 }
1196 else if (! FileReadEOF) {
1197 #ifdef FileVarWin16
1198 fc = _lread(SendVar->FileHandle,&FileByte,1);
1199 #else
1200 ReadFile((HANDLE)SendVar->FileHandle, &FileByte, 1, &read_bytes, NULL);
1201 fc = LOWORD(read_bytes);
1202 #endif
1203 SendVar->ByteCount = SendVar->ByteCount + fc;
1204
1205 if (FileCRSend && (fc==1) && (FileByte==0x0A)) {
1206 #ifdef FileVarWin16
1207 fc = _lread(SendVar->FileHandle,&FileByte,1);
1208 #else
1209 ReadFile((HANDLE)SendVar->FileHandle, &FileByte, 1, &read_bytes, NULL);
1210 fc = LOWORD(read_bytes);
1211 #endif
1212 SendVar->ByteCount = SendVar->ByteCount + fc;
1213 }
1214 }
1215 else {
1216 fc = 0;
1217 }
1218
1219 if (fc == 0 && FileBracketMode == FS_BRACKET_END) {
1220 FileReadEOF = TRUE;
1221 FileByte = BracketEndStr[FileBracketPtr++];
1222 fc = 1;
1223 BinaryMode = TRUE;
1224
1225 if (FileBracketPtr >= sizeof(BracketEndStr) - 1) {
1226 FileBracketMode = FS_BRACKET_NONE;
1227 FileBracketPtr = 0;
1228 }
1229 }
1230
1231
1232 if (fc!=0)
1233 {
1234 c = FSOut1(FileByte);
1235 FileCRSend = (ts.TransBin==0) && (FileByte==0x0D);
1236 FileRetrySend = (c==0);
1237 if (FileRetrySend)
1238 {
1239 if (SendVar->ByteCount != BCOld)
1240 SendDlg->RefreshNum();
1241 return;
1242 }
1243 if (ts.LocalEcho>0)
1244 {
1245 c = FSEcho1(FileByte);
1246 FileRetryEcho = (c==0);
1247 if (FileRetryEcho)
1248 return;
1249 }
1250 }
1251 if ((fc==0) || ((SendVar->ByteCount % 100 == 0) && (FileBracketPtr == 0))) {
1252 SendDlg->RefreshNum();
1253 BCOld = SendVar->ByteCount;
1254 if (fc!=0)
1255 return;
1256 }
1257 } while (fc!=0);
1258
1259 FileTransEnd(OpSendFile);
1260 }
1261 }
1262
1263 extern "C" {
1264 void FLogChangeButton(BOOL Pause)
1265 {
1266 if (FLogDlg!=NULL)
1267 FLogDlg->ChangeButton(Pause);
1268 }
1269 }
1270
1271 extern "C" {
1272 void FLogRefreshNum()
1273 {
1274 if (FLogDlg!=NULL)
1275 FLogDlg->RefreshNum();
1276 }
1277 }
1278
1279 BOOL OpenProtoDlg(PFileVar fv, int IdProto, int Mode, WORD Opt1, WORD Opt2)
1280 {
1281 int vsize;
1282 PProtoDlg pd;
1283 HWND Hpd;
1284 char uimsg[MAX_UIMSG];
1285
1286 ProtoId = IdProto;
1287
1288 switch (ProtoId) {
1289 case PROTO_KMT:
1290 vsize = sizeof(TKmtVar);
1291 break;
1292 case PROTO_XM:
1293 vsize = sizeof(TXVar);
1294 break;
1295 case PROTO_YM:
1296 vsize = sizeof(TYVar);
1297 break;
1298 case PROTO_ZM:
1299 vsize = sizeof(TZVar);
1300 break;
1301 case PROTO_BP:
1302 vsize = sizeof(TBPVar);
1303 break;
1304 case PROTO_QV:
1305 vsize = sizeof(TQVVar);
1306 break;
1307 }
1308 ProtoVar = (PCHAR)malloc(vsize);
1309 if (ProtoVar==NULL)
1310 return FALSE;
1311
1312 switch (ProtoId) {
1313 case PROTO_KMT:
1314 ((PKmtVar)ProtoVar)->KmtMode = Mode;
1315 break;
1316 case PROTO_XM:
1317 ((PXVar)ProtoVar)->XMode = Mode;
1318 ((PXVar)ProtoVar)->XOpt = Opt1;
1319 ((PXVar)ProtoVar)->TextFlag = 1 - (Opt2 & 1);
1320 break;
1321 case PROTO_YM:
1322 ((PYVar)ProtoVar)->YMode = Mode;
1323 ((PYVar)ProtoVar)->YOpt = Opt1;
1324 break;
1325 case PROTO_ZM:
1326 ((PZVar)ProtoVar)->BinFlag = (Opt1 & 1) != 0;
1327 ((PZVar)ProtoVar)->ZMode = Mode;
1328 break;
1329 case PROTO_BP:
1330 ((PBPVar)ProtoVar)->BPMode = Mode;
1331 break;
1332 case PROTO_QV:
1333 ((PQVVar)ProtoVar)->QVMode = Mode;
1334 break;
1335 }
1336
1337 pd = new CProtoDlg();
1338 if (pd==NULL)
1339 {
1340 free(ProtoVar);
1341 ProtoVar = NULL;
1342 return FALSE;
1343 }
1344 pd->Create(fv,&ts);
1345
1346 Hpd=pd->GetSafeHwnd();
1347
1348 GetDlgItemText(Hpd, IDC_PROT_FILENAME, uimsg, sizeof(uimsg));
1349 get_lang_msg("DLG_PROT_FIELNAME", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1350 SetDlgItemText(Hpd, IDC_PROT_FILENAME, ts.UIMsg);
1351 GetDlgItemText(Hpd, IDC_PROT_PROT, uimsg, sizeof(uimsg));
1352 get_lang_msg("DLG_PROT_PROTO", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1353 SetDlgItemText(Hpd, IDC_PROT_PROT, ts.UIMsg);
1354 GetDlgItemText(Hpd, IDC_PROT_PACKET, uimsg, sizeof(uimsg));
1355 get_lang_msg("DLG_PROT_PACKET", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1356 SetDlgItemText(Hpd, IDC_PROT_PACKET, ts.UIMsg);
1357 GetDlgItemText(Hpd, IDC_PROT_TRANS, uimsg, sizeof(uimsg));
1358 get_lang_msg("DLG_PROT_TRANS", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1359 SetDlgItemText(Hpd, IDC_PROT_TRANS, ts.UIMsg);
1360 GetDlgItemText(Hpd, IDC_PROT_ELAPSED, uimsg, sizeof(uimsg));
1361 get_lang_msg("DLG_PROT_ELAPSED", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1362 SetDlgItemText(Hpd, IDC_PROT_ELAPSED, ts.UIMsg);
1363 GetDlgItemText(Hpd, IDCANCEL, uimsg, sizeof(uimsg));
1364 get_lang_msg("BTN_CANCEL", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1365 SetDlgItemText(Hpd, IDCANCEL, ts.UIMsg);
1366
1367 (*ProtoInit)(ProtoId,FileVar,ProtoVar,&cv,&ts);
1368
1369 PtDlg = pd;
1370 return TRUE;
1371 }
1372
1373 extern "C" {
1374 void CloseProtoDlg()
1375 {
1376 if (PtDlg!=NULL)
1377 {
1378 PtDlg->DestroyWindow();
1379 PtDlg = NULL;
1380
1381 ::KillTimer(FileVar->HMainWin,IdProtoTimer);
1382 if ((ProtoId==PROTO_QV) &&
1383 (((PQVVar)ProtoVar)->QVMode==IdQVSend))
1384 CommTextOut(&cv,"\015",1);
1385 if (FileVar->LogFlag)
1386 _lclose(FileVar->LogFile);
1387 FileVar->LogFile = 0;
1388 if (ProtoVar!=NULL)
1389 {
1390 free(ProtoVar);
1391 ProtoVar = NULL;
1392 }
1393 }
1394 }
1395 }
1396
1397 BOOL ProtoStart()
1398 {
1399 if (cv.ProtoFlag)
1400 return FALSE;
1401 if (FSend)
1402 {
1403 FreeFileVar(&FileVar);
1404 return FALSE;
1405 }
1406
1407 if (! LoadTTFILE())
1408 return FALSE;
1409 NewFileVar(&FileVar);
1410
1411 if (FileVar==NULL)
1412 {
1413 FreeTTFILE();
1414 return FALSE;
1415 }
1416 cv.ProtoFlag = TRUE;
1417 return TRUE;
1418 }
1419
1420 void ProtoEnd()
1421 {
1422 if (! cv.ProtoFlag)
1423 return;
1424 cv.ProtoFlag = FALSE;
1425
1426 /* Enable transmit delay (serial port) */
1427 cv.DelayFlag = TRUE;
1428 TalkStatus = IdTalkKeyb;
1429
1430 CloseProtoDlg();
1431
1432 if ((FileVar!=NULL) && FileVar->Success)
1433 EndDdeCmnd(1);
1434 else
1435 EndDdeCmnd(0);
1436
1437 FreeTTFILE();
1438 FreeFileVar(&FileVar);
1439 }
1440
1441 extern "C" {
1442 int ProtoDlgParse()
1443 {
1444 int P;
1445
1446 P = ActiveWin;
1447 if (PtDlg==NULL)
1448 return P;
1449
1450 if ((*ProtoParse)(ProtoId,FileVar,ProtoVar,&cv))
1451 P = 0; /* continue */
1452 else {
1453 CommSend(&cv);
1454 ProtoEnd();
1455 }
1456 return P;
1457 }
1458 }
1459
1460 extern "C" {
1461 void ProtoDlgTimeOut()
1462 {
1463 if (PtDlg!=NULL)
1464 (*ProtoTimeOutProc)(ProtoId,FileVar,ProtoVar,&cv);
1465 }
1466 }
1467
1468 extern "C" {
1469 void ProtoDlgCancel()
1470 {
1471 if ((PtDlg!=NULL) &&
1472 (*ProtoCancel)(ProtoId,FileVar,ProtoVar,&cv))
1473 ProtoEnd();
1474 }
1475 }
1476
1477 extern "C" {
1478 void KermitStart(int mode)
1479 {
1480 WORD w;
1481
1482 if (! ProtoStart())
1483 return;
1484
1485 switch (mode) {
1486 case IdKmtSend:
1487 FileVar->OpId = OpKmtSend;
1488 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1489 {
1490 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_KERMIT,&w) ||
1491 (FileVar->NumFname==0))
1492 {
1493 ProtoEnd();
1494 return;
1495 }
1496 }
1497 else
1498 (*SetFileVar)(FileVar);
1499 break;
1500 case IdKmtReceive:
1501 FileVar->OpId = OpKmtRcv;
1502 break;
1503 case IdKmtGet:
1504 FileVar->OpId = OpKmtSend;
1505 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1506 {
1507 if (! (*GetGetFname)(FileVar->HMainWin,FileVar) ||
1508 (strlen(FileVar->FullName)==0))
1509 {
1510 ProtoEnd();
1511 return;
1512 }
1513 }
1514 else
1515 (*SetFileVar)(FileVar);
1516 break;
1517 case IdKmtFinish:
1518 FileVar->OpId = OpKmtFin;
1519 break;
1520 default:
1521 ProtoEnd();
1522 return;
1523 }
1524 TalkStatus = IdTalkQuiet;
1525
1526 /* disable transmit delay (serial port) */
1527 cv.DelayFlag = FALSE;
1528
1529 if (! OpenProtoDlg(FileVar,PROTO_KMT,mode,0,0))
1530 ProtoEnd();
1531 }
1532 }
1533
1534 extern "C" {
1535 void XMODEMStart(int mode)
1536 {
1537 LONG Option;
1538
1539 if (! ProtoStart())
1540 return;
1541
1542 if (mode==IdXReceive)
1543 FileVar->OpId = OpXRcv;
1544 else
1545 FileVar->OpId = OpXSend;
1546
1547 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1548 {
1549 Option = MAKELONG(ts.XmodemBin,ts.XmodemOpt);
1550 if (! (*GetXFname)(FileVar->HMainWin,
1551 mode==IdXReceive,&Option,FileVar,ts.FileDir))
1552 {
1553 ProtoEnd();
1554 return;
1555 }
1556 ts.XmodemOpt = HIWORD(Option);
1557 ts.XmodemBin = LOWORD(Option);
1558 }
1559 else
1560 (*SetFileVar)(FileVar);
1561
1562 if (mode==IdXReceive)
1563 FileVar->FileHandle = _lcreat(FileVar->FullName,0);
1564 else
1565 FileVar->FileHandle = _lopen(FileVar->FullName,OF_READ);
1566
1567 FileVar->FileOpen = FileVar->FileHandle>0;
1568 if (! FileVar->FileOpen)
1569 {
1570 ProtoEnd();
1571 return;
1572 }
1573 TalkStatus = IdTalkQuiet;
1574
1575 /* disable transmit delay (serial port) */
1576 cv.DelayFlag = FALSE;
1577
1578 if (! OpenProtoDlg(FileVar,PROTO_XM,mode,
1579 ts.XmodemOpt,ts.XmodemBin))
1580 ProtoEnd();
1581 }
1582 }
1583
1584 extern "C" {
1585 void YMODEMStart(int mode)
1586 {
1587 WORD Opt;
1588
1589 if (! ProtoStart())
1590 return;
1591
1592 if (mode==IdYSend)
1593 {
1594 // �t�@�C���]�������I�v�V������"Yopt1K"�����������B
1595 // TODO: "Yopt1K", "YoptG", "YoptSingle"�������������������AIDD_FOPT���g�������K�v�����B
1596 Opt = Yopt1K;
1597 FileVar->OpId = OpYSend;
1598 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1599 {
1600 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Y,&Opt) ||
1601 (FileVar->NumFname==0))
1602 {
1603 ProtoEnd();
1604 return;
1605 }
1606 //ts.XmodemBin = Opt;
1607 }
1608 else
1609 (*SetFileVar)(FileVar);
1610 }
1611 else {/* IdZReceive or IdZAuto */
1612 FileVar->OpId = OpYRcv;
1613 // �t�@�C���]�������I�v�V������"Yopt1K"�����������B
1614 Opt = Yopt1K;
1615 (*SetFileVar)(FileVar);
1616 }
1617
1618 TalkStatus = IdTalkQuiet;
1619
1620 /* disable transmit delay (serial port) */
1621 cv.DelayFlag = FALSE;
1622
1623 if (! OpenProtoDlg(FileVar,PROTO_YM,mode,Opt,0))
1624 ProtoEnd();
1625 }
1626 }
1627
1628 extern "C" {
1629 void ZMODEMStart(int mode)
1630 {
1631 WORD Opt;
1632
1633 if (! ProtoStart())
1634 return;
1635
1636 if (mode==IdZSend)
1637 {
1638 Opt = ts.XmodemBin;
1639 FileVar->OpId = OpZSend;
1640 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1641 {
1642 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Z,&Opt) ||
1643 (FileVar->NumFname==0))
1644 {
1645 ProtoEnd();
1646 return;
1647 }
1648 ts.XmodemBin = Opt;
1649 }
1650 else
1651 (*SetFileVar)(FileVar);
1652 }
1653 else /* IdZReceive or IdZAuto */
1654 FileVar->OpId = OpZRcv;
1655
1656 TalkStatus = IdTalkQuiet;
1657
1658 /* disable transmit delay (serial port) */
1659 cv.DelayFlag = FALSE;
1660
1661 if (! OpenProtoDlg(FileVar,PROTO_ZM,mode,Opt,0))
1662 ProtoEnd();
1663 }
1664 }
1665
1666 extern "C" {
1667 void BPStart(int mode)
1668 {
1669 LONG Option;
1670
1671 if (! ProtoStart())
1672 return;
1673 if (mode==IdBPSend)
1674 {
1675 FileVar->OpId = OpBPSend;
1676 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1677 {
1678 FileVar->FullName[0] = 0;
1679 if (! (*GetTransFname)(FileVar, ts.FileDir, GTF_BP, &Option))
1680 {
1681 ProtoEnd();
1682 return;
1683 }
1684 }
1685 else
1686 (*SetFileVar)(FileVar);
1687 }
1688 else /* IdBPReceive or IdBPAuto */
1689 FileVar->OpId = OpBPRcv;
1690
1691 TalkStatus = IdTalkQuiet;
1692
1693 /* disable transmit delay (serial port) */
1694 cv.DelayFlag = FALSE;
1695
1696 if (! OpenProtoDlg(FileVar,PROTO_BP,mode,0,0))
1697 ProtoEnd();
1698 }
1699 }
1700
1701 extern "C" {
1702 void QVStart(int mode)
1703 {
1704 WORD W;
1705
1706 if (! ProtoStart())
1707 return;
1708
1709 if (mode==IdQVSend)
1710 {
1711 FileVar->OpId = OpQVSend;
1712 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1713 {
1714 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_QV, &W) ||
1715 (FileVar->NumFname==0))
1716 {
1717 ProtoEnd();
1718 return;
1719 }
1720 }
1721 else
1722 (*SetFileVar)(FileVar);
1723 }
1724 else
1725 FileVar->OpId = OpQVRcv;
1726
1727 TalkStatus = IdTalkQuiet;
1728
1729 /* disable transmit delay (serial port) */
1730 cv.DelayFlag = FALSE;
1731
1732 if (! OpenProtoDlg(FileVar,PROTO_QV,mode,0,0))
1733 ProtoEnd();
1734 }
1735 }

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