OSDN Git Service

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