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 6841 - (show annotations) (download) (as text)
Tue Jul 4 15:02:28 2017 UTC (6 years, 9 months ago) by doda
Original Path: trunk/teraterm/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 45361 byte(s)
TeraTerm Project としてのライセンス表記を追加

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

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