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 5162 - (hide annotations) (download) (as text)
Sat Mar 23 09:03:14 2013 UTC (11 years ago) by yutakapon
File MIME type: text/x-c++src
File size: 34067 byte(s)
logrotate マクロコマンドを追加した。

logrotate 'size' 2048
logrotate 'halt'

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

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