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

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