Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /trunk/teraterm/teraterm/filesys_log.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5312 - (hide annotations) (download) (as text)
Tue Jun 11 05:58:48 2013 UTC (10 years, 10 months ago) by doda
Original Path: trunk/teraterm/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 39137 byte(s)
ファイル転送(状況)ダイアログを隠せるようにした。
[ttssh2-devel 2332], http://sourceforge.jp/ticket/browse.php?group_id=1412&tid=31547
ToDo: ファイル転送ダイアログで、Hide オプションの on/off を選べるようにする。

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

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