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 5383 - (hide annotations) (download) (as text)
Thu Sep 5 06:17:54 2013 UTC (10 years, 7 months ago) by doda
File MIME type: text/x-c++src
File size: 39171 byte(s)
ログダイアログの非表示化が出来なくなっていたのを修正。

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

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