Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /trunk/teraterm/teraterm/filesys_log.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3861 - (hide annotations) (download) (as text)
Thu Apr 15 13:15:43 2010 UTC (13 years, 11 months ago) by doda
Original Path: trunk/teraterm/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 30930 byte(s)
外部からコールされなくなったので、コールされる為の設定を削除。

1 maya 3227 /* 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 maya 3602 get_lang_msg("DLG_FILETRANS_CLOSE", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
215 maya 3227 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 maya 3709 SetForegroundWindow(FLogDlg->GetSafeHwnd());
239 maya 3227 }
240     }
241     else {
242     if (SendDlg != NULL) {
243     SendDlg->ShowWindow(SW_SHOWNORMAL);
244 maya 3709 SetForegroundWindow(SendDlg->GetSafeHwnd());
245 maya 3227 }
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 maya 3473 // &p ��TCP�|�[�g�������u�� (2009.6.12)
289 maya 3227 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 maya 3473 case 'h':
299 maya 3227 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 maya 3473 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 maya 3227 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 maya 3418 #if 1
656 maya 3227 #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 maya 3418 // �~���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 maya 3227 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 maya 3418 _lwrite(LogVar->FileHandle, strtime, strlen(strtime));
695 maya 3227 _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     int FSOut1(BYTE b)
880     {
881     if (ts.TransBin > 0)
882     return CommBinaryOut(&cv,(PCHAR)&b,1);
883     else if ((b>=0x20) || (b==0x09) || (b==0x0A) || (b==0x0D))
884     return CommTextOut(&cv,(PCHAR)&b,1);
885     else
886     return 1;
887 doda 3861 }
888 maya 3227
889     int FSEcho1(BYTE b)
890     {
891     if (ts.TransBin > 0)
892     return CommBinaryEcho(&cv,(PCHAR)&b,1);
893     else
894     return CommTextEcho(&cv,(PCHAR)&b,1);
895     }
896    
897     extern "C" {
898     void FileSend()
899     {
900     WORD c, fc;
901     LONG BCOld;
902    
903     if ((SendDlg==NULL) ||
904     ((cv.FilePause & OpSendFile) !=0))
905     return;
906    
907     BCOld = SendVar->ByteCount;
908    
909     if (FileRetrySend)
910     {
911     FileRetryEcho = (ts.LocalEcho>0);
912     c = FSOut1(FileByte);
913     FileRetrySend = (c==0);
914     if (FileRetrySend)
915     return;
916     }
917    
918     if (FileRetryEcho)
919     {
920     c = FSEcho1(FileByte);
921     FileRetryEcho = (c==0);
922     if (FileRetryEcho)
923     return;
924     }
925    
926     do {
927     fc = _lread(SendVar->FileHandle,&FileByte,1);
928     SendVar->ByteCount = SendVar->ByteCount + fc;
929    
930     if (FileCRSend && (fc==1) && (FileByte==0x0A))
931     {
932     fc = _lread(SendVar->FileHandle,&FileByte,1);
933     SendVar->ByteCount = SendVar->ByteCount + fc;
934     }
935    
936     if (fc!=0)
937     {
938     c = FSOut1(FileByte);
939     FileCRSend = (ts.TransBin==0) && (FileByte==0x0D);
940     FileRetrySend = (c==0);
941     if (FileRetrySend)
942     {
943     if (SendVar->ByteCount != BCOld)
944     SendDlg->RefreshNum();
945     return;
946     }
947     if (ts.LocalEcho>0)
948     {
949     c = FSEcho1(FileByte);
950     FileRetryEcho = (c==0);
951     if (FileRetryEcho)
952     return;
953     }
954     }
955     if ((fc==0) || (SendVar->ByteCount % 100 == 0))
956     {
957     SendDlg->RefreshNum();
958     BCOld = SendVar->ByteCount;
959     if (fc!=0)
960     return;
961     }
962     } while (fc!=0);
963    
964     FileTransEnd(OpSendFile);
965     }
966     }
967    
968     extern "C" {
969     void FLogChangeButton(BOOL Pause)
970     {
971     if (FLogDlg!=NULL)
972     FLogDlg->ChangeButton(Pause);
973     }
974     }
975    
976     extern "C" {
977     void FLogRefreshNum()
978     {
979     if (FLogDlg!=NULL)
980     FLogDlg->RefreshNum();
981     }
982     }
983    
984     BOOL OpenProtoDlg(PFileVar fv, int IdProto, int Mode, WORD Opt1, WORD Opt2)
985     {
986     int vsize;
987     PProtoDlg pd;
988     HWND Hpd;
989     char uimsg[MAX_UIMSG];
990    
991     ProtoId = IdProto;
992    
993     switch (ProtoId) {
994     case PROTO_KMT:
995     vsize = sizeof(TKmtVar);
996     break;
997     case PROTO_XM:
998     vsize = sizeof(TXVar);
999     break;
1000     case PROTO_YM:
1001     vsize = sizeof(TYVar);
1002     break;
1003     case PROTO_ZM:
1004     vsize = sizeof(TZVar);
1005     break;
1006     case PROTO_BP:
1007     vsize = sizeof(TBPVar);
1008     break;
1009     case PROTO_QV:
1010     vsize = sizeof(TQVVar);
1011     break;
1012     }
1013     ProtoVar = (PCHAR)malloc(vsize);
1014     if (ProtoVar==NULL)
1015     return FALSE;
1016    
1017     switch (ProtoId) {
1018     case PROTO_KMT:
1019     ((PKmtVar)ProtoVar)->KmtMode = Mode;
1020     break;
1021     case PROTO_XM:
1022     ((PXVar)ProtoVar)->XMode = Mode;
1023     ((PXVar)ProtoVar)->XOpt = Opt1;
1024     ((PXVar)ProtoVar)->TextFlag = 1 - (Opt2 & 1);
1025     break;
1026 yutakapon 3819 case PROTO_YM:
1027 maya 3227 ((PYVar)ProtoVar)->YMode = Mode;
1028 yutakapon 3819 ((PYVar)ProtoVar)->YOpt = Opt1;
1029 maya 3227 break;
1030     case PROTO_ZM:
1031     ((PZVar)ProtoVar)->BinFlag = (Opt1 & 1) != 0;
1032     ((PZVar)ProtoVar)->ZMode = Mode;
1033     break;
1034     case PROTO_BP:
1035     ((PBPVar)ProtoVar)->BPMode = Mode;
1036     break;
1037     case PROTO_QV:
1038     ((PQVVar)ProtoVar)->QVMode = Mode;
1039     break;
1040     }
1041    
1042     pd = new CProtoDlg();
1043     if (pd==NULL)
1044     {
1045     free(ProtoVar);
1046     ProtoVar = NULL;
1047     return FALSE;
1048     }
1049     pd->Create(fv,&ts);
1050    
1051     Hpd=pd->GetSafeHwnd();
1052    
1053     GetDlgItemText(Hpd, IDC_PROT_FILENAME, uimsg, sizeof(uimsg));
1054     get_lang_msg("DLG_PROT_FIELNAME", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1055     SetDlgItemText(Hpd, IDC_PROT_FILENAME, ts.UIMsg);
1056     GetDlgItemText(Hpd, IDC_PROT_PROT, uimsg, sizeof(uimsg));
1057     get_lang_msg("DLG_PROT_PROTO", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1058     SetDlgItemText(Hpd, IDC_PROT_PROT, ts.UIMsg);
1059     GetDlgItemText(Hpd, IDC_PROT_PACKET, uimsg, sizeof(uimsg));
1060     get_lang_msg("DLG_PROT_PACKET", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1061     SetDlgItemText(Hpd, IDC_PROT_PACKET, ts.UIMsg);
1062     GetDlgItemText(Hpd, IDC_PROT_TRANS, uimsg, sizeof(uimsg));
1063     get_lang_msg("DLG_PROT_TRANS", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1064     SetDlgItemText(Hpd, IDC_PROT_TRANS, ts.UIMsg);
1065     GetDlgItemText(Hpd, IDCANCEL, uimsg, sizeof(uimsg));
1066     get_lang_msg("BTN_CANCEL", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1067     SetDlgItemText(Hpd, IDCANCEL, ts.UIMsg);
1068    
1069     (*ProtoInit)(ProtoId,FileVar,ProtoVar,&cv,&ts);
1070    
1071     PtDlg = pd;
1072     return TRUE;
1073     }
1074    
1075     extern "C" {
1076     void CloseProtoDlg()
1077     {
1078     if (PtDlg!=NULL)
1079     {
1080     PtDlg->DestroyWindow();
1081     PtDlg = NULL;
1082    
1083     ::KillTimer(FileVar->HMainWin,IdProtoTimer);
1084     if ((ProtoId==PROTO_QV) &&
1085     (((PQVVar)ProtoVar)->QVMode==IdQVSend))
1086     CommTextOut(&cv,"\015",1);
1087     if (FileVar->LogFlag)
1088     _lclose(FileVar->LogFile);
1089     FileVar->LogFile = 0;
1090     if (ProtoVar!=NULL)
1091     {
1092     free(ProtoVar);
1093     ProtoVar = NULL;
1094     }
1095     }
1096     }
1097     }
1098    
1099     BOOL ProtoStart()
1100     {
1101     if (cv.ProtoFlag)
1102     return FALSE;
1103     if (FSend)
1104     {
1105     FreeFileVar(&FileVar);
1106     return FALSE;
1107     }
1108    
1109     if (! LoadTTFILE())
1110     return FALSE;
1111     NewFileVar(&FileVar);
1112    
1113     if (FileVar==NULL)
1114     {
1115     FreeTTFILE();
1116     return FALSE;
1117     }
1118     cv.ProtoFlag = TRUE;
1119     return TRUE;
1120     }
1121    
1122     void ProtoEnd()
1123     {
1124     if (! cv.ProtoFlag)
1125     return;
1126     cv.ProtoFlag = FALSE;
1127    
1128     /* Enable transmit delay (serial port) */
1129     cv.DelayFlag = TRUE;
1130     TalkStatus = IdTalkKeyb;
1131    
1132     CloseProtoDlg();
1133    
1134     if ((FileVar!=NULL) && FileVar->Success)
1135     EndDdeCmnd(1);
1136     else
1137     EndDdeCmnd(0);
1138    
1139     FreeTTFILE();
1140     FreeFileVar(&FileVar);
1141     }
1142    
1143     extern "C" {
1144     int ProtoDlgParse()
1145     {
1146     int P;
1147    
1148     P = ActiveWin;
1149     if (PtDlg==NULL)
1150     return P;
1151    
1152     if ((*ProtoParse)(ProtoId,FileVar,ProtoVar,&cv))
1153     P = 0; /* continue */
1154     else {
1155     CommSend(&cv);
1156     ProtoEnd();
1157     }
1158     return P;
1159     }
1160     }
1161    
1162     extern "C" {
1163     void ProtoDlgTimeOut()
1164     {
1165     if (PtDlg!=NULL)
1166     (*ProtoTimeOutProc)(ProtoId,FileVar,ProtoVar,&cv);
1167     }
1168     }
1169    
1170     extern "C" {
1171     void ProtoDlgCancel()
1172     {
1173     if ((PtDlg!=NULL) &&
1174     (*ProtoCancel)(ProtoId,FileVar,ProtoVar,&cv))
1175     ProtoEnd();
1176     }
1177     }
1178    
1179     extern "C" {
1180     void KermitStart(int mode)
1181     {
1182     WORD w;
1183    
1184     if (! ProtoStart())
1185     return;
1186    
1187     switch (mode) {
1188     case IdKmtSend:
1189     FileVar->OpId = OpKmtSend;
1190     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1191     {
1192     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_KERMIT,&w) ||
1193     (FileVar->NumFname==0))
1194     {
1195     ProtoEnd();
1196     return;
1197     }
1198     }
1199     else
1200     (*SetFileVar)(FileVar);
1201     break;
1202     case IdKmtReceive:
1203     FileVar->OpId = OpKmtRcv;
1204     break;
1205     case IdKmtGet:
1206     FileVar->OpId = OpKmtSend;
1207     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1208     {
1209     if (! (*GetGetFname)(FileVar->HMainWin,FileVar) ||
1210     (strlen(FileVar->FullName)==0))
1211     {
1212     ProtoEnd();
1213     return;
1214     }
1215     }
1216     else
1217     (*SetFileVar)(FileVar);
1218     break;
1219     case IdKmtFinish:
1220     FileVar->OpId = OpKmtFin;
1221     break;
1222     default:
1223     ProtoEnd();
1224     return;
1225     }
1226     TalkStatus = IdTalkQuiet;
1227    
1228     /* disable transmit delay (serial port) */
1229     cv.DelayFlag = FALSE;
1230    
1231     if (! OpenProtoDlg(FileVar,PROTO_KMT,mode,0,0))
1232     ProtoEnd();
1233     }
1234     }
1235    
1236     extern "C" {
1237     void XMODEMStart(int mode)
1238     {
1239     LONG Option;
1240    
1241     if (! ProtoStart())
1242     return;
1243    
1244     if (mode==IdXReceive)
1245     FileVar->OpId = OpXRcv;
1246     else
1247     FileVar->OpId = OpXSend;
1248    
1249     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1250     {
1251     Option = MAKELONG(ts.XmodemBin,ts.XmodemOpt);
1252     if (! (*GetXFname)(FileVar->HMainWin,
1253     mode==IdXReceive,&Option,FileVar,ts.FileDir))
1254     {
1255     ProtoEnd();
1256     return;
1257     }
1258     ts.XmodemOpt = HIWORD(Option);
1259     ts.XmodemBin = LOWORD(Option);
1260     }
1261     else
1262     (*SetFileVar)(FileVar);
1263    
1264     if (mode==IdXReceive)
1265     FileVar->FileHandle = _lcreat(FileVar->FullName,0);
1266     else
1267     FileVar->FileHandle = _lopen(FileVar->FullName,OF_READ);
1268    
1269     FileVar->FileOpen = FileVar->FileHandle>0;
1270     if (! FileVar->FileOpen)
1271     {
1272     ProtoEnd();
1273     return;
1274     }
1275     TalkStatus = IdTalkQuiet;
1276    
1277     /* disable transmit delay (serial port) */
1278     cv.DelayFlag = FALSE;
1279    
1280     if (! OpenProtoDlg(FileVar,PROTO_XM,mode,
1281     ts.XmodemOpt,ts.XmodemBin))
1282     ProtoEnd();
1283     }
1284     }
1285    
1286     extern "C" {
1287     void YMODEMStart(int mode)
1288     {
1289     WORD Opt;
1290    
1291     if (! ProtoStart())
1292     return;
1293    
1294     if (mode==IdYSend)
1295     {
1296 yutakapon 3819 // �t�@�C���]�������I�v�V������"Yopt1K"�����������B
1297     // TODO: "Yopt1K", "YoptG", "YoptSingle"�������������������AIDD_FOPT���g�������K�v�����B
1298     Opt = Yopt1K;
1299 maya 3227 FileVar->OpId = OpYSend;
1300     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1301     {
1302     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Y,&Opt) ||
1303     (FileVar->NumFname==0))
1304     {
1305     ProtoEnd();
1306     return;
1307     }
1308 yutakapon 3819 //ts.XmodemBin = Opt;
1309 maya 3227 }
1310     else
1311     (*SetFileVar)(FileVar);
1312     }
1313 yutakapon 3820 else {/* IdZReceive or IdZAuto */
1314 maya 3227 FileVar->OpId = OpYRcv;
1315 yutakapon 3820 // �t�@�C���]�������I�v�V������"Yopt1K"�����������B
1316     Opt = Yopt1K;
1317 yutakapon 3821 (*SetFileVar)(FileVar);
1318 yutakapon 3820 }
1319 maya 3227
1320     TalkStatus = IdTalkQuiet;
1321    
1322     /* disable transmit delay (serial port) */
1323     cv.DelayFlag = FALSE;
1324    
1325     if (! OpenProtoDlg(FileVar,PROTO_YM,mode,Opt,0))
1326     ProtoEnd();
1327     }
1328     }
1329    
1330     extern "C" {
1331     void ZMODEMStart(int mode)
1332     {
1333     WORD Opt;
1334    
1335     if (! ProtoStart())
1336     return;
1337    
1338     if (mode==IdZSend)
1339     {
1340     Opt = ts.XmodemBin;
1341     FileVar->OpId = OpZSend;
1342     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1343     {
1344     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Z,&Opt) ||
1345     (FileVar->NumFname==0))
1346     {
1347     ProtoEnd();
1348     return;
1349     }
1350     ts.XmodemBin = Opt;
1351     }
1352     else
1353     (*SetFileVar)(FileVar);
1354     }
1355     else /* IdZReceive or IdZAuto */
1356     FileVar->OpId = OpZRcv;
1357    
1358     TalkStatus = IdTalkQuiet;
1359    
1360     /* disable transmit delay (serial port) */
1361     cv.DelayFlag = FALSE;
1362    
1363     if (! OpenProtoDlg(FileVar,PROTO_ZM,mode,Opt,0))
1364     ProtoEnd();
1365     }
1366     }
1367    
1368     extern "C" {
1369     void BPStart(int mode)
1370     {
1371     LONG Option;
1372    
1373     if (! ProtoStart())
1374     return;
1375     if (mode==IdBPSend)
1376     {
1377     FileVar->OpId = OpBPSend;
1378     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1379     {
1380     FileVar->FullName[0] = 0;
1381     if (! (*GetTransFname)(FileVar, ts.FileDir, GTF_BP, &Option))
1382     {
1383     ProtoEnd();
1384     return;
1385     }
1386     }
1387     else
1388     (*SetFileVar)(FileVar);
1389     }
1390     else /* IdBPReceive or IdBPAuto */
1391     FileVar->OpId = OpBPRcv;
1392    
1393     TalkStatus = IdTalkQuiet;
1394    
1395     /* disable transmit delay (serial port) */
1396     cv.DelayFlag = FALSE;
1397    
1398     if (! OpenProtoDlg(FileVar,PROTO_BP,mode,0,0))
1399     ProtoEnd();
1400     }
1401     }
1402    
1403     extern "C" {
1404     void QVStart(int mode)
1405     {
1406     WORD W;
1407    
1408     if (! ProtoStart())
1409     return;
1410    
1411     if (mode==IdQVSend)
1412     {
1413     FileVar->OpId = OpQVSend;
1414     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1415     {
1416     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_QV, &W) ||
1417     (FileVar->NumFname==0))
1418     {
1419     ProtoEnd();
1420     return;
1421     }
1422     }
1423     else
1424     (*SetFileVar)(FileVar);
1425     }
1426     else
1427     FileVar->OpId = OpQVRcv;
1428    
1429     TalkStatus = IdTalkQuiet;
1430    
1431     /* disable transmit delay (serial port) */
1432     cv.DelayFlag = FALSE;
1433    
1434     if (! OpenProtoDlg(FileVar,PROTO_QV,mode,0,0))
1435     ProtoEnd();
1436     }
1437     }

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