OSDN Git Service

Add support for linux-ftpd (untested).
[ffftp/ffftp.git] / ftpproc.c
index c71194a..3e76a49 100644 (file)
--- a/ftpproc.c
+++ b/ftpproc.c
@@ -28,6 +28,8 @@
 /============================================================================*/\r
 \r
 #define  STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 /*===== プロトタイプ =====*/\r
 \r
 static int CheckRemoteFile(TRANSPACKET *Pkt, FILELIST *ListList);\r
-static BOOL CALLBACK UpExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\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
-static BOOL CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\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
-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
+// 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
-static BOOL CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\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
 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
-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
+// 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
@@ -122,6 +136,9 @@ void DownLoadProc(int ChName, int ForceFile, int All)
        FILELIST *Pos;\r
        TRANSPACKET Pkt;\r
 \r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
        if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
        {\r
                DisableUserOpe();\r
@@ -250,6 +267,9 @@ void DirectDownLoadProc(char *Fname)
 {\r
        TRANSPACKET Pkt;\r
 \r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
        if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
        {\r
                DisableUserOpe();\r
@@ -386,6 +406,9 @@ void MirrorDownloadProc(int Notify)
        int Level;\r
        int Mode;\r
 \r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
        if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
        {\r
                DisableUserOpe();\r
@@ -777,7 +800,9 @@ static int CheckLocalFile(TRANSPACKET *Pkt)
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-static BOOL CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\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
        static const RADIOBUTTON DownExistButton[] = {\r
@@ -854,6 +879,9 @@ void UpLoadListProc(int ChName, int All)
        char Tmp[FMAX_PATH+1];\r
        int FirstAdd;\r
 \r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
        if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
        {\r
                DisableUserOpe();\r
@@ -1019,6 +1047,9 @@ void UpLoadDragProc(WPARAM wParam)
        int FirstAdd;\r
        char Cur[FMAX_PATH+1];\r
 \r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
        if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
        {\r
                DisableUserOpe();\r
@@ -1175,6 +1206,9 @@ void MirrorUploadProc(int Notify)
        FILETIME TmpFtimeL;\r
        FILETIME TmpFtimeR;\r
 \r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
        if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
        {\r
                DisableUserOpe();\r
@@ -1469,7 +1503,9 @@ static void MirrorDeleteAllDir(FILELIST *Remote, TRANSPACKET *Pkt, TRANSPACKET *
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-static BOOL CALLBACK MirrorNotifyCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\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
@@ -1518,7 +1554,9 @@ static BOOL CALLBACK MirrorNotifyCallBack(HWND hDlg, UINT iMessage, WPARAM wPara
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-static BOOL CALLBACK MirrorDispListCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\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
@@ -1824,7 +1862,9 @@ static int CheckRemoteFile(TRANSPACKET *Pkt, FILELIST *ListList)
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-static BOOL CALLBACK UpExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\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
        static const RADIOBUTTON UpExistButton[] = {\r
@@ -1890,7 +1930,9 @@ static BOOL CALLBACK UpExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wPar
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-static BOOL CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\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
@@ -1942,6 +1984,11 @@ void DeleteProc(void)
        char CurDir[FMAX_PATH+1];\r
        char Tmp[FMAX_PATH+1];\r
 \r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
+       // デッドロック対策\r
+       DisableUserOpe();\r
        Sts = YES;\r
        AskRemoteCurDir(CurDir, FMAX_PATH);\r
        FileListBase = NULL;\r
@@ -1961,7 +2008,8 @@ void DeleteProc(void)
 \r
        if(Sts == YES)\r
        {\r
-               DisableUserOpe();\r
+               // デッドロック対策\r
+//             DisableUserOpe();\r
 \r
                DelFlg = NO;\r
                Sts = NO;\r
@@ -1997,8 +2045,11 @@ void DeleteProc(void)
                                GetRemoteDirForWnd(CACHE_REFRESH, &CancelFlg);\r
                }\r
 \r
-               EnableUserOpe();\r
+               // デッドロック対策\r
+//             EnableUserOpe();\r
        }\r
+       // デッドロック対策\r
+       EnableUserOpe();\r
        return;\r
 }\r
 \r
@@ -2071,7 +2122,9 @@ static void DelNotifyAndDo(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDi
        {\r
                sprintf(TmpString, "%s", Path);\r
 \r
-               if(AskHostType() == HTYPE_VMS)\r
+               // ローカルのファイルのパスの最後の'\\'が消えるバグ修正\r
+//             if(AskHostType() == HTYPE_VMS)\r
+               if(Win == WIN_REMOTE && AskHostType() == HTYPE_VMS)\r
                        ReformToVMSstylePathName(TmpString);\r
 \r
                CurWin = Win;\r
@@ -2091,7 +2144,9 @@ static void DelNotifyAndDo(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDi
                else\r
                {\r
                        /* フルパスを使わない時のための処理 */\r
-                       if(ProcForNonFullpath(Path, CurDir, GetMainHwnd(), 0) == FFFTP_FAIL)\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
@@ -2120,7 +2175,9 @@ static void DelNotifyAndDo(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDi
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-static BOOL CALLBACK DeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\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
@@ -2175,6 +2232,9 @@ void RenameProc(void)
        int RenFlg;\r
        int Sts;\r
 \r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
        Sts = FFFTP_SUCCESS;\r
        if(GetFocus() == GetLocalHwnd())\r
                Win = WIN_LOCAL;\r
@@ -2250,6 +2310,9 @@ void MoveRemoteFileProc(int drop_index)
        int RenFlg;\r
        int Sts;\r
 \r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
        if(MoveMode == MOVE_DISABLE)\r
        {\r
                return;\r
@@ -2366,7 +2429,9 @@ void MoveRemoteFileProc(int drop_index)
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-static BOOL CALLBACK RenameDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\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
@@ -2419,6 +2484,9 @@ void MkdirProc(void)
        char *Title;\r
        int Tmp;\r
 \r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
        if(GetFocus() == GetLocalHwnd())\r
        {\r
                Win = WIN_LOCAL;\r
@@ -2471,6 +2539,9 @@ void ChangeDirComboProc(HWND hWnd)
        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
@@ -2512,6 +2583,9 @@ void ChangeDirBmarkProc(int MarkID)
        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
@@ -2551,6 +2625,9 @@ void ChangeDirDirectProc(int Win)
        char *Title;\r
        int Tmp;\r
 \r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
        if(Win == WIN_LOCAL)\r
                Title = MSGJPN072;\r
        else\r
@@ -2627,6 +2704,9 @@ void ChmodProc(void)
        char *BufTmp;\r
        int BufLen;\r
 \r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
        if(GetFocus() == GetRemoteHwnd())\r
        {\r
                if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
@@ -2705,7 +2785,9 @@ void ChmodProc(void)
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-BOOL CALLBACK ChmodDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\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
@@ -2850,6 +2932,9 @@ void SomeCmdProc(void)
        int Tmp;\r
        FILELIST *FileListBase;\r
 \r
+       // 同時接続対応\r
+       CancelFlg = NO;\r
+\r
        if(GetFocus() == GetRemoteHwnd())\r
        {\r
                if(CheckClosedAndReconnect() == FFFTP_SUCCESS)\r
@@ -2894,6 +2979,9 @@ void CalcFileSizeProc(void)
        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
@@ -3117,7 +3205,9 @@ void CopyURLtoClipBoard(void)
 *                      Path にファイル名のみ残す。(パス名は消す)\r
 *----------------------------------------------------------------------------*/\r
 \r
-int ProcForNonFullpath(char *Path, char *CurDir, HWND hWnd, int Type)\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
@@ -3139,10 +3229,12 @@ int ProcForNonFullpath(char *Path, char *CurDir, HWND hWnd, int Type)
 \r
                if(strcmp(Tmp, CurDir) != 0)\r
                {\r
-                       if(Type == 0)\r
-                               Cmd = CommandProcCmd(NULL, "CWD %s", Tmp);\r
-                       else\r
-                               Cmd = CommandProcTrn(NULL, "CWD %s", Tmp);\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
@@ -3297,3 +3389,20 @@ static int RenameUnuseableName(char *Fname)
 }\r
 \r
 \r
+// 自動切断対策\r
+// NOOPコマンドでは効果が無いホストが多いためLISTコマンドを使用\r
+void NoopProc(void)\r
+{\r
+       int CancelCheckWork;\r
+       CancelCheckWork = NO;\r
+       if(AskConnecting() == YES && AskUserOpeDisabled() == NO)\r
+       {\r
+               if(AskReuseCmdSkt() == NO || AskShareProh() == YES)\r
+               {\r
+                       DisableUserOpe();\r
+                       DoDirListCmdSkt("", "", 999, &CancelCheckWork);\r
+                       EnableUserOpe();\r
+               }\r
+       }\r
+}\r
+\r