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 6946 - (show annotations) (download) (as text)
Tue Oct 17 09:38:20 2017 UTC (6 years, 5 months ago) by doda
Original Path: trunk/teraterm/teraterm/filesys.cpp
File MIME type: text/x-c++src
File size: 44926 byte(s)
TFnHook へ渡すデータを WORD で分割せずに一つの long として扱うように変更。

Tera Term 2.3 の頃は Binary と Append の二つのフラグだけだったので
HIWORD / LOWORD で分けるのは簡略化の為有効だったが、現在は多数の
フラグが追加されてかえって分かりづらくなったので一つの値として
扱うようにした。

併せて、フラグのビット位置を変更しやすいようにマクロで隠すようにした。
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 Option = 0;
517 if (ts.LogBinary) {
518 Option |= LOGDLG_BINARY;
519 }
520 if (ts.Append) {
521 Option |= LOGDLG_APPEND;
522 }
523 if (ts.LogTypePlainText) {
524 Option |= LOGDLG_PLAINTEXT;
525 }
526 if (ts.LogTimestamp) {
527 Option |= LOGDLG_TIMESTAMP;
528 }
529 if (ts.LogHideDialog) {
530 Option |= LOGDLG_HIDEDIALOG;
531 }
532 if (ts.LogAllBuffIncludedInFirst) {
533 Option |= LOGDLG_INCSCRBUFF;
534 }
535
536 // ���O���f�t�H���g�t�@�C���������� (2006.8.28 maya)
537 strncat_s(LogVar->FullName, sizeof(LogVar->FullName), ts.LogDefaultName, _TRUNCATE);
538 ParseStrftimeFileName(LogVar->FullName, sizeof(LogVar->FullName));
539 ConvertLogname(LogVar->FullName, sizeof(LogVar->FullName));
540
541 strncpy_s(LogVar->LogDefaultPath, sizeof(LogVar->LogDefaultPath), ts.LogDefaultPath, _TRUNCATE);
542 if (! (*GetTransFname)(LogVar, logdir, GTF_LOG, &Option)) {
543 FreeFileVar(&LogVar);
544 FreeTTFILE();
545 return FALSE;
546 }
547
548 ts.LogBinary = CheckFlag(Option, LOGDLG_BINARY);
549 CheckFlag(Option, LOGDLG_BINARY);
550 ts.Append =
551 CheckFlag(Option, LOGDLG_APPEND);
552 ts.LogTypePlainText =
553 CheckFlag(Option, LOGDLG_PLAINTEXT);
554 ts.LogTimestamp =
555 CheckFlag(Option, LOGDLG_TIMESTAMP);
556 ts.LogHideDialog =
557 CheckFlag(Option, LOGDLG_HIDEDIALOG);
558 ts.LogAllBuffIncludedInFirst =
559 CheckFlag(Option, LOGDLG_INCSCRBUFF);
560 }
561 else {
562 // LogVar->DirLen = 0 ��������������
563 // �t���p�X�E�����p�X������ LogVar->FullName �������������K�v������
564 char FileName[MAX_PATH];
565
566 // �t���p�X��
567 strncpy_s(FileName, sizeof(FileName), LogVar->FullName, _TRUNCATE);
568 ConvFName(logdir, FileName, sizeof(FileName), "", LogVar->FullName, sizeof(LogVar->FullName));
569
570 ParseStrftimeFileName(LogVar->FullName, sizeof(LogVar->FullName));
571 ConvertLogname(LogVar->FullName, sizeof(LogVar->FullName));
572
573 (*SetFileVar)(LogVar);
574
575 FixLogOption();
576 }
577
578 if (ts.LogBinary > 0)
579 {
580 BinLog = TRUE;
581 FileLog = FALSE;
582 if (! CreateBinBuf())
583 {
584 FileTransEnd(OpLog);
585 return FALSE;
586 }
587 }
588 else {
589 BinLog = FALSE;
590 FileLog = TRUE;
591 if (! CreateLogBuf())
592 {
593 FileTransEnd(OpLog);
594 return FALSE;
595 }
596 }
597 cv.LStart = cv.LogPtr;
598 cv.LCount = 0;
599 if (ts.LogHideDialog)
600 LogVar->HideDialog = 1;
601
602 HelpId = HlpFileLog;
603 /* 2007.05.24 Gentaro */
604 eLineEnd = Line_LineHead;
605
606 if (ts.Append > 0)
607 {
608 int dwShareMode = FILE_SHARE_READ;
609 if (!ts.LogLockExclusive) {
610 dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
611 }
612 LogVar->FileHandle = (int)CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
613 OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
614 if (LogVar->FileHandle>0){
615 SetFilePointer((HANDLE)LogVar->FileHandle, 0, NULL, FILE_END);
616 /* 2007.05.24 Gentaro
617 If log file already exists,
618 a newline is inserted before the first timestamp.
619 */
620 eLineEnd = Line_FileHead;
621 }
622 }
623 else {
624 int dwShareMode = FILE_SHARE_READ;
625 if (!ts.LogLockExclusive) {
626 dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
627 }
628 LogVar->FileHandle = (int)CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
629 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
630 }
631 LogVar->FileOpen = (LogVar->FileHandle>0);
632 if (! LogVar->FileOpen)
633 {
634 char msg[128];
635
636 // �t�@�C���I�[�v���G���[�������b�Z�[�W�\�������������B(2008.7.9 yutaka)
637 if (LogVar->NoMsg == FALSE) {
638 _snprintf_s(msg, sizeof(msg), _TRUNCATE, "Can not create a `%s' file. (%d)", LogVar->FullName, GetLastError());
639 MessageBox(NULL, msg, "Tera Term: File open error", MB_OK | MB_ICONERROR);
640 }
641
642 FileTransEnd(OpLog);
643 return FALSE;
644 }
645 LogVar->ByteCount = 0;
646
647 // Log rotate configuration
648 LogVar->RotateMode = ts.LogRotate;
649 LogVar->RotateSize = ts.LogRotateSize;
650 LogVar->RotateStep = ts.LogRotateStep;
651
652 // Log rotate���L���������A�����t�@�C���T�C�Y�����������B
653 // �������t�@�C�������������T�C�Y�����[�e�[�g�������������C���B
654 // (2016.4.9 yutaka)
655 if (LogVar->RotateMode != ROTATE_NONE) {
656 size = GetFileSize((HANDLE)LogVar->FileHandle, NULL);
657 if (size != -1)
658 LogVar->ByteCount = size;
659 }
660
661 if (! OpenFTDlg(LogVar)) {
662 FileTransEnd(OpLog);
663 return FALSE;
664 }
665
666 // �x�����������p�X���b�h���N�����B
667 // (2013.4.19 yutaka)
668 // DeferredLogWriteThread �X���b�h���N�������A�X���b�h�L���[�����������������O���A
669 // ���O�t�@�C�����N���[�Y(CloseFileSync)���s���������A�G���L���[�����s���A�f�b�h���b�N
670 // �����������������C�������B
671 // �X���b�h�����������s�������A���O�����C�x���g�I�u�W�F�N�g���g�����A�X���b�h�L���[��
672 // ���������������������������������B���O�t���C�x���g�I�u�W�F�N�g���g���������A
673 // �V�X�e��(Windows OS)�������j�[�N�����O�������K�v�������B
674 // (2016.9.23 yutaka)
675 LogVar->LogThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
676 LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid);
677 LogVar->LogThreadId = tid;
678 if (LogVar->LogThreadEvent != NULL) {
679 WaitForSingleObject(LogVar->LogThreadEvent, INFINITE);
680 CloseHandle(LogVar->LogThreadEvent);
681 }
682
683 // �����o�b�t�@�������f�[�^�������������o���������A
684 // ���O�������J�n�����B
685 // (2013.9.29 yutaka)
686 if (ts.LogAllBuffIncludedInFirst) {
687 for (ofs = 0 ; ; ofs++ ) {
688 // 1�����s�����������B���������������A�G�X�P�[�v�V�[�P���X�������������B
689 size = BuffGetAnyLineData(ofs, buf, sizeof(buf));
690 if (size == -1)
691 break;
692
693 #if 0
694 if (ts.DeferredLogWriteMode) { // �x����������
695 char *pbuf = (char *)malloc(size + 2);
696 memcpy(pbuf, buf, size);
697 pbuf[size] = '\r';
698 pbuf[size+1] = '\n';
699 Sleep(1); // �X���b�h�L���[�����������������A�R���e�L�X�g�X�C�b�`�������B
700 PostThreadMessage(LogVar->LogThreadId, WM_DPC_LOGTHREAD_SEND, (WPARAM)pbuf, size + 2);
701 } else { // �������B�l�b�g���[�N�o�R�����x���B
702 #endif
703 WriteFile((HANDLE)LogVar->FileHandle, buf, size, &written_size, NULL);
704 WriteFile((HANDLE)LogVar->FileHandle, crlf, crlf_len, &written_size, NULL);
705 #if 0
706 }
707 #endif
708 }
709 }
710
711 return TRUE;
712 }
713 }
714
715 void LogPut1(BYTE b)
716 {
717 LogLast = b;
718 cv.LogBuf[cv.LogPtr] = b;
719 cv.LogPtr++;
720 if (cv.LogPtr>=InBuffSize)
721 cv.LogPtr = cv.LogPtr-InBuffSize;
722
723 if (FileLog)
724 {
725 if (cv.LCount>=InBuffSize)
726 {
727 cv.LCount = InBuffSize;
728 cv.LStart = cv.LogPtr;
729 }
730 else
731 cv.LCount++;
732 }
733 else
734 cv.LCount = 0;
735
736 if (DDELog)
737 {
738 if (cv.DCount>=InBuffSize)
739 {
740 cv.DCount = InBuffSize;
741 cv.DStart = cv.LogPtr;
742 }
743 else
744 cv.DCount++;
745 }
746 else {
747 cv.DCount = 0;
748 // ���O���������}�N�����X�g�[���������������C���B
749 // ���O�����������x�}�N�����~�������A�o�b�t�@���C���f�b�N�X�������������������A
750 // ���x�}�N�������������������f�[�^�������������������B
751 // �}�N�������~���������������C���f�b�N�X�����������������������B
752 // (2006.12.26 yutaka)
753 cv.DStart = cv.LogPtr;
754 }
755 }
756
757 void Log1Byte(BYTE b)
758 {
759 if (b==0x0d)
760 {
761 LogLast = b;
762 return;
763 }
764 if ((b==0x0a) && (LogLast==0x0d))
765 LogPut1(0x0d);
766 LogPut1(b);
767 }
768
769 static BOOL Get1(PCHAR Buf, int *Start, int *Count, PBYTE b)
770 {
771 if (*Count<=0) return FALSE;
772 *b = Buf[*Start];
773 (*Start)++;
774 if (*Start>=InBuffSize)
775 *Start = *Start-InBuffSize;
776 (*Count)--;
777 return TRUE;
778 }
779
780
781
782 static CRITICAL_SECTION g_filelog_lock; /* ���b�N�p���� */
783
784 void logfile_lock_initialize(void)
785 {
786 InitializeCriticalSection(&g_filelog_lock);
787 }
788
789 static inline void logfile_lock(void)
790 {
791 EnterCriticalSection(&g_filelog_lock);
792 }
793
794 static inline void logfile_unlock(void)
795 {
796 LeaveCriticalSection(&g_filelog_lock);
797 }
798
799 // �R�����g�����O����������
800 void CommentLogToFile(char *buf, int size)
801 {
802 DWORD wrote;
803
804 if (LogVar == NULL || !LogVar->FileOpen) {
805 char uimsg[MAX_UIMSG];
806 get_lang_msg("MSG_ERROR", uimsg, sizeof(uimsg), "ERROR", ts.UILanguageFile);
807 get_lang_msg("MSG_COMMENT_LOG_OPEN_ERROR", ts.UIMsg, sizeof(ts.UIMsg),
808 "It is not opened by the log file yet.", ts.UILanguageFile);
809 ::MessageBox(NULL, ts.UIMsg, uimsg, MB_OK|MB_ICONEXCLAMATION);
810 return;
811 }
812
813 logfile_lock();
814 WriteFile((HANDLE)LogVar->FileHandle, buf, size, &wrote, NULL);
815 WriteFile((HANDLE)LogVar->FileHandle, "\r\n", 2, &wrote, NULL); // ���s
816 /* Set Line End Flag
817 2007.05.24 Gentaro
818 */
819 eLineEnd = Line_LineHead;
820 logfile_unlock();
821 }
822
823 // ���O�����[�e�[�g�����B
824 // (2013.3.21 yutaka)
825 static void LogRotate(void)
826 {
827 int loopmax = 10000; // XXX
828 char filename[1024];
829 char newfile[1024], oldfile[1024];
830 int i, k;
831 int dwShareMode = FILE_SHARE_READ;
832 unsigned tid;
833
834 if (! LogVar->FileOpen) return;
835
836 if (LogVar->RotateMode == ROTATE_NONE)
837 return;
838
839 if (LogVar->RotateMode == ROTATE_SIZE) {
840 if (LogVar->ByteCount <= LogVar->RotateSize)
841 return;
842 //OutputDebugPrintf("%s: mode %d size %ld\n", __FUNCTION__, LogVar->RotateMode, LogVar->ByteCount);
843 } else {
844 return;
845 }
846
847 logfile_lock();
848 // ���O�T�C�Y���������������B
849 LogVar->ByteCount = 0;
850
851 // �������������t�@�C�����N���[�Y�����A�������t�@�C�����I�[�v�������B
852 CloseFileSync(LogVar);
853 //_lclose(LogVar->FileHandle);
854
855 // �������[�e�[�V�������X�e�b�v�����w����������
856 if (LogVar->RotateStep > 0)
857 loopmax = LogVar->RotateStep;
858
859 for (i = 1 ; i <= loopmax ; i++) {
860 _snprintf_s(filename, sizeof(filename), _TRUNCATE, "%s.%d", LogVar->FullName, i);
861 if (_access_s(filename, 0) != 0)
862 break;
863 }
864 if (i > loopmax) {
865 // �������������������������A�������t�@�C�������p�������B
866 i = loopmax;
867 }
868
869 // ���t�@�C�������l�[���B
870 for (k = i-1 ; k >= 0 ; k--) {
871 if (k == 0)
872 strncpy_s(oldfile, sizeof(oldfile), LogVar->FullName, _TRUNCATE);
873 else
874 _snprintf_s(oldfile, sizeof(oldfile), _TRUNCATE, "%s.%d", LogVar->FullName, k);
875 _snprintf_s(newfile, sizeof(newfile), _TRUNCATE, "%s.%d", LogVar->FullName, k+1);
876 remove(newfile);
877 if (rename(oldfile, newfile) != 0) {
878 OutputDebugPrintf("%s: rename %d\n", __FUNCTION__, errno);
879 }
880 }
881
882 // ���I�[�v��
883 if (!ts.LogLockExclusive) {
884 dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
885 }
886 LogVar->FileHandle = (int)CreateFile(LogVar->FullName, GENERIC_WRITE, dwShareMode, NULL,
887 CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
888
889 // �x�����������p�X���b�h���N�����B
890 // (2013.4.19 yutaka)
891 // DeferredLogWriteThread �X���b�h���N�������A�X���b�h�L���[�����������������O���A
892 // ���O�t�@�C�����N���[�Y(CloseFileSync)���s���������A�G���L���[�����s���A�f�b�h���b�N
893 // �����������������C�������B
894 // �X���b�h�����������s�������A���O�����C�x���g�I�u�W�F�N�g���g�����A�X���b�h�L���[��
895 // ���������������������������������B���O�t���C�x���g�I�u�W�F�N�g���g���������A
896 // �V�X�e��(Windows OS)�������j�[�N�����O�������K�v�������B
897 // (2016.9.26 yutaka)
898 LogVar->LogThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
899 LogVar->LogThread = (HANDLE)_beginthreadex(NULL, 0, DeferredLogWriteThread, LogVar, 0, &tid);
900 LogVar->LogThreadId = tid;
901 if (LogVar->LogThreadEvent != NULL) {
902 WaitForSingleObject(LogVar->LogThreadEvent, INFINITE);
903 CloseHandle(LogVar->LogThreadEvent);
904 }
905
906 logfile_unlock();
907
908 }
909
910 void LogToFile()
911 {
912 PCHAR Buf;
913 int Start, Count;
914 BYTE b;
915 PCHAR WriteBuf;
916 DWORD WriteBufMax, WriteBufLen;
917 CHAR tmp[128];
918 DWORD wrote;
919
920 if (! LogVar->FileOpen) return;
921 if (FileLog)
922 {
923 Buf = cv.LogBuf;
924 Start = cv.LStart;
925 Count = cv.LCount;
926 }
927 else if (BinLog)
928 {
929 Buf = cv.BinBuf;
930 Start = cv.BStart;
931 Count = cv.BCount;
932 }
933 else
934 return;
935
936 if (Buf==NULL) return;
937 if (Count==0) return;
938
939 // ���b�N������(2004.8.6 yutaka)
940 logfile_lock();
941
942 if (ts.DeferredLogWriteMode) {
943 WriteBufMax = 8192;
944 WriteBufLen = 0;
945 WriteBuf = (PCHAR)malloc(WriteBufMax);
946 while (Get1(Buf,&Start,&Count,&b)) {
947 if (((cv.FilePause & OpLog)==0) && (! cv.ProtoFlag))
948 {
949 tmp[0] = 0;
950 if ( ts.LogTimestamp && eLineEnd ) {
951 char *strtime = mctimelocal(ts.LogTimestampFormat, ts.LogTimestampUTC);
952 /* 2007.05.24 Gentaro */
953 if( eLineEnd == Line_FileHead ){
954 strncat_s(tmp, sizeof(tmp), "\r\n", _TRUNCATE);
955 }
956 strncat_s(tmp, sizeof(tmp), "[", _TRUNCATE);
957 strncat_s(tmp, sizeof(tmp), strtime, _TRUNCATE);
958 strncat_s(tmp, sizeof(tmp), "] ", _TRUNCATE);
959 }
960
961 /* 2007.05.24 Gentaro */
962 if( b == 0x0a ){
963 eLineEnd = Line_LineHead; /* set endmark*/
964 }
965 else {
966 eLineEnd = Line_Other; /* clear endmark*/
967 }
968
969 if (WriteBufLen >= (WriteBufMax*4/5)) {
970 WriteBufMax *= 2;
971 WriteBuf = (PCHAR)realloc(WriteBuf, WriteBufMax);
972 }
973 memcpy(&WriteBuf[WriteBufLen], tmp, strlen(tmp));
974 WriteBufLen += strlen(tmp);
975 WriteBuf[WriteBufLen++] = b;
976
977 (LogVar->ByteCount)++;
978 }
979 }
980
981 PostThreadMessage(LogVar->LogThreadId, WM_DPC_LOGTHREAD_SEND, (WPARAM)WriteBuf, WriteBufLen);
982
983 } else {
984
985 while (Get1(Buf,&Start,&Count,&b))
986 {
987 if (((cv.FilePause & OpLog)==0) && (! cv.ProtoFlag))
988 {
989 if ( ts.LogTimestamp && eLineEnd ) {
990 char *strtime = mctimelocal(ts.LogTimestampFormat, ts.LogTimestampUTC);
991 WriteFile((HANDLE)LogVar->FileHandle, "[", 1, &wrote, NULL);
992 WriteFile((HANDLE)LogVar->FileHandle, strtime, strlen(strtime), &wrote, NULL);
993 WriteFile((HANDLE)LogVar->FileHandle, "] ", 2, &wrote, NULL);
994 }
995
996 /* 2007.05.24 Gentaro */
997 if( b == 0x0a ){
998 eLineEnd = Line_LineHead; /* set endmark*/
999 }
1000 else {
1001 eLineEnd = Line_Other; /* clear endmark*/
1002 }
1003
1004 WriteFile((HANDLE)LogVar->FileHandle, (PCHAR)&b, 1, &wrote, NULL);
1005 (LogVar->ByteCount)++;
1006 }
1007 }
1008
1009 }
1010
1011 logfile_unlock();
1012
1013 if (FileLog)
1014 {
1015 cv.LStart = Start;
1016 cv.LCount = Count;
1017 }
1018 else {
1019 cv.BStart = Start;
1020 cv.BCount = Count;
1021 }
1022 if (((cv.FilePause & OpLog) !=0) || cv.ProtoFlag) return;
1023 if (FLogDlg!=NULL)
1024 FLogDlg->RefreshNum();
1025
1026 // ���O�E���[�e�[�g
1027 LogRotate();
1028
1029 }
1030
1031 BOOL CreateLogBuf()
1032 {
1033 if (cv.HLogBuf==NULL)
1034 {
1035 cv.HLogBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
1036 cv.LogBuf = NULL;
1037 cv.LogPtr = 0;
1038 cv.LStart = 0;
1039 cv.LCount = 0;
1040 cv.DStart = 0;
1041 cv.DCount = 0;
1042 }
1043 return (cv.HLogBuf!=NULL);
1044 }
1045
1046 void FreeLogBuf()
1047 {
1048 if ((cv.HLogBuf==NULL) || FileLog || DDELog)
1049 return;
1050 if (cv.LogBuf!=NULL)
1051 GlobalUnlock(cv.HLogBuf);
1052 GlobalFree(cv.HLogBuf);
1053 cv.HLogBuf = NULL;
1054 cv.LogBuf = NULL;
1055 cv.LogPtr = 0;
1056 cv.LStart = 0;
1057 cv.LCount = 0;
1058 cv.DStart = 0;
1059 cv.DCount = 0;
1060 }
1061
1062 BOOL CreateBinBuf()
1063 {
1064 if (cv.HBinBuf==NULL)
1065 {
1066 cv.HBinBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
1067 cv.BinBuf = NULL;
1068 cv.BinPtr = 0;
1069 cv.BStart = 0;
1070 cv.BCount = 0;
1071 }
1072 return (cv.HBinBuf!=NULL);
1073 }
1074
1075 void FreeBinBuf()
1076 {
1077 if ((cv.HBinBuf==NULL) || BinLog)
1078 return;
1079 if (cv.BinBuf!=NULL)
1080 GlobalUnlock(cv.HBinBuf);
1081 GlobalFree(cv.HBinBuf);
1082 cv.HBinBuf = NULL;
1083 cv.BinBuf = NULL;
1084 cv.BinPtr = 0;
1085 cv.BStart = 0;
1086 cv.BCount = 0;
1087 }
1088
1089 extern "C" {
1090 void FileSendStart()
1091 {
1092 LONG Option = 0;
1093
1094 if (! cv.Ready || FSend) return;
1095 if (cv.ProtoFlag)
1096 {
1097 FreeFileVar(&SendVar);
1098 return;
1099 }
1100
1101 if (! LoadTTFILE())
1102 return;
1103 if (! NewFileVar(&SendVar))
1104 {
1105 FreeTTFILE();
1106 return;
1107 }
1108 SendVar->OpId = OpSendFile;
1109
1110 FSend = TRUE;
1111
1112 if (strlen(&(SendVar->FullName[SendVar->DirLen]))==0) {
1113 if (ts.TransBin)
1114 Option |= LOGDLG_BINARY;
1115 SendVar->FullName[0] = 0;
1116 if (! (*GetTransFname)(SendVar, ts.FileDir, GTF_SEND, &Option)) {
1117 FileTransEnd(OpSendFile);
1118 return;
1119 }
1120 ts.TransBin = CheckFlag(Option, LOGDLG_BINARY);
1121 }
1122 else
1123 (*SetFileVar)(SendVar);
1124
1125 SendVar->FileHandle = (int)CreateFile(SendVar->FullName, GENERIC_READ, FILE_SHARE_READ, NULL,
1126 OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
1127 SendVar->FileOpen = (SendVar->FileHandle>0);
1128 if (! SendVar->FileOpen)
1129 {
1130 FileTransEnd(OpSendFile);
1131 return;
1132 }
1133 SendVar->ByteCount = 0;
1134 SendVar->FileSize = GetFSize(SendVar->FullName);
1135
1136 TalkStatus = IdTalkFile;
1137 FileRetrySend = FALSE;
1138 FileRetryEcho = FALSE;
1139 FileCRSend = FALSE;
1140 FileReadEOF = FALSE;
1141 FileSendHandler.pos = 0;
1142 FileSendHandler.end = 0;
1143 FileDlgRefresh = 0;
1144
1145 if (BracketedPasteMode()) {
1146 FileBracketMode = FS_BRACKET_START;
1147 FileBracketPtr = 0;
1148 BinaryMode = TRUE;
1149 }
1150 else {
1151 FileBracketMode = FS_BRACKET_NONE;
1152 BinaryMode = ts.TransBin;
1153 }
1154
1155 if (! OpenFTDlg(SendVar))
1156 FileTransEnd(OpSendFile);
1157 }
1158 }
1159
1160 void FileTransEnd(WORD OpId)
1161 /* OpId = 0: close Log and FileSend
1162 OpLog: close Log
1163 OpSendFile: close FileSend */
1164 {
1165 if (((OpId==0) || (OpId==OpLog)) && (FileLog || BinLog))
1166 {
1167 FileLog = FALSE;
1168 BinLog = FALSE;
1169 if (FLogDlg!=NULL)
1170 {
1171 FLogDlg->DestroyWindow();
1172 FLogDlg = NULL;
1173 HWndLog = NULL; // steven add
1174 }
1175 FreeFileVar(&LogVar);
1176 FreeLogBuf();
1177 FreeBinBuf();
1178 FreeTTFILE();
1179 }
1180
1181 if (((OpId==0) || (OpId==OpSendFile)) && FSend)
1182 {
1183 FSend = FALSE;
1184 TalkStatus = IdTalkKeyb;
1185 if (SendDlg!=NULL)
1186 {
1187 SendDlg->DestroyWindow();
1188 SendDlg = NULL;
1189 }
1190 FreeFileVar(&SendVar);
1191 FreeTTFILE();
1192 }
1193
1194 EndDdeCmnd(0);
1195 }
1196
1197 int FSOut1(BYTE b)
1198 {
1199 if (BinaryMode)
1200 return CommBinaryOut(&cv,(PCHAR)&b,1);
1201 else if ((b>=0x20) || (b==0x09) || (b==0x0A) || (b==0x0D))
1202 return CommTextOut(&cv,(PCHAR)&b,1);
1203 else
1204 return 1;
1205 }
1206
1207 int FSEcho1(BYTE b)
1208 {
1209 if (BinaryMode)
1210 return CommBinaryEcho(&cv,(PCHAR)&b,1);
1211 else
1212 return CommTextEcho(&cv,(PCHAR)&b,1);
1213 }
1214
1215 extern "C" {
1216 // �������������������������g��
1217 // - BinaryMode == true
1218 // - FileBracketMode == false
1219 // - cv.TelFlag == false
1220 // - ts.LocalEcho == 0
1221 void FileSendBinayBoost()
1222 {
1223 WORD c, fc;
1224 LONG BCOld;
1225 DWORD read_bytes;
1226
1227 if ((SendDlg == NULL) ||
1228 ((cv.FilePause & OpSendFile) != 0))
1229 return;
1230
1231 BCOld = SendVar->ByteCount;
1232
1233 if (FileRetrySend)
1234 {
1235 c = CommRawOut(&cv, &(FileSendHandler.buf[FileSendHandler.pos]),
1236 FileSendHandler.end - FileSendHandler.pos);
1237 FileSendHandler.pos += c;
1238 FileRetrySend = (FileSendHandler.end != FileSendHandler.pos);
1239 if (FileRetrySend)
1240 return;
1241 }
1242
1243 do {
1244 if (FileSendHandler.pos == FileSendHandler.end) {
1245 ReadFile((HANDLE)SendVar->FileHandle, &(FileSendHandler.buf[0]), sizeof(FileSendHandler.buf), &read_bytes, NULL);
1246 fc = LOWORD(read_bytes);
1247 FileSendHandler.pos = 0;
1248 FileSendHandler.end = fc;
1249 } else {
1250 fc = FileSendHandler.end - FileSendHandler.end;
1251 }
1252
1253 if (fc != 0)
1254 {
1255 c = CommRawOut(&cv, &(FileSendHandler.buf[FileSendHandler.pos]),
1256 FileSendHandler.end - FileSendHandler.pos);
1257 FileSendHandler.pos += c;
1258 FileRetrySend = (FileSendHandler.end != FileSendHandler.pos);
1259 SendVar->ByteCount = SendVar->ByteCount + c;
1260 if (FileRetrySend)
1261 {
1262 if (SendVar->ByteCount != BCOld)
1263 SendDlg->RefreshNum();
1264 return;
1265 }
1266 }
1267 FileDlgRefresh = SendVar->ByteCount;
1268 SendDlg->RefreshNum();
1269 BCOld = SendVar->ByteCount;
1270 if (fc != 0)
1271 return;
1272 } while (fc != 0);
1273
1274 FileTransEnd(OpSendFile);
1275 }
1276 }
1277
1278 extern "C" {
1279 void FileSend()
1280 {
1281 WORD c, fc;
1282 LONG BCOld;
1283 DWORD read_bytes;
1284
1285 if (cv.PortType == IdSerial && ts.FileSendHighSpeedMode &&
1286 BinaryMode && !FileBracketMode && !cv.TelFlag &&
1287 (ts.LocalEcho == 0) && (ts.Baud >= 115200)) {
1288 return FileSendBinayBoost();
1289 }
1290
1291 if ((SendDlg==NULL) ||
1292 ((cv.FilePause & OpSendFile) !=0))
1293 return;
1294
1295 BCOld = SendVar->ByteCount;
1296
1297 if (FileRetrySend)
1298 {
1299 FileRetryEcho = (ts.LocalEcho>0);
1300 c = FSOut1(FileByte);
1301 FileRetrySend = (c==0);
1302 if (FileRetrySend)
1303 return;
1304 }
1305
1306 if (FileRetryEcho)
1307 {
1308 c = FSEcho1(FileByte);
1309 FileRetryEcho = (c==0);
1310 if (FileRetryEcho)
1311 return;
1312 }
1313
1314 do {
1315 if (FileBracketMode == FS_BRACKET_START) {
1316 FileByte = BracketStartStr[FileBracketPtr++];
1317 fc = 1;
1318
1319 if (FileBracketPtr >= sizeof(BracketStartStr) - 1) {
1320 FileBracketMode = FS_BRACKET_END;
1321 FileBracketPtr = 0;
1322 BinaryMode = ts.TransBin;
1323 }
1324 }
1325 else if (! FileReadEOF) {
1326 ReadFile((HANDLE)SendVar->FileHandle, &FileByte, 1, &read_bytes, NULL);
1327 fc = LOWORD(read_bytes);
1328 SendVar->ByteCount = SendVar->ByteCount + fc;
1329
1330 if (FileCRSend && (fc==1) && (FileByte==0x0A)) {
1331 ReadFile((HANDLE)SendVar->FileHandle, &FileByte, 1, &read_bytes, NULL);
1332 fc = LOWORD(read_bytes);
1333 SendVar->ByteCount = SendVar->ByteCount + fc;
1334 }
1335 }
1336 else {
1337 fc = 0;
1338 }
1339
1340 if (fc == 0 && FileBracketMode == FS_BRACKET_END) {
1341 FileReadEOF = TRUE;
1342 FileByte = BracketEndStr[FileBracketPtr++];
1343 fc = 1;
1344 BinaryMode = TRUE;
1345
1346 if (FileBracketPtr >= sizeof(BracketEndStr) - 1) {
1347 FileBracketMode = FS_BRACKET_NONE;
1348 FileBracketPtr = 0;
1349 }
1350 }
1351
1352
1353 if (fc!=0)
1354 {
1355 c = FSOut1(FileByte);
1356 FileCRSend = (ts.TransBin==0) && (FileByte==0x0D);
1357 FileRetrySend = (c==0);
1358 if (FileRetrySend)
1359 {
1360 if (SendVar->ByteCount != BCOld)
1361 SendDlg->RefreshNum();
1362 return;
1363 }
1364 if (ts.LocalEcho>0)
1365 {
1366 c = FSEcho1(FileByte);
1367 FileRetryEcho = (c==0);
1368 if (FileRetryEcho)
1369 return;
1370 }
1371 }
1372 if ((fc==0) || ((SendVar->ByteCount % 100 == 0) && (FileBracketPtr == 0))) {
1373 SendDlg->RefreshNum();
1374 BCOld = SendVar->ByteCount;
1375 if (fc!=0)
1376 return;
1377 }
1378 } while (fc!=0);
1379
1380 FileTransEnd(OpSendFile);
1381 }
1382 }
1383
1384 extern "C" {
1385 void FLogChangeButton(BOOL Pause)
1386 {
1387 if (FLogDlg!=NULL)
1388 FLogDlg->ChangeButton(Pause);
1389 }
1390 }
1391
1392 extern "C" {
1393 void FLogRefreshNum()
1394 {
1395 if (FLogDlg!=NULL)
1396 FLogDlg->RefreshNum();
1397 }
1398 }
1399
1400 BOOL OpenProtoDlg(PFileVar fv, int IdProto, int Mode, WORD Opt1, WORD Opt2)
1401 {
1402 int vsize;
1403 PProtoDlg pd;
1404 HWND Hpd;
1405 char uimsg[MAX_UIMSG];
1406
1407 ProtoId = IdProto;
1408
1409 switch (ProtoId) {
1410 case PROTO_KMT:
1411 vsize = sizeof(TKmtVar);
1412 break;
1413 case PROTO_XM:
1414 vsize = sizeof(TXVar);
1415 break;
1416 case PROTO_YM:
1417 vsize = sizeof(TYVar);
1418 break;
1419 case PROTO_ZM:
1420 vsize = sizeof(TZVar);
1421 break;
1422 case PROTO_BP:
1423 vsize = sizeof(TBPVar);
1424 break;
1425 case PROTO_QV:
1426 vsize = sizeof(TQVVar);
1427 break;
1428 }
1429 ProtoVar = (PCHAR)malloc(vsize);
1430 if (ProtoVar==NULL)
1431 return FALSE;
1432
1433 switch (ProtoId) {
1434 case PROTO_KMT:
1435 ((PKmtVar)ProtoVar)->KmtMode = Mode;
1436 break;
1437 case PROTO_XM:
1438 ((PXVar)ProtoVar)->XMode = Mode;
1439 ((PXVar)ProtoVar)->XOpt = Opt1;
1440 ((PXVar)ProtoVar)->TextFlag = 1 - (Opt2 & 1);
1441 break;
1442 case PROTO_YM:
1443 ((PYVar)ProtoVar)->YMode = Mode;
1444 ((PYVar)ProtoVar)->YOpt = Opt1;
1445 break;
1446 case PROTO_ZM:
1447 ((PZVar)ProtoVar)->BinFlag = (Opt1 & 1) != 0;
1448 ((PZVar)ProtoVar)->ZMode = Mode;
1449 break;
1450 case PROTO_BP:
1451 ((PBPVar)ProtoVar)->BPMode = Mode;
1452 break;
1453 case PROTO_QV:
1454 ((PQVVar)ProtoVar)->QVMode = Mode;
1455 break;
1456 }
1457
1458 pd = new CProtoDlg();
1459 if (pd==NULL)
1460 {
1461 free(ProtoVar);
1462 ProtoVar = NULL;
1463 return FALSE;
1464 }
1465 pd->Create(fv,&ts);
1466
1467 Hpd=pd->GetSafeHwnd();
1468
1469 GetDlgItemText(Hpd, IDC_PROT_FILENAME, uimsg, sizeof(uimsg));
1470 get_lang_msg("DLG_PROT_FILENAME", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1471 SetDlgItemText(Hpd, IDC_PROT_FILENAME, ts.UIMsg);
1472 GetDlgItemText(Hpd, IDC_PROT_PROT, uimsg, sizeof(uimsg));
1473 get_lang_msg("DLG_PROT_PROTO", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1474 SetDlgItemText(Hpd, IDC_PROT_PROT, ts.UIMsg);
1475 GetDlgItemText(Hpd, IDC_PROT_PACKET, uimsg, sizeof(uimsg));
1476 get_lang_msg("DLG_PROT_PACKET", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1477 SetDlgItemText(Hpd, IDC_PROT_PACKET, ts.UIMsg);
1478 GetDlgItemText(Hpd, IDC_PROT_TRANS, uimsg, sizeof(uimsg));
1479 get_lang_msg("DLG_PROT_TRANS", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1480 SetDlgItemText(Hpd, IDC_PROT_TRANS, ts.UIMsg);
1481 GetDlgItemText(Hpd, IDC_PROT_ELAPSED, uimsg, sizeof(uimsg));
1482 get_lang_msg("DLG_PROT_ELAPSED", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1483 SetDlgItemText(Hpd, IDC_PROT_ELAPSED, ts.UIMsg);
1484 GetDlgItemText(Hpd, IDCANCEL, uimsg, sizeof(uimsg));
1485 get_lang_msg("BTN_CANCEL", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
1486 SetDlgItemText(Hpd, IDCANCEL, ts.UIMsg);
1487
1488 (*ProtoInit)(ProtoId,FileVar,ProtoVar,&cv,&ts);
1489
1490 PtDlg = pd;
1491 return TRUE;
1492 }
1493
1494 extern "C" {
1495 void CloseProtoDlg()
1496 {
1497 if (PtDlg!=NULL)
1498 {
1499 PtDlg->DestroyWindow();
1500 PtDlg = NULL;
1501
1502 ::KillTimer(FileVar->HMainWin,IdProtoTimer);
1503 if ((ProtoId==PROTO_QV) &&
1504 (((PQVVar)ProtoVar)->QVMode==IdQVSend))
1505 CommTextOut(&cv,"\015",1);
1506 if (FileVar->LogFlag)
1507 _lclose(FileVar->LogFile);
1508 FileVar->LogFile = 0;
1509 if (ProtoVar!=NULL)
1510 {
1511 free(ProtoVar);
1512 ProtoVar = NULL;
1513 }
1514 }
1515 }
1516 }
1517
1518 BOOL ProtoStart()
1519 {
1520 if (cv.ProtoFlag)
1521 return FALSE;
1522 if (FSend)
1523 {
1524 FreeFileVar(&FileVar);
1525 return FALSE;
1526 }
1527
1528 if (! LoadTTFILE())
1529 return FALSE;
1530 NewFileVar(&FileVar);
1531
1532 if (FileVar==NULL)
1533 {
1534 FreeTTFILE();
1535 return FALSE;
1536 }
1537 cv.ProtoFlag = TRUE;
1538 return TRUE;
1539 }
1540
1541 void ProtoEnd()
1542 {
1543 if (! cv.ProtoFlag)
1544 return;
1545 cv.ProtoFlag = FALSE;
1546
1547 /* Enable transmit delay (serial port) */
1548 cv.DelayFlag = TRUE;
1549 TalkStatus = IdTalkKeyb;
1550
1551 CloseProtoDlg();
1552
1553 if ((FileVar!=NULL) && FileVar->Success)
1554 EndDdeCmnd(1);
1555 else
1556 EndDdeCmnd(0);
1557
1558 FreeTTFILE();
1559 FreeFileVar(&FileVar);
1560 }
1561
1562 extern "C" {
1563 int ProtoDlgParse()
1564 {
1565 int P;
1566
1567 P = ActiveWin;
1568 if (PtDlg==NULL)
1569 return P;
1570
1571 if ((*ProtoParse)(ProtoId,FileVar,ProtoVar,&cv))
1572 P = 0; /* continue */
1573 else {
1574 CommSend(&cv);
1575 ProtoEnd();
1576 }
1577 return P;
1578 }
1579 }
1580
1581 extern "C" {
1582 void ProtoDlgTimeOut()
1583 {
1584 if (PtDlg!=NULL)
1585 (*ProtoTimeOutProc)(ProtoId,FileVar,ProtoVar,&cv);
1586 }
1587 }
1588
1589 extern "C" {
1590 void ProtoDlgCancel()
1591 {
1592 if ((PtDlg!=NULL) &&
1593 (*ProtoCancel)(ProtoId,FileVar,ProtoVar,&cv))
1594 ProtoEnd();
1595 }
1596 }
1597
1598 extern "C" {
1599 void KermitStart(int mode)
1600 {
1601 WORD w;
1602
1603 if (! ProtoStart())
1604 return;
1605
1606 switch (mode) {
1607 case IdKmtSend:
1608 FileVar->OpId = OpKmtSend;
1609 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1610 {
1611 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_KERMIT,&w) ||
1612 (FileVar->NumFname==0))
1613 {
1614 ProtoEnd();
1615 return;
1616 }
1617 }
1618 else
1619 (*SetFileVar)(FileVar);
1620 break;
1621 case IdKmtReceive:
1622 FileVar->OpId = OpKmtRcv;
1623 break;
1624 case IdKmtGet:
1625 FileVar->OpId = OpKmtSend;
1626 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1627 {
1628 if (! (*GetGetFname)(FileVar->HMainWin,FileVar) ||
1629 (strlen(FileVar->FullName)==0))
1630 {
1631 ProtoEnd();
1632 return;
1633 }
1634 }
1635 else
1636 (*SetFileVar)(FileVar);
1637 break;
1638 case IdKmtFinish:
1639 FileVar->OpId = OpKmtFin;
1640 break;
1641 default:
1642 ProtoEnd();
1643 return;
1644 }
1645 TalkStatus = IdTalkQuiet;
1646
1647 /* disable transmit delay (serial port) */
1648 cv.DelayFlag = FALSE;
1649
1650 if (! OpenProtoDlg(FileVar,PROTO_KMT,mode,0,0))
1651 ProtoEnd();
1652 }
1653 }
1654
1655 extern "C" {
1656 void XMODEMStart(int mode)
1657 {
1658 LONG Option;
1659 int tmp;
1660
1661 if (! ProtoStart())
1662 return;
1663
1664 if (mode==IdXReceive)
1665 FileVar->OpId = OpXRcv;
1666 else
1667 FileVar->OpId = OpXSend;
1668
1669 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1670 {
1671 Option = MAKELONG(ts.XmodemBin,ts.XmodemOpt);
1672 if (! (*GetXFname)(FileVar->HMainWin,
1673 mode==IdXReceive,&Option,FileVar,ts.FileDir))
1674 {
1675 ProtoEnd();
1676 return;
1677 }
1678 tmp = HIWORD(Option);
1679 if (mode == IdXReceive) {
1680 if (IsXoptCRC(tmp)) {
1681 if (IsXopt1k(ts.XmodemOpt)) {
1682 ts.XmodemOpt = Xopt1kCRC;
1683 }
1684 else {
1685 ts.XmodemOpt = XoptCRC;
1686 }
1687 }
1688 else {
1689 if (IsXopt1k(ts.XmodemOpt)) {
1690 ts.XmodemOpt = Xopt1kCksum;
1691 }
1692 else {
1693 ts.XmodemOpt = XoptCheck;
1694 }
1695 }
1696 ts.XmodemBin = LOWORD(Option);
1697 }
1698 else {
1699 if (IsXopt1k(tmp)) {
1700 if (IsXoptCRC(ts.XmodemOpt)) {
1701 ts.XmodemOpt = Xopt1kCRC;
1702 }
1703 else {
1704 ts.XmodemOpt = Xopt1kCksum;
1705 }
1706 }
1707 else {
1708 if (IsXoptCRC(ts.XmodemOpt)) {
1709 ts.XmodemOpt = XoptCRC;
1710 }
1711 else {
1712 ts.XmodemOpt = XoptCheck;
1713 }
1714 }
1715 }
1716 }
1717 else
1718 (*SetFileVar)(FileVar);
1719
1720 if (mode==IdXReceive)
1721 FileVar->FileHandle = _lcreat(FileVar->FullName,0);
1722 else
1723 FileVar->FileHandle = _lopen(FileVar->FullName,OF_READ);
1724
1725 FileVar->FileOpen = FileVar->FileHandle>0;
1726 if (! FileVar->FileOpen)
1727 {
1728 ProtoEnd();
1729 return;
1730 }
1731 TalkStatus = IdTalkQuiet;
1732
1733 /* disable transmit delay (serial port) */
1734 cv.DelayFlag = FALSE;
1735
1736 if (! OpenProtoDlg(FileVar,PROTO_XM,mode,
1737 ts.XmodemOpt,ts.XmodemBin))
1738 ProtoEnd();
1739 }
1740 }
1741
1742 extern "C" {
1743 void YMODEMStart(int mode)
1744 {
1745 WORD Opt;
1746
1747 if (! ProtoStart())
1748 return;
1749
1750 if (mode==IdYSend)
1751 {
1752 // �t�@�C���]�������I�v�V������"Yopt1K"�����������B
1753 // TODO: "Yopt1K", "YoptG", "YoptSingle"�������������������AIDD_FOPT���g�������K�v�����B
1754 Opt = Yopt1K;
1755 FileVar->OpId = OpYSend;
1756 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1757 {
1758 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Y,&Opt) ||
1759 (FileVar->NumFname==0))
1760 {
1761 ProtoEnd();
1762 return;
1763 }
1764 //ts.XmodemBin = Opt;
1765 }
1766 else
1767 (*SetFileVar)(FileVar);
1768 }
1769 else {
1770 FileVar->OpId = OpYRcv;
1771 // �t�@�C���]�������I�v�V������"Yopt1K"�����������B
1772 Opt = Yopt1K;
1773 (*SetFileVar)(FileVar);
1774 }
1775
1776 TalkStatus = IdTalkQuiet;
1777
1778 /* disable transmit delay (serial port) */
1779 cv.DelayFlag = FALSE;
1780
1781 if (! OpenProtoDlg(FileVar,PROTO_YM,mode,Opt,0))
1782 ProtoEnd();
1783 }
1784 }
1785
1786 extern "C" {
1787 void ZMODEMStart(int mode)
1788 {
1789 WORD Opt;
1790
1791 if (! ProtoStart())
1792 return;
1793
1794 if (mode == IdZSend || mode == IdZAutoS)
1795 {
1796 Opt = ts.XmodemBin;
1797 FileVar->OpId = OpZSend;
1798 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1799 {
1800 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Z,&Opt) ||
1801 (FileVar->NumFname==0))
1802 {
1803 if (mode == IdZAutoS) {
1804 CommRawOut(&cv, "\030\030\030\030\030\030\030\030\b\b\b\b\b\b\b\b\b\b", 18);
1805 }
1806 ProtoEnd();
1807 return;
1808 }
1809 ts.XmodemBin = Opt;
1810 }
1811 else
1812 (*SetFileVar)(FileVar);
1813 }
1814 else /* IdZReceive or IdZAutoR */
1815 FileVar->OpId = OpZRcv;
1816
1817 TalkStatus = IdTalkQuiet;
1818
1819 /* disable transmit delay (serial port) */
1820 cv.DelayFlag = FALSE;
1821
1822 if (! OpenProtoDlg(FileVar,PROTO_ZM,mode,Opt,0))
1823 ProtoEnd();
1824 }
1825 }
1826
1827 extern "C" {
1828 void BPStart(int mode)
1829 {
1830 LONG Option = 0;
1831
1832 if (! ProtoStart())
1833 return;
1834 if (mode==IdBPSend)
1835 {
1836 FileVar->OpId = OpBPSend;
1837 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1838 {
1839 FileVar->FullName[0] = 0;
1840 if (! (*GetTransFname)(FileVar, ts.FileDir, GTF_BP, &Option))
1841 {
1842 ProtoEnd();
1843 return;
1844 }
1845 }
1846 else
1847 (*SetFileVar)(FileVar);
1848 }
1849 else /* IdBPReceive or IdBPAuto */
1850 FileVar->OpId = OpBPRcv;
1851
1852 TalkStatus = IdTalkQuiet;
1853
1854 /* disable transmit delay (serial port) */
1855 cv.DelayFlag = FALSE;
1856
1857 if (! OpenProtoDlg(FileVar,PROTO_BP,mode,0,0))
1858 ProtoEnd();
1859 }
1860 }
1861
1862 extern "C" {
1863 void QVStart(int mode)
1864 {
1865 WORD W;
1866
1867 if (! ProtoStart())
1868 return;
1869
1870 if (mode==IdQVSend)
1871 {
1872 FileVar->OpId = OpQVSend;
1873 if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1874 {
1875 if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_QV, &W) ||
1876 (FileVar->NumFname==0))
1877 {
1878 ProtoEnd();
1879 return;
1880 }
1881 }
1882 else
1883 (*SetFileVar)(FileVar);
1884 }
1885 else
1886 FileVar->OpId = OpQVRcv;
1887
1888 TalkStatus = IdTalkQuiet;
1889
1890 /* disable transmit delay (serial port) */
1891 cv.DelayFlag = FALSE;
1892
1893 if (! OpenProtoDlg(FileVar,PROTO_QV,mode,0,0))
1894 ProtoEnd();
1895 }
1896 }

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