Develop and Download Open Source Software

Browse CVS Repository

Contents of /ttssh2/teraterm/source/teraterm/filesys.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.22 - (show annotations) (download) (as text)
Sat Feb 2 15:36:50 2008 UTC (16 years, 2 months ago) by maya
Branch: MAIN
Changes since 1.21: +14 -0 lines
File MIME type: text/x-c++src
隠れたログダイアログを表示するメニューアイテムを追加した。

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

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