Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /branches/ttcomtester/teraterm/teraterm/filesys_log.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5273 - (hide annotations) (download) (as text)
Tue May 21 03:15:39 2013 UTC (10 years, 10 months ago) by maya
Original Path: trunk/teraterm/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 38582 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     SendVar->FileHandle = _lopen(SendVar->FullName,OF_READ);
1064     SendVar->FileOpen = (SendVar->FileHandle>0);
1065     if (! SendVar->FileOpen)
1066     {
1067     FileTransEnd(OpSendFile);
1068     return;
1069     }
1070     SendVar->ByteCount = 0;
1071     SendVar->FileSize = GetFSize(SendVar->FullName);
1072    
1073     TalkStatus = IdTalkFile;
1074     FileRetrySend = FALSE;
1075     FileRetryEcho = FALSE;
1076     FileCRSend = FALSE;
1077 doda 3904 FileReadEOF = FALSE;
1078 maya 3227
1079 doda 3904 if (BracketedPasteMode()) {
1080     FileBracketMode = FS_BRACKET_START;
1081     FileBracketPtr = 0;
1082     BinaryMode = TRUE;
1083     }
1084     else {
1085     FileBracketMode = FS_BRACKET_NONE;
1086     BinaryMode = ts.TransBin;
1087     }
1088    
1089 maya 3227 if (! OpenFTDlg(SendVar))
1090     FileTransEnd(OpSendFile);
1091     }
1092     }
1093    
1094     void FileTransEnd(WORD OpId)
1095     /* OpId = 0: close Log and FileSend
1096     OpLog: close Log
1097     OpSendFile: close FileSend */
1098     {
1099     if (((OpId==0) || (OpId==OpLog)) && (FileLog || BinLog))
1100     {
1101     FileLog = FALSE;
1102     BinLog = FALSE;
1103     if (FLogDlg!=NULL)
1104     {
1105     FLogDlg->DestroyWindow();
1106     FLogDlg = NULL;
1107     HWndLog = NULL; // steven add
1108     }
1109     FreeFileVar(&LogVar);
1110     FreeLogBuf();
1111     FreeBinBuf();
1112     FreeTTFILE();
1113     }
1114    
1115     if (((OpId==0) || (OpId==OpSendFile)) && FSend)
1116     {
1117     FSend = FALSE;
1118     TalkStatus = IdTalkKeyb;
1119     if (SendDlg!=NULL)
1120     {
1121     SendDlg->DestroyWindow();
1122     SendDlg = NULL;
1123     }
1124     FreeFileVar(&SendVar);
1125     FreeTTFILE();
1126     }
1127    
1128     EndDdeCmnd(0);
1129     }
1130    
1131     int FSOut1(BYTE b)
1132     {
1133 doda 3904 if (BinaryMode)
1134 maya 3227 return CommBinaryOut(&cv,(PCHAR)&b,1);
1135     else if ((b>=0x20) || (b==0x09) || (b==0x0A) || (b==0x0D))
1136     return CommTextOut(&cv,(PCHAR)&b,1);
1137     else
1138     return 1;
1139 doda 3861 }
1140 maya 3227
1141     int FSEcho1(BYTE b)
1142     {
1143 doda 3904 if (BinaryMode)
1144 maya 3227 return CommBinaryEcho(&cv,(PCHAR)&b,1);
1145     else
1146     return CommTextEcho(&cv,(PCHAR)&b,1);
1147     }
1148    
1149     extern "C" {
1150     void FileSend()
1151     {
1152     WORD c, fc;
1153     LONG BCOld;
1154    
1155     if ((SendDlg==NULL) ||
1156     ((cv.FilePause & OpSendFile) !=0))
1157     return;
1158    
1159     BCOld = SendVar->ByteCount;
1160    
1161     if (FileRetrySend)
1162     {
1163     FileRetryEcho = (ts.LocalEcho>0);
1164     c = FSOut1(FileByte);
1165     FileRetrySend = (c==0);
1166     if (FileRetrySend)
1167     return;
1168     }
1169    
1170     if (FileRetryEcho)
1171     {
1172     c = FSEcho1(FileByte);
1173     FileRetryEcho = (c==0);
1174     if (FileRetryEcho)
1175     return;
1176     }
1177    
1178     do {
1179 doda 3904 if (FileBracketMode == FS_BRACKET_START) {
1180     FileByte = BracketStartStr[FileBracketPtr++];
1181     fc = 1;
1182 maya 3227
1183 doda 3904 if (FileBracketPtr >= sizeof(BracketStartStr) - 1) {
1184     FileBracketMode = FS_BRACKET_END;
1185     FileBracketPtr = 0;
1186     BinaryMode = ts.TransBin;
1187     }
1188     }
1189     else if (! FileReadEOF) {
1190 maya 3227 fc = _lread(SendVar->FileHandle,&FileByte,1);
1191     SendVar->ByteCount = SendVar->ByteCount + fc;
1192 doda 3904
1193     if (FileCRSend && (fc==1) && (FileByte==0x0A)) {
1194     fc = _lread(SendVar->FileHandle,&FileByte,1);
1195     SendVar->ByteCount = SendVar->ByteCount + fc;
1196     }
1197 maya 3227 }
1198 doda 3904 else {
1199     fc = 0;
1200     }
1201 maya 3227
1202 doda 3904 if (fc == 0 && FileBracketMode == FS_BRACKET_END) {
1203     FileReadEOF = TRUE;
1204     FileByte = BracketEndStr[FileBracketPtr++];
1205     fc = 1;
1206     BinaryMode = TRUE;
1207    
1208     if (FileBracketPtr >= sizeof(BracketEndStr) - 1) {
1209     FileBracketMode = FS_BRACKET_NONE;
1210     FileBracketPtr = 0;
1211     }
1212     }
1213    
1214    
1215 maya 3227 if (fc!=0)
1216     {
1217     c = FSOut1(FileByte);
1218     FileCRSend = (ts.TransBin==0) && (FileByte==0x0D);
1219     FileRetrySend = (c==0);
1220     if (FileRetrySend)
1221     {
1222     if (SendVar->ByteCount != BCOld)
1223     SendDlg->RefreshNum();
1224     return;
1225     }
1226     if (ts.LocalEcho>0)
1227     {
1228     c = FSEcho1(FileByte);
1229     FileRetryEcho = (c==0);
1230     if (FileRetryEcho)
1231     return;
1232     }
1233     }
1234 doda 3904 if ((fc==0) || ((SendVar->ByteCount % 100 == 0) && (FileBracketPtr == 0))) {
1235 maya 3227 SendDlg->RefreshNum();
1236     BCOld = SendVar->ByteCount;
1237     if (fc!=0)
1238     return;
1239     }
1240     } while (fc!=0);
1241    
1242     FileTransEnd(OpSendFile);
1243     }
1244     }
1245    
1246     extern "C" {
1247     void FLogChangeButton(BOOL Pause)
1248     {
1249     if (FLogDlg!=NULL)
1250     FLogDlg->ChangeButton(Pause);
1251     }
1252     }
1253    
1254     extern "C" {
1255     void FLogRefreshNum()
1256     {
1257     if (FLogDlg!=NULL)
1258     FLogDlg->RefreshNum();
1259     }
1260     }
1261    
1262     BOOL OpenProtoDlg(PFileVar fv, int IdProto, int Mode, WORD Opt1, WORD Opt2)
1263     {
1264     int vsize;
1265     PProtoDlg pd;
1266     HWND Hpd;
1267     char uimsg[MAX_UIMSG];
1268    
1269     ProtoId = IdProto;
1270    
1271     switch (ProtoId) {
1272     case PROTO_KMT:
1273     vsize = sizeof(TKmtVar);
1274     break;
1275     case PROTO_XM:
1276     vsize = sizeof(TXVar);
1277     break;
1278     case PROTO_YM:
1279     vsize = sizeof(TYVar);
1280     break;
1281     case PROTO_ZM:
1282     vsize = sizeof(TZVar);
1283     break;
1284     case PROTO_BP:
1285     vsize = sizeof(TBPVar);
1286     break;
1287     case PROTO_QV:
1288     vsize = sizeof(TQVVar);
1289     break;
1290     }
1291     ProtoVar = (PCHAR)malloc(vsize);
1292     if (ProtoVar==NULL)
1293     return FALSE;
1294    
1295     switch (ProtoId) {
1296     case PROTO_KMT:
1297     ((PKmtVar)ProtoVar)->KmtMode = Mode;
1298     break;
1299     case PROTO_XM:
1300     ((PXVar)ProtoVar)->XMode = Mode;
1301     ((PXVar)ProtoVar)->XOpt = Opt1;
1302     ((PXVar)ProtoVar)->TextFlag = 1 - (Opt2 & 1);
1303     break;
1304 yutakapon 3819 case PROTO_YM:
1305 maya 3227 ((PYVar)ProtoVar)->YMode = Mode;
1306 yutakapon 3819 ((PYVar)ProtoVar)->YOpt = Opt1;
1307 maya 3227 break;
1308     case PROTO_ZM:
1309     ((PZVar)ProtoVar)->BinFlag = (Opt1 & 1) != 0;
1310     ((PZVar)ProtoVar)->ZMode = Mode;
1311     break;
1312     case PROTO_BP:
1313     ((PBPVar)ProtoVar)->BPMode = Mode;
1314     break;
1315     case PROTO_QV:
1316     ((PQVVar)ProtoVar)->QVMode = Mode;
1317     break;
1318     }
1319    
1320     pd = new CProtoDlg();
1321     if (pd==NULL)
1322     {
1323     free(ProtoVar);
1324     ProtoVar = NULL;
1325     return FALSE;
1326     }
1327     pd->Create(fv,&ts);
1328    
1329     Hpd=pd->GetSafeHwnd();
1330    
1331     GetDlgItemText(Hpd, IDC_PROT_FILENAME, uimsg, sizeof(uimsg));
1332     get_lang_msg("DLG_PROT_FIELNAME", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1333     SetDlgItemText(Hpd, IDC_PROT_FILENAME, ts.UIMsg);
1334     GetDlgItemText(Hpd, IDC_PROT_PROT, uimsg, sizeof(uimsg));
1335     get_lang_msg("DLG_PROT_PROTO", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1336     SetDlgItemText(Hpd, IDC_PROT_PROT, ts.UIMsg);
1337     GetDlgItemText(Hpd, IDC_PROT_PACKET, uimsg, sizeof(uimsg));
1338     get_lang_msg("DLG_PROT_PACKET", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1339     SetDlgItemText(Hpd, IDC_PROT_PACKET, ts.UIMsg);
1340     GetDlgItemText(Hpd, IDC_PROT_TRANS, uimsg, sizeof(uimsg));
1341     get_lang_msg("DLG_PROT_TRANS", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1342     SetDlgItemText(Hpd, IDC_PROT_TRANS, ts.UIMsg);
1343 doda 4461 GetDlgItemText(Hpd, IDC_PROT_ELAPSED, uimsg, sizeof(uimsg));
1344     get_lang_msg("DLG_PROT_ELAPSED", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1345     SetDlgItemText(Hpd, IDC_PROT_ELAPSED, ts.UIMsg);
1346 maya 3227 GetDlgItemText(Hpd, IDCANCEL, uimsg, sizeof(uimsg));
1347     get_lang_msg("BTN_CANCEL", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1348     SetDlgItemText(Hpd, IDCANCEL, ts.UIMsg);
1349    
1350     (*ProtoInit)(ProtoId,FileVar,ProtoVar,&cv,&ts);
1351    
1352     PtDlg = pd;
1353     return TRUE;
1354     }
1355    
1356     extern "C" {
1357     void CloseProtoDlg()
1358     {
1359     if (PtDlg!=NULL)
1360     {
1361     PtDlg->DestroyWindow();
1362     PtDlg = NULL;
1363    
1364     ::KillTimer(FileVar->HMainWin,IdProtoTimer);
1365     if ((ProtoId==PROTO_QV) &&
1366     (((PQVVar)ProtoVar)->QVMode==IdQVSend))
1367     CommTextOut(&cv,"\015",1);
1368     if (FileVar->LogFlag)
1369     _lclose(FileVar->LogFile);
1370     FileVar->LogFile = 0;
1371     if (ProtoVar!=NULL)
1372     {
1373     free(ProtoVar);
1374     ProtoVar = NULL;
1375     }
1376     }
1377     }
1378     }
1379    
1380     BOOL ProtoStart()
1381     {
1382     if (cv.ProtoFlag)
1383     return FALSE;
1384     if (FSend)
1385     {
1386     FreeFileVar(&FileVar);
1387     return FALSE;
1388     }
1389    
1390     if (! LoadTTFILE())
1391     return FALSE;
1392     NewFileVar(&FileVar);
1393    
1394     if (FileVar==NULL)
1395     {
1396     FreeTTFILE();
1397     return FALSE;
1398     }
1399     cv.ProtoFlag = TRUE;
1400     return TRUE;
1401     }
1402    
1403     void ProtoEnd()
1404     {
1405     if (! cv.ProtoFlag)
1406     return;
1407     cv.ProtoFlag = FALSE;
1408    
1409     /* Enable transmit delay (serial port) */
1410     cv.DelayFlag = TRUE;
1411     TalkStatus = IdTalkKeyb;
1412    
1413     CloseProtoDlg();
1414    
1415     if ((FileVar!=NULL) && FileVar->Success)
1416     EndDdeCmnd(1);
1417     else
1418     EndDdeCmnd(0);
1419    
1420     FreeTTFILE();
1421     FreeFileVar(&FileVar);
1422     }
1423    
1424     extern "C" {
1425     int ProtoDlgParse()
1426     {
1427     int P;
1428    
1429     P = ActiveWin;
1430     if (PtDlg==NULL)
1431     return P;
1432    
1433     if ((*ProtoParse)(ProtoId,FileVar,ProtoVar,&cv))
1434     P = 0; /* continue */
1435     else {
1436     CommSend(&cv);
1437     ProtoEnd();
1438     }
1439     return P;
1440     }
1441     }
1442    
1443     extern "C" {
1444     void ProtoDlgTimeOut()
1445     {
1446     if (PtDlg!=NULL)
1447     (*ProtoTimeOutProc)(ProtoId,FileVar,ProtoVar,&cv);
1448     }
1449     }
1450    
1451     extern "C" {
1452     void ProtoDlgCancel()
1453     {
1454     if ((PtDlg!=NULL) &&
1455     (*ProtoCancel)(ProtoId,FileVar,ProtoVar,&cv))
1456     ProtoEnd();
1457     }
1458     }
1459    
1460     extern "C" {
1461     void KermitStart(int mode)
1462     {
1463     WORD w;
1464    
1465     if (! ProtoStart())
1466     return;
1467    
1468     switch (mode) {
1469     case IdKmtSend:
1470     FileVar->OpId = OpKmtSend;
1471     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1472     {
1473     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_KERMIT,&w) ||
1474     (FileVar->NumFname==0))
1475     {
1476     ProtoEnd();
1477     return;
1478     }
1479     }
1480     else
1481     (*SetFileVar)(FileVar);
1482     break;
1483     case IdKmtReceive:
1484     FileVar->OpId = OpKmtRcv;
1485     break;
1486     case IdKmtGet:
1487     FileVar->OpId = OpKmtSend;
1488     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1489     {
1490     if (! (*GetGetFname)(FileVar->HMainWin,FileVar) ||
1491     (strlen(FileVar->FullName)==0))
1492     {
1493     ProtoEnd();
1494     return;
1495     }
1496     }
1497     else
1498     (*SetFileVar)(FileVar);
1499     break;
1500     case IdKmtFinish:
1501     FileVar->OpId = OpKmtFin;
1502     break;
1503     default:
1504     ProtoEnd();
1505     return;
1506     }
1507     TalkStatus = IdTalkQuiet;
1508    
1509     /* disable transmit delay (serial port) */
1510     cv.DelayFlag = FALSE;
1511    
1512     if (! OpenProtoDlg(FileVar,PROTO_KMT,mode,0,0))
1513     ProtoEnd();
1514     }
1515     }
1516    
1517     extern "C" {
1518     void XMODEMStart(int mode)
1519     {
1520     LONG Option;
1521    
1522     if (! ProtoStart())
1523     return;
1524    
1525     if (mode==IdXReceive)
1526     FileVar->OpId = OpXRcv;
1527     else
1528     FileVar->OpId = OpXSend;
1529    
1530     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1531     {
1532     Option = MAKELONG(ts.XmodemBin,ts.XmodemOpt);
1533     if (! (*GetXFname)(FileVar->HMainWin,
1534     mode==IdXReceive,&Option,FileVar,ts.FileDir))
1535     {
1536     ProtoEnd();
1537     return;
1538     }
1539     ts.XmodemOpt = HIWORD(Option);
1540     ts.XmodemBin = LOWORD(Option);
1541     }
1542     else
1543     (*SetFileVar)(FileVar);
1544    
1545     if (mode==IdXReceive)
1546     FileVar->FileHandle = _lcreat(FileVar->FullName,0);
1547     else
1548     FileVar->FileHandle = _lopen(FileVar->FullName,OF_READ);
1549    
1550     FileVar->FileOpen = FileVar->FileHandle>0;
1551     if (! FileVar->FileOpen)
1552     {
1553     ProtoEnd();
1554     return;
1555     }
1556     TalkStatus = IdTalkQuiet;
1557    
1558     /* disable transmit delay (serial port) */
1559     cv.DelayFlag = FALSE;
1560    
1561     if (! OpenProtoDlg(FileVar,PROTO_XM,mode,
1562     ts.XmodemOpt,ts.XmodemBin))
1563     ProtoEnd();
1564     }
1565     }
1566    
1567     extern "C" {
1568     void YMODEMStart(int mode)
1569     {
1570     WORD Opt;
1571    
1572     if (! ProtoStart())
1573     return;
1574    
1575     if (mode==IdYSend)
1576     {
1577 yutakapon 3819 // �t�@�C���]�������I�v�V������"Yopt1K"�����������B
1578     // TODO: "Yopt1K", "YoptG", "YoptSingle"�������������������AIDD_FOPT���g�������K�v�����B
1579     Opt = Yopt1K;
1580 maya 3227 FileVar->OpId = OpYSend;
1581     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1582     {
1583     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Y,&Opt) ||
1584     (FileVar->NumFname==0))
1585     {
1586     ProtoEnd();
1587     return;
1588     }
1589 yutakapon 3819 //ts.XmodemBin = Opt;
1590 maya 3227 }
1591     else
1592     (*SetFileVar)(FileVar);
1593     }
1594 yutakapon 3820 else {/* IdZReceive or IdZAuto */
1595 maya 3227 FileVar->OpId = OpYRcv;
1596 yutakapon 3820 // �t�@�C���]�������I�v�V������"Yopt1K"�����������B
1597     Opt = Yopt1K;
1598 yutakapon 3821 (*SetFileVar)(FileVar);
1599 yutakapon 3820 }
1600 maya 3227
1601     TalkStatus = IdTalkQuiet;
1602    
1603     /* disable transmit delay (serial port) */
1604     cv.DelayFlag = FALSE;
1605    
1606     if (! OpenProtoDlg(FileVar,PROTO_YM,mode,Opt,0))
1607     ProtoEnd();
1608     }
1609     }
1610    
1611     extern "C" {
1612     void ZMODEMStart(int mode)
1613     {
1614     WORD Opt;
1615    
1616     if (! ProtoStart())
1617     return;
1618    
1619     if (mode==IdZSend)
1620     {
1621     Opt = ts.XmodemBin;
1622     FileVar->OpId = OpZSend;
1623     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1624     {
1625     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Z,&Opt) ||
1626     (FileVar->NumFname==0))
1627     {
1628     ProtoEnd();
1629     return;
1630     }
1631     ts.XmodemBin = Opt;
1632     }
1633     else
1634     (*SetFileVar)(FileVar);
1635     }
1636     else /* IdZReceive or IdZAuto */
1637     FileVar->OpId = OpZRcv;
1638    
1639     TalkStatus = IdTalkQuiet;
1640    
1641     /* disable transmit delay (serial port) */
1642     cv.DelayFlag = FALSE;
1643    
1644     if (! OpenProtoDlg(FileVar,PROTO_ZM,mode,Opt,0))
1645     ProtoEnd();
1646     }
1647     }
1648    
1649     extern "C" {
1650     void BPStart(int mode)
1651     {
1652     LONG Option;
1653    
1654     if (! ProtoStart())
1655     return;
1656     if (mode==IdBPSend)
1657     {
1658     FileVar->OpId = OpBPSend;
1659     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1660     {
1661     FileVar->FullName[0] = 0;
1662     if (! (*GetTransFname)(FileVar, ts.FileDir, GTF_BP, &Option))
1663     {
1664     ProtoEnd();
1665     return;
1666     }
1667     }
1668     else
1669     (*SetFileVar)(FileVar);
1670     }
1671     else /* IdBPReceive or IdBPAuto */
1672     FileVar->OpId = OpBPRcv;
1673    
1674     TalkStatus = IdTalkQuiet;
1675    
1676     /* disable transmit delay (serial port) */
1677     cv.DelayFlag = FALSE;
1678    
1679     if (! OpenProtoDlg(FileVar,PROTO_BP,mode,0,0))
1680     ProtoEnd();
1681     }
1682     }
1683    
1684     extern "C" {
1685     void QVStart(int mode)
1686     {
1687     WORD W;
1688    
1689     if (! ProtoStart())
1690     return;
1691    
1692     if (mode==IdQVSend)
1693     {
1694     FileVar->OpId = OpQVSend;
1695     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1696     {
1697     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_QV, &W) ||
1698     (FileVar->NumFname==0))
1699     {
1700     ProtoEnd();
1701     return;
1702     }
1703     }
1704     else
1705     (*SetFileVar)(FileVar);
1706     }
1707     else
1708     FileVar->OpId = OpQVRcv;
1709    
1710     TalkStatus = IdTalkQuiet;
1711    
1712     /* disable transmit delay (serial port) */
1713     cv.DelayFlag = FALSE;
1714    
1715     if (! OpenProtoDlg(FileVar,PROTO_QV,mode,0,0))
1716     ProtoEnd();
1717     }
1718     }

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