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 2557 - (hide annotations) (download) (as text)
Tue Jul 8 16:43:56 2008 UTC (15 years, 9 months ago) by yutakapon
Original Path: teraterm/trunk/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 27982 byte(s)
ログファイルがオープンできない場合に、エラーメッセージ表示するようにした。ただし、マクロからlogopenした場合は
何も表示しない。

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

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