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 3820 - (show annotations) (download) (as text)
Wed Mar 24 05:32:01 2010 UTC (14 years ago) by yutakapon
Original Path: trunk/teraterm/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 30997 byte(s)
YMODEM: ファイル受信処理のリファクタリング
*複数ファイルの受信は未サポート

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

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