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 6493 - (hide annotations) (download) (as text)
Mon Sep 26 12:41:17 2016 UTC (7 years, 6 months ago) by yutakapon
Original Path: trunk/teraterm/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 45372 byte(s)
チケット #36655 ログファイルオープンエラー

LogRotate 処理へのイベントオブジェクト追加漏れを修正した。



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

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