Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /trunk/teraterm/teraterm/filesys.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6841 - (hide annotations) (download) (as text)
Tue Jul 4 15:02:28 2017 UTC (6 years, 9 months ago) by doda
File MIME type: text/x-c++src
File size: 45361 byte(s)
TeraTerm Project としてのライセンス表記を追加

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

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