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

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