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

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