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

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