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

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