Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /branches/ttcomtester/teraterm/teraterm/filesys_log.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6079 - (hide annotations) (download) (as text)
Thu Nov 5 12:31:08 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: 42696 byte(s)
r6071 のファイル送信の高速化を使うか使わないか設定できるようにした
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     // - FileRetryEcho == false
1218     // - FileBracketMode == false
1219     // - cv.TelFlag == false
1220     // - ts.LocalEcho == 0
1221     void FileSendBinayBoost()
1222     {
1223     WORD c, fc;
1224     LONG BCOld;
1225     DWORD read_bytes;
1226    
1227     if ((SendDlg == NULL) ||
1228     ((cv.FilePause & OpSendFile) != 0))
1229     return;
1230    
1231     BCOld = SendVar->ByteCount;
1232    
1233     if (FileRetrySend)
1234     {
1235     c = CommRawOut(&cv, &(FileSendHandler.buf[FileSendHandler.pos]),
1236     FileSendHandler.end - FileSendHandler.pos);
1237     FileSendHandler.pos += c;
1238     FileRetrySend = (FileSendHandler.end != FileSendHandler.pos);
1239     if (FileRetrySend)
1240     return;
1241     }
1242    
1243     do {
1244     if (FileSendHandler.pos == FileSendHandler.end) {
1245     #ifdef FileVarWin16
1246     fc = _lread(SendVar->FileHandle, &(FileSendHandler.buf[0]), sizeof(FileSendHandler.buf));
1247     #else
1248     ReadFile((HANDLE)SendVar->FileHandle, &(FileSendHandler.buf[0]), sizeof(FileSendHandler.buf), &read_bytes, NULL);
1249     fc = LOWORD(read_bytes);
1250     #endif
1251     FileSendHandler.pos = 0;
1252     FileSendHandler.end = fc;
1253     } else {
1254     fc = FileSendHandler.end - FileSendHandler.end;
1255     }
1256    
1257     if (fc != 0)
1258     {
1259     c = CommRawOut(&cv, &(FileSendHandler.buf[FileSendHandler.pos]),
1260     FileSendHandler.end - FileSendHandler.pos);
1261     FileSendHandler.pos += c;
1262     FileRetrySend = (FileSendHandler.end != FileSendHandler.pos);
1263     SendVar->ByteCount = SendVar->ByteCount + c;
1264     if (FileRetrySend)
1265     {
1266     if (SendVar->ByteCount != BCOld)
1267     SendDlg->RefreshNum();
1268     return;
1269     }
1270     }
1271     FileDlgRefresh = SendVar->ByteCount;
1272     SendDlg->RefreshNum();
1273     BCOld = SendVar->ByteCount;
1274     if (fc != 0)
1275     return;
1276     } while (fc != 0);
1277    
1278     FileTransEnd(OpSendFile);
1279     }
1280     }
1281    
1282     extern "C" {
1283 maya 3227 void FileSend()
1284     {
1285     WORD c, fc;
1286     LONG BCOld;
1287 maya 5281 DWORD read_bytes;
1288 maya 3227
1289 maya 6079 if (ts.FileSendBulkPacket &&
1290     BinaryMode && !FileRetryEcho && !FileBracketMode && !cv.TelFlag &&
1291     (ts.LocalEcho == 0) && (ts.Baud >= 115200)) {
1292 maya 6071 return FileSendBinayBoost();
1293     }
1294    
1295 maya 3227 if ((SendDlg==NULL) ||
1296     ((cv.FilePause & OpSendFile) !=0))
1297     return;
1298    
1299     BCOld = SendVar->ByteCount;
1300    
1301     if (FileRetrySend)
1302     {
1303     FileRetryEcho = (ts.LocalEcho>0);
1304     c = FSOut1(FileByte);
1305     FileRetrySend = (c==0);
1306     if (FileRetrySend)
1307     return;
1308     }
1309    
1310     if (FileRetryEcho)
1311     {
1312     c = FSEcho1(FileByte);
1313     FileRetryEcho = (c==0);
1314     if (FileRetryEcho)
1315     return;
1316     }
1317    
1318     do {
1319 doda 3904 if (FileBracketMode == FS_BRACKET_START) {
1320     FileByte = BracketStartStr[FileBracketPtr++];
1321     fc = 1;
1322 maya 3227
1323 doda 3904 if (FileBracketPtr >= sizeof(BracketStartStr) - 1) {
1324     FileBracketMode = FS_BRACKET_END;
1325     FileBracketPtr = 0;
1326     BinaryMode = ts.TransBin;
1327     }
1328     }
1329     else if (! FileReadEOF) {
1330 maya 5281 #ifdef FileVarWin16
1331 maya 3227 fc = _lread(SendVar->FileHandle,&FileByte,1);
1332 maya 5281 #else
1333     ReadFile((HANDLE)SendVar->FileHandle, &FileByte, 1, &read_bytes, NULL);
1334     fc = LOWORD(read_bytes);
1335     #endif
1336 maya 3227 SendVar->ByteCount = SendVar->ByteCount + fc;
1337 doda 3904
1338     if (FileCRSend && (fc==1) && (FileByte==0x0A)) {
1339 maya 5281 #ifdef FileVarWin16
1340 doda 3904 fc = _lread(SendVar->FileHandle,&FileByte,1);
1341 maya 5281 #else
1342     ReadFile((HANDLE)SendVar->FileHandle, &FileByte, 1, &read_bytes, NULL);
1343     fc = LOWORD(read_bytes);
1344     #endif
1345 doda 3904 SendVar->ByteCount = SendVar->ByteCount + fc;
1346     }
1347 maya 3227 }
1348 doda 3904 else {
1349     fc = 0;
1350     }
1351 maya 3227
1352 doda 3904 if (fc == 0 && FileBracketMode == FS_BRACKET_END) {
1353     FileReadEOF = TRUE;
1354     FileByte = BracketEndStr[FileBracketPtr++];
1355     fc = 1;
1356     BinaryMode = TRUE;
1357    
1358     if (FileBracketPtr >= sizeof(BracketEndStr) - 1) {
1359     FileBracketMode = FS_BRACKET_NONE;
1360     FileBracketPtr = 0;
1361     }
1362     }
1363    
1364    
1365 maya 3227 if (fc!=0)
1366     {
1367     c = FSOut1(FileByte);
1368     FileCRSend = (ts.TransBin==0) && (FileByte==0x0D);
1369     FileRetrySend = (c==0);
1370     if (FileRetrySend)
1371     {
1372     if (SendVar->ByteCount != BCOld)
1373     SendDlg->RefreshNum();
1374     return;
1375     }
1376     if (ts.LocalEcho>0)
1377     {
1378     c = FSEcho1(FileByte);
1379     FileRetryEcho = (c==0);
1380     if (FileRetryEcho)
1381     return;
1382     }
1383     }
1384 doda 3904 if ((fc==0) || ((SendVar->ByteCount % 100 == 0) && (FileBracketPtr == 0))) {
1385 maya 3227 SendDlg->RefreshNum();
1386     BCOld = SendVar->ByteCount;
1387     if (fc!=0)
1388     return;
1389     }
1390     } while (fc!=0);
1391    
1392     FileTransEnd(OpSendFile);
1393     }
1394     }
1395    
1396     extern "C" {
1397     void FLogChangeButton(BOOL Pause)
1398     {
1399     if (FLogDlg!=NULL)
1400     FLogDlg->ChangeButton(Pause);
1401     }
1402     }
1403    
1404     extern "C" {
1405     void FLogRefreshNum()
1406     {
1407     if (FLogDlg!=NULL)
1408     FLogDlg->RefreshNum();
1409     }
1410     }
1411    
1412     BOOL OpenProtoDlg(PFileVar fv, int IdProto, int Mode, WORD Opt1, WORD Opt2)
1413     {
1414     int vsize;
1415     PProtoDlg pd;
1416     HWND Hpd;
1417     char uimsg[MAX_UIMSG];
1418    
1419     ProtoId = IdProto;
1420    
1421     switch (ProtoId) {
1422     case PROTO_KMT:
1423     vsize = sizeof(TKmtVar);
1424     break;
1425     case PROTO_XM:
1426     vsize = sizeof(TXVar);
1427     break;
1428     case PROTO_YM:
1429     vsize = sizeof(TYVar);
1430     break;
1431     case PROTO_ZM:
1432     vsize = sizeof(TZVar);
1433     break;
1434     case PROTO_BP:
1435     vsize = sizeof(TBPVar);
1436     break;
1437     case PROTO_QV:
1438     vsize = sizeof(TQVVar);
1439     break;
1440     }
1441     ProtoVar = (PCHAR)malloc(vsize);
1442     if (ProtoVar==NULL)
1443     return FALSE;
1444    
1445     switch (ProtoId) {
1446     case PROTO_KMT:
1447     ((PKmtVar)ProtoVar)->KmtMode = Mode;
1448     break;
1449     case PROTO_XM:
1450     ((PXVar)ProtoVar)->XMode = Mode;
1451     ((PXVar)ProtoVar)->XOpt = Opt1;
1452     ((PXVar)ProtoVar)->TextFlag = 1 - (Opt2 & 1);
1453     break;
1454 yutakapon 3819 case PROTO_YM:
1455 maya 3227 ((PYVar)ProtoVar)->YMode = Mode;
1456 yutakapon 3819 ((PYVar)ProtoVar)->YOpt = Opt1;
1457 maya 3227 break;
1458     case PROTO_ZM:
1459     ((PZVar)ProtoVar)->BinFlag = (Opt1 & 1) != 0;
1460     ((PZVar)ProtoVar)->ZMode = Mode;
1461     break;
1462     case PROTO_BP:
1463     ((PBPVar)ProtoVar)->BPMode = Mode;
1464     break;
1465     case PROTO_QV:
1466     ((PQVVar)ProtoVar)->QVMode = Mode;
1467     break;
1468     }
1469    
1470     pd = new CProtoDlg();
1471     if (pd==NULL)
1472     {
1473     free(ProtoVar);
1474     ProtoVar = NULL;
1475     return FALSE;
1476     }
1477     pd->Create(fv,&ts);
1478    
1479     Hpd=pd->GetSafeHwnd();
1480    
1481     GetDlgItemText(Hpd, IDC_PROT_FILENAME, uimsg, sizeof(uimsg));
1482     get_lang_msg("DLG_PROT_FIELNAME", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1483     SetDlgItemText(Hpd, IDC_PROT_FILENAME, ts.UIMsg);
1484     GetDlgItemText(Hpd, IDC_PROT_PROT, uimsg, sizeof(uimsg));
1485     get_lang_msg("DLG_PROT_PROTO", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1486     SetDlgItemText(Hpd, IDC_PROT_PROT, ts.UIMsg);
1487     GetDlgItemText(Hpd, IDC_PROT_PACKET, uimsg, sizeof(uimsg));
1488     get_lang_msg("DLG_PROT_PACKET", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1489     SetDlgItemText(Hpd, IDC_PROT_PACKET, ts.UIMsg);
1490     GetDlgItemText(Hpd, IDC_PROT_TRANS, uimsg, sizeof(uimsg));
1491     get_lang_msg("DLG_PROT_TRANS", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1492     SetDlgItemText(Hpd, IDC_PROT_TRANS, ts.UIMsg);
1493 doda 4461 GetDlgItemText(Hpd, IDC_PROT_ELAPSED, uimsg, sizeof(uimsg));
1494     get_lang_msg("DLG_PROT_ELAPSED", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1495     SetDlgItemText(Hpd, IDC_PROT_ELAPSED, ts.UIMsg);
1496 maya 3227 GetDlgItemText(Hpd, IDCANCEL, uimsg, sizeof(uimsg));
1497     get_lang_msg("BTN_CANCEL", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1498     SetDlgItemText(Hpd, IDCANCEL, ts.UIMsg);
1499    
1500     (*ProtoInit)(ProtoId,FileVar,ProtoVar,&cv,&ts);
1501    
1502     PtDlg = pd;
1503     return TRUE;
1504     }
1505    
1506     extern "C" {
1507     void CloseProtoDlg()
1508     {
1509     if (PtDlg!=NULL)
1510     {
1511     PtDlg->DestroyWindow();
1512     PtDlg = NULL;
1513    
1514     ::KillTimer(FileVar->HMainWin,IdProtoTimer);
1515     if ((ProtoId==PROTO_QV) &&
1516     (((PQVVar)ProtoVar)->QVMode==IdQVSend))
1517     CommTextOut(&cv,"\015",1);
1518     if (FileVar->LogFlag)
1519     _lclose(FileVar->LogFile);
1520     FileVar->LogFile = 0;
1521     if (ProtoVar!=NULL)
1522     {
1523     free(ProtoVar);
1524     ProtoVar = NULL;
1525     }
1526     }
1527     }
1528     }
1529    
1530     BOOL ProtoStart()
1531     {
1532     if (cv.ProtoFlag)
1533     return FALSE;
1534     if (FSend)
1535     {
1536     FreeFileVar(&FileVar);
1537     return FALSE;
1538     }
1539    
1540     if (! LoadTTFILE())
1541     return FALSE;
1542     NewFileVar(&FileVar);
1543    
1544     if (FileVar==NULL)
1545     {
1546     FreeTTFILE();
1547     return FALSE;
1548     }
1549     cv.ProtoFlag = TRUE;
1550     return TRUE;
1551     }
1552    
1553     void ProtoEnd()
1554     {
1555     if (! cv.ProtoFlag)
1556     return;
1557     cv.ProtoFlag = FALSE;
1558    
1559     /* Enable transmit delay (serial port) */
1560     cv.DelayFlag = TRUE;
1561     TalkStatus = IdTalkKeyb;
1562    
1563     CloseProtoDlg();
1564    
1565     if ((FileVar!=NULL) && FileVar->Success)
1566     EndDdeCmnd(1);
1567     else
1568     EndDdeCmnd(0);
1569    
1570     FreeTTFILE();
1571     FreeFileVar(&FileVar);
1572     }
1573    
1574     extern "C" {
1575     int ProtoDlgParse()
1576     {
1577     int P;
1578    
1579     P = ActiveWin;
1580     if (PtDlg==NULL)
1581     return P;
1582    
1583     if ((*ProtoParse)(ProtoId,FileVar,ProtoVar,&cv))
1584     P = 0; /* continue */
1585     else {
1586     CommSend(&cv);
1587     ProtoEnd();
1588     }
1589     return P;
1590     }
1591     }
1592    
1593     extern "C" {
1594     void ProtoDlgTimeOut()
1595     {
1596     if (PtDlg!=NULL)
1597     (*ProtoTimeOutProc)(ProtoId,FileVar,ProtoVar,&cv);
1598     }
1599     }
1600    
1601     extern "C" {
1602     void ProtoDlgCancel()
1603     {
1604     if ((PtDlg!=NULL) &&
1605     (*ProtoCancel)(ProtoId,FileVar,ProtoVar,&cv))
1606     ProtoEnd();
1607     }
1608     }
1609    
1610     extern "C" {
1611     void KermitStart(int mode)
1612     {
1613     WORD w;
1614    
1615     if (! ProtoStart())
1616     return;
1617    
1618     switch (mode) {
1619     case IdKmtSend:
1620     FileVar->OpId = OpKmtSend;
1621     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1622     {
1623     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_KERMIT,&w) ||
1624     (FileVar->NumFname==0))
1625     {
1626     ProtoEnd();
1627     return;
1628     }
1629     }
1630     else
1631     (*SetFileVar)(FileVar);
1632     break;
1633     case IdKmtReceive:
1634     FileVar->OpId = OpKmtRcv;
1635     break;
1636     case IdKmtGet:
1637     FileVar->OpId = OpKmtSend;
1638     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1639     {
1640     if (! (*GetGetFname)(FileVar->HMainWin,FileVar) ||
1641     (strlen(FileVar->FullName)==0))
1642     {
1643     ProtoEnd();
1644     return;
1645     }
1646     }
1647     else
1648     (*SetFileVar)(FileVar);
1649     break;
1650     case IdKmtFinish:
1651     FileVar->OpId = OpKmtFin;
1652     break;
1653     default:
1654     ProtoEnd();
1655     return;
1656     }
1657     TalkStatus = IdTalkQuiet;
1658    
1659     /* disable transmit delay (serial port) */
1660     cv.DelayFlag = FALSE;
1661    
1662     if (! OpenProtoDlg(FileVar,PROTO_KMT,mode,0,0))
1663     ProtoEnd();
1664     }
1665     }
1666    
1667     extern "C" {
1668     void XMODEMStart(int mode)
1669     {
1670     LONG Option;
1671    
1672     if (! ProtoStart())
1673     return;
1674    
1675     if (mode==IdXReceive)
1676     FileVar->OpId = OpXRcv;
1677     else
1678     FileVar->OpId = OpXSend;
1679    
1680     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1681     {
1682     Option = MAKELONG(ts.XmodemBin,ts.XmodemOpt);
1683     if (! (*GetXFname)(FileVar->HMainWin,
1684     mode==IdXReceive,&Option,FileVar,ts.FileDir))
1685     {
1686     ProtoEnd();
1687     return;
1688     }
1689     ts.XmodemOpt = HIWORD(Option);
1690     ts.XmodemBin = LOWORD(Option);
1691     }
1692     else
1693     (*SetFileVar)(FileVar);
1694    
1695     if (mode==IdXReceive)
1696     FileVar->FileHandle = _lcreat(FileVar->FullName,0);
1697     else
1698     FileVar->FileHandle = _lopen(FileVar->FullName,OF_READ);
1699    
1700     FileVar->FileOpen = FileVar->FileHandle>0;
1701     if (! FileVar->FileOpen)
1702     {
1703     ProtoEnd();
1704     return;
1705     }
1706     TalkStatus = IdTalkQuiet;
1707    
1708     /* disable transmit delay (serial port) */
1709     cv.DelayFlag = FALSE;
1710    
1711     if (! OpenProtoDlg(FileVar,PROTO_XM,mode,
1712     ts.XmodemOpt,ts.XmodemBin))
1713     ProtoEnd();
1714     }
1715     }
1716    
1717     extern "C" {
1718     void YMODEMStart(int mode)
1719     {
1720     WORD Opt;
1721    
1722     if (! ProtoStart())
1723     return;
1724    
1725     if (mode==IdYSend)
1726     {
1727 yutakapon 3819 // �t�@�C���]�������I�v�V������"Yopt1K"�����������B
1728     // TODO: "Yopt1K", "YoptG", "YoptSingle"�������������������AIDD_FOPT���g�������K�v�����B
1729     Opt = Yopt1K;
1730 maya 3227 FileVar->OpId = OpYSend;
1731     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1732     {
1733     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Y,&Opt) ||
1734     (FileVar->NumFname==0))
1735     {
1736     ProtoEnd();
1737     return;
1738     }
1739 yutakapon 3819 //ts.XmodemBin = Opt;
1740 maya 3227 }
1741     else
1742     (*SetFileVar)(FileVar);
1743     }
1744 yutakapon 3820 else {/* IdZReceive or IdZAuto */
1745 maya 3227 FileVar->OpId = OpYRcv;
1746 yutakapon 3820 // �t�@�C���]�������I�v�V������"Yopt1K"�����������B
1747     Opt = Yopt1K;
1748 yutakapon 3821 (*SetFileVar)(FileVar);
1749 yutakapon 3820 }
1750 maya 3227
1751     TalkStatus = IdTalkQuiet;
1752    
1753     /* disable transmit delay (serial port) */
1754     cv.DelayFlag = FALSE;
1755    
1756     if (! OpenProtoDlg(FileVar,PROTO_YM,mode,Opt,0))
1757     ProtoEnd();
1758     }
1759     }
1760    
1761     extern "C" {
1762     void ZMODEMStart(int mode)
1763     {
1764     WORD Opt;
1765    
1766     if (! ProtoStart())
1767     return;
1768    
1769     if (mode==IdZSend)
1770     {
1771     Opt = ts.XmodemBin;
1772     FileVar->OpId = OpZSend;
1773     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1774     {
1775     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Z,&Opt) ||
1776     (FileVar->NumFname==0))
1777     {
1778     ProtoEnd();
1779     return;
1780     }
1781     ts.XmodemBin = Opt;
1782     }
1783     else
1784     (*SetFileVar)(FileVar);
1785     }
1786     else /* IdZReceive or IdZAuto */
1787     FileVar->OpId = OpZRcv;
1788    
1789     TalkStatus = IdTalkQuiet;
1790    
1791     /* disable transmit delay (serial port) */
1792     cv.DelayFlag = FALSE;
1793    
1794     if (! OpenProtoDlg(FileVar,PROTO_ZM,mode,Opt,0))
1795     ProtoEnd();
1796     }
1797     }
1798    
1799     extern "C" {
1800     void BPStart(int mode)
1801     {
1802     LONG Option;
1803    
1804     if (! ProtoStart())
1805     return;
1806     if (mode==IdBPSend)
1807     {
1808     FileVar->OpId = OpBPSend;
1809     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1810     {
1811     FileVar->FullName[0] = 0;
1812     if (! (*GetTransFname)(FileVar, ts.FileDir, GTF_BP, &Option))
1813     {
1814     ProtoEnd();
1815     return;
1816     }
1817     }
1818     else
1819     (*SetFileVar)(FileVar);
1820     }
1821     else /* IdBPReceive or IdBPAuto */
1822     FileVar->OpId = OpBPRcv;
1823    
1824     TalkStatus = IdTalkQuiet;
1825    
1826     /* disable transmit delay (serial port) */
1827     cv.DelayFlag = FALSE;
1828    
1829     if (! OpenProtoDlg(FileVar,PROTO_BP,mode,0,0))
1830     ProtoEnd();
1831     }
1832     }
1833    
1834     extern "C" {
1835     void QVStart(int mode)
1836     {
1837     WORD W;
1838    
1839     if (! ProtoStart())
1840     return;
1841    
1842     if (mode==IdQVSend)
1843     {
1844     FileVar->OpId = OpQVSend;
1845     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1846     {
1847     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_QV, &W) ||
1848     (FileVar->NumFname==0))
1849     {
1850     ProtoEnd();
1851     return;
1852     }
1853     }
1854     else
1855     (*SetFileVar)(FileVar);
1856     }
1857     else
1858     FileVar->OpId = OpQVRcv;
1859    
1860     TalkStatus = IdTalkQuiet;
1861    
1862     /* disable transmit delay (serial port) */
1863     cv.DelayFlag = FALSE;
1864    
1865     if (! OpenProtoDlg(FileVar,PROTO_QV,mode,0,0))
1866     ProtoEnd();
1867     }
1868     }

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