OSDN Git Service

Move *.c and *.h files to src
[ffftp/ffftp.git] / src / ftpproc.c
diff --git a/src/ftpproc.c b/src/ftpproc.c
new file mode 100644 (file)
index 0000000..fa48c9b
--- /dev/null
@@ -0,0 +1,3917 @@
+/*=============================================================================\r
+*\r
+*                                                              FTPコマンド操作\r
+*\r
+===============================================================================\r
+/ Copyright (C) 1997-2007 Sota. All rights reserved.\r
+/\r
+/ Redistribution and use in source and binary forms, with or without \r
+/ modification, are permitted provided that the following conditions \r
+/ are met:\r
+/\r
+/  1. Redistributions of source code must retain the above copyright \r
+/     notice, this list of conditions and the following disclaimer.\r
+/  2. Redistributions in binary form must reproduce the above copyright \r
+/     notice, this list of conditions and the following disclaimer in the \r
+/     documentation and/or other materials provided with the distribution.\r
+/\r
+/ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR \r
+/ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES \r
+/ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r
+/ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, \r
+/ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r
+/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF \r
+/ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON \r
+/ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+/ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF \r
+/ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+/============================================================================*/\r
+\r
+#define  STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
+#include <windows.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <mbstring.h>\r
+#include <windowsx.h>\r
+#include <commctrl.h>\r
+\r
+#include "common.h"\r
+#include "resource.h"\r
+\r
+#include <htmlhelp.h>\r
+#include "helpid.h"\r
+\r
+// UTF-8対応\r
+#undef __MBSWRAPPER_H__\r
+#include "mbswrapper.h"\r
+\r
+\r
+/*===== プロトタイプ =====*/\r
+\r
+static int CheckRemoteFile(TRANSPACKET *Pkt, FILELIST *ListList);\r
+// 64ビット対応\r
+//static BOOL CALLBACK UpExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static INT_PTR CALLBACK UpExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+\r
+static void DispMirrorFiles(FILELIST *Local, FILELIST *Remote);\r
+static void MirrorDeleteAllLocalDir(FILELIST *Local, TRANSPACKET *Pkt, TRANSPACKET **Base);\r
+static int CheckLocalFile(TRANSPACKET *Pkt);\r
+// 64ビット対応\r
+//static BOOL CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static INT_PTR CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static void RemoveAfterSemicolon(char *Path);\r
+static void MirrorDeleteAllDir(FILELIST *Remote, TRANSPACKET *Pkt, TRANSPACKET **Base);\r
+// 64ビット対応\r
+//static BOOL CALLBACK MirrorNotifyCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+//static BOOL CALLBACK MirrorDispListCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static INT_PTR CALLBACK MirrorNotifyCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static INT_PTR CALLBACK MirrorDispListCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static void CountMirrorFiles(HWND hDlg, TRANSPACKET *Pkt);\r
+static int AskMirrorNoTrn(char *Fname, int Mode);\r
+static int AskUploadFileAttr(char *Fname);\r
+// 64ビット対応\r
+//static BOOL CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static INT_PTR CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+#if defined(HAVE_TANDEM)\r
+static INT_PTR CALLBACK UpDownAsWithExtDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+#endif\r
+static void DeleteAllDir(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDir);\r
+static void DelNotifyAndDo(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDir);\r
+// 64ビット対応\r
+//static BOOL CALLBACK DeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+//static BOOL CALLBACK RenameDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static INT_PTR CALLBACK DeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static INT_PTR CALLBACK RenameDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static void SetAttrToDialog(HWND hWnd, int Attr);\r
+static int GetAttrFromDialog(HWND hDlg);\r
+static LRESULT CALLBACK SizeNotifyDlgWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
+static LRESULT CALLBACK SizeDlgWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
+static int RenameUnuseableName(char *Fname);\r
+\r
+/*===== 外部参照 ====*/\r
+\r
+extern HWND hHelpWin;\r
+\r
+/* 設定値 */\r
+extern int FnameCnv;\r
+extern int RecvMode;\r
+extern int SendMode;\r
+extern int MoveMode;\r
+extern char MirrorNoTrn[MIRROR_LEN+1];\r
+extern char MirrorNoDel[MIRROR_LEN+1];\r
+extern int MirrorFnameCnv;\r
+extern char DefAttrList[DEFATTRLIST_LEN+1];\r
+extern SIZE MirrorDlgSize;\r
+extern int VaxSemicolon;\r
+extern int DebugConsole;\r
+extern int CancelFlg;\r
+// ディレクトリ自動作成\r
+extern int MakeAllDir;\r
+// ファイル一覧バグ修正\r
+extern int AbortOnListError;\r
+// ミラーリング設定追加\r
+extern int MirrorNoTransferContents; \r
+// タイムスタンプのバグ修正\r
+extern int DispTimeSeconds;\r
+\r
+/*===== ローカルなワーク =====*/\r
+\r
+static char TmpString[FMAX_PATH+80];           /* テンポラリ */\r
+#if defined(HAVE_TANDEM)\r
+static char TmpFileCode[5];            /* テンポラリ */\r
+#endif\r
+static int CurWin;                                             /* ウインドウ番号 */\r
+\r
+int UpExistMode = EXIST_OVW;           /* アップロードで同じ名前のファイルがある時の扱い方 EXIST_xxx */\r
+int ExistMode = EXIST_OVW;             /* 同じ名前のファイルがある時の扱い方 EXIST_xxx */\r
+static int ExistNotify;                /* 確認ダイアログを出すかどうか YES/NO */\r
+\r
+static double FileSize;                /* ファイル総容量 */\r
+\r
+\r
+\r
+/*----- ファイル一覧で指定されたファイルをダウンロードする --------------------\r
+*\r
+*      Parameter\r
+*              int ChName : 名前を変えるかどうか (YES/NO)\r
+*              int ForceFile : ディレクトリをファイル見なすかどうか (YES/NO)\r
+*              int All : 全てが選ばれている物として扱うかどうか (YES/NO)\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+// ディレクトリ自動作成\r
+// ローカル側のパスから必要なフォルダを作成\r
+int MakeDirFromLocalPath(char* LocalFile, char* Old)\r
+{\r
+       TRANSPACKET Pkt;\r
+       char* pDelimiter;\r
+       char* pNext;\r
+       char* Cat;\r
+       int Len;\r
+       int Make;\r
+       pDelimiter = LocalFile;\r
+       Make = NO;\r
+       while(pNext = strchr(pDelimiter, '\\'))\r
+       {\r
+               Len = pNext - LocalFile;\r
+               strncpy(Pkt.LocalFile, LocalFile, Len);\r
+               Pkt.LocalFile[Len] = '\0';\r
+               if(strncmp(LocalFile, Old, Len + 1) != 0)\r
+               {\r
+                       Cat = Pkt.LocalFile + (pDelimiter - LocalFile);\r
+                       if(FnameCnv == FNAME_LOWER)\r
+                               _mbslwr(Cat);\r
+                       else if(FnameCnv == FNAME_UPPER)\r
+                               _mbsupr(Cat);\r
+                       ReplaceAll(Pkt.LocalFile, '/', '\\');\r
+\r
+                       strcpy(Pkt.Cmd, "MKD ");\r
+                       strcpy(Pkt.RemoteFile, "");\r
+                       AddTransFileList(&Pkt);\r
+\r
+                       Make = YES;\r
+               }\r
+               pDelimiter = pNext + 1;\r
+       }\r
+       return Make;\r
+}\r
+\r
+void DownloadProc(int ChName, int ForceFile, int All)\r
+{\r
+       FILELIST *FileListBase;\r
+       FILELIST *Pos;\r
+       TRANSPACKET Pkt;\r
+       // ディレクトリ自動作成\r
+       char Tmp[FMAX_PATH+1];\r
+       // ファイル一覧バグ修正\r
+       int ListSts;\r
+\r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
+       if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
+       {\r
+               DisableUserOpe();\r
+\r
+               ExistNotify = YES;\r
+//             KeepTransferDialog(YES);\r
+\r
+               FileListBase = NULL;\r
+               // ファイル一覧バグ修正\r
+//             MakeSelectedFileList(WIN_REMOTE, (ForceFile == YES ? NO : YES), All, &FileListBase, &CancelFlg);\r
+               ListSts = MakeSelectedFileList(WIN_REMOTE, (ForceFile == YES ? NO : YES), All, &FileListBase, &CancelFlg);\r
+\r
+               if(AskNoFullPathMode() == YES)\r
+               {\r
+                       strcpy(Pkt.Cmd, "SETCUR");\r
+                       AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
+                       AddTransFileList(&Pkt);\r
+               }\r
+\r
+               Pos = FileListBase;\r
+               while(Pos != NULL)\r
+               {\r
+                       // ファイル一覧バグ修正\r
+                       if((AbortOnListError == YES) && (ListSts == FFFTP_FAIL))\r
+                               break;\r
+                       AskLocalCurDir(Pkt.LocalFile, FMAX_PATH);\r
+                       SetYenTail(Pkt.LocalFile);\r
+                       strcpy(TmpString, Pos->File);\r
+                       if((ChName == NO) || ((ForceFile == NO) && (Pos->Node == NODE_DIR)))\r
+                       {\r
+                               if(FnameCnv == FNAME_LOWER)\r
+                                       _mbslwr(TmpString);\r
+                               else if(FnameCnv == FNAME_UPPER)\r
+                                       _mbsupr(TmpString);\r
+                               RemoveAfterSemicolon(TmpString);\r
+                               if(RenameUnuseableName(TmpString) == FFFTP_FAIL)\r
+                                       break;\r
+                       }\r
+                       else\r
+                       {\r
+                               CurWin = WIN_REMOTE;\r
+                               if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(updown_as_dlg), GetMainHwnd(), UpDownAsDialogCallBack) == YES)\r
+                               {\r
+                                       if(RenameUnuseableName(TmpString) == FFFTP_FAIL)\r
+                                               break;\r
+                               }\r
+                               else\r
+                                       break;\r
+                       }\r
+                       strcat(Pkt.LocalFile, TmpString);\r
+                       ReplaceAll(Pkt.LocalFile, '/', '\\');\r
+\r
+                       if((ForceFile == NO) && (Pos->Node == NODE_DIR))\r
+                       {\r
+                               strcpy(Pkt.Cmd, "MKD ");\r
+                               strcpy(Pkt.RemoteFile, "");\r
+                               AddTransFileList(&Pkt);\r
+                       }\r
+                       else if((Pos->Node == NODE_FILE) ||\r
+                                       ((ForceFile == YES) && (Pos->Node == NODE_DIR)))\r
+                       {\r
+                               if(AskHostType() == HTYPE_ACOS)\r
+                               {\r
+                                       strcpy(Pkt.RemoteFile, "'");\r
+                                       strcat(Pkt.RemoteFile, AskHostLsName());\r
+                                       strcat(Pkt.RemoteFile, "(");\r
+                                       strcat(Pkt.RemoteFile, Pos->File);\r
+                                       strcat(Pkt.RemoteFile, ")");\r
+                                       strcat(Pkt.RemoteFile, "'");\r
+                               }\r
+                               else if(AskHostType() == HTYPE_ACOS_4)\r
+                               {\r
+                                       strcpy(Pkt.RemoteFile, Pos->File);\r
+                               }\r
+                               else\r
+                               {\r
+                                       AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
+                                       SetSlashTail(Pkt.RemoteFile);\r
+                                       strcat(Pkt.RemoteFile, Pos->File);\r
+                                       ReplaceAll(Pkt.RemoteFile, '\\', '/');\r
+                               }\r
+\r
+                               strcpy(Pkt.Cmd, "RETR ");\r
+#if defined(HAVE_TANDEM)\r
+                               if(AskHostType() == HTYPE_TANDEM) {\r
+                                       if(AskTransferType() != TYPE_X) {\r
+                                               Pkt.Type = AskTransferType();\r
+                                       } else {\r
+                                               Pkt.Attr = Pos->Attr;\r
+                                               if (Pkt.Attr == 101)\r
+                                                       Pkt.Type = TYPE_A;\r
+                                               else\r
+                                                       Pkt.Type = TYPE_I;\r
+                                       }\r
+                               } else\r
+#endif\r
+                               Pkt.Type = AskTransferTypeAssoc(Pkt.RemoteFile, AskTransferType());\r
+                               Pkt.Size = Pos->Size;\r
+                               Pkt.Time = Pos->Time;\r
+                               Pkt.KanjiCode = AskHostKanjiCode();\r
+                               // UTF-8対応\r
+                               Pkt.KanjiCodeDesired = AskLocalKanjiCode();\r
+                               Pkt.KanaCnv = AskHostKanaCnv();\r
+\r
+                               // ディレクトリ自動作成\r
+                               strcpy(Tmp, Pkt.LocalFile);\r
+                               Pkt.Mode = CheckLocalFile(&Pkt);        /* Pkt.ExistSize がセットされる */\r
+                               // ミラーリング設定追加\r
+                               Pkt.NoTransfer = NO;\r
+                               if(Pkt.Mode == EXIST_ABORT)\r
+                                       break;\r
+                               else if(Pkt.Mode != EXIST_IGNORE)\r
+                               // ディレクトリ自動作成\r
+//                                     AddTransFileList(&Pkt);\r
+                               {\r
+                                       if(MakeAllDir == YES)\r
+                                               MakeDirFromLocalPath(Pkt.LocalFile, Tmp);\r
+                                       AddTransFileList(&Pkt);\r
+                               }\r
+                       }\r
+                       Pos = Pos->Next;\r
+               }\r
+\r
+               if(AskNoFullPathMode() == YES)\r
+               {\r
+                       strcpy(Pkt.Cmd, "BACKCUR");\r
+                       AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
+                       AddTransFileList(&Pkt);\r
+               }\r
+               DeleteFileList(&FileListBase);\r
+\r
+               // 同時接続対応\r
+//             strcpy(Pkt.Cmd, "GOQUIT");\r
+//             AddTransFileList(&Pkt);\r
+\r
+               // バグ対策\r
+               AddNullTransFileList();\r
+\r
+               GoForwardTransWindow();\r
+//             KeepTransferDialog(NO);\r
+\r
+               EnableUserOpe();\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- 指定されたファイルを一つダウンロードする ------------------------------\r
+*\r
+*      Parameter\r
+*              char *Fname : ファイル名\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void DirectDownloadProc(char *Fname)\r
+{\r
+       TRANSPACKET Pkt;\r
+       // ディレクトリ自動作成\r
+       char Tmp[FMAX_PATH+1];\r
+\r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
+       if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
+       {\r
+               DisableUserOpe();\r
+\r
+               ExistNotify = YES;\r
+//             KeepTransferDialog(YES);\r
+\r
+               if(AskNoFullPathMode() == YES)\r
+               {\r
+                       strcpy(Pkt.Cmd, "SETCUR");\r
+                       AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
+                       AddTransFileList(&Pkt);\r
+               }\r
+\r
+               if(strlen(Fname) > 0)\r
+               {\r
+                       AskLocalCurDir(Pkt.LocalFile, FMAX_PATH);\r
+                       SetYenTail(Pkt.LocalFile);\r
+                       strcpy(TmpString, Fname);\r
+                       if(FnameCnv == FNAME_LOWER)\r
+                               _mbslwr(TmpString);\r
+                       else if(FnameCnv == FNAME_UPPER)\r
+                               _mbsupr(TmpString);\r
+                       RemoveAfterSemicolon(TmpString);\r
+\r
+                       if(RenameUnuseableName(TmpString) == FFFTP_SUCCESS)\r
+                       {\r
+                               strcat(Pkt.LocalFile, TmpString);\r
+                               ReplaceAll(Pkt.LocalFile, '/', '\\');\r
+\r
+                               if(AskHostType() == HTYPE_ACOS)\r
+                               {\r
+                                       strcpy(Pkt.RemoteFile, "'");\r
+                                       strcat(Pkt.RemoteFile, AskHostLsName());\r
+                                       strcat(Pkt.RemoteFile, "(");\r
+                                       strcat(Pkt.RemoteFile, Fname);\r
+                                       strcat(Pkt.RemoteFile, ")");\r
+                                       strcat(Pkt.RemoteFile, "'");\r
+                               }\r
+                               else if(AskHostType() == HTYPE_ACOS_4)\r
+                               {\r
+                                       strcpy(Pkt.RemoteFile, Fname);\r
+                               }\r
+                               else\r
+                               {\r
+                                       AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
+                                       SetSlashTail(Pkt.RemoteFile);\r
+                                       strcat(Pkt.RemoteFile, Fname);\r
+                                       ReplaceAll(Pkt.RemoteFile, '\\', '/');\r
+                               }\r
+\r
+                               strcpy(Pkt.Cmd, "RETR-S ");\r
+                               Pkt.Type = AskTransferTypeAssoc(Pkt.RemoteFile, AskTransferType());\r
+\r
+                               /* サイズと日付は転送側スレッドで取得し、セットする */\r
+\r
+                               Pkt.KanjiCode = AskHostKanjiCode();\r
+                               // UTF-8対応\r
+                               Pkt.KanjiCodeDesired = AskLocalKanjiCode();\r
+                               Pkt.KanaCnv = AskHostKanaCnv();\r
+\r
+                               // ディレクトリ自動作成\r
+                               strcpy(Tmp, Pkt.LocalFile);\r
+                               Pkt.Mode = CheckLocalFile(&Pkt);        /* Pkt.ExistSize がセットされる */\r
+                               // ミラーリング設定追加\r
+                               Pkt.NoTransfer = NO;\r
+                               if((Pkt.Mode != EXIST_ABORT) && (Pkt.Mode != EXIST_IGNORE))\r
+                               // ディレクトリ自動作成\r
+//                                     AddTransFileList(&Pkt);\r
+                               {\r
+                                       if(MakeAllDir == YES)\r
+                                               MakeDirFromLocalPath(Pkt.LocalFile, Tmp);\r
+                                       AddTransFileList(&Pkt);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               if(AskNoFullPathMode() == YES)\r
+               {\r
+                       strcpy(Pkt.Cmd, "BACKCUR");\r
+                       AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
+                       AddTransFileList(&Pkt);\r
+               }\r
+\r
+               // 同時接続対応\r
+//             strcpy(Pkt.Cmd, "GOQUIT");\r
+//             AddTransFileList(&Pkt);\r
+\r
+               // バグ対策\r
+               AddNullTransFileList();\r
+\r
+               GoForwardTransWindow();\r
+//             KeepTransferDialog(NO);\r
+\r
+               EnableUserOpe();\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- 入力されたファイル名のファイルを一つダウンロードする ------------------\r
+*\r
+*      Parameter\r
+*              なし\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void InputDownloadProc(void)\r
+{\r
+       char Path[FMAX_PATH+1];\r
+       int Tmp;\r
+\r
+//     DisableUserOpe();\r
+\r
+       strcpy(Path, "");\r
+       if(InputDialogBox(downname_dlg, GetMainHwnd(), NULL, Path, FMAX_PATH, &Tmp, IDH_HELP_TOPIC_0000001) == YES)\r
+       {\r
+               DirectDownloadProc(Path);\r
+       }\r
+\r
+//     EnableUserOpe();\r
+\r
+       return;\r
+}\r
+\r
+\r
+/*----- ミラーリングダウンロードを行う ----------------------------------------\r
+*\r
+*      Parameter\r
+*              int Notify : 確認を行うかどうか (YES/NO)\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void MirrorDownloadProc(int Notify)\r
+{\r
+       FILELIST *LocalListBase;\r
+       FILELIST *RemoteListBase;\r
+       FILELIST *LocalPos;\r
+       FILELIST *RemotePos;\r
+       TRANSPACKET Pkt;\r
+       TRANSPACKET *Base;\r
+       char Name[FMAX_PATH+1];\r
+       char *Cat;\r
+       int Level;\r
+       int Mode;\r
+       // ファイル一覧バグ修正\r
+       int ListSts;\r
+\r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
+       if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
+       {\r
+               DisableUserOpe();\r
+\r
+               Base = NULL;\r
+\r
+               if(Notify == YES)\r
+                       Notify = DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(mirror_down_dlg), GetMainHwnd(), MirrorNotifyCallBack, 0);\r
+               else\r
+                       Notify = YES;\r
+\r
+               if((Notify == YES) || (Notify == YES_LIST))\r
+               {\r
+                       /*===== ファイルリスト取得 =====*/\r
+\r
+                       LocalListBase = NULL;\r
+                       // ファイル一覧バグ修正\r
+//                     MakeSelectedFileList(WIN_LOCAL, YES, YES, &LocalListBase, &CancelFlg);\r
+                       ListSts = MakeSelectedFileList(WIN_LOCAL, YES, YES, &LocalListBase, &CancelFlg);\r
+                       RemoteListBase = NULL;\r
+                       // ファイル一覧バグ修正\r
+//                     MakeSelectedFileList(WIN_REMOTE, YES, YES, &RemoteListBase, &CancelFlg);\r
+                       if(ListSts == FFFTP_SUCCESS)\r
+                               ListSts = MakeSelectedFileList(WIN_REMOTE, YES, YES, &RemoteListBase, &CancelFlg);\r
+\r
+                       RemotePos = RemoteListBase;\r
+                       while(RemotePos != NULL)\r
+                       {\r
+                               RemotePos->Attr = YES;          /* RemotePos->Attrは転送するかどうかのフラグに使用 (YES/NO) */\r
+                               RemotePos = RemotePos->Next;\r
+                       }\r
+\r
+                       LocalPos = LocalListBase;\r
+                       while(LocalPos != NULL)\r
+                       {\r
+                               if(AskMirrorNoTrn(LocalPos->File, 1) == NO)\r
+                               {\r
+                                       LocalPos->Attr = YES;\r
+                                       LocalPos = LocalPos->Next;\r
+                               }\r
+                               else\r
+                               {\r
+                                       LocalPos->Attr = NO;    /* LocalPos->Attrは削除するかどうかのフラグに使用 (YES/NO) */\r
+\r
+                                       if(LocalPos->Node == NODE_DIR)\r
+                                       {\r
+                                               Level = AskDirLevel(LocalPos->File);\r
+                                               LocalPos = LocalPos->Next;\r
+                                               while(LocalPos != NULL)\r
+                                               {\r
+                                                       if((LocalPos->Node == NODE_DIR) &&\r
+                                                          (AskDirLevel(LocalPos->File) <= Level))\r
+                                                       {\r
+                                                               break;\r
+                                                       }\r
+                                                       LocalPos->Attr = NO;\r
+                                                       LocalPos = LocalPos->Next;\r
+                                               }\r
+                                       }\r
+                                       else\r
+                                               LocalPos = LocalPos->Next;\r
+                               }\r
+                       }\r
+\r
+                       /*===== ファイルリスト比較 =====*/\r
+\r
+                       RemotePos = RemoteListBase;\r
+                       while(RemotePos != NULL)\r
+                       {\r
+                               if(AskMirrorNoTrn(RemotePos->File, 0) == NO)\r
+                               {\r
+                                       strcpy(Name, RemotePos->File);\r
+//                                     ReplaceAll(Name, '/', '\\');\r
+\r
+                                       if(MirrorFnameCnv == YES)\r
+                                               Mode = COMP_LOWERMATCH;\r
+                                       else\r
+                                               Mode = COMP_STRICT;\r
+\r
+                                       if((LocalPos = SearchFileList(Name, LocalListBase, Mode)) != NULL)\r
+                                       {\r
+                                               if((RemotePos->Node == NODE_DIR) && (LocalPos->Node == NODE_DIR))\r
+                                               {\r
+                                                       LocalPos->Attr = NO;\r
+                                                       RemotePos->Attr = NO;\r
+                                               }\r
+                                               else if((RemotePos->Node == NODE_FILE) && (LocalPos->Node == NODE_FILE))\r
+                                               {\r
+                                                       LocalPos->Attr = NO;\r
+                                                       if(CompareFileTime(&RemotePos->Time, &LocalPos->Time) <= 0)\r
+                                                               RemotePos->Attr = NO;\r
+                                               }\r
+                                       }\r
+                                       RemotePos = RemotePos->Next;\r
+                               }\r
+                               else\r
+                               {\r
+                                       if(RemotePos->Node == NODE_FILE)\r
+                                       {\r
+                                               RemotePos->Attr = NO;\r
+                                               RemotePos = RemotePos->Next;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               RemotePos->Attr = NO;\r
+                                               Level = AskDirLevel(RemotePos->File);\r
+                                               RemotePos = RemotePos->Next;\r
+                                               while(RemotePos != NULL)\r
+                                               {\r
+                                                       if((RemotePos->Node == NODE_DIR) &&\r
+                                                          (AskDirLevel(RemotePos->File) <= Level))\r
+                                                       {\r
+                                                               break;\r
+                                                       }\r
+                                                       RemotePos->Attr = NO;\r
+                                                       RemotePos = RemotePos->Next;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       DispMirrorFiles(LocalListBase, RemoteListBase);\r
+\r
+                       /*===== 削除/アップロード =====*/\r
+\r
+                       LocalPos = LocalListBase;\r
+                       while(LocalPos != NULL)\r
+                       {\r
+                               if((LocalPos->Attr == YES) && (LocalPos->Node == NODE_FILE))\r
+                               {\r
+                                       AskLocalCurDir(Pkt.LocalFile, FMAX_PATH);\r
+                                       SetYenTail(Pkt.LocalFile);\r
+                                       strcat(Pkt.LocalFile, LocalPos->File);\r
+                                       ReplaceAll(Pkt.LocalFile, '/', '\\');\r
+                                       strcpy(Pkt.RemoteFile, "");\r
+                                       strcpy(Pkt.Cmd, "L-DELE ");\r
+                                       AddTmpTransFileList(&Pkt, &Base);\r
+                               }\r
+                               LocalPos = LocalPos->Next;\r
+                       }\r
+                       MirrorDeleteAllLocalDir(LocalListBase, &Pkt, &Base);\r
+\r
+\r
+                       RemotePos = RemoteListBase;\r
+                       while(RemotePos != NULL)\r
+                       {\r
+                               if(RemotePos->Attr == YES)\r
+                               {\r
+                                       AskLocalCurDir(Pkt.LocalFile, FMAX_PATH);\r
+                                       SetYenTail(Pkt.LocalFile);\r
+                                       Cat = strchr(Pkt.LocalFile, NUL);\r
+                                       strcat(Pkt.LocalFile, RemotePos->File);\r
+\r
+                                       if(MirrorFnameCnv == YES)\r
+                                               _mbslwr(Cat);\r
+\r
+                                       RemoveAfterSemicolon(Cat);\r
+                                       ReplaceAll(Pkt.LocalFile, '/', '\\');\r
+\r
+                                       if(RemotePos->Node == NODE_DIR)\r
+                                       {\r
+                                               strcpy(Pkt.RemoteFile, "");\r
+                                               strcpy(Pkt.Cmd, "L-MKD ");\r
+                                               AddTmpTransFileList(&Pkt, &Base);\r
+                                       }\r
+                                       else if(RemotePos->Node == NODE_FILE)\r
+                                       {\r
+                                               AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
+                                               SetSlashTail(Pkt.RemoteFile);\r
+                                               strcat(Pkt.RemoteFile, RemotePos->File);\r
+                                               ReplaceAll(Pkt.RemoteFile, '\\', '/');\r
+\r
+                                               strcpy(Pkt.Cmd, "RETR ");\r
+                                               Pkt.Type = AskTransferTypeAssoc(Pkt.RemoteFile, AskTransferType());\r
+                                               Pkt.Size = RemotePos->Size;\r
+                                               Pkt.Time = RemotePos->Time;\r
+//                                             Pkt.Attr = 0;\r
+                                               Pkt.KanjiCode = AskHostKanjiCode();\r
+                                               // UTF-8対応\r
+                                               Pkt.KanjiCodeDesired = AskLocalKanjiCode();\r
+                                               Pkt.KanaCnv = AskHostKanaCnv();\r
+                                               Pkt.Mode = EXIST_OVW;\r
+                                               // ミラーリング設定追加\r
+                                               Pkt.NoTransfer = MirrorNoTransferContents;\r
+                                               AddTmpTransFileList(&Pkt, &Base);\r
+                                       }\r
+                               }\r
+                               RemotePos = RemotePos->Next;\r
+                       }\r
+\r
+                       // ファイル一覧バグ修正\r
+//                     if((Notify == YES) ||\r
+//                        (DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(mirrordown_notify_dlg), GetMainHwnd(), MirrorDispListCallBack, (LPARAM)&Base) == YES))\r
+                       if(((AbortOnListError == NO) || (ListSts == FFFTP_SUCCESS)) && ((Notify == YES) ||\r
+                          (DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(mirrordown_notify_dlg), GetMainHwnd(), MirrorDispListCallBack, (LPARAM)&Base) == YES)))\r
+                       {\r
+                               if(AskNoFullPathMode() == YES)\r
+                               {\r
+                                       strcpy(Pkt.Cmd, "SETCUR");\r
+                                       AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
+                                       AddTransFileList(&Pkt);\r
+                               }\r
+                               AppendTransFileList(Base);\r
+\r
+                               if(AskNoFullPathMode() == YES)\r
+                               {\r
+                                       strcpy(Pkt.Cmd, "BACKCUR");\r
+                                       AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
+                                       AddTransFileList(&Pkt);\r
+                               }\r
+\r
+                               // 同時接続対応\r
+//                             strcpy(Pkt.Cmd, "GOQUIT");\r
+//                             AddTransFileList(&Pkt);\r
+                       }\r
+                       else\r
+                               EraseTmpTransFileList(&Base);\r
+\r
+                       // バグ対策\r
+                       AddNullTransFileList();\r
+\r
+                       DeleteFileList(&LocalListBase);\r
+                       DeleteFileList(&RemoteListBase);\r
+\r
+                       GoForwardTransWindow();\r
+               }\r
+\r
+               EnableUserOpe();\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- ミラーリングのファイル一覧を表示 --------------------------------------\r
+*\r
+*      Parameter\r
+*              FILELIST *Local : ローカル側\r
+*              FILELIST *Remote : リモート側\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+static void DispMirrorFiles(FILELIST *Local, FILELIST *Remote)\r
+{\r
+       char Date[80];\r
+       SYSTEMTIME sTime;\r
+       FILETIME fTime;\r
+\r
+       if(DebugConsole == YES)\r
+       {\r
+               DoPrintf("---- MIRROR FILE LIST ----");\r
+               while(Local != NULL)\r
+               {\r
+                       FileTimeToLocalFileTime(&Local->Time, &fTime);\r
+                       // タイムスタンプのバグ修正\r
+//                     FileTimeToSystemTime(&fTime, &sTime);\r
+//                     sprintf(Date, "%04d/%02d/%02d %02d:%02d:%02d.%04d", \r
+//                             sTime.wYear, sTime.wMonth, sTime.wDay, sTime.wHour, sTime.wMinute, sTime.wSecond, sTime.wMilliseconds);\r
+                       if(FileTimeToSystemTime(&fTime, &sTime))\r
+                               sprintf(Date, "%04d/%02d/%02d %02d:%02d:%02d.%04d", sTime.wYear, sTime.wMonth, sTime.wDay, sTime.wHour, sTime.wMinute, sTime.wSecond, sTime.wMilliseconds);\r
+                       else\r
+                               strcpy(Date, "");\r
+                       DoPrintf("LOCAL  : %s %s [%s] %s", Local->Attr==1?"YES":"NO ", Local->Node==NODE_DIR?"DIR ":"FILE", Date, Local->File);\r
+                       Local = Local->Next;\r
+               }\r
+               while(Remote != NULL)\r
+               {\r
+                       FileTimeToLocalFileTime(&Remote->Time, &fTime);\r
+                       // タイムスタンプのバグ修正\r
+//                     FileTimeToSystemTime(&fTime, &sTime);\r
+//                     sprintf(Date, "%04d/%02d/%02d %02d:%02d:%02d.%04d", \r
+//                             sTime.wYear, sTime.wMonth, sTime.wDay, sTime.wHour, sTime.wMinute, sTime.wSecond, sTime.wMilliseconds);\r
+                       if(FileTimeToSystemTime(&fTime, &sTime))\r
+                               sprintf(Date, "%04d/%02d/%02d %02d:%02d:%02d.%04d", sTime.wYear, sTime.wMonth, sTime.wDay, sTime.wHour, sTime.wMinute, sTime.wSecond, sTime.wMilliseconds);\r
+                       else\r
+                               strcpy(Date, "");\r
+                       DoPrintf("REMOTE : %s %s [%s] %s", Remote->Attr==1?"YES":"NO ", Remote->Node==NODE_DIR?"DIR ":"FILE", Date, Remote->File);\r
+                       Remote = Remote->Next;\r
+               }\r
+               DoPrintf("---- END ----");\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- ミラーリング時のローカル側のフォルダ削除 ------------------------------\r
+*\r
+*      Parameter\r
+*              FILELIST *Local : ファイルリスト\r
+*              TRANSPACKET *Pkt : \r
+*              TRANSPACKET **Base : \r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+static void MirrorDeleteAllLocalDir(FILELIST *Local, TRANSPACKET *Pkt, TRANSPACKET **Base)\r
+{\r
+       while(Local != NULL)\r
+       {\r
+               if(Local->Node == NODE_DIR)\r
+               {\r
+                       MirrorDeleteAllLocalDir(Local->Next, Pkt, Base);\r
+\r
+                       if(Local->Attr == YES)\r
+                       {\r
+                               AskLocalCurDir(Pkt->LocalFile, FMAX_PATH);\r
+                               SetYenTail(Pkt->LocalFile);\r
+                               strcat(Pkt->LocalFile, Local->File);\r
+                               ReplaceAll(Pkt->LocalFile, '/', '\\');\r
+                               strcpy(Pkt->RemoteFile, "");\r
+                               strcpy(Pkt->Cmd, "L-RMD ");\r
+                               AddTmpTransFileList(Pkt, Base);\r
+                       }\r
+                       break;\r
+               }\r
+               Local = Local->Next;\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- ファイル名のセミコロン以降を取り除く ----------------------------------\r
+*\r
+*      Parameter\r
+*              char *Path : ファイル名\r
+*\r
+*      Return Value\r
+*              なし\r
+*\r
+*      Note\r
+*              Pathの内容が書き換えられる\r
+*              オプション設定によって処理を切替える\r
+*----------------------------------------------------------------------------*/\r
+\r
+static void RemoveAfterSemicolon(char *Path)\r
+{\r
+       char *Pos;\r
+\r
+       if(VaxSemicolon == YES)\r
+       {\r
+               if((Pos = strchr(Path, ';')) != NULL)\r
+                       *Pos = NUL;\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- ローカルに同じ名前のファイルがないかチェック --------------------------\r
+*\r
+*      Parameter\r
+*              TRANSPACKET *Pkt : 転送ファイル情報\r
+*\r
+*      Return Value\r
+*              int 処理方法\r
+*                      EXIST_OVW/EXIST_RESUME/EXIST_IGNORE\r
+*\r
+*      Note\r
+*              Pkt.ExistSize, ExistMode、ExistNotify が変更される\r
+*----------------------------------------------------------------------------*/\r
+\r
+static int CheckLocalFile(TRANSPACKET *Pkt)\r
+{\r
+       HANDLE fHnd;\r
+       WIN32_FIND_DATA Find;\r
+       int Ret;\r
+       // タイムスタンプのバグ修正\r
+       SYSTEMTIME TmpStime;\r
+\r
+       Ret = EXIST_OVW;\r
+       Pkt->ExistSize = 0;\r
+       if(RecvMode != TRANS_OVW)\r
+       {\r
+               if((fHnd = FindFirstFile(Pkt->LocalFile, &Find)) != INVALID_HANDLE_VALUE)\r
+               {\r
+                       FindClose(fHnd);\r
+\r
+                       Pkt->ExistSize = MakeLongLong(Find.nFileSizeHigh, Find.nFileSizeLow);\r
+\r
+                       if(ExistNotify == YES)\r
+                       {\r
+                               SoundPlay(SND_ERROR);\r
+                               if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(down_exist_dlg), GetMainHwnd(), DownExistDialogCallBack, (LPARAM)Pkt) == NO)\r
+                                       Ret = EXIST_ABORT;\r
+                               else\r
+                                       Ret = ExistMode;\r
+                       }\r
+                       else\r
+                               Ret = ExistMode;\r
+\r
+                       if(Ret == EXIST_NEW)\r
+                       {\r
+                               /*ファイル日付チェック */\r
+                               // タイムスタンプのバグ修正\r
+                               if(FileTimeToSystemTime(&Find.ftLastWriteTime, &TmpStime))\r
+                               {\r
+                                       if(DispTimeSeconds == NO)\r
+                                               TmpStime.wSecond = 0;\r
+                                       TmpStime.wMilliseconds = 0;\r
+                                       SystemTimeToFileTime(&TmpStime, &Find.ftLastWriteTime);\r
+                               }\r
+                               else\r
+                                       memset(&Find.ftLastWriteTime, 0, sizeof(FILETIME));\r
+                               if(CompareFileTime(&Find.ftLastWriteTime, &Pkt->Time) < 0)\r
+                                       Ret = EXIST_OVW;\r
+                               else\r
+                                       Ret = EXIST_IGNORE;\r
+                       }\r
+                       // 同じ名前のファイルの処理方法追加\r
+                       if(Ret == EXIST_LARGE)\r
+                       {\r
+                               if(MakeLongLong(Find.nFileSizeHigh, Find.nFileSizeLow) < Pkt->Size)\r
+                                       Ret = EXIST_OVW;\r
+                               else\r
+                                       Ret = EXIST_IGNORE;\r
+                       }\r
+               }\r
+       }\r
+       return(Ret);\r
+}\r
+\r
+\r
+/*----- ローカルに同じ名前のファイルがある時の確認ダイアログのコールバック ----\r
+*\r
+*      Parameter\r
+*              HWND hDlg : ウインドウハンドル\r
+*              UINT message : メッセージ番号\r
+*              WPARAM wParam : メッセージの WPARAM 引数\r
+*              LPARAM lParam : メッセージの LPARAM 引数\r
+*\r
+*      Return Value\r
+*              BOOL TRUE/FALSE\r
+*----------------------------------------------------------------------------*/\r
+\r
+// 64ビット対応\r
+//static BOOL CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+static INT_PTR CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+{\r
+       static TRANSPACKET *Pkt;\r
+       // 同じ名前のファイルの処理方法追加\r
+//     static const RADIOBUTTON DownExistButton[] = {\r
+//             { DOWN_EXIST_OVW, EXIST_OVW },\r
+//             { DOWN_EXIST_NEW, EXIST_NEW },\r
+//             { DOWN_EXIST_RESUME, EXIST_RESUME },\r
+//             { DOWN_EXIST_IGNORE, EXIST_IGNORE }\r
+//     };\r
+       static const RADIOBUTTON DownExistButton[] = {\r
+               { DOWN_EXIST_OVW, EXIST_OVW },\r
+               { DOWN_EXIST_NEW, EXIST_NEW },\r
+               { DOWN_EXIST_RESUME, EXIST_RESUME },\r
+               { DOWN_EXIST_IGNORE, EXIST_IGNORE },\r
+               { DOWN_EXIST_LARGE, EXIST_LARGE }\r
+       };\r
+       #define DOWNEXISTBUTTONS        (sizeof(DownExistButton)/sizeof(RADIOBUTTON))\r
+\r
+       switch (iMessage)\r
+       {\r
+               case WM_INITDIALOG :\r
+                       Pkt = (TRANSPACKET *)lParam;\r
+                       SendDlgItemMessage(hDlg, DOWN_EXIST_NAME, EM_LIMITTEXT, FMAX_PATH, 0);\r
+                       SendDlgItemMessage(hDlg, DOWN_EXIST_NAME, WM_SETTEXT, 0, (LPARAM)Pkt->LocalFile);\r
+\r
+                       if((Pkt->Type == TYPE_A) || (Pkt->ExistSize <= 0))\r
+                               EnableWindow(GetDlgItem(hDlg, DOWN_EXIST_RESUME), FALSE);\r
+\r
+                       SetRadioButtonByValue(hDlg, ExistMode, DownExistButton, DOWNEXISTBUTTONS);\r
+                       return(TRUE);\r
+\r
+               case WM_COMMAND :\r
+                       switch(GET_WM_COMMAND_ID(wParam, lParam))\r
+                       {\r
+                               case IDOK_ALL :\r
+                                       ExistNotify = NO;\r
+                                       /* ここに break はない */\r
+\r
+                               case IDOK :\r
+                                       ExistMode = AskRadioButtonValue(hDlg, DownExistButton, DOWNEXISTBUTTONS);\r
+                                       SendDlgItemMessage(hDlg, DOWN_EXIST_NAME, WM_GETTEXT, FMAX_PATH, (LPARAM)Pkt->LocalFile);\r
+                                       EndDialog(hDlg, YES);\r
+                                       break;\r
+\r
+                               case IDCANCEL :\r
+//                                     ExistMode = EXIST_ABORT;\r
+                                       EndDialog(hDlg, NO);\r
+                                       break;\r
+\r
+                               case IDHELP :\r
+                                       hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000009);\r
+                                       break;\r
+                       }\r
+                       return(TRUE);\r
+       }\r
+       return(FALSE);\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+/*----- ファイル一覧で指定されたファイルをアップロードする --------------------\r
+*\r
+*      Parameter\r
+*              int ChName : 名前を変えるかどうか (YES/NO)\r
+*              int All : 全てが選ばれている物として扱うかどうか (YES/NO)\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+// ディレクトリ自動作成\r
+// リモート側のパスから必要なディレクトリを作成\r
+int MakeDirFromRemotePath(char* RemoteFile, char* Old, int FirstAdd)\r
+{\r
+       TRANSPACKET Pkt;\r
+       TRANSPACKET Pkt1;\r
+       char* pDelimiter;\r
+       char* pNext;\r
+       char* Cat;\r
+       int Len;\r
+       int Make;\r
+       pDelimiter = RemoteFile;\r
+       Make = NO;\r
+       while(pNext = strchr(pDelimiter, '/'))\r
+       {\r
+               Len = pNext - RemoteFile;\r
+               strncpy(Pkt.RemoteFile, RemoteFile, Len);\r
+               Pkt.RemoteFile[Len] = '\0';\r
+               if(strncmp(RemoteFile, Old, Len + 1) != 0)\r
+               {\r
+                       Cat = Pkt.RemoteFile + (pDelimiter - RemoteFile);\r
+                       if(FnameCnv == FNAME_LOWER)\r
+                               _mbslwr(Cat);\r
+                       else if(FnameCnv == FNAME_UPPER)\r
+                               _mbsupr(Cat);\r
+#if defined(HAVE_TANDEM)\r
+                       Pkt.FileCode = 0;\r
+                       Pkt.PriExt = DEF_PRIEXT;\r
+                       Pkt.SecExt = DEF_SECEXT;\r
+                       Pkt.MaxExt = DEF_MAXEXT;\r
+#endif\r
+                       ReplaceAll(Pkt.RemoteFile, '\\', '/');\r
+\r
+                       if(AskHostType() == HTYPE_ACOS)\r
+                       {\r
+                               strcpy(Pkt.RemoteFile, "'");\r
+                               strcat(Pkt.RemoteFile, AskHostLsName());\r
+                               strcat(Pkt.RemoteFile, "(");\r
+                               strcat(Pkt.RemoteFile, Cat);\r
+                               strcat(Pkt.RemoteFile, ")");\r
+                               strcat(Pkt.RemoteFile, "'");\r
+                       }\r
+                       else if(AskHostType() == HTYPE_ACOS_4)\r
+                               strcpy(Pkt.RemoteFile, Cat);\r
+\r
+                       if((FirstAdd == YES) && (AskNoFullPathMode() == YES))\r
+                       {\r
+                               strcpy(Pkt1.Cmd, "SETCUR");\r
+                               AskRemoteCurDir(Pkt1.RemoteFile, FMAX_PATH);\r
+                               AddTransFileList(&Pkt1);\r
+                       }\r
+                       FirstAdd = NO;\r
+                       strcpy(Pkt.Cmd, "MKD ");\r
+                       strcpy(Pkt.LocalFile, "");\r
+                       AddTransFileList(&Pkt);\r
+\r
+                       Make = YES;\r
+               }\r
+               pDelimiter = pNext + 1;\r
+       }\r
+       return Make;\r
+}\r
+\r
+void UploadListProc(int ChName, int All)\r
+{\r
+       FILELIST *FileListBase;\r
+       FILELIST *Pos;\r
+       TRANSPACKET Pkt;\r
+       TRANSPACKET Pkt1;\r
+       char *Cat;\r
+       FILELIST *RemoteList;\r
+       char Tmp[FMAX_PATH+1];\r
+       int FirstAdd;\r
+       // ファイル一覧バグ修正\r
+       int ListSts;\r
+\r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
+       if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
+       {\r
+               DisableUserOpe();\r
+\r
+               // ローカル側で選ばれているファイルをFileListBaseに登録\r
+               FileListBase = NULL;\r
+               // ファイル一覧バグ修正\r
+//             MakeSelectedFileList(WIN_LOCAL, YES, All, &FileListBase, &CancelFlg);\r
+               ListSts = MakeSelectedFileList(WIN_LOCAL, YES, All, &FileListBase, &CancelFlg);\r
+\r
+               // 現在ホスト側のファイル一覧に表示されているものをRemoteListに登録\r
+               // 同名ファイルチェック用\r
+               RemoteList = NULL;\r
+               AddRemoteTreeToFileList(AskCurrentFileListNum(), "", RDIR_NONE, &RemoteList);\r
+\r
+               FirstAdd = YES;\r
+               ExistNotify = YES;\r
+\r
+               Pos = FileListBase;\r
+               while(Pos != NULL)\r
+               {\r
+                       // ファイル一覧バグ修正\r
+                       if((AbortOnListError == YES) && (ListSts == FFFTP_FAIL))\r
+                               break;\r
+                       AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
+                       SetSlashTail(Pkt.RemoteFile);\r
+                       Cat = strchr(Pkt.RemoteFile, NUL);\r
+                       if((ChName == NO) || (Pos->Node == NODE_DIR))\r
+                       {\r
+                               strcat(Pkt.RemoteFile, Pos->File);\r
+                               if(FnameCnv == FNAME_LOWER)\r
+                                       _mbslwr(Cat);\r
+                               else if(FnameCnv == FNAME_UPPER)\r
+                                       _mbsupr(Cat);\r
+#if defined(HAVE_TANDEM)\r
+                               Pkt.FileCode = 0;\r
+                               Pkt.PriExt = DEF_PRIEXT;\r
+                               Pkt.SecExt = DEF_SECEXT;\r
+                               Pkt.MaxExt = DEF_MAXEXT;\r
+#endif\r
+                       }\r
+                       else\r
+                       {\r
+                               // 名前を変更する\r
+                               strcpy(TmpString, Pos->File);\r
+                               CurWin = WIN_LOCAL;\r
+#if defined(HAVE_TANDEM)\r
+                               strcpy(TmpFileCode, "0"); /* ASCII モードの場合は無視される */\r
+                               if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) {\r
+                                       if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(updown_as_with_ext_dlg), GetMainHwnd(), UpDownAsWithExtDialogCallBack) == YES) {\r
+                                               strcat(Pkt.RemoteFile, TmpString);\r
+                                               Pkt.FileCode = atoi(TmpFileCode);\r
+                                       } else {\r
+                                               break;\r
+                                       }\r
+                               } else\r
+#endif\r
+                               if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(updown_as_dlg), GetMainHwnd(), UpDownAsDialogCallBack) == YES)\r
+                                       strcat(Pkt.RemoteFile, TmpString);\r
+                               else\r
+                                       break;\r
+                       }\r
+                       // バグ修正\r
+                       AskRemoteCurDir(Tmp, FMAX_PATH);\r
+                       SetSlashTail(Tmp);\r
+                       if(strncmp(Pkt.RemoteFile, Tmp, strlen(Tmp)) != 0)\r
+                       {\r
+                               if((Cat = strrchr(Pkt.RemoteFile, '/')) != NULL)\r
+                                       Cat++;\r
+                               else\r
+                                       Cat = Pkt.RemoteFile;\r
+                       }\r
+                       ReplaceAll(Pkt.RemoteFile, '\\', '/');\r
+\r
+                       if(AskHostType() == HTYPE_ACOS)\r
+                       {\r
+                               strcpy(Pkt.RemoteFile, "'");\r
+                               strcat(Pkt.RemoteFile, AskHostLsName());\r
+                               strcat(Pkt.RemoteFile, "(");\r
+                               strcat(Pkt.RemoteFile, Cat);\r
+                               strcat(Pkt.RemoteFile, ")");\r
+                               strcat(Pkt.RemoteFile, "'");\r
+                       }\r
+                       else if(AskHostType() == HTYPE_ACOS_4)\r
+                               strcpy(Pkt.RemoteFile, Cat);\r
+\r
+                       if(Pos->Node == NODE_DIR)\r
+                       {\r
+                               // フォルダの場合\r
+\r
+                               // ホスト側のファイル一覧をRemoteListに登録\r
+                               // 同名ファイルチェック用\r
+                               if(RemoteList != NULL)\r
+                                       DeleteFileList(&RemoteList);\r
+                               RemoteList = NULL;\r
+\r
+                               AskRemoteCurDir(Tmp, FMAX_PATH);\r
+                               if(DoCWD(Pkt.RemoteFile, NO, NO, NO) == FTP_COMPLETE)\r
+                               {\r
+                                       if(DoDirListCmdSkt("", "", 998, &CancelFlg) == FTP_COMPLETE)\r
+                                               AddRemoteTreeToFileList(998, "", RDIR_NONE, &RemoteList);\r
+                                       DoCWD(Tmp, NO, NO, NO);\r
+                               }\r
+                               else\r
+                               {\r
+                                       // フォルダを作成\r
+                                       if((FirstAdd == YES) && (AskNoFullPathMode() == YES))\r
+                                       {\r
+                                               strcpy(Pkt1.Cmd, "SETCUR");\r
+                                               AskRemoteCurDir(Pkt1.RemoteFile, FMAX_PATH);\r
+                                               AddTransFileList(&Pkt1);\r
+                                       }\r
+                                       FirstAdd = NO;\r
+                                       strcpy(Pkt.Cmd, "MKD ");\r
+                                       strcpy(Pkt.LocalFile, "");\r
+                                       AddTransFileList(&Pkt);\r
+                               }\r
+                       }\r
+                       else if(Pos->Node == NODE_FILE)\r
+                       {\r
+                               // ファイルの場合\r
+                               AskLocalCurDir(Pkt.LocalFile, FMAX_PATH);\r
+                               SetYenTail(Pkt.LocalFile);\r
+                               strcat(Pkt.LocalFile, Pos->File);\r
+                               ReplaceAll(Pkt.LocalFile, '/', '\\');\r
+\r
+                               strcpy(Pkt.Cmd, "STOR ");\r
+                               Pkt.Type = AskTransferTypeAssoc(Pkt.LocalFile, AskTransferType());\r
+                               // バグ修正\r
+//                             Pkt.Size = 0;\r
+                               Pkt.Size = Pos->Size;\r
+                               Pkt.Time = Pos->Time;\r
+                               Pkt.Attr = AskUploadFileAttr(Pkt.RemoteFile);\r
+                               Pkt.KanjiCode = AskHostKanjiCode();\r
+                               // UTF-8対応\r
+                               Pkt.KanjiCodeDesired = AskLocalKanjiCode();\r
+                               Pkt.KanaCnv = AskHostKanaCnv();\r
+#if defined(HAVE_TANDEM)\r
+                               if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) {\r
+                                       CalcExtentSize(&Pkt, Pos->Size);\r
+                               }\r
+#endif\r
+                               // ディレクトリ自動作成\r
+                               strcpy(Tmp, Pkt.RemoteFile);\r
+                               Pkt.Mode = CheckRemoteFile(&Pkt, RemoteList);\r
+                               // ミラーリング設定追加\r
+                               Pkt.NoTransfer = NO;\r
+                               if(Pkt.Mode == EXIST_ABORT)\r
+                                       break;\r
+                               else if(Pkt.Mode != EXIST_IGNORE)\r
+                               {\r
+                                       // ディレクトリ自動作成\r
+                                       if(MakeAllDir == YES)\r
+                                       {\r
+                                               if(MakeDirFromRemotePath(Pkt.RemoteFile, Tmp, FirstAdd) == YES)\r
+                                                       FirstAdd = NO;\r
+                                       }\r
+                                       if((FirstAdd == YES) && (AskNoFullPathMode() == YES))\r
+                                       {\r
+                                               strcpy(Pkt1.Cmd, "SETCUR");\r
+                                               AskRemoteCurDir(Pkt1.RemoteFile, FMAX_PATH);\r
+                                               AddTransFileList(&Pkt1);\r
+                                       }\r
+                                       FirstAdd = NO;\r
+                                       AddTransFileList(&Pkt);\r
+                               }\r
+                       }\r
+                       Pos = Pos->Next;\r
+               }\r
+\r
+               if((FirstAdd == NO) && (AskNoFullPathMode() == YES))\r
+               {\r
+                       strcpy(Pkt.Cmd, "BACKCUR");\r
+                       AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
+                       AddTransFileList(&Pkt);\r
+               }\r
+\r
+               if(RemoteList != NULL)\r
+                       DeleteFileList(&RemoteList);\r
+\r
+               DeleteFileList(&FileListBase);\r
+\r
+               // 同時接続対応\r
+//             strcpy(Pkt.Cmd, "GOQUIT");\r
+//             AddTransFileList(&Pkt);\r
+\r
+               // バグ対策\r
+               AddNullTransFileList();\r
+\r
+               GoForwardTransWindow();\r
+\r
+               EnableUserOpe();\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- ドラッグ&ドロップで指定されたファイルをアップロードする --------------\r
+*\r
+*      Parameter\r
+*              WPARAM wParam : ドロップされたファイルの情報\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void UploadDragProc(WPARAM wParam)\r
+{\r
+       FILELIST *FileListBase;\r
+       FILELIST *Pos;\r
+       TRANSPACKET Pkt;\r
+       TRANSPACKET Pkt1;\r
+       char *Cat;\r
+       FILELIST *RemoteList;\r
+       char Tmp[FMAX_PATH+1];\r
+       int FirstAdd;\r
+       char Cur[FMAX_PATH+1];\r
+\r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
+       if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
+       {\r
+               DisableUserOpe();\r
+\r
+               // ローカル側で選ばれているファイルをFileListBaseに登録\r
+               FileListBase = NULL;\r
+               MakeDroppedFileList(wParam, Cur, &FileListBase);\r
+\r
+               // 現在ホスト側のファイル一覧に表示されているものをRemoteListに登録\r
+               // 同名ファイルチェック用\r
+               RemoteList = NULL;\r
+               AddRemoteTreeToFileList(AskCurrentFileListNum(), "", RDIR_NONE, &RemoteList);\r
+\r
+               FirstAdd = YES;\r
+               ExistNotify = YES;\r
+\r
+               Pos = FileListBase;\r
+               while(Pos != NULL)\r
+               {\r
+                       AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
+                       SetSlashTail(Pkt.RemoteFile);\r
+                       Cat = strchr(Pkt.RemoteFile, NUL);\r
+\r
+                       strcat(Pkt.RemoteFile, Pos->File);\r
+                       if(FnameCnv == FNAME_LOWER)\r
+                               _mbslwr(Cat);\r
+                       else if(FnameCnv == FNAME_UPPER)\r
+                               _mbsupr(Cat);\r
+                       ReplaceAll(Pkt.RemoteFile, '\\', '/');\r
+#if defined(HAVE_TANDEM)\r
+                       Pkt.FileCode = 0;\r
+                       Pkt.PriExt = DEF_PRIEXT;\r
+                       Pkt.SecExt = DEF_SECEXT;\r
+                       Pkt.MaxExt = DEF_MAXEXT;\r
+#endif\r
+\r
+                       if(AskHostType() == HTYPE_ACOS)\r
+                       {\r
+                               strcpy(Pkt.RemoteFile, "'");\r
+                               strcat(Pkt.RemoteFile, AskHostLsName());\r
+                               strcat(Pkt.RemoteFile, "(");\r
+                               strcat(Pkt.RemoteFile, Cat);\r
+                               strcat(Pkt.RemoteFile, ")");\r
+                               strcat(Pkt.RemoteFile, "'");\r
+                       }\r
+                       else if(AskHostType() == HTYPE_ACOS_4)\r
+                               strcpy(Pkt.RemoteFile, Cat);\r
+\r
+                       if(Pos->Node == NODE_DIR)\r
+                       {\r
+                               // フォルダの場合\r
+\r
+                               // ホスト側のファイル一覧をRemoteListに登録\r
+                               // 同名ファイルチェック用\r
+                               if(RemoteList != NULL)\r
+                                       DeleteFileList(&RemoteList);\r
+                               RemoteList = NULL;\r
+\r
+                               AskRemoteCurDir(Tmp, FMAX_PATH);\r
+                               if(DoCWD(Pkt.RemoteFile, NO, NO, NO) == FTP_COMPLETE)\r
+                               {\r
+                                       if(DoDirListCmdSkt("", "", 998, &CancelFlg) == FTP_COMPLETE)\r
+                                               AddRemoteTreeToFileList(998, "", RDIR_NONE, &RemoteList);\r
+                                       DoCWD(Tmp, NO, NO, NO);\r
+                               }\r
+                               else\r
+                               {\r
+                                       if((FirstAdd == YES) && (AskNoFullPathMode() == YES))\r
+                                       {\r
+                                               strcpy(Pkt1.Cmd, "SETCUR");\r
+                                               AskRemoteCurDir(Pkt1.RemoteFile, FMAX_PATH);\r
+                                               AddTransFileList(&Pkt1);\r
+                                       }\r
+                                       FirstAdd = NO;\r
+                                       strcpy(Pkt.Cmd, "MKD ");\r
+                                       strcpy(Pkt.LocalFile, "");\r
+                                       AddTransFileList(&Pkt);\r
+                               }\r
+                       }\r
+                       else if(Pos->Node == NODE_FILE)\r
+                       {\r
+                               // ファイルの場合\r
+                               strcpy(Pkt.LocalFile, Cur);\r
+                               SetYenTail(Pkt.LocalFile);\r
+                               strcat(Pkt.LocalFile, Pos->File);\r
+                               ReplaceAll(Pkt.LocalFile, '/', '\\');\r
+\r
+                               strcpy(Pkt.Cmd, "STOR ");\r
+                               Pkt.Type = AskTransferTypeAssoc(Pkt.LocalFile, AskTransferType());\r
+                               // バグ修正\r
+//                             Pkt.Size = 0;\r
+                               Pkt.Size = Pos->Size;\r
+                               Pkt.Time = Pos->Time;\r
+                               Pkt.Attr = AskUploadFileAttr(Pkt.RemoteFile);\r
+                               Pkt.KanjiCode = AskHostKanjiCode();\r
+                               // UTF-8対応\r
+                               Pkt.KanjiCodeDesired = AskLocalKanjiCode();\r
+                               Pkt.KanaCnv = AskHostKanaCnv();\r
+#if defined(HAVE_TANDEM)\r
+                               if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) {\r
+                                       int a = Pos->InfoExist && FINFO_SIZE;\r
+                                       CalcExtentSize(&Pkt, Pos->Size);\r
+                               }\r
+#endif\r
+                               // ディレクトリ自動作成\r
+                               strcpy(Tmp, Pkt.RemoteFile);\r
+                               Pkt.Mode = CheckRemoteFile(&Pkt, RemoteList);\r
+                               // ミラーリング設定追加\r
+                               Pkt.NoTransfer = NO;\r
+                               if(Pkt.Mode == EXIST_ABORT)\r
+                                       break;\r
+                               else if(Pkt.Mode != EXIST_IGNORE)\r
+                               {\r
+                                       // ディレクトリ自動作成\r
+                                       if(MakeAllDir == YES)\r
+                                       {\r
+                                               if(MakeDirFromRemotePath(Pkt.RemoteFile, Tmp, FirstAdd) == YES)\r
+                                                       FirstAdd = NO;\r
+                                       }\r
+                                       if((FirstAdd == YES) && (AskNoFullPathMode() == YES))\r
+                                       {\r
+                                               strcpy(Pkt1.Cmd, "SETCUR");\r
+                                               AskRemoteCurDir(Pkt1.RemoteFile, FMAX_PATH);\r
+                                               AddTransFileList(&Pkt1);\r
+                                       }\r
+                                       FirstAdd = NO;\r
+                                       AddTransFileList(&Pkt);\r
+                               }\r
+                       }\r
+                       Pos = Pos->Next;\r
+               }\r
+\r
+               if((FirstAdd == NO) && (AskNoFullPathMode() == YES))\r
+               {\r
+                       strcpy(Pkt.Cmd, "BACKCUR");\r
+                       AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
+                       AddTransFileList(&Pkt);\r
+               }\r
+\r
+               if(RemoteList != NULL)\r
+                       DeleteFileList(&RemoteList);\r
+\r
+               DeleteFileList(&FileListBase);\r
+\r
+               // 同時接続対応\r
+//             strcpy(Pkt.Cmd, "GOQUIT");\r
+//             AddTransFileList(&Pkt);\r
+\r
+               // バグ対策\r
+               AddNullTransFileList();\r
+\r
+               GoForwardTransWindow();\r
+\r
+               EnableUserOpe();\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- ミラーリングアップロードを行う ----------------------------------------\r
+*\r
+*      Parameter\r
+*              int Notify : 確認を行うかどうか (YES/NO)\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void MirrorUploadProc(int Notify)\r
+{\r
+       FILELIST *LocalListBase;\r
+       FILELIST *RemoteListBase;\r
+       FILELIST *LocalPos;\r
+       FILELIST *RemotePos;\r
+       TRANSPACKET Pkt;\r
+       TRANSPACKET *Base;\r
+       char Name[FMAX_PATH+1];\r
+       char *Cat;\r
+       int Level;\r
+       int Mode;\r
+       SYSTEMTIME TmpStime;\r
+       FILETIME TmpFtimeL;\r
+       FILETIME TmpFtimeR;\r
+       // ファイル一覧バグ修正\r
+       int ListSts;\r
+\r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
+       if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
+       {\r
+               DisableUserOpe();\r
+\r
+               Base = NULL;\r
+\r
+               if(Notify == YES)\r
+                       Notify = DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(mirror_up_dlg), GetMainHwnd(), MirrorNotifyCallBack, 1);\r
+               else\r
+                       Notify = YES;\r
+\r
+               if((Notify == YES) || (Notify == YES_LIST))\r
+               {\r
+                       /*===== ファイルリスト取得 =====*/\r
+\r
+                       LocalListBase = NULL;\r
+                       // ファイル一覧バグ修正\r
+//                     MakeSelectedFileList(WIN_LOCAL, YES, YES, &LocalListBase, &CancelFlg);\r
+                       ListSts = MakeSelectedFileList(WIN_LOCAL, YES, YES, &LocalListBase, &CancelFlg);\r
+                       RemoteListBase = NULL;\r
+                       // ファイル一覧バグ修正\r
+//                     MakeSelectedFileList(WIN_REMOTE, YES, YES, &RemoteListBase, &CancelFlg);\r
+                       if(ListSts == FFFTP_SUCCESS)\r
+                               ListSts = MakeSelectedFileList(WIN_REMOTE, YES, YES, &RemoteListBase, &CancelFlg);\r
+\r
+                       LocalPos = LocalListBase;\r
+                       while(LocalPos != NULL)\r
+                       {\r
+                               LocalPos->Attr = YES;           /* LocalPos->Attrは転送するかどうかのフラグに使用 (YES/NO) */\r
+                               LocalPos = LocalPos->Next;\r
+                       }\r
+\r
+                       RemotePos = RemoteListBase;\r
+                       while(RemotePos != NULL)\r
+                       {\r
+                               if(AskMirrorNoTrn(RemotePos->File, 1) == NO)\r
+                               {\r
+                                       RemotePos->Attr = YES;\r
+                                       RemotePos = RemotePos->Next;\r
+                               }\r
+                               else\r
+                               {\r
+                                       RemotePos->Attr = NO;   /* RemotePos->Attrは削除するかどうかのフラグに使用 (YES/NO) */\r
+\r
+                                       if(RemotePos->Node == NODE_DIR)\r
+                                       {\r
+                                               Level = AskDirLevel(RemotePos->File);\r
+                                               RemotePos = RemotePos->Next;\r
+                                               while(RemotePos != NULL)\r
+                                               {\r
+                                                       if((RemotePos->Node == NODE_DIR) &&\r
+                                                          (AskDirLevel(RemotePos->File) <= Level))\r
+                                                       {\r
+                                                               break;\r
+                                                       }\r
+                                                       RemotePos->Attr = NO;\r
+                                                       RemotePos = RemotePos->Next;\r
+                                               }\r
+                                       }\r
+                                       else\r
+                                               RemotePos = RemotePos->Next;\r
+                               }\r
+                       }\r
+\r
+                       /*===== ファイルリスト比較 =====*/\r
+\r
+                       LocalPos = LocalListBase;\r
+                       while(LocalPos != NULL)\r
+                       {\r
+                               if(AskMirrorNoTrn(LocalPos->File, 0) == NO)\r
+                               {\r
+                                       strcpy(Name, LocalPos->File);\r
+                                       ReplaceAll(Name, '\\', '/');\r
+\r
+                                       if(MirrorFnameCnv == YES)\r
+                                               Mode = COMP_LOWERMATCH;\r
+                                       else\r
+                                               Mode = COMP_STRICT;\r
+\r
+                                       if(LocalPos->Node == NODE_DIR)\r
+                                       {\r
+                                               if((RemotePos = SearchFileList(Name, RemoteListBase, Mode)) != NULL)\r
+                                               {\r
+                                                       if(RemotePos->Node == NODE_DIR)\r
+                                                       {\r
+                                                               RemotePos->Attr = NO;\r
+                                                               LocalPos->Attr = NO;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       else if(LocalPos->Node == NODE_FILE)\r
+                                       {\r
+                                               if((RemotePos = SearchFileList(Name, RemoteListBase, Mode)) != NULL)\r
+                                               {\r
+                                                       if(RemotePos->Node == NODE_FILE)\r
+                                                       {\r
+                                                               FileTimeToLocalFileTime(&LocalPos->Time, &TmpFtimeL);\r
+                                                               FileTimeToLocalFileTime(&RemotePos->Time, &TmpFtimeR);\r
+                                                               if((RemotePos->InfoExist & FINFO_TIME) == 0)\r
+                                                               {\r
+                                                                       // タイムスタンプのバグ修正\r
+//                                                                     FileTimeToSystemTime(&TmpFtimeL, &TmpStime);\r
+//                                                                     TmpStime.wHour = 0;\r
+//                                                                     TmpStime.wMinute = 0;\r
+//                                                                     TmpStime.wSecond = 0;\r
+//                                                                     TmpStime.wMilliseconds = 0;\r
+//                                                                     SystemTimeToFileTime(&TmpStime, &TmpFtimeL);\r
+                                                                       if(FileTimeToSystemTime(&TmpFtimeL, &TmpStime))\r
+                                                                       {\r
+                                                                               TmpStime.wHour = 0;\r
+                                                                               TmpStime.wMinute = 0;\r
+                                                                               TmpStime.wSecond = 0;\r
+                                                                               TmpStime.wMilliseconds = 0;\r
+                                                                               SystemTimeToFileTime(&TmpStime, &TmpFtimeL);\r
+                                                                       }\r
+\r
+                                                                       // タイムスタンプのバグ修正\r
+//                                                                     FileTimeToSystemTime(&TmpFtimeR, &TmpStime);\r
+//                                                                     TmpStime.wHour = 0;\r
+//                                                                     TmpStime.wMinute = 0;\r
+//                                                                     TmpStime.wSecond = 0;\r
+//                                                                     TmpStime.wMilliseconds = 0;\r
+//                                                                     SystemTimeToFileTime(&TmpStime, &TmpFtimeR);\r
+                                                                       if(FileTimeToSystemTime(&TmpFtimeR, &TmpStime))\r
+                                                                       {\r
+                                                                               TmpStime.wHour = 0;\r
+                                                                               TmpStime.wMinute = 0;\r
+                                                                               TmpStime.wSecond = 0;\r
+                                                                               TmpStime.wMilliseconds = 0;\r
+                                                                               SystemTimeToFileTime(&TmpStime, &TmpFtimeR);\r
+                                                                       }\r
+                                                               }\r
+                                                               RemotePos->Attr = NO;\r
+                                                               if(CompareFileTime(&TmpFtimeL, &TmpFtimeR) <= 0)\r
+                                                                       LocalPos->Attr = NO;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+\r
+                                       LocalPos = LocalPos->Next;\r
+                               }\r
+                               else\r
+                               {\r
+                                       if(LocalPos->Node == NODE_FILE)\r
+                                       {\r
+                                               LocalPos->Attr = NO;\r
+                                               LocalPos = LocalPos->Next;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               LocalPos->Attr = NO;\r
+                                               Level = AskDirLevel(LocalPos->File);\r
+                                               LocalPos = LocalPos->Next;\r
+                                               while(LocalPos != NULL)\r
+                                               {\r
+                                                       if((LocalPos->Node == NODE_DIR) &&\r
+                                                          (AskDirLevel(LocalPos->File) <= Level))\r
+                                                       {\r
+                                                               break;\r
+                                                       }\r
+                                                       LocalPos->Attr = NO;\r
+                                                       LocalPos = LocalPos->Next;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       DispMirrorFiles(LocalListBase, RemoteListBase);\r
+\r
+                       /*===== 削除/アップロード =====*/\r
+\r
+                       RemotePos = RemoteListBase;\r
+                       while(RemotePos != NULL)\r
+                       {\r
+                               if((RemotePos->Attr == YES) && (RemotePos->Node == NODE_FILE))\r
+                               {\r
+                                       AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
+                                       SetSlashTail(Pkt.RemoteFile);\r
+                                       strcat(Pkt.RemoteFile, RemotePos->File);\r
+                                       ReplaceAll(Pkt.RemoteFile, '\\', '/');\r
+                                       strcpy(Pkt.LocalFile, "");\r
+                                       strcpy(Pkt.Cmd, "R-DELE ");\r
+                                       AddTmpTransFileList(&Pkt, &Base);\r
+                               }\r
+                               RemotePos = RemotePos->Next;\r
+                       }\r
+                       MirrorDeleteAllDir(RemoteListBase, &Pkt, &Base);\r
+\r
+                       LocalPos = LocalListBase;\r
+                       while(LocalPos != NULL)\r
+                       {\r
+                               if(LocalPos->Attr == YES)\r
+                               {\r
+                                       AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
+                                       SetSlashTail(Pkt.RemoteFile);\r
+                                       Cat = strchr(Pkt.RemoteFile, NUL);\r
+                                       strcat(Pkt.RemoteFile, LocalPos->File);\r
+\r
+                                       if(MirrorFnameCnv == YES)\r
+                                               _mbslwr(Cat);\r
+\r
+                                       ReplaceAll(Pkt.RemoteFile, '\\', '/');\r
+\r
+                                       if(LocalPos->Node == NODE_DIR)\r
+                                       {\r
+                                               strcpy(Pkt.LocalFile, "");\r
+                                               strcpy(Pkt.Cmd, "R-MKD ");\r
+                                               AddTmpTransFileList(&Pkt, &Base);\r
+                                       }\r
+                                       else if(LocalPos->Node == NODE_FILE)\r
+                                       {\r
+                                               AskLocalCurDir(Pkt.LocalFile, FMAX_PATH);\r
+                                               SetYenTail(Pkt.LocalFile);\r
+                                               strcat(Pkt.LocalFile, LocalPos->File);\r
+                                               ReplaceAll(Pkt.LocalFile, '/', '\\');\r
+\r
+                                               strcpy(Pkt.Cmd, "STOR ");\r
+                                               Pkt.Type = AskTransferTypeAssoc(Pkt.LocalFile, AskTransferType());\r
+                                               // バグ修正\r
+//                                             Pkt.Size = 0;\r
+                                               Pkt.Size = LocalPos->Size;\r
+                                               Pkt.Time = LocalPos->Time;\r
+                                               Pkt.Attr = AskUploadFileAttr(Pkt.RemoteFile);\r
+                                               Pkt.KanjiCode = AskHostKanjiCode();\r
+                                               // UTF-8対応\r
+                                               Pkt.KanjiCodeDesired = AskLocalKanjiCode();\r
+                                               Pkt.KanaCnv = AskHostKanaCnv();\r
+#if defined(HAVE_TANDEM)\r
+                                               if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) {\r
+                                                       CalcExtentSize(&Pkt, LocalPos->Size);\r
+                                               }\r
+#endif\r
+                                               Pkt.Mode = EXIST_OVW;\r
+                                               // ミラーリング設定追加\r
+                                               Pkt.NoTransfer = MirrorNoTransferContents;\r
+                                               AddTmpTransFileList(&Pkt, &Base);\r
+                                       }\r
+                               }\r
+                               LocalPos = LocalPos->Next;\r
+                       }\r
+\r
+                       // ファイル一覧バグ修正\r
+//                     if((Notify == YES) ||\r
+//                        (DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(mirror_notify_dlg), GetMainHwnd(), MirrorDispListCallBack, (LPARAM)&Base) == YES))\r
+                       if(((AbortOnListError == NO) || (ListSts == FFFTP_SUCCESS)) && ((Notify == YES) ||\r
+                          (DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(mirror_notify_dlg), GetMainHwnd(), MirrorDispListCallBack, (LPARAM)&Base) == YES)))\r
+                       {\r
+                               if(AskNoFullPathMode() == YES)\r
+                               {\r
+                                       strcpy(Pkt.Cmd, "SETCUR");\r
+                                       AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
+                                       AddTransFileList(&Pkt);\r
+                               }\r
+                               AppendTransFileList(Base);\r
+\r
+                               if(AskNoFullPathMode() == YES)\r
+                               {\r
+                                       strcpy(Pkt.Cmd, "BACKCUR");\r
+                                       AskRemoteCurDir(Pkt.RemoteFile, FMAX_PATH);\r
+                                       AddTransFileList(&Pkt);\r
+                               }\r
+\r
+                               // 同時接続対応\r
+//                             strcpy(Pkt.Cmd, "GOQUIT");\r
+//                             AddTransFileList(&Pkt);\r
+                       }\r
+                       else\r
+                               EraseTmpTransFileList(&Base);\r
+\r
+                       // バグ対策\r
+                       AddNullTransFileList();\r
+\r
+                       DeleteFileList(&LocalListBase);\r
+                       DeleteFileList(&RemoteListBase);\r
+\r
+                       GoForwardTransWindow();\r
+               }\r
+\r
+               EnableUserOpe();\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- ミラーリング時のホスト側のフォルダ削除 --------------------------------\r
+*\r
+*      Parameter\r
+*              FILELIST *Base : ファイルリスト\r
+*              TRANSPACKET *Pkt : \r
+*              TRANSPACKET **Base : \r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+static void MirrorDeleteAllDir(FILELIST *Remote, TRANSPACKET *Pkt, TRANSPACKET **Base)\r
+{\r
+       while(Remote != NULL)\r
+       {\r
+               if(Remote->Node == NODE_DIR)\r
+               {\r
+                       MirrorDeleteAllDir(Remote->Next, Pkt, Base);\r
+\r
+                       if(Remote->Attr == YES)\r
+                       {\r
+                               AskRemoteCurDir(Pkt->RemoteFile, FMAX_PATH);\r
+                               SetSlashTail(Pkt->RemoteFile);\r
+                               strcat(Pkt->RemoteFile, Remote->File);\r
+                               ReplaceAll(Pkt->RemoteFile, '\\', '/');\r
+                               strcpy(Pkt->LocalFile, "");\r
+                               strcpy(Pkt->Cmd, "R-RMD ");\r
+                               AddTmpTransFileList(Pkt, Base);\r
+                       }\r
+                       break;\r
+               }\r
+               Remote = Remote->Next;\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- ミラーリングアップロード開始確認ウインドウのコールバック --------------\r
+*\r
+*      Parameter\r
+*              HWND hDlg : ウインドウハンドル\r
+*              UINT message : メッセージ番号\r
+*              WPARAM wParam : メッセージの WPARAM 引数\r
+*              LPARAM lParam : メッセージの LPARAM 引数\r
+*\r
+*      Return Value\r
+*              BOOL TRUE/FALSE\r
+*----------------------------------------------------------------------------*/\r
+\r
+// 64ビット対応\r
+//static BOOL CALLBACK MirrorNotifyCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+static INT_PTR CALLBACK MirrorNotifyCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+{\r
+       static int Mode;\r
+\r
+       switch (iMessage)\r
+       {\r
+               case WM_INITDIALOG :\r
+                       Mode = lParam;\r
+                       return(TRUE);\r
+\r
+               case WM_COMMAND :\r
+                       switch(GET_WM_COMMAND_ID(wParam, lParam))\r
+                       {\r
+                               case IDOK :\r
+                                       EndDialog(hDlg, YES);\r
+                                       break;\r
+\r
+                               case IDCANCEL :\r
+                                       EndDialog(hDlg, NO);\r
+                                       break;\r
+\r
+                               case MIRRORUP_DISP :\r
+                                       EndDialog(hDlg, YES_LIST);\r
+                                       break;\r
+\r
+                               case IDHELP :\r
+                                       if(Mode == 0)\r
+                                               hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000013);\r
+                                       else\r
+                                               hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000012);\r
+                       }\r
+                       return(TRUE);\r
+       }\r
+       return(FALSE);\r
+}\r
+\r
+\r
+/*----- ミラーリングアップロード処理内容確認ウインドウのコールバック ----------\r
+*\r
+*      Parameter\r
+*              HWND hDlg : ウインドウハンドル\r
+*              UINT message : メッセージ番号\r
+*              WPARAM wParam : メッセージの WPARAM 引数\r
+*              LPARAM lParam : メッセージの LPARAM 引数\r
+*\r
+*      Return Value\r
+*              BOOL TRUE/FALSE\r
+*----------------------------------------------------------------------------*/\r
+\r
+// 64ビット対応\r
+//static BOOL CALLBACK MirrorDispListCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+static INT_PTR CALLBACK MirrorDispListCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+{\r
+       static DIALOGSIZE DlgSize = {\r
+               { MIRROR_DEL, MIRROR_SIZEGRIP, -1 },\r
+               // ミラーリング設定追加\r
+//             { IDOK, IDCANCEL, IDHELP, MIRROR_DEL, MIRROR_COPYNUM, MIRROR_MAKENUM, MIRROR_DELNUM, MIRROR_SIZEGRIP, -1 },\r
+               { IDOK, IDCANCEL, IDHELP, MIRROR_DEL, MIRROR_COPYNUM, MIRROR_MAKENUM, MIRROR_DELNUM, MIRROR_SIZEGRIP, MIRROR_NO_TRANSFER, -1 },\r
+               { MIRROR_LIST, -1 },\r
+               { 0, 0 },\r
+               { 0, 0 }\r
+       };\r
+\r
+       static TRANSPACKET **Base;\r
+       TRANSPACKET *Pos;\r
+       char Tmp[FMAX_PATH+1+6];\r
+       int Num;\r
+       int *List;\r
+       // バグ修正\r
+       RECT Rect;\r
+\r
+       switch (iMessage)\r
+       {\r
+               // バグ修正\r
+               case WM_SIZE :\r
+                       GetWindowRect(hDlg, &Rect);\r
+                       DlgSizeChange(hDlg, &DlgSize, &Rect, 0);\r
+                       RedrawWindow(hDlg, NULL, NULL, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN);\r
+                       break;\r
+\r
+               case WM_INITDIALOG :\r
+                       Base = (TRANSPACKET **)lParam;\r
+                       Pos = *Base;\r
+                       while(Pos != NULL)\r
+                       {\r
+                               strcpy(Tmp, "");\r
+                               if((strncmp(Pos->Cmd, "R-DELE", 6) == 0) ||\r
+                                  (strncmp(Pos->Cmd, "R-RMD", 5) == 0))\r
+                                       sprintf(Tmp, MSGJPN052, Pos->RemoteFile);\r
+                               else if(strncmp(Pos->Cmd, "R-MKD", 5) == 0)\r
+                                       sprintf(Tmp, MSGJPN053, Pos->RemoteFile);\r
+                               else if(strncmp(Pos->Cmd, "STOR", 4) == 0)\r
+                                       sprintf(Tmp, MSGJPN054, Pos->RemoteFile);\r
+                               else if((strncmp(Pos->Cmd, "L-DELE", 6) == 0) ||\r
+                                               (strncmp(Pos->Cmd, "L-RMD", 5) == 0))\r
+                                       sprintf(Tmp, MSGJPN055, Pos->LocalFile);\r
+                               else if(strncmp(Pos->Cmd, "L-MKD", 5) == 0)\r
+                                       sprintf(Tmp, MSGJPN056, Pos->LocalFile);\r
+                               else if(strncmp(Pos->Cmd, "RETR", 4) == 0)\r
+                                       sprintf(Tmp, MSGJPN057, Pos->LocalFile);\r
+\r
+                               if(strlen(Tmp) > 0)\r
+                                       SendDlgItemMessage(hDlg, MIRROR_LIST, LB_ADDSTRING, 0, (LPARAM)Tmp);\r
+                               Pos = Pos->Next;\r
+                       }\r
+                       CountMirrorFiles(hDlg, *Base);\r
+                       DlgSizeInit(hDlg, &DlgSize, &MirrorDlgSize);\r
+                       EnableWindow(GetDlgItem(hDlg, MIRROR_DEL), FALSE);\r
+                       // ミラーリング設定追加\r
+                       SendDlgItemMessage(hDlg, MIRROR_NO_TRANSFER, BM_SETCHECK, MirrorNoTransferContents, 0);\r
+                       return(TRUE);\r
+\r
+               case WM_COMMAND :\r
+                       switch(GET_WM_COMMAND_ID(wParam, lParam))\r
+                       {\r
+                               case IDOK :\r
+                                       AskDlgSize(hDlg, &DlgSize, &MirrorDlgSize);\r
+                                       EndDialog(hDlg, YES);\r
+                                       break;\r
+\r
+                               case IDCANCEL :\r
+                                       AskDlgSize(hDlg, &DlgSize, &MirrorDlgSize);\r
+                                       EndDialog(hDlg, NO);\r
+                                       break;\r
+\r
+                               case MIRROR_DEL :\r
+                                       Num = SendDlgItemMessage(hDlg, MIRROR_LIST, LB_GETSELCOUNT, 0, 0);\r
+                                       if((List = malloc(Num * sizeof(int))) != NULL)\r
+                                       {\r
+                                               Num = SendDlgItemMessage(hDlg, MIRROR_LIST, LB_GETSELITEMS, Num, (LPARAM)List);\r
+                                               for(Num--; Num >= 0; Num--)\r
+                                               {\r
+                                                       if(RemoveTmpTransFileListItem(Base, List[Num]) == FFFTP_SUCCESS)\r
+                                                               SendDlgItemMessage(hDlg, MIRROR_LIST, LB_DELETESTRING, List[Num], 0);\r
+                                                       else\r
+                                                               MessageBeep(-1);\r
+                                               }\r
+                                               free(List);\r
+                                               CountMirrorFiles(hDlg, *Base);\r
+                                       }\r
+                                       break;\r
+\r
+                               case MIRROR_LIST :\r
+                                       switch(GET_WM_COMMAND_CMD(wParam, lParam))\r
+                                       {\r
+                                               case LBN_SELCHANGE :\r
+                                                       if(SendDlgItemMessage(hDlg, MIRROR_LIST, LB_GETSELCOUNT, 0, 0) > 0)\r
+                                                               EnableWindow(GetDlgItem(hDlg, MIRROR_DEL), TRUE);\r
+                                                       else\r
+                                                               EnableWindow(GetDlgItem(hDlg, MIRROR_DEL), FALSE);\r
+                                                       break;\r
+                                       }\r
+                                       break;\r
+\r
+                               // ミラーリング設定追加\r
+                               case MIRROR_NO_TRANSFER :\r
+                                       Pos = *Base;\r
+                                       while(Pos != NULL)\r
+                                       {\r
+                                               if(strncmp(Pos->Cmd, "STOR", 4) == 0 || strncmp(Pos->Cmd, "RETR", 4) == 0)\r
+                                                       Pos->NoTransfer = SendDlgItemMessage(hDlg, MIRROR_NO_TRANSFER, BM_GETCHECK, 0, 0);\r
+                                               Pos = Pos->Next;\r
+                                       }\r
+                                       break;\r
+\r
+                               case IDHELP :\r
+                                       hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000012);\r
+                       }\r
+                       return(TRUE);\r
+\r
+               case WM_SIZING :\r
+                       DlgSizeChange(hDlg, &DlgSize, (RECT *)lParam, (int)wParam);\r
+                       return(TRUE);\r
+       }\r
+       return(FALSE);\r
+}\r
+\r
+\r
+/*----- ミラーリングで転送/削除するファイルの数を数えダイアログに表示---------\r
+*\r
+*      Parameter\r
+*              HWND hWnd : \r
+*              TRANSPACKET *Pkt : \r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+static void CountMirrorFiles(HWND hDlg, TRANSPACKET *Pkt)\r
+{\r
+       char Tmp[80];\r
+       int Del;\r
+       int Make;\r
+       int Copy;\r
+\r
+       Del = 0;\r
+       Make = 0;\r
+       Copy = 0;\r
+       while(Pkt != NULL)\r
+       {\r
+               if((strncmp(Pkt->Cmd, "R-DELE", 6) == 0) ||\r
+                  (strncmp(Pkt->Cmd, "R-RMD", 5) == 0) ||\r
+                  (strncmp(Pkt->Cmd, "L-DELE", 6) == 0) ||\r
+                  (strncmp(Pkt->Cmd, "L-RMD", 5) == 0))\r
+               {\r
+                       Del += 1;\r
+               }\r
+               else if((strncmp(Pkt->Cmd, "R-MKD", 5) == 0) ||\r
+                               (strncmp(Pkt->Cmd, "L-MKD", 5) == 0))\r
+               {\r
+                       Make += 1;\r
+               }\r
+               else if((strncmp(Pkt->Cmd, "STOR", 4) == 0) ||\r
+                               (strncmp(Pkt->Cmd, "RETR", 4) == 0))\r
+               {\r
+                       Copy += 1;\r
+               }\r
+               Pkt = Pkt->Next;\r
+       }\r
+\r
+       if(Copy != 0)\r
+               sprintf(Tmp, MSGJPN058, Copy);\r
+       else\r
+               sprintf(Tmp, MSGJPN059);\r
+       SendDlgItemMessage(hDlg, MIRROR_COPYNUM, WM_SETTEXT, 0, (LPARAM)Tmp);\r
+\r
+       if(Make != 0)\r
+               sprintf(Tmp, MSGJPN060, Make);\r
+       else\r
+               sprintf(Tmp, MSGJPN061);\r
+       SendDlgItemMessage(hDlg, MIRROR_MAKENUM, WM_SETTEXT, 0, (LPARAM)Tmp);\r
+\r
+       if(Del != 0)\r
+               sprintf(Tmp, MSGJPN062, Del);\r
+       else\r
+               sprintf(Tmp, MSGJPN063);\r
+       SendDlgItemMessage(hDlg, MIRROR_DELNUM, WM_SETTEXT, 0, (LPARAM)Tmp);\r
+\r
+       return;\r
+}\r
+\r
+\r
+\r
+\r
+/*----- ミラーリングで転送/削除しないファイルかどうかを返す ------------------\r
+*\r
+*      Parameter\r
+*              char Fname : ファイル名\r
+*              int Mode : モード\r
+*                      0=転送しないファイル, 1=削除しないファイル\r
+*\r
+*      Return Value\r
+*              int ステータス\r
+*                      YES=転送・削除しない/NO\r
+*----------------------------------------------------------------------------*/\r
+\r
+static int AskMirrorNoTrn(char *Fname, int Mode)\r
+{\r
+       int Ret;\r
+       char *Tbl;\r
+\r
+       Tbl = MirrorNoTrn;\r
+       if(Mode == 1)\r
+               Tbl = MirrorNoDel;\r
+\r
+       Ret = NO;\r
+       if(StrMultiLen(Tbl) > 0)\r
+       {\r
+               Fname = GetFileName(Fname);\r
+               while(*Tbl != NUL)\r
+               {\r
+                       if(CheckFname(Fname, Tbl) == FFFTP_SUCCESS)\r
+                       {\r
+                               Ret = YES;\r
+                               break;\r
+                       }\r
+                       Tbl += strlen(Tbl) + 1;\r
+               }\r
+       }\r
+       return(Ret);\r
+}\r
+\r
+\r
+/*----- アップロードするファイルの属性を返す ----------------------------------\r
+*\r
+*      Parameter\r
+*              char Fname : ファイル名\r
+*\r
+*      Return Value\r
+*              int 属性 (-1=設定なし)\r
+*----------------------------------------------------------------------------*/\r
+\r
+static int AskUploadFileAttr(char *Fname)\r
+{\r
+       int Ret;\r
+       int Sts;\r
+       char *Tbl;\r
+\r
+       Tbl = DefAttrList;\r
+       Fname = GetFileName(Fname);\r
+       Ret = -1;\r
+       while(*Tbl != NUL)\r
+       {\r
+               Sts = CheckFname(Fname, Tbl);\r
+               Tbl += strlen(Tbl) + 1;\r
+\r
+               if((Sts == FFFTP_SUCCESS) && (*Tbl != NUL))\r
+               {\r
+                       Ret = xtoi(Tbl);\r
+                       break;\r
+               }\r
+               Tbl += strlen(Tbl) + 1;\r
+       }\r
+       return(Ret);\r
+}\r
+\r
+\r
+/*----- ホストに同じ名前のファイルがないかチェック- ---------------------------a\r
+*\r
+*      Parameter\r
+*              TRANSPACKET *Pkt : 転送ファイル情報\r
+*              FILELIST *ListList : \r
+*\r
+*      Return Value\r
+*              int 処理方法\r
+*                      EXIST_OVW/EXIST_UNIQUE/EXIST_IGNORE\r
+*\r
+*      Note\r
+*              Pkt.ExistSize, UpExistMode、ExistNotify が変更される\r
+*----------------------------------------------------------------------------*/\r
+\r
+static int CheckRemoteFile(TRANSPACKET *Pkt, FILELIST *ListList)\r
+{\r
+       int Ret;\r
+#if defined(HAVE_TANDEM)\r
+       int Mode;\r
+#endif\r
+       FILELIST *Exist;\r
+\r
+       Ret = EXIST_OVW;\r
+       Pkt->ExistSize = 0;\r
+       if(SendMode != TRANS_OVW)\r
+       {\r
+#if defined(HAVE_TANDEM)\r
+               /* HP NonStop Server は大文字小文字の区別なし(すべて大文字) */\r
+               if(AskHostType() == HTYPE_TANDEM)\r
+                       Mode = COMP_IGNORE;\r
+               else\r
+                       Mode = COMP_STRICT;\r
+\r
+               if((Exist = SearchFileList(GetFileName(Pkt->RemoteFile), ListList, Mode)) != NULL)\r
+#else\r
+               if((Exist = SearchFileList(GetFileName(Pkt->RemoteFile), ListList, COMP_STRICT)) != NULL)\r
+#endif\r
+               {\r
+                       Pkt->ExistSize = Exist->Size;\r
+\r
+                       if(ExistNotify == YES)\r
+                       {\r
+                               SoundPlay(SND_ERROR);\r
+                               if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(up_exist_dlg), GetMainHwnd(), UpExistDialogCallBack, (LPARAM)Pkt) == NO)\r
+                                       Ret = EXIST_ABORT;\r
+                               else\r
+                                       Ret = UpExistMode;\r
+                       }\r
+                       else\r
+                               Ret = UpExistMode;\r
+\r
+                       if(Ret == EXIST_NEW)\r
+                       {\r
+                               /*ファイル日付チェック */\r
+                               if(CompareFileTime(&Exist->Time, &Pkt->Time) < 0)\r
+                                       Ret = EXIST_OVW;\r
+                               else\r
+                                       Ret = EXIST_IGNORE;\r
+                       }\r
+                       // 同じ名前のファイルの処理方法追加\r
+                       if(Ret == EXIST_LARGE)\r
+                       {\r
+                               if(Exist->Size < Pkt->Size)\r
+                                       Ret = EXIST_OVW;\r
+                               else\r
+                                       Ret = EXIST_IGNORE;\r
+                       }\r
+               }\r
+       }\r
+       return(Ret);\r
+}\r
+\r
+\r
+/*----- ホストに同じ名前のファイルがある時の確認ダイアログのコールバック ------\r
+*\r
+*      Parameter\r
+*              HWND hDlg : ウインドウハンドル\r
+*              UINT message : メッセージ番号\r
+*              WPARAM wParam : メッセージの WPARAM 引数\r
+*              LPARAM lParam : メッセージの LPARAM 引数\r
+*\r
+*      Return Value\r
+*              BOOL TRUE/FALSE\r
+*----------------------------------------------------------------------------*/\r
+\r
+// 64ビット対応\r
+//static BOOL CALLBACK UpExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+static INT_PTR CALLBACK UpExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+{\r
+       static TRANSPACKET *Pkt;\r
+       // 同じ名前のファイルの処理方法追加\r
+//     static const RADIOBUTTON UpExistButton[] = {\r
+//             { UP_EXIST_OVW, EXIST_OVW },\r
+//             { UP_EXIST_NEW, EXIST_NEW },\r
+//             { UP_EXIST_RESUME, EXIST_RESUME },\r
+//             { UP_EXIST_UNIQUE, EXIST_UNIQUE },\r
+//             { UP_EXIST_IGNORE, EXIST_IGNORE }\r
+//     };\r
+       static const RADIOBUTTON UpExistButton[] = {\r
+               { UP_EXIST_OVW, EXIST_OVW },\r
+               { UP_EXIST_NEW, EXIST_NEW },\r
+               { UP_EXIST_RESUME, EXIST_RESUME },\r
+               { UP_EXIST_UNIQUE, EXIST_UNIQUE },\r
+               { UP_EXIST_IGNORE, EXIST_IGNORE },\r
+               { UP_EXIST_LARGE, EXIST_LARGE }\r
+       };\r
+       #define UPEXISTBUTTONS  (sizeof(UpExistButton)/sizeof(RADIOBUTTON))\r
+\r
+       switch (iMessage)\r
+       {\r
+               case WM_INITDIALOG :\r
+                       Pkt = (TRANSPACKET *)lParam;\r
+                       SendDlgItemMessage(hDlg, UP_EXIST_NAME, EM_LIMITTEXT, FMAX_PATH, 0);\r
+                       SendDlgItemMessage(hDlg, UP_EXIST_NAME, WM_SETTEXT, 0, (LPARAM)Pkt->RemoteFile);\r
+\r
+                       if((Pkt->Type == TYPE_A) || (Pkt->ExistSize <= 0))\r
+                               EnableWindow(GetDlgItem(hDlg, UP_EXIST_RESUME), FALSE);\r
+\r
+                       SetRadioButtonByValue(hDlg, UpExistMode, UpExistButton, UPEXISTBUTTONS);\r
+                       return(TRUE);\r
+\r
+               case WM_COMMAND :\r
+                       switch(GET_WM_COMMAND_ID(wParam, lParam))\r
+                       {\r
+                               case IDOK_ALL :\r
+                                       ExistNotify = NO;\r
+                                       /* ここに break はない */\r
+\r
+                               case IDOK :\r
+                                       UpExistMode = AskRadioButtonValue(hDlg, UpExistButton, UPEXISTBUTTONS);\r
+                                       SendDlgItemMessage(hDlg, UP_EXIST_NAME, WM_GETTEXT, FMAX_PATH, (LPARAM)Pkt->RemoteFile);\r
+                                       EndDialog(hDlg, YES);\r
+                                       break;\r
+\r
+                               case IDCANCEL :\r
+//                                     Pkt->Abort = ABORT_USER;\r
+//                                     UpExistMode = EXIST_IGNORE;\r
+                                       EndDialog(hDlg, NO);\r
+                                       break;\r
+\r
+                               case IDHELP :\r
+                                       hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000011);\r
+                                       break;\r
+                       }\r
+                       return(TRUE);\r
+       }\r
+       return(FALSE);\r
+}\r
+\r
+\r
+/*----- アップロード/ダウンロードファイル名入力ダイアログのコールバック ------\r
+*\r
+*      Parameter\r
+*              HWND hDlg : ウインドウハンドル\r
+*              UINT message : メッセージ番号\r
+*              WPARAM wParam : メッセージの WPARAM 引数\r
+*              LPARAM lParam : メッセージの LPARAM 引数\r
+*\r
+*      Return Value\r
+*              BOOL TRUE/FALSE\r
+*----------------------------------------------------------------------------*/\r
+\r
+// 64ビット対応\r
+//static BOOL CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+static INT_PTR CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+{\r
+       switch (iMessage)\r
+       {\r
+               case WM_INITDIALOG :\r
+                       if(CurWin == WIN_LOCAL)\r
+                               SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN064);\r
+                       else\r
+                               SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN065);\r
+\r
+                       SendDlgItemMessage(hDlg, UPDOWNAS_NEW, EM_LIMITTEXT, FMAX_PATH, 0);\r
+                       SendDlgItemMessage(hDlg, UPDOWNAS_NEW, WM_SETTEXT, 0, (LPARAM)TmpString);\r
+                       SendDlgItemMessage(hDlg, UPDOWNAS_TEXT, WM_SETTEXT, 0, (LPARAM)TmpString);\r
+                       return(TRUE);\r
+\r
+               case WM_COMMAND :\r
+                       switch(GET_WM_COMMAND_ID(wParam, lParam))\r
+                       {\r
+                               case IDOK :\r
+                                       SendDlgItemMessage(hDlg, UPDOWNAS_NEW, WM_GETTEXT, FMAX_PATH, (LPARAM)TmpString);\r
+                                       EndDialog(hDlg, YES);\r
+                                       break;\r
+\r
+                               case UPDOWNAS_STOP :\r
+                                       EndDialog(hDlg, NO_ALL);\r
+                                       break;\r
+                       }\r
+                       return(TRUE);\r
+       }\r
+       return(FALSE);\r
+}\r
+\r
+\r
+#if defined(HAVE_TANDEM)\r
+/*----- アップロード/ダウンロードファイル名入力ダイアログのコールバック ------\r
+*\r
+*      Parameter\r
+*              HWND hDlg : ウインドウハンドル\r
+*              UINT message : メッセージ番号\r
+*              WPARAM wParam : メッセージの WPARAM 引数\r
+*              LPARAM lParam : メッセージの LPARAM 引数\r
+*\r
+*      Return Value\r
+*              BOOL TRUE/FALSE\r
+*----------------------------------------------------------------------------*/\r
+\r
+static INT_PTR CALLBACK UpDownAsWithExtDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+{\r
+       switch (iMessage)\r
+       {\r
+               case WM_INITDIALOG :\r
+                       if(CurWin == WIN_LOCAL)\r
+                               SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN064);\r
+                       else\r
+                               SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN065);\r
+\r
+                       SendDlgItemMessage(hDlg, UPDOWNAS_NEW, EM_LIMITTEXT, FMAX_PATH, 0);\r
+                       SendDlgItemMessage(hDlg, UPDOWNAS_NEW, WM_SETTEXT, 0, (LPARAM)TmpString);\r
+                       SendDlgItemMessage(hDlg, UPDOWNAS_TEXT, WM_SETTEXT, 0, (LPARAM)TmpString);\r
+                       SendDlgItemMessage(hDlg, UPDOWNAS_FILECODE, EM_LIMITTEXT, 4, 0);\r
+                       SendDlgItemMessage(hDlg, UPDOWNAS_FILECODE, WM_SETTEXT, 0, (LPARAM)TmpFileCode);\r
+\r
+                       return(TRUE);\r
+\r
+               case WM_COMMAND :\r
+                       switch(GET_WM_COMMAND_ID(wParam, lParam))\r
+                       {\r
+                               case IDOK :\r
+                                       SendDlgItemMessage(hDlg, UPDOWNAS_NEW, WM_GETTEXT, FMAX_PATH, (LPARAM)TmpString);\r
+                                       SendDlgItemMessage(hDlg, UPDOWNAS_FILECODE, WM_GETTEXT, FMAX_PATH, (LPARAM)TmpFileCode);\r
+                                       EndDialog(hDlg, YES);\r
+                                       break;\r
+\r
+                               case UPDOWNAS_STOP :\r
+                                       EndDialog(hDlg, NO_ALL);\r
+                                       break;\r
+                       }\r
+                       return(TRUE);\r
+       }\r
+       return(FALSE);\r
+}\r
+#endif\r
+\r
+\r
+/*----- ファイル一覧で指定されたファイルを削除する ----------------------------\r
+*\r
+*      Parameter\r
+*              なし\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void DeleteProc(void)\r
+{\r
+       int Win;\r
+       FILELIST *FileListBase;\r
+       FILELIST *Pos;\r
+       int DelFlg;\r
+       int Sts;\r
+       char CurDir[FMAX_PATH+1];\r
+       char Tmp[FMAX_PATH+1];\r
+\r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
+       // デッドロック対策\r
+//     Sts = YES;\r
+//     AskRemoteCurDir(CurDir, FMAX_PATH);\r
+//     FileListBase = NULL;\r
+//     if(GetFocus() == GetLocalHwnd())\r
+//     {\r
+//             Win = WIN_LOCAL;\r
+//             MakeSelectedFileList(Win, NO, NO, &FileListBase, &CancelFlg);\r
+//     }\r
+//     else\r
+//     {\r
+//             Win = WIN_REMOTE;\r
+//             if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
+//                     MakeSelectedFileList(Win, YES, NO, &FileListBase, &CancelFlg);\r
+//             else\r
+//                     Sts = NO;\r
+//     }\r
+       Sts = FFFTP_SUCCESS;\r
+       if(GetFocus() == GetLocalHwnd())\r
+               Win = WIN_LOCAL;\r
+       else\r
+       {\r
+               Win = WIN_REMOTE;\r
+               Sts = CheckClosedAndReconnect();\r
+       }\r
+\r
+       // デッドロック対策\r
+//     if(Sts == YES)\r
+       if(Sts == FFFTP_SUCCESS)\r
+       {\r
+               // デッドロック対策\r
+               DisableUserOpe();\r
+               AskRemoteCurDir(CurDir, FMAX_PATH);\r
+               FileListBase = NULL;\r
+               if(Win == WIN_LOCAL)\r
+                       MakeSelectedFileList(Win, NO, NO, &FileListBase, &CancelFlg);\r
+               else\r
+                       MakeSelectedFileList(Win, YES, NO, &FileListBase, &CancelFlg);\r
+\r
+               DelFlg = NO;\r
+               Sts = NO;\r
+               Pos = FileListBase;\r
+               while(Pos != NULL)\r
+               {\r
+                       if(Pos->Node == NODE_FILE)\r
+                       {\r
+                               DelNotifyAndDo(Pos, Win, &Sts, &DelFlg, CurDir);\r
+                               if(Sts == NO_ALL)\r
+                                       break;\r
+                       }\r
+                       Pos = Pos->Next;\r
+               }\r
+\r
+               if(Sts != NO_ALL)\r
+                       DeleteAllDir(FileListBase, Win, &Sts, &DelFlg, CurDir);\r
+\r
+               if(Win == WIN_REMOTE)\r
+               {\r
+                       AskRemoteCurDir(Tmp, FMAX_PATH);\r
+                       if(strcmp(Tmp, CurDir) != 0)\r
+                               DoCWD(Tmp, NO, NO, NO);\r
+               }\r
+\r
+               DeleteFileList(&FileListBase);\r
+\r
+               if(DelFlg == YES)\r
+               {\r
+                       if(Win == WIN_LOCAL)\r
+                               GetLocalDirForWnd();\r
+                       else\r
+                               GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);\r
+               }\r
+\r
+               // デッドロック対策\r
+               EnableUserOpe();\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- サブディレクトリ以下を全て削除する ------------------------------------\r
+*\r
+*      Parameter\r
+*              FILELIST *Dt : 削除するファイルのリスト\r
+*              int Win : ウインドウ番号 (WIN_xxx)\r
+*              int *Sw : 操作方法 (YES/NO/YES_ALL/NO_ALL)\r
+*              int *Flg : ファイルを削除したかどうかのフラグ (YES/NO)\r
+*              char *CurDir : カレントディレクトリ\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+static void DeleteAllDir(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDir)\r
+{\r
+       while(Dt != NULL)\r
+       {\r
+               if(Dt->Node == NODE_DIR)\r
+               {\r
+                       DeleteAllDir(Dt->Next, Win, Sw, Flg, CurDir);\r
+                       if(*Sw == NO_ALL)\r
+                               break;\r
+\r
+                       DelNotifyAndDo(Dt, Win, Sw, Flg, CurDir);\r
+                       break;\r
+               }\r
+               Dt = Dt->Next;\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- 削除するかどうかの確認と削除実行 --------------------------------------\r
+*\r
+*      Parameter\r
+*              FILELIST *Dt : 削除するファイルのリスト\r
+*              int Win : ウインドウ番号 (WIN_xxx)\r
+*              int *Sw : 操作方法 (YES/NO/YES_ALL/NO_ALL)\r
+*              int *Flg : ファイルを削除したかどうかのフラグ (YES/NO)\r
+*              char *CurDir : カレントディレクトリ\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+static void DelNotifyAndDo(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDir)\r
+{\r
+       char Path[FMAX_PATH+1];\r
+\r
+       if(Win == WIN_LOCAL)\r
+       {\r
+               AskLocalCurDir(Path, FMAX_PATH);\r
+               SetYenTail(Path);\r
+               strcat(Path, Dt->File);\r
+               ReplaceAll(Path, '/', '\\');\r
+       }\r
+       else\r
+       {\r
+               AskRemoteCurDir(Path, FMAX_PATH);\r
+               SetSlashTail(Path);\r
+               strcat(Path, Dt->File);\r
+               ReplaceAll(Path, '\\', '/');\r
+       }\r
+\r
+       if(*Sw != YES_ALL)\r
+       {\r
+               sprintf(TmpString, "%s", Path);\r
+\r
+               // ローカルのファイルのパスの最後の'\\'が消えるバグ修正\r
+//             if(AskHostType() == HTYPE_VMS)\r
+               if(Win == WIN_REMOTE && AskHostType() == HTYPE_VMS)\r
+                       ReformToVMSstylePathName(TmpString);\r
+\r
+               CurWin = Win;\r
+               *Sw = DialogBox(GetFtpInst(), MAKEINTRESOURCE(delete_dlg), GetMainHwnd(), DeleteDialogCallBack);\r
+       }\r
+\r
+       if((*Sw == YES) || (*Sw == YES_ALL))\r
+       {\r
+               if(Win == WIN_LOCAL)\r
+               {\r
+                       if(Dt->Node == NODE_FILE)\r
+                               DoLocalDELE(Path);\r
+                       else\r
+                               DoLocalRMD(Path);\r
+                       *Flg = YES;\r
+               }\r
+               else\r
+               {\r
+                       /* フルパスを使わない時のための処理 */\r
+                       // 同時接続対応\r
+//                     if(ProcForNonFullpath(Path, CurDir, GetMainHwnd(), 0) == FFFTP_FAIL)\r
+                       if(ProcForNonFullpath(AskCmdCtrlSkt(), Path, CurDir, GetMainHwnd(), &CancelFlg) == FFFTP_FAIL)\r
+                               *Sw = NO_ALL;\r
+\r
+                       if(*Sw != NO_ALL)\r
+                       {\r
+                               if(Dt->Node == NODE_FILE)\r
+                                       DoDELE(Path);\r
+                               else\r
+                                       DoRMD(Path);\r
+                               *Flg = YES;\r
+                       }\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- ファイル削除ダイアログのコールバック ----------------------------------\r
+*\r
+*      Parameter\r
+*              HWND hDlg : ウインドウハンドル\r
+*              UINT message : メッセージ番号\r
+*              WPARAM wParam : メッセージの WPARAM 引数\r
+*              LPARAM lParam : メッセージの LPARAM 引数\r
+*\r
+*      Return Value\r
+*              BOOL TRUE/FALSE\r
+*----------------------------------------------------------------------------*/\r
+\r
+// 64ビット対応\r
+//static BOOL CALLBACK DeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+static INT_PTR CALLBACK DeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+{\r
+       switch (iMessage)\r
+       {\r
+               case WM_INITDIALOG :\r
+                       if(CurWin == WIN_LOCAL)\r
+                               SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN066);\r
+                       else\r
+                               SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN067);\r
+                       SendDlgItemMessage(hDlg, DELETE_TEXT, WM_SETTEXT, 0, (LPARAM)TmpString);\r
+                       return(TRUE);\r
+\r
+               case WM_COMMAND :\r
+                       switch(GET_WM_COMMAND_ID(wParam, lParam))\r
+                       {\r
+                               case IDOK :\r
+                                       EndDialog(hDlg, YES);\r
+                                       break;\r
+\r
+                               case DELETE_NO :\r
+                                       EndDialog(hDlg, NO);\r
+                                       break;\r
+\r
+                               case DELETE_ALL :\r
+                                       EndDialog(hDlg, YES_ALL);\r
+                                       break;\r
+\r
+                               case IDCANCEL :\r
+                                       EndDialog(hDlg, NO_ALL);\r
+                                       break;\r
+                       }\r
+                       return(TRUE);\r
+       }\r
+       return(FALSE);\r
+}\r
+\r
+\r
+/*----- ファイル一覧で指定されたファイルの名前を変更する ----------------------\r
+*\r
+*      Parameter\r
+*              なし\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void RenameProc(void)\r
+{\r
+       int Win;\r
+       FILELIST *FileListBase;\r
+       FILELIST *Pos;\r
+       char New[FMAX_PATH+1];\r
+       int RenFlg;\r
+       int Sts;\r
+\r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
+       Sts = FFFTP_SUCCESS;\r
+       if(GetFocus() == GetLocalHwnd())\r
+               Win = WIN_LOCAL;\r
+       else\r
+       {\r
+               Win = WIN_REMOTE;\r
+               Sts = CheckClosedAndReconnect();\r
+       }\r
+\r
+       if(Sts == FFFTP_SUCCESS)\r
+       {\r
+               DisableUserOpe();\r
+\r
+               FileListBase = NULL;\r
+               MakeSelectedFileList(Win, NO, NO, &FileListBase, &CancelFlg);\r
+\r
+               RenFlg = NO;\r
+               Sts = NO;\r
+               Pos = FileListBase;\r
+               while(Pos != NULL)\r
+               {\r
+                       if((Pos->Node == NODE_FILE) || (Pos->Node == NODE_DIR))\r
+                       {\r
+                               strcpy(TmpString, Pos->File);\r
+                               CurWin = Win;\r
+                               Sts = DialogBox(GetFtpInst(), MAKEINTRESOURCE(rename_dlg), GetMainHwnd(), RenameDialogCallBack);\r
+\r
+                               if(Sts == NO_ALL)\r
+                                       break;\r
+\r
+                               if((Sts == YES) && (strlen(TmpString) != 0))\r
+                               {\r
+                                       strcpy(New, TmpString);\r
+                                       if(Win == WIN_LOCAL)\r
+                                               DoLocalRENAME(Pos->File, New);\r
+                                       else\r
+                                               DoRENAME(Pos->File, New);\r
+                                       RenFlg = YES;\r
+                               }\r
+                       }\r
+                       Pos = Pos->Next;\r
+               }\r
+               DeleteFileList(&FileListBase);\r
+\r
+               if(RenFlg == YES)\r
+               {\r
+                       if(Win == WIN_LOCAL)\r
+                               GetLocalDirForWnd();\r
+                       else\r
+                               GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);\r
+               }\r
+\r
+               EnableUserOpe();\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+//\r
+// リモート側でのファイルの移動(リネーム)を行う\r
+//  \r
+// RenameProc()をベースに改造。(2007.9.5 yutaka)\r
+//\r
+void MoveRemoteFileProc(int drop_index)\r
+{\r
+       int Win;\r
+       FILELIST *FileListBase;\r
+       FILELIST *Pos;\r
+       FILELIST Pkt;\r
+       char New[FMAX_PATH+1];\r
+       char Old[FMAX_PATH+1];\r
+       char HostDir[FMAX_PATH+1];\r
+       int RenFlg;\r
+       int Sts;\r
+\r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
+       if(MoveMode == MOVE_DISABLE)\r
+       {\r
+               return;\r
+       }\r
+\r
+       AskRemoteCurDir(HostDir, FMAX_PATH);\r
+\r
+       // ドロップ先のフォルダ名を得る\r
+       // 上位のディレクトリへ移動対応\r
+//     GetNodeName(WIN_REMOTE, drop_index, Pkt.File, FMAX_PATH);\r
+       if(drop_index >= 0)\r
+               GetNodeName(WIN_REMOTE, drop_index, Pkt.File, FMAX_PATH);\r
+       else\r
+               strcpy(Pkt.File, "..");\r
+\r
+       if(MoveMode == MOVE_DLG)\r
+       {\r
+               if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(move_notify_dlg), GetRemoteHwnd(), ExeEscTextDialogProc, (LPARAM)Pkt.File) == NO)\r
+               {\r
+                       return;\r
+               }\r
+       }\r
+\r
+       Sts = FFFTP_SUCCESS;\r
+#if 0\r
+       if(GetFocus() == GetLocalHwnd())\r
+               Win = WIN_LOCAL;\r
+       else\r
+       {\r
+               Win = WIN_REMOTE;\r
+               Sts = CheckClosedAndReconnect();\r
+       }\r
+#else\r
+               Win = WIN_REMOTE;\r
+               Sts = CheckClosedAndReconnect();\r
+#endif\r
+\r
+       if(Sts == FFFTP_SUCCESS)\r
+       {\r
+               DisableUserOpe();\r
+\r
+               FileListBase = NULL;\r
+               MakeSelectedFileList(Win, NO, NO, &FileListBase, &CancelFlg);\r
+\r
+               RenFlg = NO;\r
+               Sts = NO;\r
+               Pos = FileListBase;\r
+               while(Pos != NULL)\r
+               {\r
+                       if((Pos->Node == NODE_FILE) || (Pos->Node == NODE_DIR))\r
+                       {\r
+                               strcpy(TmpString, Pos->File);\r
+                               CurWin = Win;\r
+#if 0\r
+                               Sts = DialogBox(GetFtpInst(), MAKEINTRESOURCE(rename_dlg), GetMainHwnd(), RenameDialogCallBack);\r
+\r
+                               if(Sts == NO_ALL)\r
+                                       break;\r
+#else\r
+                               Sts = YES;\r
+#endif\r
+\r
+                               if((Sts == YES) && (strlen(TmpString) != 0))\r
+                               {\r
+                                       // パスの設定(local)\r
+                                       strncpy_s(Old, sizeof(Old), HostDir, _TRUNCATE);\r
+                                       strncat_s(Old, sizeof(Old), "/", _TRUNCATE);\r
+                                       strncat_s(Old, sizeof(Old), Pos->File, _TRUNCATE);\r
+\r
+                                       // パスの設定(remote)\r
+                                       strncpy_s(New, sizeof(New), HostDir, _TRUNCATE);\r
+                                       strncat_s(New, sizeof(New), "/", _TRUNCATE);\r
+                                       strncat_s(New, sizeof(New), Pkt.File, _TRUNCATE);\r
+                                       strncat_s(New, sizeof(New), "/", _TRUNCATE);\r
+                                       strncat_s(New, sizeof(New), Pos->File, _TRUNCATE);\r
+\r
+                                       if(Win == WIN_LOCAL)\r
+                                               DoLocalRENAME(Old, New);\r
+                                       else\r
+                                               DoRENAME(Old, New);\r
+                                       RenFlg = YES;\r
+                               }\r
+                       }\r
+                       Pos = Pos->Next;\r
+               }\r
+               DeleteFileList(&FileListBase);\r
+\r
+               if(RenFlg == YES)\r
+               {\r
+                       if(Win == WIN_LOCAL) {\r
+                               GetLocalDirForWnd();\r
+                       } else {\r
+                               GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);\r
+\r
+                               strncpy_s(New, sizeof(New), HostDir, _TRUNCATE);\r
+                               strncat_s(New, sizeof(New), "/", _TRUNCATE);\r
+                               strncat_s(New, sizeof(New), Pkt.File, _TRUNCATE);\r
+                               DoCWD(New, YES, YES, YES);\r
+                               GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);\r
+                       }\r
+               }\r
+\r
+               EnableUserOpe();\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+\r
+/*----- 新ファイル名入力ダイアログのコールバック ------------------------------\r
+*\r
+*      Parameter\r
+*              HWND hDlg : ウインドウハンドル\r
+*              UINT message : メッセージ番号\r
+*              WPARAM wParam : メッセージの WPARAM 引数\r
+*              LPARAM lParam : メッセージの LPARAM 引数\r
+*\r
+*      Return Value\r
+*              BOOL TRUE/FALSE\r
+*----------------------------------------------------------------------------*/\r
+\r
+// 64ビット対応\r
+//static BOOL CALLBACK RenameDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+static INT_PTR CALLBACK RenameDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+{\r
+       switch (iMessage)\r
+       {\r
+               case WM_INITDIALOG :\r
+                       if(CurWin == WIN_LOCAL)\r
+                               SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN068);\r
+                       else\r
+                               SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN069);\r
+                       SendDlgItemMessage(hDlg, RENAME_NEW, EM_LIMITTEXT, FMAX_PATH, 0);\r
+                       SendDlgItemMessage(hDlg, RENAME_NEW, WM_SETTEXT, 0, (LPARAM)TmpString);\r
+                       SendDlgItemMessage(hDlg, RENAME_TEXT, WM_SETTEXT, 0, (LPARAM)TmpString);\r
+                       return(TRUE);\r
+\r
+               case WM_COMMAND :\r
+                       switch(GET_WM_COMMAND_ID(wParam, lParam))\r
+                       {\r
+                               case IDOK :\r
+                                       SendDlgItemMessage(hDlg, RENAME_NEW, WM_GETTEXT, FMAX_PATH, (LPARAM)TmpString);\r
+                                       EndDialog(hDlg, YES);\r
+                                       break;\r
+\r
+                               case IDCANCEL :\r
+                                       EndDialog(hDlg, NO);\r
+                                       break;\r
+\r
+                               case RENAME_STOP :\r
+                                       EndDialog(hDlg, NO_ALL);\r
+                                       break;\r
+                       }\r
+                       return(TRUE);\r
+       }\r
+       return(FALSE);\r
+}\r
+\r
+\r
+/*----- 新しいディレクトリを作成する ------------------------------------------\r
+*\r
+*      Parameter\r
+*              なし\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void MkdirProc(void)\r
+{\r
+       int Sts;\r
+       int Win;\r
+       char Path[FMAX_PATH+1];\r
+       char *Title;\r
+       int Tmp;\r
+\r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
+       if(GetFocus() == GetLocalHwnd())\r
+       {\r
+               Win = WIN_LOCAL;\r
+               Title = MSGJPN070;\r
+       }\r
+       else\r
+       {\r
+               Win = WIN_REMOTE;\r
+               Title = MSGJPN071;\r
+       }\r
+\r
+       strcpy(Path, "");\r
+       Sts = InputDialogBox(mkdir_dlg, GetMainHwnd(), Title, Path, FMAX_PATH+1, &Tmp, IDH_HELP_TOPIC_0000001);\r
+\r
+       if((Sts == YES) && (strlen(Path) != 0))\r
+       {\r
+               if(Win == WIN_LOCAL)\r
+               {\r
+                       DisableUserOpe();\r
+                       DoLocalMKD(Path);\r
+                       GetLocalDirForWnd();\r
+                       EnableUserOpe();\r
+               }\r
+               else\r
+               {\r
+                       if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
+                       {\r
+                               DisableUserOpe();\r
+                               DoMKD(Path);\r
+                               GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);\r
+                               EnableUserOpe();\r
+                       }\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- ヒストリリストを使ったディレクトリの移動 ------------------------------\r
+*\r
+*      Parameter\r
+*              HWND hWnd : コンボボックスのウインドウハンドル\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void ChangeDirComboProc(HWND hWnd)\r
+{\r
+       char Tmp[FMAX_PATH+1];\r
+       int i;\r
+\r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
+       if((i = SendMessage(hWnd, CB_GETCURSEL, 0, 0)) != CB_ERR)\r
+       {\r
+               SendMessage(hWnd, CB_GETLBTEXT, i, (LPARAM)Tmp);\r
+\r
+               if(hWnd == GetLocalHistHwnd())\r
+               {\r
+                       DisableUserOpe();\r
+                       DoLocalCWD(Tmp);\r
+                       GetLocalDirForWnd();\r
+                       EnableUserOpe();\r
+               }\r
+               else\r
+               {\r
+                       if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
+                       {\r
+                               DisableUserOpe();\r
+                               if(DoCWD(Tmp, YES, NO, YES) < FTP_RETRY)\r
+                                       GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg);\r
+                               EnableUserOpe();\r
+                       }\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- ブックマークを使ったディレクトリの移動 --------------------------------\r
+*\r
+*      Parameter\r
+*              int MarkID : ブックマークのメニューID\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void ChangeDirBmarkProc(int MarkID)\r
+{\r
+       char Local[FMAX_PATH+1];\r
+       char Remote[FMAX_PATH+1];\r
+       int Sts;\r
+\r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
+       Sts = AskBookMarkText(MarkID, Local, Remote, FMAX_PATH+1);\r
+       if((Sts == BMARK_TYPE_LOCAL) || (Sts == BMARK_TYPE_BOTH))\r
+       {\r
+               DisableUserOpe();\r
+               if(DoLocalCWD(Local) == FFFTP_SUCCESS)\r
+                       GetLocalDirForWnd();\r
+               EnableUserOpe();\r
+       }\r
+\r
+       if((Sts == BMARK_TYPE_REMOTE) || (Sts == BMARK_TYPE_BOTH))\r
+       {\r
+               if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
+               {\r
+                       DisableUserOpe();\r
+                       if(DoCWD(Remote, YES, NO, YES) < FTP_RETRY)\r
+                               GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg);\r
+                       EnableUserOpe();\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- ディレクトリ名を入力してディレクトリの移動 ----------------------------\r
+*\r
+*      Parameter\r
+*              int Win : ウインドウ番号 (WIN_xxx)\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void ChangeDirDirectProc(int Win)\r
+{\r
+       int Sts;\r
+       char Path[FMAX_PATH+1];\r
+       char *Title;\r
+       int Tmp;\r
+\r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
+       if(Win == WIN_LOCAL)\r
+               Title = MSGJPN072;\r
+       else\r
+               Title = MSGJPN073;\r
+\r
+       strcpy(Path, "");\r
+       if(Win == WIN_LOCAL)\r
+       // フォルダ選択ダイアログを直接表示\r
+//             Sts = InputDialogBox(chdir_br_dlg, GetMainHwnd(), Title, Path, FMAX_PATH+1, &Tmp, IDH_HELP_TOPIC_0000001);\r
+       {\r
+               if(SelectDir(GetMainHwnd(), Path, FMAX_PATH) == TRUE)\r
+                       Sts = YES;\r
+       }\r
+       else\r
+               Sts = InputDialogBox(chdir_dlg, GetMainHwnd(), Title, Path, FMAX_PATH+1, &Tmp, IDH_HELP_TOPIC_0000001);\r
+\r
+       if((Sts == YES) && (strlen(Path) != 0))\r
+       {\r
+               if(Win == WIN_LOCAL)\r
+               {\r
+                       DisableUserOpe();\r
+                       DoLocalCWD(Path);\r
+                       GetLocalDirForWnd();\r
+                       EnableUserOpe();\r
+               }\r
+               else\r
+               {\r
+                       if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
+                       {\r
+                               DisableUserOpe();\r
+                               if(DoCWD(Path, YES, NO, YES) < FTP_RETRY)\r
+                                       GetRemoteDirForWnd(CACHE_NORMAL, &CancelFlg);\r
+                               EnableUserOpe();\r
+                       }\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- Dropされたファイルによるディレクトリの移動 ----------------------------\r
+*\r
+*      Parameter\r
+*              WPARAM wParam : ドロップされたファイルの情報\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void ChangeDirDropFileProc(WPARAM wParam)\r
+{\r
+       char Path[FMAX_PATH+1];\r
+\r
+       DisableUserOpe();\r
+       MakeDroppedDir(wParam, Path);\r
+       DoLocalCWD(Path);\r
+       GetLocalDirForWnd();\r
+       EnableUserOpe();\r
+       return;\r
+}\r
+\r
+\r
+/*----- ファイルの属性変更 ----------------------------------------------------\r
+*\r
+*      Parameter\r
+*              なし\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void ChmodProc(void)\r
+{\r
+       int ChmodFlg;\r
+       FILELIST *FileListBase;\r
+       FILELIST *Pos;\r
+       char Tmp[5];\r
+       char *Buf;\r
+       char *BufTmp;\r
+       int BufLen;\r
+\r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
+       if(GetFocus() == GetRemoteHwnd())\r
+       {\r
+               if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
+               {\r
+                       DisableUserOpe();\r
+                       FileListBase = NULL;\r
+                       MakeSelectedFileList(WIN_REMOTE, NO, NO, &FileListBase, &CancelFlg);\r
+                       if(FileListBase != NULL)\r
+                       {\r
+                               sprintf(Tmp, "%03X", FileListBase->Attr);\r
+                               if(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(chmod_dlg), GetMainHwnd(), ChmodDialogCallBack, (LPARAM)Tmp) == YES)\r
+                               {\r
+                                       ChmodFlg = NO;\r
+                                       Pos = FileListBase;\r
+                                       while(Pos != NULL)\r
+                                       {\r
+                                               if((Pos->Node == NODE_FILE) || (Pos->Node == NODE_DIR))\r
+                                               {\r
+                                                       DoCHMOD(Pos->File, Tmp);\r
+                                                       ChmodFlg = YES;\r
+                                               }\r
+                                               Pos = Pos->Next;\r
+                                       }\r
+                                       if(ChmodFlg == YES)\r
+                                               GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);\r
+                               }\r
+                       }\r
+                       DeleteFileList(&FileListBase);\r
+                       EnableUserOpe();\r
+               }\r
+       }\r
+       else if(GetFocus() == GetLocalHwnd())\r
+       {\r
+               DisableUserOpe();\r
+               FileListBase = NULL;\r
+               MakeSelectedFileList(WIN_LOCAL, NO, NO, &FileListBase, &CancelFlg);\r
+               if(FileListBase != NULL)\r
+               {\r
+                       if((Buf = malloc(1)) != NULL)\r
+                       {\r
+                               *Buf = NUL;\r
+                               BufLen = 0;\r
+                               Pos = FileListBase;\r
+                               while(Pos != NULL)\r
+                               {\r
+                                       if((BufTmp = realloc(Buf, BufLen + strlen(Pos->File) + 2)) != NULL)\r
+                                       {\r
+                                               Buf = BufTmp;\r
+                                               strcpy(Buf+BufLen, Pos->File);\r
+                                               BufLen += strlen(Pos->File) + 1;\r
+                                       }\r
+                                       Pos = Pos->Next;\r
+                               }\r
+\r
+                               memset(Buf+BufLen, NUL, 1);\r
+                               DispFileProperty(Buf);\r
+                               free(Buf);\r
+                       }\r
+               }\r
+               DeleteFileList(&FileListBase);\r
+               EnableUserOpe();\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- 属性変更ダイアログのコールバック --------------------------------------\r
+*\r
+*      Parameter\r
+*              HWND hDlg : ウインドウハンドル\r
+*              UINT message : メッセージ番号\r
+*              WPARAM wParam : メッセージの WPARAM 引数\r
+*              LPARAM lParam : メッセージの LPARAM 引数\r
+*\r
+*      Return Value\r
+*              BOOL TRUE/FALSE\r
+*----------------------------------------------------------------------------*/\r
+\r
+// 64ビット対応\r
+//BOOL CALLBACK ChmodDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+INT_PTR CALLBACK ChmodDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+{\r
+       char Str[5];\r
+       static char *Buf;\r
+       int Tmp;\r
+\r
+       switch (iMessage)\r
+       {\r
+               case WM_INITDIALOG :\r
+                       Buf = (char *)lParam;\r
+                       SendDlgItemMessage(hDlg, PERM_NOW, EM_LIMITTEXT, 4, 0);\r
+                       SendDlgItemMessage(hDlg, PERM_NOW, WM_SETTEXT, 0, (LPARAM)Buf);\r
+                       SetAttrToDialog(hDlg, xtoi(Buf));\r
+                       return(TRUE);\r
+\r
+               case WM_COMMAND :\r
+                       switch(GET_WM_COMMAND_ID(wParam, lParam))\r
+                       {\r
+                               case IDOK :\r
+                                       SendDlgItemMessage(hDlg, PERM_NOW, WM_GETTEXT, 5, (LPARAM)Buf);\r
+                                       EndDialog(hDlg, YES);\r
+                                       break;\r
+\r
+                               case IDCANCEL :\r
+                                       EndDialog(hDlg, NO);\r
+                                       break;\r
+\r
+                               case PERM_O_READ :\r
+                               case PERM_O_WRITE :\r
+                               case PERM_O_EXEC :\r
+                               case PERM_G_READ :\r
+                               case PERM_G_WRITE :\r
+                               case PERM_G_EXEC :\r
+                               case PERM_A_READ :\r
+                               case PERM_A_WRITE :\r
+                               case PERM_A_EXEC :\r
+                                       Tmp = GetAttrFromDialog(hDlg);\r
+                                       sprintf(Str, "%03X", Tmp);\r
+                                       SendDlgItemMessage(hDlg, PERM_NOW, WM_SETTEXT, 0, (LPARAM)Str);\r
+                                       break;\r
+\r
+                               case IDHELP :\r
+                                       hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000017);\r
+                                       break;\r
+                       }\r
+                       return(TRUE);\r
+       }\r
+       return(FALSE);\r
+}\r
+\r
+\r
+/*----- 属性をダイアログボックスに設定 ----------------------------------------\r
+*\r
+*      Parameter\r
+*              HWND hWnd : ダイアログボックスのウインドウハンドル\r
+*              int Attr : 属性\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+static void SetAttrToDialog(HWND hDlg, int Attr)\r
+{\r
+       if(Attr & 0x400)\r
+               SendDlgItemMessage(hDlg, PERM_O_READ, BM_SETCHECK, 1, 0);\r
+       if(Attr & 0x200)\r
+               SendDlgItemMessage(hDlg, PERM_O_WRITE, BM_SETCHECK, 1, 0);\r
+       if(Attr & 0x100)\r
+               SendDlgItemMessage(hDlg, PERM_O_EXEC, BM_SETCHECK, 1, 0);\r
+\r
+       if(Attr & 0x40)\r
+               SendDlgItemMessage(hDlg, PERM_G_READ, BM_SETCHECK, 1, 0);\r
+       if(Attr & 0x20)\r
+               SendDlgItemMessage(hDlg, PERM_G_WRITE, BM_SETCHECK, 1, 0);\r
+       if(Attr & 0x10)\r
+               SendDlgItemMessage(hDlg, PERM_G_EXEC, BM_SETCHECK, 1, 0);\r
+\r
+       if(Attr & 0x4)\r
+               SendDlgItemMessage(hDlg, PERM_A_READ, BM_SETCHECK, 1, 0);\r
+       if(Attr & 0x2)\r
+               SendDlgItemMessage(hDlg, PERM_A_WRITE, BM_SETCHECK, 1, 0);\r
+       if(Attr & 0x1)\r
+               SendDlgItemMessage(hDlg, PERM_A_EXEC, BM_SETCHECK, 1, 0);\r
+\r
+       return;\r
+}\r
+\r
+\r
+/*----- ダイアログボックスの内容から属性を取得 --------------------------------\r
+*\r
+*      Parameter\r
+*              HWND hWnd : ダイアログボックスのウインドウハンドル\r
+*\r
+*      Return Value\r
+*              int 属性\r
+*----------------------------------------------------------------------------*/\r
+\r
+static int GetAttrFromDialog(HWND hDlg)\r
+{\r
+       int Ret;\r
+\r
+       Ret = 0;\r
+\r
+       if(SendDlgItemMessage(hDlg, PERM_O_READ, BM_GETCHECK, 0, 0) == 1)\r
+               Ret |= 0x400;\r
+       if(SendDlgItemMessage(hDlg, PERM_O_WRITE, BM_GETCHECK, 0, 0) == 1)\r
+               Ret |= 0x200;\r
+       if(SendDlgItemMessage(hDlg, PERM_O_EXEC, BM_GETCHECK, 0, 0) == 1)\r
+               Ret |= 0x100;\r
+\r
+       if(SendDlgItemMessage(hDlg, PERM_G_READ, BM_GETCHECK, 0, 0) == 1)\r
+               Ret |= 0x40;\r
+       if(SendDlgItemMessage(hDlg, PERM_G_WRITE, BM_GETCHECK, 0, 0) == 1)\r
+               Ret |= 0x20;\r
+       if(SendDlgItemMessage(hDlg, PERM_G_EXEC, BM_GETCHECK, 0, 0) == 1)\r
+               Ret |= 0x10;\r
+\r
+       if(SendDlgItemMessage(hDlg, PERM_A_READ, BM_GETCHECK, 0, 0) == 1)\r
+               Ret |= 0x4;\r
+       if(SendDlgItemMessage(hDlg, PERM_A_WRITE, BM_GETCHECK, 0, 0) == 1)\r
+               Ret |= 0x2;\r
+       if(SendDlgItemMessage(hDlg, PERM_A_EXEC, BM_GETCHECK, 0, 0) == 1)\r
+               Ret |= 0x1;\r
+\r
+       return(Ret);\r
+}\r
+\r
+\r
+\r
+\r
+/*----- 任意のコマンドを送る --------------------------------------------------\r
+*\r
+*      Parameter\r
+*              なし\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void SomeCmdProc(void)\r
+{\r
+       char Cmd[81];\r
+       int Tmp;\r
+       FILELIST *FileListBase;\r
+\r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
+       if(GetFocus() == GetRemoteHwnd())\r
+       {\r
+               if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
+               {\r
+                       DisableUserOpe();\r
+                       FileListBase = NULL;\r
+                       MakeSelectedFileList(WIN_REMOTE, NO, NO, &FileListBase, &CancelFlg);\r
+                       memset(Cmd, NUL, 81);\r
+                       if(FileListBase != NULL)\r
+                       {\r
+                               strncpy(Cmd, FileListBase->File, 80);\r
+                       }\r
+                       DeleteFileList(&FileListBase);\r
+\r
+                       if(InputDialogBox(somecmd_dlg, GetMainHwnd(), NULL, Cmd, 81, &Tmp, IDH_HELP_TOPIC_0000023) == YES)\r
+                       {\r
+                               // 同時接続対応\r
+                               //DoQUOTE(Cmd);\r
+                               DoQUOTE(AskCmdCtrlSkt(), Cmd, &CancelFlg);\r
+                       }\r
+                       EnableUserOpe();\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+\r
+\r
+/*----- ファイル総容量の計算を行う --------------------------------------------\r
+*\r
+*      Parameter\r
+*              なし\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void CalcFileSizeProc(void)\r
+{\r
+       FILELIST *ListBase;\r
+       FILELIST *Pos;\r
+       int Win;\r
+       int All;\r
+       int Sts;\r
+\r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
+       if((All = DialogBox(GetFtpInst(), MAKEINTRESOURCE(filesize_notify_dlg), GetMainHwnd(), SizeNotifyDlgWndProc)) != NO_ALL)\r
+       {\r
+               Sts = FFFTP_SUCCESS;\r
+               if(GetFocus() == GetLocalHwnd())\r
+                       Win = WIN_LOCAL;\r
+               else\r
+               {\r
+                       Win = WIN_REMOTE;\r
+                       Sts = CheckClosedAndReconnect();\r
+               }\r
+\r
+               if(Sts == FFFTP_SUCCESS)\r
+               {\r
+                       ListBase = NULL;\r
+                       MakeSelectedFileList(Win, YES, All, &ListBase, &CancelFlg);\r
+\r
+                       FileSize = 0;\r
+                       Pos = ListBase;\r
+                       while(Pos != NULL)\r
+                       {\r
+                               if(Pos->Node != NODE_DIR)\r
+                                       FileSize += Pos->Size;\r
+                               Pos = Pos->Next;\r
+                       }\r
+                       DeleteFileList(&ListBase);\r
+                       DialogBox(GetFtpInst(), MAKEINTRESOURCE(filesize_dlg), GetMainHwnd(), SizeDlgWndProc);\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- ファイル容量検索確認ダイアログのコールバック --------------------------\r
+*\r
+*      Parameter\r
+*              HWND hDlg : ウインドウハンドル\r
+*              UINT message  : メッセージ番号\r
+*              WPARAM wParam : メッセージの WPARAM 引数\r
+*              LPARAM lParam : メッセージの LPARAM 引数\r
+*\r
+*      Return Value\r
+*              メッセージに対応する戻り値\r
+*----------------------------------------------------------------------------*/\r
+\r
+static LRESULT CALLBACK SizeNotifyDlgWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+{\r
+       switch (message)\r
+       {\r
+               case WM_INITDIALOG :\r
+                       if(GetFocus() == GetLocalHwnd())\r
+                               SendDlgItemMessage(hDlg, FSNOTIFY_TITLE, WM_SETTEXT, 0, (LPARAM)MSGJPN074);\r
+                       else\r
+                               SendDlgItemMessage(hDlg, FSNOTIFY_TITLE, WM_SETTEXT, 0, (LPARAM)MSGJPN075);\r
+                       return(TRUE);\r
+\r
+               case WM_COMMAND :\r
+                       switch(GET_WM_COMMAND_ID(wParam, lParam))\r
+                       {\r
+                               case IDOK :\r
+                                       if(SendDlgItemMessage(hDlg, FSNOTIFY_SEL_ONLY, BM_GETCHECK, 0, 0) == 1)\r
+                                               EndDialog(hDlg, NO);\r
+                                       else\r
+                                               EndDialog(hDlg, YES);\r
+                                       break;\r
+\r
+                               case IDCANCEL :\r
+                                       EndDialog(hDlg, NO_ALL);\r
+                                       break;\r
+                       }\r
+                       return(TRUE);\r
+       }\r
+       return(FALSE);\r
+}\r
+\r
+\r
+/*----- ファイル容量検索ダイアログのコールバック ------------------------------\r
+*\r
+*      Parameter\r
+*              HWND hDlg : ウインドウハンドル\r
+*              UINT message  : メッセージ番号\r
+*              WPARAM wParam : メッセージの WPARAM 引数\r
+*              LPARAM lParam : メッセージの LPARAM 引数\r
+*\r
+*      Return Value\r
+*              メッセージに対応する戻り値\r
+*----------------------------------------------------------------------------*/\r
+\r
+static LRESULT CALLBACK SizeDlgWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+{\r
+       char Tmp[FMAX_PATH+1];\r
+\r
+       switch (message)\r
+       {\r
+               case WM_INITDIALOG :\r
+                       if(GetFocus() == GetLocalHwnd())\r
+                               SendDlgItemMessage(hDlg, FSIZE_TITLE, WM_SETTEXT, 0, (LPARAM)MSGJPN076);\r
+                       else\r
+                               SendDlgItemMessage(hDlg, FSIZE_TITLE, WM_SETTEXT, 0, (LPARAM)MSGJPN077);\r
+\r
+                       MakeSizeString(FileSize, Tmp);\r
+                       SendDlgItemMessage(hDlg, FSIZE_SIZE, WM_SETTEXT, 0, (LPARAM)Tmp);\r
+                       return(TRUE);\r
+\r
+               case WM_COMMAND :\r
+                       switch(GET_WM_COMMAND_ID(wParam, lParam))\r
+                       {\r
+                               case IDOK :\r
+                               case IDCANCEL :\r
+                                       EndDialog(hDlg, YES);\r
+                                       break;\r
+\r
+                       }\r
+                       return(TRUE);\r
+       }\r
+       return(FALSE);\r
+}\r
+\r
+\r
+/*----- ディレクトリ移動失敗時のエラーを表示 ----------------------------------\r
+*\r
+*      Parameter\r
+*              HWND hDlg : ウインドウハンドル\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void DispCWDerror(HWND hWnd)\r
+{\r
+       DialogBox(GetFtpInst(), MAKEINTRESOURCE(cwderr_dlg), hWnd, ExeEscDialogProc);\r
+       return;\r
+}\r
+\r
+\r
+/*----- URLをクリップボードにコピー -------------------------------------------\r
+*\r
+*      Parameter\r
+*              なし\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void CopyURLtoClipBoard(void)\r
+{\r
+       FILELIST *FileListBase;\r
+       FILELIST *Pos;\r
+       char *Buf;\r
+       char Path[FMAX_PATH+1];\r
+       char Host[HOST_ADRS_LEN+1];\r
+       char Port[10];\r
+       int Set;\r
+       int Total;\r
+\r
+       if(GetFocus() == GetRemoteHwnd())\r
+       {\r
+               FileListBase = NULL;\r
+               MakeSelectedFileList(WIN_REMOTE, NO, NO, &FileListBase, &CancelFlg);\r
+               if(FileListBase != NULL)\r
+               {\r
+                       strcpy(Host, AskHostAdrs());\r
+                       Total = 0;\r
+                       Buf = NULL;\r
+                       Pos = FileListBase;\r
+                       while(Pos != NULL)\r
+                       {\r
+                               AskRemoteCurDir(Path, FMAX_PATH);\r
+                               SetSlashTail(Path);\r
+                               strcat(Path, Pos->File);\r
+\r
+                               if(AskHostType() == HTYPE_VMS)\r
+                                       ReformToVMSstylePathName(Path);\r
+\r
+                               strcpy(Port, "");\r
+                               if(AskHostPort() != PORT_NOR)\r
+                                       sprintf(Port, ":%d", AskHostPort());\r
+\r
+                               Set = Total;\r
+                               Total += strlen(Path) + strlen(Host) + strlen(Port) + 8;        /* 8は "ftp://\r\n" のぶん */\r
+                               if(AskHostType() == HTYPE_VMS)\r
+                                       Total++;\r
+\r
+                               if((Buf = realloc(Buf, Total+1)) == NULL)\r
+                                       break;\r
+\r
+                               if(AskHostType() != HTYPE_VMS)\r
+                                       sprintf(Buf + Set, "ftp://%s%s%s\r\n", Host, Port, Path);\r
+                               else\r
+                                       sprintf(Buf + Set, "ftp://%s%s/%s\r\n", Host, Port, Path);\r
+\r
+                               Pos = Pos->Next;\r
+                       }\r
+\r
+                       if(Buf != NULL)\r
+                       {\r
+                               CopyStrToClipBoard(Buf);\r
+                               free(Buf);\r
+                       }\r
+               }\r
+               DeleteFileList(&FileListBase);\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- フルパスを使わないファイルアクセスの準備 ------------------------------\r
+*\r
+*      Parameter\r
+*              char *Path : パス名\r
+*              char *CurDir : カレントディレクトリ\r
+*              HWND hWnd : エラーウインドウを表示する際の親ウインドウ\r
+*              int Type : 使用するソケットの種類\r
+*                      0=コマンドソケット, 1=転送ソケット\r
+*\r
+*      Return Value\r
+*              int ステータス(FFFTP_SUCCESS/FFFTP_FAIL)\r
+*\r
+*      Note\r
+*              フルパスを使わない時は、\r
+*                      このモジュール内で CWD を行ない、\r
+*                      Path にファイル名のみ残す。(パス名は消す)\r
+*----------------------------------------------------------------------------*/\r
+\r
+// 同時接続対応\r
+//int ProcForNonFullpath(char *Path, char *CurDir, HWND hWnd, int Type)\r
+int ProcForNonFullpath(SOCKET cSkt, char *Path, char *CurDir, HWND hWnd, int *CancelCheckWork)\r
+{\r
+       int Sts;\r
+       int Cmd;\r
+       char Tmp[FMAX_PATH+1];\r
+\r
+       Sts = FFFTP_SUCCESS;\r
+       if(AskNoFullPathMode() == YES)\r
+       {\r
+               strcpy(Tmp, Path);\r
+               if(AskHostType() == HTYPE_VMS)\r
+               {\r
+                       GetUpperDirEraseTopSlash(Tmp);\r
+                       ReformToVMSstyleDirName(Tmp);\r
+               }\r
+               else if(AskHostType() == HTYPE_STRATUS)\r
+                       GetUpperDirEraseTopSlash(Tmp);\r
+               else\r
+                       GetUpperDir(Tmp);\r
+\r
+               if(strcmp(Tmp, CurDir) != 0)\r
+               {\r
+                       // 同時接続対応\r
+//                     if(Type == 0)\r
+//                             Cmd = CommandProcCmd(NULL, "CWD %s", Tmp);\r
+//                     else\r
+//                             Cmd = CommandProcTrn(NULL, "CWD %s", Tmp);\r
+                       Cmd = CommandProcTrn(cSkt, NULL, CancelCheckWork, "CWD %s", Tmp);\r
+\r
+                       if(Cmd/100 != FTP_COMPLETE)\r
+                       {\r
+                               DispCWDerror(hWnd);\r
+                               Sts = FFFTP_FAIL;\r
+                       }\r
+                       else\r
+                               strcpy(CurDir, Tmp);\r
+               }\r
+               strcpy(Path, GetFileName(Path));\r
+       }\r
+       return(Sts);\r
+}\r
+\r
+\r
+/*----- ディレクトリ名をVAX VMSスタイルに変換する -----------------------------\r
+*\r
+*      Parameter\r
+*              char *Path : パス名\r
+*\r
+*      Return Value\r
+*              なし\r
+*\r
+*      Note\r
+*              ddd:[xxx.yyy]/rrr/ppp  --> ddd:[xxx.yyy.rrr.ppp]\r
+*----------------------------------------------------------------------------*/\r
+\r
+void ReformToVMSstyleDirName(char *Path)\r
+{\r
+       char *Pos;\r
+       char *Btm;\r
+\r
+       if((Btm = strchr(Path, ']')) != NULL)\r
+       {\r
+               Pos = Btm;\r
+               while((Pos = strchr(Pos, '/')) != NULL)\r
+                       *Pos = '.';\r
+\r
+               memmove(Btm, Btm+1, strlen(Btm+1)+1);\r
+               Pos = strchr(Path, NUL);\r
+               if(*(Pos-1) == '.')\r
+               {\r
+                       Pos--;\r
+                       *Pos = NUL;\r
+               }\r
+               strcpy(Pos, "]");\r
+       }\r
+       return;\r
+}\r
+\r
+\r
+/*----- ファイル名をVAX VMSスタイルに変換する ---------------------------------\r
+*\r
+*      Parameter\r
+*              char *Path : パス名\r
+*\r
+*      Return Value\r
+*              なし\r
+*\r
+*      Note\r
+*              ddd:[xxx.yyy]/rrr/ppp  --> ddd:[xxx.yyy.rrr]ppp\r
+*----------------------------------------------------------------------------*/\r
+\r
+void ReformToVMSstylePathName(char *Path)\r
+{\r
+       char Fname[FMAX_PATH+1];\r
+\r
+       strcpy(Fname, GetFileName(Path));\r
+\r
+       GetUpperDirEraseTopSlash(Path);\r
+       ReformToVMSstyleDirName(Path);\r
+\r
+       strcat(Path, Fname);\r
+\r
+       return;\r
+}\r
+\r
+\r
+#if defined(HAVE_OPENVMS)\r
+/*----- VMSの"HOGE.DIR;?"というディレクトリ名から"HOGE"を取り出す ---------------\r
+*\r
+*      Parameter\r
+*              char *DirName : "HOGE.DIR;?"形式のディレクトリ名\r
+*              int Flg       : ";"のチェックをする(TRUE)かしない(FALSE)か\r
+*\r
+*      Return Value\r
+*              なし\r
+*\r
+*      Note\r
+*              DirNameを直接書きかえる\r
+*----------------------------------------------------------------------------*/\r
+\r
+void ReformVMSDirName(char *DirName, int Flg)\r
+{\r
+       char *p;\r
+\r
+       if (Flg == TRUE) {\r
+               /* ';'がない場合はVMS形式じゃなさそうなので何もしない */\r
+               if ((p = strrchr(DirName, ';')) == NULL)\r
+                       return;\r
+       }\r
+\r
+       /* ".DIR"があったらつぶす */\r
+       if ((p = strrchr(DirName, '.'))) {\r
+               if (memcmp(p + 1, "DIR", 3) == 0)\r
+                       *p = '\0';\r
+       }\r
+}\r
+#endif\r
+\r
+\r
+/*----- ファイル名に使えない文字がないかチェックし名前を変更する --------------\r
+*\r
+*      Parameter\r
+*              char *Fname : ファイル名\r
+*\r
+*      Return Value\r
+*              int ステータス\r
+*                      FFFTP_SUCCESS/FFFTP_FAIL=中止する\r
+*\r
+*      Note\r
+*              Fnameを直接書きかえる\r
+*----------------------------------------------------------------------------*/\r
+\r
+static int RenameUnuseableName(char *Fname)\r
+{\r
+       int Tmp;\r
+       int Ret;\r
+\r
+       Ret = FFFTP_SUCCESS;\r
+       while(1)\r
+       {\r
+               if((_mbschr(Fname, ':') != NULL) ||\r
+                  (_mbschr(Fname, '*') != NULL) ||\r
+                  (_mbschr(Fname, '?') != NULL) ||\r
+                  (_mbschr(Fname, '<') != NULL) ||\r
+                  (_mbschr(Fname, '>') != NULL) ||\r
+                  (_mbschr(Fname, '|') != NULL) ||\r
+                  (_mbschr(Fname, '\x22') != NULL) ||\r
+                  (_mbschr(Fname, '\\') != NULL))\r
+               {\r
+                       if(InputDialogBox(forcerename_dlg, GetMainHwnd(), NULL, Fname, FMAX_PATH+1, &Tmp, IDH_HELP_TOPIC_0000001) == NO)\r
+                       {\r
+                               Ret = FFFTP_FAIL;\r
+                               break;\r
+                       }\r
+               }\r
+               else\r
+                       break;\r
+       }\r
+       return(Ret);\r
+}\r
+\r
+\r
+// 自動切断対策\r
+// NOOPコマンドでは効果が無いホストが多いためLISTコマンドを使用\r
+void NoopProc(int Force)\r
+{\r
+       if(Force == YES || (AskConnecting() == YES && AskUserOpeDisabled() == NO))\r
+       {\r
+               if(AskReuseCmdSkt() == NO || (AskShareProh() == YES && AskTransferNow() == NO))\r
+               {\r
+                       if(Force == NO)\r
+                               CancelFlg = NO;\r
+                       DisableUserOpe();\r
+                       DoDirListCmdSkt("", "", 999, &CancelFlg);\r
+                       EnableUserOpe();\r
+               }\r
+       }\r
+}\r
+\r
+// 同時接続対応\r
+void AbortRecoveryProc(void)\r
+{\r
+       if(AskConnecting() == YES && AskUserOpeDisabled() == NO)\r
+       {\r
+               if(AskReuseCmdSkt() == NO || AskShareProh() == YES || AskTransferNow() == NO)\r
+               {\r
+                       CancelFlg = NO;\r
+                       if(AskErrorReconnect() == YES)\r
+                       {\r
+                               DisableUserOpe();\r
+                               ReConnectCmdSkt();\r
+                               GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);\r
+                               EnableUserOpe();\r
+                       }\r
+                       else\r
+                               RemoveReceivedData(AskCmdCtrlSkt());\r
+               }\r
+       }\r
+       return;\r
+}\r
+\r
+void ReconnectProc(void)\r
+{\r
+       if(AskConnecting() == YES && AskUserOpeDisabled() == NO)\r
+       {\r
+               CancelFlg = NO;\r
+               DisableUserOpe();\r
+               ReConnectCmdSkt();\r
+               GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);\r
+               EnableUserOpe();\r
+       }\r
+       return;\r
+}\r
+\r