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

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