Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /trunk/teraterm/teraterm/filesys_log.cpp

Parent Directory Parent Directory | Revision Log Revision Log


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

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