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 6806 - (show annotations) (download) (as text)
Thu Jun 15 00:37:01 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: 45365 byte(s)
TeraTerm Project としてのライセンス表記を追加

とりあえず Tera Term 本体分。
TeraTerm Project としての copyright 表記の年部分はコミットログを確認して書いたつもりだけど、ミスってたらすみません。

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

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