Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /trunk/teraterm/teraterm/filesys.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5171 - (hide annotations) (download) (as text)
Sun Mar 24 10:55:37 2013 UTC (11 years ago) by yutakapon
File MIME type: text/x-c++src
File size: 34783 byte(s)
ログ・ローテートの設定を Additional settings ダイアログから行えるようにした。

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 5171 // Log rotate configuration
536     LogVar->RotateMode = ts.LogRotate;
537     LogVar->RotateSize = ts.LogRotateSize;
538     LogVar->RotateStep = ts.LogRotateStep;
539 yutakapon 5162
540 maya 3227 if (! OpenFTDlg(LogVar)) {
541     FileTransEnd(OpLog);
542     return FALSE;
543     }
544    
545     return TRUE;
546     }
547     }
548    
549     void LogPut1(BYTE b)
550     {
551     LogLast = b;
552     cv.LogBuf[cv.LogPtr] = b;
553     cv.LogPtr++;
554     if (cv.LogPtr>=InBuffSize)
555     cv.LogPtr = cv.LogPtr-InBuffSize;
556    
557     if (FileLog)
558     {
559     if (cv.LCount>=InBuffSize)
560     {
561     cv.LCount = InBuffSize;
562     cv.LStart = cv.LogPtr;
563     }
564     else
565     cv.LCount++;
566     }
567     else
568     cv.LCount = 0;
569    
570     if (DDELog)
571     {
572     if (cv.DCount>=InBuffSize)
573     {
574     cv.DCount = InBuffSize;
575     cv.DStart = cv.LogPtr;
576     }
577     else
578     cv.DCount++;
579     }
580     else {
581     cv.DCount = 0;
582     // ���O���������}�N�����X�g�[���������������C���B
583     // ���O�����������x�}�N�����~�������A�o�b�t�@���C���f�b�N�X�������������������A
584     // ���x�}�N�������������������f�[�^�������������������B
585     // �}�N�������~���������������C���f�b�N�X�����������������������B
586     // (2006.12.26 yutaka)
587     cv.DStart = cv.LogPtr;
588     }
589     }
590    
591     void Log1Byte(BYTE b)
592     {
593     if (b==0x0d)
594     {
595     LogLast = b;
596     return;
597     }
598     if ((b==0x0a) && (LogLast==0x0d))
599     LogPut1(0x0d);
600     LogPut1(b);
601     }
602    
603     static BOOL Get1(PCHAR Buf, int *Start, int *Count, PBYTE b)
604     {
605     if (*Count<=0) return FALSE;
606     *b = Buf[*Start];
607     (*Start)++;
608     if (*Start>=InBuffSize)
609     *Start = *Start-InBuffSize;
610     (*Count)--;
611     return TRUE;
612     }
613    
614    
615    
616     static CRITICAL_SECTION g_filelog_lock; /* ���b�N�p���� */
617    
618     void logfile_lock_initialize(void)
619     {
620     InitializeCriticalSection(&g_filelog_lock);
621     }
622    
623     static inline void logfile_lock(void)
624     {
625     EnterCriticalSection(&g_filelog_lock);
626     }
627    
628     static inline void logfile_unlock(void)
629     {
630     LeaveCriticalSection(&g_filelog_lock);
631     }
632    
633     // �R�����g�����O����������
634     void CommentLogToFile(char *buf, int size)
635     {
636     DWORD wrote;
637    
638     if (LogVar == NULL || !LogVar->FileOpen) {
639     char uimsg[MAX_UIMSG];
640     get_lang_msg("MSG_ERROR", uimsg, sizeof(uimsg), "ERROR", ts.UILanguageFile);
641     get_lang_msg("MSG_COMMENT_LOG_OPEN_ERROR", ts.UIMsg, sizeof(ts.UIMsg),
642     "It is not opened by the log file yet.", ts.UILanguageFile);
643     ::MessageBox(NULL, ts.UIMsg, uimsg, MB_OK|MB_ICONEXCLAMATION);
644     return;
645     }
646    
647     logfile_lock();
648     WriteFile((HANDLE)LogVar->FileHandle, buf, size, &wrote, NULL);
649     WriteFile((HANDLE)LogVar->FileHandle, "\r\n", 2, &wrote, NULL); // ���s
650     /* Set Line End Flag
651     2007.05.24 Gentaro
652     */
653     eLineEnd = Line_LineHead;
654     logfile_unlock();
655     }
656    
657 yutakapon 5162 // ���O�����[�e�[�g�����B
658     // (2013.3.21 yutaka)
659     static void LogRotate(void)
660     {
661 yutakapon 5165 int loopmax = 10000; // XXX
662 yutakapon 5162 char filename[1024];
663 yutakapon 5165 char newfile[1024], oldfile[1024];
664     int i, k;
665 yutakapon 5162 int dwShareMode = 0;
666    
667     if (! LogVar->FileOpen) return;
668    
669     if (LogVar->RotateMode == ROTATE_NONE)
670     return;
671    
672     if (LogVar->RotateMode == ROTATE_SIZE) {
673     if (LogVar->ByteCount <= LogVar->RotateSize)
674     return;
675     //OutputDebugPrintf("%s: mode %d size %ld\n", __FUNCTION__, LogVar->RotateMode, LogVar->ByteCount);
676     } else {
677     return;
678     }
679    
680     logfile_lock();
681     // ���O�T�C�Y���������������B
682     LogVar->ByteCount = 0;
683    
684     // �������������t�@�C�����N���[�Y�����A�������t�@�C�����I�[�v�������B
685     _lclose(LogVar->FileHandle);
686    
687 yutakapon 5165 // �������[�e�[�V�������X�e�b�v�����w����������
688     if (LogVar->RotateStep > 0)
689     loopmax = LogVar->RotateStep;
690    
691     for (i = 1 ; i <= loopmax ; i++) {
692 yutakapon 5162 _snprintf_s(filename, sizeof(filename), _TRUNCATE, "%s.%d", LogVar->FullName, i);
693     if (_access_s(filename, 0) != 0)
694     break;
695     }
696 yutakapon 5165 if (i > loopmax) {
697     // �������������������������A�������t�@�C�������p�������B
698     i = loopmax;
699 yutakapon 5162 }
700    
701     // ���t�@�C�������l�[���B
702 yutakapon 5165 for (k = i-1 ; k >= 0 ; k--) {
703     if (k == 0)
704     strncpy_s(oldfile, sizeof(oldfile), LogVar->FullName, _TRUNCATE);
705     else
706     _snprintf_s(oldfile, sizeof(oldfile), _TRUNCATE, "%s.%d", LogVar->FullName, k);
707     _snprintf_s(newfile, sizeof(newfile), _TRUNCATE, "%s.%d", LogVar->FullName, k+1);
708     remove(newfile);
709     if (rename(oldfile, newfile) != 0) {
710     OutputDebugPrintf("%s: rename %d\n", __FUNCTION__, errno);
711     }
712     }
713 yutakapon 5162
714     // ���I�[�v��
715     if (ts.LogLockExclusive) {
716     dwShareMode = FILE_SHARE_READ;
717     }
718     LogVar->FileHandle = (int)CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
719     CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
720    
721     logfile_unlock();
722    
723     }
724    
725 maya 3227 void LogToFile()
726     {
727     PCHAR Buf;
728     int Start, Count;
729     BYTE b;
730    
731     if (! LogVar->FileOpen) return;
732     if (FileLog)
733     {
734     Buf = cv.LogBuf;
735     Start = cv.LStart;
736     Count = cv.LCount;
737     }
738     else if (BinLog)
739     {
740     Buf = cv.BinBuf;
741     Start = cv.BStart;
742     Count = cv.BCount;
743     }
744     else
745     return;
746    
747     if (Buf==NULL) return;
748     if (Count==0) return;
749    
750     // ���b�N������(2004.8.6 yutaka)
751     logfile_lock();
752    
753     while (Get1(Buf,&Start,&Count,&b))
754     {
755     if (((cv.FilePause & OpLog)==0) && (! cv.ProtoFlag))
756     {
757     // �����������o��(2006.7.23 maya)
758     // ���t�t�H�[�}�b�g�����{�����������E�W�������X���� (2006.7.23 yutaka)
759     /* 2007.05.24 Gentaro */
760 maya 4551 // �~���b���\���������������X (2009.5.23 maya)
761 maya 3227 if ( ts.LogTimestamp && eLineEnd ) {
762 maya 3418 #if 1
763 maya 3227 #if 0
764     SYSTEMTIME LocalTime;
765     GetLocalTime(&LocalTime);
766     char strtime[27];
767    
768     // format time
769     sprintf(strtime, "[%04d/%02d/%02d %02d:%02d:%02d.%03d] ",
770     LocalTime.wYear, LocalTime.wMonth,LocalTime.wDay,
771     LocalTime.wHour, LocalTime.wMinute, LocalTime.wSecond,
772     LocalTime.wMilliseconds);
773     #else
774 maya 4551 char *strtime = mctimelocal();
775 maya 3418 #endif
776     #else
777 maya 3227 time_t tick = time(NULL);
778     char *strtime = ctime(&tick);
779     #endif
780     /* 2007.05.24 Gentaro */
781     if( eLineEnd == Line_FileHead ){
782     _lwrite(LogVar->FileHandle,"\r\n",2);
783     }
784     _lwrite(LogVar->FileHandle,"[",1);
785 maya 3418 _lwrite(LogVar->FileHandle, strtime, strlen(strtime));
786 maya 3227 _lwrite(LogVar->FileHandle,"] ",2);
787     }
788    
789     /* 2007.05.24 Gentaro */
790     if( b == 0x0a ){
791     eLineEnd = Line_LineHead; /* set endmark*/
792     }
793     else {
794     eLineEnd = Line_Other; /* clear endmark*/
795     }
796    
797     _lwrite(LogVar->FileHandle,(PCHAR)&b,1);
798     (LogVar->ByteCount)++;
799     }
800     }
801    
802     logfile_unlock();
803    
804     if (FileLog)
805     {
806     cv.LStart = Start;
807     cv.LCount = Count;
808     }
809     else {
810     cv.BStart = Start;
811     cv.BCount = Count;
812     }
813     if (((cv.FilePause & OpLog) !=0) || cv.ProtoFlag) return;
814     if (FLogDlg!=NULL)
815     FLogDlg->RefreshNum();
816 yutakapon 5162
817     // ���O�E���[�e�[�g
818     LogRotate();
819    
820 maya 3227 }
821    
822     BOOL CreateLogBuf()
823     {
824     if (cv.HLogBuf==NULL)
825     {
826     cv.HLogBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
827     cv.LogBuf = NULL;
828     cv.LogPtr = 0;
829     cv.LStart = 0;
830     cv.LCount = 0;
831     cv.DStart = 0;
832     cv.DCount = 0;
833     }
834     return (cv.HLogBuf!=NULL);
835     }
836    
837     void FreeLogBuf()
838     {
839     if ((cv.HLogBuf==NULL) || FileLog || DDELog)
840     return;
841     if (cv.LogBuf!=NULL)
842     GlobalUnlock(cv.HLogBuf);
843     GlobalFree(cv.HLogBuf);
844     cv.HLogBuf = NULL;
845     cv.LogBuf = NULL;
846     cv.LogPtr = 0;
847     cv.LStart = 0;
848     cv.LCount = 0;
849     cv.DStart = 0;
850     cv.DCount = 0;
851     }
852    
853     BOOL CreateBinBuf()
854     {
855     if (cv.HBinBuf==NULL)
856     {
857     cv.HBinBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
858     cv.BinBuf = NULL;
859     cv.BinPtr = 0;
860     cv.BStart = 0;
861     cv.BCount = 0;
862     }
863     return (cv.HBinBuf!=NULL);
864     }
865    
866     void FreeBinBuf()
867     {
868     if ((cv.HBinBuf==NULL) || BinLog)
869     return;
870     if (cv.BinBuf!=NULL)
871     GlobalUnlock(cv.HBinBuf);
872     GlobalFree(cv.HBinBuf);
873     cv.HBinBuf = NULL;
874     cv.BinBuf = NULL;
875     cv.BinPtr = 0;
876     cv.BStart = 0;
877     cv.BCount = 0;
878     }
879    
880     extern "C" {
881     void FileSendStart()
882     {
883     LONG Option;
884    
885     if (! cv.Ready || FSend) return;
886     if (cv.ProtoFlag)
887     {
888     FreeFileVar(&SendVar);
889     return;
890     }
891    
892     if (! LoadTTFILE())
893     return;
894     if (! NewFileVar(&SendVar))
895     {
896     FreeTTFILE();
897     return;
898     }
899     SendVar->OpId = OpSendFile;
900    
901     FSend = TRUE;
902    
903     if (strlen(&(SendVar->FullName[SendVar->DirLen]))==0)
904     {
905     Option = MAKELONG(ts.TransBin,0);
906     SendVar->FullName[0] = 0;
907     if (! (*GetTransFname)(SendVar, ts.FileDir, GTF_SEND, &Option))
908     {
909     FileTransEnd(OpSendFile);
910     return;
911     }
912     ts.TransBin = LOWORD(Option);
913     }
914     else
915     (*SetFileVar)(SendVar);
916    
917     SendVar->FileHandle = _lopen(SendVar->FullName,OF_READ);
918     SendVar->FileOpen = (SendVar->FileHandle>0);
919     if (! SendVar->FileOpen)
920     {
921     FileTransEnd(OpSendFile);
922     return;
923     }
924     SendVar->ByteCount = 0;
925     SendVar->FileSize = GetFSize(SendVar->FullName);
926    
927     TalkStatus = IdTalkFile;
928     FileRetrySend = FALSE;
929     FileRetryEcho = FALSE;
930     FileCRSend = FALSE;
931 doda 3904 FileReadEOF = FALSE;
932 maya 3227
933 doda 3904 if (BracketedPasteMode()) {
934     FileBracketMode = FS_BRACKET_START;
935     FileBracketPtr = 0;
936     BinaryMode = TRUE;
937     }
938     else {
939     FileBracketMode = FS_BRACKET_NONE;
940     BinaryMode = ts.TransBin;
941     }
942    
943 maya 3227 if (! OpenFTDlg(SendVar))
944     FileTransEnd(OpSendFile);
945     }
946     }
947    
948     void FileTransEnd(WORD OpId)
949     /* OpId = 0: close Log and FileSend
950     OpLog: close Log
951     OpSendFile: close FileSend */
952     {
953     if (((OpId==0) || (OpId==OpLog)) && (FileLog || BinLog))
954     {
955     FileLog = FALSE;
956     BinLog = FALSE;
957     if (FLogDlg!=NULL)
958     {
959     FLogDlg->DestroyWindow();
960     FLogDlg = NULL;
961     HWndLog = NULL; // steven add
962     }
963     FreeFileVar(&LogVar);
964     FreeLogBuf();
965     FreeBinBuf();
966     FreeTTFILE();
967     }
968    
969     if (((OpId==0) || (OpId==OpSendFile)) && FSend)
970     {
971     FSend = FALSE;
972     TalkStatus = IdTalkKeyb;
973     if (SendDlg!=NULL)
974     {
975     SendDlg->DestroyWindow();
976     SendDlg = NULL;
977     }
978     FreeFileVar(&SendVar);
979     FreeTTFILE();
980     }
981    
982     EndDdeCmnd(0);
983     }
984    
985     int FSOut1(BYTE b)
986     {
987 doda 3904 if (BinaryMode)
988 maya 3227 return CommBinaryOut(&cv,(PCHAR)&b,1);
989     else if ((b>=0x20) || (b==0x09) || (b==0x0A) || (b==0x0D))
990     return CommTextOut(&cv,(PCHAR)&b,1);
991     else
992     return 1;
993 doda 3861 }
994 maya 3227
995     int FSEcho1(BYTE b)
996     {
997 doda 3904 if (BinaryMode)
998 maya 3227 return CommBinaryEcho(&cv,(PCHAR)&b,1);
999     else
1000     return CommTextEcho(&cv,(PCHAR)&b,1);
1001     }
1002    
1003     extern "C" {
1004     void FileSend()
1005     {
1006     WORD c, fc;
1007     LONG BCOld;
1008    
1009     if ((SendDlg==NULL) ||
1010     ((cv.FilePause & OpSendFile) !=0))
1011     return;
1012    
1013     BCOld = SendVar->ByteCount;
1014    
1015     if (FileRetrySend)
1016     {
1017     FileRetryEcho = (ts.LocalEcho>0);
1018     c = FSOut1(FileByte);
1019     FileRetrySend = (c==0);
1020     if (FileRetrySend)
1021     return;
1022     }
1023    
1024     if (FileRetryEcho)
1025     {
1026     c = FSEcho1(FileByte);
1027     FileRetryEcho = (c==0);
1028     if (FileRetryEcho)
1029     return;
1030     }
1031    
1032     do {
1033 doda 3904 if (FileBracketMode == FS_BRACKET_START) {
1034     FileByte = BracketStartStr[FileBracketPtr++];
1035     fc = 1;
1036 maya 3227
1037 doda 3904 if (FileBracketPtr >= sizeof(BracketStartStr) - 1) {
1038     FileBracketMode = FS_BRACKET_END;
1039     FileBracketPtr = 0;
1040     BinaryMode = ts.TransBin;
1041     }
1042     }
1043     else if (! FileReadEOF) {
1044 maya 3227 fc = _lread(SendVar->FileHandle,&FileByte,1);
1045     SendVar->ByteCount = SendVar->ByteCount + fc;
1046 doda 3904
1047     if (FileCRSend && (fc==1) && (FileByte==0x0A)) {
1048     fc = _lread(SendVar->FileHandle,&FileByte,1);
1049     SendVar->ByteCount = SendVar->ByteCount + fc;
1050     }
1051 maya 3227 }
1052 doda 3904 else {
1053     fc = 0;
1054     }
1055 maya 3227
1056 doda 3904 if (fc == 0 && FileBracketMode == FS_BRACKET_END) {
1057     FileReadEOF = TRUE;
1058     FileByte = BracketEndStr[FileBracketPtr++];
1059     fc = 1;
1060     BinaryMode = TRUE;
1061    
1062     if (FileBracketPtr >= sizeof(BracketEndStr) - 1) {
1063     FileBracketMode = FS_BRACKET_NONE;
1064     FileBracketPtr = 0;
1065     }
1066     }
1067    
1068    
1069 maya 3227 if (fc!=0)
1070     {
1071     c = FSOut1(FileByte);
1072     FileCRSend = (ts.TransBin==0) && (FileByte==0x0D);
1073     FileRetrySend = (c==0);
1074     if (FileRetrySend)
1075     {
1076     if (SendVar->ByteCount != BCOld)
1077     SendDlg->RefreshNum();
1078     return;
1079     }
1080     if (ts.LocalEcho>0)
1081     {
1082     c = FSEcho1(FileByte);
1083     FileRetryEcho = (c==0);
1084     if (FileRetryEcho)
1085     return;
1086     }
1087     }
1088 doda 3904 if ((fc==0) || ((SendVar->ByteCount % 100 == 0) && (FileBracketPtr == 0))) {
1089 maya 3227 SendDlg->RefreshNum();
1090     BCOld = SendVar->ByteCount;
1091     if (fc!=0)
1092     return;
1093     }
1094     } while (fc!=0);
1095    
1096     FileTransEnd(OpSendFile);
1097     }
1098     }
1099    
1100     extern "C" {
1101     void FLogChangeButton(BOOL Pause)
1102     {
1103     if (FLogDlg!=NULL)
1104     FLogDlg->ChangeButton(Pause);
1105     }
1106     }
1107    
1108     extern "C" {
1109     void FLogRefreshNum()
1110     {
1111     if (FLogDlg!=NULL)
1112     FLogDlg->RefreshNum();
1113     }
1114     }
1115    
1116     BOOL OpenProtoDlg(PFileVar fv, int IdProto, int Mode, WORD Opt1, WORD Opt2)
1117     {
1118     int vsize;
1119     PProtoDlg pd;
1120     HWND Hpd;
1121     char uimsg[MAX_UIMSG];
1122    
1123     ProtoId = IdProto;
1124    
1125     switch (ProtoId) {
1126     case PROTO_KMT:
1127     vsize = sizeof(TKmtVar);
1128     break;
1129     case PROTO_XM:
1130     vsize = sizeof(TXVar);
1131     break;
1132     case PROTO_YM:
1133     vsize = sizeof(TYVar);
1134     break;
1135     case PROTO_ZM:
1136     vsize = sizeof(TZVar);
1137     break;
1138     case PROTO_BP:
1139     vsize = sizeof(TBPVar);
1140     break;
1141     case PROTO_QV:
1142     vsize = sizeof(TQVVar);
1143     break;
1144     }
1145     ProtoVar = (PCHAR)malloc(vsize);
1146     if (ProtoVar==NULL)
1147     return FALSE;
1148    
1149     switch (ProtoId) {
1150     case PROTO_KMT:
1151     ((PKmtVar)ProtoVar)->KmtMode = Mode;
1152     break;
1153     case PROTO_XM:
1154     ((PXVar)ProtoVar)->XMode = Mode;
1155     ((PXVar)ProtoVar)->XOpt = Opt1;
1156     ((PXVar)ProtoVar)->TextFlag = 1 - (Opt2 & 1);
1157     break;
1158 yutakapon 3819 case PROTO_YM:
1159 maya 3227 ((PYVar)ProtoVar)->YMode = Mode;
1160 yutakapon 3819 ((PYVar)ProtoVar)->YOpt = Opt1;
1161 maya 3227 break;
1162     case PROTO_ZM:
1163     ((PZVar)ProtoVar)->BinFlag = (Opt1 & 1) != 0;
1164     ((PZVar)ProtoVar)->ZMode = Mode;
1165     break;
1166     case PROTO_BP:
1167     ((PBPVar)ProtoVar)->BPMode = Mode;
1168     break;
1169     case PROTO_QV:
1170     ((PQVVar)ProtoVar)->QVMode = Mode;
1171     break;
1172     }
1173    
1174     pd = new CProtoDlg();
1175     if (pd==NULL)
1176     {
1177     free(ProtoVar);
1178     ProtoVar = NULL;
1179     return FALSE;
1180     }
1181     pd->Create(fv,&ts);
1182    
1183     Hpd=pd->GetSafeHwnd();
1184    
1185     GetDlgItemText(Hpd, IDC_PROT_FILENAME, uimsg, sizeof(uimsg));
1186     get_lang_msg("DLG_PROT_FIELNAME", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1187     SetDlgItemText(Hpd, IDC_PROT_FILENAME, ts.UIMsg);
1188     GetDlgItemText(Hpd, IDC_PROT_PROT, uimsg, sizeof(uimsg));
1189     get_lang_msg("DLG_PROT_PROTO", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1190     SetDlgItemText(Hpd, IDC_PROT_PROT, ts.UIMsg);
1191     GetDlgItemText(Hpd, IDC_PROT_PACKET, uimsg, sizeof(uimsg));
1192     get_lang_msg("DLG_PROT_PACKET", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1193     SetDlgItemText(Hpd, IDC_PROT_PACKET, ts.UIMsg);
1194     GetDlgItemText(Hpd, IDC_PROT_TRANS, uimsg, sizeof(uimsg));
1195     get_lang_msg("DLG_PROT_TRANS", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1196     SetDlgItemText(Hpd, IDC_PROT_TRANS, ts.UIMsg);
1197 doda 4461 GetDlgItemText(Hpd, IDC_PROT_ELAPSED, uimsg, sizeof(uimsg));
1198     get_lang_msg("DLG_PROT_ELAPSED", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1199     SetDlgItemText(Hpd, IDC_PROT_ELAPSED, ts.UIMsg);
1200 maya 3227 GetDlgItemText(Hpd, IDCANCEL, uimsg, sizeof(uimsg));
1201     get_lang_msg("BTN_CANCEL", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1202     SetDlgItemText(Hpd, IDCANCEL, ts.UIMsg);
1203    
1204     (*ProtoInit)(ProtoId,FileVar,ProtoVar,&cv,&ts);
1205    
1206     PtDlg = pd;
1207     return TRUE;
1208     }
1209    
1210     extern "C" {
1211     void CloseProtoDlg()
1212     {
1213     if (PtDlg!=NULL)
1214     {
1215     PtDlg->DestroyWindow();
1216     PtDlg = NULL;
1217    
1218     ::KillTimer(FileVar->HMainWin,IdProtoTimer);
1219     if ((ProtoId==PROTO_QV) &&
1220     (((PQVVar)ProtoVar)->QVMode==IdQVSend))
1221     CommTextOut(&cv,"\015",1);
1222     if (FileVar->LogFlag)
1223     _lclose(FileVar->LogFile);
1224     FileVar->LogFile = 0;
1225     if (ProtoVar!=NULL)
1226     {
1227     free(ProtoVar);
1228     ProtoVar = NULL;
1229     }
1230     }
1231     }
1232     }
1233    
1234     BOOL ProtoStart()
1235     {
1236     if (cv.ProtoFlag)
1237     return FALSE;
1238     if (FSend)
1239     {
1240     FreeFileVar(&FileVar);
1241     return FALSE;
1242     }
1243    
1244     if (! LoadTTFILE())
1245     return FALSE;
1246     NewFileVar(&FileVar);
1247    
1248     if (FileVar==NULL)
1249     {
1250     FreeTTFILE();
1251     return FALSE;
1252     }
1253     cv.ProtoFlag = TRUE;
1254     return TRUE;
1255     }
1256    
1257     void ProtoEnd()
1258     {
1259     if (! cv.ProtoFlag)
1260     return;
1261     cv.ProtoFlag = FALSE;
1262    
1263     /* Enable transmit delay (serial port) */
1264     cv.DelayFlag = TRUE;
1265     TalkStatus = IdTalkKeyb;
1266    
1267     CloseProtoDlg();
1268    
1269     if ((FileVar!=NULL) && FileVar->Success)
1270     EndDdeCmnd(1);
1271     else
1272     EndDdeCmnd(0);
1273    
1274     FreeTTFILE();
1275     FreeFileVar(&FileVar);
1276     }
1277    
1278     extern "C" {
1279     int ProtoDlgParse()
1280     {
1281     int P;
1282    
1283     P = ActiveWin;
1284     if (PtDlg==NULL)
1285     return P;
1286    
1287     if ((*ProtoParse)(ProtoId,FileVar,ProtoVar,&cv))
1288     P = 0; /* continue */
1289     else {
1290     CommSend(&cv);
1291     ProtoEnd();
1292     }
1293     return P;
1294     }
1295     }
1296    
1297     extern "C" {
1298     void ProtoDlgTimeOut()
1299     {
1300     if (PtDlg!=NULL)
1301     (*ProtoTimeOutProc)(ProtoId,FileVar,ProtoVar,&cv);
1302     }
1303     }
1304    
1305     extern "C" {
1306     void ProtoDlgCancel()
1307     {
1308     if ((PtDlg!=NULL) &&
1309     (*ProtoCancel)(ProtoId,FileVar,ProtoVar,&cv))
1310     ProtoEnd();
1311     }
1312     }
1313    
1314     extern "C" {
1315     void KermitStart(int mode)
1316     {
1317     WORD w;
1318    
1319     if (! ProtoStart())
1320     return;
1321    
1322     switch (mode) {
1323     case IdKmtSend:
1324     FileVar->OpId = OpKmtSend;
1325     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1326     {
1327     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_KERMIT,&w) ||
1328     (FileVar->NumFname==0))
1329     {
1330     ProtoEnd();
1331     return;
1332     }
1333     }
1334     else
1335     (*SetFileVar)(FileVar);
1336     break;
1337     case IdKmtReceive:
1338     FileVar->OpId = OpKmtRcv;
1339     break;
1340     case IdKmtGet:
1341     FileVar->OpId = OpKmtSend;
1342     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1343     {
1344     if (! (*GetGetFname)(FileVar->HMainWin,FileVar) ||
1345     (strlen(FileVar->FullName)==0))
1346     {
1347     ProtoEnd();
1348     return;
1349     }
1350     }
1351     else
1352     (*SetFileVar)(FileVar);
1353     break;
1354     case IdKmtFinish:
1355     FileVar->OpId = OpKmtFin;
1356     break;
1357     default:
1358     ProtoEnd();
1359     return;
1360     }
1361     TalkStatus = IdTalkQuiet;
1362    
1363     /* disable transmit delay (serial port) */
1364     cv.DelayFlag = FALSE;
1365    
1366     if (! OpenProtoDlg(FileVar,PROTO_KMT,mode,0,0))
1367     ProtoEnd();
1368     }
1369     }
1370    
1371     extern "C" {
1372     void XMODEMStart(int mode)
1373     {
1374     LONG Option;
1375    
1376     if (! ProtoStart())
1377     return;
1378    
1379     if (mode==IdXReceive)
1380     FileVar->OpId = OpXRcv;
1381     else
1382     FileVar->OpId = OpXSend;
1383    
1384     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1385     {
1386     Option = MAKELONG(ts.XmodemBin,ts.XmodemOpt);
1387     if (! (*GetXFname)(FileVar->HMainWin,
1388     mode==IdXReceive,&Option,FileVar,ts.FileDir))
1389     {
1390     ProtoEnd();
1391     return;
1392     }
1393     ts.XmodemOpt = HIWORD(Option);
1394     ts.XmodemBin = LOWORD(Option);
1395     }
1396     else
1397     (*SetFileVar)(FileVar);
1398    
1399     if (mode==IdXReceive)
1400     FileVar->FileHandle = _lcreat(FileVar->FullName,0);
1401     else
1402     FileVar->FileHandle = _lopen(FileVar->FullName,OF_READ);
1403    
1404     FileVar->FileOpen = FileVar->FileHandle>0;
1405     if (! FileVar->FileOpen)
1406     {
1407     ProtoEnd();
1408     return;
1409     }
1410     TalkStatus = IdTalkQuiet;
1411    
1412     /* disable transmit delay (serial port) */
1413     cv.DelayFlag = FALSE;
1414    
1415     if (! OpenProtoDlg(FileVar,PROTO_XM,mode,
1416     ts.XmodemOpt,ts.XmodemBin))
1417     ProtoEnd();
1418     }
1419     }
1420    
1421     extern "C" {
1422     void YMODEMStart(int mode)
1423     {
1424     WORD Opt;
1425    
1426     if (! ProtoStart())
1427     return;
1428    
1429     if (mode==IdYSend)
1430     {
1431 yutakapon 3819 // �t�@�C���]�������I�v�V������"Yopt1K"�����������B
1432     // TODO: "Yopt1K", "YoptG", "YoptSingle"�������������������AIDD_FOPT���g�������K�v�����B
1433     Opt = Yopt1K;
1434 maya 3227 FileVar->OpId = OpYSend;
1435     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1436     {
1437     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Y,&Opt) ||
1438     (FileVar->NumFname==0))
1439     {
1440     ProtoEnd();
1441     return;
1442     }
1443 yutakapon 3819 //ts.XmodemBin = Opt;
1444 maya 3227 }
1445     else
1446     (*SetFileVar)(FileVar);
1447     }
1448 yutakapon 3820 else {/* IdZReceive or IdZAuto */
1449 maya 3227 FileVar->OpId = OpYRcv;
1450 yutakapon 3820 // �t�@�C���]�������I�v�V������"Yopt1K"�����������B
1451     Opt = Yopt1K;
1452 yutakapon 3821 (*SetFileVar)(FileVar);
1453 yutakapon 3820 }
1454 maya 3227
1455     TalkStatus = IdTalkQuiet;
1456    
1457     /* disable transmit delay (serial port) */
1458     cv.DelayFlag = FALSE;
1459    
1460     if (! OpenProtoDlg(FileVar,PROTO_YM,mode,Opt,0))
1461     ProtoEnd();
1462     }
1463     }
1464    
1465     extern "C" {
1466     void ZMODEMStart(int mode)
1467     {
1468     WORD Opt;
1469    
1470     if (! ProtoStart())
1471     return;
1472    
1473     if (mode==IdZSend)
1474     {
1475     Opt = ts.XmodemBin;
1476     FileVar->OpId = OpZSend;
1477     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1478     {
1479     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Z,&Opt) ||
1480     (FileVar->NumFname==0))
1481     {
1482     ProtoEnd();
1483     return;
1484     }
1485     ts.XmodemBin = Opt;
1486     }
1487     else
1488     (*SetFileVar)(FileVar);
1489     }
1490     else /* IdZReceive or IdZAuto */
1491     FileVar->OpId = OpZRcv;
1492    
1493     TalkStatus = IdTalkQuiet;
1494    
1495     /* disable transmit delay (serial port) */
1496     cv.DelayFlag = FALSE;
1497    
1498     if (! OpenProtoDlg(FileVar,PROTO_ZM,mode,Opt,0))
1499     ProtoEnd();
1500     }
1501     }
1502    
1503     extern "C" {
1504     void BPStart(int mode)
1505     {
1506     LONG Option;
1507    
1508     if (! ProtoStart())
1509     return;
1510     if (mode==IdBPSend)
1511     {
1512     FileVar->OpId = OpBPSend;
1513     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1514     {
1515     FileVar->FullName[0] = 0;
1516     if (! (*GetTransFname)(FileVar, ts.FileDir, GTF_BP, &Option))
1517     {
1518     ProtoEnd();
1519     return;
1520     }
1521     }
1522     else
1523     (*SetFileVar)(FileVar);
1524     }
1525     else /* IdBPReceive or IdBPAuto */
1526     FileVar->OpId = OpBPRcv;
1527    
1528     TalkStatus = IdTalkQuiet;
1529    
1530     /* disable transmit delay (serial port) */
1531     cv.DelayFlag = FALSE;
1532    
1533     if (! OpenProtoDlg(FileVar,PROTO_BP,mode,0,0))
1534     ProtoEnd();
1535     }
1536     }
1537    
1538     extern "C" {
1539     void QVStart(int mode)
1540     {
1541     WORD W;
1542    
1543     if (! ProtoStart())
1544     return;
1545    
1546     if (mode==IdQVSend)
1547     {
1548     FileVar->OpId = OpQVSend;
1549     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1550     {
1551     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_QV, &W) ||
1552     (FileVar->NumFname==0))
1553     {
1554     ProtoEnd();
1555     return;
1556     }
1557     }
1558     else
1559     (*SetFileVar)(FileVar);
1560     }
1561     else
1562     FileVar->OpId = OpQVRcv;
1563    
1564     TalkStatus = IdTalkQuiet;
1565    
1566     /* disable transmit delay (serial port) */
1567     cv.DelayFlag = FALSE;
1568    
1569     if (! OpenProtoDlg(FileVar,PROTO_QV,mode,0,0))
1570     ProtoEnd();
1571     }
1572     }

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