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.23 - (show annotations) (download) (as text)
Wed Feb 13 14:12:54 2008 UTC (16 years, 2 months ago) by yutakapon
Branch: MAIN
CVS Tags: R458_RTM
Changes since 1.22: +6 -1 lines
File MIME type: text/x-c++src
showttコマンドに6, 7, 8パラメータを追加。
http://www.neocom.ca/forum/viewtopic.php?t=742

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

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