OSDN Git Service

Add feature to export host settings as FileZilla XML format.
authors_kawamoto <s_kawamoto@users.sourceforge.jp>
Sun, 27 Apr 2014 02:49:11 +0000 (11:49 +0900)
committers_kawamoto <s_kawamoto@users.sourceforge.jp>
Sun, 27 Apr 2014 02:49:11 +0000 (11:49 +0900)
FFFTP_Eng_Release/FFFTP.exe
Release/FFFTP.exe
Resource/FFFTP.rc
Resource/resource.h
Resource_eng/FFFTP-eng.rc
Resource_eng/resource.h
common.h
main.c
mesg-eng.h
mesg-jpn.h
registry.c

index 439e8bc..adc45b6 100644 (file)
Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
index 4f881fb..3363e4d 100644 (file)
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
index d699260..d80d422 100644 (file)
@@ -95,6 +95,7 @@ BEGIN
             MENUITEM "\90Ý\92è\82ð\83t\83@\83C\83\8b\82É\95Û\91¶(&S)...",           MENU_REGSAVE\r
             MENUITEM "\90Ý\92è\82ð\83t\83@\83C\83\8b\82©\82ç\95\9c\8c³(&L)...",          MENU_REGLOAD\r
             MENUITEM "\83}\83X\83^\81[\83p\83X\83\8f\81[\83h\82Ì\95Ï\8dX(&M)...",         MENU_CHANGEPASSWD\r
+            MENUITEM "FileZilla XML\82É\90Ý\92è\82ð\83G\83N\83X\83|\81[\83g...",  MENU_EXPORT_FILEZILLA_XML\r
             MENUITEM SEPARATOR\r
             MENUITEM "\91S\90Ý\92è\82Ì\8fÁ\8b\8e...",                   MENU_REGINIT\r
         END\r
index f10d9d1..47f1bc1 100644 (file)
 #define MENU_OPEN                       40177\r
 #define MENU_FW_FTP_FILTER              40178\r
 #define MENU_REMOTE_MOVE_UPDIR          40179\r
+#define MENU_EXPORT_FILEZILLA_XML       40180\r
 #define FSNOTIFY_TITLE                  65535\r
 #define HOST_SIZEGRIP                   65535\r
 \r
 #ifdef APSTUDIO_INVOKED\r
 #ifndef APSTUDIO_READONLY_SYMBOLS\r
 #define _APS_NEXT_RESOURCE_VALUE        197\r
-#define _APS_NEXT_COMMAND_VALUE         40180\r
+#define _APS_NEXT_COMMAND_VALUE         40181\r
 #define _APS_NEXT_CONTROL_VALUE         1221\r
 #define _APS_NEXT_SYMED_VALUE           101\r
 #endif\r
index a04f22a..f23bdaf 100644 (file)
@@ -95,6 +95,7 @@ BEGIN
             MENUITEM "&Save Settings to File...",   MENU_REGSAVE\r
             MENUITEM "&Load Settings from File...", MENU_REGLOAD\r
             MENUITEM "Change &Master password...",  MENU_CHANGEPASSWD\r
+            MENUITEM "Export Settings as FileZilla XML", MENU_EXPORT_FILEZILLA_XML\r
             MENUITEM SEPARATOR\r
             MENUITEM "Clear All Settings...",       MENU_REGINIT\r
         END\r
index 802d099..e549679 100644 (file)
 #define MENU_OPEN                       40177\r
 #define MENU_FW_FTP_FILTER              40178\r
 #define MENU_REMOTE_MOVE_UPDIR          40179\r
+#define MENU_EXPORT_FILEZILLA_XML       40180\r
 #define FSNOTIFY_TITLE                  65535\r
 #define HOST_SIZEGRIP                   65535\r
 \r
 #ifdef APSTUDIO_INVOKED\r
 #ifndef APSTUDIO_READONLY_SYMBOLS\r
 #define _APS_NEXT_RESOURCE_VALUE        197\r
-#define _APS_NEXT_COMMAND_VALUE         40180\r
+#define _APS_NEXT_COMMAND_VALUE         40181\r
 #define _APS_NEXT_CONTROL_VALUE         1221\r
 #define _APS_NEXT_SYMED_VALUE           101\r
 #endif\r
index 71b557d..167d7be 100644 (file)
--- a/common.h
+++ b/common.h
@@ -1795,7 +1795,7 @@ char *JreGetStrMatchInfo(char *Str, UINT nStart);
 \r
 int CheckFname(char *str, char *regexp);\r
 \r
-/*===== registory.c =====*/\r
+/*===== registry.c =====*/\r
 \r
 void SaveRegistry(void);\r
 int LoadRegistry(void);\r
