OSDN Git Service

Update OpenSSL to 1.0.2c.
[ffftp/ffftp.git] / ftpproc.c
1 /*=============================================================================\r
2 *\r
3 *                                                               FTPコマンド操作\r
4 *\r
5 ===============================================================================\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.\r
7 /\r
8 / Redistribution and use in source and binary forms, with or without \r
9 / modification, are permitted provided that the following conditions \r
10 / are met:\r
11 /\r
12 /  1. Redistributions of source code must retain the above copyright \r
13 /     notice, this list of conditions and the following disclaimer.\r
14 /  2. Redistributions in binary form must reproduce the above copyright \r
15 /     notice, this list of conditions and the following disclaimer in the \r
16 /     documentation and/or other materials provided with the distribution.\r
17 /\r
18 / THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR \r
19 / IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES \r
20 / OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r
21 / IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, \r
22 / INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r
23 / BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF \r
24 / USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON \r
25 / ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
26 / (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF \r
27 / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
28 /============================================================================*/\r
29 \r
30 #define  STRICT\r
31 // IPv6対応\r
32 #include <winsock2.h>\r
33 #include <windows.h>\r
34 #include <stdio.h>\r
35 #include <stdlib.h>\r
36 #include <string.h>\r
37 #include <mbstring.h>\r
38 #include <windowsx.h>\r
39 #include <commctrl.h>\r
40 \r
41 #include "common.h"\r
42 #include "resource.h"\r
43 \r
44 #include <htmlhelp.h>\r
45 #include "helpid.h"\r
46 \r
47 // UTF-8対応\r
48 #undef __MBSWRAPPER_H__\r
49 #include "mbswrapper.h"\r
50 \r
51 \r
52 /*===== プロトタイプ =====*/\r
53 \r
54 static int CheckRemoteFile(TRANSPACKET *Pkt, FILELIST *ListList);\r
55 // 64ビット対応\r
56 //static BOOL CALLBACK UpExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
57 static INT_PTR CALLBACK UpExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
58 \r
59 static void DispMirrorFiles(FILELIST *Local, FILELIST *Remote);\r
60 static void MirrorDeleteAllLocalDir(FILELIST *Local, TRANSPACKET *Pkt, TRANSPACKET **Base);\r
61 static int CheckLocalFile(TRANSPACKET *Pkt);\r
62 // 64ビット対応\r
63 //static BOOL CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
64 static INT_PTR CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
65 static void RemoveAfterSemicolon(char *Path);\r
66 static void MirrorDeleteAllDir(FILELIST *Remote, TRANSPACKET *Pkt, TRANSPACKET **Base);\r
67 // 64ビット対応\r
68 //static BOOL CALLBACK MirrorNotifyCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
69 //static BOOL CALLBACK MirrorDispListCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
70 static INT_PTR CALLBACK MirrorNotifyCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
71 static INT_PTR CALLBACK MirrorDispListCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
72 static void CountMirrorFiles(HWND hDlg, TRANSPACKET *Pkt);\r
73 static int AskMirrorNoTrn(char *Fname, int Mode);\r
74 static int AskUploadFileAttr(char *Fname);\r
75 // 64ビット対応\r
76 //static BOOL CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
77 static INT_PTR CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
78 #if defined(HAVE_TANDEM)\r
79 static INT_PTR CALLBACK UpDownAsWithExtDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
80 #endif\r
81 static void DeleteAllDir(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDir);\r
82 static void DelNotifyAndDo(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDir);\r
83 // 64ビット対応\r
84 //static BOOL CALLBACK DeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
85 //static BOOL CALLBACK RenameDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
86 static INT_PTR CALLBACK DeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
87 static INT_PTR CALLBACK RenameDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
88 static void SetAttrToDialog(HWND hWnd, int Attr);\r
89 static int GetAttrFromDialog(HWND hDlg);\r
90 static LRESULT CALLBACK SizeNotifyDlgWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
91 static LRESULT CALLBACK SizeDlgWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
92 static int RenameUnuseableName(char *Fname);\r
93 \r
94 /*===== 外部参照 ====*/\r
95 \r
96 extern HWND hHelpWin;\r
97 \r
98 /* 設定値 */\r
99 extern int FnameCnv;\r
100 extern int RecvMode;\r
101 extern int SendMode;\r
102 extern int MoveMode;\r
103 extern char MirrorNoTrn[MIRROR_LEN+1];\r
104 extern char MirrorNoDel[MIRROR_LEN+1];\r
105 extern int MirrorFnameCnv;\r
106 extern char DefAttrList[DEFATTRLIST_LEN+1];\r
107 extern SIZE MirrorDlgSize;\r
108 extern int VaxSemicolon;\r
109 extern int DebugConsole;\r
110 extern int CancelFlg;\r
111 // ディレクトリ自動作成\r
112 extern int MakeAllDir;\r
113 // ファイル一覧バグ修正\r
114 extern int AbortOnListError;\r
115 // ミラーリング設定追加\r
116 extern int MirrorNoTransferContents; \r
117 \r
118 /*===== ローカルなワーク =====*/\r
119 \r
120 static char TmpString[FMAX_PATH+80];            /* テンポラリ */\r
121 #if defined(HAVE_TANDEM)\r
122 static char TmpFileCode[5];             /* テンポラリ */\r
123 #endif\r
124 static int CurWin;                                              /* ウインドウ番号 */\r
125 \r
126 int UpExistMode = EXIST_OVW;            /* アップロードで同じ名前のファイルがある時の扱い方 EXIST_xxx */\r
127 int ExistMode = EXIST_OVW;              /* 同じ名前のファイルがある時の扱い方 EXIST_xxx */\r
128 static int ExistNotify;         /* 確認ダイアログを出すかどうか YES/NO */\r
129 \r
130 static double FileSize;         /* ファイル総容量 */\r
131 \r
132 \r
133 \r
134 /*----- ファイル一覧で指定されたファイルをダウンロードする --------------------\r
135 *\r
136 *       Parameter\r
137 *               int ChName : 名前を変えるかどうか (YES/NO)\r
138 *               int ForceFile : ディレクトリをファイル見なすかどうか (YES/NO)\r
139 *               int All : 全てが選ばれている物として扱うかどうか (YES/NO)\r
140 *\r
141 *       Return Value\r
142 *               なし\r
143 *----------------------------------------------------------------------------*/\r
144 \r
145 // ディレクトリ自動作成\r
146 // ローカル側のパスから必要なフォルダを作成\r
147 int MakeDirFromLocalPath(char* LocalFile, char* Old)\r
148 {\r
149         TRANSPACKET Pkt;\r
150         char* pDelimiter;\r
151         char* pNext;\r
152         char* Cat;\r
153         int Len;\r
154         int Make;\r
155         pDelimiter = LocalFile;\r
156         Make = NO;\r
157         while(pNext = strchr(pDelimiter, '\\'))\r
158         {\r
159                 Len = pNext - LocalFile;\r
160                 strncpy(Pkt.LocalFile, LocalFile, Len);\r
161                 Pkt.LocalFile[Len] = '\0';\r
162                 if(strncmp(LocalFile, Old, Len + 1) != 0)\r
163                 {\r
164                         Cat = Pkt.LocalFile + (pDelimiter - LocalFile);\r
165                         if(FnameCnv == FNAME_LOWER)\r
166                                 _mbslwr(Cat);\r
167                         else if(FnameCnv == FNAME_UPPER)\r
168                                 _mbsupr(Cat);\r
169                         ReplaceAll(Pkt.LocalFile, '/', '\\');\r
170 \r
171                         strcpy(Pkt.Cmd, "MKD ");\r
172                         strcpy(Pkt.RemoteFile, "");\r
173                         AddTransFileList(&Pkt);\r
174 \r
175                         Make = YES;\r
176                 }\r
177                 pDelimiter = pNext + 1;\r
178         }\r
179         return Make;\r
180 }\r
181 \r
182 void DownloadProc(int ChName, int ForceFile, int All)\r
183 {\r
184         FILELIST *FileListBase;\r
185         FILELIST *Pos;\r
186         TRANSPACKET Pkt;\r
187         // ディレクトリ自動作成\r
188         char Tmp[FMAX_PATH+1];\r
189         // ファイル一覧バグ修正\r
190         int ListSts;\r
191 \r
192         // 同時接続対応\r
193         CancelFlg = NO;\r
194 \r
195         if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
196         {\r
197                 DisableUserOpe();\r
198 \r
199                 ExistNotify = YES;\r
200 //              KeepTransferDialog(YES);\r
201 \r
202                 FileListBase = NULL;\r
203                 // ファイル一覧バグ修正\r
204 //              MakeSelectedFileList(WIN_REMOTE, (ForceFile == YES ? NO : YES), All, &FileListBase, &CancelFlg);\r
205                 ListSts = MakeSelectedFileList(WIN_REMOTE, (ForceFile == YES ? NO : YES), All, &FileListBase, &CancelFlg);\r
206 \r
207                 if(AskNoFullPathMode() == YES)\r
208                 {\r
209                         strcpy(Pkt.Cmd, "SETCUR");\r
210                         AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
211                         AddTransFileList(&Pkt);\r
212                 }\r
213 \r
214                 Pos = FileListBase;\r
215                 while(Pos != NULL)\r
216                 {\r
217                         // ファイル一覧バグ修正\r
218                         if((AbortOnListError == YES) && (ListSts == FFFTP_FAIL))\r
219                                 break;\r
220                         AskLocalCurDir(Pkt.LocalFile, FMAX_PATH);\r
221                         SetYenTail(Pkt.LocalFile);\r
222                         strcpy(TmpString, Pos->File);\r
223                         if((ChName == NO) || ((ForceFile == NO) && (Pos->Node == NODE_DIR)))\r
224                         {\r
225                                 if(FnameCnv == FNAME_LOWER)\r
226                                         _mbslwr(TmpString);\r
227                                 else if(FnameCnv == FNAME_UPPER)\r
228                                         _mbsupr(TmpString);\r
229                                 RemoveAfterSemicolon(TmpString);\r
230                                 if(RenameUnuseableName(TmpString) == FFFTP_FAIL)\r
231                                         break;\r
232                         }\r
233                         else\r
234                         {\r
235                                 CurWin = WIN_REMOTE;\r
236                                 if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(updown_as_dlg), GetMainHwnd(), UpDownAsDialogCallBack) == YES)\r
237                                 {\r
238                                         if(RenameUnuseableName(TmpString) == FFFTP_FAIL)\r
239                                                 break;\r
240                                 }\r
241                                 else\r
242                                         break;\r
243                         }\r
244                         strcat(Pkt.LocalFile, TmpString);\r
245                         ReplaceAll(Pkt.LocalFile, '/', '\\');\r
246 \r
247                         if((ForceFile == NO) && (Pos->Node == NODE_DIR))\r
248                         {\r
249                                 strcpy(Pkt.Cmd, "MKD ");\r
250                                 strcpy(Pkt.RemoteFile, "");\r
251                                 AddTransFileList(&Pkt);\r
252                         }\r
253                         else if((Pos->Node == NODE_FILE) ||\r
254                                         ((ForceFile == YES) && (Pos->Node == NODE_DIR)))\r
255                         {\r
256                                 if(AskHostType() == HTYPE_ACOS)\r
257                                 {\r
258                                         strcpy(Pkt.RemoteFile, "'");\r
259                                         strcat(Pkt.RemoteFile, AskHostLsName());\r
260                                         strcat(Pkt.RemoteFile, "(");\r
261                                         strcat(Pkt.RemoteFile, Pos->File);\r
262                                         strcat(Pkt.RemoteFile, ")");\r
263                                         strcat(Pkt.RemoteFile, "'");\r
264                                 }\r
265                                 else if(AskHostType() == HTYPE_ACOS_4)\r
266                                 {\r
267                                         strcpy(Pkt.RemoteFile, Pos->File);\r
268                                 }\r
269                                 else\r
270                                 {\r
271                                         AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
272                                         SetSlashTail(Pkt.RemoteFile);\r
273                                         strcat(Pkt.RemoteFile, Pos->File);\r
274                                         ReplaceAll(Pkt.RemoteFile, '\\', '/');\r
275                                 }\r
276 \r
277                                 strcpy(Pkt.Cmd, "RETR ");\r
278 #if defined(HAVE_TANDEM)\r
279                                 if(AskHostType() == HTYPE_TANDEM) {\r
280                                         if(AskTransferType() != TYPE_X) {\r
281                                                 Pkt.Type = AskTransferType();\r
282                                         } else {\r
283                                                 Pkt.Attr = Pos->Attr;\r
284                                                 if (Pkt.Attr == 101)\r
285                                                         Pkt.Type = TYPE_A;\r
286                                                 else\r
287                                                         Pkt.Type = TYPE_I;\r
288                                         }\r
289                                 } else\r
290 #endif\r
291                                 Pkt.Type = AskTransferTypeAssoc(Pkt.RemoteFile, AskTransferType());\r
292                                 Pkt.Size = Pos->Size;\r
293                                 Pkt.Time = Pos->Time;\r
294                                 Pkt.KanjiCode = AskHostKanjiCode();\r
295                                 // UTF-8対応\r
296                                 Pkt.KanjiCodeDesired = AskLocalKanjiCode();\r
297                                 Pkt.KanaCnv = AskHostKanaCnv();\r
298 \r
299                                 // ディレクトリ自動作成\r
300                                 strcpy(Tmp, Pkt.LocalFile);\r
301                                 Pkt.Mode = CheckLocalFile(&Pkt);        /* Pkt.ExistSize がセットされる */\r
302                                 // ミラーリング設定追加\r
303                                 Pkt.NoTransfer = NO;\r
304                                 if(Pkt.Mode == EXIST_ABORT)\r
305                                         break;\r
306                                 else if(Pkt.Mode != EXIST_IGNORE)\r
307                                 // ディレクトリ自動作成\r
308 //                                      AddTransFileList(&Pkt);\r
309                                 {\r
310                                         if(MakeAllDir == YES)\r
311                                                 MakeDirFromLocalPath(Pkt.LocalFile, Tmp);\r
312                                         AddTransFileList(&Pkt);\r
313                                 }\r
314                         }\r
315                         Pos = Pos->Next;\r
316                 }\r
317 \r
318                 if(AskNoFullPathMode() == YES)\r
319                 {\r
320                         strcpy(Pkt.Cmd, "BACKCUR");\r
321                         AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
322                         AddTransFileList(&Pkt);\r
323                 }\r
324                 DeleteFileList(&FileListBase);\r
325 \r
326                 // 同時接続対応\r
327 //              strcpy(Pkt.Cmd, "GOQUIT");\r
328 //              AddTransFileList(&Pkt);\r
329 \r
330                 // バグ対策\r
331                 AddNullTransFileList();\r
332 \r
333                 GoForwardTransWindow();\r
334 //              KeepTransferDialog(NO);\r
335 \r
336                 EnableUserOpe();\r
337         }\r
338         return;\r
339 }\r
340 \r
341 \r
342 /*----- 指定されたファイルを一つダウンロードする ------------------------------\r
343 *\r
344 *       Parameter\r
345 *               char *Fname : ファイル名\r
346 *\r
347 *       Return Value\r
348 *               なし\r
349 *----------------------------------------------------------------------------*/\r
350 \r
351 void DirectDownloadProc(char *Fname)\r
352 {\r
353         TRANSPACKET Pkt;\r
354         // ディレクトリ自動作成\r
355         char Tmp[FMAX_PATH+1];\r
356 \r
357         // 同時接続対応\r
358         CancelFlg = NO;\r
359 \r
360         if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
361         {\r
362                 DisableUserOpe();\r
363 \r
364                 ExistNotify = YES;\r
365 //              KeepTransferDialog(YES);\r
366 \r
367                 if(AskNoFullPathMode() == YES)\r
368                 {\r
369                         strcpy(Pkt.Cmd, "SETCUR");\r
370                         AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
371                         AddTransFileList(&Pkt);\r
372                 }\r
373 \r
374                 if(strlen(Fname) > 0)\r
375                 {\r
376                         AskLocalCurDir(Pkt.LocalFile, FMAX_PATH);\r
377                         SetYenTail(Pkt.LocalFile);\r
378                         strcpy(TmpString, Fname);\r
379                         if(FnameCnv == FNAME_LOWER)\r
380                                 _mbslwr(TmpString);\r
381                         else if(FnameCnv == FNAME_UPPER)\r
382                                 _mbsupr(TmpString);\r
383                         RemoveAfterSemicolon(TmpString);\r
384 \r
385                         if(RenameUnuseableName(TmpString) == FFFTP_SUCCESS)\r
386                         {\r
387                                 strcat(Pkt.LocalFile, TmpString);\r
388                                 ReplaceAll(Pkt.LocalFile, '/', '\\');\r
389 \r
390                                 if(AskHostType() == HTYPE_ACOS)\r
391                                 {\r
392                                         strcpy(Pkt.RemoteFile, "'");\r
393                                         strcat(Pkt.RemoteFile, AskHostLsName());\r
394                                         strcat(Pkt.RemoteFile, "(");\r
395                                         strcat(Pkt.RemoteFile, Fname);\r
396                                         strcat(Pkt.RemoteFile, ")");\r
397                                         strcat(Pkt.RemoteFile, "'");\r
398                                 }\r
399                                 else if(AskHostType() == HTYPE_ACOS_4)\r
400                                 {\r
401                                         strcpy(Pkt.RemoteFile, Fname);\r
402                                 }\r
403                                 else\r
404                                 {\r
405                                         AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
406                                         SetSlashTail(Pkt.RemoteFile);\r
407                                         strcat(Pkt.RemoteFile, Fname);\r
408                                         ReplaceAll(Pkt.RemoteFile, '\\', '/');\r
409                                 }\r
410 \r
411                                 strcpy(Pkt.Cmd, "RETR-S ");\r
412                                 Pkt.Type = AskTransferTypeAssoc(Pkt.RemoteFile, AskTransferType());\r
413 \r
414                                 /* サイズと日付は転送側スレッドで取得し、セットする */\r
415 \r
416                                 Pkt.KanjiCode = AskHostKanjiCode();\r
417                                 // UTF-8対応\r
418                                 Pkt.KanjiCodeDesired = AskLocalKanjiCode();\r
419                                 Pkt.KanaCnv = AskHostKanaCnv();\r
420 \r
421                                 // ディレクトリ自動作成\r
422                                 strcpy(Tmp, Pkt.LocalFile);\r
423                                 Pkt.Mode = CheckLocalFile(&Pkt);        /* Pkt.ExistSize がセットされる */\r
424                                 // ミラーリング設定追加\r
425                                 Pkt.NoTransfer = NO;\r
426                                 if((Pkt.Mode != EXIST_ABORT) && (Pkt.Mode != EXIST_IGNORE))\r
427                                 // ディレクトリ自動作成\r
428 //                                      AddTransFileList(&Pkt);\r
429                                 {\r
430                                         if(MakeAllDir == YES)\r
431                                                 MakeDirFromLocalPath(Pkt.LocalFile, Tmp);\r
432                                         AddTransFileList(&Pkt);\r
433                                 }\r
434                         }\r
435                 }\r
436 \r
437                 if(AskNoFullPathMode() == YES)\r
438                 {\r
439                         strcpy(Pkt.Cmd, "BACKCUR");\r
440                         AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
441                         AddTransFileList(&Pkt);\r
442                 }\r
443 \r
444                 // 同時接続対応\r
445 //              strcpy(Pkt.Cmd, "GOQUIT");\r
446 //              AddTransFileList(&Pkt);\r
447 \r
448                 // バグ対策\r
449                 AddNullTransFileList();\r
450 \r
451                 GoForwardTransWindow();\r
452 //              KeepTransferDialog(NO);\r
453 \r
454                 EnableUserOpe();\r
455         }\r
456         return;\r
457 }\r
458 \r
459 \r
460 /*----- 入力されたファイル名のファイルを一つダウンロードする ------------------\r
461 *\r
462 *       Parameter\r
463 *               なし\r
464 *\r
465 *       Return Value\r
466 *               なし\r
467 *----------------------------------------------------------------------------*/\r
468 \r
469 void InputDownloadProc(void)\r
470 {\r
471         char Path[FMAX_PATH+1];\r
472         int Tmp;\r
473 \r
474 //      DisableUserOpe();\r
475 \r
476         strcpy(Path, "");\r
477         if(InputDialogBox(downname_dlg, GetMainHwnd(), NULL, Path, FMAX_PATH, &Tmp, IDH_HELP_TOPIC_0000001) == YES)\r
478         {\r
479                 DirectDownloadProc(Path);\r
480         }\r
481 \r
482 //      EnableUserOpe();\r
483 \r
484         return;\r
485 }\r
486 \r
487 \r
488 /*----- ミラーリングダウンロードを行う ----------------------------------------\r
489 *\r
490 *       Parameter\r
491 *               int Notify : 確認を行うかどうか (YES/NO)\r
492 *\r
493 *       Return Value\r
494 *               なし\r
495 *----------------------------------------------------------------------------*/\r
496 \r
497 void MirrorDownloadProc(int Notify)\r
498 {\r
499         FILELIST *LocalListBase;\r
500         FILELIST *RemoteListBase;\r
501         FILELIST *LocalPos;\r
502         FILELIST *RemotePos;\r
503         TRANSPACKET Pkt;\r
504         TRANSPACKET *Base;\r
505         char Name[FMAX_PATH+1];\r
506         char *Cat;\r
507         int Level;\r
508         int Mode;\r
509         // ファイル一覧バグ修正\r
510         int ListSts;\r
511 \r
512         // 同時接続対応\r
513         CancelFlg = NO;\r
514 \r
515         if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
516         {\r
517                 DisableUserOpe();\r
518 \r
519                 Base = NULL;\r
520 \r
521                 if(Notify == YES)\r
522                         Notify = DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(mirror_down_dlg), GetMainHwnd(), MirrorNotifyCallBack, 0);\r
523                 else\r
524                         Notify = YES;\r
525 \r
526                 if((Notify == YES) || (Notify == YES_LIST))\r
527                 {\r
528                         /*===== ファイルリスト取得 =====*/\r
529 \r
530                         LocalListBase = NULL;\r
531                         // ファイル一覧バグ修正\r
532 //                      MakeSelectedFileList(WIN_LOCAL, YES, YES, &LocalListBase, &CancelFlg);\r
533                         ListSts = MakeSelectedFileList(WIN_LOCAL, YES, YES, &LocalListBase, &CancelFlg);\r
534                         RemoteListBase = NULL;\r
535                         // ファイル一覧バグ修正\r
536 //                      MakeSelectedFileList(WIN_REMOTE, YES, YES, &RemoteListBase, &CancelFlg);\r
537                         if(ListSts == FFFTP_SUCCESS)\r
538                                 ListSts = MakeSelectedFileList(WIN_REMOTE, YES, YES, &RemoteListBase, &CancelFlg);\r
539 \r
540                         RemotePos = RemoteListBase;\r
541                         while(RemotePos != NULL)\r
542                         {\r
543                                 RemotePos->Attr = YES;          /* RemotePos->Attrは転送するかどうかのフラグに使用 (YES/NO) */\r
544                                 RemotePos = RemotePos->Next;\r
545                         }\r
546 \r
547                         LocalPos = LocalListBase;\r
548                         while(LocalPos != NULL)\r
549                         {\r
550                                 if(AskMirrorNoTrn(LocalPos->File, 1) == NO)\r
551                                 {\r
552                                         LocalPos->Attr = YES;\r
553                                         LocalPos = LocalPos->Next;\r
554                                 }\r
555                                 else\r
556                                 {\r
557                                         LocalPos->Attr = NO;    /* LocalPos->Attrは削除するかどうかのフラグに使用 (YES/NO) */\r
558 \r
559                                         if(LocalPos->Node == NODE_DIR)\r
560                                         {\r
561                                                 Level = AskDirLevel(LocalPos->File);\r
562                                                 LocalPos = LocalPos->Next;\r
563                                                 while(LocalPos != NULL)\r
564                                                 {\r
565                                                         if((LocalPos->Node == NODE_DIR) &&\r
566                                                            (AskDirLevel(LocalPos->File) <= Level))\r
567                                                         {\r
568                                                                 break;\r
569                                                         }\r
570                                                         LocalPos->Attr = NO;\r
571                                                         LocalPos = LocalPos->Next;\r
572                                                 }\r
573                                         }\r
574                                         else\r
575                                                 LocalPos = LocalPos->Next;\r
576                                 }\r
577                         }\r
578 \r
579                         /*===== ファイルリスト比較 =====*/\r
580 \r
581                         RemotePos = RemoteListBase;\r
582                         while(RemotePos != NULL)\r
583                         {\r
584                                 if(AskMirrorNoTrn(RemotePos->File, 0) == NO)\r
585                                 {\r
586                                         strcpy(Name, RemotePos->File);\r
587 //                                      ReplaceAll(Name, '/', '\\');\r
588 \r
589                                         if(MirrorFnameCnv == YES)\r
590                                                 Mode = COMP_LOWERMATCH;\r
591                                         else\r
592                                                 Mode = COMP_STRICT;\r
593 \r
594                                         if((LocalPos = SearchFileList(Name, LocalListBase, Mode)) != NULL)\r
595                                         {\r
596                                                 if((RemotePos->Node == NODE_DIR) && (LocalPos->Node == NODE_DIR))\r
597                                                 {\r
598                                                         LocalPos->Attr = NO;\r
599                                                         RemotePos->Attr = NO;\r
600                                                 }\r
601                                                 else if((RemotePos->Node == NODE_FILE) && (LocalPos->Node == NODE_FILE))\r
602                                                 {\r
603                                                         LocalPos->Attr = NO;\r
604                                                         if(CompareFileTime(&RemotePos->Time, &LocalPos->Time) <= 0)\r
605                                                                 RemotePos->Attr = NO;\r
606                                                 }\r
607                                         }\r
608                                         RemotePos = RemotePos->Next;\r
609                                 }\r
610                                 else\r
611                                 {\r
612                                         if(RemotePos->Node == NODE_FILE)\r
613                                         {\r
614                                                 RemotePos->Attr = NO;\r
615                                                 RemotePos = RemotePos->Next;\r
616                                         }\r
617                                         else\r
618                                         {\r
619                                                 RemotePos->Attr = NO;\r
620                                                 Level = AskDirLevel(RemotePos->File);\r
621                                                 RemotePos = RemotePos->Next;\r
622                                                 while(RemotePos != NULL)\r
623                                                 {\r
624                                                         if((RemotePos->Node == NODE_DIR) &&\r
625                                                            (AskDirLevel(RemotePos->File) <= Level))\r
626                                                         {\r
627                                                                 break;\r
628                                                         }\r
629                                                         RemotePos->Attr = NO;\r
630                                                         RemotePos = RemotePos->Next;\r
631                                                 }\r
632                                         }\r
633                                 }\r
634                         }\r
635 \r
636                         DispMirrorFiles(LocalListBase, RemoteListBase);\r
637 \r
638                         /*===== 削除/アップロード =====*/\r
639 \r
640                         LocalPos = LocalListBase;\r
641                         while(LocalPos != NULL)\r
642                         {\r
643                                 if((LocalPos->Attr == YES) && (LocalPos->Node == NODE_FILE))\r
644                                 {\r
645                                         AskLocalCurDir(Pkt.LocalFile, FMAX_PATH);\r
646                                         SetYenTail(Pkt.LocalFile);\r
647                                         strcat(Pkt.LocalFile, LocalPos->File);\r
648                                         ReplaceAll(Pkt.LocalFile, '/', '\\');\r
649                                         strcpy(Pkt.RemoteFile, "");\r
650                                         strcpy(Pkt.Cmd, "L-DELE ");\r
651                                         AddTmpTransFileList(&Pkt, &Base);\r
652                                 }\r
653                                 LocalPos = LocalPos->Next;\r
654                         }\r
655                         MirrorDeleteAllLocalDir(LocalListBase, &Pkt, &Base);\r
656 \r
657 \r
658                         RemotePos = RemoteListBase;\r
659                         while(RemotePos != NULL)\r
660                         {\r
661                                 if(RemotePos->Attr == YES)\r
662                                 {\r
663                                         AskLocalCurDir(Pkt.LocalFile, FMAX_PATH);\r
664                                         SetYenTail(Pkt.LocalFile);\r
665                                         Cat = strchr(Pkt.LocalFile, NUL);\r
666                                         strcat(Pkt.LocalFile, RemotePos->File);\r
667 \r
668                                         if(MirrorFnameCnv == YES)\r
669                                                 _mbslwr(Cat);\r
670 \r
671                                         RemoveAfterSemicolon(Cat);\r
672                                         ReplaceAll(Pkt.LocalFile, '/', '\\');\r
673 \r
674                                         if(RemotePos->Node == NODE_DIR)\r
675                                         {\r
676                                                 strcpy(Pkt.RemoteFile, "");\r
677                                                 strcpy(Pkt.Cmd, "L-MKD ");\r
678                                                 AddTmpTransFileList(&Pkt, &Base);\r
679                                         }\r
680                                         else if(RemotePos->Node == NODE_FILE)\r
681                                         {\r
682                                                 AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
683                                                 SetSlashTail(Pkt.RemoteFile);\r
684                                                 strcat(Pkt.RemoteFile, RemotePos->File);\r
685                                                 ReplaceAll(Pkt.RemoteFile, '\\', '/');\r
686 \r
687                                                 strcpy(Pkt.Cmd, "RETR ");\r
688                                                 Pkt.Type = AskTransferTypeAssoc(Pkt.RemoteFile, AskTransferType());\r
689                                                 Pkt.Size = RemotePos->Size;\r
690                                                 Pkt.Time = RemotePos->Time;\r
691 //                                              Pkt.Attr = 0;\r
692                                                 Pkt.KanjiCode = AskHostKanjiCode();\r
693                                                 // UTF-8対応\r
694                                                 Pkt.KanjiCodeDesired = AskLocalKanjiCode();\r
695                                                 Pkt.KanaCnv = AskHostKanaCnv();\r
696                                                 Pkt.Mode = EXIST_OVW;\r
697                                                 // ミラーリング設定追加\r
698                                                 Pkt.NoTransfer = MirrorNoTransferContents;\r
699                                                 AddTmpTransFileList(&Pkt, &Base);\r
700                                         }\r
701                                 }\r
702                                 RemotePos = RemotePos->Next;\r
703                         }\r
704 \r
705                         // ファイル一覧バグ修正\r
706 //                      if((Notify == YES) ||\r
707 //                         (DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(mirrordown_notify_dlg), GetMainHwnd(), MirrorDispListCallBack, (LPARAM)&Base) == YES))\r
708                         if(((AbortOnListError == NO) || (ListSts == FFFTP_SUCCESS)) && ((Notify == YES) ||\r
709                            (DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(mirrordown_notify_dlg), GetMainHwnd(), MirrorDispListCallBack, (LPARAM)&Base) == YES)))\r
710                         {\r
711                                 if(AskNoFullPathMode() == YES)\r
712                                 {\r
713                                         strcpy(Pkt.Cmd, "SETCUR");\r
714                                         AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
715                                         AddTransFileList(&Pkt);\r
716                                 }\r
717                                 AppendTransFileList(Base);\r
718 \r
719                                 if(AskNoFullPathMode() == YES)\r
720                                 {\r
721                                         strcpy(Pkt.Cmd, "BACKCUR");\r
722                                         AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
723                                         AddTransFileList(&Pkt);\r
724                                 }\r
725 \r
726                                 // 同時接続対応\r
727 //                              strcpy(Pkt.Cmd, "GOQUIT");\r
728 //                              AddTransFileList(&Pkt);\r
729                         }\r
730                         else\r
731                                 EraseTmpTransFileList(&Base);\r
732 \r
733                         // バグ対策\r
734                         AddNullTransFileList();\r
735 \r
736                         DeleteFileList(&LocalListBase);\r
737                         DeleteFileList(&RemoteListBase);\r
738 \r
739                         GoForwardTransWindow();\r
740                 }\r
741 \r
742                 EnableUserOpe();\r
743         }\r
744         return;\r
745 }\r
746 \r
747 \r
748 /*----- ミラーリングのファイル一覧を表示 --------------------------------------\r
749 *\r
750 *       Parameter\r
751 *               FILELIST *Local : ローカル側\r
752 *               FILELIST *Remote : リモート側\r
753 *\r
754 *       Return Value\r
755 *               なし\r
756 *----------------------------------------------------------------------------*/\r
757 \r
758 static void DispMirrorFiles(FILELIST *Local, FILELIST *Remote)\r
759 {\r
760         char Date[80];\r
761         SYSTEMTIME sTime;\r
762         FILETIME fTime;\r
763 \r
764         if(DebugConsole == YES)\r
765         {\r
766                 DoPrintf("---- MIRROR FILE LIST ----");\r
767                 while(Local != NULL)\r
768                 {\r
769                         FileTimeToLocalFileTime(&Local->Time, &fTime);\r
770                         FileTimeToSystemTime(&fTime, &sTime);\r
771                         sprintf(Date, "%04d/%02d/%02d %02d:%02d:%02d.%04d", \r
772                                 sTime.wYear, sTime.wMonth, sTime.wDay, sTime.wHour, sTime.wMinute, sTime.wSecond, sTime.wMilliseconds);\r
773                         DoPrintf("LOCAL  : %s %s [%s] %s", Local->Attr==1?"YES":"NO ", Local->Node==NODE_DIR?"DIR ":"FILE", Date, Local->File);\r
774                         Local = Local->Next;\r
775                 }\r
776                 while(Remote != NULL)\r
777                 {\r
778                         FileTimeToLocalFileTime(&Remote->Time, &fTime);\r
779                         FileTimeToSystemTime(&fTime, &sTime);\r
780                         sprintf(Date, "%04d/%02d/%02d %02d:%02d:%02d.%04d", \r
781                                 sTime.wYear, sTime.wMonth, sTime.wDay, sTime.wHour, sTime.wMinute, sTime.wSecond, sTime.wMilliseconds);\r
782                         DoPrintf("REMOTE : %s %s [%s] %s", Remote->Attr==1?"YES":"NO ", Remote->Node==NODE_DIR?"DIR ":"FILE", Date, Remote->File);\r
783                         Remote = Remote->Next;\r
784                 }\r
785                 DoPrintf("---- END ----");\r
786         }\r
787         return;\r
788 }\r
789 \r
790 \r
791 /*----- ミラーリング時のローカル側のフォルダ削除 ------------------------------\r
792 *\r
793 *       Parameter\r
794 *               FILELIST *Local : ファイルリスト\r
795 *               TRANSPACKET *Pkt : \r
796 *               TRANSPACKET **Base : \r
797 *\r
798 *       Return Value\r
799 *               なし\r
800 *----------------------------------------------------------------------------*/\r
801 \r
802 static void MirrorDeleteAllLocalDir(FILELIST *Local, TRANSPACKET *Pkt, TRANSPACKET **Base)\r
803 {\r
804         while(Local != NULL)\r
805         {\r
806                 if(Local->Node == NODE_DIR)\r
807                 {\r
808                         MirrorDeleteAllLocalDir(Local->Next, Pkt, Base);\r
809 \r
810                         if(Local->Attr == YES)\r
811                         {\r
812                                 AskLocalCurDir(Pkt->LocalFile, FMAX_PATH);\r
813                                 SetYenTail(Pkt->LocalFile);\r
814                                 strcat(Pkt->LocalFile, Local->File);\r
815                                 ReplaceAll(Pkt->LocalFile, '/', '\\');\r
816                                 strcpy(Pkt->RemoteFile, "");\r
817                                 strcpy(Pkt->Cmd, "L-RMD ");\r
818                                 AddTmpTransFileList(Pkt, Base);\r
819                         }\r
820                         break;\r
821                 }\r
822                 Local = Local->Next;\r
823         }\r
824         return;\r
825 }\r
826 \r
827 \r
828 /*----- ファイル名のセミコロン以降を取り除く ----------------------------------\r
829 *\r
830 *       Parameter\r
831 *               char *Path : ファイル名\r
832 *\r
833 *       Return Value\r
834 *               なし\r
835 *\r
836 *       Note\r
837 *               Pathの内容が書き換えられる\r
838 *               オプション設定によって処理を切替える\r
839 *----------------------------------------------------------------------------*/\r
840 \r
841 static void RemoveAfterSemicolon(char *Path)\r
842 {\r
843         char *Pos;\r
844 \r
845         if(VaxSemicolon == YES)\r
846         {\r
847                 if((Pos = strchr(Path, ';')) != NULL)\r
848                         *Pos = NUL;\r
849         }\r
850         return;\r
851 }\r
852 \r
853 \r
854 /*----- ローカルに同じ名前のファイルがないかチェック --------------------------\r
855 *\r
856 *       Parameter\r
857 *               TRANSPACKET *Pkt : 転送ファイル情報\r
858 *\r
859 *       Return Value\r
860 *               int 処理方法\r
861 *                       EXIST_OVW/EXIST_RESUME/EXIST_IGNORE\r
862 *\r
863 *       Note\r
864 *               Pkt.ExistSize, ExistMode、ExistNotify が変更される\r
865 *----------------------------------------------------------------------------*/\r
866 \r
867 static int CheckLocalFile(TRANSPACKET *Pkt)\r
868 {\r
869         HANDLE fHnd;\r
870         WIN32_FIND_DATA Find;\r
871         int Ret;\r
872 \r
873         Ret = EXIST_OVW;\r
874         Pkt->ExistSize = 0;\r
875         if(RecvMode != TRANS_OVW)\r
876         {\r
877                 if((fHnd = FindFirstFile(Pkt->LocalFile, &Find)) != INVALID_HANDLE_VALUE)\r
878                 {\r
879                         FindClose(fHnd);\r
880 \r
881                         Pkt->ExistSize = MakeLongLong(Find.nFileSizeHigh, Find.nFileSizeLow);\r
882 \r
883                         if(ExistNotify == YES)\r
884                         {\r
885                                 SoundPlay(SND_ERROR);\r
886                                 if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(down_exist_dlg), GetMainHwnd(), DownExistDialogCallBack, (LPARAM)Pkt) == NO)\r
887                                         Ret = EXIST_ABORT;\r
888                                 else\r
889                                         Ret = ExistMode;\r
890                         }\r
891                         else\r
892                                 Ret = ExistMode;\r
893 \r
894                         if(Ret == EXIST_NEW)\r
895                         {\r
896                                 /*ファイル日付チェック */\r
897                                 if(CompareFileTime(&Find.ftLastWriteTime, &Pkt->Time) < 0)\r
898                                         Ret = EXIST_OVW;\r
899                                 else\r
900                                         Ret = EXIST_IGNORE;\r
901                         }\r
902                         // 同じ名前のファイルの処理方法追加\r
903                         if(Ret == EXIST_LARGE)\r
904                         {\r
905                                 if(MakeLongLong(Find.nFileSizeHigh, Find.nFileSizeLow) < Pkt->Size)\r
906                                         Ret = EXIST_OVW;\r
907                                 else\r
908                                         Ret = EXIST_IGNORE;\r
909                         }\r
910                 }\r
911         }\r
912         return(Ret);\r
913 }\r
914 \r
915 \r
916 /*----- ローカルに同じ名前のファイルがある時の確認ダイアログのコールバック ----\r
917 *\r
918 *       Parameter\r
919 *               HWND hDlg : ウインドウハンドル\r
920 *               UINT message : メッセージ番号\r
921 *               WPARAM wParam : メッセージの WPARAM 引数\r
922 *               LPARAM lParam : メッセージの LPARAM 引数\r
923 *\r
924 *       Return Value\r
925 *               BOOL TRUE/FALSE\r
926 *----------------------------------------------------------------------------*/\r
927 \r
928 // 64ビット対応\r
929 //static BOOL CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
930 static INT_PTR CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
931 {\r
932         static TRANSPACKET *Pkt;\r
933         // 同じ名前のファイルの処理方法追加\r
934 //      static const RADIOBUTTON DownExistButton[] = {\r
935 //              { DOWN_EXIST_OVW, EXIST_OVW },\r
936 //              { DOWN_EXIST_NEW, EXIST_NEW },\r
937 //              { DOWN_EXIST_RESUME, EXIST_RESUME },\r
938 //              { DOWN_EXIST_IGNORE, EXIST_IGNORE }\r
939 //      };\r
940         static const RADIOBUTTON DownExistButton[] = {\r
941                 { DOWN_EXIST_OVW, EXIST_OVW },\r
942                 { DOWN_EXIST_NEW, EXIST_NEW },\r
943                 { DOWN_EXIST_RESUME, EXIST_RESUME },\r
944                 { DOWN_EXIST_IGNORE, EXIST_IGNORE },\r
945                 { DOWN_EXIST_LARGE, EXIST_LARGE }\r
946         };\r
947         #define DOWNEXISTBUTTONS        (sizeof(DownExistButton)/sizeof(RADIOBUTTON))\r
948 \r
949         switch (iMessage)\r
950         {\r
951                 case WM_INITDIALOG :\r
952                         Pkt = (TRANSPACKET *)lParam;\r
953                         SendDlgItemMessage(hDlg, DOWN_EXIST_NAME, EM_LIMITTEXT, FMAX_PATH, 0);\r
954                         SendDlgItemMessage(hDlg, DOWN_EXIST_NAME, WM_SETTEXT, 0, (LPARAM)Pkt->LocalFile);\r
955 \r
956                         if((Pkt->Type == TYPE_A) || (Pkt->ExistSize <= 0))\r
957                                 EnableWindow(GetDlgItem(hDlg, DOWN_EXIST_RESUME), FALSE);\r
958 \r
959                         SetRadioButtonByValue(hDlg, ExistMode, DownExistButton, DOWNEXISTBUTTONS);\r
960                         return(TRUE);\r
961 \r
962                 case WM_COMMAND :\r
963                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
964                         {\r
965                                 case IDOK_ALL :\r
966                                         ExistNotify = NO;\r
967                                         /* ここに break はない */\r
968 \r
969                                 case IDOK :\r
970                                         ExistMode = AskRadioButtonValue(hDlg, DownExistButton, DOWNEXISTBUTTONS);\r
971                                         SendDlgItemMessage(hDlg, DOWN_EXIST_NAME, WM_GETTEXT, FMAX_PATH, (LPARAM)Pkt->LocalFile);\r
972                                         EndDialog(hDlg, YES);\r
973                                         break;\r
974 \r
975                                 case IDCANCEL :\r
976 //                                      ExistMode = EXIST_ABORT;\r
977                                         EndDialog(hDlg, NO);\r
978                                         break;\r
979 \r
980                                 case IDHELP :\r
981                                         hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000009);\r
982                                         break;\r
983                         }\r
984             return(TRUE);\r
985         }\r
986         return(FALSE);\r
987 }\r
988 \r
989 \r
990 \r
991 \r
992 \r
993 \r
994 /*----- ファイル一覧で指定されたファイルをアップロードする --------------------\r
995 *\r
996 *       Parameter\r
997 *               int ChName : 名前を変えるかどうか (YES/NO)\r
998 *               int All : 全てが選ばれている物として扱うかどうか (YES/NO)\r
999 *\r
1000 *       Return Value\r
1001 *               なし\r
1002 *----------------------------------------------------------------------------*/\r
1003 \r
1004 // ディレクトリ自動作成\r
1005 // リモート側のパスから必要なディレクトリを作成\r
1006 int MakeDirFromRemotePath(char* RemoteFile, char* Old, int FirstAdd)\r
1007 {\r
1008         TRANSPACKET Pkt;\r
1009         TRANSPACKET Pkt1;\r
1010         char* pDelimiter;\r
1011         char* pNext;\r
1012         char* Cat;\r
1013         int Len;\r
1014         int Make;\r
1015         pDelimiter = RemoteFile;\r
1016         Make = NO;\r
1017         while(pNext = strchr(pDelimiter, '/'))\r
1018         {\r
1019                 Len = pNext - RemoteFile;\r
1020                 strncpy(Pkt.RemoteFile, RemoteFile, Len);\r
1021                 Pkt.RemoteFile[Len] = '\0';\r
1022                 if(strncmp(RemoteFile, Old, Len + 1) != 0)\r
1023                 {\r
1024                         Cat = Pkt.RemoteFile + (pDelimiter - RemoteFile);\r
1025                         if(FnameCnv == FNAME_LOWER)\r
1026                                 _mbslwr(Cat);\r
1027                         else if(FnameCnv == FNAME_UPPER)\r
1028                                 _mbsupr(Cat);\r
1029 #if defined(HAVE_TANDEM)\r
1030                         Pkt.FileCode = 0;\r
1031                         Pkt.PriExt = DEF_PRIEXT;\r
1032                         Pkt.SecExt = DEF_SECEXT;\r
1033                         Pkt.MaxExt = DEF_MAXEXT;\r
1034 #endif\r
1035                         ReplaceAll(Pkt.RemoteFile, '\\', '/');\r
1036 \r
1037                         if(AskHostType() == HTYPE_ACOS)\r
1038                         {\r
1039                                 strcpy(Pkt.RemoteFile, "'");\r
1040                                 strcat(Pkt.RemoteFile, AskHostLsName());\r
1041                                 strcat(Pkt.RemoteFile, "(");\r
1042                                 strcat(Pkt.RemoteFile, Cat);\r
1043                                 strcat(Pkt.RemoteFile, ")");\r
1044                                 strcat(Pkt.RemoteFile, "'");\r
1045                         }\r
1046                         else if(AskHostType() == HTYPE_ACOS_4)\r
1047                                 strcpy(Pkt.RemoteFile, Cat);\r
1048 \r
1049                         if((FirstAdd == YES) && (AskNoFullPathMode() == YES))\r
1050                         {\r
1051                                 strcpy(Pkt1.Cmd, "SETCUR");\r
1052                                 AskRemoteCurDir(Pkt1.RemoteFile, FMAX_PATH);\r
1053                                 AddTransFileList(&Pkt1);\r
1054                         }\r
1055                         FirstAdd = NO;\r
1056                         strcpy(Pkt.Cmd, "MKD ");\r
1057                         strcpy(Pkt.LocalFile, "");\r
1058                         AddTransFileList(&Pkt);\r
1059 \r
1060                         Make = YES;\r
1061                 }\r
1062                 pDelimiter = pNext + 1;\r
1063         }\r
1064         return Make;\r
1065 }\r
1066 \r
1067 void UploadListProc(int ChName, int All)\r
1068 {\r
1069         FILELIST *FileListBase;\r
1070         FILELIST *Pos;\r
1071         TRANSPACKET Pkt;\r
1072         TRANSPACKET Pkt1;\r
1073         char *Cat;\r
1074         FILELIST *RemoteList;\r
1075         char Tmp[FMAX_PATH+1];\r
1076         int FirstAdd;\r
1077         // ファイル一覧バグ修正\r
1078         int ListSts;\r
1079 \r
1080         // 同時接続対応\r
1081         CancelFlg = NO;\r
1082 \r
1083         if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
1084         {\r
1085                 DisableUserOpe();\r
1086 \r
1087                 // ローカル側で選ばれているファイルをFileListBaseに登録\r
1088                 FileListBase = NULL;\r
1089                 // ファイル一覧バグ修正\r
1090 //              MakeSelectedFileList(WIN_LOCAL, YES, All, &FileListBase, &CancelFlg);\r
1091                 ListSts = MakeSelectedFileList(WIN_LOCAL, YES, All, &FileListBase, &CancelFlg);\r
1092 \r
1093                 // 現在ホスト側のファイル一覧に表示されているものをRemoteListに登録\r
1094                 // 同名ファイルチェック用\r
1095                 RemoteList = NULL;\r
1096                 AddRemoteTreeToFileList(AskCurrentFileListNum(), "", RDIR_NONE, &RemoteList);\r
1097 \r
1098                 FirstAdd = YES;\r
1099                 ExistNotify = YES;\r
1100 \r
1101                 Pos = FileListBase;\r
1102                 while(Pos != NULL)\r
1103                 {\r
1104                         // ファイル一覧バグ修正\r
1105                         if((AbortOnListError == YES) && (ListSts == FFFTP_FAIL))\r
1106                                 break;\r
1107                         AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
1108                         SetSlashTail(Pkt.RemoteFile);\r
1109                         Cat = strchr(Pkt.RemoteFile, NUL);\r
1110                         if((ChName == NO) || (Pos->Node == NODE_DIR))\r
1111                         {\r
1112                                 strcat(Pkt.RemoteFile, Pos->File);\r
1113                                 if(FnameCnv == FNAME_LOWER)\r
1114                                         _mbslwr(Cat);\r
1115                                 else if(FnameCnv == FNAME_UPPER)\r
1116                                         _mbsupr(Cat);\r
1117 #if defined(HAVE_TANDEM)\r
1118                                 Pkt.FileCode = 0;\r
1119                                 Pkt.PriExt = DEF_PRIEXT;\r
1120                                 Pkt.SecExt = DEF_SECEXT;\r
1121                                 Pkt.MaxExt = DEF_MAXEXT;\r
1122 #endif\r
1123                         }\r
1124                         else\r
1125                         {\r
1126                                 // 名前を変更する\r
1127                                 strcpy(TmpString, Pos->File);\r
1128                                 CurWin = WIN_LOCAL;\r
1129 #if defined(HAVE_TANDEM)\r
1130                                 strcpy(TmpFileCode, "0"); /* ASCII モードの場合は無視される */\r
1131                                 if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) {\r
1132                                         if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(updown_as_with_ext_dlg), GetMainHwnd(), UpDownAsWithExtDialogCallBack) == YES) {\r
1133                                                 strcat(Pkt.RemoteFile, TmpString);\r
1134                                                 Pkt.FileCode = atoi(TmpFileCode);\r
1135                                         } else {\r
1136                                                 break;\r
1137                                         }\r
1138                                 } else\r
1139 #endif\r
1140                                 if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(updown_as_dlg), GetMainHwnd(), UpDownAsDialogCallBack) == YES)\r
1141                                         strcat(Pkt.RemoteFile, TmpString);\r
1142                                 else\r
1143                                         break;\r
1144                         }\r
1145                         // バグ修正\r
1146                         AskRemoteCurDir(Tmp, FMAX_PATH);\r
1147                         SetSlashTail(Tmp);\r
1148                         if(strncmp(Pkt.RemoteFile, Tmp, strlen(Tmp)) != 0)\r
1149                         {\r
1150                                 if((Cat = strrchr(Pkt.RemoteFile, '/')) != NULL)\r
1151                                         Cat++;\r
1152                                 else\r
1153                                         Cat = Pkt.RemoteFile;\r
1154                         }\r
1155                         ReplaceAll(Pkt.RemoteFile, '\\', '/');\r
1156 \r
1157                         if(AskHostType() == HTYPE_ACOS)\r
1158                         {\r
1159                                 strcpy(Pkt.RemoteFile, "'");\r
1160                                 strcat(Pkt.RemoteFile, AskHostLsName());\r
1161                                 strcat(Pkt.RemoteFile, "(");\r
1162                                 strcat(Pkt.RemoteFile, Cat);\r
1163                                 strcat(Pkt.RemoteFile, ")");\r
1164                                 strcat(Pkt.RemoteFile, "'");\r
1165                         }\r
1166                         else if(AskHostType() == HTYPE_ACOS_4)\r
1167                                 strcpy(Pkt.RemoteFile, Cat);\r
1168 \r
1169                         if(Pos->Node == NODE_DIR)\r
1170                         {\r
1171                                 // フォルダの場合\r
1172 \r
1173                                 // ホスト側のファイル一覧をRemoteListに登録\r
1174                                 // 同名ファイルチェック用\r
1175                                 if(RemoteList != NULL)\r
1176                                         DeleteFileList(&RemoteList);\r
1177                                 RemoteList = NULL;\r
1178 \r
1179                                 AskRemoteCurDir(Tmp, FMAX_PATH);\r
1180                                 if(DoCWD(Pkt.RemoteFile, NO, NO, NO) == FTP_COMPLETE)\r
1181                                 {\r
1182                                         if(DoDirListCmdSkt("", "", 998, &CancelFlg) == FTP_COMPLETE)\r
1183                                                 AddRemoteTreeToFileList(998, "", RDIR_NONE, &RemoteList);\r
1184                                         DoCWD(Tmp, NO, NO, NO);\r
1185                                 }\r
1186                                 else\r
1187                                 {\r
1188                                         // フォルダを作成\r
1189                                         if((FirstAdd == YES) && (AskNoFullPathMode() == YES))\r
1190                                         {\r
1191                                                 strcpy(Pkt1.Cmd, "SETCUR");\r
1192                                                 AskRemoteCurDir(Pkt1.RemoteFile, FMAX_PATH);\r
1193                                                 AddTransFileList(&Pkt1);\r
1194                                         }\r
1195                                         FirstAdd = NO;\r
1196                                         strcpy(Pkt.Cmd, "MKD ");\r
1197                                         strcpy(Pkt.LocalFile, "");\r
1198                                         AddTransFileList(&Pkt);\r
1199                                 }\r
1200                         }\r
1201                         else if(Pos->Node == NODE_FILE)\r
1202                         {\r
1203                                 // ファイルの場合\r
1204                                 AskLocalCurDir(Pkt.LocalFile, FMAX_PATH);\r
1205                                 SetYenTail(Pkt.LocalFile);\r
1206                                 strcat(Pkt.LocalFile, Pos->File);\r
1207                                 ReplaceAll(Pkt.LocalFile, '/', '\\');\r
1208 \r
1209                                 strcpy(Pkt.Cmd, "STOR ");\r
1210                                 Pkt.Type = AskTransferTypeAssoc(Pkt.LocalFile, AskTransferType());\r
1211                                 // バグ修正\r
1212 //                              Pkt.Size = 0;\r
1213                                 Pkt.Size = Pos->Size;\r
1214                                 Pkt.Time = Pos->Time;\r
1215                                 Pkt.Attr = AskUploadFileAttr(Pkt.RemoteFile);\r
1216                                 Pkt.KanjiCode = AskHostKanjiCode();\r
1217                                 // UTF-8対応\r
1218                                 Pkt.KanjiCodeDesired = AskLocalKanjiCode();\r
1219                                 Pkt.KanaCnv = AskHostKanaCnv();\r
1220 #if defined(HAVE_TANDEM)\r
1221                                 if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) {\r
1222                                         CalcExtentSize(&Pkt, Pos->Size);\r
1223                                 }\r
1224 #endif\r
1225                                 // ディレクトリ自動作成\r
1226                                 strcpy(Tmp, Pkt.RemoteFile);\r
1227                                 Pkt.Mode = CheckRemoteFile(&Pkt, RemoteList);\r
1228                                 // ミラーリング設定追加\r
1229                                 Pkt.NoTransfer = NO;\r
1230                                 if(Pkt.Mode == EXIST_ABORT)\r
1231                                         break;\r
1232                                 else if(Pkt.Mode != EXIST_IGNORE)\r
1233                                 {\r
1234                                         // ディレクトリ自動作成\r
1235                                         if(MakeAllDir == YES)\r
1236                                         {\r
1237                                                 if(MakeDirFromRemotePath(Pkt.RemoteFile, Tmp, FirstAdd) == YES)\r
1238                                                         FirstAdd = NO;\r
1239                                         }\r
1240                                         if((FirstAdd == YES) && (AskNoFullPathMode() == YES))\r
1241                                         {\r
1242                                                 strcpy(Pkt1.Cmd, "SETCUR");\r
1243                                                 AskRemoteCurDir(Pkt1.RemoteFile, FMAX_PATH);\r
1244                                                 AddTransFileList(&Pkt1);\r
1245                                         }\r
1246                                         FirstAdd = NO;\r
1247                                         AddTransFileList(&Pkt);\r
1248                                 }\r
1249                         }\r
1250                         Pos = Pos->Next;\r
1251                 }\r
1252 \r
1253                 if((FirstAdd == NO) && (AskNoFullPathMode() == YES))\r
1254                 {\r
1255                         strcpy(Pkt.Cmd, "BACKCUR");\r
1256                         AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
1257                         AddTransFileList(&Pkt);\r
1258                 }\r
1259 \r
1260                 if(RemoteList != NULL)\r
1261                         DeleteFileList(&RemoteList);\r
1262 \r
1263                 DeleteFileList(&FileListBase);\r
1264 \r
1265                 // 同時接続対応\r
1266 //              strcpy(Pkt.Cmd, "GOQUIT");\r
1267 //              AddTransFileList(&Pkt);\r
1268 \r
1269                 // バグ対策\r
1270                 AddNullTransFileList();\r
1271 \r
1272                 GoForwardTransWindow();\r
1273 \r
1274                 EnableUserOpe();\r
1275         }\r
1276         return;\r
1277 }\r
1278 \r
1279 \r
1280 /*----- ドラッグ&ドロップで指定されたファイルをアップロードする --------------\r
1281 *\r
1282 *       Parameter\r
1283 *               WPARAM wParam : ドロップされたファイルの情報\r
1284 *\r
1285 *       Return Value\r
1286 *               なし\r
1287 *----------------------------------------------------------------------------*/\r
1288 \r
1289 void UploadDragProc(WPARAM wParam)\r
1290 {\r
1291         FILELIST *FileListBase;\r
1292         FILELIST *Pos;\r
1293         TRANSPACKET Pkt;\r
1294         TRANSPACKET Pkt1;\r
1295         char *Cat;\r
1296         FILELIST *RemoteList;\r
1297         char Tmp[FMAX_PATH+1];\r
1298         int FirstAdd;\r
1299         char Cur[FMAX_PATH+1];\r
1300 \r
1301         // 同時接続対応\r
1302         CancelFlg = NO;\r
1303 \r
1304         if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
1305         {\r
1306                 DisableUserOpe();\r
1307 \r
1308                 // ローカル側で選ばれているファイルをFileListBaseに登録\r
1309                 FileListBase = NULL;\r
1310                 MakeDroppedFileList(wParam, Cur, &FileListBase);\r
1311 \r
1312                 // 現在ホスト側のファイル一覧に表示されているものをRemoteListに登録\r
1313                 // 同名ファイルチェック用\r
1314                 RemoteList = NULL;\r
1315                 AddRemoteTreeToFileList(AskCurrentFileListNum(), "", RDIR_NONE, &RemoteList);\r
1316 \r
1317                 FirstAdd = YES;\r
1318                 ExistNotify = YES;\r
1319 \r
1320                 Pos = FileListBase;\r
1321                 while(Pos != NULL)\r
1322                 {\r
1323                         AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
1324                         SetSlashTail(Pkt.RemoteFile);\r
1325                         Cat = strchr(Pkt.RemoteFile, NUL);\r
1326 \r
1327                         strcat(Pkt.RemoteFile, Pos->File);\r
1328                         if(FnameCnv == FNAME_LOWER)\r
1329                                 _mbslwr(Cat);\r
1330                         else if(FnameCnv == FNAME_UPPER)\r
1331                                 _mbsupr(Cat);\r
1332                         ReplaceAll(Pkt.RemoteFile, '\\', '/');\r
1333 #if defined(HAVE_TANDEM)\r
1334                         Pkt.FileCode = 0;\r
1335                         Pkt.PriExt = DEF_PRIEXT;\r
1336                         Pkt.SecExt = DEF_SECEXT;\r
1337                         Pkt.MaxExt = DEF_MAXEXT;\r
1338 #endif\r
1339 \r
1340                         if(AskHostType() == HTYPE_ACOS)\r
1341                         {\r
1342                                 strcpy(Pkt.RemoteFile, "'");\r
1343                                 strcat(Pkt.RemoteFile, AskHostLsName());\r
1344                                 strcat(Pkt.RemoteFile, "(");\r
1345                                 strcat(Pkt.RemoteFile, Cat);\r
1346                                 strcat(Pkt.RemoteFile, ")");\r
1347                                 strcat(Pkt.RemoteFile, "'");\r
1348                         }\r
1349                         else if(AskHostType() == HTYPE_ACOS_4)\r
1350                                 strcpy(Pkt.RemoteFile, Cat);\r
1351 \r
1352                         if(Pos->Node == NODE_DIR)\r
1353                         {\r
1354                                 // フォルダの場合\r
1355 \r
1356                                 // ホスト側のファイル一覧をRemoteListに登録\r
1357                                 // 同名ファイルチェック用\r
1358                                 if(RemoteList != NULL)\r
1359                                         DeleteFileList(&RemoteList);\r
1360                                 RemoteList = NULL;\r
1361 \r
1362                                 AskRemoteCurDir(Tmp, FMAX_PATH);\r
1363                                 if(DoCWD(Pkt.RemoteFile, NO, NO, NO) == FTP_COMPLETE)\r
1364                                 {\r
1365                                         if(DoDirListCmdSkt("", "", 998, &CancelFlg) == FTP_COMPLETE)\r
1366                                                 AddRemoteTreeToFileList(998, "", RDIR_NONE, &RemoteList);\r
1367                                         DoCWD(Tmp, NO, NO, NO);\r
1368                                 }\r
1369                                 else\r
1370                                 {\r
1371                                         if((FirstAdd == YES) && (AskNoFullPathMode() == YES))\r
1372                                         {\r
1373                                                 strcpy(Pkt1.Cmd, "SETCUR");\r
1374                                                 AskRemoteCurDir(Pkt1.RemoteFile, FMAX_PATH);\r
1375                                                 AddTransFileList(&Pkt1);\r
1376                                         }\r
1377                                         FirstAdd = NO;\r
1378                                         strcpy(Pkt.Cmd, "MKD ");\r
1379                                         strcpy(Pkt.LocalFile, "");\r
1380                                         AddTransFileList(&Pkt);\r
1381                                 }\r
1382                         }\r
1383                         else if(Pos->Node == NODE_FILE)\r
1384                         {\r
1385                                 // ファイルの場合\r
1386                                 strcpy(Pkt.LocalFile, Cur);\r
1387                                 SetYenTail(Pkt.LocalFile);\r
1388                                 strcat(Pkt.LocalFile, Pos->File);\r
1389                                 ReplaceAll(Pkt.LocalFile, '/', '\\');\r
1390 \r
1391                                 strcpy(Pkt.Cmd, "STOR ");\r
1392                                 Pkt.Type = AskTransferTypeAssoc(Pkt.LocalFile, AskTransferType());\r
1393                                 // バグ修正\r
1394 //                              Pkt.Size = 0;\r
1395                                 Pkt.Size = Pos->Size;\r
1396                                 Pkt.Time = Pos->Time;\r
1397                                 Pkt.Attr = AskUploadFileAttr(Pkt.RemoteFile);\r
1398                                 Pkt.KanjiCode = AskHostKanjiCode();\r
1399                                 // UTF-8対応\r
1400                                 Pkt.KanjiCodeDesired = AskLocalKanjiCode();\r
1401                                 Pkt.KanaCnv = AskHostKanaCnv();\r
1402 #if defined(HAVE_TANDEM)\r
1403                                 if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) {\r
1404                                         int a = Pos->InfoExist && FINFO_SIZE;\r
1405                                         CalcExtentSize(&Pkt, Pos->Size);\r
1406                                 }\r
1407 #endif\r
1408                                 // ディレクトリ自動作成\r
1409                                 strcpy(Tmp, Pkt.RemoteFile);\r
1410                                 Pkt.Mode = CheckRemoteFile(&Pkt, RemoteList);\r
1411                                 // ミラーリング設定追加\r
1412                                 Pkt.NoTransfer = NO;\r
1413                                 if(Pkt.Mode == EXIST_ABORT)\r
1414                                         break;\r
1415                                 else if(Pkt.Mode != EXIST_IGNORE)\r
1416                                 {\r
1417                                         // ディレクトリ自動作成\r
1418                                         if(MakeAllDir == YES)\r
1419                                         {\r
1420                                                 if(MakeDirFromRemotePath(Pkt.RemoteFile, Tmp, FirstAdd) == YES)\r
1421                                                         FirstAdd = NO;\r
1422                                         }\r
1423                                         if((FirstAdd == YES) && (AskNoFullPathMode() == YES))\r
1424                                         {\r
1425                                                 strcpy(Pkt1.Cmd, "SETCUR");\r
1426                                                 AskRemoteCurDir(Pkt1.RemoteFile, FMAX_PATH);\r
1427                                                 AddTransFileList(&Pkt1);\r
1428                                         }\r
1429                                         FirstAdd = NO;\r
1430                                         AddTransFileList(&Pkt);\r
1431                                 }\r
1432                         }\r
1433                         Pos = Pos->Next;\r
1434                 }\r
1435 \r
1436                 if((FirstAdd == NO) && (AskNoFullPathMode() == YES))\r
1437                 {\r
1438                         strcpy(Pkt.Cmd, "BACKCUR");\r
1439                         AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
1440                         AddTransFileList(&Pkt);\r
1441                 }\r
1442 \r
1443                 if(RemoteList != NULL)\r
1444                         DeleteFileList(&RemoteList);\r
1445 \r
1446                 DeleteFileList(&FileListBase);\r
1447 \r
1448                 // 同時接続対応\r
1449 //              strcpy(Pkt.Cmd, "GOQUIT");\r
1450 //              AddTransFileList(&Pkt);\r
1451 \r
1452                 // バグ対策\r
1453                 AddNullTransFileList();\r
1454 \r
1455                 GoForwardTransWindow();\r
1456 \r
1457                 EnableUserOpe();\r
1458         }\r
1459         return;\r
1460 }\r
1461 \r
1462 \r
1463 /*----- ミラーリングアップロードを行う ----------------------------------------\r
1464 *\r
1465 *       Parameter\r
1466 *               int Notify : 確認を行うかどうか (YES/NO)\r
1467 *\r
1468 *       Return Value\r
1469 *               なし\r
1470 *----------------------------------------------------------------------------*/\r
1471 \r
1472 void MirrorUploadProc(int Notify)\r
1473 {\r
1474         FILELIST *LocalListBase;\r
1475         FILELIST *RemoteListBase;\r
1476         FILELIST *LocalPos;\r
1477         FILELIST *RemotePos;\r
1478         TRANSPACKET Pkt;\r
1479         TRANSPACKET *Base;\r
1480         char Name[FMAX_PATH+1];\r
1481         char *Cat;\r
1482         int Level;\r
1483         int Mode;\r
1484         SYSTEMTIME TmpStime;\r
1485         FILETIME TmpFtimeL;\r
1486         FILETIME TmpFtimeR;\r
1487         // ファイル一覧バグ修正\r
1488         int ListSts;\r
1489 \r
1490         // 同時接続対応\r
1491         CancelFlg = NO;\r
1492 \r
1493         if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
1494         {\r
1495                 DisableUserOpe();\r
1496 \r
1497                 Base = NULL;\r
1498 \r
1499                 if(Notify == YES)\r
1500                         Notify = DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(mirror_up_dlg), GetMainHwnd(), MirrorNotifyCallBack, 1);\r
1501                 else\r
1502                         Notify = YES;\r
1503 \r
1504                 if((Notify == YES) || (Notify == YES_LIST))\r
1505                 {\r
1506                         /*===== ファイルリスト取得 =====*/\r
1507 \r
1508                         LocalListBase = NULL;\r
1509                         // ファイル一覧バグ修正\r
1510 //                      MakeSelectedFileList(WIN_LOCAL, YES, YES, &LocalListBase, &CancelFlg);\r
1511                         ListSts = MakeSelectedFileList(WIN_LOCAL, YES, YES, &LocalListBase, &CancelFlg);\r
1512                         RemoteListBase = NULL;\r
1513                         // ファイル一覧バグ修正\r
1514 //                      MakeSelectedFileList(WIN_REMOTE, YES, YES, &RemoteListBase, &CancelFlg);\r
1515                         if(ListSts == FFFTP_SUCCESS)\r
1516                                 ListSts = MakeSelectedFileList(WIN_REMOTE, YES, YES, &RemoteListBase, &CancelFlg);\r
1517 \r
1518                         LocalPos = LocalListBase;\r
1519                         while(LocalPos != NULL)\r
1520                         {\r
1521                                 LocalPos->Attr = YES;           /* LocalPos->Attrは転送するかどうかのフラグに使用 (YES/NO) */\r
1522                                 LocalPos = LocalPos->Next;\r
1523                         }\r
1524 \r
1525                         RemotePos = RemoteListBase;\r
1526                         while(RemotePos != NULL)\r
1527                         {\r
1528                                 if(AskMirrorNoTrn(RemotePos->File, 1) == NO)\r
1529                                 {\r
1530                                         RemotePos->Attr = YES;\r
1531                                         RemotePos = RemotePos->Next;\r
1532                                 }\r
1533                                 else\r
1534                                 {\r
1535                                         RemotePos->Attr = NO;   /* RemotePos->Attrは削除するかどうかのフラグに使用 (YES/NO) */\r
1536 \r
1537                                         if(RemotePos->Node == NODE_DIR)\r
1538                                         {\r
1539                                                 Level = AskDirLevel(RemotePos->File);\r
1540                                                 RemotePos = RemotePos->Next;\r
1541                                                 while(RemotePos != NULL)\r
1542                                                 {\r
1543                                                         if((RemotePos->Node == NODE_DIR) &&\r
1544                                                            (AskDirLevel(RemotePos->File) <= Level))\r
1545                                                         {\r
1546                                                                 break;\r
1547                                                         }\r
1548                                                         RemotePos->Attr = NO;\r
1549                                                         RemotePos = RemotePos->Next;\r
1550                                                 }\r
1551                                         }\r
1552                                         else\r
1553                                                 RemotePos = RemotePos->Next;\r
1554                                 }\r
1555                         }\r
1556 \r
1557                         /*===== ファイルリスト比較 =====*/\r
1558 \r
1559                         LocalPos = LocalListBase;\r
1560                         while(LocalPos != NULL)\r
1561                         {\r
1562                                 if(AskMirrorNoTrn(LocalPos->File, 0) == NO)\r
1563                                 {\r
1564                                         strcpy(Name, LocalPos->File);\r
1565                                         ReplaceAll(Name, '\\', '/');\r
1566 \r
1567                                         if(MirrorFnameCnv == YES)\r
1568                                                 Mode = COMP_LOWERMATCH;\r
1569                                         else\r
1570                                                 Mode = COMP_STRICT;\r
1571 \r
1572                                         if(LocalPos->Node == NODE_DIR)\r
1573                                         {\r
1574                                                 if((RemotePos = SearchFileList(Name, RemoteListBase, Mode)) != NULL)\r
1575                                                 {\r
1576                                                         if(RemotePos->Node == NODE_DIR)\r
1577                                                         {\r
1578                                                                 RemotePos->Attr = NO;\r
1579                                                                 LocalPos->Attr = NO;\r
1580                                                         }\r
1581                                                 }\r
1582                                         }\r
1583                                         else if(LocalPos->Node == NODE_FILE)\r
1584                                         {\r
1585                                                 if((RemotePos = SearchFileList(Name, RemoteListBase, Mode)) != NULL)\r
1586                                                 {\r
1587                                                         if(RemotePos->Node == NODE_FILE)\r
1588                                                         {\r
1589                                                                 FileTimeToLocalFileTime(&LocalPos->Time, &TmpFtimeL);\r
1590                                                                 FileTimeToLocalFileTime(&RemotePos->Time, &TmpFtimeR);\r
1591                                                                 if((RemotePos->InfoExist & FINFO_TIME) == 0)\r
1592                                                                 {\r
1593                                                                         FileTimeToSystemTime(&TmpFtimeL, &TmpStime);\r
1594                                                                         TmpStime.wHour = 0;\r
1595                                                                         TmpStime.wMinute = 0;\r
1596                                                                         TmpStime.wSecond = 0;\r
1597                                                                         TmpStime.wMilliseconds = 0;\r
1598                                                                         SystemTimeToFileTime(&TmpStime, &TmpFtimeL);\r
1599 \r
1600                                                                         FileTimeToSystemTime(&TmpFtimeR, &TmpStime);\r
1601                                                                         TmpStime.wHour = 0;\r
1602                                                                         TmpStime.wMinute = 0;\r
1603                                                                         TmpStime.wSecond = 0;\r
1604                                                                         TmpStime.wMilliseconds = 0;\r
1605                                                                         SystemTimeToFileTime(&TmpStime, &TmpFtimeR);\r
1606                                                                 }\r
1607                                                                 RemotePos->Attr = NO;\r
1608                                                                 if(CompareFileTime(&TmpFtimeL, &TmpFtimeR) <= 0)\r
1609                                                                         LocalPos->Attr = NO;\r
1610                                                         }\r
1611                                                 }\r
1612                                         }\r
1613 \r
1614                                         LocalPos = LocalPos->Next;\r
1615                                 }\r
1616                                 else\r
1617                                 {\r
1618                                         if(LocalPos->Node == NODE_FILE)\r
1619                                         {\r
1620                                                 LocalPos->Attr = NO;\r
1621                                                 LocalPos = LocalPos->Next;\r
1622                                         }\r
1623                                         else\r
1624                                         {\r
1625                                                 LocalPos->Attr = NO;\r
1626                                                 Level = AskDirLevel(LocalPos->File);\r
1627                                                 LocalPos = LocalPos->Next;\r
1628                                                 while(LocalPos != NULL)\r
1629                                                 {\r
1630                                                         if((LocalPos->Node == NODE_DIR) &&\r
1631                                                            (AskDirLevel(LocalPos->File) <= Level))\r
1632                                                         {\r
1633                                                                 break;\r
1634                                                         }\r
1635                                                         LocalPos->Attr = NO;\r
1636                                                         LocalPos = LocalPos->Next;\r
1637                                                 }\r
1638                                         }\r
1639                                 }\r
1640                         }\r
1641 \r
1642                         DispMirrorFiles(LocalListBase, RemoteListBase);\r
1643 \r
1644                         /*===== 削除/アップロード =====*/\r
1645 \r
1646                         RemotePos = RemoteListBase;\r
1647                         while(RemotePos != NULL)\r
1648                         {\r
1649                                 if((RemotePos->Attr == YES) && (RemotePos->Node == NODE_FILE))\r
1650                                 {\r
1651                                         AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
1652                                         SetSlashTail(Pkt.RemoteFile);\r
1653                                         strcat(Pkt.RemoteFile, RemotePos->File);\r
1654                                         ReplaceAll(Pkt.RemoteFile, '\\', '/');\r
1655                                         strcpy(Pkt.LocalFile, "");\r
1656                                         strcpy(Pkt.Cmd, "R-DELE ");\r
1657                                         AddTmpTransFileList(&Pkt, &Base);\r
1658                                 }\r
1659                                 RemotePos = RemotePos->Next;\r
1660                         }\r
1661                         MirrorDeleteAllDir(RemoteListBase, &Pkt, &Base);\r
1662 \r
1663                         LocalPos = LocalListBase;\r
1664                         while(LocalPos != NULL)\r
1665                         {\r
1666                                 if(LocalPos->Attr == YES)\r
1667                                 {\r
1668                                         AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
1669                                         SetSlashTail(Pkt.RemoteFile);\r
1670                                         Cat = strchr(Pkt.RemoteFile, NUL);\r
1671                                         strcat(Pkt.RemoteFile, LocalPos->File);\r
1672 \r
1673                                         if(MirrorFnameCnv == YES)\r
1674                                                 _mbslwr(Cat);\r
1675 \r
1676                                         ReplaceAll(Pkt.RemoteFile, '\\', '/');\r
1677 \r
1678                                         if(LocalPos->Node == NODE_DIR)\r
1679                                         {\r
1680                                                 strcpy(Pkt.LocalFile, "");\r
1681                                                 strcpy(Pkt.Cmd, "R-MKD ");\r
1682                                                 AddTmpTransFileList(&Pkt, &Base);\r
1683                                         }\r
1684                                         else if(LocalPos->Node == NODE_FILE)\r
1685                                         {\r
1686                                                 AskLocalCurDir(Pkt.LocalFile, FMAX_PATH);\r
1687                                                 SetYenTail(Pkt.LocalFile);\r
1688                                                 strcat(Pkt.LocalFile, LocalPos->File);\r
1689                                                 ReplaceAll(Pkt.LocalFile, '/', '\\');\r
1690 \r
1691                                                 strcpy(Pkt.Cmd, "STOR ");\r
1692                                                 Pkt.Type = AskTransferTypeAssoc(Pkt.LocalFile, AskTransferType());\r
1693                                                 // バグ修正\r
1694 //                                              Pkt.Size = 0;\r
1695                                                 Pkt.Size = LocalPos->Size;\r
1696                                                 Pkt.Time = LocalPos->Time;\r
1697                                                 Pkt.Attr = AskUploadFileAttr(Pkt.RemoteFile);\r
1698                                                 Pkt.KanjiCode = AskHostKanjiCode();\r
1699                                                 // UTF-8対応\r
1700                                                 Pkt.KanjiCodeDesired = AskLocalKanjiCode();\r
1701                                                 Pkt.KanaCnv = AskHostKanaCnv();\r
1702 #if defined(HAVE_TANDEM)\r
1703                                                 if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) {\r
1704                                                         CalcExtentSize(&Pkt, LocalPos->Size);\r
1705                                                 }\r
1706 #endif\r
1707                                                 Pkt.Mode = EXIST_OVW;\r
1708                                                 // ミラーリング設定追加\r
1709                                                 Pkt.NoTransfer = MirrorNoTransferContents;\r
1710                                                 AddTmpTransFileList(&Pkt, &Base);\r
1711                                         }\r
1712                                 }\r
1713                                 LocalPos = LocalPos->Next;\r
1714                         }\r
1715 \r
1716                         // ファイル一覧バグ修正\r
1717 //                      if((Notify == YES) ||\r
1718 //                         (DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(mirror_notify_dlg), GetMainHwnd(), MirrorDispListCallBack, (LPARAM)&Base) == YES))\r
1719                         if(((AbortOnListError == NO) || (ListSts == FFFTP_SUCCESS)) && ((Notify == YES) ||\r
1720                            (DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(mirror_notify_dlg), GetMainHwnd(), MirrorDispListCallBack, (LPARAM)&Base) == YES)))\r
1721                         {\r
1722                                 if(AskNoFullPathMode() == YES)\r
1723                                 {\r
1724                                         strcpy(Pkt.Cmd, "SETCUR");\r
1725                                         AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
1726                                         AddTransFileList(&Pkt);\r
1727                                 }\r
1728                                 AppendTransFileList(Base);\r
1729 \r
1730                                 if(AskNoFullPathMode() == YES)\r
1731                                 {\r
1732                                         strcpy(Pkt.Cmd, "BACKCUR");\r
1733                                         AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
1734                                         AddTransFileList(&Pkt);\r
1735                                 }\r
1736 \r
1737                                 // 同時接続対応\r
1738 //                              strcpy(Pkt.Cmd, "GOQUIT");\r
1739 //                              AddTransFileList(&Pkt);\r
1740                         }\r
1741                         else\r
1742                                 EraseTmpTransFileList(&Base);\r
1743 \r
1744                         // バグ対策\r
1745                         AddNullTransFileList();\r
1746 \r
1747                         DeleteFileList(&LocalListBase);\r
1748                         DeleteFileList(&RemoteListBase);\r
1749 \r
1750                         GoForwardTransWindow();\r
1751                 }\r
1752 \r
1753                 EnableUserOpe();\r
1754         }\r
1755         return;\r
1756 }\r
1757 \r
1758 \r
1759 /*----- ミラーリング時のホスト側のフォルダ削除 --------------------------------\r
1760 *\r
1761 *       Parameter\r
1762 *               FILELIST *Base : ファイルリスト\r
1763 *               TRANSPACKET *Pkt : \r
1764 *               TRANSPACKET **Base : \r
1765 *\r
1766 *       Return Value\r
1767 *               なし\r
1768 *----------------------------------------------------------------------------*/\r
1769 \r
1770 static void MirrorDeleteAllDir(FILELIST *Remote, TRANSPACKET *Pkt, TRANSPACKET **Base)\r
1771 {\r
1772         while(Remote != NULL)\r
1773         {\r
1774                 if(Remote->Node == NODE_DIR)\r
1775                 {\r
1776                         MirrorDeleteAllDir(Remote->Next, Pkt, Base);\r
1777 \r
1778                         if(Remote->Attr == YES)\r
1779                         {\r
1780                                 AskRemoteCurDir(Pkt->RemoteFile, FMAX_PATH);\r
1781                                 SetSlashTail(Pkt->RemoteFile);\r
1782                                 strcat(Pkt->RemoteFile, Remote->File);\r
1783                                 ReplaceAll(Pkt->RemoteFile, '\\', '/');\r
1784                                 strcpy(Pkt->LocalFile, "");\r
1785                                 strcpy(Pkt->Cmd, "R-RMD ");\r
1786                                 AddTmpTransFileList(Pkt, Base);\r
1787                         }\r
1788                         break;\r
1789                 }\r
1790                 Remote = Remote->Next;\r
1791         }\r
1792         return;\r
1793 }\r
1794 \r
1795 \r
1796 /*----- ミラーリングアップロード開始確認ウインドウのコールバック --------------\r
1797 *\r
1798 *       Parameter\r
1799 *               HWND hDlg : ウインドウハンドル\r
1800 *               UINT message : メッセージ番号\r
1801 *               WPARAM wParam : メッセージの WPARAM 引数\r
1802 *               LPARAM lParam : メッセージの LPARAM 引数\r
1803 *\r
1804 *       Return Value\r
1805 *               BOOL TRUE/FALSE\r
1806 *----------------------------------------------------------------------------*/\r
1807 \r
1808 // 64ビット対応\r
1809 //static BOOL CALLBACK MirrorNotifyCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
1810 static INT_PTR CALLBACK MirrorNotifyCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
1811 {\r
1812         static int Mode;\r
1813 \r
1814         switch (iMessage)\r
1815         {\r
1816                 case WM_INITDIALOG :\r
1817                         Mode = lParam;\r
1818                         return(TRUE);\r
1819 \r
1820                 case WM_COMMAND :\r
1821                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
1822                         {\r
1823                                 case IDOK :\r
1824                                         EndDialog(hDlg, YES);\r
1825                                         break;\r
1826 \r
1827                                 case IDCANCEL :\r
1828                                         EndDialog(hDlg, NO);\r
1829                                         break;\r
1830 \r
1831                                 case MIRRORUP_DISP :\r
1832                                         EndDialog(hDlg, YES_LIST);\r
1833                                         break;\r
1834 \r
1835                                 case IDHELP :\r
1836                                         if(Mode == 0)\r
1837                                                 hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000013);\r
1838                                         else\r
1839                                                 hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000012);\r
1840                         }\r
1841             return(TRUE);\r
1842         }\r
1843         return(FALSE);\r
1844 }\r
1845 \r
1846 \r
1847 /*----- ミラーリングアップロード処理内容確認ウインドウのコールバック ----------\r
1848 *\r
1849 *       Parameter\r
1850 *               HWND hDlg : ウインドウハンドル\r
1851 *               UINT message : メッセージ番号\r
1852 *               WPARAM wParam : メッセージの WPARAM 引数\r
1853 *               LPARAM lParam : メッセージの LPARAM 引数\r
1854 *\r
1855 *       Return Value\r
1856 *               BOOL TRUE/FALSE\r
1857 *----------------------------------------------------------------------------*/\r
1858 \r
1859 // 64ビット対応\r
1860 //static BOOL CALLBACK MirrorDispListCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
1861 static INT_PTR CALLBACK MirrorDispListCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
1862 {\r
1863         static DIALOGSIZE DlgSize = {\r
1864                 { MIRROR_DEL, MIRROR_SIZEGRIP, -1 },\r
1865                 { IDOK, IDCANCEL, IDHELP, MIRROR_DEL, MIRROR_COPYNUM, MIRROR_MAKENUM, MIRROR_DELNUM, MIRROR_SIZEGRIP, -1 },\r
1866                 { MIRROR_LIST, -1 },\r
1867                 { 0, 0 },\r
1868                 { 0, 0 }\r
1869         };\r
1870 \r
1871         static TRANSPACKET **Base;\r
1872         TRANSPACKET *Pos;\r
1873         char Tmp[FMAX_PATH+1+6];\r
1874         int Num;\r
1875         int *List;\r
1876 \r
1877         switch (iMessage)\r
1878         {\r
1879                 case WM_INITDIALOG :\r
1880                         Base = (TRANSPACKET **)lParam;\r
1881                         Pos = *Base;\r
1882                         while(Pos != NULL)\r
1883                         {\r
1884                                 strcpy(Tmp, "");\r
1885                                 if((strncmp(Pos->Cmd, "R-DELE", 6) == 0) ||\r
1886                                    (strncmp(Pos->Cmd, "R-RMD", 5) == 0))\r
1887                                         sprintf(Tmp, MSGJPN052, Pos->RemoteFile);\r
1888                                 else if(strncmp(Pos->Cmd, "R-MKD", 5) == 0)\r
1889                                         sprintf(Tmp, MSGJPN053, Pos->RemoteFile);\r
1890                                 else if(strncmp(Pos->Cmd, "STOR", 4) == 0)\r
1891                                         sprintf(Tmp, MSGJPN054, Pos->RemoteFile);\r
1892                                 else if((strncmp(Pos->Cmd, "L-DELE", 6) == 0) ||\r
1893                                                 (strncmp(Pos->Cmd, "L-RMD", 5) == 0))\r
1894                                         sprintf(Tmp, MSGJPN055, Pos->LocalFile);\r
1895                                 else if(strncmp(Pos->Cmd, "L-MKD", 5) == 0)\r
1896                                         sprintf(Tmp, MSGJPN056, Pos->LocalFile);\r
1897                                 else if(strncmp(Pos->Cmd, "RETR", 4) == 0)\r
1898                                         sprintf(Tmp, MSGJPN057, Pos->LocalFile);\r
1899 \r
1900                                 if(strlen(Tmp) > 0)\r
1901                                         SendDlgItemMessage(hDlg, MIRROR_LIST, LB_ADDSTRING, 0, (LPARAM)Tmp);\r
1902                                 Pos = Pos->Next;\r
1903                         }\r
1904                         CountMirrorFiles(hDlg, *Base);\r
1905                         DlgSizeInit(hDlg, &DlgSize, &MirrorDlgSize);\r
1906                         EnableWindow(GetDlgItem(hDlg, MIRROR_DEL), FALSE);\r
1907                         // ミラーリング設定追加\r
1908                         SendDlgItemMessage(hDlg, MIRROR_NO_TRANSFER, BM_SETCHECK, MirrorNoTransferContents, 0);\r
1909                         return(TRUE);\r
1910 \r
1911                 case WM_COMMAND :\r
1912                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
1913                         {\r
1914                                 case IDOK :\r
1915                                         AskDlgSize(hDlg, &DlgSize, &MirrorDlgSize);\r
1916                                         EndDialog(hDlg, YES);\r
1917                                         break;\r
1918 \r
1919                                 case IDCANCEL :\r
1920                                         AskDlgSize(hDlg, &DlgSize, &MirrorDlgSize);\r
1921                                         EndDialog(hDlg, NO);\r
1922                                         break;\r
1923 \r
1924                                 case MIRROR_DEL :\r
1925                                         Num = SendDlgItemMessage(hDlg, MIRROR_LIST, LB_GETSELCOUNT, 0, 0);\r
1926                                         if((List = malloc(Num * sizeof(int))) != NULL)\r
1927                                         {\r
1928                                                 Num = SendDlgItemMessage(hDlg, MIRROR_LIST, LB_GETSELITEMS, Num, (LPARAM)List);\r
1929                                                 for(Num--; Num >= 0; Num--)\r
1930                                                 {\r
1931                                                         if(RemoveTmpTransFileListItem(Base, List[Num]) == FFFTP_SUCCESS)\r
1932                                                                 SendDlgItemMessage(hDlg, MIRROR_LIST, LB_DELETESTRING, List[Num], 0);\r
1933                                                         else\r
1934                                                                 MessageBeep(-1);\r
1935                                                 }\r
1936                                                 free(List);\r
1937                                                 CountMirrorFiles(hDlg, *Base);\r
1938                                         }\r
1939                                         break;\r
1940 \r
1941                                 case MIRROR_LIST :\r
1942                                         switch(GET_WM_COMMAND_CMD(wParam, lParam))\r
1943                                         {\r
1944                                                 case LBN_SELCHANGE :\r
1945                                                         if(SendDlgItemMessage(hDlg, MIRROR_LIST, LB_GETSELCOUNT, 0, 0) > 0)\r
1946                                                                 EnableWindow(GetDlgItem(hDlg, MIRROR_DEL), TRUE);\r
1947                                                         else\r
1948                                                                 EnableWindow(GetDlgItem(hDlg, MIRROR_DEL), FALSE);\r
1949                                                         break;\r
1950                                         }\r
1951                                         break;\r
1952 \r
1953                                 // ミラーリング設定追加\r
1954                                 case MIRROR_NO_TRANSFER :\r
1955                                         Pos = *Base;\r
1956                                         while(Pos != NULL)\r
1957                                         {\r
1958                                                 if(strncmp(Pos->Cmd, "STOR", 4) == 0 || strncmp(Pos->Cmd, "RETR", 4) == 0)\r
1959                                                         Pos->NoTransfer = SendDlgItemMessage(hDlg, MIRROR_NO_TRANSFER, BM_GETCHECK, 0, 0);\r
1960                                                 Pos = Pos->Next;\r
1961                                         }\r
1962                                         break;\r
1963 \r
1964                                 case IDHELP :\r
1965                                         hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000012);\r
1966                         }\r
1967             return(TRUE);\r
1968 \r
1969                 case WM_SIZING :\r
1970                         DlgSizeChange(hDlg, &DlgSize, (RECT *)lParam, (int)wParam);\r
1971                     return(TRUE);\r
1972         }\r
1973         return(FALSE);\r
1974 }\r
1975 \r
1976 \r
1977 /*----- ミラーリングで転送/削除するファイルの数を数えダイアログに表示---------\r
1978 *\r
1979 *       Parameter\r
1980 *               HWND hWnd : \r
1981 *               TRANSPACKET *Pkt : \r
1982 *\r
1983 *       Return Value\r
1984 *               なし\r
1985 *----------------------------------------------------------------------------*/\r
1986 \r
1987 static void CountMirrorFiles(HWND hDlg, TRANSPACKET *Pkt)\r
1988 {\r
1989         char Tmp[80];\r
1990         int Del;\r
1991         int Make;\r
1992         int Copy;\r
1993 \r
1994         Del = 0;\r
1995         Make = 0;\r
1996         Copy = 0;\r
1997         while(Pkt != NULL)\r
1998         {\r
1999                 if((strncmp(Pkt->Cmd, "R-DELE", 6) == 0) ||\r
2000                    (strncmp(Pkt->Cmd, "R-RMD", 5) == 0) ||\r
2001                    (strncmp(Pkt->Cmd, "L-DELE", 6) == 0) ||\r
2002                    (strncmp(Pkt->Cmd, "L-RMD", 5) == 0))\r
2003                 {\r
2004                         Del += 1;\r
2005                 }\r
2006                 else if((strncmp(Pkt->Cmd, "R-MKD", 5) == 0) ||\r
2007                                 (strncmp(Pkt->Cmd, "L-MKD", 5) == 0))\r
2008                 {\r
2009                         Make += 1;\r
2010                 }\r
2011                 else if((strncmp(Pkt->Cmd, "STOR", 4) == 0) ||\r
2012                                 (strncmp(Pkt->Cmd, "RETR", 4) == 0))\r
2013                 {\r
2014                         Copy += 1;\r
2015                 }\r
2016                 Pkt = Pkt->Next;\r
2017         }\r
2018 \r
2019         if(Copy != 0)\r
2020                 sprintf(Tmp, MSGJPN058, Copy);\r
2021         else\r
2022                 sprintf(Tmp, MSGJPN059);\r
2023         SendDlgItemMessage(hDlg, MIRROR_COPYNUM, WM_SETTEXT, 0, (LPARAM)Tmp);\r
2024 \r
2025         if(Make != 0)\r
2026                 sprintf(Tmp, MSGJPN060, Make);\r
2027         else\r
2028                 sprintf(Tmp, MSGJPN061);\r
2029         SendDlgItemMessage(hDlg, MIRROR_MAKENUM, WM_SETTEXT, 0, (LPARAM)Tmp);\r
2030 \r
2031         if(Del != 0)\r
2032                 sprintf(Tmp, MSGJPN062, Del);\r
2033         else\r
2034                 sprintf(Tmp, MSGJPN063);\r
2035         SendDlgItemMessage(hDlg, MIRROR_DELNUM, WM_SETTEXT, 0, (LPARAM)Tmp);\r
2036 \r
2037         return;\r
2038 }\r
2039 \r
2040 \r
2041 \r
2042 \r
2043 /*----- ミラーリングで転送/削除しないファイルかどうかを返す ------------------\r
2044 *\r
2045 *       Parameter\r
2046 *               char Fname : ファイル名\r
2047 *               int Mode : モード\r
2048 *                       0=転送しないファイル, 1=削除しないファイル\r
2049 *\r
2050 *       Return Value\r
2051 *               int ステータス\r
2052 *                       YES=転送・削除しない/NO\r
2053 *----------------------------------------------------------------------------*/\r
2054 \r
2055 static int AskMirrorNoTrn(char *Fname, int Mode)\r
2056 {\r
2057         int Ret;\r
2058         char *Tbl;\r
2059 \r
2060         Tbl = MirrorNoTrn;\r
2061         if(Mode == 1)\r
2062                 Tbl = MirrorNoDel;\r
2063 \r
2064         Ret = NO;\r
2065         if(StrMultiLen(Tbl) > 0)\r
2066         {\r
2067                 Fname = GetFileName(Fname);\r
2068                 while(*Tbl != NUL)\r
2069                 {\r
2070                         if(CheckFname(Fname, Tbl) == FFFTP_SUCCESS)\r
2071                         {\r
2072                                 Ret = YES;\r
2073                                 break;\r
2074                         }\r
2075                         Tbl += strlen(Tbl) + 1;\r
2076                 }\r
2077         }\r
2078         return(Ret);\r
2079 }\r
2080 \r
2081 \r
2082 /*----- アップロードするファイルの属性を返す ----------------------------------\r
2083 *\r
2084 *       Parameter\r
2085 *               char Fname : ファイル名\r
2086 *\r
2087 *       Return Value\r
2088 *               int 属性 (-1=設定なし)\r
2089 *----------------------------------------------------------------------------*/\r
2090 \r
2091 static int AskUploadFileAttr(char *Fname)\r
2092 {\r
2093         int Ret;\r
2094         int Sts;\r
2095         char *Tbl;\r
2096 \r
2097         Tbl = DefAttrList;\r
2098         Fname = GetFileName(Fname);\r
2099         Ret = -1;\r
2100         while(*Tbl != NUL)\r
2101         {\r
2102                 Sts = CheckFname(Fname, Tbl);\r
2103                 Tbl += strlen(Tbl) + 1;\r
2104 \r
2105                 if((Sts == FFFTP_SUCCESS) && (*Tbl != NUL))\r
2106                 {\r
2107                         Ret = xtoi(Tbl);\r
2108                         break;\r
2109                 }\r
2110                 Tbl += strlen(Tbl) + 1;\r
2111         }\r
2112         return(Ret);\r
2113 }\r
2114 \r
2115 \r
2116 /*----- ホストに同じ名前のファイルがないかチェック- ---------------------------a\r
2117 *\r
2118 *       Parameter\r
2119 *               TRANSPACKET *Pkt : 転送ファイル情報\r
2120 *               FILELIST *ListList : \r
2121 *\r
2122 *       Return Value\r
2123 *               int 処理方法\r
2124 *                       EXIST_OVW/EXIST_UNIQUE/EXIST_IGNORE\r
2125 *\r
2126 *       Note\r
2127 *               Pkt.ExistSize, UpExistMode、ExistNotify が変更される\r
2128 *----------------------------------------------------------------------------*/\r
2129 \r
2130 static int CheckRemoteFile(TRANSPACKET *Pkt, FILELIST *ListList)\r
2131 {\r
2132         int Ret;\r
2133 #if defined(HAVE_TANDEM)\r
2134         int Mode;\r
2135 #endif\r
2136         FILELIST *Exist;\r
2137 \r
2138         Ret = EXIST_OVW;\r
2139         Pkt->ExistSize = 0;\r
2140         if(SendMode != TRANS_OVW)\r
2141         {\r
2142 #if defined(HAVE_TANDEM)\r
2143                 /* HP NonStop Server は大文字小文字の区別なし(すべて大文字) */\r
2144                 if(AskHostType() == HTYPE_TANDEM)\r
2145                         Mode = COMP_IGNORE;\r
2146                 else\r
2147                         Mode = COMP_STRICT;\r
2148 \r
2149                 if((Exist = SearchFileList(GetFileName(Pkt->RemoteFile), ListList, Mode)) != NULL)\r
2150 #else\r
2151                 if((Exist = SearchFileList(GetFileName(Pkt->RemoteFile), ListList, COMP_STRICT)) != NULL)\r
2152 #endif\r
2153                 {\r
2154                         Pkt->ExistSize = Exist->Size;\r
2155 \r
2156                         if(ExistNotify == YES)\r
2157                         {\r
2158                                 SoundPlay(SND_ERROR);\r
2159                                 if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(up_exist_dlg), GetMainHwnd(), UpExistDialogCallBack, (LPARAM)Pkt) == NO)\r
2160                                         Ret = EXIST_ABORT;\r
2161                                 else\r
2162                                         Ret = UpExistMode;\r
2163                         }\r
2164                         else\r
2165                                 Ret = UpExistMode;\r
2166 \r
2167                         if(Ret == EXIST_NEW)\r
2168                         {\r
2169                                 /*ファイル日付チェック */\r
2170                                 if(CompareFileTime(&Exist->Time, &Pkt->Time) < 0)\r
2171                                         Ret = EXIST_OVW;\r
2172                                 else\r
2173                                         Ret = EXIST_IGNORE;\r
2174                         }\r
2175                         // 同じ名前のファイルの処理方法追加\r
2176                         if(Ret == EXIST_LARGE)\r
2177                         {\r
2178                                 if(Exist->Size < Pkt->Size)\r
2179                                         Ret = EXIST_OVW;\r
2180                                 else\r
2181                                         Ret = EXIST_IGNORE;\r
2182                         }\r
2183                 }\r
2184         }\r
2185         return(Ret);\r
2186 }\r
2187 \r
2188 \r
2189 /*----- ホストに同じ名前のファイルがある時の確認ダイアログのコールバック ------\r
2190 *\r
2191 *       Parameter\r
2192 *               HWND hDlg : ウインドウハンドル\r
2193 *               UINT message : メッセージ番号\r
2194 *               WPARAM wParam : メッセージの WPARAM 引数\r
2195 *               LPARAM lParam : メッセージの LPARAM 引数\r
2196 *\r
2197 *       Return Value\r
2198 *               BOOL TRUE/FALSE\r
2199 *----------------------------------------------------------------------------*/\r
2200 \r
2201 // 64ビット対応\r
2202 //static BOOL CALLBACK UpExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
2203 static INT_PTR CALLBACK UpExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
2204 {\r
2205         static TRANSPACKET *Pkt;\r
2206         // 同じ名前のファイルの処理方法追加\r
2207 //      static const RADIOBUTTON UpExistButton[] = {\r
2208 //              { UP_EXIST_OVW, EXIST_OVW },\r
2209 //              { UP_EXIST_NEW, EXIST_NEW },\r
2210 //              { UP_EXIST_RESUME, EXIST_RESUME },\r
2211 //              { UP_EXIST_UNIQUE, EXIST_UNIQUE },\r
2212 //              { UP_EXIST_IGNORE, EXIST_IGNORE }\r
2213 //      };\r
2214         static const RADIOBUTTON UpExistButton[] = {\r
2215                 { UP_EXIST_OVW, EXIST_OVW },\r
2216                 { UP_EXIST_NEW, EXIST_NEW },\r
2217                 { UP_EXIST_RESUME, EXIST_RESUME },\r
2218                 { UP_EXIST_UNIQUE, EXIST_UNIQUE },\r
2219                 { UP_EXIST_IGNORE, EXIST_IGNORE },\r
2220                 { UP_EXIST_LARGE, EXIST_LARGE }\r
2221         };\r
2222         #define UPEXISTBUTTONS  (sizeof(UpExistButton)/sizeof(RADIOBUTTON))\r
2223 \r
2224         switch (iMessage)\r
2225         {\r
2226                 case WM_INITDIALOG :\r
2227                         Pkt = (TRANSPACKET *)lParam;\r
2228                         SendDlgItemMessage(hDlg, UP_EXIST_NAME, EM_LIMITTEXT, FMAX_PATH, 0);\r
2229                         SendDlgItemMessage(hDlg, UP_EXIST_NAME, WM_SETTEXT, 0, (LPARAM)Pkt->RemoteFile);\r
2230 \r
2231                         if((Pkt->Type == TYPE_A) || (Pkt->ExistSize <= 0))\r
2232                                 EnableWindow(GetDlgItem(hDlg, UP_EXIST_RESUME), FALSE);\r
2233 \r
2234                         SetRadioButtonByValue(hDlg, UpExistMode, UpExistButton, UPEXISTBUTTONS);\r
2235                         return(TRUE);\r
2236 \r
2237                 case WM_COMMAND :\r
2238                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
2239                         {\r
2240                                 case IDOK_ALL :\r
2241                                         ExistNotify = NO;\r
2242                                         /* ここに break はない */\r
2243 \r
2244                                 case IDOK :\r
2245                                         UpExistMode = AskRadioButtonValue(hDlg, UpExistButton, UPEXISTBUTTONS);\r
2246                                         SendDlgItemMessage(hDlg, UP_EXIST_NAME, WM_GETTEXT, FMAX_PATH, (LPARAM)Pkt->RemoteFile);\r
2247                                         EndDialog(hDlg, YES);\r
2248                                         break;\r
2249 \r
2250                                 case IDCANCEL :\r
2251 //                                      Pkt->Abort = ABORT_USER;\r
2252 //                                      UpExistMode = EXIST_IGNORE;\r
2253                                         EndDialog(hDlg, NO);\r
2254                                         break;\r
2255 \r
2256                                 case IDHELP :\r
2257                                         hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000011);\r
2258                                         break;\r
2259                         }\r
2260             return(TRUE);\r
2261         }\r
2262         return(FALSE);\r
2263 }\r
2264 \r
2265 \r
2266 /*----- アップロード/ダウンロードファイル名入力ダイアログのコールバック ------\r
2267 *\r
2268 *       Parameter\r
2269 *               HWND hDlg : ウインドウハンドル\r
2270 *               UINT message : メッセージ番号\r
2271 *               WPARAM wParam : メッセージの WPARAM 引数\r
2272 *               LPARAM lParam : メッセージの LPARAM 引数\r
2273 *\r
2274 *       Return Value\r
2275 *               BOOL TRUE/FALSE\r
2276 *----------------------------------------------------------------------------*/\r
2277 \r
2278 // 64ビット対応\r
2279 //static BOOL CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
2280 static INT_PTR CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
2281 {\r
2282         switch (iMessage)\r
2283         {\r
2284                 case WM_INITDIALOG :\r
2285                         if(CurWin == WIN_LOCAL)\r
2286                                 SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN064);\r
2287                         else\r
2288                                 SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN065);\r
2289 \r
2290                         SendDlgItemMessage(hDlg, UPDOWNAS_NEW, EM_LIMITTEXT, FMAX_PATH, 0);\r
2291                         SendDlgItemMessage(hDlg, UPDOWNAS_NEW, WM_SETTEXT, 0, (LPARAM)TmpString);\r
2292                         SendDlgItemMessage(hDlg, UPDOWNAS_TEXT, WM_SETTEXT, 0, (LPARAM)TmpString);\r
2293                         return(TRUE);\r
2294 \r
2295                 case WM_COMMAND :\r
2296                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
2297                         {\r
2298                                 case IDOK :\r
2299                                         SendDlgItemMessage(hDlg, UPDOWNAS_NEW, WM_GETTEXT, FMAX_PATH, (LPARAM)TmpString);\r
2300                                         EndDialog(hDlg, YES);\r
2301                                         break;\r
2302 \r
2303                                 case UPDOWNAS_STOP :\r
2304                                         EndDialog(hDlg, NO_ALL);\r
2305                                         break;\r
2306                         }\r
2307             return(TRUE);\r
2308         }\r
2309         return(FALSE);\r
2310 }\r
2311 \r
2312 \r
2313 #if defined(HAVE_TANDEM)\r
2314 /*----- アップロード/ダウンロードファイル名入力ダイアログのコールバック ------\r
2315 *\r
2316 *       Parameter\r
2317 *               HWND hDlg : ウインドウハンドル\r
2318 *               UINT message : メッセージ番号\r
2319 *               WPARAM wParam : メッセージの WPARAM 引数\r
2320 *               LPARAM lParam : メッセージの LPARAM 引数\r
2321 *\r
2322 *       Return Value\r
2323 *               BOOL TRUE/FALSE\r
2324 *----------------------------------------------------------------------------*/\r
2325 \r
2326 static INT_PTR CALLBACK UpDownAsWithExtDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
2327 {\r
2328         switch (iMessage)\r
2329         {\r
2330                 case WM_INITDIALOG :\r
2331                         if(CurWin == WIN_LOCAL)\r
2332                                 SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN064);\r
2333                         else\r
2334                                 SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN065);\r
2335 \r
2336                         SendDlgItemMessage(hDlg, UPDOWNAS_NEW, EM_LIMITTEXT, FMAX_PATH, 0);\r
2337                         SendDlgItemMessage(hDlg, UPDOWNAS_NEW, WM_SETTEXT, 0, (LPARAM)TmpString);\r
2338                         SendDlgItemMessage(hDlg, UPDOWNAS_TEXT, WM_SETTEXT, 0, (LPARAM)TmpString);\r
2339                         SendDlgItemMessage(hDlg, UPDOWNAS_FILECODE, EM_LIMITTEXT, 4, 0);\r
2340                         SendDlgItemMessage(hDlg, UPDOWNAS_FILECODE, WM_SETTEXT, 0, (LPARAM)TmpFileCode);\r
2341 \r
2342                         return(TRUE);\r
2343 \r
2344                 case WM_COMMAND :\r
2345                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
2346                         {\r
2347                                 case IDOK :\r
2348                                         SendDlgItemMessage(hDlg, UPDOWNAS_NEW, WM_GETTEXT, FMAX_PATH, (LPARAM)TmpString);\r
2349                                         SendDlgItemMessage(hDlg, UPDOWNAS_FILECODE, WM_GETTEXT, FMAX_PATH, (LPARAM)TmpFileCode);\r
2350                                         EndDialog(hDlg, YES);\r
2351                                         break;\r
2352 \r
2353                                 case UPDOWNAS_STOP :\r
2354                                         EndDialog(hDlg, NO_ALL);\r
2355                                         break;\r
2356                         }\r
2357             return(TRUE);\r
2358         }\r
2359         return(FALSE);\r
2360 }\r
2361 #endif\r
2362 \r
2363 \r
2364 /*----- ファイル一覧で指定されたファイルを削除する ----------------------------\r
2365 *\r
2366 *       Parameter\r
2367 *               なし\r
2368 *\r
2369 *       Return Value\r
2370 *               なし\r
2371 *----------------------------------------------------------------------------*/\r
2372 \r
2373 void DeleteProc(void)\r
2374 {\r
2375         int Win;\r
2376         FILELIST *FileListBase;\r
2377         FILELIST *Pos;\r
2378         int DelFlg;\r
2379         int Sts;\r
2380         char CurDir[FMAX_PATH+1];\r
2381         char Tmp[FMAX_PATH+1];\r
2382 \r
2383         // 同時接続対応\r
2384         CancelFlg = NO;\r
2385 \r
2386         // デッドロック対策\r
2387         DisableUserOpe();\r
2388         Sts = YES;\r
2389         AskRemoteCurDir(CurDir, FMAX_PATH);\r
2390         FileListBase = NULL;\r
2391         if(GetFocus() == GetLocalHwnd())\r
2392         {\r
2393                 Win = WIN_LOCAL;\r
2394                 MakeSelectedFileList(Win, NO, NO, &FileListBase, &CancelFlg);\r
2395         }\r
2396         else\r
2397         {\r
2398                 Win = WIN_REMOTE;\r
2399                 if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
2400                         MakeSelectedFileList(Win, YES, NO, &FileListBase, &CancelFlg);\r
2401                 else\r
2402                         Sts = NO;\r
2403         }\r
2404 \r
2405         if(Sts == YES)\r
2406         {\r
2407                 // デッドロック対策\r
2408 //              DisableUserOpe();\r
2409 \r
2410                 DelFlg = NO;\r
2411                 Sts = NO;\r
2412                 Pos = FileListBase;\r
2413                 while(Pos != NULL)\r
2414                 {\r
2415                         if(Pos->Node == NODE_FILE)\r
2416                         {\r
2417                                 DelNotifyAndDo(Pos, Win, &Sts, &DelFlg, CurDir);\r
2418                                 if(Sts == NO_ALL)\r
2419                                         break;\r
2420                         }\r
2421                         Pos = Pos->Next;\r
2422                 }\r
2423 \r
2424                 if(Sts != NO_ALL)\r
2425                         DeleteAllDir(FileListBase, Win, &Sts, &DelFlg, CurDir);\r
2426 \r
2427                 if(Win == WIN_REMOTE)\r
2428                 {\r
2429                         AskRemoteCurDir(Tmp, FMAX_PATH);\r
2430                         if(strcmp(Tmp, CurDir) != 0)\r
2431                                 DoCWD(Tmp, NO, NO, NO);\r
2432                 }\r
2433 \r
2434                 DeleteFileList(&FileListBase);\r
2435 \r
2436                 if(DelFlg == YES)\r
2437                 {\r
2438                         if(Win == WIN_LOCAL)\r
2439                                 GetLocalDirForWnd();\r
2440                         else\r
2441                                 GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);\r
2442                 }\r
2443 \r
2444                 // デッドロック対策\r
2445 //              EnableUserOpe();\r
2446         }\r
2447         // デッドロック対策\r
2448         EnableUserOpe();\r
2449         return;\r
2450 }\r
2451 \r
2452 \r
2453 /*----- サブディレクトリ以下を全て削除する ------------------------------------\r
2454 *\r
2455 *       Parameter\r
2456 *               FILELIST *Dt : 削除するファイルのリスト\r
2457 *               int Win : ウインドウ番号 (WIN_xxx)\r
2458 *               int *Sw : 操作方法 (YES/NO/YES_ALL/NO_ALL)\r
2459 *               int *Flg : ファイルを削除したかどうかのフラグ (YES/NO)\r
2460 *               char *CurDir : カレントディレクトリ\r
2461 *\r
2462 *       Return Value\r
2463 *               なし\r
2464 *----------------------------------------------------------------------------*/\r
2465 \r
2466 static void DeleteAllDir(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDir)\r
2467 {\r
2468         while(Dt != NULL)\r
2469         {\r
2470                 if(Dt->Node == NODE_DIR)\r
2471                 {\r
2472                         DeleteAllDir(Dt->Next, Win, Sw, Flg, CurDir);\r
2473                         if(*Sw == NO_ALL)\r
2474                                 break;\r
2475 \r
2476                         DelNotifyAndDo(Dt, Win, Sw, Flg, CurDir);\r
2477                         break;\r
2478                 }\r
2479                 Dt = Dt->Next;\r
2480         }\r
2481         return;\r
2482 }\r
2483 \r
2484 \r
2485 /*----- 削除するかどうかの確認と削除実行 --------------------------------------\r
2486 *\r
2487 *       Parameter\r
2488 *               FILELIST *Dt : 削除するファイルのリスト\r
2489 *               int Win : ウインドウ番号 (WIN_xxx)\r
2490 *               int *Sw : 操作方法 (YES/NO/YES_ALL/NO_ALL)\r
2491 *               int *Flg : ファイルを削除したかどうかのフラグ (YES/NO)\r
2492 *               char *CurDir : カレントディレクトリ\r
2493 *\r
2494 *       Return Value\r
2495 *               なし\r
2496 *----------------------------------------------------------------------------*/\r
2497 \r
2498 static void DelNotifyAndDo(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDir)\r
2499 {\r
2500         char Path[FMAX_PATH+1];\r
2501 \r
2502         if(Win == WIN_LOCAL)\r
2503         {\r
2504                 AskLocalCurDir(Path, FMAX_PATH);\r
2505                 SetYenTail(Path);\r
2506                 strcat(Path, Dt->File);\r
2507                 ReplaceAll(Path, '/', '\\');\r
2508         }\r
2509         else\r
2510         {\r
2511                 AskRemoteCurDir(Path, FMAX_PATH);\r
2512                 SetSlashTail(Path);\r
2513                 strcat(Path, Dt->File);\r
2514                 ReplaceAll(Path, '\\', '/');\r
2515         }\r
2516 \r
2517         if(*Sw != YES_ALL)\r
2518         {\r
2519                 sprintf(TmpString, "%s", Path);\r
2520 \r
2521                 // ローカルのファイルのパスの最後の'\\'が消えるバグ修正\r
2522 //              if(AskHostType() == HTYPE_VMS)\r
2523                 if(Win == WIN_REMOTE && AskHostType() == HTYPE_VMS)\r
2524                         ReformToVMSstylePathName(TmpString);\r
2525 \r
2526                 CurWin = Win;\r
2527                 *Sw = DialogBox(GetFtpInst(), MAKEINTRESOURCE(delete_dlg), GetMainHwnd(), DeleteDialogCallBack);\r
2528         }\r
2529 \r
2530         if((*Sw == YES) || (*Sw == YES_ALL))\r
2531         {\r
2532                 if(Win == WIN_LOCAL)\r
2533                 {\r
2534                         if(Dt->Node == NODE_FILE)\r
2535                                 DoLocalDELE(Path);\r
2536                         else\r
2537                                 DoLocalRMD(Path);\r
2538                         *Flg = YES;\r
2539                 }\r
2540                 else\r
2541                 {\r
2542                         /* フルパスを使わない時のための処理 */\r
2543                         // 同時接続対応\r
2544 //                      if(ProcForNonFullpath(Path, CurDir, GetMainHwnd(), 0) == FFFTP_FAIL)\r
2545                         if(ProcForNonFullpath(AskCmdCtrlSkt(), Path, CurDir, GetMainHwnd(), &CancelFlg) == FFFTP_FAIL)\r
2546                                 *Sw = NO_ALL;\r
2547 \r
2548                         if(*Sw != NO_ALL)\r
2549                         {\r
2550                                 if(Dt->Node == NODE_FILE)\r
2551                                         DoDELE(Path);\r
2552                                 else\r
2553                                         DoRMD(Path);\r
2554                                 *Flg = YES;\r
2555                         }\r
2556                 }\r
2557         }\r
2558         return;\r
2559 }\r
2560 \r
2561 \r
2562 /*----- ファイル削除ダイアログのコールバック ----------------------------------\r
2563 *\r
2564 *       Parameter\r
2565 *               HWND hDlg : ウインドウハンドル\r
2566 *               UINT message : メッセージ番号\r
2567 *               WPARAM wParam : メッセージの WPARAM 引数\r
2568 *               LPARAM lParam : メッセージの LPARAM 引数\r
2569 *\r
2570 *       Return Value\r
2571 *               BOOL TRUE/FALSE\r
2572 *----------------------------------------------------------------------------*/\r
2573 \r
2574 // 64ビット対応\r
2575 //static BOOL CALLBACK DeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
2576 static INT_PTR CALLBACK DeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
2577 {\r
2578         switch (iMessage)\r
2579         {\r
2580                 case WM_INITDIALOG :\r
2581                         if(CurWin == WIN_LOCAL)\r
2582                                 SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN066);\r
2583                         else\r
2584                                 SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN067);\r
2585                         SendDlgItemMessage(hDlg, DELETE_TEXT, WM_SETTEXT, 0, (LPARAM)TmpString);\r
2586                         return(TRUE);\r
2587 \r
2588                 case WM_COMMAND :\r
2589                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
2590                         {\r
2591                                 case IDOK :\r
2592                                         EndDialog(hDlg, YES);\r
2593                                         break;\r
2594 \r
2595                                 case DELETE_NO :\r
2596                                         EndDialog(hDlg, NO);\r
2597                                         break;\r
2598 \r
2599                                 case DELETE_ALL :\r
2600                                         EndDialog(hDlg, YES_ALL);\r
2601                                         break;\r
2602 \r
2603                                 case IDCANCEL :\r
2604                                         EndDialog(hDlg, NO_ALL);\r
2605                                         break;\r
2606                         }\r
2607             return(TRUE);\r
2608         }\r
2609         return(FALSE);\r
2610 }\r
2611 \r
2612 \r
2613 /*----- ファイル一覧で指定されたファイルの名前を変更する ----------------------\r
2614 *\r
2615 *       Parameter\r
2616 *               なし\r
2617 *\r
2618 *       Return Value\r
2619 *               なし\r
2620 *----------------------------------------------------------------------------*/\r
2621 \r
2622 void RenameProc(void)\r
2623 {\r
2624         int Win;\r
2625         FILELIST *FileListBase;\r
2626         FILELIST *Pos;\r
2627         char New[FMAX_PATH+1];\r
2628         int RenFlg;\r
2629         int Sts;\r
2630 \r
2631         // 同時接続対応\r
2632         CancelFlg = NO;\r
2633 \r
2634         Sts = FFFTP_SUCCESS;\r
2635         if(GetFocus() == GetLocalHwnd())\r
2636                 Win = WIN_LOCAL;\r
2637         else\r
2638         {\r
2639                 Win = WIN_REMOTE;\r
2640                 Sts = CheckClosedAndReconnect();\r
2641         }\r
2642 \r
2643         if(Sts == FFFTP_SUCCESS)\r
2644         {\r
2645                 DisableUserOpe();\r
2646 \r
2647                 FileListBase = NULL;\r
2648                 MakeSelectedFileList(Win, NO, NO, &FileListBase, &CancelFlg);\r
2649 \r
2650                 RenFlg = NO;\r
2651                 Sts = NO;\r
2652                 Pos = FileListBase;\r
2653                 while(Pos != NULL)\r
2654                 {\r
2655                         if((Pos->Node == NODE_FILE) || (Pos->Node == NODE_DIR))\r
2656                         {\r
2657                                 strcpy(TmpString, Pos->File);\r
2658                                 CurWin = Win;\r
2659                                 Sts = DialogBox(GetFtpInst(), MAKEINTRESOURCE(rename_dlg), GetMainHwnd(), RenameDialogCallBack);\r
2660 \r
2661                                 if(Sts == NO_ALL)\r
2662                                         break;\r
2663 \r
2664                                 if((Sts == YES) && (strlen(TmpString) != 0))\r
2665                                 {\r
2666                                         strcpy(New, TmpString);\r
2667                                         if(Win == WIN_LOCAL)\r
2668                                                 DoLocalRENAME(Pos->File, New);\r
2669                                         else\r
2670                                                 DoRENAME(Pos->File, New);\r
2671                                         RenFlg = YES;\r
2672                                 }\r
2673                         }\r
2674                         Pos = Pos->Next;\r
2675                 }\r
2676                 DeleteFileList(&FileListBase);\r
2677 \r
2678                 if(RenFlg == YES)\r
2679                 {\r
2680                         if(Win == WIN_LOCAL)\r
2681                                 GetLocalDirForWnd();\r
2682                         else\r
2683                                 GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);\r
2684                 }\r
2685 \r
2686                 EnableUserOpe();\r
2687         }\r
2688         return;\r
2689 }\r
2690 \r
2691 \r
2692 //\r
2693 // リモート側でのファイルの移動(リネーム)を行う\r
2694 //  \r
2695 // RenameProc()をベースに改造。(2007.9.5 yutaka)\r
2696 //\r
2697 void MoveRemoteFileProc(int drop_index)\r
2698 {\r
2699         int Win;\r
2700         FILELIST *FileListBase;\r
2701         FILELIST *Pos;\r
2702         FILELIST Pkt;\r
2703         char New[FMAX_PATH+1];\r
2704         char Old[FMAX_PATH+1];\r
2705         char HostDir[FMAX_PATH+1];\r
2706         int RenFlg;\r
2707         int Sts;\r
2708 \r
2709         // 同時接続対応\r
2710         CancelFlg = NO;\r
2711 \r
2712         if(MoveMode == MOVE_DISABLE)\r
2713         {\r
2714                 return;\r
2715         }\r
2716 \r
2717         AskRemoteCurDir(HostDir, FMAX_PATH);\r
2718 \r
2719         // ドロップ先のフォルダ名を得る\r
2720         // 上位のディレクトリへ移動対応\r
2721 //      GetNodeName(WIN_REMOTE, drop_index, Pkt.File, FMAX_PATH);\r
2722         if(drop_index >= 0)\r
2723                 GetNodeName(WIN_REMOTE, drop_index, Pkt.File, FMAX_PATH);\r
2724         else\r
2725                 strcpy(Pkt.File, "..");\r
2726 \r
2727         if(MoveMode == MOVE_DLG)\r
2728         {\r
2729                 if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(move_notify_dlg), GetRemoteHwnd(), ExeEscTextDialogProc, (LPARAM)Pkt.File) == NO)\r
2730                 {\r
2731                         return;\r
2732                 }\r
2733         }\r
2734 \r
2735         Sts = FFFTP_SUCCESS;\r
2736 #if 0\r
2737         if(GetFocus() == GetLocalHwnd())\r
2738                 Win = WIN_LOCAL;\r
2739         else\r
2740         {\r
2741                 Win = WIN_REMOTE;\r
2742                 Sts = CheckClosedAndReconnect();\r
2743         }\r
2744 #else\r
2745                 Win = WIN_REMOTE;\r
2746                 Sts = CheckClosedAndReconnect();\r
2747 #endif\r
2748 \r
2749         if(Sts == FFFTP_SUCCESS)\r
2750         {\r
2751                 DisableUserOpe();\r
2752 \r
2753                 FileListBase = NULL;\r
2754                 MakeSelectedFileList(Win, NO, NO, &FileListBase, &CancelFlg);\r
2755 \r
2756                 RenFlg = NO;\r
2757                 Sts = NO;\r
2758                 Pos = FileListBase;\r
2759                 while(Pos != NULL)\r
2760                 {\r
2761                         if((Pos->Node == NODE_FILE) || (Pos->Node == NODE_DIR))\r
2762                         {\r
2763                                 strcpy(TmpString, Pos->File);\r
2764                                 CurWin = Win;\r
2765 #if 0\r
2766                                 Sts = DialogBox(GetFtpInst(), MAKEINTRESOURCE(rename_dlg), GetMainHwnd(), RenameDialogCallBack);\r
2767 \r
2768                                 if(Sts == NO_ALL)\r
2769                                         break;\r
2770 #else\r
2771                                 Sts = YES;\r
2772 #endif\r
2773 \r
2774                                 if((Sts == YES) && (strlen(TmpString) != 0))\r
2775                                 {\r
2776                                         // パスの設定(local)\r
2777                                         strncpy_s(Old, sizeof(Old), HostDir, _TRUNCATE);\r
2778                                         strncat_s(Old, sizeof(Old), "/", _TRUNCATE);\r
2779                                         strncat_s(Old, sizeof(Old), Pos->File, _TRUNCATE);\r
2780 \r
2781                                         // パスの設定(remote)\r
2782                                         strncpy_s(New, sizeof(New), HostDir, _TRUNCATE);\r
2783                                         strncat_s(New, sizeof(New), "/", _TRUNCATE);\r
2784                                         strncat_s(New, sizeof(New), Pkt.File, _TRUNCATE);\r
2785                                         strncat_s(New, sizeof(New), "/", _TRUNCATE);\r
2786                                         strncat_s(New, sizeof(New), Pos->File, _TRUNCATE);\r
2787 \r
2788                                         if(Win == WIN_LOCAL)\r
2789                                                 DoLocalRENAME(Old, New);\r
2790                                         else\r
2791                                                 DoRENAME(Old, New);\r
2792                                         RenFlg = YES;\r
2793                                 }\r
2794                         }\r
2795                         Pos = Pos->Next;\r
2796                 }\r
2797                 DeleteFileList(&FileListBase);\r
2798 \r
2799                 if(RenFlg == YES)\r
2800                 {\r
2801                         if(Win == WIN_LOCAL) {\r
2802                                 GetLocalDirForWnd();\r
2803                         } else {\r
2804                                 GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);\r
2805 \r
2806                                 strncpy_s(New, sizeof(New), HostDir, _TRUNCATE);\r
2807                                 strncat_s(New, sizeof(New), "/", _TRUNCATE);\r
2808                                 strncat_s(New, sizeof(New), Pkt.File, _TRUNCATE);\r
2809                                 DoCWD(New, YES, YES, YES);\r
2810                                 GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);\r
2811                         }\r
2812                 }\r
2813 \r
2814                 EnableUserOpe();\r
2815         }\r
2816         return;\r
2817 }\r
2818 \r
2819 \r
2820 \r
2821 /*----- 新ファイル名入力ダイアログのコールバック ------------------------------\r
2822 *\r
2823 *       Parameter\r
2824 *               HWND hDlg : ウインドウハンドル\r
2825 *               UINT message : メッセージ番号\r
2826 *               WPARAM wParam : メッセージの WPARAM 引数\r
2827 *               LPARAM lParam : メッセージの LPARAM 引数\r
2828 *\r
2829 *       Return Value\r
2830 *               BOOL TRUE/FALSE\r
2831 *----------------------------------------------------------------------------*/\r
2832 \r
2833 // 64ビット対応\r
2834 //static BOOL CALLBACK RenameDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
2835 static INT_PTR CALLBACK RenameDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
2836 {\r
2837         switch (iMessage)\r
2838         {\r
2839                 case WM_INITDIALOG :\r
2840                         if(CurWin == WIN_LOCAL)\r
2841                                 SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN068);\r
2842                         else\r
2843                                 SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN069);\r
2844                         SendDlgItemMessage(hDlg, RENAME_NEW, EM_LIMITTEXT, FMAX_PATH, 0);\r
2845                         SendDlgItemMessage(hDlg, RENAME_NEW, WM_SETTEXT, 0, (LPARAM)TmpString);\r
2846                         SendDlgItemMessage(hDlg, RENAME_TEXT, WM_SETTEXT, 0, (LPARAM)TmpString);\r
2847                         return(TRUE);\r
2848 \r
2849                 case WM_COMMAND :\r
2850                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
2851                         {\r
2852                                 case IDOK :\r
2853                                         SendDlgItemMessage(hDlg, RENAME_NEW, WM_GETTEXT, FMAX_PATH, (LPARAM)TmpString);\r
2854                                         EndDialog(hDlg, YES);\r
2855                                         break;\r
2856 \r
2857                                 case IDCANCEL :\r
2858                                         EndDialog(hDlg, NO);\r
2859                                         break;\r
2860 \r
2861                                 case RENAME_STOP :\r
2862                                         EndDialog(hDlg, NO_ALL);\r
2863                                         break;\r
2864                         }\r
2865             return(TRUE);\r
2866         }\r
2867         return(FALSE);\r
2868 }\r
2869 \r
2870 \r
2871 /*----- 新しいディレクトリを作成する ------------------------------------------\r
2872 *\r
2873 *       Parameter\r
2874 *               なし\r
2875 *\r
2876 *       Return Value\r
2877 *               なし\r
2878 *----------------------------------------------------------------------------*/\r
2879 \r
2880 void MkdirProc(void)\r
2881 {\r
2882         int Sts;\r
2883         int Win;\r
2884         char Path[FMAX_PATH+1];\r
2885         char *Title;\r
2886         int Tmp;\r
2887 \r
2888         // 同時接続対応\r
2889         CancelFlg = NO;\r
2890 \r
2891         if(GetFocus() == GetLocalHwnd())\r
2892         {\r
2893                 Win = WIN_LOCAL;\r
2894                 Title = MSGJPN070;\r
2895         }\r
2896         else\r
2897         {\r
2898                 Win = WIN_REMOTE;\r
2899                 Title = MSGJPN071;\r
2900         }\r
2901 \r
2902         strcpy(Path, "");\r
2903         Sts = InputDialogBox(mkdir_dlg, GetMainHwnd(), Title, Path, FMAX_PATH+1, &Tmp, IDH_HELP_TOPIC_0000001);\r
2904 \r
2905         if((Sts == YES) && (strlen(Path) != 0))\r
2906         {\r
2907                 if(Win == WIN_LOCAL)\r
2908                 {\r
2909                         DisableUserOpe();\r
2910                         DoLocalMKD(Path);\r
2911                         GetLocalDirForWnd();\r
2912                         EnableUserOpe();\r
2913                 }\r
2914                 else\r
2915                 {\r
2916                         if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
2917                         {\r
2918                                 DisableUserOpe();\r
2919                                 DoMKD(Path);\r
2920                                 GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);\r
2921                                 EnableUserOpe();\r
2922                         }\r
2923                 }\r
2924         }\r
2925         return;\r
2926 }\r
2927 \r
2928 \r
2929 /*----- ヒストリリストを使ったディレクトリの移動 ------------------------------\r
2930 *\r
2931 *       Parameter\r
2932 *               HWND hWnd : コンボボックスのウインドウハンドル\r
2933 *\r
2934 *       Return Value\r
2935 *               なし\r
2936 *----------------------------------------------------------------------------*/\r
2937 \r
2938 void ChangeDirComboProc(HWND hWnd)\r
2939 {\r
2940         char Tmp[FMAX_PATH+1];\r
2941         int i;\r
2942 \r
2943         // 同時接続対応\r
2944         CancelFlg = NO;\r
2945 \r
2946         if((i = SendMessage(hWnd, CB_GETCURSEL, 0, 0)) != CB_ERR)\r
2947         {\r
2948                 SendMessage(hWnd, CB_GETLBTEXT, i, (LPARAM)Tmp);\r
2949 \r
2950                 if(hWnd == GetLocalHistHwnd())\r
2951                 {\r
2952                         DisableUserOpe();\r
2953                         DoLocalCWD(Tmp);\r
2954                         GetLocalDirForWnd();\r
2955                         EnableUserOpe();\r
2956                 }\r
2957                 else\r
2958                 {\r
2959                         if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
2960                         {\r
2961                                 DisableUserOpe();\r
2962                                 if(DoCWD(Tmp, YES, NO, YES) < FTP_RETRY)\r
2963                                         GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg);\r
2964                                 EnableUserOpe();\r
2965                         }\r
2966                 }\r
2967         }\r
2968         return;\r
2969 }\r
2970 \r
2971 \r
2972 /*----- ブックマークを使ったディレクトリの移動 --------------------------------\r
2973 *\r
2974 *       Parameter\r
2975 *               int MarkID : ブックマークのメニューID\r
2976 *\r
2977 *       Return Value\r
2978 *               なし\r
2979 *----------------------------------------------------------------------------*/\r
2980 \r
2981 void ChangeDirBmarkProc(int MarkID)\r
2982 {\r
2983         char Local[FMAX_PATH+1];\r
2984         char Remote[FMAX_PATH+1];\r
2985         int Sts;\r
2986 \r
2987         // 同時接続対応\r
2988         CancelFlg = NO;\r
2989 \r
2990         Sts = AskBookMarkText(MarkID, Local, Remote, FMAX_PATH+1);\r
2991         if((Sts == BMARK_TYPE_LOCAL) || (Sts == BMARK_TYPE_BOTH))\r
2992         {\r
2993                 DisableUserOpe();\r
2994                 if(DoLocalCWD(Local) == FFFTP_SUCCESS)\r
2995                         GetLocalDirForWnd();\r
2996                 EnableUserOpe();\r
2997         }\r
2998 \r
2999         if((Sts == BMARK_TYPE_REMOTE) || (Sts == BMARK_TYPE_BOTH))\r
3000         {\r
3001                 if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
3002                 {\r
3003                         DisableUserOpe();\r
3004                         if(DoCWD(Remote, YES, NO, YES) < FTP_RETRY)\r
3005                                 GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg);\r
3006                         EnableUserOpe();\r
3007                 }\r
3008         }\r
3009         return;\r
3010 }\r
3011 \r
3012 \r
3013 /*----- ディレクトリ名を入力してディレクトリの移動 ----------------------------\r
3014 *\r
3015 *       Parameter\r
3016 *               int Win : ウインドウ番号 (WIN_xxx)\r
3017 *\r
3018 *       Return Value\r
3019 *               なし\r
3020 *----------------------------------------------------------------------------*/\r
3021 \r
3022 void ChangeDirDirectProc(int Win)\r
3023 {\r
3024         int Sts;\r
3025         char Path[FMAX_PATH+1];\r
3026         char *Title;\r
3027         int Tmp;\r
3028 \r
3029         // 同時接続対応\r
3030         CancelFlg = NO;\r
3031 \r
3032         if(Win == WIN_LOCAL)\r
3033                 Title = MSGJPN072;\r
3034         else\r
3035                 Title = MSGJPN073;\r
3036 \r
3037         strcpy(Path, "");\r
3038         if(Win == WIN_LOCAL)\r
3039         // フォルダ選択ダイアログを直接表示\r
3040 //              Sts = InputDialogBox(chdir_br_dlg, GetMainHwnd(), Title, Path, FMAX_PATH+1, &Tmp, IDH_HELP_TOPIC_0000001);\r
3041         {\r
3042                 if(SelectDir(GetMainHwnd(), Path, FMAX_PATH) == TRUE)\r
3043                         Sts = YES;\r
3044         }\r
3045         else\r
3046                 Sts = InputDialogBox(chdir_dlg, GetMainHwnd(), Title, Path, FMAX_PATH+1, &Tmp, IDH_HELP_TOPIC_0000001);\r
3047 \r
3048         if((Sts == YES) && (strlen(Path) != 0))\r
3049         {\r
3050                 if(Win == WIN_LOCAL)\r
3051                 {\r
3052                         DisableUserOpe();\r
3053                         DoLocalCWD(Path);\r
3054                         GetLocalDirForWnd();\r
3055                         EnableUserOpe();\r
3056                 }\r
3057                 else\r
3058                 {\r
3059                         if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
3060                         {\r
3061                                 DisableUserOpe();\r
3062                                 if(DoCWD(Path, YES, NO, YES) < FTP_RETRY)\r
3063                                         GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg);\r
3064                                 EnableUserOpe();\r
3065                         }\r
3066                 }\r
3067         }\r
3068         return;\r
3069 }\r
3070 \r
3071 \r
3072 /*----- Dropされたファイルによるディレクトリの移動 ----------------------------\r
3073 *\r
3074 *       Parameter\r
3075 *               WPARAM wParam : ドロップされたファイルの情報\r
3076 *\r
3077 *       Return Value\r
3078 *               なし\r
3079 *----------------------------------------------------------------------------*/\r
3080 \r
3081 void ChangeDirDropFileProc(WPARAM wParam)\r
3082 {\r
3083         char Path[FMAX_PATH+1];\r
3084 \r
3085         DisableUserOpe();\r
3086         MakeDroppedDir(wParam, Path);\r
3087         DoLocalCWD(Path);\r
3088         GetLocalDirForWnd();\r
3089         EnableUserOpe();\r
3090         return;\r
3091 }\r
3092 \r
3093 \r
3094 /*----- ファイルの属性変更 ----------------------------------------------------\r
3095 *\r
3096 *       Parameter\r
3097 *               なし\r
3098 *\r
3099 *       Return Value\r
3100 *               なし\r
3101 *----------------------------------------------------------------------------*/\r
3102 \r
3103 void ChmodProc(void)\r
3104 {\r
3105         int ChmodFlg;\r
3106         FILELIST *FileListBase;\r
3107         FILELIST *Pos;\r
3108         char Tmp[5];\r
3109         char *Buf;\r
3110         char *BufTmp;\r
3111         int BufLen;\r
3112 \r
3113         // 同時接続対応\r
3114         CancelFlg = NO;\r
3115 \r
3116         if(GetFocus() == GetRemoteHwnd())\r
3117         {\r
3118                 if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
3119                 {\r
3120                         DisableUserOpe();\r
3121                         FileListBase = NULL;\r
3122                         MakeSelectedFileList(WIN_REMOTE, NO, NO, &FileListBase, &CancelFlg);\r
3123                         if(FileListBase != NULL)\r
3124                         {\r
3125                                 sprintf(Tmp, "%03X", FileListBase->Attr);\r
3126                                 if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(chmod_dlg), GetMainHwnd(), ChmodDialogCallBack, (LPARAM)Tmp) == YES)\r
3127                                 {\r
3128                                         ChmodFlg = NO;\r
3129                                         Pos = FileListBase;\r
3130                                         while(Pos != NULL)\r
3131                                         {\r
3132                                                 if((Pos->Node == NODE_FILE) || (Pos->Node == NODE_DIR))\r
3133                                                 {\r
3134                                                         DoCHMOD(Pos->File, Tmp);\r
3135                                                         ChmodFlg = YES;\r
3136                                                 }\r
3137                                                 Pos = Pos->Next;\r
3138                                         }\r
3139                                         if(ChmodFlg == YES)\r
3140                                                 GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);\r
3141                                 }\r
3142                         }\r
3143                         DeleteFileList(&FileListBase);\r
3144                         EnableUserOpe();\r
3145                 }\r
3146         }\r
3147         else if(GetFocus() == GetLocalHwnd())\r
3148         {\r
3149                 DisableUserOpe();\r
3150                 FileListBase = NULL;\r
3151                 MakeSelectedFileList(WIN_LOCAL, NO, NO, &FileListBase, &CancelFlg);\r
3152                 if(FileListBase != NULL)\r
3153                 {\r
3154                         if((Buf = malloc(1)) != NULL)\r
3155                         {\r
3156                                 *Buf = NUL;\r
3157                                 BufLen = 0;\r
3158                                 Pos = FileListBase;\r
3159                                 while(Pos != NULL)\r
3160                                 {\r
3161                                         if((BufTmp = realloc(Buf, BufLen + strlen(Pos->File) + 2)) != NULL)\r
3162                                         {\r
3163                                                 Buf = BufTmp;\r
3164                                                 strcpy(Buf+BufLen, Pos->File);\r
3165                                                 BufLen += strlen(Pos->File) + 1;\r
3166                                         }\r
3167                                         Pos = Pos->Next;\r
3168                                 }\r
3169 \r
3170                                 memset(Buf+BufLen, NUL, 1);\r
3171                                 DispFileProperty(Buf);\r
3172                                 free(Buf);\r
3173                         }\r
3174                 }\r
3175                 DeleteFileList(&FileListBase);\r
3176                 EnableUserOpe();\r
3177         }\r
3178         return;\r
3179 }\r
3180 \r
3181 \r
3182 /*----- 属性変更ダイアログのコールバック --------------------------------------\r
3183 *\r
3184 *       Parameter\r
3185 *               HWND hDlg : ウインドウハンドル\r
3186 *               UINT message : メッセージ番号\r
3187 *               WPARAM wParam : メッセージの WPARAM 引数\r
3188 *               LPARAM lParam : メッセージの LPARAM 引数\r
3189 *\r
3190 *       Return Value\r
3191 *               BOOL TRUE/FALSE\r
3192 *----------------------------------------------------------------------------*/\r
3193 \r
3194 // 64ビット対応\r
3195 //BOOL CALLBACK ChmodDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
3196 INT_PTR CALLBACK ChmodDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
3197 {\r
3198         char Str[5];\r
3199         static char *Buf;\r
3200         int Tmp;\r
3201 \r
3202         switch (iMessage)\r
3203         {\r
3204                 case WM_INITDIALOG :\r
3205                         Buf = (char *)lParam;\r
3206                         SendDlgItemMessage(hDlg, PERM_NOW, EM_LIMITTEXT, 4, 0);\r
3207                         SendDlgItemMessage(hDlg, PERM_NOW, WM_SETTEXT, 0, (LPARAM)Buf);\r
3208                         SetAttrToDialog(hDlg, xtoi(Buf));\r
3209                         return(TRUE);\r
3210 \r
3211                 case WM_COMMAND :\r
3212                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
3213                         {\r
3214                                 case IDOK :\r
3215                                         SendDlgItemMessage(hDlg, PERM_NOW, WM_GETTEXT, 5, (LPARAM)Buf);\r
3216                                         EndDialog(hDlg, YES);\r
3217                                         break;\r
3218 \r
3219                                 case IDCANCEL :\r
3220                                         EndDialog(hDlg, NO);\r
3221                                         break;\r
3222 \r
3223                                 case PERM_O_READ :\r
3224                                 case PERM_O_WRITE :\r
3225                                 case PERM_O_EXEC :\r
3226                                 case PERM_G_READ :\r
3227                                 case PERM_G_WRITE :\r
3228                                 case PERM_G_EXEC :\r
3229                                 case PERM_A_READ :\r
3230                                 case PERM_A_WRITE :\r
3231                                 case PERM_A_EXEC :\r
3232                                         Tmp = GetAttrFromDialog(hDlg);\r
3233                                         sprintf(Str, "%03X", Tmp);\r
3234                                         SendDlgItemMessage(hDlg, PERM_NOW, WM_SETTEXT, 0, (LPARAM)Str);\r
3235                                         break;\r
3236 \r
3237                                 case IDHELP :\r
3238                                         hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000017);\r
3239                                         break;\r
3240                         }\r
3241             return(TRUE);\r
3242         }\r
3243         return(FALSE);\r
3244 }\r
3245 \r
3246 \r
3247 /*----- 属性をダイアログボックスに設定 ----------------------------------------\r
3248 *\r
3249 *       Parameter\r
3250 *               HWND hWnd : ダイアログボックスのウインドウハンドル\r
3251 *               int Attr : 属性\r
3252 *\r
3253 *       Return Value\r
3254 *               なし\r
3255 *----------------------------------------------------------------------------*/\r
3256 \r
3257 static void SetAttrToDialog(HWND hDlg, int Attr)\r
3258 {\r
3259         if(Attr & 0x400)\r
3260                 SendDlgItemMessage(hDlg, PERM_O_READ, BM_SETCHECK, 1, 0);\r
3261         if(Attr & 0x200)\r
3262                 SendDlgItemMessage(hDlg, PERM_O_WRITE, BM_SETCHECK, 1, 0);\r
3263         if(Attr & 0x100)\r
3264                 SendDlgItemMessage(hDlg, PERM_O_EXEC, BM_SETCHECK, 1, 0);\r
3265 \r
3266         if(Attr & 0x40)\r
3267                 SendDlgItemMessage(hDlg, PERM_G_READ, BM_SETCHECK, 1, 0);\r
3268         if(Attr & 0x20)\r
3269                 SendDlgItemMessage(hDlg, PERM_G_WRITE, BM_SETCHECK, 1, 0);\r
3270         if(Attr & 0x10)\r
3271                 SendDlgItemMessage(hDlg, PERM_G_EXEC, BM_SETCHECK, 1, 0);\r
3272 \r
3273         if(Attr & 0x4)\r
3274                 SendDlgItemMessage(hDlg, PERM_A_READ, BM_SETCHECK, 1, 0);\r
3275         if(Attr & 0x2)\r
3276                 SendDlgItemMessage(hDlg, PERM_A_WRITE, BM_SETCHECK, 1, 0);\r
3277         if(Attr & 0x1)\r
3278                 SendDlgItemMessage(hDlg, PERM_A_EXEC, BM_SETCHECK, 1, 0);\r
3279 \r
3280         return;\r
3281 }\r
3282 \r
3283 \r
3284 /*----- ダイアログボックスの内容から属性を取得 --------------------------------\r
3285 *\r
3286 *       Parameter\r
3287 *               HWND hWnd : ダイアログボックスのウインドウハンドル\r
3288 *\r
3289 *       Return Value\r
3290 *               int 属性\r
3291 *----------------------------------------------------------------------------*/\r
3292 \r
3293 static int GetAttrFromDialog(HWND hDlg)\r
3294 {\r
3295         int Ret;\r
3296 \r
3297         Ret = 0;\r
3298 \r
3299         if(SendDlgItemMessage(hDlg, PERM_O_READ, BM_GETCHECK, 0, 0) == 1)\r
3300                 Ret |= 0x400;\r
3301         if(SendDlgItemMessage(hDlg, PERM_O_WRITE, BM_GETCHECK, 0, 0) == 1)\r
3302                 Ret |= 0x200;\r
3303         if(SendDlgItemMessage(hDlg, PERM_O_EXEC, BM_GETCHECK, 0, 0) == 1)\r
3304                 Ret |= 0x100;\r
3305 \r
3306         if(SendDlgItemMessage(hDlg, PERM_G_READ, BM_GETCHECK, 0, 0) == 1)\r
3307                 Ret |= 0x40;\r
3308         if(SendDlgItemMessage(hDlg, PERM_G_WRITE, BM_GETCHECK, 0, 0) == 1)\r
3309                 Ret |= 0x20;\r
3310         if(SendDlgItemMessage(hDlg, PERM_G_EXEC, BM_GETCHECK, 0, 0) == 1)\r
3311                 Ret |= 0x10;\r
3312 \r
3313         if(SendDlgItemMessage(hDlg, PERM_A_READ, BM_GETCHECK, 0, 0) == 1)\r
3314                 Ret |= 0x4;\r
3315         if(SendDlgItemMessage(hDlg, PERM_A_WRITE, BM_GETCHECK, 0, 0) == 1)\r
3316                 Ret |= 0x2;\r
3317         if(SendDlgItemMessage(hDlg, PERM_A_EXEC, BM_GETCHECK, 0, 0) == 1)\r
3318                 Ret |= 0x1;\r
3319 \r
3320         return(Ret);\r
3321 }\r
3322 \r
3323 \r
3324 \r
3325 \r
3326 /*----- 任意のコマンドを送る --------------------------------------------------\r
3327 *\r
3328 *       Parameter\r
3329 *               なし\r
3330 *\r
3331 *       Return Value\r
3332 *               なし\r
3333 *----------------------------------------------------------------------------*/\r
3334 \r
3335 void SomeCmdProc(void)\r
3336 {\r
3337         char Cmd[81];\r
3338         int Tmp;\r
3339         FILELIST *FileListBase;\r
3340 \r
3341         // 同時接続対応\r
3342         CancelFlg = NO;\r
3343 \r
3344         if(GetFocus() == GetRemoteHwnd())\r
3345         {\r
3346                 if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
3347                 {\r
3348                         DisableUserOpe();\r
3349                         FileListBase = NULL;\r
3350                         MakeSelectedFileList(WIN_REMOTE, NO, NO, &FileListBase, &CancelFlg);\r
3351                         memset(Cmd, NUL, 81);\r
3352                         if(FileListBase != NULL)\r
3353                         {\r
3354                                 strncpy(Cmd, FileListBase->File, 80);\r
3355                         }\r
3356                         DeleteFileList(&FileListBase);\r
3357 \r
3358                         if(InputDialogBox(somecmd_dlg, GetMainHwnd(), NULL, Cmd, 81, &Tmp, IDH_HELP_TOPIC_0000023) == YES)\r
3359                         {\r
3360                                 // 同時接続対応\r
3361                                 //DoQUOTE(Cmd);\r
3362                                 DoQUOTE(AskCmdCtrlSkt(), Cmd, &CancelFlg);\r
3363                         }\r
3364                         EnableUserOpe();\r
3365                 }\r
3366         }\r
3367         return;\r
3368 }\r
3369 \r
3370 \r
3371 \r
3372 \r
3373 /*----- ファイル総容量の計算を行う --------------------------------------------\r
3374 *\r
3375 *       Parameter\r
3376 *               なし\r
3377 *\r
3378 *       Return Value\r
3379 *               なし\r
3380 *----------------------------------------------------------------------------*/\r
3381 \r
3382 void CalcFileSizeProc(void)\r
3383 {\r
3384         FILELIST *ListBase;\r
3385         FILELIST *Pos;\r
3386         int Win;\r
3387         int All;\r
3388         int Sts;\r
3389 \r
3390         // 同時接続対応\r
3391         CancelFlg = NO;\r
3392 \r
3393         if((All = DialogBox(GetFtpInst(), MAKEINTRESOURCE(filesize_notify_dlg), GetMainHwnd(), SizeNotifyDlgWndProc)) != NO_ALL)\r
3394         {\r
3395                 Sts = FFFTP_SUCCESS;\r
3396                 if(GetFocus() == GetLocalHwnd())\r
3397                         Win = WIN_LOCAL;\r
3398                 else\r
3399                 {\r
3400                         Win = WIN_REMOTE;\r
3401                         Sts = CheckClosedAndReconnect();\r
3402                 }\r
3403 \r
3404                 if(Sts == FFFTP_SUCCESS)\r
3405                 {\r
3406                         ListBase = NULL;\r
3407                         MakeSelectedFileList(Win, YES, All, &ListBase, &CancelFlg);\r
3408 \r
3409                         FileSize = 0;\r
3410                         Pos = ListBase;\r
3411                         while(Pos != NULL)\r
3412                         {\r
3413                                 if(Pos->Node != NODE_DIR)\r
3414                                         FileSize += Pos->Size;\r
3415                                 Pos = Pos->Next;\r
3416                         }\r
3417                         DeleteFileList(&ListBase);\r
3418                         DialogBox(GetFtpInst(), MAKEINTRESOURCE(filesize_dlg), GetMainHwnd(), SizeDlgWndProc);\r
3419                 }\r
3420         }\r
3421         return;\r
3422 }\r
3423 \r
3424 \r
3425 /*----- ファイル容量検索確認ダイアログのコールバック --------------------------\r
3426 *\r
3427 *       Parameter\r
3428 *               HWND hDlg : ウインドウハンドル\r
3429 *               UINT message  : メッセージ番号\r
3430 *               WPARAM wParam : メッセージの WPARAM 引数\r
3431 *               LPARAM lParam : メッセージの LPARAM 引数\r
3432 *\r
3433 *       Return Value\r
3434 *               メッセージに対応する戻り値\r
3435 *----------------------------------------------------------------------------*/\r
3436 \r
3437 static LRESULT CALLBACK SizeNotifyDlgWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
3438 {\r
3439         switch (message)\r
3440         {\r
3441                 case WM_INITDIALOG :\r
3442                         if(GetFocus() == GetLocalHwnd())\r
3443                                 SendDlgItemMessage(hDlg, FSNOTIFY_TITLE, WM_SETTEXT, 0, (LPARAM)MSGJPN074);\r
3444                         else\r
3445                                 SendDlgItemMessage(hDlg, FSNOTIFY_TITLE, WM_SETTEXT, 0, (LPARAM)MSGJPN075);\r
3446                         return(TRUE);\r
3447 \r
3448                 case WM_COMMAND :\r
3449                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
3450                         {\r
3451                                 case IDOK :\r
3452                                         if(SendDlgItemMessage(hDlg, FSNOTIFY_SEL_ONLY, BM_GETCHECK, 0, 0) == 1)\r
3453                                                 EndDialog(hDlg, NO);\r
3454                                         else\r
3455                                                 EndDialog(hDlg, YES);\r
3456                                         break;\r
3457 \r
3458                                 case IDCANCEL :\r
3459                                         EndDialog(hDlg, NO_ALL);\r
3460                                         break;\r
3461                         }\r
3462                         return(TRUE);\r
3463         }\r
3464     return(FALSE);\r
3465 }\r
3466 \r
3467 \r
3468 /*----- ファイル容量検索ダイアログのコールバック ------------------------------\r
3469 *\r
3470 *       Parameter\r
3471 *               HWND hDlg : ウインドウハンドル\r
3472 *               UINT message  : メッセージ番号\r
3473 *               WPARAM wParam : メッセージの WPARAM 引数\r
3474 *               LPARAM lParam : メッセージの LPARAM 引数\r
3475 *\r
3476 *       Return Value\r
3477 *               メッセージに対応する戻り値\r
3478 *----------------------------------------------------------------------------*/\r
3479 \r
3480 static LRESULT CALLBACK SizeDlgWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
3481 {\r
3482         char Tmp[FMAX_PATH+1];\r
3483 \r
3484         switch (message)\r
3485         {\r
3486                 case WM_INITDIALOG :\r
3487                         if(GetFocus() == GetLocalHwnd())\r
3488                                 SendDlgItemMessage(hDlg, FSIZE_TITLE, WM_SETTEXT, 0, (LPARAM)MSGJPN076);\r
3489                         else\r
3490                                 SendDlgItemMessage(hDlg, FSIZE_TITLE, WM_SETTEXT, 0, (LPARAM)MSGJPN077);\r
3491 \r
3492                         MakeSizeString(FileSize, Tmp);\r
3493                         SendDlgItemMessage(hDlg, FSIZE_SIZE, WM_SETTEXT, 0, (LPARAM)Tmp);\r
3494                         return(TRUE);\r
3495 \r
3496                 case WM_COMMAND :\r
3497                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
3498                         {\r
3499                                 case IDOK :\r
3500                                 case IDCANCEL :\r
3501                                         EndDialog(hDlg, YES);\r
3502                                         break;\r
3503 \r
3504                         }\r
3505                         return(TRUE);\r
3506         }\r
3507     return(FALSE);\r
3508 }\r
3509 \r
3510 \r
3511 /*----- ディレクトリ移動失敗時のエラーを表示 ----------------------------------\r
3512 *\r
3513 *       Parameter\r
3514 *               HWND hDlg : ウインドウハンドル\r
3515 *\r
3516 *       Return Value\r
3517 *               なし\r
3518 *----------------------------------------------------------------------------*/\r
3519 \r
3520 void DispCWDerror(HWND hWnd)\r
3521 {\r
3522         DialogBox(GetFtpInst(), MAKEINTRESOURCE(cwderr_dlg), hWnd, ExeEscDialogProc);\r
3523         return;\r
3524 }\r
3525 \r
3526 \r
3527 /*----- URLをクリップボードにコピー -------------------------------------------\r
3528 *\r
3529 *       Parameter\r
3530 *               なし\r
3531 *\r
3532 *       Return Value\r
3533 *               なし\r
3534 *----------------------------------------------------------------------------*/\r
3535 \r
3536 void CopyURLtoClipBoard(void)\r
3537 {\r
3538         FILELIST *FileListBase;\r
3539         FILELIST *Pos;\r
3540         char *Buf;\r
3541         char Path[FMAX_PATH+1];\r
3542         char Host[HOST_ADRS_LEN+1];\r
3543         char Port[10];\r
3544         int Set;\r
3545         int Total;\r
3546 \r
3547         if(GetFocus() == GetRemoteHwnd())\r
3548         {\r
3549                 FileListBase = NULL;\r
3550                 MakeSelectedFileList(WIN_REMOTE, NO, NO, &FileListBase, &CancelFlg);\r
3551                 if(FileListBase != NULL)\r
3552                 {\r
3553                         strcpy(Host, AskHostAdrs());\r
3554                         Total = 0;\r
3555                         Buf = NULL;\r
3556                         Pos = FileListBase;\r
3557                         while(Pos != NULL)\r
3558                         {\r
3559                                 AskRemoteCurDir(Path, FMAX_PATH);\r
3560                                 SetSlashTail(Path);\r
3561                                 strcat(Path, Pos->File);\r
3562 \r
3563                                 if(AskHostType() == HTYPE_VMS)\r
3564                                         ReformToVMSstylePathName(Path);\r
3565 \r
3566                                 strcpy(Port, "");\r
3567                                 if(AskHostPort() != PORT_NOR)\r
3568                                         sprintf(Port, ":%d", AskHostPort());\r
3569 \r
3570                                 Set = Total;\r
3571                                 Total += strlen(Path) + strlen(Host) + strlen(Port) + 8;        /* 8は "ftp://\r\n" のぶん */\r
3572                                 if(AskHostType() == HTYPE_VMS)\r
3573                                         Total++;\r
3574 \r
3575                                 if((Buf = realloc(Buf, Total+1)) == NULL)\r
3576                                         break;\r
3577 \r
3578                                 if(AskHostType() != HTYPE_VMS)\r
3579                                         sprintf(Buf + Set, "ftp://%s%s%s\r\n", Host, Port, Path);\r
3580                                 else\r
3581                                         sprintf(Buf + Set, "ftp://%s%s/%s\r\n", Host, Port, Path);\r
3582 \r
3583                                 Pos = Pos->Next;\r
3584                         }\r
3585 \r
3586                         if(Buf != NULL)\r
3587                         {\r
3588                                 CopyStrToClipBoard(Buf);\r
3589                                 free(Buf);\r
3590                         }\r
3591                 }\r
3592                 DeleteFileList(&FileListBase);\r
3593         }\r
3594         return;\r
3595 }\r
3596 \r
3597 \r
3598 /*----- フルパスを使わないファイルアクセスの準備 ------------------------------\r
3599 *\r
3600 *       Parameter\r
3601 *               char *Path : パス名\r
3602 *               char *CurDir : カレントディレクトリ\r
3603 *               HWND hWnd : エラーウインドウを表示する際の親ウインドウ\r
3604 *               int Type : 使用するソケットの種類\r
3605 *                       0=コマンドソケット, 1=転送ソケット\r
3606 *\r
3607 *       Return Value\r
3608 *               int ステータス(FFFTP_SUCCESS/FFFTP_FAIL)\r
3609 *\r
3610 *       Note\r
3611 *               フルパスを使わない時は、\r
3612 *                       このモジュール内で CWD を行ない、\r
3613 *                       Path にファイル名のみ残す。(パス名は消す)\r
3614 *----------------------------------------------------------------------------*/\r
3615 \r
3616 // 同時接続対応\r
3617 //int ProcForNonFullpath(char *Path, char *CurDir, HWND hWnd, int Type)\r
3618 int ProcForNonFullpath(SOCKET cSkt, char *Path, char *CurDir, HWND hWnd, int *CancelCheckWork)\r
3619 {\r
3620         int Sts;\r
3621         int Cmd;\r
3622         char Tmp[FMAX_PATH+1];\r
3623 \r
3624         Sts = FFFTP_SUCCESS;\r
3625         if(AskNoFullPathMode() == YES)\r
3626         {\r
3627                 strcpy(Tmp, Path);\r
3628                 if(AskHostType() == HTYPE_VMS)\r
3629                 {\r
3630                         GetUpperDirEraseTopSlash(Tmp);\r
3631                         ReformToVMSstyleDirName(Tmp);\r
3632                 }\r
3633                 else if(AskHostType() == HTYPE_STRATUS)\r
3634                         GetUpperDirEraseTopSlash(Tmp);\r
3635                 else\r
3636                         GetUpperDir(Tmp);\r
3637 \r
3638                 if(strcmp(Tmp, CurDir) != 0)\r
3639                 {\r
3640                         // 同時接続対応\r
3641 //                      if(Type == 0)\r
3642 //                              Cmd = CommandProcCmd(NULL, "CWD %s", Tmp);\r
3643 //                      else\r
3644 //                              Cmd = CommandProcTrn(NULL, "CWD %s", Tmp);\r
3645                         Cmd = CommandProcTrn(cSkt, NULL, CancelCheckWork, "CWD %s", Tmp);\r
3646 \r
3647                         if(Cmd/100 != FTP_COMPLETE)\r
3648                         {\r
3649                                 DispCWDerror(hWnd);\r
3650                                 Sts = FFFTP_FAIL;\r
3651                         }\r
3652                         else\r
3653                                 strcpy(CurDir, Tmp);\r
3654                 }\r
3655                 strcpy(Path, GetFileName(Path));\r
3656         }\r
3657         return(Sts);\r
3658 }\r
3659 \r
3660 \r
3661 /*----- ディレクトリ名をVAX VMSスタイルに変換する -----------------------------\r
3662 *\r
3663 *       Parameter\r
3664 *               char *Path : パス名\r
3665 *\r
3666 *       Return Value\r
3667 *               なし\r
3668 *\r
3669 *       Note\r
3670 *               ddd:[xxx.yyy]/rrr/ppp  --> ddd:[xxx.yyy.rrr.ppp]\r
3671 *----------------------------------------------------------------------------*/\r
3672 \r
3673 void ReformToVMSstyleDirName(char *Path)\r
3674 {\r
3675         char *Pos;\r
3676         char *Btm;\r
3677 \r
3678         if((Btm = strchr(Path, ']')) != NULL)\r
3679         {\r
3680                 Pos = Btm;\r
3681                 while((Pos = strchr(Pos, '/')) != NULL)\r
3682                         *Pos = '.';\r
3683 \r
3684                 memmove(Btm, Btm+1, strlen(Btm+1)+1);\r
3685                 Pos = strchr(Path, NUL);\r
3686                 if(*(Pos-1) == '.')\r
3687                 {\r
3688                         Pos--;\r
3689                         *Pos = NUL;\r
3690                 }\r
3691                 strcpy(Pos, "]");\r
3692         }\r
3693         return;\r
3694 }\r
3695 \r
3696 \r
3697 /*----- ファイル名をVAX VMSスタイルに変換する ---------------------------------\r
3698 *\r
3699 *       Parameter\r
3700 *               char *Path : パス名\r
3701 *\r
3702 *       Return Value\r
3703 *               なし\r
3704 *\r
3705 *       Note\r
3706 *               ddd:[xxx.yyy]/rrr/ppp  --> ddd:[xxx.yyy.rrr]ppp\r
3707 *----------------------------------------------------------------------------*/\r
3708 \r
3709 void ReformToVMSstylePathName(char *Path)\r
3710 {\r
3711         char Fname[FMAX_PATH+1];\r
3712 \r
3713         strcpy(Fname, GetFileName(Path));\r
3714 \r
3715         GetUpperDirEraseTopSlash(Path);\r
3716         ReformToVMSstyleDirName(Path);\r
3717 \r
3718         strcat(Path, Fname);\r
3719 \r
3720         return;\r
3721 }\r
3722 \r
3723 \r
3724 #if defined(HAVE_OPENVMS)\r
3725 /*----- VMSの"HOGE.DIR;?"というディレクトリ名から"HOGE"を取り出す ---------------\r
3726 *\r
3727 *       Parameter\r
3728 *               char *DirName : "HOGE.DIR;?"形式のディレクトリ名\r
3729 *               int Flg       : ";"のチェックをする(TRUE)かしない(FALSE)か\r
3730 *\r
3731 *       Return Value\r
3732 *               なし\r
3733 *\r
3734 *       Note\r
3735 *               DirNameを直接書きかえる\r
3736 *----------------------------------------------------------------------------*/\r
3737 \r
3738 void ReformVMSDirName(char *DirName, int Flg)\r
3739 {\r
3740         char *p;\r
3741 \r
3742         if (Flg == TRUE) {\r
3743                 /* ';'がない場合はVMS形式じゃなさそうなので何もしない */\r
3744                 if ((p = strrchr(DirName, ';')) == NULL)\r
3745                         return;\r
3746         }\r
3747 \r
3748         /* ".DIR"があったらつぶす */\r
3749         if ((p = strrchr(DirName, '.'))) {\r
3750                 if (memcmp(p + 1, "DIR", 3) == 0)\r
3751                         *p = '\0';\r
3752         }\r
3753 }\r
3754 #endif\r
3755 \r
3756 \r
3757 /*----- ファイル名に使えない文字がないかチェックし名前を変更する --------------\r
3758 *\r
3759 *       Parameter\r
3760 *               char *Fname : ファイル名\r
3761 *\r
3762 *       Return Value\r
3763 *               int ステータス\r
3764 *                       FFFTP_SUCCESS/FFFTP_FAIL=中止する\r
3765 *\r
3766 *       Note\r
3767 *               Fnameを直接書きかえる\r
3768 *----------------------------------------------------------------------------*/\r
3769 \r
3770 static int RenameUnuseableName(char *Fname)\r
3771 {\r
3772         int Tmp;\r
3773         int Ret;\r
3774 \r
3775         Ret = FFFTP_SUCCESS;\r
3776         while(1)\r
3777         {\r
3778                 if((_mbschr(Fname, ':') != NULL) ||\r
3779                    (_mbschr(Fname, '*') != NULL) ||\r
3780                    (_mbschr(Fname, '?') != NULL) ||\r
3781                    (_mbschr(Fname, '<') != NULL) ||\r
3782                    (_mbschr(Fname, '>') != NULL) ||\r
3783                    (_mbschr(Fname, '|') != NULL) ||\r
3784                    (_mbschr(Fname, '\x22') != NULL) ||\r
3785                    (_mbschr(Fname, '\\') != NULL))\r
3786                 {\r
3787                         if(InputDialogBox(forcerename_dlg, GetMainHwnd(), NULL, Fname, FMAX_PATH+1, &Tmp, IDH_HELP_TOPIC_0000001) == NO)\r
3788                         {\r
3789                                 Ret = FFFTP_FAIL;\r
3790                                 break;\r
3791                         }\r
3792                 }\r
3793                 else\r
3794                         break;\r
3795         }\r
3796         return(Ret);\r
3797 }\r
3798 \r
3799 \r
3800 // 自動切断対策\r
3801 // NOOPコマンドでは効果が無いホストが多いためLISTコマンドを使用\r
3802 void NoopProc(int Force)\r
3803 {\r
3804         int CancelCheckWork;\r
3805         CancelCheckWork = NO;\r
3806         if(Force == YES || (AskConnecting() == YES && AskUserOpeDisabled() == NO))\r
3807         {\r
3808                 if(AskReuseCmdSkt() == NO || AskShareProh() == YES || AskTransferNow() == NO)\r
3809                 {\r
3810                         DisableUserOpe();\r
3811                         DoDirListCmdSkt("", "", 999, &CancelCheckWork);\r
3812                         EnableUserOpe();\r
3813                 }\r
3814         }\r
3815 }\r
3816 \r
3817 // 同時接続対応\r
3818 void AbortRecoveryProc(void)\r
3819 {\r
3820         CancelFlg = NO;\r
3821         if(AskConnecting() == YES && AskUserOpeDisabled() == NO)\r
3822         {\r
3823                 if(AskReuseCmdSkt() == NO || AskShareProh() == YES || AskTransferNow() == NO)\r
3824                 {\r
3825                         if(AskErrorReconnect() == YES)\r
3826                         {\r
3827                                 DisableUserOpe();\r
3828                                         ReConnectCmdSkt();\r
3829                                 GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);\r
3830                                 EnableUserOpe();\r
3831                         }\r
3832                         else\r
3833                                 RemoveReceivedData(AskCmdCtrlSkt());\r
3834                 }\r
3835         }\r
3836         return;\r
3837 }\r
3838 \r