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

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