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

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