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 2576 - (hide annotations) (download) (as text)
Fri Aug 8 01:28:34 2008 UTC (15 years, 8 months ago) by doda
Original Path: teraterm/trunk/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 28180 byte(s)
ファイル送信時のダイアログボックスにプログレスバーを表示するようにした。

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

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