Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/teraterm/teraterm/filesys_log.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2557 - (show annotations) (download) (as text)
Tue Jul 8 16:43:56 2008 UTC (15 years, 9 months ago) by yutakapon
Original Path: teraterm/trunk/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 27982 byte(s)
ログファイルがオープンできない場合に、エラーメッセージ表示するようにした。ただし、マクロからlogopenした場合は
何も表示しない。

1 /* 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
20 #include "filesys.h"
21 #include "ftlib.h"
22
23 PFileVar LogVar = NULL;
24 PFileVar SendVar = NULL;
25 PFileVar FileVar = NULL;
26 static PCHAR ProtoVar = NULL;
27 static int ProtoId;
28
29 static BYTE LogLast = 0;
30 BOOL FileLog = FALSE;
31 BOOL BinLog = FALSE;
32 BOOL DDELog = FALSE;
33 static BOOL FileRetrySend, FileRetryEcho, FileCRSend;
34 static BYTE FileByte;
35
36 static BOOL FSend = FALSE;
37
38 HWND HWndLog = NULL; //steven add
39
40 static HMODULE HTTFILE = NULL;
41 static int TTFILECount = 0;
42
43 PGetSetupFname GetSetupFname;
44 PGetTransFname GetTransFname;
45 PGetMultiFname GetMultiFname;
46 PGetGetFname GetGetFname;
47 PSetFileVar SetFileVar;
48 PGetXFname GetXFname;
49 PProtoInit ProtoInit;
50 PProtoParse ProtoParse;
51 PProtoTimeOutProc ProtoTimeOutProc;
52 PProtoCancel ProtoCancel;
53
54 #define IdGetSetupFname 1
55 #define IdGetTransFname 2
56 #define IdGetMultiFname 3
57 #define IdGetGetFname 4
58 #define IdSetFileVar 5
59 #define IdGetXFname 6
60
61 #define IdProtoInit 7
62 #define IdProtoParse 8
63 #define IdProtoTimeOutProc 9
64 #define IdProtoCancel 10
65
66 /*
67 Line Head flag for timestamping
68 2007.05.24 Gentaro
69 */
70 enum enumLineEnd {
71 Line_Other = 0,
72 Line_LineHead = 1,
73 Line_FileHead = 2,
74 };
75
76 enum enumLineEnd eLineEnd = Line_LineHead;
77
78 BOOL LoadTTFILE()
79 {
80 BOOL Err;
81
82 if (HTTFILE != NULL)
83 {
84 TTFILECount++;
85 return TRUE;
86 }
87 else
88 TTFILECount = 0;
89
90 HTTFILE = LoadLibrary("TTPFILE.DLL");
91 if (HTTFILE == NULL)
92 return FALSE;
93
94 TTFILESetUILanguageFile(ts.UILanguageFile);
95 TTFILESetFileSendFilter(ts.FileSendFilter);
96
97 Err = FALSE;
98 GetSetupFname = (PGetSetupFname)GetProcAddress(HTTFILE,
99 MAKEINTRESOURCE(IdGetSetupFname));
100 if (GetSetupFname==NULL)
101 Err = TRUE;
102
103 GetTransFname = (PGetTransFname)GetProcAddress(HTTFILE,
104 MAKEINTRESOURCE(IdGetTransFname));
105 if (GetTransFname==NULL)
106 Err = TRUE;
107
108 GetMultiFname = (PGetMultiFname)GetProcAddress(HTTFILE,
109 MAKEINTRESOURCE(IdGetMultiFname));
110 if (GetMultiFname==NULL)
111 Err = TRUE;
112
113 GetGetFname = (PGetGetFname)GetProcAddress(HTTFILE,
114 MAKEINTRESOURCE(IdGetGetFname));
115 if (GetGetFname==NULL)
116 Err = TRUE;
117
118 SetFileVar = (PSetFileVar)GetProcAddress(HTTFILE,
119 MAKEINTRESOURCE(IdSetFileVar));
120 if (SetFileVar==NULL)
121 Err = TRUE;
122
123 GetXFname = (PGetXFname)GetProcAddress(HTTFILE,
124 MAKEINTRESOURCE(IdGetXFname));
125 if (GetXFname==NULL)
126 Err = TRUE;
127
128 ProtoInit = (PProtoInit)GetProcAddress(HTTFILE,
129 MAKEINTRESOURCE(IdProtoInit));
130 if (ProtoInit==NULL)
131 Err = TRUE;
132
133 ProtoParse = (PProtoParse)GetProcAddress(HTTFILE,
134 MAKEINTRESOURCE(IdProtoParse));
135 if (ProtoParse==NULL)
136 Err = TRUE;
137
138 ProtoTimeOutProc = (PProtoTimeOutProc)GetProcAddress(HTTFILE,
139 MAKEINTRESOURCE(IdProtoTimeOutProc));
140 if (ProtoTimeOutProc==NULL)
141 Err = TRUE;
142
143 ProtoCancel = (PProtoCancel)GetProcAddress(HTTFILE,
144 MAKEINTRESOURCE(IdProtoCancel));
145 if (ProtoCancel==NULL)
146 Err = TRUE;
147
148 if (Err)
149 {
150 FreeLibrary(HTTFILE);
151 HTTFILE = NULL;
152 return FALSE;
153 }
154 else {
155 TTFILECount = 1;
156 return TRUE;
157 }
158 }
159
160 BOOL FreeTTFILE()
161 {
162 if (TTFILECount==0)
163 return FALSE;
164 TTFILECount--;
165 if (TTFILECount>0)
166 return TRUE;
167 if (HTTFILE!=NULL)
168 {
169 FreeLibrary(HTTFILE);
170 HTTFILE = NULL;
171 }
172 return TRUE;
173 }
174
175 static PFileTransDlg FLogDlg = NULL;
176 static PFileTransDlg SendDlg = NULL;
177 static PProtoDlg PtDlg = NULL;
178
179 BOOL OpenFTDlg(PFileVar fv)
180 {
181 PFileTransDlg FTDlg;
182 HWND HFTDlg;
183 char uimsg[MAX_UIMSG];
184
185 FTDlg = new CFileTransDlg();
186
187 if (FTDlg!=NULL)
188 {
189 FTDlg->Create(fv, &cv, &ts);
190 FTDlg->RefreshNum();
191 if (fv->HideDialog)
192 FTDlg->ShowWindow(SW_HIDE);
193 else if (fv->OpId == OpLog) {
194 FTDlg->ShowWindow(SW_MINIMIZE);
195 HWndLog = FTDlg->m_hWnd; // steven add
196 }
197 }
198
199 if (fv->OpId==OpLog)
200 FLogDlg = FTDlg; /* Log */
201 else
202 SendDlg = FTDlg; /* File send */
203
204 HFTDlg=FTDlg->GetSafeHwnd();
205
206 GetDlgItemText(HFTDlg, IDC_TRANS_FILENAME, uimsg, sizeof(uimsg));
207 get_lang_msg("DLG_FILETRANS_FILENAME", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
208 SetDlgItemText(HFTDlg, IDC_TRANS_FILENAME, ts.UIMsg);
209 GetDlgItemText(HFTDlg, IDC_FULLPATH_LABEL, uimsg, sizeof(uimsg));
210 get_lang_msg("DLG_FILETRANS_FULLPATH", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
211 SetDlgItemText(HFTDlg, IDC_FULLPATH_LABEL, ts.UIMsg);
212 GetDlgItemText(HFTDlg, IDC_TRANS_TRANS, uimsg, sizeof(uimsg));
213 get_lang_msg("DLG_FILETRANS_TRNAS", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
214 SetDlgItemText(HFTDlg, IDC_TRANS_TRANS, ts.UIMsg);
215 GetDlgItemText(HFTDlg, IDCANCEL, uimsg, sizeof(uimsg));
216 get_lang_msg("BTN_CANCEL", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
217 SetDlgItemText(HFTDlg, IDCANCEL, ts.UIMsg);
218 GetDlgItemText(HFTDlg, IDC_TRANSPAUSESTART, uimsg, sizeof(uimsg));
219 get_lang_msg("DLG_FILETRANS_PAUSE", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
220 SetDlgItemText(HFTDlg, IDC_TRANSPAUSESTART, ts.UIMsg);
221 GetDlgItemText(HFTDlg, IDC_TRANSHELP, uimsg, sizeof(uimsg));
222 get_lang_msg("BTN_HELP", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
223 SetDlgItemText(HFTDlg, IDC_TRANSHELP, ts.UIMsg);
224
225 return (FTDlg!=NULL);
226 }
227
228 void ShowFTDlg(WORD OpId)
229 {
230 if (OpId == OpLog) {
231 if (FLogDlg != NULL) {
232 FLogDlg->ShowWindow(SW_SHOWNORMAL);
233 }
234 }
235 else {
236 if (SendDlg != NULL) {
237 SendDlg->ShowWindow(SW_SHOWNORMAL);
238 }
239 }
240 }
241
242 BOOL NewFileVar(PFileVar *fv)
243 {
244 if ((*fv)==NULL)
245 {
246 *fv = (PFileVar)malloc(sizeof(TFileVar));
247 if ((*fv)!=NULL)
248 {
249 memset(*fv, 0, sizeof(TFileVar));
250 strncpy_s((*fv)->FullName, sizeof((*fv)->FullName),ts.FileDir, _TRUNCATE);
251 AppendSlash((*fv)->FullName,sizeof((*fv)->FullName));
252 (*fv)->DirLen = strlen((*fv)->FullName);
253 (*fv)->FileOpen = FALSE;
254 (*fv)->OverWrite = ((ts.FTFlag & FT_RENAME) == 0);
255 (*fv)->HMainWin = HVTWin;
256 (*fv)->Success = FALSE;
257 (*fv)->NoMsg = FALSE;
258 (*fv)->HideDialog = FALSE;
259 }
260 }
261
262 return ((*fv)!=NULL);
263 }
264
265 void FreeFileVar(PFileVar *fv)
266 {
267 if ((*fv)!=NULL)
268 {
269 if ((*fv)->FileOpen) _lclose((*fv)->FileHandle);
270 if ((*fv)->FnStrMemHandle>0)
271 {
272 GlobalUnlock((*fv)->FnStrMemHandle);
273 GlobalFree((*fv)->FnStrMemHandle);
274 }
275 free(*fv);
276 *fv = NULL;
277 }
278 }
279
280 // &h ���z�X�g�����u�� (2007.5.14)
281 void ConvertLogname(char *c, int destlen)
282 {
283 char buf[MAXPATHLEN], buf2[MAXPATHLEN], *p = c;
284
285 memset(buf, 0, sizeof(buf));
286
287 while(*p != '\0') {
288 if (*p == '&' && *(p+1) != '\0') {
289 switch (*(p+1)) {
290 case 'h':
291 if (cv.Open) {
292 if (cv.PortType == IdTCPIP) {
293 strncat_s(buf,sizeof(buf),ts.HostName,_TRUNCATE);
294 }
295 else if (cv.PortType == IdSerial) {
296 strncpy_s(buf2,sizeof(buf2),buf,_TRUNCATE);
297 _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%sCOM%d", buf2, ts.ComPort);
298 }
299 }
300 break;
301 default:
302 strncpy_s(buf2,sizeof(buf2),p,2);
303 strncat_s(buf,sizeof(buf),buf2,_TRUNCATE);
304 }
305 p++;
306 }
307 else {
308 strncpy_s(buf2,sizeof(buf2),p,1);
309 strncat_s(buf,sizeof(buf),buf2,_TRUNCATE);
310 }
311 p++;
312 }
313 strncpy_s(c, destlen, buf, _TRUNCATE);
314 }
315
316 extern "C" {
317 void LogStart()
318 {
319 LONG Option;
320 char *logdir;
321
322 if ((FileLog) || (BinLog)) return;
323
324 if (! LoadTTFILE()) return;
325 if (! NewFileVar(&LogVar))
326 {
327 FreeTTFILE();
328 return;
329 }
330 LogVar->OpId = OpLog;
331
332 if (strlen(ts.LogDefaultPath) > 0) {
333 logdir = ts.LogDefaultPath;
334 }
335 else if (strlen(ts.FileDir) > 0) {
336 logdir = ts.FileDir;
337 }
338 else {
339 logdir = ts.HomeDir;
340 }
341
342 if (strlen(&(LogVar->FullName[LogVar->DirLen]))==0)
343 {
344 // LOWORD
345 // 0x0001 = Binary
346 // HIWORD
347 // 0x0001 = Append
348 // 0x1000 = plain text (2005.2.20 yutaka)
349 // 0x2000 = timestamp (2006.7.23 maya)
350 // 0x4000 = hide file transfer dialog (2008.1.30 maya)
351 // teraterm.ini�����������������f�t�H���g�I�v�V�������������B(2005.5.7 yutaka)
352 Option = MAKELONG(ts.TransBin,
353 ts.Append |
354 (0x1000 * ts.LogTypePlainText) |
355 (0x2000 * ts.LogTimestamp) |
356 (0x4000 * ts.LogHideDialog));
357
358 // ���O���f�t�H���g�t�@�C���������� (2006.8.28 maya)
359 strncat_s(LogVar->FullName, sizeof(LogVar->FullName), ts.LogDefaultName, _TRUNCATE);
360
361 ParseStrftimeFileName(LogVar->FullName, sizeof(LogVar->FullName));
362
363 // &h ���z�X�g�����u�� (2007.5.14)
364 ConvertLogname(LogVar->FullName, sizeof(LogVar->FullName));
365
366 strncpy_s(LogVar->LogDefaultPath, sizeof(LogVar->LogDefaultPath), ts.LogDefaultPath, _TRUNCATE);
367 if (! (*GetTransFname)(LogVar, logdir, GTF_LOG, &Option))
368 {
369 FreeFileVar(&LogVar);
370 FreeTTFILE();
371 return;
372 }
373 ts.TransBin = LOWORD(Option);
374 ts.Append = HIWORD(Option);
375
376 if (ts.Append & 0x1000) {
377 ts.LogTypePlainText = 1;
378 } else {
379 ts.LogTypePlainText = 0;
380 }
381
382 if (ts.Append & 0x2000) {
383 ts.LogTimestamp = 1;
384 }
385 else {
386 ts.LogTimestamp = 0;
387 }
388
389 if (ts.Append & 0x4000) {
390 ts.LogHideDialog = 1;
391 }
392 else {
393 ts.LogHideDialog = 0;
394 }
395
396 ts.Append &= 0x1; // 1bit���}�X�N����
397
398 }
399 else {
400 // LogVar->DirLen = 0 ��������������
401 // �t���p�X�E�����p�X������ LogVar->FullName �������������K�v������
402 char FileName[MAX_PATH];
403
404 // �t���p�X��
405 strncpy_s(FileName, sizeof(FileName), LogVar->FullName, _TRUNCATE);
406 ConvFName(logdir,FileName,sizeof(FileName),"",LogVar->FullName,sizeof(LogVar->FullName));
407
408 ParseStrftimeFileName(LogVar->FullName, sizeof(LogVar->FullName));
409
410 // &h ���z�X�g�����u�� (2007.5.14)
411 ConvertLogname(LogVar->FullName, sizeof(LogVar->FullName));
412 (*SetFileVar)(LogVar);
413 }
414
415 if (ts.TransBin > 0)
416 {
417 BinLog = TRUE;
418 FileLog = FALSE;
419 if (! CreateBinBuf())
420 {
421 FileTransEnd(OpLog);
422 return;
423 }
424 }
425 else {
426 BinLog = FALSE;
427 FileLog = TRUE;
428 if (! CreateLogBuf())
429 {
430 FileTransEnd(OpLog);
431 return;
432 }
433 }
434 cv.LStart = cv.LogPtr;
435 cv.LCount = 0;
436 if (ts.LogHideDialog)
437 LogVar->HideDialog = 1;
438
439 HelpId = HlpFileLog;
440 /* 2007.05.24 Gentaro */
441 eLineEnd = Line_LineHead;
442
443 if (ts.Append > 0)
444 {
445 LogVar->FileHandle = _lopen(LogVar->FullName,OF_WRITE);
446 if (LogVar->FileHandle>0){
447 _llseek(LogVar->FileHandle,0,2);
448 /* 2007.05.24 Gentaro
449 If log file already exists,
450 a newline is inserted before the first timestamp.
451 */
452 eLineEnd = Line_FileHead;
453 }
454 else
455 LogVar->FileHandle = _lcreat(LogVar->FullName,0);
456 }
457 else
458 LogVar->FileHandle = _lcreat(LogVar->FullName,0);
459 LogVar->FileOpen = (LogVar->FileHandle>0);
460 if (! LogVar->FileOpen)
461 {
462 char msg[128];
463
464 // �t�@�C���I�[�v���G���[�������b�Z�[�W�\�������������B(2008.7.9 yutaka)
465 if (LogVar->NoMsg == FALSE) {
466 _snprintf_s(msg, sizeof(msg), _TRUNCATE, "Can not create a `%s' file. (%d)", LogVar->FullName, GetLastError());
467 MessageBox(NULL, msg, "Tera Term: File open error", MB_OK | MB_ICONERROR);
468 }
469
470 FileTransEnd(OpLog);
471 return;
472 }
473 LogVar->ByteCount = 0;
474
475 if (! OpenFTDlg(LogVar))
476 FileTransEnd(OpLog);
477 }
478 }
479
480 void LogPut1(BYTE b)
481 {
482 LogLast = b;
483 cv.LogBuf[cv.LogPtr] = b;
484 cv.LogPtr++;
485 if (cv.LogPtr>=InBuffSize)
486 cv.LogPtr = cv.LogPtr-InBuffSize;
487
488 if (FileLog)
489 {
490 if (cv.LCount>=InBuffSize)
491 {
492 cv.LCount = InBuffSize;
493 cv.LStart = cv.LogPtr;
494 }
495 else
496 cv.LCount++;
497 }
498 else
499 cv.LCount = 0;
500
501 if (DDELog)
502 {
503 if (cv.DCount>=InBuffSize)
504 {
505 cv.DCount = InBuffSize;
506 cv.DStart = cv.LogPtr;
507 }
508 else
509 cv.DCount++;
510 }
511 else {
512 cv.DCount = 0;
513 // ���O���������}�N�����X�g�[���������������C���B
514 // ���O�����������x�}�N�����~�������A�o�b�t�@���C���f�b�N�X�������������������A
515 // ���x�}�N�������������������f�[�^�������������������B
516 // �}�N�������~���������������C���f�b�N�X�����������������������B
517 // (2006.12.26 yutaka)
518 cv.DStart = cv.LogPtr;
519 }
520 }
521
522 void Log1Byte(BYTE b)
523 {
524 if (b==0x0d)
525 {
526 LogLast = b;
527 return;
528 }
529 if ((b==0x0a) && (LogLast==0x0d))
530 LogPut1(0x0d);
531 LogPut1(b);
532 }
533
534 static BOOL Get1(PCHAR Buf, int *Start, int *Count, PBYTE b)
535 {
536 if (*Count<=0) return FALSE;
537 *b = Buf[*Start];
538 (*Start)++;
539 if (*Start>=InBuffSize)
540 *Start = *Start-InBuffSize;
541 (*Count)--;
542 return TRUE;
543 }
544
545
546
547 static CRITICAL_SECTION g_filelog_lock; /* ���b�N�p���� */
548
549 void logfile_lock_initialize(void)
550 {
551 InitializeCriticalSection(&g_filelog_lock);
552 }
553
554 static inline void logfile_lock(void)
555 {
556 EnterCriticalSection(&g_filelog_lock);
557 }
558
559 static inline void logfile_unlock(void)
560 {
561 LeaveCriticalSection(&g_filelog_lock);
562 }
563
564 // �R�����g�����O����������
565 void CommentLogToFile(char *buf, int size)
566 {
567 DWORD wrote;
568
569 if (LogVar == NULL || !LogVar->FileOpen) {
570 char uimsg[MAX_UIMSG];
571 get_lang_msg("MSG_ERROR", uimsg, sizeof(uimsg), "ERROR", ts.UILanguageFile);
572 get_lang_msg("MSG_COMMENT_LOG_OPEN_ERROR", ts.UIMsg, sizeof(ts.UIMsg),
573 "It is not opened by the log file yet.", ts.UILanguageFile);
574 ::MessageBox(NULL, ts.UIMsg, uimsg, MB_OK|MB_ICONEXCLAMATION);
575 return;
576 }
577
578 logfile_lock();
579 WriteFile((HANDLE)LogVar->FileHandle, buf, size, &wrote, NULL);
580 WriteFile((HANDLE)LogVar->FileHandle, "\r\n", 2, &wrote, NULL); // ���s
581 /* Set Line End Flag
582 2007.05.24 Gentaro
583 */
584 eLineEnd = Line_LineHead;
585 logfile_unlock();
586 }
587
588 void LogToFile()
589 {
590 PCHAR Buf;
591 int Start, Count;
592 BYTE b;
593
594 if (! LogVar->FileOpen) return;
595 if (FileLog)
596 {
597 Buf = cv.LogBuf;
598 Start = cv.LStart;
599 Count = cv.LCount;
600 }
601 else if (BinLog)
602 {
603 Buf = cv.BinBuf;
604 Start = cv.BStart;
605 Count = cv.BCount;
606 }
607 else
608 return;
609
610 if (Buf==NULL) return;
611 if (Count==0) return;
612
613 // ���b�N������(2004.8.6 yutaka)
614 logfile_lock();
615
616 while (Get1(Buf,&Start,&Count,&b))
617 {
618 if (((cv.FilePause & OpLog)==0) && (! cv.ProtoFlag))
619 {
620 // �����������o��(2006.7.23 maya)
621 // ���t�t�H�[�}�b�g�����{�����������E�W�������X���� (2006.7.23 yutaka)
622 /* 2007.05.24 Gentaro */
623 if ( ts.LogTimestamp && eLineEnd ) {
624 #if 0
625 SYSTEMTIME LocalTime;
626 GetLocalTime(&LocalTime);
627 char strtime[27];
628
629 // format time
630 sprintf(strtime, "[%04d/%02d/%02d %02d:%02d:%02d.%03d] ",
631 LocalTime.wYear, LocalTime.wMonth,LocalTime.wDay,
632 LocalTime.wHour, LocalTime.wMinute, LocalTime.wSecond,
633 LocalTime.wMilliseconds);
634 #else
635 time_t tick = time(NULL);
636 char *strtime = ctime(&tick);
637 #endif
638 /* 2007.05.24 Gentaro */
639 if( eLineEnd == Line_FileHead ){
640 _lwrite(LogVar->FileHandle,"\r\n",2);
641 }
642 _lwrite(LogVar->FileHandle,"[",1);
643 // �����������������I�[�� \n ���������������������������B
644 _lwrite(LogVar->FileHandle, strtime, strlen(strtime) - 1);
645 _lwrite(LogVar->FileHandle,"] ",2);
646 }
647
648 /* 2007.05.24 Gentaro */
649 if( b == 0x0a ){
650 eLineEnd = Line_LineHead; /* set endmark*/
651 }
652 else {
653 eLineEnd = Line_Other; /* clear endmark*/
654 }
655
656 _lwrite(LogVar->FileHandle,(PCHAR)&b,1);
657 (LogVar->ByteCount)++;
658 }
659 }
660
661 logfile_unlock();
662
663 if (FileLog)
664 {
665 cv.LStart = Start;
666 cv.LCount = Count;
667 }
668 else {
669 cv.BStart = Start;
670 cv.BCount = Count;
671 }
672 if (((cv.FilePause & OpLog) !=0) || cv.ProtoFlag) return;
673 if (FLogDlg!=NULL)
674 FLogDlg->RefreshNum();
675 }
676
677 BOOL CreateLogBuf()
678 {
679 if (cv.HLogBuf==NULL)
680 {
681 cv.HLogBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
682 cv.LogBuf = NULL;
683 cv.LogPtr = 0;
684 cv.LStart = 0;
685 cv.LCount = 0;
686 cv.DStart = 0;
687 cv.DCount = 0;
688 }
689 return (cv.HLogBuf!=NULL);
690 }
691
692 void FreeLogBuf()
693 {
694 if ((cv.HLogBuf==NULL) || FileLog || DDELog)
695 return;
696 if (cv.LogBuf!=NULL)
697 GlobalUnlock(cv.HLogBuf);
698 GlobalFree(cv.HLogBuf);
699 cv.HLogBuf = NULL;
700 cv.LogBuf = NULL;
701 cv.LogPtr = 0;
702 cv.LStart = 0;
703 cv.LCount = 0;
704 cv.DStart = 0;
705 cv.DCount = 0;
706 }
707
708 BOOL CreateBinBuf()
709 {
710 if (cv.HBinBuf==NULL)
711 {
712 cv.HBinBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
713 cv.BinBuf = NULL;
714 cv.BinPtr = 0;
715 cv.BStart = 0;
716 cv.BCount = 0;
717 }
718 return (cv.HBinBuf!=NULL);
719 }
720
721 void FreeBinBuf()
722 {
723 if ((cv.HBinBuf==NULL) || BinLog)
724 return;
725 if (cv.BinBuf!=NULL)
726 GlobalUnlock(cv.HBinBuf);
727 GlobalFree(cv.HBinBuf);
728 cv.HBinBuf = NULL;
729 cv.BinBuf = NULL;
730 cv.BinPtr = 0;
731 cv.BStart = 0;
732 cv.BCount = 0;
733 }
734
735 extern "C" {
736 void FileSendStart()
737 {
738 LONG Option;
739
740 if (! cv.Ready || FSend) return;
741 if (cv.ProtoFlag)
742 {
743 FreeFileVar(&SendVar);
744 return;
745 }
746
747 if (! LoadTTFILE())
748 return;
749 if (! NewFileVar(&SendVar))
750 {
751 FreeTTFILE();
752 return;
753 }
754 SendVar->OpId = OpSendFile;
755
756 FSend = TRUE;
757
758 if (strlen(&(SendVar->FullName[SendVar->DirLen]))==0)
759 {
760 Option = MAKELONG(ts.TransBin,0);
761 SendVar->FullName[0] = 0;
762 if (! (*GetTransFname)(SendVar, ts.FileDir, GTF_SEND, &Option))
763 {
764 FileTransEnd(OpSendFile);
765 return;
766 }
767 ts.TransBin = LOWORD(Option);
768 }
769 else
770 (*SetFileVar)(SendVar);
771
772 SendVar->FileHandle = _lopen(SendVar->FullName,OF_READ);
773 SendVar->FileOpen = (SendVar->FileHandle>0);
774 if (! SendVar->FileOpen)
775 {
776 FileTransEnd(OpSendFile);
777 return;
778 }
779 SendVar->ByteCount = 0;
780
781 TalkStatus = IdTalkFile;
782 FileRetrySend = FALSE;
783 FileRetryEcho = FALSE;
784 FileCRSend = FALSE;
785
786 if (! OpenFTDlg(SendVar))
787 FileTransEnd(OpSendFile);
788 }
789 }
790
791 void FileTransEnd(WORD OpId)
792 /* OpId = 0: close Log and FileSend
793 OpLog: close Log
794 OpSendFile: close FileSend */
795 {
796 if (((OpId==0) || (OpId==OpLog)) && (FileLog || BinLog))
797 {
798 FileLog = FALSE;
799 BinLog = FALSE;
800 if (FLogDlg!=NULL)
801 {
802 FLogDlg->DestroyWindow();
803 FLogDlg = NULL;
804 HWndLog = NULL; // steven add
805 }
806 FreeFileVar(&LogVar);
807 FreeLogBuf();
808 FreeBinBuf();
809 FreeTTFILE();
810 }
811
812 if (((OpId==0) || (OpId==OpSendFile)) && FSend)
813 {
814 FSend = FALSE;
815 TalkStatus = IdTalkKeyb;
816 if (SendDlg!=NULL)
817 {
818 SendDlg->DestroyWindow();
819 SendDlg = NULL;
820 }
821 FreeFileVar(&SendVar);
822 FreeTTFILE();
823 }
824
825 EndDdeCmnd(0);
826 }
827
828 // vtwin.cpp �����R�[�������������Aextern "C"���t�����B(2004.11.3 yutaka)
829 extern "C" {
830 int FSOut1(BYTE b)
831 {
832 if (ts.TransBin > 0)
833 return CommBinaryOut(&cv,(PCHAR)&b,1);
834 else if ((b>=0x20) || (b==0x09) || (b==0x0A) || (b==0x0D))
835 return CommTextOut(&cv,(PCHAR)&b,1);
836 else
837 return 1;
838 }
839
840 int FSEcho1(BYTE b)
841 {
842 if (ts.TransBin > 0)
843 return CommBinaryEcho(&cv,(PCHAR)&b,1);
844 else
845 return CommTextEcho(&cv,(PCHAR)&b,1);
846 }
847 }
848
849 extern "C" {
850 void FileSend()
851 {
852 WORD c, fc;
853 LONG BCOld;
854
855 if ((SendDlg==NULL) ||
856 ((cv.FilePause & OpSendFile) !=0))
857 return;
858
859 BCOld = SendVar->ByteCount;
860
861 if (FileRetrySend)
862 {
863 FileRetryEcho = (ts.LocalEcho>0);
864 c = FSOut1(FileByte);
865 FileRetrySend = (c==0);
866 if (FileRetrySend)
867 return;
868 }
869
870 if (FileRetryEcho)
871 {
872 c = FSEcho1(FileByte);
873 FileRetryEcho = (c==0);
874 if (FileRetryEcho)
875 return;
876 }
877
878 do {
879 fc = _lread(SendVar->FileHandle,&FileByte,1);
880 SendVar->ByteCount = SendVar->ByteCount + fc;
881
882 if (FileCRSend && (fc==1) && (FileByte==0x0A))
883 {
884 fc = _lread(SendVar->FileHandle,&FileByte,1);
885 SendVar->ByteCount = SendVar->ByteCount + fc;
886 }
887
888 if (fc!=0)
889 {
890 c = FSOut1(FileByte);
891 FileCRSend = (ts.TransBin==0) && (FileByte==0x0D);
892 FileRetrySend = (c==0);
893 if (FileRetrySend)
894 {
895 if (SendVar->ByteCount != BCOld)
896 SendDlg->RefreshNum();
897 return;
898 }
899 if (ts.LocalEcho>0)
900 {
901 c = FSEcho1(FileByte);
902 FileRetryEcho = (c==0);
903 if (FileRetryEcho)
904 return;
905 }
906 }
907 if ((fc==0) || (SendVar->ByteCount % 100 == 0))
908 {
909 SendDlg->RefreshNum();
910 BCOld = SendVar->ByteCount;
911 if (fc!=0)
912 return;
913 }
914 } while (fc!=0);
915
916 FileTransEnd(OpSendFile);
917 }
918 }
919
920 extern "C" {
921 void FLogChangeButton(BOOL Pause)
922 {
923 if (FLogDlg!=NULL)
924 FLogDlg->ChangeButton(Pause);
925 }
926 }
927
928 extern "C" {
929 void FLogRefreshNum()
930 {
931 if (FLogDlg!=NULL)
932 FLogDlg->RefreshNum();
933 }
934 }
935
936 BOOL OpenProtoDlg(PFileVar fv, int IdProto, int Mode, WORD Opt1, WORD Opt2)
937 {
938 int vsize;
939 PProtoDlg pd;
940 HWND Hpd;
941 char uimsg[MAX_UIMSG];
942
943 ProtoId = IdProto;
944
945 switch (ProtoId) {
946 case PROTO_KMT:
947 vsize = sizeof(TKmtVar);
948 break;
949 case PROTO_XM:
950 vsize = sizeof(TXVar);
951 break;
952 case PROTO_YM:
953 vsize = sizeof(TYVar);
954 break;
955 case PROTO_ZM:
956 vsize = sizeof(TZVar);
957 break;
958 case PROTO_BP:
959 vsize = sizeof(TBPVar);
960 break;
961 case PROTO_QV:
962 vsize = sizeof(TQVVar);
963 break;
964 }
965 ProtoVar = (PCHAR)malloc(vsize);
966 if (ProtoVar==NULL)
967 return FALSE;
968
969 switch (ProtoId) {
970 case PROTO_KMT:
971 ((PKmtVar)ProtoVar)->KmtMode = Mode;
972 break;
973 case PROTO_XM:
974 ((PXVar)ProtoVar)->XMode = Mode;
975 ((PXVar)ProtoVar)->XOpt = Opt1;
976 ((PXVar)ProtoVar)->TextFlag = 1 - (Opt2 & 1);
977 break;
978 case PROTO_YM: // TBD
979 ((PYVar)ProtoVar)->YMode = Mode;
980 ((PYVar)ProtoVar)->YOpt = Yopt1K; // TBD
981 break;
982 case PROTO_ZM:
983 ((PZVar)ProtoVar)->BinFlag = (Opt1 & 1) != 0;
984 ((PZVar)ProtoVar)->ZMode = Mode;
985 break;
986 case PROTO_BP:
987 ((PBPVar)ProtoVar)->BPMode = Mode;
988 break;
989 case PROTO_QV:
990 ((PQVVar)ProtoVar)->QVMode = Mode;
991 break;
992 }
993
994 pd = new CProtoDlg();
995 if (pd==NULL)
996 {
997 free(ProtoVar);
998 ProtoVar = NULL;
999 return FALSE;
1000 }
1001 pd->Create(fv,&ts);
1002
1003 Hpd=pd->GetSafeHwnd();
1004
1005 GetDlgItemText(Hpd, IDC_PROT_FILENAME, uimsg, sizeof(uimsg));
1006 get_lang_msg("DLG_PROT_FIELNAME", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1007 SetDlgItemText(Hpd, IDC_PROT_FILENAME, ts.UIMsg);
1008 GetDlgItemText(Hpd, IDC_PROT_PROT, uimsg, sizeof(uimsg));
1009 get_lang_msg("DLG_PROT_PROTO", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1010 SetDlgItemText(Hpd, IDC_PROT_PROT, ts.UIMsg);
1011 GetDlgItemText(Hpd, IDC_PROT_PACKET, uimsg, sizeof(uimsg));
1012 get_lang_msg("DLG_PROT_PACKET", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1013 SetDlgItemText(Hpd, IDC_PROT_PACKET, ts.UIMsg);
1014 GetDlgItemText(Hpd, IDC_PROT_TRANS, uimsg, sizeof(uimsg));
1015 get_lang_msg("DLG_PROT_TRANS", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1016 SetDlgItemText(Hpd, IDC_PROT_TRANS, ts.UIMsg);
1017 GetDlgItemText(Hpd, IDCANCEL, uimsg, sizeof(uimsg));
1018 get_lang_msg("BTN_CANCEL", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1019 SetDlgItemText(Hpd, IDCANCEL, ts.UIMsg);
1020
1021 (*ProtoInit)(ProtoId,FileVar,ProtoVar,&cv,&ts);
1022
1023 PtDlg = pd;
1024 return TRUE;
1025 }
1026
1027 extern "C" {
1028 void CloseProtoDlg()
1029 {
1030 if (PtDlg!=NULL)
1031 {
1032 PtDlg->DestroyWindow();
1033 PtDlg = NULL;
1034
1035 ::KillTimer(FileVar->HMainWin,IdProtoTimer);
1036 if ((ProtoId==PROTO_QV) &&
1037 (((PQVVar)ProtoVar)->QVMode==IdQVSend))
1038 CommTextOut(&cv,"\015",1);
1039 if (FileVar->LogFlag)
1040 _lclose(FileVar->LogFile);
1041 FileVar->LogFile = 0;
1042 if (ProtoVar!=NULL)
1043 {
1044 free(ProtoVar);
1045 ProtoVar = NULL;
1046 }
1047 }
1048 }
1049 }
1050
1051 BOOL ProtoStart()
1052 {
1053 if (cv.ProtoFlag)
1054 return FALSE;
1055 if (FSend)
1056 {
1057 FreeFileVar(&FileVar);
1058 return FALSE;
1059 }
1060
1061 if (! LoadTTFILE())
1062 return FALSE;
1063 NewFileVar(&FileVar);
1064
1065 if (FileVar==NULL)
1066 {
1067 FreeTTFILE();
1068 return FALSE;
1069 }
1070 cv.ProtoFlag = TRUE;
1071 return TRUE;
1072 }
1073
1074 void ProtoEnd()
1075 {
1076 if (! cv.ProtoFlag)
1077 return;
1078 cv.ProtoFlag = FALSE;
1079
1080 /* Enable transmit delay (serial port) */
1081 cv.DelayFlag = TRUE;
1082 TalkStatus = IdTalkKeyb;
1083
1084 CloseProtoDlg();
1085
1086 if ((FileVar!=NULL) && FileVar->Success)
1087 EndDdeCmnd(1);
1088 else
1089 EndDdeCmnd(0);
1090
1091 FreeTTFILE();
1092 FreeFileVar(&FileVar);
1093 }
1094
1095 extern "C" {
1096 int ProtoDlgParse()
1097 {
1098 int P;
1099
1100 P = ActiveWin;
1101 if (PtDlg==NULL)
1102 return P;
1103
1104 if ((*ProtoParse)(ProtoId,FileVar,ProtoVar,&cv))
1105 P = 0; /* continue */
1106 else {
1107 CommSend(&cv);
1108 ProtoEnd();
1109 }
1110 return P;
1111 }
1112 }
1113
1114 extern "C" {
1115 void ProtoDlgTimeOut()
1116 {
1117 if (PtDlg!=NULL)
1118 (*ProtoTimeOutProc)(ProtoId,FileVar,ProtoVar,&cv);
1119 }
1120 }
1121
1122 extern "C" {
1123 void ProtoDlgCancel()
1124 {
1125 if ((PtDlg!=NULL) &&
1126 (*ProtoCancel)(ProtoId,FileVar,ProtoVar,&cv))
1127 ProtoEnd();
1128 }
1129 }
1130
1131 extern "C" {
1132 void KermitStart(int mode)
1133 {
1134 WORD w;
1135
1136 if (! ProtoStart())
1137 return;
1138
1139 switch (mode) {
1140 case IdKmtSend:
1141 FileVar->OpId = OpKmtSend;
1142 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1143 {
1144 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_KERMIT,&w) ||
1145 (FileVar->NumFname==0))
1146 {
1147 ProtoEnd();
1148 return;
1149 }
1150 }
1151 else
1152 (*SetFileVar)(FileVar);
1153 break;
1154 case IdKmtReceive:
1155 FileVar->OpId = OpKmtRcv;
1156 break;
1157 case IdKmtGet:
1158 FileVar->OpId = OpKmtSend;
1159 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1160 {
1161 if (! (*GetGetFname)(FileVar->HMainWin,FileVar) ||
1162 (strlen(FileVar->FullName)==0))
1163 {
1164 ProtoEnd();
1165 return;
1166 }
1167 }
1168 else
1169 (*SetFileVar)(FileVar);
1170 break;
1171 case IdKmtFinish:
1172 FileVar->OpId = OpKmtFin;
1173 break;
1174 default:
1175 ProtoEnd();
1176 return;
1177 }
1178 TalkStatus = IdTalkQuiet;
1179
1180 /* disable transmit delay (serial port) */
1181 cv.DelayFlag = FALSE;
1182
1183 if (! OpenProtoDlg(FileVar,PROTO_KMT,mode,0,0))
1184 ProtoEnd();
1185 }
1186 }
1187
1188 extern "C" {
1189 void XMODEMStart(int mode)
1190 {
1191 LONG Option;
1192
1193 if (! ProtoStart())
1194 return;
1195
1196 if (mode==IdXReceive)
1197 FileVar->OpId = OpXRcv;
1198 else
1199 FileVar->OpId = OpXSend;
1200
1201 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1202 {
1203 Option = MAKELONG(ts.XmodemBin,ts.XmodemOpt);
1204 if (! (*GetXFname)(FileVar->HMainWin,
1205 mode==IdXReceive,&Option,FileVar,ts.FileDir))
1206 {
1207 ProtoEnd();
1208 return;
1209 }
1210 ts.XmodemOpt = HIWORD(Option);
1211 ts.XmodemBin = LOWORD(Option);
1212 }
1213 else
1214 (*SetFileVar)(FileVar);
1215
1216 if (mode==IdXReceive)
1217 FileVar->FileHandle = _lcreat(FileVar->FullName,0);
1218 else
1219 FileVar->FileHandle = _lopen(FileVar->FullName,OF_READ);
1220
1221 FileVar->FileOpen = FileVar->FileHandle>0;
1222 if (! FileVar->FileOpen)
1223 {
1224 ProtoEnd();
1225 return;
1226 }
1227 TalkStatus = IdTalkQuiet;
1228
1229 /* disable transmit delay (serial port) */
1230 cv.DelayFlag = FALSE;
1231
1232 if (! OpenProtoDlg(FileVar,PROTO_XM,mode,
1233 ts.XmodemOpt,ts.XmodemBin))
1234 ProtoEnd();
1235 }
1236 }
1237
1238 extern "C" {
1239 void YMODEMStart(int mode)
1240 {
1241 WORD Opt;
1242
1243 if (! ProtoStart())
1244 return;
1245
1246 if (mode==IdYSend)
1247 {
1248 Opt = ts.XmodemBin;
1249 FileVar->OpId = OpYSend;
1250 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1251 {
1252 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Y,&Opt) ||
1253 (FileVar->NumFname==0))
1254 {
1255 ProtoEnd();
1256 return;
1257 }
1258 ts.XmodemBin = Opt;
1259 }
1260 else
1261 (*SetFileVar)(FileVar);
1262 }
1263 else /* IdZReceive or IdZAuto */
1264 FileVar->OpId = OpYRcv;
1265
1266 TalkStatus = IdTalkQuiet;
1267
1268 /* disable transmit delay (serial port) */
1269 cv.DelayFlag = FALSE;
1270
1271 if (! OpenProtoDlg(FileVar,PROTO_YM,mode,Opt,0))
1272 ProtoEnd();
1273 }
1274 }
1275
1276 extern "C" {
1277 void ZMODEMStart(int mode)
1278 {
1279 WORD Opt;
1280
1281 if (! ProtoStart())
1282 return;
1283
1284 if (mode==IdZSend)
1285 {
1286 Opt = ts.XmodemBin;
1287 FileVar->OpId = OpZSend;
1288 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1289 {
1290 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Z,&Opt) ||
1291 (FileVar->NumFname==0))
1292 {
1293 ProtoEnd();
1294 return;
1295 }
1296 ts.XmodemBin = Opt;
1297 }
1298 else
1299 (*SetFileVar)(FileVar);
1300 }
1301 else /* IdZReceive or IdZAuto */
1302 FileVar->OpId = OpZRcv;
1303
1304 TalkStatus = IdTalkQuiet;
1305
1306 /* disable transmit delay (serial port) */
1307 cv.DelayFlag = FALSE;
1308
1309 if (! OpenProtoDlg(FileVar,PROTO_ZM,mode,Opt,0))
1310 ProtoEnd();
1311 }
1312 }
1313
1314 extern "C" {
1315 void BPStart(int mode)
1316 {
1317 LONG Option;
1318
1319 if (! ProtoStart())
1320 return;
1321 if (mode==IdBPSend)
1322 {
1323 FileVar->OpId = OpBPSend;
1324 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1325 {
1326 FileVar->FullName[0] = 0;
1327 if (! (*GetTransFname)(FileVar, ts.FileDir, GTF_BP, &Option))
1328 {
1329 ProtoEnd();
1330 return;
1331 }
1332 }
1333 else
1334 (*SetFileVar)(FileVar);
1335 }
1336 else /* IdBPReceive or IdBPAuto */
1337 FileVar->OpId = OpBPRcv;
1338
1339 TalkStatus = IdTalkQuiet;
1340
1341 /* disable transmit delay (serial port) */
1342 cv.DelayFlag = FALSE;
1343
1344 if (! OpenProtoDlg(FileVar,PROTO_BP,mode,0,0))
1345 ProtoEnd();
1346 }
1347 }
1348
1349 extern "C" {
1350 void QVStart(int mode)
1351 {
1352 WORD W;
1353
1354 if (! ProtoStart())
1355 return;
1356
1357 if (mode==IdQVSend)
1358 {
1359 FileVar->OpId = OpQVSend;
1360 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1361 {
1362 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_QV, &W) ||
1363 (FileVar->NumFname==0))
1364 {
1365 ProtoEnd();
1366 return;
1367 }
1368 }
1369 else
1370 (*SetFileVar)(FileVar);
1371 }
1372 else
1373 FileVar->OpId = OpQVRcv;
1374
1375 TalkStatus = IdTalkQuiet;
1376
1377 /* disable transmit delay (serial port) */
1378 cv.DelayFlag = FALSE;
1379
1380 if (! OpenProtoDlg(FileVar,PROTO_QV,mode,0,0))
1381 ProtoEnd();
1382 }
1383 }

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