@@ -1815,6 +1815,8 @@ int IsRegAvailable();
 int IsIniAvailable();\r
 // バージョン確認\r
 int ReadSettingsVersion();\r
+// FileZilla XML形式エクスポート対応\r
+void SaveSettingsToFileZillaXml();\r
 \r
 /*===== lvtips.c =====*/\r
 \r
diff --git a/main.c b/main.c
index c971991..d74f0a5 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1682,6 +1682,11 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        MoveRemoteFileProc(-1);\r
                                        break;\r
 \r
+                               // FileZilla XML形式エクスポート対応\r
+                               case MENU_EXPORT_FILEZILLA_XML :\r
+                                       SaveSettingsToFileZillaXml();\r
+                                       break;\r
+\r
                                default :\r
                                        if((LOWORD(wParam) >= MENU_BMARK_TOP) &&\r
                                           (LOWORD(wParam) < MENU_BMARK_TOP+100))\r
index f60a02b..a3cc46f 100644 (file)
 #define MSGJPN354              _Tu8("Encrypted: FTPIS", "Encrypted: FTPIS")\r
 #define MSGJPN355              _Tu8("Encrypted: SFTP", "Encrypted: SFTP")\r
 #define MSGJPN356              _Tu8("Move to &parent folder...", "Move to &parent folder...")\r
+#define MSGJPN357              _Tu8("XML file\0*.xml\0All file\0*\0", "XML file\0*.xml\0All file\0*\0")\r
+#define MSGJPN358              _Tu8("Failed to export the settings.\nPlease change saving path or format.", "Failed to export the settings.\nPlease change saving path or format.")\r
 #if defined(HAVE_TANDEM)\r
 #define MSGJPN2000             _Tu8("NonStop Server", "NonStop Server")\r
 #define MSGJPN2001             _Tu8("OSS<->GUARDIAN Switch(&O)", "OSS<->GUARDIAN Switch(&O)")\r
index abc41ec..7ca27a2 100644 (file)
 #define MSGJPN354              _Tu8("暗号化されています: FTPIS", "\xE6\x9A\x97\xE5\x8F\xB7\xE5\x8C\x96\xE3\x81\x95\xE3\x82\x8C\xE3\x81\xA6\xE3\x81\x84\xE3\x81\xBE\xE3\x81\x99: FTPIS")\r
 #define MSGJPN355              _Tu8("暗号化されています: SFTP", "\xE6\x9A\x97\xE5\x8F\xB7\xE5\x8C\x96\xE3\x81\x95\xE3\x82\x8C\xE3\x81\xA6\xE3\x81\x84\xE3\x81\xBE\xE3\x81\x99: SFTP")\r
 #define MSGJPN356              _Tu8("一つ上のフォルダへ移動(&P)...", "\xE4\xB8\x80\xE3\x81\xA4\xE4\xB8\x8A\xE3\x81\xAE\xE3\x83\x95\xE3\x82\xA9\xE3\x83\xAB\xE3\x83\x80\xE3\x81\xB8\xE7\xA7\xBB\xE5\x8B\x95(&P)...")\r
+#define MSGJPN357              _Tu8("XMLファイル\0*.xml\0全てのファイル\0*\0", "XML\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB\0*.xml\0\xE5\x85\xA8\xE3\x81\xA6\xE3\x81\xAE\xE3\x83\x95\xE3\x82\xA1\xE3\x82\xA4\xE3\x83\xAB\0*\0")\r
+#define MSGJPN358              _Tu8("設定のエクスポートに失敗しました.\n保存する場所や形式を変更してください.", "\xE8\xA8\xAD\xE5\xAE\x9A\xE3\x81\xAE\xE3\x82\xA8\xE3\x82\xAF\xE3\x82\xB9\xE3\x83\x9D\xE3\x83\xBC\xE3\x83\x88\xE3\x81\xAB\xE5\xA4\xB1\xE6\x95\x97\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x97\xE3\x81\x9F.\n\xE4\xBF\x9D\xE5\xAD\x98\xE3\x81\x99\xE3\x82\x8B\xE5\xA0\xB4\xE6\x89\x80\xE3\x82\x84\xE5\xBD\xA2\xE5\xBC\x8F\xE3\x82\x92\xE5\xA4\x89\xE6\x9B\xB4\xE3\x81\x97\xE3\x81\xA6\xE3\x81\x8F\xE3\x81\xA0\xE3\x81\x95\xE3\x81\x84.")\r
 #if defined(HAVE_TANDEM)\r
 #define MSGJPN2000             _Tu8("NonStop Server", "NonStop Server")\r
 #define MSGJPN2001             _Tu8("OSS<->GUARDIAN 切り替え(&O)", "OSS<->GUARDIAN \xE5\x88\x87\xE3\x82\x8A\xE6\x9B\xBF\xE3\x81\x88(&O)")\r
