Develop and Download Open Source Software

Browse Subversion Repository

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5395 - (hide annotations) (download) (as text)
Mon Sep 30 09:47:11 2013 UTC (10 years, 6 months ago) by yutakapon
File MIME type: text/x-c++src
File size: 40505 byte(s)
チケット #32144  ログ採取開始時の現在バッファをあらかじめ含める

コードのブラッシュアップ。

最初の書き出し先がネットワーク経由だと、書き出し処理で時間がかかってしまうことが
予想されるため、遅延書き込みのしくみを取り入れてみたが、むしろ余計にスローダウンと
なってしまった。

バッファの内容を cv.LogBuf に格納してから、LogToFile()を呼ぶことも考えたが、
サーバから受信していないも関わらず、受信バイト数がカウントアップするのがいまいちなのと、
cv.LogBufのサイズが 1KB しかないので、バッファが1KBを超えているときの処理が複雑に
なるため、とりあえず現状のままとする。


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

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