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 5392 - (hide annotations) (download) (as text)
Sun Sep 29 15:30:39 2013 UTC (10 years, 6 months ago) by yutakapon
Original Path: trunk/teraterm/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 39934 byte(s)
チケット #32144
ログ採取開始時の現在バッファをあらかじめ含める

ログ採取オプションに"ALl Buff In First"を追加した。

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

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