Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /trunk/teraterm/teraterm/filesys.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9103 - (hide annotations) (download) (as text)
Sun Dec 20 12:16:14 2020 UTC (3 years, 3 months ago) by zmatsuo
File MIME type: text/x-c++src
File size: 14997 byte(s)
ProtoFlagを TComVar から filesys_proto.cpp へ移動
1 doda 6806 /*
2     * Copyright (C) 1994-1998 T. Teranishi
3 nmaya 9048 * (C) 2005- TeraTerm Project
4 doda 6806 * All rights reserved.
5     *
6 doda 6841 * Redistribution and use in source and binary forms, with or without
7     * modification, are permitted provided that the following conditions
8     * are met:
9 doda 6806 *
10 doda 6841 * 1. Redistributions of source code must retain the above copyright
11     * notice, this list of conditions and the following disclaimer.
12     * 2. Redistributions in binary form must reproduce the above copyright
13     * notice, this list of conditions and the following disclaimer in the
14     * documentation and/or other materials provided with the distribution.
15     * 3. The name of the author may not be used to endorse or promote products
16     * derived from this software without specific prior written permission.
17 doda 6806 *
18 doda 6841 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
19     * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21     * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23     * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27     * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 doda 6806 */
29 maya 3227
30     /* TERATERM.EXE, file transfer routines */
31 zmatsuo 7526 #include <stdio.h>
32     #include <io.h>
33     #include <process.h>
34 zmatsuo 8852 #include <windows.h>
35     #include <htmlhelp.h>
36     #include <assert.h>
37 zmatsuo 7526
38 maya 3227 #include "teraterm.h"
39     #include "tttypes.h"
40     #include "ttftypes.h"
41     #include "ftdlg.h"
42     #include "ttwinman.h"
43     #include "commlib.h"
44     #include "ttcommon.h"
45     #include "ttdde.h"
46     #include "ttlib.h"
47     #include "dlglib.h"
48 doda 3904 #include "vtterm.h"
49 zmatsuo 8852 #include "helpid.h"
50     #include "layer_for_unicode.h"
51 zmatsuo 8863 #include "codeconv.h"
52 zmatsuo 9071 #include "asprintf.h"
53 yutakapon 5392
54 zmatsuo 8852 #include "filesys_log_res.h"
55 yutakapon 5162
56 zmatsuo 8866 #include "filesys.h"
57    
58 zmatsuo 9067 typedef struct {
59 zmatsuo 9071 wchar_t *DlgCaption;
60 zmatsuo 9067
61 zmatsuo 9071 wchar_t *FullName;
62 zmatsuo 9067
63 zmatsuo 9068 HANDLE FileHandle;
64     LONG FileSize, ByteCount;
65 zmatsuo 9067
66 zmatsuo 9068 DWORD StartTime;
67 zmatsuo 9069 BOOL FilePause;
68 zmatsuo 9067 } TFileVar;
69     typedef TFileVar *PFileVar;
70    
71 doda 3904 #define FS_BRACKET_NONE 0
72     #define FS_BRACKET_START 1
73     #define FS_BRACKET_END 2
74    
75 zmatsuo 9057 static PFileVar SendVar = NULL;
76 maya 3227
77 doda 3904 static BOOL FileRetrySend, FileRetryEcho, FileCRSend, FileReadEOF, BinaryMode;
78 maya 3227 static BYTE FileByte;
79    
80 maya 6071 #define FILE_SEND_BUF_SIZE 8192
81     struct FileSendHandler {
82     CHAR buf[FILE_SEND_BUF_SIZE];
83     int pos;
84     int end;
85     };
86     static struct FileSendHandler FileSendHandler;
87     static int FileDlgRefresh;
88    
89 doda 3904 static int FileBracketMode = FS_BRACKET_NONE;
90     static int FileBracketPtr = 0;
91     static char BracketStartStr[] = "\033[200~";
92     static char BracketEndStr[] = "\033[201~";
93    
94 zmatsuo 9052 BOOL FSend = FALSE;
95 maya 3227
96     static PFileTransDlg SendDlg = NULL;
97    
98 zmatsuo 7526 static BOOL OpenFTDlg(PFileVar fv)
99 maya 3227 {
100     PFileTransDlg FTDlg;
101    
102     FTDlg = new CFileTransDlg();
103    
104 zmatsuo 9069 fv->FilePause = FALSE;
105 doda 4454
106 maya 3227 if (FTDlg!=NULL)
107     {
108 zmatsuo 9070 CFileTransDlg::Info info;
109 zmatsuo 9056 info.UILanguageFile = ts.UILanguageFile;
110 zmatsuo 9070 info.OpId = CFileTransDlg::OpSendFile;
111 zmatsuo 9071 info.DlgCaption = fv->DlgCaption;
112 zmatsuo 9056 info.FileName = NULL;
113 zmatsuo 9071 info.FullName = fv->FullName;
114 zmatsuo 9067 info.HideDialog = FALSE;
115 zmatsuo 9056 info.HMainWin = HVTWin;
116     FTDlg->Create(hInst, &info);
117     FTDlg->RefreshNum(0, fv->FileSize, fv->ByteCount);
118 maya 3227 }
119    
120 zmatsuo 8894 SendDlg = FTDlg; /* File send */
121 maya 3227
122 doda 6947 fv->StartTime = GetTickCount();
123 maya 3227
124     return (FTDlg!=NULL);
125     }
126    
127 zmatsuo 9067 #if 0
128 zmatsuo 8857 static void ShowFTDlg(WORD OpId)
129 maya 3227 {
130 zmatsuo 8894 if (SendDlg != NULL) {
131     SendDlg->ShowWindow(SW_SHOWNORMAL);
132     SetForegroundWindow(SendDlg->GetSafeHwnd());
133 maya 3227 }
134     }
135 zmatsuo 9067 #endif
136 maya 3227
137 zmatsuo 9068 static BOOL NewFileVar(PFileVar *pfv)
138 maya 3227 {
139 zmatsuo 9068 if ((*pfv) != NULL) {
140     return TRUE;
141 maya 3227 }
142    
143 zmatsuo 9068 PFileVar fv = (PFileVar)malloc(sizeof(TFileVar));
144     if (fv == NULL) {
145     return FALSE;
146     }
147     memset(fv, 0, sizeof(TFileVar));
148     fv->FileHandle = INVALID_HANDLE_VALUE;
149    
150     *pfv = fv;
151     return TRUE;
152 maya 3227 }
153    
154 zmatsuo 9068 static void FreeFileVar(PFileVar *pfv)
155 maya 3227 {
156 zmatsuo 9068 if ((*pfv)==NULL) {
157     return;
158 maya 3227 }
159 zmatsuo 9068
160     PFileVar fv = *pfv;
161     if (fv->FileHandle != INVALID_HANDLE_VALUE) {
162     CloseHandle(fv->FileHandle);
163 zmatsuo 9071 fv->FileHandle = INVALID_HANDLE_VALUE;
164 zmatsuo 9068 }
165     if (fv->FullName != NULL) {
166     free(fv->FullName);
167 zmatsuo 9071 fv->FullName = NULL;
168 zmatsuo 9068 }
169 zmatsuo 9071 free(fv->DlgCaption);
170     fv->DlgCaption = NULL;
171 zmatsuo 9068 free(fv);
172     *pfv = NULL;
173 maya 3227 }
174    
175 zmatsuo 9053 /* �_�C�A���O���������������� */
176     static void CenterCommonDialog(HWND hDlg)
177     {
178     /* hDlg���e���_�C�A���O���E�B���h�E�n���h�� */
179     HWND hWndDlgRoot = GetParent(hDlg);
180     CenterWindow(hWndDlgRoot, GetParent(hWndDlgRoot));
181     }
182    
183     static HFONT DlgFoptFont;
184     static UINT_PTR CALLBACK TransFnHook(HWND Dialog, UINT Message, WPARAM wParam, LPARAM lParam)
185     {
186     static const DlgTextInfo text_info[] = {
187     { IDC_FOPT, "DLG_FOPT" },
188     { IDC_FOPTBIN, "DLG_FOPT_BINARY" },
189     };
190     LPOPENFILENAME ofn;
191     LPWORD pw;
192     LPOFNOTIFY notify;
193     LOGFONT logfont;
194     HFONT font;
195     const char *UILanguageFile = ts.UILanguageFile;
196    
197     switch (Message) {
198     case WM_INITDIALOG:
199     ofn = (LPOPENFILENAME)lParam;
200     pw = (LPWORD)ofn->lCustData;
201     SetWindowLongPtr(Dialog, DWLP_USER, (LONG_PTR)pw);
202    
203     font = (HFONT)SendMessage(Dialog, WM_GETFONT, 0, 0);
204     GetObject(font, sizeof(LOGFONT), &logfont);
205     if (get_lang_font("DLG_TAHOMA_FONT", Dialog, &logfont, &DlgFoptFont, UILanguageFile)) {
206     SendDlgItemMessage(Dialog, IDC_FOPT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
207     SendDlgItemMessage(Dialog, IDC_FOPTBIN, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
208     SendDlgItemMessage(Dialog, IDC_FOPTAPPEND, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
209     SendDlgItemMessage(Dialog, IDC_PLAINTEXT, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
210     SendDlgItemMessage(Dialog, IDC_TIMESTAMP, WM_SETFONT, (WPARAM)DlgFoptFont, MAKELPARAM(TRUE,0));
211     }
212     else {
213     DlgFoptFont = NULL;
214     }
215    
216     SetI18nDlgStrs("Tera Term", Dialog, text_info, _countof(text_info), UILanguageFile);
217    
218     SetRB(Dialog,*pw & 1,IDC_FOPTBIN,IDC_FOPTBIN);
219    
220     CenterCommonDialog(Dialog);
221    
222     return TRUE;
223     case WM_COMMAND: // for old style dialog
224     switch (LOWORD(wParam)) {
225     case IDOK:
226     pw = (LPWORD)GetWindowLongPtr(Dialog,DWLP_USER);
227     if (pw!=NULL)
228     GetRB(Dialog,pw,IDC_FOPTBIN,IDC_FOPTBIN);
229     if (DlgFoptFont != NULL) {
230     DeleteObject(DlgFoptFont);
231     }
232     break;
233     case IDCANCEL:
234     if (DlgFoptFont != NULL) {
235     DeleteObject(DlgFoptFont);
236     }
237     break;
238     }
239     break;
240     case WM_NOTIFY: // for Explorer-style dialog
241     notify = (LPOFNOTIFY)lParam;
242     switch (notify->hdr.code) {
243     case CDN_FILEOK:
244     pw = (LPWORD)GetWindowLongPtr(Dialog,DWLP_USER);
245     if (pw!=NULL)
246     GetRB(Dialog,pw,IDC_FOPTBIN,IDC_FOPTBIN);
247     if (DlgFoptFont != NULL) {
248     DeleteObject(DlgFoptFont);
249     }
250     break;
251     }
252     break;
253     }
254     return FALSE;
255     }
256    
257 zmatsuo 9071 static wchar_t *_GetTransFname(HWND hWnd, const wchar_t *caption, LPLONG Option)
258 zmatsuo 9053 {
259     WORD optw;
260 zmatsuo 9068 wchar_t TempDir[MAX_PATH];
261 zmatsuo 9071 wchar_t FileName[MAX_PATH];
262 zmatsuo 9053 const char *UILanguageFile = ts.UILanguageFile;
263    
264     /* save current dir */
265     _GetCurrentDirectoryW(_countof(TempDir), TempDir);
266    
267 zmatsuo 9071 wchar_t FileDirExpanded[MAX_PATH];
268     wchar_t *FileDir = ToWcharA(ts.FileDir);
269     _ExpandEnvironmentStringsW(FileDir, FileDirExpanded, _countof(FileDirExpanded));
270     wchar_t *CurDir = FileDirExpanded;
271     free(FileDir);
272 zmatsuo 9053
273 zmatsuo 9071 wchar_t *FNFilter = GetCommonDialogFilterW(ts.FileSendFilter, UILanguageFile);
274     FileName[0] = 0;
275     OPENFILENAMEW ofn = {};
276     ofn.lStructSize = get_OPENFILENAME_SIZEW();
277 zmatsuo 9068 ofn.hwndOwner = hWnd;
278 zmatsuo 9053 ofn.lpstrFilter = FNFilter;
279     ofn.nFilterIndex = 1;
280 zmatsuo 9068 ofn.lpstrFile = FileName;
281 zmatsuo 9071 ofn.nMaxFile = _countof(FileName);
282 zmatsuo 9053 ofn.lpstrInitialDir = CurDir;
283    
284 zmatsuo 9067 ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
285     ofn.Flags |= OFN_ENABLETEMPLATE | OFN_ENABLEHOOK | OFN_EXPLORER | OFN_ENABLESIZING;
286 zmatsuo 9071 ofn.lpTemplateName = MAKEINTRESOURCEW(IDD_FOPT);
287 zmatsuo 9053
288 zmatsuo 9068 ofn.lpfnHook = TransFnHook;
289 zmatsuo 9067 optw = (WORD)*Option;
290     ofn.lCustData = (LPARAM)&optw;
291 zmatsuo 9053
292     ofn.Flags |= OFN_SHOWHELP;
293    
294 zmatsuo 9068 ofn.lpstrTitle = caption;
295 zmatsuo 9053
296     ofn.hInstance = hInst;
297    
298 zmatsuo 9071 BOOL Ok = _GetOpenFileNameW(&ofn);
299 zmatsuo 9053 free(FNFilter);
300    
301     if (Ok) {
302     *Option = (long)optw;
303     }
304     /* restore dir */
305     _SetCurrentDirectoryW(TempDir);
306    
307 zmatsuo 9071 wchar_t *ret = NULL;
308 zmatsuo 9068 if (Ok) {
309 zmatsuo 9071 ret = _wcsdup(FileName);
310 zmatsuo 9068 }
311     return ret;
312 zmatsuo 9053 }
313    
314 zmatsuo 9071 BOOL FileSendStart(const wchar_t *filename, int binary)
315 maya 3227 {
316 zmatsuo 9071 if (SendVar != NULL) {
317     return FALSE;
318     }
319     if (! cv.Ready || FSend) {
320     return FALSE;
321     }
322 zmatsuo 9103 if (ProtoGetProtoFlag())
323 maya 3227 {
324     FreeFileVar(&SendVar);
325 zmatsuo 9071 return FALSE;
326 maya 3227 }
327 zmatsuo 9071 if (!NewFileVar(&SendVar)) {
328     return FALSE;
329 maya 3227 }
330    
331     FSend = TRUE;
332 zmatsuo 9068 PFileVar fv = SendVar;
333 maya 3227
334 zmatsuo 9071 wchar_t uimsg[MAX_UIMSG];
335     get_lang_msgW("FILEDLG_TRANS_TITLE_SENDFILE", uimsg, _countof(uimsg), L"Send file", ts.UILanguageFile);
336     aswprintf(&(fv->DlgCaption), L"Tera Term: %s", uimsg);
337 zmatsuo 9068
338 zmatsuo 9071 if (filename != NULL) {
339     SendVar->FullName = _wcsdup(filename);
340     ts.TransBin = binary;
341     }
342     else {
343     // �t�@�C�����w������������������
344 zmatsuo 9067 LONG Option = 0;
345 doda 6946 if (ts.TransBin)
346     Option |= LOGDLG_BINARY;
347 zmatsuo 9071 wchar_t *filename = _GetTransFname(HVTWin, fv->DlgCaption, &Option);
348 zmatsuo 9068 if (filename == NULL) {
349 zmatsuo 9067 FileSendEnd();
350 zmatsuo 9071 return FALSE;
351 maya 3227 }
352 zmatsuo 9068 SendVar->FullName = filename;
353 doda 6946 ts.TransBin = CheckFlag(Option, LOGDLG_BINARY);
354 maya 3227 }
355    
356 zmatsuo 9071 SendVar->FileHandle = _CreateFileW(SendVar->FullName, GENERIC_READ, FILE_SHARE_READ, NULL,
357     OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
358 zmatsuo 9067 if (SendVar->FileHandle == INVALID_HANDLE_VALUE) {
359     FileSendEnd();
360 zmatsuo 9071 return FALSE;
361 maya 3227 }
362     SendVar->ByteCount = 0;
363 zmatsuo 9071 SendVar->FileSize = (LONG)GetFSize64H(SendVar->FileHandle);
364 maya 3227
365     TalkStatus = IdTalkFile;
366     FileRetrySend = FALSE;
367     FileRetryEcho = FALSE;
368     FileCRSend = FALSE;
369 doda 3904 FileReadEOF = FALSE;
370 maya 6071 FileSendHandler.pos = 0;
371     FileSendHandler.end = 0;
372     FileDlgRefresh = 0;
373 maya 3227
374 doda 3904 if (BracketedPasteMode()) {
375     FileBracketMode = FS_BRACKET_START;
376     FileBracketPtr = 0;
377     BinaryMode = TRUE;
378     }
379     else {
380     FileBracketMode = FS_BRACKET_NONE;
381     BinaryMode = ts.TransBin;
382     }
383    
384 zmatsuo 9071 if (! OpenFTDlg(SendVar)) {
385 zmatsuo 9067 FileSendEnd();
386 zmatsuo 8949 return FALSE;
387     }
388    
389     return TRUE;
390     }
391    
392 zmatsuo 9067 void FileSendEnd(void)
393 maya 3227 {
394 zmatsuo 9067 if (FSend) {
395 maya 3227 FSend = FALSE;
396     TalkStatus = IdTalkKeyb;
397     if (SendDlg!=NULL)
398     {
399     SendDlg->DestroyWindow();
400     SendDlg = NULL;
401     }
402     FreeFileVar(&SendVar);
403     }
404    
405     EndDdeCmnd(0);
406     }
407    
408 zmatsuo 9069 void FileSendPause(BOOL Pause)
409 zmatsuo 8857 {
410 zmatsuo 9069 PFileVar fv = SendVar;
411 zmatsuo 8857 if (Pause) {
412 zmatsuo 9069 fv->FilePause = TRUE;
413 zmatsuo 8857 }
414     else {
415 zmatsuo 9069 fv->FilePause = FALSE;
416 zmatsuo 8857 }
417     }
418    
419 zmatsuo 9067 static int FSOut1(BYTE b)
420 maya 3227 {
421 doda 3904 if (BinaryMode)
422 maya 3227 return CommBinaryOut(&cv,(PCHAR)&b,1);
423     else if ((b>=0x20) || (b==0x09) || (b==0x0A) || (b==0x0D))
424     return CommTextOut(&cv,(PCHAR)&b,1);
425     else
426     return 1;
427 doda 3861 }
428 maya 3227
429 zmatsuo 9067 static int FSEcho1(BYTE b)
430 maya 3227 {
431 doda 3904 if (BinaryMode)
432 maya 3227 return CommBinaryEcho(&cv,(PCHAR)&b,1);
433     else
434     return CommTextEcho(&cv,(PCHAR)&b,1);
435     }
436    
437 maya 6071 // �������������������������g��
438     // - BinaryMode == true
439     // - FileBracketMode == false
440     // - cv.TelFlag == false
441     // - ts.LocalEcho == 0
442 zmatsuo 8894 static void FileSendBinayBoost(void)
443 maya 6071 {
444     WORD c, fc;
445     LONG BCOld;
446     DWORD read_bytes;
447 zmatsuo 9069 PFileVar fv = SendVar;
448 maya 6071
449 zmatsuo 9069 if ((SendDlg == NULL) || (fv->FilePause == TRUE))
450 maya 6071 return;
451    
452     BCOld = SendVar->ByteCount;
453    
454     if (FileRetrySend)
455     {
456     c = CommRawOut(&cv, &(FileSendHandler.buf[FileSendHandler.pos]),
457     FileSendHandler.end - FileSendHandler.pos);
458     FileSendHandler.pos += c;
459     FileRetrySend = (FileSendHandler.end != FileSendHandler.pos);
460     if (FileRetrySend)
461     return;
462     }
463    
464     do {
465     if (FileSendHandler.pos == FileSendHandler.end) {
466 zmatsuo 7930 ReadFile(SendVar->FileHandle, &(FileSendHandler.buf[0]), sizeof(FileSendHandler.buf), &read_bytes, NULL);
467 maya 6071 fc = LOWORD(read_bytes);
468     FileSendHandler.pos = 0;
469     FileSendHandler.end = fc;
470     } else {
471     fc = FileSendHandler.end - FileSendHandler.end;
472     }
473    
474     if (fc != 0)
475     {
476     c = CommRawOut(&cv, &(FileSendHandler.buf[FileSendHandler.pos]),
477     FileSendHandler.end - FileSendHandler.pos);
478     FileSendHandler.pos += c;
479     FileRetrySend = (FileSendHandler.end != FileSendHandler.pos);
480     SendVar->ByteCount = SendVar->ByteCount + c;
481     if (FileRetrySend)
482     {
483 zmatsuo 9056 if (SendVar->ByteCount != BCOld) {
484     SendDlg->RefreshNum(SendVar->StartTime, SendVar->FileSize, SendVar->ByteCount);
485     }
486 maya 6071 return;
487     }
488     }
489     FileDlgRefresh = SendVar->ByteCount;
490 zmatsuo 9056 SendDlg->RefreshNum(SendVar->StartTime, SendVar->FileSize, SendVar->ByteCount);
491 maya 6071 BCOld = SendVar->ByteCount;
492     if (fc != 0)
493     return;
494     } while (fc != 0);
495    
496 zmatsuo 9067 FileSendEnd();
497 maya 6071 }
498    
499 zmatsuo 8858 void FileSend(void)
500 maya 3227 {
501     WORD c, fc;
502     LONG BCOld;
503 maya 5281 DWORD read_bytes;
504 zmatsuo 9069 PFileVar fv = SendVar;
505 maya 3227
506 maya 6115 if (cv.PortType == IdSerial && ts.FileSendHighSpeedMode &&
507 maya 6110 BinaryMode && !FileBracketMode && !cv.TelFlag &&
508 maya 6079 (ts.LocalEcho == 0) && (ts.Baud >= 115200)) {
509 maya 6071 return FileSendBinayBoost();
510     }
511    
512 zmatsuo 9069 if ((SendDlg == NULL) || (fv->FilePause == TRUE))
513 maya 3227 return;
514    
515     BCOld = SendVar->ByteCount;
516    
517     if (FileRetrySend)
518     {
519     FileRetryEcho = (ts.LocalEcho>0);
520     c = FSOut1(FileByte);
521     FileRetrySend = (c==0);
522     if (FileRetrySend)
523     return;
524     }
525    
526     if (FileRetryEcho)
527     {
528     c = FSEcho1(FileByte);
529     FileRetryEcho = (c==0);
530     if (FileRetryEcho)
531     return;
532     }
533    
534     do {
535 doda 3904 if (FileBracketMode == FS_BRACKET_START) {
536     FileByte = BracketStartStr[FileBracketPtr++];
537     fc = 1;
538 maya 3227
539 doda 3904 if (FileBracketPtr >= sizeof(BracketStartStr) - 1) {
540     FileBracketMode = FS_BRACKET_END;
541     FileBracketPtr = 0;
542     BinaryMode = ts.TransBin;
543     }
544     }
545     else if (! FileReadEOF) {
546 zmatsuo 7930 ReadFile(SendVar->FileHandle, &FileByte, 1, &read_bytes, NULL);
547 maya 5281 fc = LOWORD(read_bytes);
548 maya 3227 SendVar->ByteCount = SendVar->ByteCount + fc;
549 doda 3904
550     if (FileCRSend && (fc==1) && (FileByte==0x0A)) {
551 zmatsuo 7930 ReadFile(SendVar->FileHandle, &FileByte, 1, &read_bytes, NULL);
552 maya 5281 fc = LOWORD(read_bytes);
553 doda 3904 SendVar->ByteCount = SendVar->ByteCount + fc;
554     }
555 maya 3227 }
556 doda 3904 else {
557     fc = 0;
558     }
559 maya 3227
560 doda 3904 if (fc == 0 && FileBracketMode == FS_BRACKET_END) {
561     FileReadEOF = TRUE;
562     FileByte = BracketEndStr[FileBracketPtr++];
563     fc = 1;
564     BinaryMode = TRUE;
565    
566     if (FileBracketPtr >= sizeof(BracketEndStr) - 1) {
567     FileBracketMode = FS_BRACKET_NONE;
568     FileBracketPtr = 0;
569     }
570     }
571    
572    
573 maya 3227 if (fc!=0)
574     {
575     c = FSOut1(FileByte);
576     FileCRSend = (ts.TransBin==0) && (FileByte==0x0D);
577     FileRetrySend = (c==0);
578     if (FileRetrySend)
579     {
580 zmatsuo 9056 if (SendVar->ByteCount != BCOld) {
581     SendDlg->RefreshNum(SendVar->StartTime, SendVar->FileSize, SendVar->ByteCount);
582     }
583 maya 3227 return;
584     }
585     if (ts.LocalEcho>0)
586     {
587     c = FSEcho1(FileByte);
588     FileRetryEcho = (c==0);
589     if (FileRetryEcho)
590     return;
591     }
592     }
593 doda 3904 if ((fc==0) || ((SendVar->ByteCount % 100 == 0) && (FileBracketPtr == 0))) {
594 zmatsuo 9056 SendDlg->RefreshNum(SendVar->StartTime, SendVar->FileSize, SendVar->ByteCount);
595 maya 3227 BCOld = SendVar->ByteCount;
596     if (fc!=0)
597     return;
598     }
599     } while (fc!=0);
600    
601 zmatsuo 9067 FileSendEnd();
602 maya 3227 }
603    
604 zmatsuo 8948 BOOL IsSendVarNULL()
605     {
606     return SendVar == NULL;
607     }

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