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 6806 - (hide annotations) (download) (as text)
Thu Jun 15 00:37:01 2017 UTC (6 years, 9 months ago) by doda
File MIME type: text/x-c++src
File size: 45365 byte(s)
TeraTerm Project としてのライセンス表記を追加

とりあえず Tera Term 本体分。
TeraTerm Project としての copyright 表記の年部分はコミットログを確認して書いたつもりだけど、ミスってたらすみません。

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

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