Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/teraterm/teraterm/filesys_log.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5171 - (show annotations) (download) (as text)
Sun Mar 24 10:55:37 2013 UTC (11 years ago) by yutakapon
Original Path: trunk/teraterm/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 34783 byte(s)
ログ・ローテートの設定を Additional settings ダイアログから行えるようにした。

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

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