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

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