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 6946 - (hide annotations) (download) (as text)
Tue Oct 17 09:38:20 2017 UTC (6 years, 5 months ago) by doda
Original Path: trunk/teraterm/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 44926 byte(s)
TFnHook へ渡すデータを WORD で分割せずに一つの long として扱うように変更。

Tera Term 2.3 の頃は Binary と Append の二つのフラグだけだったので
HIWORD / LOWORD で分けるのは簡略化の為有効だったが、現在は多数の
フラグが追加されてかえって分かりづらくなったので一つの値として
扱うようにした。

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

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