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

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