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

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