OSDN Git Service

Fix bugs of confirmation of erasing host settings.
[ffftp/ffftp.git] / ftpproc.c
index 7552c71..8639482 100644 (file)
--- a/ftpproc.c
+++ b/ftpproc.c
@@ -108,6 +108,8 @@ extern SIZE MirrorDlgSize;
 extern int VaxSemicolon;\r
 extern int DebugConsole;\r
 extern int CancelFlg;\r
+// ディレクトリ自動作成\r
+extern int MakeAllDir;\r
 \r
 /*===== ローカルなワーク =====*/\r
 \r
@@ -136,6 +138,46 @@ static double FileSize;            /* ファイル総容量 */
 *              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
+// ディレクトリ自動作成\r
+// ローカル側のパスから必要なフォルダを作成\r
+int MakeDirFromLocalPath(char* LocalFile)\r
+{\r
+       TRANSPACKET Pkt;\r
+       char* pDelimiter;\r
+       char* pNext;\r
+       char* Cat;\r
+       int Len;\r
+       char Tmp[FMAX_PATH+1];\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
+               AskLocalCurDir(Tmp, FMAX_PATH);\r
+               SetYenTail(Tmp);\r
+               if(strncmp(LocalFile, Tmp, 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
@@ -248,7 +290,13 @@ void DownLoadProc(int ChName, int ForceFile, int All)
                                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);\r
                                        AddTransFileList(&Pkt);\r
+                               }\r
                        }\r
                        Pos = Pos->Next;\r
                }\r
@@ -261,8 +309,9 @@ void DownLoadProc(int ChName, int ForceFile, int All)
                }\r
                DeleteFileList(&FileListBase);\r
 \r
-               strcpy(Pkt.Cmd, "GOQUIT");\r
-               AddTransFileList(&Pkt);\r
+               // 同時接続対応\r
+//             strcpy(Pkt.Cmd, "GOQUIT");\r
+//             AddTransFileList(&Pkt);\r
 \r
                GoForwardTransWindow();\r
 //             KeepTransferDialog(NO);\r
@@ -363,8 +412,9 @@ void DirectDownLoadProc(char *Fname)
                        AddTransFileList(&Pkt);\r
                }\r
 \r
-               strcpy(Pkt.Cmd, "GOQUIT");\r
-               AddTransFileList(&Pkt);\r
+               // 同時接続対応\r
+//             strcpy(Pkt.Cmd, "GOQUIT");\r
+//             AddTransFileList(&Pkt);\r
 \r
                GoForwardTransWindow();\r
 //             KeepTransferDialog(NO);\r
@@ -629,8 +679,9 @@ void MirrorDownloadProc(int Notify)
                                        AddTransFileList(&Pkt);\r
                                }\r
 \r
-                               strcpy(Pkt.Cmd, "GOQUIT");\r
-                               AddTransFileList(&Pkt);\r
+                               // 同時接続対応\r
+//                             strcpy(Pkt.Cmd, "GOQUIT");\r
+//                             AddTransFileList(&Pkt);\r
                        }\r
                        else\r
                                EraseTmpTransFileList(&Base);\r
@@ -887,6 +938,72 @@ static INT_PTR CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM
 *              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
+// ディレクトリ自動作成\r
+// リモート側のパスから必要なディレクトリを作成\r
+int MakeDirFromRemotePath(char* RemoteFile, int FirstAdd)\r
+{\r
+       TRANSPACKET Pkt;\r
+       TRANSPACKET Pkt1;\r
+       char* pDelimiter;\r
+       char* pNext;\r
+       char* Cat;\r
+       int Len;\r
+       char Tmp[FMAX_PATH+1];\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
+               AskRemoteCurDir(Tmp, FMAX_PATH);\r
+               SetSlashTail(Tmp);\r
+               if(strncmp(RemoteFile, Tmp, 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
@@ -958,6 +1075,16 @@ void UpLoadListProc(int ChName, int All)
                                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
@@ -1031,6 +1158,12 @@ void UpLoadListProc(int ChName, int All)
                                        break;\r
                                else if(Pkt.Mode != EXIST_IGNORE)\r
                                {\r
+                                       // ディレクトリ自動作成\r
+                                       if(MakeAllDir == YES)\r
+                                       {\r
+                                               if(MakeDirFromRemotePath(Pkt.RemoteFile, FirstAdd) == YES)\r
+                                                       FirstAdd = NO;\r
+                                       }\r
                                        if((FirstAdd == YES) && (AskNoFullPathMode() == YES))\r
                                        {\r
                                                strcpy(Pkt1.Cmd, "SETCUR");\r
@@ -1056,8 +1189,9 @@ void UpLoadListProc(int ChName, int All)
 \r
                DeleteFileList(&FileListBase);\r
 \r
-               strcpy(Pkt.Cmd, "GOQUIT");\r
-               AddTransFileList(&Pkt);\r
+               // 同時接続対応\r
+//             strcpy(Pkt.Cmd, "GOQUIT");\r
+//             AddTransFileList(&Pkt);\r
 \r
                GoForwardTransWindow();\r
 \r
@@ -1198,6 +1332,12 @@ void UpLoadDragProc(WPARAM wParam)
                                        break;\r
                                else if(Pkt.Mode != EXIST_IGNORE)\r
                                {\r
+                                       // ディレクトリ自動作成\r
+                                       if(MakeAllDir == YES)\r
+                                       {\r
+                                               if(MakeDirFromRemotePath(Pkt.RemoteFile, FirstAdd) == YES)\r
+                                                       FirstAdd = NO;\r
+                                       }\r
                                        if((FirstAdd == YES) && (AskNoFullPathMode() == YES))\r
                                        {\r
                                                strcpy(Pkt1.Cmd, "SETCUR");\r
@@ -1223,8 +1363,9 @@ void UpLoadDragProc(WPARAM wParam)
 \r
                DeleteFileList(&FileListBase);\r
 \r
-               strcpy(Pkt.Cmd, "GOQUIT");\r
-               AddTransFileList(&Pkt);\r
+               // 同時接続対応\r
+//             strcpy(Pkt.Cmd, "GOQUIT");\r
+//             AddTransFileList(&Pkt);\r
 \r
                GoForwardTransWindow();\r
 \r
@@ -1494,8 +1635,9 @@ void MirrorUploadProc(int Notify)
                                        AddTransFileList(&Pkt);\r
                                }\r
 \r
-                               strcpy(Pkt.Cmd, "GOQUIT");\r
-                               AddTransFileList(&Pkt);\r
+                               // 同時接続対応\r
+//                             strcpy(Pkt.Cmd, "GOQUIT");\r
+//                             AddTransFileList(&Pkt);\r
                        }\r
                        else\r
                                EraseTmpTransFileList(&Base);\r