OSDN Git Service

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