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.19 - (show annotations) (download) (as text)
Mon Aug 20 08:34:47 2007 UTC (16 years, 7 months ago) by maya
Branch: MAIN
CVS Tags: R454_RTM, R455_RTM
Changes since 1.18: +0 -17 lines
File MIME type: text/x-c++src
TERATERM32 マクロを削除した。

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

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