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 2602 - (hide annotations) (download) (as text)
Fri Oct 31 23:45:27 2008 UTC (15 years, 5 months ago) by maya
Original Path: teraterm/trunk/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 28305 byte(s)
ログで Binary が有効なときは Plain text と Timestamp を無効にするようにした。

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

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