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.21 - (show annotations) (download) (as text)
Tue Jan 29 17:43:33 2008 UTC (16 years, 2 months ago) by maya
Branch: MAIN
Changes since 1.20: +772 -724 lines
File MIME type: text/x-c++src
ログ転送ダイアログを表示しない機能を追加した。

- INI からの読み書きに未対応
- SW_HIDE してしまったらログを止めることができないので、なにか戻す手段が必要かもしれない

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

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