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

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