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.25 - (show annotations) (download) (as text)
Mon Apr 14 17:35:29 2008 UTC (15 years, 10 months ago) by maya
Branch: MAIN
CVS Tags: HEAD
Changes since 1.24: +0 -0 lines
File MIME type: text/x-c++src
FILE REMOVED
ファイル移動に伴う修正

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

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