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 3904 - (hide annotations) (download) (as text)
Sat May 22 06:57:02 2010 UTC (13 years, 10 months ago) by doda
Original Path: trunk/teraterm/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 32110 byte(s)
ファイル送信も Bracketed Paste Mode の適用対象に。

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

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