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 9324 - (hide annotations) (download) (as text)
Tue Jun 29 15:20:20 2021 UTC (2 years, 9 months ago) by zmatsuo
File MIME type: text/x-c++src
File size: 11699 byte(s)
layer for unicode 向けのコードを削除
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 zmatsuo 8852 #include <windows.h>
33 zmatsuo 7526
34 maya 3227 #include "teraterm.h"
35     #include "tttypes.h"
36     #include "ftdlg.h"
37     #include "ttwinman.h"
38     #include "commlib.h"
39     #include "ttcommon.h"
40     #include "ttdde.h"
41 doda 3904 #include "vtterm.h"
42 zmatsuo 9071 #include "asprintf.h"
43 zmatsuo 9310 #include "codeconv.h"
44 yutakapon 5392
45 zmatsuo 8866 #include "filesys.h"
46    
47 zmatsuo 9146 typedef enum {
48     FS_BRACKET_NONE,
49     FS_BRACKET_START,
50     FS_BRACKET_END,
51     } FileBracketMode_t;
52 doda 3904
53 maya 6071 #define FILE_SEND_BUF_SIZE 8192
54     struct FileSendHandler {
55     CHAR buf[FILE_SEND_BUF_SIZE];
56     int pos;
57     int end;
58     };
59    
60 zmatsuo 9310 typedef struct {
61     wchar_t *FullName;
62 doda 3904
63 zmatsuo 9310 HANDLE FileHandle;
64     LONG FileSize; // uint64_t FileSize; TODO
65     LONG ByteCount; // uint64_t ByteCount;
66    
67     DWORD StartTime;
68     BOOL FilePause;
69    
70     BOOL FileRetrySend, FileRetryEcho, FileCRSend, FileReadEOF, BinaryMode;
71    
72     FileBracketMode_t FileBracketMode;
73     int FileBracketPtr;
74    
75     PFileTransDlg SendDlg;
76     int FileDlgRefresh; // ?
77    
78     wchar_t SendChar;
79    
80     struct FileSendHandler FileSendHandler;
81     } TFileVar;
82     typedef TFileVar *PFileVar;
83    
84     static PFileVar SendVar = NULL;
85 zmatsuo 9105 static BOOL FSend = FALSE;
86 maya 3227
87 zmatsuo 9310 static const char BracketStartStr[] = "\033[200~";
88     static const char BracketEndStr[] = "\033[201~";
89 maya 3227
90 zmatsuo 7526 static BOOL OpenFTDlg(PFileVar fv)
91 maya 3227 {
92     PFileTransDlg FTDlg;
93    
94     FTDlg = new CFileTransDlg();
95 zmatsuo 9146 if (FTDlg == NULL) {
96     return FALSE;
97     }
98 maya 3227
99 zmatsuo 9146 wchar_t *DlgCaption;
100     wchar_t *uimsg = TTGetLangStrW("Tera Term", "FILEDLG_TRANS_TITLE_SENDFILE", L"Send file", ts.UILanguageFile);
101     aswprintf(&DlgCaption, L"Tera Term: %s", uimsg);
102     free(uimsg);
103 doda 4454
104 zmatsuo 9146 CFileTransDlg::Info info;
105     info.UILanguageFile = ts.UILanguageFile;
106     info.OpId = CFileTransDlg::OpSendFile;
107     info.DlgCaption = DlgCaption;
108     info.FileName = NULL;
109     info.FullName = fv->FullName;
110     info.HideDialog = FALSE;
111     info.HMainWin = HVTWin;
112 maya 3227
113 zmatsuo 9146 FTDlg->Create(hInst, &info);
114     FTDlg->RefreshNum(0, fv->FileSize, fv->ByteCount);
115 maya 3227
116 zmatsuo 9146 free(DlgCaption);
117    
118     fv->FilePause = FALSE;
119 doda 6947 fv->StartTime = GetTickCount();
120 zmatsuo 9310 fv->SendDlg = FTDlg; /* File send */
121 maya 3227
122 zmatsuo 9146 return TRUE;
123 maya 3227 }
124    
125 zmatsuo 9067 #if 0
126 zmatsuo 8857 static void ShowFTDlg(WORD OpId)
127 maya 3227 {
128 zmatsuo 9310 if (fv->SendDlg != NULL) {
129     fv->SendDlg->ShowWindow(SW_SHOWNORMAL);
130     SetForegroundWindow(fv->SendDlg->GetSafeHwnd());
131 maya 3227 }
132     }
133 zmatsuo 9067 #endif
134 maya 3227
135 zmatsuo 9068 static BOOL NewFileVar(PFileVar *pfv)
136 maya 3227 {
137 zmatsuo 9068 if ((*pfv) != NULL) {
138     return TRUE;
139 maya 3227 }
140    
141 zmatsuo 9068 PFileVar fv = (PFileVar)malloc(sizeof(TFileVar));
142     if (fv == NULL) {
143     return FALSE;
144     }
145     memset(fv, 0, sizeof(TFileVar));
146     fv->FileHandle = INVALID_HANDLE_VALUE;
147    
148     *pfv = fv;
149     return TRUE;
150 maya 3227 }
151    
152 zmatsuo 9068 static void FreeFileVar(PFileVar *pfv)
153 maya 3227 {
154 zmatsuo 9068 if ((*pfv)==NULL) {
155     return;
156 maya 3227 }
157 zmatsuo 9068
158     PFileVar fv = *pfv;
159     if (fv->FileHandle != INVALID_HANDLE_VALUE) {
160     CloseHandle(fv->FileHandle);
161 zmatsuo 9071 fv->FileHandle = INVALID_HANDLE_VALUE;
162 zmatsuo 9068 }
163     if (fv->FullName != NULL) {
164     free(fv->FullName);
165 zmatsuo 9071 fv->FullName = NULL;
166 zmatsuo 9068 }
167     free(fv);
168     *pfv = NULL;
169 maya 3227 }
170    
171 zmatsuo 9146 /**
172     * �t�@�C�����M
173     */
174 zmatsuo 9071 BOOL FileSendStart(const wchar_t *filename, int binary)
175 maya 3227 {
176 zmatsuo 9071 if (SendVar != NULL) {
177     return FALSE;
178     }
179     if (! cv.Ready || FSend) {
180     return FALSE;
181     }
182 zmatsuo 9146 if (filename == NULL) {
183     return FALSE;
184     }
185 zmatsuo 9103 if (ProtoGetProtoFlag())
186 maya 3227 {
187     FreeFileVar(&SendVar);
188 zmatsuo 9071 return FALSE;
189 maya 3227 }
190 zmatsuo 9071 if (!NewFileVar(&SendVar)) {
191     return FALSE;
192 maya 3227 }
193    
194     FSend = TRUE;
195 zmatsuo 9068 PFileVar fv = SendVar;
196 maya 3227
197 zmatsuo 9146 SendVar->FullName = _wcsdup(filename);
198     ts.TransBin = binary;
199 zmatsuo 9068
200 zmatsuo 9324 SendVar->FileHandle = CreateFileW(SendVar->FullName, GENERIC_READ, FILE_SHARE_READ, NULL,
201 zmatsuo 9071 OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
202 zmatsuo 9067 if (SendVar->FileHandle == INVALID_HANDLE_VALUE) {
203     FileSendEnd();
204 zmatsuo 9071 return FALSE;
205 maya 3227 }
206     SendVar->ByteCount = 0;
207 zmatsuo 9310 SendVar->FileSize = GetFSize64H(SendVar->FileHandle);
208 maya 3227
209     TalkStatus = IdTalkFile;
210 zmatsuo 9310 fv->FileRetrySend = FALSE;
211     fv->FileRetryEcho = FALSE;
212     fv->FileCRSend = FALSE;
213     fv->FileReadEOF = FALSE;
214     fv->FileSendHandler.pos = 0;
215     fv->FileSendHandler.end = 0;
216     fv->FileDlgRefresh = 0;
217 maya 3227
218 doda 3904 if (BracketedPasteMode()) {
219 zmatsuo 9310 fv->FileBracketMode = FS_BRACKET_START;
220     fv->FileBracketPtr = 0;
221     fv->BinaryMode = TRUE;
222 doda 3904 }
223     else {
224 zmatsuo 9310 fv->FileBracketMode = FS_BRACKET_NONE;
225     fv->BinaryMode = ts.TransBin;
226 doda 3904 }
227    
228 zmatsuo 9071 if (! OpenFTDlg(SendVar)) {
229 zmatsuo 9067 FileSendEnd();
230 zmatsuo 8949 return FALSE;
231     }
232    
233     return TRUE;
234     }
235    
236 zmatsuo 9067 void FileSendEnd(void)
237 maya 3227 {
238 zmatsuo 9067 if (FSend) {
239 zmatsuo 9310 PFileVar fv = SendVar;
240 maya 3227 FSend = FALSE;
241     TalkStatus = IdTalkKeyb;
242 zmatsuo 9310 if (fv->SendDlg!=NULL)
243 maya 3227 {
244 zmatsuo 9310 fv->SendDlg->DestroyWindow();
245     fv->SendDlg = NULL;
246 maya 3227 }
247     FreeFileVar(&SendVar);
248     }
249    
250     EndDdeCmnd(0);
251     }
252    
253 zmatsuo 9069 void FileSendPause(BOOL Pause)
254 zmatsuo 8857 {
255 zmatsuo 9069 PFileVar fv = SendVar;
256 zmatsuo 8857 if (Pause) {
257 zmatsuo 9069 fv->FilePause = TRUE;
258 zmatsuo 8857 }
259     else {
260 zmatsuo 9069 fv->FilePause = FALSE;
261 zmatsuo 8857 }
262     }
263    
264 zmatsuo 9310 static int FSOut1(PFileVar fv)
265 maya 3227 {
266 zmatsuo 9310 if (fv->BinaryMode) {
267     BYTE b = (BYTE)fv->SendChar;
268     return CommBinaryOut(&cv, (PCHAR)&b, 1);
269     }
270     else {
271     wchar_t wc = fv->SendChar;
272     if ((wc >= 0x20) || (wc == 0x09) || (wc == 0x0A) || (wc == 0x0D)) {
273     return CommTextOutW(&cv, &wc, 1);
274     }
275     else {
276     return 1;
277     }
278     }
279 doda 3861 }
280 maya 3227
281 zmatsuo 9310 static int FSEcho1(PFileVar fv)
282 maya 3227 {
283 zmatsuo 9310 if (fv->BinaryMode) {
284     BYTE b = (BYTE)fv->SendChar;
285 maya 3227 return CommBinaryEcho(&cv,(PCHAR)&b,1);
286 zmatsuo 9310 } else {
287     return CommTextEchoW(&cv, &fv->SendChar, 1);
288     }
289 maya 3227 }
290    
291 maya 6071 // �������������������������g��
292     // - BinaryMode == true
293 zmatsuo 9146 // - FileBracketMode == FS_BRACKET_NONE
294 maya 6071 // - cv.TelFlag == false
295     // - ts.LocalEcho == 0
296 zmatsuo 8894 static void FileSendBinayBoost(void)
297 maya 6071 {
298     WORD c, fc;
299     LONG BCOld;
300     DWORD read_bytes;
301 zmatsuo 9069 PFileVar fv = SendVar;
302 maya 6071
303 zmatsuo 9310 if ((fv->SendDlg == NULL) || (fv->FilePause == TRUE))
304 maya 6071 return;
305    
306     BCOld = SendVar->ByteCount;
307    
308 zmatsuo 9310 if (fv->FileRetrySend)
309 maya 6071 {
310 zmatsuo 9310 c = CommRawOut(&cv, &(fv->FileSendHandler.buf[fv->FileSendHandler.pos]),
311     fv->FileSendHandler.end - fv->FileSendHandler.pos);
312     fv->FileSendHandler.pos += c;
313     fv->FileRetrySend = (fv->FileSendHandler.end != fv->FileSendHandler.pos);
314     if (fv->FileRetrySend)
315 maya 6071 return;
316     }
317    
318     do {
319 zmatsuo 9310 if (fv->FileSendHandler.pos == fv->FileSendHandler.end) {
320     ReadFile(SendVar->FileHandle, &(fv->FileSendHandler.buf[0]), sizeof(fv->FileSendHandler.buf), &read_bytes, NULL);
321 maya 6071 fc = LOWORD(read_bytes);
322 zmatsuo 9310 fv->FileSendHandler.pos = 0;
323     fv->FileSendHandler.end = fc;
324 maya 6071 } else {
325 zmatsuo 9310 fc = fv->FileSendHandler.end - fv->FileSendHandler.end;
326 maya 6071 }
327    
328     if (fc != 0)
329     {
330 zmatsuo 9310 c = CommRawOut(&cv, &(fv->FileSendHandler.buf[fv->FileSendHandler.pos]),
331     fv->FileSendHandler.end - fv->FileSendHandler.pos);
332     fv->FileSendHandler.pos += c;
333     fv->FileRetrySend = (fv->FileSendHandler.end != fv->FileSendHandler.pos);
334 maya 6071 SendVar->ByteCount = SendVar->ByteCount + c;
335 zmatsuo 9310 if (fv->FileRetrySend)
336 maya 6071 {
337 zmatsuo 9056 if (SendVar->ByteCount != BCOld) {
338 zmatsuo 9310 fv->SendDlg->RefreshNum(SendVar->StartTime, SendVar->FileSize, SendVar->ByteCount);
339 zmatsuo 9056 }
340 maya 6071 return;
341     }
342     }
343 zmatsuo 9310 fv->FileDlgRefresh = SendVar->ByteCount;
344     fv->SendDlg->RefreshNum(SendVar->StartTime, SendVar->FileSize, SendVar->ByteCount);
345 maya 6071 BCOld = SendVar->ByteCount;
346     if (fc != 0)
347     return;
348     } while (fc != 0);
349    
350 zmatsuo 9067 FileSendEnd();
351 maya 6071 }
352    
353 zmatsuo 8858 void FileSend(void)
354 maya 3227 {
355     WORD c, fc;
356     LONG BCOld;
357 zmatsuo 9069 PFileVar fv = SendVar;
358 maya 3227
359 maya 6115 if (cv.PortType == IdSerial && ts.FileSendHighSpeedMode &&
360 zmatsuo 9310 fv->BinaryMode && fv->FileBracketMode == FS_BRACKET_NONE && !cv.TelFlag &&
361 maya 6079 (ts.LocalEcho == 0) && (ts.Baud >= 115200)) {
362 maya 6071 return FileSendBinayBoost();
363     }
364    
365 zmatsuo 9310 if ((fv->SendDlg == NULL) || (fv->FilePause == TRUE))
366 maya 3227 return;
367    
368     BCOld = SendVar->ByteCount;
369    
370 zmatsuo 9310 if (fv->FileRetrySend)
371 maya 3227 {
372 zmatsuo 9310 fv->FileRetryEcho = (ts.LocalEcho>0);
373     c = FSOut1(fv);
374     fv->FileRetrySend = (c==0);
375     if (fv->FileRetrySend)
376 maya 3227 return;
377     }
378    
379 zmatsuo 9310 if (fv->FileRetryEcho)
380 maya 3227 {
381 zmatsuo 9310 c = FSEcho1(fv);
382     fv->FileRetryEcho = (c==0);
383     if (fv->FileRetryEcho)
384 maya 3227 return;
385     }
386    
387     do {
388 zmatsuo 9310 if (fv->FileBracketMode == FS_BRACKET_START) {
389     fv->SendChar = BracketStartStr[fv->FileBracketPtr++];
390 doda 3904 fc = 1;
391 maya 3227
392 zmatsuo 9310 if (fv->FileBracketPtr >= sizeof(BracketStartStr) - 1) {
393     fv->FileBracketMode = FS_BRACKET_END;
394     fv->FileBracketPtr = 0;
395     fv->BinaryMode = ts.TransBin;
396 doda 3904 }
397     }
398 zmatsuo 9310 else if (!fv->FileReadEOF) {
399 zmatsuo 9146 DWORD read_bytes;
400 zmatsuo 9310 BYTE FileByte;
401 zmatsuo 7930 ReadFile(SendVar->FileHandle, &FileByte, 1, &read_bytes, NULL);
402 maya 5281 fc = LOWORD(read_bytes);
403 maya 3227 SendVar->ByteCount = SendVar->ByteCount + fc;
404 doda 3904
405 zmatsuo 9310 if (FileByte==0x0A && fc == 1 && fv->FileCRSend) {
406     // CR ������������ 0x0A ������ -> �t�@�C������1�o�C�g����
407 zmatsuo 7930 ReadFile(SendVar->FileHandle, &FileByte, 1, &read_bytes, NULL);
408 maya 5281 fc = LOWORD(read_bytes);
409 doda 3904 SendVar->ByteCount = SendVar->ByteCount + fc;
410     }
411 zmatsuo 9310
412     if (IsDBCSLeadByte(FileByte)) {
413     // DBCS��1byte�������� -> �t�@�C������1�o�C�g������ Unicode ������
414     char dbcs[2];
415     dbcs[0] = FileByte;
416    
417     ReadFile(SendVar->FileHandle, &dbcs[1], 1, &read_bytes ,NULL);
418     fc = LOWORD(read_bytes);
419     SendVar->ByteCount = SendVar->ByteCount + fc;
420    
421     unsigned int u32;
422     MBCPToUTF32(dbcs, 2, CP_ACP, &u32);
423     fv->SendChar = u32;
424     } else {
425     fv->SendChar = FileByte;
426     }
427 maya 3227 }
428 doda 3904 else {
429     fc = 0;
430     }
431 maya 3227
432 zmatsuo 9310 if (fc == 0 && fv->FileBracketMode == FS_BRACKET_END) {
433     fv->FileReadEOF = TRUE;
434     fv->SendChar = BracketEndStr[fv->FileBracketPtr++];
435 doda 3904 fc = 1;
436 zmatsuo 9310 fv->BinaryMode = TRUE;
437 doda 3904
438 zmatsuo 9310 if (fv->FileBracketPtr >= sizeof(BracketEndStr) - 1) {
439     fv->FileBracketMode = FS_BRACKET_NONE;
440     fv->FileBracketPtr = 0;
441 doda 3904 }
442     }
443    
444    
445 maya 3227 if (fc!=0)
446     {
447 zmatsuo 9310 c = FSOut1(fv);
448     fv->FileCRSend = (ts.TransBin == 0) && (fv->SendChar == 0x0D);
449     fv->FileRetrySend = (c == 0);
450     if (fv->FileRetrySend)
451 maya 3227 {
452 zmatsuo 9056 if (SendVar->ByteCount != BCOld) {
453 zmatsuo 9310 fv->SendDlg->RefreshNum(SendVar->StartTime, SendVar->FileSize, SendVar->ByteCount);
454 zmatsuo 9056 }
455 maya 3227 return;
456     }
457     if (ts.LocalEcho>0)
458     {
459 zmatsuo 9310 c = FSEcho1(fv);
460     fv->FileRetryEcho = (c==0);
461     if (fv->FileRetryEcho)
462 maya 3227 return;
463     }
464     }
465 zmatsuo 9310 if ((fc==0) || ((SendVar->ByteCount % 100 == 0) && (fv->FileBracketPtr == 0))) {
466     fv->SendDlg->RefreshNum(SendVar->StartTime, SendVar->FileSize, SendVar->ByteCount);
467 maya 3227 BCOld = SendVar->ByteCount;
468     if (fc!=0)
469     return;
470     }
471     } while (fc!=0);
472    
473 zmatsuo 9067 FileSendEnd();
474 maya 3227 }
475    
476 zmatsuo 8948 BOOL IsSendVarNULL()
477     {
478     return SendVar == NULL;
479     }
480 zmatsuo 9105
481     /**
482     * TODO: IsSendVarNULL() ����������?
483     */
484     BOOL FileSnedIsSending(void)
485     {
486     return FSend;
487     }

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