Develop and Download Open Source Software

Browse CVS Repository

Annotation of /ttssh2/teraterm/source/teraterm/filesys.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.9 - (hide annotations) (download) (as text)
Sun Jan 21 16:18:35 2007 UTC (17 years, 2 months ago) by maya
Branch: MAIN
CVS Tags: R452_RTM, R450_RTM, R451_RTM
Changes since 1.8: +3 -65 lines
File MIME type: text/x-c++src
表示メッセージの読み込み対応

1 yutakakn 1.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     #ifdef TERATERM32
11     #include "tt_res.h"
12     #else
13     #include "tt_res16.h"
14     #endif
15     #include "ftdlg.h"
16     #include "protodlg.h"
17     #include "ttwinman.h"
18     #include "commlib.h"
19     #include "ttcommon.h"
20     #include "ttdde.h"
21     #include "ttlib.h"
22     #include "helpid.h"
23    
24     #include "filesys.h"
25    
26     PFileVar LogVar = NULL;
27     PFileVar SendVar = NULL;
28     PFileVar FileVar = NULL;
29     static PCHAR ProtoVar = NULL;
30     static int ProtoId;
31    
32     static BYTE LogLast = 0;
33     BOOL FileLog = FALSE;
34     BOOL BinLog = FALSE;
35     BOOL DDELog = FALSE;
36     static BOOL FileRetrySend, FileRetryEcho, FileCRSend;
37     static BYTE FileByte;
38    
39     static BOOL FSend = FALSE;
40    
41     static HMODULE HTTFILE = NULL;
42     static int TTFILECount = 0;
43    
44     PGetSetupFname GetSetupFname;
45     PGetTransFname GetTransFname;
46     PGetMultiFname GetMultiFname;
47     PGetGetFname GetGetFname;
48     PSetFileVar SetFileVar;
49     PGetXFname GetXFname;
50     PProtoInit ProtoInit;
51     PProtoParse ProtoParse;
52     PProtoTimeOutProc ProtoTimeOutProc;
53     PProtoCancel ProtoCancel;
54    
55     #define IdGetSetupFname 1
56     #define IdGetTransFname 2
57     #define IdGetMultiFname 3
58     #define IdGetGetFname 4
59     #define IdSetFileVar 5
60     #define IdGetXFname 6
61    
62     #define IdProtoInit 7
63     #define IdProtoParse 8
64     #define IdProtoTimeOutProc 9
65     #define IdProtoCancel 10
66    
67     BOOL LoadTTFILE()
68     {
69     BOOL Err;
70    
71     #ifdef TERATERM32
72     if (HTTFILE != NULL)
73     #else
74     if (HTTFILE >= HINSTANCE_ERROR)
75     #endif
76     {
77     TTFILECount++;
78     return TRUE;
79     }
80     else
81     TTFILECount = 0;
82    
83     #ifdef TERATERM32
84     HTTFILE = LoadLibrary("TTPFILE.DLL");
85     if (HTTFILE == NULL) return FALSE;
86     #else
87     HTTFILE = LoadLibrary("TTFILE.DLL");
88     if (HTTFILE < HINSTANCE_ERROR) return FALSE;
89     #endif
90    
91     Err = FALSE;
92     GetSetupFname = (PGetSetupFname)GetProcAddress(HTTFILE,
93     MAKEINTRESOURCE(IdGetSetupFname));
94     if (GetSetupFname==NULL) Err = TRUE;
95    
96     GetTransFname = (PGetTransFname)GetProcAddress(HTTFILE,
97     MAKEINTRESOURCE(IdGetTransFname));
98     if (GetTransFname==NULL) Err = TRUE;
99    
100     GetMultiFname = (PGetMultiFname)GetProcAddress(HTTFILE,
101     MAKEINTRESOURCE(IdGetMultiFname));
102     if (GetMultiFname==NULL) Err = TRUE;
103    
104     GetGetFname = (PGetGetFname)GetProcAddress(HTTFILE,
105     MAKEINTRESOURCE(IdGetGetFname));
106     if (GetGetFname==NULL) Err = TRUE;
107    
108     SetFileVar = (PSetFileVar)GetProcAddress(HTTFILE,
109     MAKEINTRESOURCE(IdSetFileVar));
110     if (SetFileVar==NULL) Err = TRUE;
111    
112     GetXFname = (PGetXFname)GetProcAddress(HTTFILE,
113     MAKEINTRESOURCE(IdGetXFname));
114     if (GetXFname==NULL) Err = TRUE;
115    
116     ProtoInit = (PProtoInit)GetProcAddress(HTTFILE,
117     MAKEINTRESOURCE(IdProtoInit));
118     if (ProtoInit==NULL) Err = TRUE;
119    
120     ProtoParse = (PProtoParse)GetProcAddress(HTTFILE,
121     MAKEINTRESOURCE(IdProtoParse));
122     if (ProtoParse==NULL) Err = TRUE;
123    
124     ProtoTimeOutProc = (PProtoTimeOutProc)GetProcAddress(HTTFILE,
125     MAKEINTRESOURCE(IdProtoTimeOutProc));
126     if (ProtoTimeOutProc==NULL) Err = TRUE;
127    
128     ProtoCancel = (PProtoCancel)GetProcAddress(HTTFILE,
129     MAKEINTRESOURCE(IdProtoCancel));
130     if (ProtoCancel==NULL) Err = TRUE;
131    
132     if (Err)
133     {
134     FreeLibrary(HTTFILE);
135     HTTFILE = NULL;
136     return FALSE;
137     }
138     else {
139     TTFILECount = 1;
140     return TRUE;
141     }
142     }
143    
144     BOOL FreeTTFILE()
145     {
146     if (TTFILECount==0) return FALSE;
147     TTFILECount--;
148     if (TTFILECount>0) return TRUE;
149     #ifdef TERATERM32
150     if (HTTFILE!=NULL)
151     #else
152     if (HTTFILE>=HINSTANCE_ERROR)
153     #endif
154     {
155     FreeLibrary(HTTFILE);
156     HTTFILE = NULL;
157     }
158     return TRUE;
159     }
160    
161     static PFileTransDlg FLogDlg = NULL;
162     static PFileTransDlg SendDlg = NULL;
163     static PProtoDlg PtDlg = NULL;
164    
165     BOOL OpenFTDlg(PFileVar fv)
166     {
167     PFileTransDlg FTDlg;
168 maya 1.8 #ifdef I18N
169     HWND HFTDlg;
170     #endif
171 yutakakn 1.1
172     FTDlg = new CFileTransDlg();
173    
174     if (FTDlg!=NULL)
175     {
176 maya 1.8 #ifdef I18N
177     FTDlg->Create(fv, &cv, &ts);
178     #else
179 yutakakn 1.1 FTDlg->Create(fv, &cv);
180 maya 1.8 #endif
181 yutakakn 1.1 FTDlg->RefreshNum();
182     if (fv->OpId == OpLog)
183     FTDlg->ShowWindow(SW_MINIMIZE);
184     }
185    
186     if (fv->OpId==OpLog)
187     FLogDlg = FTDlg; /* Log */
188     else
189     SendDlg = FTDlg; /* File send */
190    
191 maya 1.8 #ifdef I18N
192     HFTDlg=FTDlg->GetSafeHwnd();
193    
194     GetDlgItemText(HFTDlg, IDC_TRANS_FILENAME, ts.UIMsg, sizeof(ts.UIMsg));
195     get_lang_msg("DLG_FILETRANS_FILENAME", ts.UIMsg, ts.UILanguageFile);
196     SetDlgItemText(HFTDlg, IDC_TRANS_FILENAME, ts.UIMsg);
197     GetDlgItemText(HFTDlg, IDC_FULLPATH_LABEL, ts.UIMsg, sizeof(ts.UIMsg));
198     get_lang_msg("DLG_FILETRANS_FULLPATH", ts.UIMsg, ts.UILanguageFile);
199     SetDlgItemText(HFTDlg, IDC_FULLPATH_LABEL, ts.UIMsg);
200     GetDlgItemText(HFTDlg, IDC_TRANS_TRANS, ts.UIMsg, sizeof(ts.UIMsg));
201     get_lang_msg("DLG_FILETRANS_TRNAS", ts.UIMsg, ts.UILanguageFile);
202     SetDlgItemText(HFTDlg, IDC_TRANS_TRANS, ts.UIMsg);
203     GetDlgItemText(HFTDlg, IDCANCEL, ts.UIMsg, sizeof(ts.UIMsg));
204     get_lang_msg("BTN_CANCEL", ts.UIMsg, ts.UILanguageFile);
205     SetDlgItemText(HFTDlg, IDCANCEL, ts.UIMsg);
206     GetDlgItemText(HFTDlg, IDC_TRANSPAUSESTART, ts.UIMsg, sizeof(ts.UIMsg));
207     get_lang_msg("DLG_FILETRANS_PAUSE", ts.UIMsg, ts.UILanguageFile);
208     SetDlgItemText(HFTDlg, IDC_TRANSPAUSESTART, ts.UIMsg);
209     GetDlgItemText(HFTDlg, IDC_TRANSHELP, ts.UIMsg, sizeof(ts.UIMsg));
210     get_lang_msg("BTN_HELP", ts.UIMsg, ts.UILanguageFile);
211     SetDlgItemText(HFTDlg, IDC_TRANSHELP, ts.UIMsg);
212     #endif
213    
214 yutakakn 1.1 return (FTDlg!=NULL);
215     }
216    
217     BOOL NewFileVar(PFileVar *fv)
218     {
219     if ((*fv)==NULL)
220     {
221     *fv = (PFileVar)malloc(sizeof(TFileVar));
222     if ((*fv)!=NULL)
223     {
224     memset(*fv, 0, sizeof(TFileVar));
225     strcpy((*fv)->FullName,ts.FileDir);
226     AppendSlash((*fv)->FullName);
227     (*fv)->DirLen = strlen((*fv)->FullName);
228     (*fv)->FileOpen = FALSE;
229     (*fv)->OverWrite = ((ts.FTFlag & FT_RENAME) == 0);
230     (*fv)->HMainWin = HVTWin;
231     (*fv)->Success = FALSE;
232     (*fv)->NoMsg = FALSE;
233     }
234     }
235    
236     return ((*fv)!=NULL);
237     }
238    
239     void FreeFileVar(PFileVar *fv)
240     {
241     if ((*fv)!=NULL)
242     {
243     if ((*fv)->FileOpen) _lclose((*fv)->FileHandle);
244     if ((*fv)->FnStrMemHandle>0)
245     {
246     GlobalUnlock((*fv)->FnStrMemHandle);
247     GlobalFree((*fv)->FnStrMemHandle);
248     }
249     free(*fv);
250     *fv = NULL;
251     }
252     }
253    
254     extern "C" {
255     void LogStart()
256     {
257 yutakakn 1.2 LONG Option;
258    
259     if ((FileLog) || (BinLog)) return;
260 yutakakn 1.1
261 yutakakn 1.2 if (! LoadTTFILE()) return;
262     if (! NewFileVar(&LogVar))
263     {
264     FreeTTFILE();
265     return;
266     }
267     LogVar->OpId = OpLog;
268 yutakakn 1.1
269 yutakakn 1.2 if (strlen(&(LogVar->FullName[LogVar->DirLen]))==0)
270     {
271 maya 1.4 // LOWORD
272     // 0x0001 = Binary
273     // HIWORD
274     // 0x0001 = Append
275 yutakakn 1.2 // 0x1000 = plain text (2005.2.20 yutaka)
276 maya 1.4 // 0x2000 = timestamp (2006.7.23 maya)
277 yutakakn 1.3 // teraterm.ini?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スf?スt?スH?ス?ス?スg?スI?スv?スV?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スB(2005.5.7 yutaka)
278 maya 1.4 Option = MAKELONG(ts.TransBin,ts.Append |
279     (0x1000 * ts.LogTypePlainText) |
280     (0x2000 * ts.LogTimestamp));
281 maya 1.6
282     // ?ス?ス?スO?ス?ス?スf?スt?スH?ス?ス?スg?スt?ス@?スC?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス (2006.8.28 maya)
283     strncat(LogVar->FullName, ts.LogDefaultName, sizeof(LogVar->FullName));
284     ParseStrftimeFileName(LogVar->FullName);
285    
286 yutakakn 1.2 if (! (*GetTransFname)(LogVar, ts.FileDir, GTF_LOG, &Option))
287     {
288     FreeFileVar(&LogVar);
289     FreeTTFILE();
290     return;
291     }
292     ts.TransBin = LOWORD(Option);
293     ts.Append = HIWORD(Option);
294    
295     if (ts.Append & 0x1000) {
296     ts.LogTypePlainText = 1;
297     } else {
298     ts.LogTypePlainText = 0;
299     }
300 maya 1.4
301     if (ts.Append & 0x2000) {
302     ts.LogTimestamp = 1;
303     }
304     else {
305     ts.LogTimestamp = 0;
306     }
307    
308 yutakakn 1.2 ts.Append &= 0x1; // 1bit?ス?ス?ス}?スX?スN?ス?ス?ス?ス
309 yutakakn 1.1
310 yutakakn 1.2 }
311     else
312     (*SetFileVar)(LogVar);
313 yutakakn 1.1
314 yutakakn 1.2 if (ts.TransBin > 0)
315     {
316     BinLog = TRUE;
317     FileLog = FALSE;
318     if (! CreateBinBuf())
319     {
320     FileTransEnd(OpLog);
321     return;
322     }
323     }
324     else {
325     BinLog = FALSE;
326     FileLog = TRUE;
327     if (! CreateLogBuf())
328     {
329     FileTransEnd(OpLog);
330     return;
331     }
332     }
333     cv.LStart = cv.LogPtr;
334     cv.LCount = 0;
335 yutakakn 1.1
336 yutakakn 1.2 HelpId = HlpFileLog;
337     if (ts.Append > 0)
338     {
339     LogVar->FileHandle = _lopen(LogVar->FullName,OF_WRITE);
340     if (LogVar->FileHandle>0)
341     _llseek(LogVar->FileHandle,0,2);
342     else
343     LogVar->FileHandle = _lcreat(LogVar->FullName,0);
344     }
345     else
346     LogVar->FileHandle = _lcreat(LogVar->FullName,0);
347     LogVar->FileOpen = (LogVar->FileHandle>0);
348     if (! LogVar->FileOpen)
349     {
350     FileTransEnd(OpLog);
351     return;
352     }
353     LogVar->ByteCount = 0;
354 yutakakn 1.1
355 yutakakn 1.2 if (! OpenFTDlg(LogVar))
356     FileTransEnd(OpLog);
357 yutakakn 1.1 }
358     }
359    
360     void LogPut1(BYTE b)
361     {
362     LogLast = b;
363     cv.LogBuf[cv.LogPtr] = b;
364     cv.LogPtr++;
365     if (cv.LogPtr>=InBuffSize)
366     cv.LogPtr = cv.LogPtr-InBuffSize;
367    
368     if (FileLog)
369     {
370     if (cv.LCount>=InBuffSize)
371     {
372     cv.LCount = InBuffSize;
373     cv.LStart = cv.LogPtr;
374     }
375     else cv.LCount++;
376     }
377     else
378     cv.LCount = 0;
379    
380     if (DDELog)
381     {
382     if (cv.DCount>=InBuffSize)
383     {
384     cv.DCount = InBuffSize;
385     cv.DStart = cv.LogPtr;
386     }
387     else cv.DCount++;
388     }
389 yutakapon 1.7 else {
390 yutakakn 1.1 cv.DCount = 0;
391 yutakapon 1.7 // ?ス?ス?スO?ス?ス?ス?ス?ス?ス?ス?ス?ス}?スN?ス?ス?ス?ス?スX?スg?ス[?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スC?ス?ス?スB
392     // ?ス?ス?スO?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スx?ス}?スN?ス?ス?ス?ス?ス~?ス?ス?ス?ス?ス?ス?スA?スo?スb?スt?ス@?ス?ス?スC?ス?ス?スf?スb?スN?スX?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スA
393     // ?ス?ス?スx?ス}?スN?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スf?ス[?ス^?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スB
394     // ?ス}?スN?ス?ス?ス?ス?ス?ス?ス~?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スC?ス?ス?スf?スb?スN?スX?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スB
395     // (2006.12.26 yutaka)
396     cv.DStart = cv.LogPtr;
397     }
398 yutakakn 1.1 }
399    
400     void Log1Byte(BYTE b)
401     {
402     if (b==0x0d)
403     {
404     LogLast = b;
405     return;
406     }
407     if ((b==0x0a) && (LogLast==0x0d))
408     LogPut1(0x0d);
409     LogPut1(b);
410     }
411    
412     static BOOL Get1(PCHAR Buf, int *Start, int *Count, PBYTE b)
413     {
414     if (*Count<=0) return FALSE;
415     *b = Buf[*Start];
416     (*Start)++;
417     if (*Start>=InBuffSize)
418     *Start = *Start-InBuffSize;
419     (*Count)--;
420     return TRUE;
421     }
422    
423    
424    
425     static CRITICAL_SECTION g_filelog_lock; /* ?ス?ス?スb?スN?スp?ス?ス?ス?ス */
426    
427     void logfile_lock_initialize(void)
428     {
429     InitializeCriticalSection(&g_filelog_lock);
430     }
431    
432     static inline void logfile_lock(void)
433     {
434     EnterCriticalSection(&g_filelog_lock);
435     }
436    
437     static inline void logfile_unlock(void)
438     {
439     LeaveCriticalSection(&g_filelog_lock);
440     }
441    
442     // ?スR?ス?ス?ス?ス?スg?ス?ス?ス?ス?スO?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス
443     void CommentLogToFile(char *buf, int size)
444     {
445     DWORD wrote;
446    
447     if (LogVar == NULL || !LogVar->FileOpen) {
448 maya 1.8 #ifdef I18N
449     char uimsg[MAX_UIMSG];
450     strcpy(uimsg, "ERROR");
451     get_lang_msg("MSG_ERROR", uimsg, ts.UILanguageFile);
452     strcpy(ts.UIMsg, "It is not opened by the log file yet.");
453     get_lang_msg("MSG_COMMENT_LOG_OPEN_ERROR", ts.UIMsg, ts.UILanguageFile);
454     ::MessageBox(NULL, ts.UIMsg, uimsg, MB_OK|MB_ICONEXCLAMATION);
455     #else
456 yutakakn 1.1 ::MessageBox(NULL, "It is not opened by the log file yet.", "ERROR", MB_OK|MB_ICONEXCLAMATION);
457 maya 1.8 #endif
458 yutakakn 1.1 return;
459     }
460    
461     logfile_lock();
462     WriteFile((HANDLE)LogVar->FileHandle, buf, size, &wrote, NULL);
463     WriteFile((HANDLE)LogVar->FileHandle, "\r\n", 2, &wrote, NULL); // ?ス?ス?スs
464     logfile_unlock();
465     }
466    
467     void LogToFile()
468     {
469     PCHAR Buf;
470     int Start, Count;
471     BYTE b;
472    
473     if (! LogVar->FileOpen) return;
474     if (FileLog)
475     {
476     Buf = cv.LogBuf;
477     Start = cv.LStart;
478     Count = cv.LCount;
479     }
480     else if (BinLog)
481     {
482     Buf = cv.BinBuf;
483     Start = cv.BStart;
484     Count = cv.BCount;
485     }
486     else
487     return;
488    
489     if (Buf==NULL) return;
490     if (Count==0) return;
491    
492     // ?ス?ス?スb?スN?ス?ス?ス?ス?ス?ス(2004.8.6 yutaka)
493     logfile_lock();
494    
495     while (Get1(Buf,&Start,&Count,&b))
496     {
497     if (((cv.FilePause & OpLog)==0) && (! cv.ProtoFlag))
498     {
499 maya 1.4 // ?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スo?ス?ス(2006.7.23 maya)
500 yutakakn 1.5 // ?ス?ス?スt?スt?スH?ス[?ス}?スb?スg?ス?ス?ス?ス?ス{?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スE?スW?ス?ス?ス?ス?ス?ス?スX?ス?ス?ス?ス (2006.7.23 yutaka)
501 maya 1.4 if (ts.LogTimestamp &&
502     (Start == 1 || Buf[Start-2] == 0x0a)) {
503 yutakakn 1.5 #if 0
504 maya 1.4 SYSTEMTIME LocalTime;
505     GetLocalTime(&LocalTime);
506     char strtime[27];
507    
508     // format time
509     sprintf(strtime, "[%04d/%02d/%02d %02d:%02d:%02d.%03d] ",
510     LocalTime.wYear, LocalTime.wMonth,LocalTime.wDay,
511     LocalTime.wHour, LocalTime.wMinute, LocalTime.wSecond,
512     LocalTime.wMilliseconds);
513 yutakakn 1.5 #else
514     time_t tick = time(NULL);
515     char *strtime = ctime(&tick);
516     #endif
517 maya 1.4
518     // write to file
519     if (Start == 1 && ts.Append) {
520     _lwrite(LogVar->FileHandle,"\r\n",strlen("\r\n"));
521     }
522 yutakakn 1.5 _lwrite(LogVar->FileHandle,"[",1);
523     // ?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スI?ス[?ス?ス \n ?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スB
524     _lwrite(LogVar->FileHandle, strtime, strlen(strtime) - 1);
525     _lwrite(LogVar->FileHandle,"] ",2);
526 maya 1.4 }
527    
528 yutakakn 1.1 _lwrite(LogVar->FileHandle,(PCHAR)&b,1);
529     (LogVar->ByteCount)++;
530     }
531     }
532    
533     logfile_unlock();
534    
535     if (FileLog)
536     {
537     cv.LStart = Start;
538     cv.LCount = Count;
539     }
540     else {
541     cv.BStart = Start;
542     cv.BCount = Count;
543     }
544     if (((cv.FilePause & OpLog) !=0) || cv.ProtoFlag) return;
545     if (FLogDlg!=NULL)
546     FLogDlg->RefreshNum();
547     }
548    
549     BOOL CreateLogBuf()
550     {
551     if (cv.HLogBuf==NULL)
552     {
553     cv.HLogBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
554     cv.LogBuf = NULL;
555     cv.LogPtr = 0;
556     cv.LStart = 0;
557     cv.LCount = 0;
558     cv.DStart = 0;
559     cv.DCount = 0;
560     }
561     return (cv.HLogBuf!=NULL);
562     }
563    
564     void FreeLogBuf()
565     {
566     if ((cv.HLogBuf==NULL) || FileLog || DDELog) return;
567     if (cv.LogBuf!=NULL) GlobalUnlock(cv.HLogBuf);
568     GlobalFree(cv.HLogBuf);
569     cv.HLogBuf = NULL;
570     cv.LogBuf = NULL;
571     cv.LogPtr = 0;
572     cv.LStart = 0;
573     cv.LCount = 0;
574     cv.DStart = 0;
575     cv.DCount = 0;
576     }
577    
578     BOOL CreateBinBuf()
579     {
580     if (cv.HBinBuf==NULL)
581     {
582     cv.HBinBuf = GlobalAlloc(GMEM_MOVEABLE,InBuffSize);
583     cv.BinBuf = NULL;
584     cv.BinPtr = 0;
585     cv.BStart = 0;
586     cv.BCount = 0;
587     }
588     return (cv.HBinBuf!=NULL);
589     }
590    
591     void FreeBinBuf()
592     {
593     if ((cv.HBinBuf==NULL) || BinLog) return;
594     if (cv.BinBuf!=NULL) GlobalUnlock(cv.HBinBuf);
595     GlobalFree(cv.HBinBuf);
596     cv.HBinBuf = NULL;
597     cv.BinBuf = NULL;
598     cv.BinPtr = 0;
599     cv.BStart = 0;
600     cv.BCount = 0;
601     }
602    
603     extern "C" {
604     void FileSendStart()
605     {
606     LONG Option;
607    
608     if (! cv.Ready || FSend) return;
609     if (cv.ProtoFlag)
610     {
611     FreeFileVar(&SendVar);
612     return;
613     }
614    
615     if (! LoadTTFILE()) return;
616     if (! NewFileVar(&SendVar))
617     {
618     FreeTTFILE();
619     return;
620     }
621     SendVar->OpId = OpSendFile;
622    
623     FSend = TRUE;
624    
625     if (strlen(&(SendVar->FullName[SendVar->DirLen]))==0)
626     {
627     Option = MAKELONG(ts.TransBin,0);
628 maya 1.6 SendVar->FullName[0] = 0;
629 yutakakn 1.1 if (! (*GetTransFname)(SendVar, ts.FileDir, GTF_SEND, &Option))
630 maya 1.8 {
631 yutakakn 1.1 FileTransEnd(OpSendFile);
632     return;
633     }
634     ts.TransBin = LOWORD(Option);
635     }
636     else
637     (*SetFileVar)(SendVar);
638    
639     SendVar->FileHandle = _lopen(SendVar->FullName,OF_READ);
640     SendVar->FileOpen = (SendVar->FileHandle>0);
641     if (! SendVar->FileOpen)
642     {
643     FileTransEnd(OpSendFile);
644     return;
645     }
646     SendVar->ByteCount = 0;
647    
648     TalkStatus = IdTalkFile;
649     FileRetrySend = FALSE;
650     FileRetryEcho = FALSE;
651     FileCRSend = FALSE;
652    
653     if (! OpenFTDlg(SendVar))
654     FileTransEnd(OpSendFile);
655     }
656     }
657    
658     void FileTransEnd(WORD OpId)
659     /* OpId = 0: close Log and FileSend
660     OpLog: close Log
661     OpSendFile: close FileSend */
662     {
663     if (((OpId==0) || (OpId==OpLog)) &&
664     (FileLog || BinLog))
665     {
666     FileLog = FALSE;
667     BinLog = FALSE;
668     if (FLogDlg!=NULL)
669     {
670     FLogDlg->DestroyWindow();
671     FLogDlg = NULL;
672     }
673     FreeFileVar(&LogVar);
674     FreeLogBuf();
675     FreeBinBuf();
676     FreeTTFILE();
677     }
678    
679     if (((OpId==0) || (OpId==OpSendFile)) &&
680     FSend)
681     {
682     FSend = FALSE;
683     TalkStatus = IdTalkKeyb;
684     if (SendDlg!=NULL)
685     {
686     SendDlg->DestroyWindow();
687     SendDlg = NULL;
688     }
689     FreeFileVar(&SendVar);
690     FreeTTFILE();
691     }
692    
693     EndDdeCmnd(0);
694     }
695    
696     // vtwin.cpp ?ス?ス?ス?ス?スR?ス[?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スAextern "C"?ス?ス?スt?ス?ス?ス?ス?スB(2004.11.3 yutaka)
697     extern "C" {
698     int FSOut1(BYTE b)
699     {
700     if (ts.TransBin > 0)
701     return CommBinaryOut(&cv,(PCHAR)&b,1);
702     else if ((b>=0x20) || (b==0x09) || (b==0x0A) || (b==0x0D))
703     return CommTextOut(&cv,(PCHAR)&b,1);
704     else
705     return 1;
706     }
707    
708     int FSEcho1(BYTE b)
709     {
710     if (ts.TransBin > 0)
711     return CommBinaryEcho(&cv,(PCHAR)&b,1);
712     else
713     return CommTextEcho(&cv,(PCHAR)&b,1);
714     }
715     }
716    
717     extern "C" {
718     void FileSend()
719     {
720     WORD c, fc;
721     LONG BCOld;
722    
723     if ((SendDlg==NULL) ||
724     ((cv.FilePause & OpSendFile) !=0)) return;
725    
726     BCOld = SendVar->ByteCount;
727    
728     if (FileRetrySend)
729     {
730     FileRetryEcho = (ts.LocalEcho>0);
731     c = FSOut1(FileByte);
732     FileRetrySend = (c==0);
733     if (FileRetrySend) return;
734     }
735    
736     if (FileRetryEcho)
737     {
738     c = FSEcho1(FileByte);
739     FileRetryEcho = (c==0);
740     if (FileRetryEcho) return;
741     }
742    
743     do {
744     fc = _lread(SendVar->FileHandle,&FileByte,1);
745     SendVar->ByteCount = SendVar->ByteCount + fc;
746    
747     if (FileCRSend && (fc==1) && (FileByte==0x0A))
748     {
749     fc = _lread(SendVar->FileHandle,&FileByte,1);
750     SendVar->ByteCount = SendVar->ByteCount + fc;
751     }
752    
753     if (fc!=0)
754     {
755     c = FSOut1(FileByte);
756     FileCRSend = (ts.TransBin==0) && (FileByte==0x0D);
757     FileRetrySend = (c==0);
758     if (FileRetrySend)
759     {
760     if (SendVar->ByteCount != BCOld)
761     SendDlg->RefreshNum();
762     return;
763     }
764     if (ts.LocalEcho>0)
765     {
766     c = FSEcho1(FileByte);
767     FileRetryEcho = (c==0);
768     if (FileRetryEcho) return;
769     }
770     }
771     if ((fc==0) || (SendVar->ByteCount % 100 == 0))
772     {
773     SendDlg->RefreshNum();
774     BCOld = SendVar->ByteCount;
775     if (fc!=0) return;
776     }
777     } while (fc!=0);
778    
779     FileTransEnd(OpSendFile);
780     }
781     }
782    
783     extern "C" {
784     void FLogChangeButton(BOOL Pause)
785     {
786     if (FLogDlg!=NULL)
787     FLogDlg->ChangeButton(Pause);
788     }
789     }
790    
791     extern "C" {
792     void FLogRefreshNum()
793     {
794     if (FLogDlg!=NULL)
795     FLogDlg->RefreshNum();
796     }
797     }
798    
799     BOOL OpenProtoDlg(PFileVar fv, int IdProto, int Mode, WORD Opt1, WORD Opt2)
800     {
801     int vsize;
802     PProtoDlg pd;
803 maya 1.8 #ifdef I18N
804     HWND Hpd;
805     #endif
806 yutakakn 1.1
807     ProtoId = IdProto;
808    
809     switch (ProtoId) {
810     case PROTO_KMT:
811     vsize = sizeof(TKmtVar);
812     break;
813     case PROTO_XM:
814     vsize = sizeof(TXVar);
815     break;
816     case PROTO_ZM:
817     vsize = sizeof(TZVar);
818     break;
819     case PROTO_BP:
820     vsize = sizeof(TBPVar);
821     break;
822     case PROTO_QV:
823     vsize = sizeof(TQVVar);
824     break;
825     }
826     ProtoVar = (PCHAR)malloc(vsize);
827     if (ProtoVar==NULL) return FALSE;
828    
829     switch (ProtoId) {
830     case PROTO_KMT:
831     ((PKmtVar)ProtoVar)->KmtMode = Mode;
832     break;
833     case PROTO_XM:
834     ((PXVar)ProtoVar)->XMode = Mode;
835     ((PXVar)ProtoVar)->XOpt = Opt1;
836     ((PXVar)ProtoVar)->TextFlag = 1 - (Opt2 & 1);
837     break;
838     case PROTO_ZM:
839     ((PZVar)ProtoVar)->BinFlag = (Opt1 & 1) != 0;
840     ((PZVar)ProtoVar)->ZMode = Mode;
841     break;
842     case PROTO_BP:
843     ((PBPVar)ProtoVar)->BPMode = Mode;
844     break;
845     case PROTO_QV:
846     ((PQVVar)ProtoVar)->QVMode = Mode;
847     break;
848     }
849    
850     pd = new CProtoDlg();
851     if (pd==NULL)
852     {
853     free(ProtoVar);
854     ProtoVar = NULL;
855     return FALSE;
856     }
857 maya 1.8 #ifdef I18N
858     pd->Create(fv,&ts);
859     #else
860 yutakakn 1.1 pd->Create(fv);
861 maya 1.8 #endif
862    
863     #ifdef I18N
864     Hpd=pd->GetSafeHwnd();
865    
866     GetDlgItemText(Hpd, IDC_PROT_FILENAME, ts.UIMsg, sizeof(ts.UIMsg));
867     get_lang_msg("DLG_PROT_FIELNAME", ts.UIMsg, ts.UILanguageFile);
868     SetDlgItemText(Hpd, IDC_PROT_FILENAME, ts.UIMsg);
869     GetDlgItemText(Hpd, IDC_PROT_PROT, ts.UIMsg, sizeof(ts.UIMsg));
870     get_lang_msg("DLG_PROT_PROTO", ts.UIMsg, ts.UILanguageFile);
871     SetDlgItemText(Hpd, IDC_PROT_PROT, ts.UIMsg);
872     GetDlgItemText(Hpd, IDC_PROT_PACKET, ts.UIMsg, sizeof(ts.UIMsg));
873     get_lang_msg("DLG_PROT_PACKET", ts.UIMsg, ts.UILanguageFile);
874     SetDlgItemText(Hpd, IDC_PROT_PACKET, ts.UIMsg);
875     GetDlgItemText(Hpd, IDC_PROT_TRANS, ts.UIMsg, sizeof(ts.UIMsg));
876     get_lang_msg("DLG_PROT_TRANS", ts.UIMsg, ts.UILanguageFile);
877     SetDlgItemText(Hpd, IDC_PROT_TRANS, ts.UIMsg);
878     GetDlgItemText(Hpd, IDCANCEL, ts.UIMsg, sizeof(ts.UIMsg));
879     get_lang_msg("BTN_CANCEL", ts.UIMsg, ts.UILanguageFile);
880     SetDlgItemText(Hpd, IDCANCEL, ts.UIMsg);
881     #endif
882 yutakakn 1.1
883     (*ProtoInit)(ProtoId,FileVar,ProtoVar,&cv,&ts);
884    
885     PtDlg = pd;
886     return TRUE;
887     }
888    
889     extern "C" {
890     void CloseProtoDlg()
891     {
892     if (PtDlg!=NULL)
893     {
894     PtDlg->DestroyWindow();
895     PtDlg = NULL;
896    
897     ::KillTimer(FileVar->HMainWin,IdProtoTimer);
898     if ((ProtoId==PROTO_QV) &&
899     (((PQVVar)ProtoVar)->QVMode==IdQVSend))
900     CommTextOut(&cv,"\015",1);
901     if (FileVar->LogFlag)
902     _lclose(FileVar->LogFile);
903     FileVar->LogFile = 0;
904     if (ProtoVar!=NULL)
905     {
906     free(ProtoVar);
907     ProtoVar = NULL;
908     }
909     }
910     }
911     }
912    
913     BOOL ProtoStart()
914     {
915     if (cv.ProtoFlag) return FALSE;
916     if (FSend)
917     {
918     FreeFileVar(&FileVar);
919     return FALSE;
920     }
921    
922     if (! LoadTTFILE()) return FALSE;
923     NewFileVar(&FileVar);
924    
925     if (FileVar==NULL)
926     {
927     FreeTTFILE();
928     return FALSE;
929     }
930     cv.ProtoFlag = TRUE;
931     return TRUE;
932     }
933    
934     void ProtoEnd()
935     {
936     if (! cv.ProtoFlag) return;
937     cv.ProtoFlag = FALSE;
938    
939     /* Enable transmit delay (serial port) */
940     cv.DelayFlag = TRUE;
941     TalkStatus = IdTalkKeyb;
942    
943     CloseProtoDlg();
944    
945     if ((FileVar!=NULL) && FileVar->Success)
946     EndDdeCmnd(1);
947     else
948     EndDdeCmnd(0);
949    
950     FreeTTFILE();
951     FreeFileVar(&FileVar);
952     }
953    
954     extern "C" {
955     int ProtoDlgParse()
956     {
957     int P;
958    
959     P = ActiveWin;
960     if (PtDlg==NULL) return P;
961    
962     if ((*ProtoParse)(ProtoId,FileVar,ProtoVar,&cv))
963     P = 0; /* continue */
964     else {
965     CommSend(&cv);
966     ProtoEnd();
967     }
968     return P;
969     }
970     }
971    
972     extern "C" {
973     void ProtoDlgTimeOut()
974     {
975     if (PtDlg!=NULL)
976     (*ProtoTimeOutProc)(ProtoId,FileVar,ProtoVar,&cv);
977     }
978     }
979    
980     extern "C" {
981     void ProtoDlgCancel()
982     {
983     if ((PtDlg!=NULL) &&
984     (*ProtoCancel)(ProtoId,FileVar,ProtoVar,&cv))
985     ProtoEnd();
986     }
987     }
988    
989     extern "C" {
990     void KermitStart(int mode)
991     {
992     WORD w;
993    
994     if (! ProtoStart()) return;
995    
996     switch (mode) {
997     case IdKmtSend:
998     FileVar->OpId = OpKmtSend;
999     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1000     {
1001     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_KERMIT,&w) ||
1002     (FileVar->NumFname==0))
1003     {
1004     ProtoEnd();
1005     return;
1006     }
1007     }
1008     else
1009     (*SetFileVar)(FileVar);
1010 maya 1.8 break;
1011 yutakakn 1.1 case IdKmtReceive:
1012     FileVar->OpId = OpKmtRcv;
1013     break;
1014     case IdKmtGet:
1015     FileVar->OpId = OpKmtSend;
1016     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1017     {
1018     if (! (*GetGetFname)(FileVar->HMainWin,FileVar) ||
1019     (strlen(FileVar->FullName)==0))
1020     {
1021     ProtoEnd();
1022     return;
1023     }
1024     }
1025     else
1026     (*SetFileVar)(FileVar);
1027 maya 1.8 break;
1028 yutakakn 1.1 case IdKmtFinish:
1029     FileVar->OpId = OpKmtFin;
1030     break;
1031     default:
1032     ProtoEnd();
1033     return;
1034     }
1035     TalkStatus = IdTalkQuiet;
1036    
1037     /* disable transmit delay (serial port) */
1038     cv.DelayFlag = FALSE;
1039    
1040     if (! OpenProtoDlg(FileVar,PROTO_KMT,mode,0,0))
1041     ProtoEnd();
1042     }
1043     }
1044    
1045     extern "C" {
1046     void XMODEMStart(int mode)
1047     {
1048     LONG Option;
1049    
1050     if (! ProtoStart()) return;
1051    
1052     if (mode==IdXReceive)
1053     FileVar->OpId = OpXRcv;
1054     else
1055     FileVar->OpId = OpXSend;
1056    
1057     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1058     {
1059     Option = MAKELONG(ts.XmodemBin,ts.XmodemOpt);
1060     if (! (*GetXFname)(FileVar->HMainWin,
1061     mode==IdXReceive,&Option,FileVar,ts.FileDir))
1062     {
1063     ProtoEnd();
1064     return;
1065     }
1066     ts.XmodemOpt = HIWORD(Option);
1067     ts.XmodemBin = LOWORD(Option);
1068     }
1069     else
1070     (*SetFileVar)(FileVar);
1071    
1072     if (mode==IdXReceive)
1073     FileVar->FileHandle = _lcreat(FileVar->FullName,0);
1074     else
1075     FileVar->FileHandle = _lopen(FileVar->FullName,OF_READ);
1076    
1077     FileVar->FileOpen = FileVar->FileHandle>0;
1078     if (! FileVar->FileOpen)
1079     {
1080     ProtoEnd();
1081     return;
1082     }
1083     TalkStatus = IdTalkQuiet;
1084    
1085     /* disable transmit delay (serial port) */
1086     cv.DelayFlag = FALSE;
1087    
1088     if (! OpenProtoDlg(FileVar,PROTO_XM,mode,
1089     ts.XmodemOpt,ts.XmodemBin))
1090     ProtoEnd();
1091     }
1092     }
1093    
1094     extern "C" {
1095     void ZMODEMStart(int mode)
1096     {
1097     WORD Opt;
1098    
1099     if (! ProtoStart()) return;
1100    
1101     if (mode==IdZSend)
1102     {
1103     Opt = ts.XmodemBin;
1104     FileVar->OpId = OpZSend;
1105     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1106     {
1107     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_Z,&Opt) ||
1108     (FileVar->NumFname==0))
1109     {
1110     ProtoEnd();
1111     return;
1112     }
1113     ts.XmodemBin = Opt;
1114     }
1115     else
1116     (*SetFileVar)(FileVar);
1117     }
1118     else /* IdZReceive or IdZAuto */
1119     FileVar->OpId = OpZRcv;
1120    
1121     TalkStatus = IdTalkQuiet;
1122    
1123     /* disable transmit delay (serial port) */
1124     cv.DelayFlag = FALSE;
1125    
1126     if (! OpenProtoDlg(FileVar,PROTO_ZM,mode,Opt,0))
1127     ProtoEnd();
1128     }
1129     }
1130    
1131     extern "C" {
1132     void BPStart(int mode)
1133     {
1134     LONG Option;
1135    
1136     if (! ProtoStart()) return;
1137     if (mode==IdBPSend)
1138     {
1139     FileVar->OpId = OpBPSend;
1140     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1141     {
1142 maya 1.6 FileVar->FullName[0] = 0;
1143 yutakakn 1.1 if (! (*GetTransFname)(FileVar, ts.FileDir, GTF_BP, &Option))
1144 maya 1.8 {
1145 yutakakn 1.1 ProtoEnd();
1146     return;
1147     }
1148     }
1149     else
1150     (*SetFileVar)(FileVar);
1151     }
1152     else /* IdBPReceive or IdBPAuto */
1153     FileVar->OpId = OpBPRcv;
1154    
1155     TalkStatus = IdTalkQuiet;
1156    
1157     /* disable transmit delay (serial port) */
1158     cv.DelayFlag = FALSE;
1159    
1160     if (! OpenProtoDlg(FileVar,PROTO_BP,mode,0,0))
1161     ProtoEnd();
1162     }
1163     }
1164    
1165     extern "C" {
1166     void QVStart(int mode)
1167     {
1168     WORD W;
1169    
1170     if (! ProtoStart()) return;
1171    
1172     if (mode==IdQVSend)
1173     {
1174     FileVar->OpId = OpQVSend;
1175     if (strlen(&(FileVar->FullName[FileVar->DirLen]))==0)
1176     {
1177     if (! (*GetMultiFname)(FileVar,ts.FileDir,GMF_QV, &W) ||
1178     (FileVar->NumFname==0))
1179     {
1180     ProtoEnd();
1181     return;
1182     }
1183     }
1184     else
1185     (*SetFileVar)(FileVar);
1186     }
1187     else
1188     FileVar->OpId = OpQVRcv;
1189    
1190     TalkStatus = IdTalkQuiet;
1191    
1192     /* disable transmit delay (serial port) */
1193     cv.DelayFlag = FALSE;
1194    
1195     if (! OpenProtoDlg(FileVar,PROTO_QV,mode,0,0))
1196     ProtoEnd();
1197     }
1198     }
1199 yutakakn 1.2
1200     /*
1201 yutakakn 1.3 * $Log: filesys.cpp,v $
1202 maya 1.9 * Revision 1.8 2007/01/04 15:11:44 maya
1203     * ?ス\?ス?ス?ス?ス?スb?スZ?ス[?スW?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス
1204     *
1205 maya 1.8 * Revision 1.7 2006/12/25 16:13:54 yutakapon
1206     * ?ス?ス?スO?ス?ス?ス?ス?ス?ス?ス?ス?ス}?スN?ス?ス?ス?ス?スX?スg?ス[?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スC?ス?ス?スB
1207     * ?ス?ス?スO?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スx?ス}?スN?ス?ス?ス?ス?ス~?ス?ス?ス?ス?ス?ス?スA?スo?スb?スt?ス@?ス?ス?スC?ス?ス?スf?スb?スN?スX?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スA
1208     * ?ス?ス?スx?ス}?スN?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スf?ス[?ス^?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スB
1209     * ?ス}?スN?ス?ス?ス?ス?ス?ス?ス~?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スC?ス?ス?スf?スb?スN?スX?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スB
1210     *
1211 yutakapon 1.7 * Revision 1.6 2006/08/28 12:27:16 maya
1212     * ?スf?スt?スH?ス?ス?スg?ス?ス?ス?ス?スO?スt?ス@?スC?ス?ス?ス?ス?ス?ス?スw?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スB
1213     * ?スG?スf?スB?スb?スg?スR?ス?ス?スg?ス?ス?ス[?ス?ス?ス?ス "Additional settings" ?ス_?スC?スA?ス?ス?スO?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スB
1214     * teraterm.ini ?スt?ス@?スC?ス?ス?ス?ス LogDefaultName ?スG?ス?ス?スg?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スB
1215     * ?スt?ス@?スC?ス?ス?ス?ス?ス?ス strftime ?ス?ス?スt?スH?ス[?ス}?スb?スg?ス?ス?スg?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スB
1216     *
1217 maya 1.6 * Revision 1.5 2006/07/23 14:12:26 yutakakn
1218     * ?ス?ス?スO?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スt?スt?スH?ス[?ス}?スb?スg?ス?ス?ス?ス?スE?スW?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スX?ス?ス?ス?ス?スB
1219     *
1220 yutakakn 1.5 * Revision 1.4 2006/07/22 16:15:54 maya
1221     * ?ス?ス?スO?スL?ス^?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス@?ス\?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スB
1222     *
1223 maya 1.4 * Revision 1.3 2005/05/07 09:49:24 yutakakn
1224     * teraterm.ini?ス?ス LogTypePlainText ?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スB
1225     *
1226 yutakakn 1.3 * Revision 1.2 2005/02/20 14:51:29 yutakakn
1227     * ?ス?ス?スO?スt?ス@?スC?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス"plain text"?ス?ス?ス?ス?ス?ス?スB?ス?ス?ス?ス?スI?スv?スV?ス?ス?ス?ス?ス?ス?スL?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スA?ス?ス?スO?スt?ス@?スC?ス?ス?ス?ス
1228     * ASCII?ス?ス?ス\?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スB
1229     *
1230     * ?ス?ス?ス?ス?スA?ス?ス?ス?ス?ス?ス?ス?ス?スL?ス?ス?ス?ス?スN?ス^?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スB
1231     * ?ス@?スEBS
1232     * ?ス@?スEASCII(0x00-0x1f)?ス?ス?ス?ス?ス?ス?ス?ス?ス\?ス?ス?ス?ス?ス?ス?ス?ス
1233     *
1234     * ?ス?ス?ス?ス?ス?ス?スA?ス?ス?スO?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?ス?スO?ス?ス?ス?ス?ス?ス?ス?ス?スB
1235     * ?ス@?スEHT
1236     * ?ス@?スECR
1237     * ?ス@?スELF
1238     *
1239 yutakakn 1.2 */

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