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 9310 - (hide annotations) (download) (as text)
Fri Jun 18 16:05:01 2021 UTC (2 years, 9 months ago) by zmatsuo
File MIME type: text/x-c++src
File size: 11732 byte(s)
Textファイル送信時,ANSIでファイルを読み込み、Unicodeで送信

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

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