index 8ae5511..ee3ef2d 100644 (file)
@@ -3346,3 +3346,183 @@ int ReadSettingsVersion()
        return Version;\r
 }\r
 \r
+// FileZilla XML形式エクスポート対応\r
+void SaveSettingsToFileZillaXml()\r
+{\r
+       char Fname[FMAX_PATH+1];\r
+       FILE* f;\r
+       TIME_ZONE_INFORMATION tzi;\r
+       int Level;\r
+       int i;\r
+       HOSTDATA Host;\r
+       char Tmp[FMAX_PATH+1];\r
+       char* p1;\r
+       char* p2;\r
+       strcpy(Fname, "FileZilla.xml");\r
+       if(SelectFile(GetMainHwnd(), Fname, MSGJPN286, MSGJPN357, "xml", OFN_EXTENSIONDIFFERENT | OFN_OVERWRITEPROMPT, 1) == TRUE)\r
+       {\r
+               if((f = fopen(Fname, "wt")) != NULL)\r
+               {\r
+                       fputs("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n", f);\r
+                       fputs("<FileZilla3>\n", f);\r
+                       fputs("<Servers>\n", f);\r
+                       GetTimeZoneInformation(&tzi);\r
+                       Level = 0;\r
+                       i = 0;\r
+                       while(CopyHostFromList(i, &Host) == FFFTP_SUCCESS)\r
+                       {\r
+                               while((Host.Level & SET_LEVEL_MASK) < Level)\r
+                               {\r
+                                       fputs("</Folder>\n", f);\r
+                                       Level--;\r
+                               }\r
+                               if(Host.Level & SET_LEVEL_GROUP)\r
+                               {\r
+                                       fputs("<Folder expanded=\"1\">\n", f);\r
+                                       fprintf(f, "%s&#x0A;\n", Host.HostName);\r
+                                       Level++;\r
+                               }\r
+                               else\r
+                               {\r
+                                       fputs("<Server>\n", f);\r
+                                       fprintf(f, "<Host>%s</Host>\n", Host.HostAdrs);\r
+                                       fprintf(f, "<Port>%d</Port>\n", Host.Port);\r
+                                       if(Host.UseNoEncryption == YES)\r
+                                               fprintf(f, "<Protocol>%s</Protocol>\n", "0");\r
+                                       else if(Host.UseFTPES == YES)\r
+                                               fprintf(f, "<Protocol>%s</Protocol>\n", "4");\r
+                                       else if(Host.UseFTPIS == YES)\r
+                                               fprintf(f, "<Protocol>%s</Protocol>\n", "3");\r
+                                       else\r
+                                               fprintf(f, "<Protocol>%s</Protocol>\n", "0");\r
+                                       fprintf(f, "<Type>%s</Type>\n", "0");\r
+                                       fprintf(f, "<User>%s</User>\n", Host.UserName);\r
+                                       fprintf(f, "<Pass>%s</Pass>\n", Host.PassWord);\r
+                                       fprintf(f, "<Account>%s</Account>\n", Host.Account);\r
+                                       if(Host.Anonymous == YES || strlen(Host.UserName) == 0)\r
+                                               fprintf(f, "<Logontype>%s</Logontype>\n", "0");\r
+                                       else\r
+                                               fprintf(f, "<Logontype>%s</Logontype>\n", "1");\r
+                                       fprintf(f, "<TimezoneOffset>%d</TimezoneOffset>\n", tzi.Bias + Host.TimeZone * 60);\r
+                                       if(Host.Pasv == YES)\r
+                                               fprintf(f, "<PasvMode>%s</PasvMode>\n", "MODE_PASSIVE");\r
+                                       else\r
+                                               fprintf(f, "<PasvMode>%s</PasvMode>\n", "MODE_ACTIVE");\r
+                                       fprintf(f, "<MaximumMultipleConnections>%d</MaximumMultipleConnections>\n", Host.MaxThreadCount);\r
+                                       switch(Host.NameKanjiCode)\r
+                                       {\r
+                                       case KANJI_SJIS:\r
+                                               fprintf(f, "<EncodingType>%s</EncodingType>\n", "Custom");\r
+                                               fprintf(f, "<CustomEncoding>%s</CustomEncoding>\n", "Shift_JIS");\r
+                                               break;\r
+                                       case KANJI_JIS:\r
+                                               // 非対応\r
+                                               fprintf(f, "<EncodingType>%s</EncodingType>\n", "Auto");\r
+                                               break;\r
+                                       case KANJI_EUC:\r
+                                               fprintf(f, "<EncodingType>%s</EncodingType>\n", "Custom");\r
+                                               fprintf(f, "<CustomEncoding>%s</CustomEncoding>\n", "EUC-JP");\r
+                                               break;\r
+                                       case KANJI_SMB_HEX:\r
+                                               // 非対応\r
+                                               fprintf(f, "<EncodingType>%s</EncodingType>\n", "Auto");\r
+                                               break;\r
+                                       case KANJI_SMB_CAP:\r
+                                               // 非対応\r
+                                               fprintf(f, "<EncodingType>%s</EncodingType>\n", "Auto");\r
+                                               break;\r
+                                       case KANJI_UTF8N:\r
+                                               fprintf(f, "<EncodingType>%s</EncodingType>\n", "UTF-8");\r
+                                               break;\r
+                                       case KANJI_UTF8HFSX:\r
+                                               // 非対応\r
+                                               fprintf(f, "<EncodingType>%s</EncodingType>\n", "Auto");\r
+                                               break;\r
+                                       default:\r
+                                               fprintf(f, "<EncodingType>%s</EncodingType>\n", "Auto");\r
+                                               break;\r
+                                       }\r
+                                       if(Host.FireWall == YES)\r
+                                               fprintf(f, "<BypassProxy>%s</BypassProxy>\n", "0");\r
+                                       else\r
+                                               fprintf(f, "<BypassProxy>%s</BypassProxy>\n", "1");\r
+                                       fprintf(f, "<Name>%s</Name>\n", Host.HostName);\r
+                                       fprintf(f, "<LocalDir>%s</LocalDir>\n", Host.LocalInitDir);\r
+                                       if(strchr(Host.RemoteInitDir, '\\') != NULL)\r
+                                       {\r
+                                               fputs("<RemoteDir>", f);\r
+                                               fputs("8 0", f);\r
+                                               strcpy(Tmp, Host.RemoteInitDir);\r
+                                               p1 = Tmp;\r
+                                               while(*p1 != '\0')\r
+                                               {\r
+                                                       while(*p1 == '\\')\r
+                                                       {\r
+                                                               p1++;\r
+                                                       }\r
+                                                       if((p2 = strchr(p1, '\\')) != NULL)\r
+                                                       {\r
+                                                               *p2 = '\0';\r
+                                                               p2++;\r
+                                                       }\r
+                                                       else\r
+                                                               p2 = strchr(p1, '\0');\r
+                                                       if(*p1 != '\0')\r
+                                                               fprintf(f, " %d %s", _mbslen(p1), p1);\r
+                                                       p1 = p2;\r
+                                               }\r
+                                               fputs("</RemoteDir>\n", f);\r
+                                       }\r
+                                       else if(strchr(Host.RemoteInitDir, '/') != NULL)\r
+                                       {\r
+                                               fputs("<RemoteDir>", f);\r
+                                               fputs("1 0", f);\r
+                                               strcpy(Tmp, Host.RemoteInitDir);\r
+                                               p1 = Tmp;\r
+                                               while(*p1 != '\0')\r
+                                               {\r
+                                                       while(*p1 == '/')\r
+                                                       {\r
+                                                               p1++;\r
+                                                       }\r
+                                                       if((p2 = strchr(p1, '/')) != NULL)\r
+                                                       {\r
+                                                               *p2 = '\0';\r
+                                                               p2++;\r
+                                                       }\r
+                                                       else\r
+                                                               p2 = strchr(p1, '\0');\r
+                                                       if(*p1 != '\0')\r
+                                                               fprintf(f, " %d %s", _mbslen(p1), p1);\r
+                                                       p1 = p2;\r
+                                               }\r
+                                               fputs("</RemoteDir>\n", f);\r
+                                       }\r
+                                       else\r
+                                               fprintf(f, "<RemoteDir>%s</RemoteDir>\n", Host.RemoteInitDir);\r
+                                       if(Host.SyncMove == YES)\r
+                                               fprintf(f, "<SyncBrowsing>%s</SyncBrowsing>\n", "1");\r
+                                       else\r
+                                               fprintf(f, "<SyncBrowsing>%s</SyncBrowsing>\n", "0");\r
+                                       fprintf(f, "%s&#x0A;\n", Host.HostName);\r
+                                       fputs("</Server>\n", f);\r
+                               }\r
+                               i++;\r
+                       }\r
+                       while(Level > 0)\r
+                       {\r
+                               fputs("</Folder>\n", f);\r
+                               Level--;\r
+                       }\r
+                       fputs("</Servers>\n", f);\r
+                       // TODO: 環境設定\r
+//                     fputs("<Settings>\n", f);\r
+//                     fputs("</Settings>\n", f);\r
+                       fputs("</FileZilla3>\n", f);\r
+                       fclose(f);\r
+               }\r
+               else\r
+                       MessageBox(NULL, MSGJPN358, "FFFTP", MB_OK);\r
+       }\r
+}\r
+\r