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 5206 - (hide annotations) (download) (as text)
Fri Apr 19 15:31:54 2013 UTC (10 years, 11 months ago) by yutakapon
File MIME type: text/x-c++src
File size: 37795 byte(s)
ログファイルの遅延書き込みをサポートした。
ネットワーク経由でのログ採取時、Tera Term自身がスローダウンする問題への改善。
チケット #25434

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     _lclose(ptr->FileHandle);
389     }
390    
391     // �x�����������p�X���b�h
392     static unsigned _stdcall DeferredLogWriteThread(void *arg)
393     {
394     MSG msg;
395     PFileVar fv = (PFileVar)arg;
396     PCHAR buf;
397     DWORD buflen;
398    
399     PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
400    
401     while (GetMessage(&msg, NULL, 0, 0) > 0) {
402     switch (msg.message) {
403     case WM_DPC_LOGTHREAD_SEND:
404     buf = (PCHAR)msg.wParam;
405     buflen = (DWORD)msg.lParam;
406     _lwrite(fv->FileHandle, buf, buflen );
407     free(buf); // ����������������
408     break;
409    
410     case WM_QUIT:
411     goto end;
412     break;
413     }
414     }
415    
416     end:
417     _endthreadex(0);
418     return (0);
419     }
420    
421    
422 maya 3227 extern "C" {
423     BOOL LogStart()
424     {
425     LONG Option;
426     char *logdir;
427 yutakapon 5206 unsigned tid;
428 maya 3227
429     if ((FileLog) || (BinLog)) return FALSE;
430    
431     if (! LoadTTFILE()) return FALSE;
432     if (! NewFileVar(&LogVar))
433     {
434     FreeTTFILE();
435     return FALSE;
436     }
437     LogVar->OpId = OpLog;
438    
439     if (strlen(ts.LogDefaultPath) > 0) {
440     logdir = ts.LogDefaultPath;
441     }
442     else if (strlen(ts.FileDir) > 0) {
443     logdir = ts.FileDir;
444     }
445     else {
446     logdir = ts.HomeDir;
447     }
448    
449     if (strlen(&(LogVar->FullName[LogVar->DirLen]))==0)
450     {
451     // LOWORD
452     // 0x0001 = Binary
453     // HIWORD
454     // 0x0001 = Append
455     // 0x1000 = plain text (2005.2.20 yutaka)
456     // 0x2000 = timestamp (2006.7.23 maya)
457     // 0x4000 = hide file transfer dialog (2008.1.30 maya)
458     // teraterm.ini�����������������f�t�H���g�I�v�V�������������B(2005.5.7 yutaka)
459 doda 3887 Option = MAKELONG(ts.LogBinary,
460 maya 3227 ts.Append |
461     (0x1000 * ts.LogTypePlainText) |
462     (0x2000 * ts.LogTimestamp) |
463     (0x4000 * ts.LogHideDialog));
464    
465     // ���O���f�t�H���g�t�@�C���������� (2006.8.28 maya)
466     strncat_s(LogVar->FullName, sizeof(LogVar->FullName), ts.LogDefaultName, _TRUNCATE);
467    
468     ParseStrftimeFileName(LogVar->FullName, sizeof(LogVar->FullName));
469    
470     // &h ���z�X�g�����u�� (2007.5.14)
471     ConvertLogname(LogVar->FullName, sizeof(LogVar->FullName));
472    
473     strncpy_s(LogVar->LogDefaultPath, sizeof(LogVar->LogDefaultPath), ts.LogDefaultPath, _TRUNCATE);
474     if (! (*GetTransFname)(LogVar, logdir, GTF_LOG, &Option))
475     {
476     FreeFileVar(&LogVar);
477     FreeTTFILE();
478     return FALSE;
479     }
480 doda 3887 ts.LogBinary = LOWORD(Option);
481 maya 3227 ts.Append = HIWORD(Option);
482    
483     if (ts.Append & 0x1000) {
484     ts.LogTypePlainText = 1;
485     } else {
486     ts.LogTypePlainText = 0;
487     }
488    
489     if (ts.Append & 0x2000) {
490     ts.LogTimestamp = 1;
491     }
492     else {
493     ts.LogTimestamp = 0;
494     }
495    
496     if (ts.Append & 0x4000) {
497     ts.LogHideDialog = 1;
498     }
499     else {
500     ts.LogHideDialog = 0;
501     }
502    
503     ts.Append &= 0x1; // 1bit���}�X�N����
504    
505     }
506     else {
507     // LogVar->DirLen = 0 ��������������
508     // �t���p�X�E�����p�X������ LogVar->FullName �������������K�v������
509     char FileName[MAX_PATH];
510    
511     // �t���p�X��
512     strncpy_s(FileName, sizeof(FileName), LogVar->FullName, _TRUNCATE);
513     ConvFName(logdir,FileName,sizeof(FileName),"",LogVar->FullName,sizeof(LogVar->FullName));
514    
515     ParseStrftimeFileName(LogVar->FullName, sizeof(LogVar->FullName));
516    
517     // &h ���z�X�g�����u�� (2007.5.14)
518     ConvertLogname(LogVar->FullName, sizeof(LogVar->FullName));
519     (*SetFileVar)(LogVar);
520    
521     FixLogOption();
522     }
523    
524 doda 3887 if (ts.LogBinary > 0)
525 maya 3227 {
526     BinLog = TRUE;
527     FileLog = FALSE;
528     if (! CreateBinBuf())
529     {
530     FileTransEnd(OpLog);
531     return FALSE;
532     }
533     }
534     else {
535     BinLog = FALSE;
536     FileLog = TRUE;
537     if (! CreateLogBuf())
538     {
539     FileTransEnd(OpLog);
540     return FALSE;
541     }
542     }
543     cv.LStart = cv.LogPtr;
544     cv.LCount = 0;
545     if (ts.LogHideDialog)
546     LogVar->HideDialog = 1;
547    
548     HelpId = HlpFileLog;
549     /* 2007.05.24 Gentaro */
550     eLineEnd = Line_LineHead;
551    
552     if (ts.Append > 0)
553     {
554 maya 5189 int dwShareMode = FILE_SHARE_READ;
555 maya 5178 if (!ts.LogLockExclusive) {
556     dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
557 maya 4786 }
558     LogVar->FileHandle = (int)CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
559 maya 4328 OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
560 maya 3227 if (LogVar->FileHandle>0){
561     _llseek(LogVar->FileHandle,0,2);
562     /* 2007.05.24 Gentaro
563     If log file already exists,
564     a newline is inserted before the first timestamp.
565     */
566     eLineEnd = Line_FileHead;
567     }
568     }
569 maya 4328 else {
570 maya 5189 int dwShareMode = FILE_SHARE_READ;
571 maya 5178 if (!ts.LogLockExclusive) {
572     dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
573 maya 4786 }
574     LogVar->FileHandle = (int)CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
575 maya 4328 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
576     }
577 maya 3227 LogVar->FileOpen = (LogVar->FileHandle>0);
578     if (! LogVar->FileOpen)
579     {
580     char msg[128];
581    
582     // �t�@�C���I�[�v���G���[�������b�Z�[�W�\�������������B(2008.7.9 yutaka)
583     if (LogVar->NoMsg == FALSE) {
584     _snprintf_s(msg, sizeof(msg), _TRUNCATE, "Can not create a `%s' file. (%d)", LogVar->FullName, GetLastError());
585     MessageBox(NULL, msg, "Tera Term: File open error", MB_OK | MB_ICONERROR);
586     }
587    
588     FileTransEnd(OpLog);
589     return FALSE;
590     }
591     LogVar->ByteCount = 0;
592    
593 yutakapon 5171 // Log rotate configuration
594     LogVar->RotateMode = ts.LogRotate;
595     LogVar->RotateSize = ts.LogRotateSize;
596     LogVar->RotateStep = ts.LogRotateStep;
597 yutakapon 5162
598 maya 3227 if (! OpenFTDlg(LogVar)) {
599     FileTransEnd(OpLog);
600     return FALSE;
601     }
602    
603 yutakapon 5206 // �x�����������p�X���b�h���N�����B
604     // (2013.4.19 yutaka)
605     LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid);
606     LogVar->LogThreadId = tid;
607    
608 maya 3227 return TRUE;
609     }
610     }
611    
612     void LogPut1(BYTE b)
613     {
614     LogLast = b;
615     cv.LogBuf[cv.LogPtr] = b;
616     cv.LogPtr++;
617     if (cv.LogPtr>=InBuffSize)
618     cv.LogPtr = cv.LogPtr-InBuffSize;
619    
620     if (FileLog)
621     {
622     if (cv.LCount>=InBuffSize)
623     {
624     cv.LCount = InBuffSize;
625     cv.LStart = cv.LogPtr;
626     }
627     else
628     cv.LCount++;
629     }
630     else
631     cv.LCount = 0;
632    
633     if (DDELog)
634     {
635     if (cv.DCount>=InBuffSize)
636     {
637     cv.DCount = InBuffSize;
638     cv.DStart = cv.LogPtr;
639     }
640     else
641     cv.DCount++;
642     }
643     else {
644     cv.DCount = 0;
645     // ���O���������}�N�����X�g�[���������������C���B
646     // ���O�����������x�}�N�����~�������A�o�b�t�@���C���f�b�N�X�������������������A
647     // ���x�}�N�������������������f�[�^�������������������B
648     // �}�N�������~���������������C���f�b�N�X�����������������������B
649     // (2006.12.26 yutaka)
650     cv.DStart = cv.LogPtr;
651     }
652     }
653    
654     void Log1Byte(BYTE b)
655     {
656     if (b==0x0d)
657     {
658     LogLast = b;
659     return;
660     }
661     if ((b==0x0a) && (LogLast==0x0d))
662     LogPut1(0x0d);
663     LogPut1(b);
664     }
665    
666     static BOOL Get1(PCHAR Buf, int *Start, int *Count, PBYTE b)
667     {
668     if (*Count<=0) return FALSE;
669     *b = Buf[*Start];
670     (*Start)++;
671     if (*Start>=InBuffSize)
672     *Start = *Start-InBuffSize;
673     (*Count)--;
674     return TRUE;
675     }
676    
677    
678    
679     static CRITICAL_SECTION g_filelog_lock; /* ���b�N�p���� */
680    
681     void logfile_lock_initialize(void)
682     {
683     InitializeCriticalSection(&g_filelog_lock);
684     }
685    
686     static inline void logfile_lock(void)
687     {
688     EnterCriticalSection(&g_filelog_lock);
689     }
690    
691     static inline void logfile_unlock(void)
692     {
693     LeaveCriticalSection(&g_filelog_lock);
694     }
695    
696     // �R�����g�����O����������
697     void CommentLogToFile(char *buf, int size)
698     {
699     DWORD wrote;
700    
701     if (LogVar == NULL || !LogVar->FileOpen) {
702     char uimsg[MAX_UIMSG];
703     get_lang_msg("MSG_ERROR", uimsg, sizeof(uimsg), "ERROR", ts.UILanguageFile);
704     get_lang_msg("MSG_COMMENT_LOG_OPEN_ERROR", ts.UIMsg, sizeof(ts.UIMsg),
705     "It is not opened by the log file yet.", ts.UILanguageFile);
706     ::MessageBox(NULL, ts.UIMsg, uimsg, MB_OK|MB_ICONEXCLAMATION);
707     return;
708     }
709    
710     logfile_lock();
711     WriteFile((HANDLE)LogVar->FileHandle, buf, size, &wrote, NULL);
712     WriteFile((HANDLE)LogVar->FileHandle, "\r\n", 2, &wrote, NULL); // ���s
713     /* Set Line End Flag
714     2007.05.24 Gentaro
715     */
716     eLineEnd = Line_LineHead;
717     logfile_unlock();
718     }
719    
720 yutakapon 5162 // ���O�����[�e�[�g�����B
721     // (2013.3.21 yutaka)
722     static void LogRotate(void)
723     {
724 yutakapon 5165 int loopmax = 10000; // XXX
725 yutakapon 5162 char filename[1024];
726 yutakapon 5165 char newfile[1024], oldfile[1024];
727     int i, k;
728 maya 5189 int dwShareMode = FILE_SHARE_READ;
729 yutakapon 5206 unsigned tid;
730 yutakapon 5162
731     if (! LogVar->FileOpen) return;
732    
733     if (LogVar->RotateMode == ROTATE_NONE)
734     return;
735    
736     if (LogVar->RotateMode == ROTATE_SIZE) {
737     if (LogVar->ByteCount <= LogVar->RotateSize)
738     return;
739     //OutputDebugPrintf("%s: mode %d size %ld\n", __FUNCTION__, LogVar->RotateMode, LogVar->ByteCount);
740     } else {
741     return;
742     }
743    
744     logfile_lock();
745     // ���O�T�C�Y���������������B
746     LogVar->ByteCount = 0;
747    
748     // �������������t�@�C�����N���[�Y�����A�������t�@�C�����I�[�v�������B
749 yutakapon 5206 CloseFileSync(LogVar);
750     //_lclose(LogVar->FileHandle);
751 yutakapon 5162
752 yutakapon 5165 // �������[�e�[�V�������X�e�b�v�����w����������
753     if (LogVar->RotateStep > 0)
754     loopmax = LogVar->RotateStep;
755    
756     for (i = 1 ; i <= loopmax ; i++) {
757 yutakapon 5162 _snprintf_s(filename, sizeof(filename), _TRUNCATE, "%s.%d", LogVar->FullName, i);
758     if (_access_s(filename, 0) != 0)
759     break;
760     }
761 yutakapon 5165 if (i > loopmax) {
762     // �������������������������A�������t�@�C�������p�������B
763     i = loopmax;
764 yutakapon 5162 }
765    
766     // ���t�@�C�������l�[���B
767 yutakapon 5165 for (k = i-1 ; k >= 0 ; k--) {
768     if (k == 0)
769     strncpy_s(oldfile, sizeof(oldfile), LogVar->FullName, _TRUNCATE);
770     else
771     _snprintf_s(oldfile, sizeof(oldfile), _TRUNCATE, "%s.%d", LogVar->FullName, k);
772     _snprintf_s(newfile, sizeof(newfile), _TRUNCATE, "%s.%d", LogVar->FullName, k+1);
773     remove(newfile);
774     if (rename(oldfile, newfile) != 0) {
775     OutputDebugPrintf("%s: rename %d\n", __FUNCTION__, errno);
776     }
777     }
778 yutakapon 5162
779     // ���I�[�v��
780 maya 5178 if (!ts.LogLockExclusive) {
781     dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
782 yutakapon 5162 }
783     LogVar->FileHandle = (int)CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
784     CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
785    
786 yutakapon 5206 // �x�����������p�X���b�h���N�����B
787     // (2013.4.19 yutaka)
788     LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid);
789     LogVar->LogThreadId = tid;
790    
791 yutakapon 5162 logfile_unlock();
792    
793     }
794    
795 maya 3227 void LogToFile()
796     {
797     PCHAR Buf;
798     int Start, Count;
799     BYTE b;
800 yutakapon 5206 PCHAR WriteBuf;
801     DWORD WriteBufMax, WriteBufLen;
802     CHAR tmp[128];
803 maya 3227
804     if (! LogVar->FileOpen) return;
805     if (FileLog)
806     {
807     Buf = cv.LogBuf;
808     Start = cv.LStart;
809     Count = cv.LCount;
810     }
811     else if (BinLog)
812     {
813     Buf = cv.BinBuf;
814     Start = cv.BStart;
815     Count = cv.BCount;
816     }
817     else
818     return;
819    
820     if (Buf==NULL) return;
821     if (Count==0) return;
822    
823     // ���b�N������(2004.8.6 yutaka)
824     logfile_lock();
825    
826 yutakapon 5206 if (ts.DeferredLogWriteMode) {
827     WriteBufMax = 8192;
828     WriteBufLen = 0;
829     WriteBuf = (PCHAR)malloc(WriteBufMax);
830     while (Get1(Buf,&Start,&Count,&b)) {
831     if (((cv.FilePause & OpLog)==0) && (! cv.ProtoFlag))
832     {
833     tmp[0] = 0;
834     if ( ts.LogTimestamp && eLineEnd ) {
835     char *strtime = mctimelocal();
836     /* 2007.05.24 Gentaro */
837     if( eLineEnd == Line_FileHead ){
838     strncat_s(tmp, sizeof(tmp), "\r\n", _TRUNCATE);
839     }
840     strncat_s(tmp, sizeof(tmp), "[", _TRUNCATE);
841     strncat_s(tmp, sizeof(tmp), strtime, _TRUNCATE);
842     strncat_s(tmp, sizeof(tmp), "] ", _TRUNCATE);
843     }
844    
845     /* 2007.05.24 Gentaro */
846     if( b == 0x0a ){
847     eLineEnd = Line_LineHead; /* set endmark*/
848     }
849     else {
850     eLineEnd = Line_Other; /* clear endmark*/
851     }
852    
853     if (WriteBufLen >= (WriteBufMax*4/5)) {
854     WriteBufMax *= 2;
855     WriteBuf = (PCHAR)realloc(WriteBuf, WriteBufMax);
856     }
857     memcpy(&WriteBuf[WriteBufLen], tmp, strlen(tmp));
858     WriteBufLen += strlen(tmp);
859     WriteBuf[WriteBufLen++] = b;
860    
861     (LogVar->ByteCount)++;
862     }
863     }
864    
865     PostThreadMessage(LogVar->LogThreadId, WM_DPC_LOGTHREAD_SEND, (WPARAM)WriteBuf, WriteBufLen);
866    
867     } else {
868    
869     while (Get1(Buf,&Start,&Count,&b))
870 maya 3227 {
871 yutakapon 5206 if (((cv.FilePause & OpLog)==0) && (! cv.ProtoFlag))
872     {
873     // �����������o��(2006.7.23 maya)
874     // ���t�t�H�[�}�b�g�����{�����������E�W�������X���� (2006.7.23 yutaka)
875     /* 2007.05.24 Gentaro */
876     // �~���b���\���������������X (2009.5.23 maya)
877     if ( ts.LogTimestamp && eLineEnd ) {
878     #if 1
879     #if 0
880     SYSTEMTIME LocalTime;
881     GetLocalTime(&LocalTime);
882     char strtime[27];
883 maya 3227
884 yutakapon 5206 // format time
885     sprintf(strtime, "[%04d/%02d/%02d %02d:%02d:%02d.%03d] ",
886     LocalTime.wYear, LocalTime.wMonth,LocalTime.wDay,
887     LocalTime.wHour, LocalTime.wMinute, LocalTime.wSecond,
888     LocalTime.wMilliseconds);
889     #else
890     char *strtime = mctimelocal();
891     #endif
892     #else
893     time_t tick = time(NULL);
894     char *strtime = ctime(&tick);
895     #endif
896     /* 2007.05.24 Gentaro */
897     if( eLineEnd == Line_FileHead ){
898     _lwrite(LogVar->FileHandle,"\r\n",2);
899     }
900     _lwrite(LogVar->FileHandle,"[",1);
901     _lwrite(LogVar->FileHandle, strtime, strlen(strtime));
902     _lwrite(LogVar->FileHandle,"] ",2);
903     }
904    
905 maya 3227 /* 2007.05.24 Gentaro */
906 yutakapon 5206 if( b == 0x0a ){
907     eLineEnd = Line_LineHead; /* set endmark*/
908 maya 3227 }
909 yutakapon 5206 else {
910     eLineEnd = Line_Other; /* clear endmark*/
911     }
912    
913     _lwrite(LogVar->FileHandle,(PCHAR)&b,1);
914     (LogVar->ByteCount)++;
915 maya 3227 }
916 yutakapon 5206 }
917 maya 3227
918     }
919    
920     logfile_unlock();
921    
922     if (FileLog)
923     {
924     cv.LStart = Start;
925     cv.LCount = Count;
926     }
927     else {
928     cv.BStart = Start;
929     cv.BCount = Count;
930     }
931     if (((cv.FilePause & OpLog) !=0) || cv.ProtoFlag) return;
932     if (FLogDlg!=NULL)
933     FLogDlg->RefreshNum();
934 yutakapon 5162
935     // ���O�E���[�e�[�g
936     LogRotate();
937    
938 maya 3227 }
939    
940     BOOL CreateLogBuf()
941     {
942     if (cv.HLogBuf==NULL)
943     {
944     cv.HLogBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
945     cv.LogBuf = NULL;
946     cv.LogPtr = 0;
947     cv.LStart = 0;
948     cv.LCount = 0;
949     cv.DStart = 0;
950     cv.DCount = 0;
951     }
952     return (cv.HLogBuf!=NULL);
953     }
954    
955     void FreeLogBuf()
956     {
957     if ((cv.HLogBuf==NULL) || FileLog || DDELog)
958     return;
959     if (cv.LogBuf!=NULL)
960     GlobalUnlock(cv.HLogBuf);
961     GlobalFree(cv.HLogBuf);
962     cv.HLogBuf = NULL;
963     cv.LogBuf = NULL;
964     cv.LogPtr = 0;
965     cv.LStart = 0;
966     cv.LCount = 0;
967     cv.DStart = 0;
968     cv.DCount = 0;
969     }
970    
971     BOOL CreateBinBuf()
972     {
973     if (cv.HBinBuf==NULL)
974     {
975     cv.HBinBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
976     cv.BinBuf = NULL;
977     cv.BinPtr = 0;
978     cv.BStart = 0;
979     cv.BCount = 0;
980     }
981     return (cv.HBinBuf!=NULL);
982     }
983    
984     void FreeBinBuf()
985     {
986     if ((cv.HBinBuf==NULL) || BinLog)
987     return;
988     if (cv.BinBuf!=NULL)
989     GlobalUnlock(cv.HBinBuf);
990     GlobalFree(cv.HBinBuf);
991     cv.HBinBuf = NULL;
992     cv.BinBuf = NULL;
993     cv.BinPtr = 0;
994     cv.BStart = 0;
995     cv.BCount = 0;
996     }
997    
998     extern "C" {
999     void FileSendStart()
1000     {
1001     LONG Option;
1002    
1003     if (! cv.Ready || FSend) return;
1004     if (cv.ProtoFlag)
1005     {
1006     FreeFileVar(&SendVar);
1007     return;
1008     }
1009    
1010     if (! LoadTTFILE())
1011     return;
1012     if (! NewFileVar(&SendVar))
1013     {
1014     FreeTTFILE();
1015     return;
1016     }
1017     SendVar->OpId = OpSendFile;
1018    
1019     FSend = TRUE;
1020    
1021     if (strlen(&(SendVar->FullName[SendVar->DirLen]))==0)
1022     {
1023     Option = MAKELONG(ts.TransBin,0);
1024     SendVar->FullName[0] = 0;
1025     if (! (*GetTransFname)(SendVar, ts.FileDir, GTF_SEND, &Option))
1026     {
1027     FileTransEnd(OpSendFile);
1028     return;
1029     }
1030     ts.TransBin = LOWORD(Option);
1031     }
1032     else
1033     (*SetFileVar)(SendVar);
1034    
1035     SendVar->FileHandle = _lopen(SendVar->FullName,OF_READ);
1036     SendVar->FileOpen = (SendVar->FileHandle>0);
1037     if (! SendVar->FileOpen)
1038     {
1039     FileTransEnd(OpSendFile);
1040     return;
1041     }
1042     SendVar->ByteCount = 0;
1043     SendVar->FileSize = GetFSize(SendVar->FullName);
1044    
1045     TalkStatus = IdTalkFile;
1046     FileRetrySend = FALSE;
1047     FileRetryEcho = FALSE;
1048     FileCRSend = FALSE;
1049 doda 3904 FileReadEOF = FALSE;
1050 maya 3227
1051 doda 3904 if (BracketedPasteMode()) {
1052     FileBracketMode = FS_BRACKET_START;
1053     FileBracketPtr = 0;
1054     BinaryMode = TRUE;
1055     }
1056     else {
1057     FileBracketMode = FS_BRACKET_NONE;
1058     BinaryMode = ts.TransBin;
1059     }
1060    
1061 maya 3227 if (! OpenFTDlg(SendVar))
1062     FileTransEnd(OpSendFile);
1063     }
1064     }
1065    
1066     void FileTransEnd(WORD OpId)
1067     /* OpId = 0: close Log and FileSend
1068     OpLog: close Log
1069     OpSendFile: close FileSend */
1070     {
1071     if (((OpId==0) || (OpId==OpLog)) && (FileLog || BinLog))
1072     {
1073     FileLog = FALSE;
1074     BinLog = FALSE;
1075     if (FLogDlg!=NULL)
1076     {
1077     FLogDlg->DestroyWindow();
1078     FLogDlg = NULL;
1079     HWndLog = NULL; // steven add
1080     }
1081     FreeFileVar(&LogVar);
1082     FreeLogBuf();
1083     FreeBinBuf();
1084     FreeTTFILE();
1085     }
1086    
1087     if (((OpId==0) || (OpId==OpSendFile)) && FSend)
1088     {
1089     FSend = FALSE;
1090     TalkStatus = IdTalkKeyb;
1091     if (SendDlg!=NULL)
1092     {
1093     SendDlg->DestroyWindow();
1094     SendDlg = NULL;
1095     }
1096     FreeFileVar(&SendVar);
1097     FreeTTFILE();
1098     }
1099    
1100     EndDdeCmnd(0);
1101     }
1102    
1103     int FSOut1(BYTE b)
1104     {
1105 doda 3904 if (BinaryMode)
1106 maya 3227 return CommBinaryOut(&cv,(PCHAR)&b,1);
1107     else if ((b>=0x20) || (b==0x09) || (b==0x0A) || (b==0x0D))
1108     return CommTextOut(&cv,(PCHAR)&b,1);
1109     else
1110     return 1;
1111 doda 3861 }
1112 maya 3227
1113     int FSEcho1(BYTE b)
1114     {
1115 doda 3904 if (BinaryMode)
1116 maya 3227 return CommBinaryEcho(&cv,(PCHAR)&b,1);
1117     else
1118     return CommTextEcho(&cv,(PCHAR)&b,1);
1119     }
1120    
1121     extern "C" {
1122     void FileSend()
1123     {
1124     WORD c, fc;
1125     LONG BCOld;
1126    
1127     if ((SendDlg==NULL) ||
1128     ((cv.FilePause & OpSendFile) !=0))
1129     return;
1130    
1131     BCOld = SendVar->ByteCount;
1132    
1133     if (FileRetrySend)
1134     {
1135     FileRetryEcho = (ts.LocalEcho>0);
1136     c = FSOut1(FileByte);
1137     FileRetrySend = (c==0);
1138     if (FileRetrySend)
1139     return;
1140     }
1141    
1142     if (FileRetryEcho)
1143     {
1144     c = FSEcho1(FileByte);
1145     FileRetryEcho = (c==0);
1146     if (FileRetryEcho)
1147     return;
1148     }
1149    
1150     do {
1151 doda 3904 if (FileBracketMode == FS_BRACKET_START) {
1152     FileByte = BracketStartStr[FileBracketPtr++];
1153     fc = 1;
1154 maya 3227
1155 doda 3904 if (FileBracketPtr >= sizeof(BracketStartStr) - 1) {
1156     FileBracketMode = FS_BRACKET_END;
1157     FileBracketPtr = 0;
1158     BinaryMode = ts.TransBin;
1159     }
1160     }
1161     else if (! FileReadEOF) {
1162 maya 3227 fc = _lread(SendVar->FileHandle,&FileByte,1);
1163     SendVar->ByteCount = SendVar->ByteCount + fc;
1164 doda 3904
1165     if (FileCRSend && (fc==1) && (FileByte==0x0A)) {
1166     fc = _lread(SendVar->FileHandle,&FileByte,1);
1167     SendVar->ByteCount = SendVar->ByteCount + fc;
1168     }
1169 maya 3227 }
1170 doda 3904 else {
1171     fc = 0;
1172     }
1173 maya 3227
1174 doda 3904 if (fc == 0 && FileBracketMode == FS_BRACKET_END) {
1175     FileReadEOF = TRUE;
1176     FileByte = BracketEndStr[FileBracketPtr++];
1177     fc = 1;
1178     BinaryMode = TRUE;
1179    
1180     if (FileBracketPtr >= sizeof(BracketEndStr) - 1) {
1181     FileBracketMode = FS_BRACKET_NONE;
1182     FileBracketPtr = 0;
1183     }
1184     }
1185    
1186    
1187 maya 3227 if (fc!=0)
1188     {
1189     c = FSOut1(FileByte);
1190     FileCRSend = (ts.TransBin==0) && (FileByte==0x0D);
1191     FileRetrySend = (c==0);
1192     if (FileRetrySend)
1193     {
1194     if (SendVar->ByteCount != BCOld)
1195     SendDlg->RefreshNum();
1196     return;
1197     }
1198     if (ts.LocalEcho>0)
1199     {
1200     c = FSEcho1(FileByte);
1201     FileRetryEcho = (c==0);
1202     if (FileRetryEcho)
1203     return;
1204     }
1205     }
1206 doda 3904 if ((fc==0) || ((SendVar->ByteCount % 100 == 0) && (FileBracketPtr == 0))) {
1207 maya 3227 SendDlg->RefreshNum();
1208     BCOld = SendVar->ByteCount;
1209     if (fc!=0)
1210     return;
1211     }
1212     } while (fc!=0);
1213    
1214     FileTransEnd(OpSendFile);
1215     }
1216     }
1217    
1218     extern "C" {
1219     void FLogChangeButton(BOOL Pause)
1220     {
1221     if (FLogDlg!=NULL)
1222     FLogDlg->ChangeButton(Pause);
1223     }
1224     }
1225    
1226     extern "C" {
1227     void FLogRefreshNum()
1228     {
1229     if (FLogDlg!=NULL)
1230     FLogDlg->RefreshNum();
1231     }
1232     }
1233    
1234     BOOL OpenProtoDlg(PFileVar fv, int IdProto, int Mode, WORD Opt1, WORD Opt2)
1235     {
1236     int vsize;
1237     PProtoDlg pd;
1238     HWND Hpd;
1239     char uimsg[MAX_UIMSG];
1240    
1241     ProtoId = IdProto;
1242    
1243     switch (ProtoId) {
1244     case PROTO_KMT:
1245     vsize = sizeof(TKmtVar);
1246     break;
1247     case PROTO_XM:
1248     vsize = sizeof(TXVar);
1249     break;
1250     case PROTO_YM:
1251     vsize = sizeof(TYVar);
1252     break;
1253     case PROTO_ZM:
1254     vsize = sizeof(TZVar);
1255     break;
1256     case PROTO_BP:
1257     vsize = sizeof(TBPVar);
1258     break;
1259     case PROTO_QV:
1260     vsize = sizeof(TQVVar);
1261     break;
1262     }
1263     ProtoVar = (PCHAR)malloc(vsize);
1264     if (ProtoVar==NULL)
1265     return FALSE;
1266    
1267     switch (ProtoId) {
1268     case PROTO_KMT:
1269     ((PKmtVar)ProtoVar)->KmtMode = Mode;
1270     break;
1271     case PROTO_XM:
1272     ((PXVar)ProtoVar)->XMode = Mode;
1273     ((PXVar)ProtoVar)->XOpt = Opt1;
1274     ((PXVar)ProtoVar)->TextFlag = 1 - (Opt2 & 1);
1275     break;
1276 yutakapon 3819 case PROTO_YM:
1277 maya 3227 ((PYVar)ProtoVar)->YMode = Mode;
1278 yutakapon 3819 ((PYVar)ProtoVar)->YOpt = Opt1;
1279 maya 3227 break;
1280     case PROTO_ZM:
1281     ((PZVar)ProtoVar)->BinFlag = (Opt1 & 1) != 0;
1282     ((PZVar)ProtoVar)->ZMode = Mode;
1283     break;
1284     case PROTO_BP:
1285     ((PBPVar)ProtoVar)->BPMode = Mode;
1286     break;
1287     case PROTO_QV:
1288     ((PQVVar)ProtoVar)->QVMode = Mode;
1289     break;
1290     }
1291    
1292     pd = new CProtoDlg();
1293     if (pd==NULL)
1294     {
1295     free(ProtoVar);
1296     ProtoVar = NULL;
1297     return FALSE;
1298     }
1299     pd->Create(fv,&ts);
1300    
1301     Hpd=pd->GetSafeHwnd();
1302    
1303     GetDlgItemText(Hpd, IDC_PROT_FILENAME, uimsg, sizeof(uimsg));
1304     get_lang_msg("DLG_PROT_FIELNAME", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1305     SetDlgItemText(Hpd, IDC_PROT_FILENAME, ts.UIMsg);
1306     GetDlgItemText(Hpd, IDC_PROT_PROT, uimsg, sizeof(uimsg));
1307     get_lang_msg("DLG_PROT_PROTO", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1308     SetDlgItemText(Hpd, IDC_PROT_PROT, ts.UIMsg);
1309     GetDlgItemText(Hpd, IDC_PROT_PACKET, uimsg, sizeof(uimsg));
1310     get_lang_msg("DLG_PROT_PACKET", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1311     SetDlgItemText(Hpd, IDC_PROT_PACKET, ts.UIMsg);
1312     GetDlgItemText(Hpd, IDC_PROT_TRANS, uimsg, sizeof(uimsg));
1313     get_lang_msg("DLG_PROT_TRANS", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1314     SetDlgItemText(Hpd, IDC_PROT_TRANS, ts.UIMsg);
1315 doda 4461 GetDlgItemText(Hpd, IDC_PROT_ELAPSED, uimsg, sizeof(uimsg));
1316     get_lang_msg("DLG_PROT_ELAPSED", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1317     SetDlgItemText(Hpd, IDC_PROT_ELAPSED, ts.UIMsg);
1318 maya 3227 GetDlgItemText(Hpd, IDCANCEL, uimsg, sizeof(uimsg));
1319     get_lang_msg("BTN_CANCEL", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1320     SetDlgItemText(Hpd, IDCANCEL, ts.UIMsg);
1321    
1322     (*ProtoInit)(ProtoId,FileVar,ProtoVar,&cv,&ts);
1323    
1324     PtDlg = pd;
1325     return TRUE;
1326     }
1327    
1328     extern "C" {
1329     void CloseProtoDlg()
1330     {
1331     if (PtDlg!=NULL)
1332     {
1333     PtDlg->DestroyWindow();
1334     PtDlg = NULL;
1335    
1336     ::KillTimer(FileVar->HMainWin,IdProtoTimer);
1337     if ((ProtoId==PROTO_QV) &&
1338     (((PQVVar)ProtoVar)->QVMode==IdQVSend))
1339     CommTextOut(&cv,"\015",1);
1340     if (FileVar->LogFlag)
1341     _lclose(FileVar->LogFile);
1342     FileVar->LogFile = 0;
1343     if (ProtoVar!=NULL)
1344     {
1345     free(ProtoVar);
1346     ProtoVar = NULL;
1347     }
1348     }
1349     }
1350     }
1351    
1352     BOOL ProtoStart()
1353     {
1354     if (cv.ProtoFlag)
1355     return FALSE;
1356     if (FSend)
1357     {
1358     FreeFileVar(&FileVar);
1359     return FALSE;
1360     }
1361    
1362     if (! LoadTTFILE())
1363     return FALSE;
1364     NewFileVar(&FileVar);
1365    
1366     if (FileVar==NULL)
1367     {
1368     FreeTTFILE();
1369     return FALSE;
1370     }
1371     cv.ProtoFlag = TRUE;
1372     return TRUE;
1373     }
1374    
1375     void ProtoEnd()
1376     {
1377     if (! cv.ProtoFlag)
1378     return;
1379     cv.ProtoFlag = FALSE;
1380    
1381     /* Enable transmit delay (serial port) */
1382     cv.DelayFlag = TRUE;
1383     TalkStatus = IdTalkKeyb;
1384    
1385     CloseProtoDlg();
1386    
1387     if ((FileVar!=NULL) && FileVar->Success)
1388     EndDdeCmnd(1);
1389     else
1390     EndDdeCmnd(0);
1391    
1392     FreeTTFILE();
1393     FreeFileVar(&FileVar);
1394     }
1395    
1396     extern "C" {
1397     int ProtoDlgParse()
1398     {
1399     int P;
1400    
1401     P = ActiveWin;
1402     if (PtDlg==NULL)
1403     return P;
1404    
1405     if ((*ProtoParse)(ProtoId,FileVar,ProtoVar,&cv))
1406     P = 0; /* continue */
1407     else {
1408     CommSend(&cv);
1409     ProtoEnd();
1410     }
1411     return P;
1412     }
1413     }
1414    
1415     extern "C" {
1416     void ProtoDlgTimeOut()
1417     {
1418     if (PtDlg!=NULL)
1419     (*ProtoTimeOutProc)(ProtoId,FileVar,ProtoVar,&cv);
1420     }
1421     }
1422    
1423     extern "C" {
1424     void ProtoDlgCancel()
1425     {
1426     if ((PtDlg!=NULL) &&
1427     (*ProtoCancel)(ProtoId,FileVar,ProtoVar,&cv))
1428     ProtoEnd();
1429     }
1430     }
1431    
1432     extern "C" {
1433     void KermitStart(int mode)
1434     {
1435     WORD w;
1436    
1437     if (! ProtoStart())
1438     return;
1439    
1440     switch (mode) {
1441     case IdKmtSend:
1442     FileVar->OpId = OpKmtSend;
1443     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1444     {
1445     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_KERMIT,&w) ||
1446     (FileVar->NumFname==0))
1447     {
1448     ProtoEnd();
1449     return;
1450     }
1451     }
1452     else
1453     (*SetFileVar)(FileVar);
1454     break;
1455     case IdKmtReceive:
1456     FileVar->OpId = OpKmtRcv;
1457     break;
1458     case IdKmtGet:
1459     FileVar->OpId = OpKmtSend;
1460     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1461     {
1462     if (! (*GetGetFname)(FileVar->HMainWin,FileVar) ||
1463     (strlen(FileVar->FullName)==0))
1464     {
1465     ProtoEnd();
1466     return;
1467     }
1468     }
1469     else
1470     (*SetFileVar)(FileVar);
1471     break;
1472     case IdKmtFinish:
1473     FileVar->OpId = OpKmtFin;
1474     break;
1475     default:
1476     ProtoEnd();
1477     return;
1478     }
1479     TalkStatus = IdTalkQuiet;
1480    
1481     /* disable transmit delay (serial port) */
1482     cv.DelayFlag = FALSE;
1483    
1484     if (! OpenProtoDlg(FileVar,PROTO_KMT,mode,0,0))
1485     ProtoEnd();
1486     }
1487     }
1488    
1489     extern "C" {
1490     void XMODEMStart(int mode)
1491     {
1492     LONG Option;
1493    
1494     if (! ProtoStart())
1495     return;
1496    
1497     if (mode==IdXReceive)
1498     FileVar->OpId = OpXRcv;
1499     else
1500     FileVar->OpId = OpXSend;
1501    
1502     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1503     {
1504     Option = MAKELONG(ts.XmodemBin,ts.XmodemOpt);
1505     if (! (*GetXFname)(FileVar->HMainWin,
1506     mode==IdXReceive,&Option,FileVar,ts.FileDir))
1507     {
1508     ProtoEnd();
1509     return;
1510     }
1511     ts.XmodemOpt = HIWORD(Option);
1512     ts.XmodemBin = LOWORD(Option);
1513     }
1514     else
1515     (*SetFileVar)(FileVar);
1516    
1517     if (mode==IdXReceive)
1518     FileVar->FileHandle = _lcreat(FileVar->FullName,0);
1519     else
1520     FileVar->FileHandle = _lopen(FileVar->FullName,OF_READ);
1521    
1522     FileVar->FileOpen = FileVar->FileHandle>0;
1523     if (! FileVar->FileOpen)
1524     {
1525     ProtoEnd();
1526     return;
1527     }
1528     TalkStatus = IdTalkQuiet;
1529    
1530     /* disable transmit delay (serial port) */
1531     cv.DelayFlag = FALSE;
1532    
1533     if (! OpenProtoDlg(FileVar,PROTO_XM,mode,
1534     ts.XmodemOpt,ts.XmodemBin))
1535     ProtoEnd();
1536     }
1537     }
1538    
1539     extern "C" {
1540     void YMODEMStart(int mode)
1541     {
1542     WORD Opt;
1543    
1544     if (! ProtoStart())
1545     return;
1546    
1547     if (mode==IdYSend)
1548     {
1549 yutakapon 3819 // �t�@�C���]�������I�v�V������"Yopt1K"�����������B
1550     // TODO: "Yopt1K", "YoptG", "YoptSingle"�������������������AIDD_FOPT���g�������K�v�����B
1551     Opt = Yopt1K;
1552 maya 3227 FileVar->OpId = OpYSend;
1553     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1554     {
1555     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Y,&Opt) ||
1556     (FileVar->NumFname==0))
1557     {
1558     ProtoEnd();
1559     return;
1560     }
1561 yutakapon 3819 //ts.XmodemBin = Opt;
1562 maya 3227 }
1563     else
1564     (*SetFileVar)(FileVar);
1565     }
1566 yutakapon 3820 else {/* IdZReceive or IdZAuto */
1567 maya 3227 FileVar->OpId = OpYRcv;
1568 yutakapon 3820 // �t�@�C���]�������I�v�V������"Yopt1K"�����������B
1569     Opt = Yopt1K;
1570 yutakapon 3821 (*SetFileVar)(FileVar);
1571 yutakapon 3820 }
1572 maya 3227
1573     TalkStatus = IdTalkQuiet;
1574    
1575     /* disable transmit delay (serial port) */
1576     cv.DelayFlag = FALSE;
1577    
1578     if (! OpenProtoDlg(FileVar,PROTO_YM,mode,Opt,0))
1579     ProtoEnd();
1580     }
1581     }
1582    
1583     extern "C" {
1584     void ZMODEMStart(int mode)
1585     {
1586     WORD Opt;
1587    
1588     if (! ProtoStart())
1589     return;
1590    
1591     if (mode==IdZSend)
1592     {
1593     Opt = ts.XmodemBin;
1594     FileVar->OpId = OpZSend;
1595     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1596     {
1597     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Z,&Opt) ||
1598     (FileVar->NumFname==0))
1599     {
1600     ProtoEnd();
1601     return;
1602     }
1603     ts.XmodemBin = Opt;
1604     }
1605     else
1606     (*SetFileVar)(FileVar);
1607     }
1608     else /* IdZReceive or IdZAuto */
1609     FileVar->OpId = OpZRcv;
1610    
1611     TalkStatus = IdTalkQuiet;
1612    
1613     /* disable transmit delay (serial port) */
1614     cv.DelayFlag = FALSE;
1615    
1616     if (! OpenProtoDlg(FileVar,PROTO_ZM,mode,Opt,0))
1617     ProtoEnd();
1618     }
1619     }
1620    
1621     extern "C" {
1622     void BPStart(int mode)
1623     {
1624     LONG Option;
1625    
1626     if (! ProtoStart())
1627     return;
1628     if (mode==IdBPSend)
1629     {
1630     FileVar->OpId = OpBPSend;
1631     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1632     {
1633     FileVar->FullName[0] = 0;
1634     if (! (*GetTransFname)(FileVar, ts.FileDir, GTF_BP, &Option))
1635     {
1636     ProtoEnd();
1637     return;
1638     }
1639     }
1640     else
1641     (*SetFileVar)(FileVar);
1642     }
1643     else /* IdBPReceive or IdBPAuto */
1644     FileVar->OpId = OpBPRcv;
1645    
1646     TalkStatus = IdTalkQuiet;
1647    
1648     /* disable transmit delay (serial port) */
1649     cv.DelayFlag = FALSE;
1650    
1651     if (! OpenProtoDlg(FileVar,PROTO_BP,mode,0,0))
1652     ProtoEnd();
1653     }
1654     }
1655    
1656     extern "C" {
1657     void QVStart(int mode)
1658     {
1659     WORD W;
1660    
1661     if (! ProtoStart())
1662     return;
1663    
1664     if (mode==IdQVSend)
1665     {
1666     FileVar->OpId = OpQVSend;
1667     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1668     {
1669     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_QV, &W) ||
1670     (FileVar->NumFname==0))
1671     {
1672     ProtoEnd();
1673     return;
1674     }
1675     }
1676     else
1677     (*SetFileVar)(FileVar);
1678     }
1679     else
1680     FileVar->OpId = OpQVRcv;
1681    
1682     TalkStatus = IdTalkQuiet;
1683    
1684     /* disable transmit delay (serial port) */
1685     cv.DelayFlag = FALSE;
1686    
1687     if (! OpenProtoDlg(FileVar,PROTO_QV,mode,0,0))
1688     ProtoEnd();
1689     }
1690     }

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