Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /branches/ttcomtester/teraterm/teraterm/filesys_log.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5165 - (hide annotations) (download) (as text)
Sat Mar 23 10:39:50 2013 UTC (11 years ago) by yutakapon
Original Path: trunk/teraterm/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 34670 byte(s)
logrotate マクロコマンドに世代数を指定できるようにした。

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

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