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

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