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

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