Develop and Download Open Source Software

Browse CVS Repository

Annotation of /ttssh2/teraterm/source/teraterm/filesys.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.19 - (hide annotations) (download) (as text)
Mon Aug 20 08:34:47 2007 UTC (16 years, 6 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 yutakakn 1.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 yutakapon 1.12 /*
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 yutakakn 1.1 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 maya 1.8 HWND HFTDlg;
164 maya 1.17 char uimsg[MAX_UIMSG];
165 yutakakn 1.1
166     FTDlg = new CFileTransDlg();
167    
168     if (FTDlg!=NULL)
169     {
170 maya 1.8 FTDlg->Create(fv, &cv, &ts);
171 yutakakn 1.1 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 maya 1.8 HFTDlg=FTDlg->GetSafeHwnd();
182    
183 maya 1.17 GetDlgItemText(HFTDlg, IDC_TRANS_FILENAME, uimsg, sizeof(uimsg));
184     get_lang_msg("DLG_FILETRANS_FILENAME", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
185 maya 1.8 SetDlgItemText(HFTDlg, IDC_TRANS_FILENAME, ts.UIMsg);
186 maya 1.17 GetDlgItemText(HFTDlg, IDC_FULLPATH_LABEL, uimsg, sizeof(uimsg));
187     get_lang_msg("DLG_FILETRANS_FULLPATH", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
188 maya 1.8 SetDlgItemText(HFTDlg, IDC_FULLPATH_LABEL, ts.UIMsg);
189 maya 1.17 GetDlgItemText(HFTDlg, IDC_TRANS_TRANS, uimsg, sizeof(uimsg));
190     get_lang_msg("DLG_FILETRANS_TRNAS", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
191 maya 1.8 SetDlgItemText(HFTDlg, IDC_TRANS_TRANS, ts.UIMsg);
192 maya 1.17 GetDlgItemText(HFTDlg, IDCANCEL, uimsg, sizeof(uimsg));
193     get_lang_msg("BTN_CANCEL", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
194 maya 1.8 SetDlgItemText(HFTDlg, IDCANCEL, ts.UIMsg);
195 maya 1.17 GetDlgItemText(HFTDlg, IDC_TRANSPAUSESTART, uimsg, sizeof(uimsg));
196     get_lang_msg("DLG_FILETRANS_PAUSE", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
197 maya 1.8 SetDlgItemText(HFTDlg, IDC_TRANSPAUSESTART, ts.UIMsg);
198 maya 1.17 GetDlgItemText(HFTDlg, IDC_TRANSHELP, uimsg, sizeof(uimsg));
199     get_lang_msg("BTN_HELP", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
200 maya 1.8 SetDlgItemText(HFTDlg, IDC_TRANSHELP, ts.UIMsg);
201    
202 yutakakn 1.1 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 maya 1.16 strncpy_s((*fv)->FullName, sizeof((*fv)->FullName),ts.FileDir, _TRUNCATE);
214     AppendSlash((*fv)->FullName,sizeof((*fv)->FullName));
215 yutakakn 1.1 (*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 maya 1.10 // &h ?ス?ス?スz?スX?スg?ス?ス?ス?ス?スu?ス?ス (2007.5.14)
243 maya 1.16 void ConvertLogname(char *c, int destlen)
244 maya 1.10 {
245     char buf[MAXPATHLEN], buf2[MAXPATHLEN], *p = c;
246    
247 maya 1.11 memset(buf, 0, sizeof(buf));
248    
249 maya 1.10 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 maya 1.16 strncat_s(buf,sizeof(buf),ts.HostName,_TRUNCATE);
256 maya 1.10 }
257     else if (cv.PortType == IdSerial) {
258 maya 1.16 strncpy_s(buf2,sizeof(buf2),buf,_TRUNCATE);
259     _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%sCOM%d", buf2, ts.ComPort);
260 maya 1.10 }
261     }
262     break;
263     default:
264 maya 1.16 strncpy_s(buf2,sizeof(buf2),p,2);
265     strncat_s(buf,sizeof(buf),buf2,_TRUNCATE);
266 maya 1.10 }
267     p++;
268     }
269     else {
270 maya 1.16 strncpy_s(buf2,sizeof(buf2),p,1);
271     strncat_s(buf,sizeof(buf),buf2,_TRUNCATE);
272 maya 1.10 }
273     p++;
274     }
275 maya 1.16 strncpy_s(c, destlen, buf, _TRUNCATE);
276 maya 1.10 }
277    
278 yutakakn 1.1 extern "C" {
279     void LogStart()
280     {
281 yutakakn 1.2 LONG Option;
282 maya 1.13 char *logdir;
283 yutakakn 1.2
284     if ((FileLog) || (BinLog)) return;
285 yutakakn 1.1
286 yutakakn 1.2 if (! LoadTTFILE()) return;
287     if (! NewFileVar(&LogVar))
288     {
289     FreeTTFILE();
290     return;
291     }
292     LogVar->OpId = OpLog;
293 yutakakn 1.1
294 maya 1.13 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 yutakakn 1.2 if (strlen(&(LogVar->FullName[LogVar->DirLen]))==0)
305     {
306 maya 1.4 // LOWORD
307     // 0x0001 = Binary
308     // HIWORD
309     // 0x0001 = Append
310 yutakakn 1.2 // 0x1000 = plain text (2005.2.20 yutaka)
311 maya 1.4 // 0x2000 = timestamp (2006.7.23 maya)
312 yutakakn 1.3 // teraterm.ini?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スf?スt?スH?ス?ス?スg?スI?スv?スV?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スB(2005.5.7 yutaka)
313 maya 1.4 Option = MAKELONG(ts.TransBin,ts.Append |
314     (0x1000 * ts.LogTypePlainText) |
315     (0x2000 * ts.LogTimestamp));
316 maya 1.6
317     // ?ス?ス?スO?ス?ス?スf?スt?スH?ス?ス?スg?スt?ス@?スC?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス (2006.8.28 maya)
318 maya 1.16 strncat_s(LogVar->FullName, sizeof(LogVar->FullName), ts.LogDefaultName, _TRUNCATE);
319 maya 1.13
320 maya 1.16 ParseStrftimeFileName(LogVar->FullName, sizeof(LogVar->FullName));
321 maya 1.6
322 maya 1.10 // &h ?ス?ス?スz?スX?スg?ス?ス?ス?ス?スu?ス?ス (2007.5.14)
323 maya 1.16 ConvertLogname(LogVar->FullName, sizeof(LogVar->FullName));
324 maya 1.10
325 maya 1.13 if (! (*GetTransFname)(LogVar, logdir, GTF_LOG, &Option))
326 yutakakn 1.2 {
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 maya 1.4
340     if (ts.Append & 0x2000) {
341     ts.LogTimestamp = 1;
342     }
343     else {
344     ts.LogTimestamp = 0;
345     }
346    
347 yutakakn 1.2 ts.Append &= 0x1; // 1bit?ス?ス?ス}?スX?スN?ス?ス?ス?ス
348 yutakakn 1.1
349 yutakakn 1.2 }
350 maya 1.10 else {
351 maya 1.13 // 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 maya 1.16 strncpy_s(FileName, sizeof(FileName), LogVar->FullName, _TRUNCATE);
357     ConvFName(logdir,FileName,sizeof(FileName),"",LogVar->FullName,sizeof(LogVar->FullName));
358 maya 1.13
359 maya 1.16 ParseStrftimeFileName(LogVar->FullName, sizeof(LogVar->FullName));
360 maya 1.13
361 maya 1.10 // &h ?ス?ス?スz?スX?スg?ス?ス?ス?ス?スu?ス?ス (2007.5.14)
362 maya 1.16 ConvertLogname(LogVar->FullName, sizeof(LogVar->FullName));
363 yutakakn 1.2 (*SetFileVar)(LogVar);
364 maya 1.10 }
365 yutakakn 1.1
366 yutakakn 1.2 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 yutakakn 1.1
388 yutakakn 1.2 HelpId = HlpFileLog;
389 yutakapon 1.12 /* 2007.05.24 Gentaro */
390     eLineEnd = Line_LineHead;
391    
392 yutakakn 1.2 if (ts.Append > 0)
393     {
394     LogVar->FileHandle = _lopen(LogVar->FullName,OF_WRITE);
395 yutakapon 1.12 if (LogVar->FileHandle>0){
396 yutakakn 1.2 _llseek(LogVar->FileHandle,0,2);
397 yutakapon 1.12 /* 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 yutakakn 1.2 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 yutakakn 1.1
416 yutakakn 1.2 if (! OpenFTDlg(LogVar))
417     FileTransEnd(OpLog);
418 yutakakn 1.1 }
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 yutakapon 1.7 else {
451 yutakakn 1.1 cv.DCount = 0;
452 yutakapon 1.7 // ?ス?ス?ス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 yutakakn 1.1 }
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 maya 1.8 char uimsg[MAX_UIMSG];
510 maya 1.17 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 maya 1.8 ::MessageBox(NULL, ts.UIMsg, uimsg, MB_OK|MB_ICONEXCLAMATION);
514 yutakakn 1.1 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 yutakapon 1.12 /* Set Line End Flag
521     2007.05.24 Gentaro
522     */
523     eLineEnd = Line_LineHead;
524 yutakakn 1.1 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 maya 1.4 // ?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スo?ス?ス(2006.7.23 maya)
560 yutakakn 1.5 // ?ス?ス?スt?スt?スH?ス[?ス}?スb?スg?ス?ス?ス?ス?ス{?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スE?スW?ス?ス?ス?ス?ス?ス?スX?ス?ス?ス?ス (2006.7.23 yutaka)
561 yutakapon 1.12 /* 2007.05.24 Gentaro */
562     if ( ts.LogTimestamp && eLineEnd ) {
563 yutakakn 1.5 #if 0
564 maya 1.4 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 yutakakn 1.5 #else
574     time_t tick = time(NULL);
575     char *strtime = ctime(&tick);
576     #endif
577 yutakapon 1.12 /* 2007.05.24 Gentaro */
578     if( eLineEnd == Line_FileHead ){
579     _lwrite(LogVar->FileHandle,"\r\n",2);
580 maya 1.4 }
581 yutakakn 1.5 _lwrite(LogVar->FileHandle,"[",1);
582     // ?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スI?ス[?ス?ス \n ?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スB
583     _lwrite(LogVar->FileHandle, strtime, strlen(strtime) - 1);
584     _lwrite(LogVar->FileHandle,"] ",2);
585 maya 1.4 }
586 yutakapon 1.12
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 maya 1.4
595 yutakakn 1.1 _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 maya 1.6 SendVar->FullName[0] = 0;
696 yutakakn 1.1 if (! (*GetTransFname)(SendVar, ts.FileDir, GTF_SEND, &Option))
697 maya 1.8 {
698 yutakakn 1.1 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 maya 1.8 HWND Hpd;
871 maya 1.17 char uimsg[MAX_UIMSG];
872 yutakakn 1.1
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 maya 1.8 pd->Create(fv,&ts);
924    
925     Hpd=pd->GetSafeHwnd();
926    
927 maya 1.17 GetDlgItemText(Hpd, IDC_PROT_FILENAME, uimsg, sizeof(uimsg));
928     get_lang_msg("DLG_PROT_FIELNAME", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
929 maya 1.8 SetDlgItemText(Hpd, IDC_PROT_FILENAME, ts.UIMsg);
930 maya 1.17 GetDlgItemText(Hpd, IDC_PROT_PROT, uimsg, sizeof(uimsg));
931     get_lang_msg("DLG_PROT_PROTO", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
932 maya 1.8 SetDlgItemText(Hpd, IDC_PROT_PROT, ts.UIMsg);
933 maya 1.17 GetDlgItemText(Hpd, IDC_PROT_PACKET, uimsg, sizeof(uimsg));
934     get_lang_msg("DLG_PROT_PACKET", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
935 maya 1.8 SetDlgItemText(Hpd, IDC_PROT_PACKET, ts.UIMsg);
936 maya 1.17 GetDlgItemText(Hpd, IDC_PROT_TRANS, uimsg, sizeof(uimsg));
937     get_lang_msg("DLG_PROT_TRANS", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
938 maya 1.8 SetDlgItemText(Hpd, IDC_PROT_TRANS, ts.UIMsg);
939 maya 1.17 GetDlgItemText(Hpd, IDCANCEL, uimsg, sizeof(uimsg));
940     get_lang_msg("BTN_CANCEL", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
941 maya 1.8 SetDlgItemText(Hpd, IDCANCEL, ts.UIMsg);
942 maya 1.17
943 yutakakn 1.1 (*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 maya 1.8 break;
1071 yutakakn 1.1 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 maya 1.8 break;
1088 yutakakn 1.1 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 maya 1.6 FileVar->FullName[0] = 0;
1203 yutakakn 1.1 if (! (*GetTransFname)(FileVar, ts.FileDir, GTF_BP, &Option))
1204 maya 1.8 {
1205 yutakakn 1.1 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