OSDN Git Service

Add support for high DPI displays.
[ffftp/ffftp.git] / main.c
diff --git a/main.c b/main.c
index 7eaae2b..470d1d7 100644 (file)
--- a/main.c
+++ b/main.c
@@ -43,6 +43,8 @@
 #include <stdarg.h>\r
 // IPv6対応\r
 //#include <winsock.h>\r
+// タスクバー進捗表示\r
+#include <shobjidl.h>\r
 \r
 #include "common.h"\r
 #include "resource.h"\r
@@ -145,6 +147,10 @@ static char PortableFilePath[FMAX_PATH+1];
 static int PortableVersion;\r
 // ローカル側自動更新\r
 HANDLE ChangeNotification = INVALID_HANDLE_VALUE;\r
+// タスクバー進捗表示\r
+static ITaskbarList3* pTaskbarList3;\r
+// 高DPI対応\r
+int ToolWinHeight;\r
 \r
 \r
 /*===== グローバルなワーク =====*/\r
@@ -209,7 +215,7 @@ int FwallPort = PORT_NOR;
 int FwallType = 1;\r
 int FwallDefault = NO;\r
 int FwallSecurity = SECURITY_AUTO;\r
-int FwallResolv = NO;\r
+int FwallResolve = NO;\r
 int FwallLower = NO;\r
 int FwallDelimiter = '@';\r
 // ルータ対策\r
@@ -265,6 +271,8 @@ int EncryptAllSettings = NO;
 int AutoRefreshFileList = YES;\r
 // 古い処理内容を消去\r
 int RemoveOldLog = NO;\r
+// バージョン確認\r
+int ReadOnlySettings = NO;\r
 \r
 \r
 \r
@@ -371,6 +379,11 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
        // UPnP対応\r
        CoInitialize(NULL);\r
        LoadUPnP();\r
+       // タスクバー進捗表示\r
+       LoadTaskbarList3();\r
+\r
+       // UTF-8対応\r
+       LoadUnicodeNormalizationDll();\r
 \r
        // FTPS対応\r
 #ifdef USE_OPENSSL\r
@@ -417,6 +430,8 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
 #endif\r
        // SFTP対応\r
        FreePuTTY();\r
+       // タスクバー進捗表示\r
+       FreeTaskbarList3();\r
        // UPnP対応\r
        FreeUPnP();\r
        CoUninitialize();\r
@@ -448,6 +463,8 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
        int masterpass;\r
        // ポータブル版判定\r
        int ImportPortable;\r
+       // 高DPI対応\r
+       int i;\r
 \r
        sts = FFFTP_FAIL;\r
 \r
@@ -472,6 +489,16 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                _mkdir(TmpPath);\r
                SetYenTail(TmpPath);\r
 \r
+               // 高DPI対応\r
+               WinWidth = CalcPixelX(WinWidth);\r
+               WinHeight = CalcPixelY(WinHeight);\r
+               LocalWidth = CalcPixelX(LocalWidth);\r
+               TaskHeight = CalcPixelY(TaskHeight);\r
+               for(i = 0; i < sizeof(LocalTabWidth) / sizeof(int); i++)\r
+                       LocalTabWidth[i] = CalcPixelX(LocalTabWidth[i]);\r
+               for(i = 0; i < sizeof(RemoteTabWidth) / sizeof(int); i++)\r
+                       RemoteTabWidth[i] = CalcPixelX(RemoteTabWidth[i]);\r
+\r
                GetModuleFileName(NULL, HelpPath, FMAX_PATH);\r
                strcpy(GetFileName(HelpPath), "ffftp.chm");\r
 \r
@@ -497,13 +524,33 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                        if(IsRegAvailable() == YES && IsIniAvailable() == NO)\r
                        {\r
                                if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(ini_from_reg_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
-                               {\r
                                        ImportPortable = YES;\r
-                                       ForceIni = NO;\r
-                                       RegType = REGTYPE_REG;\r
+                       }\r
+               }\r
+               // バージョン確認\r
+               if(ReadSettingsVersion() > VER_NUM)\r
+               {\r
+                       if(IsRegAvailable() == YES && IsIniAvailable() == NO)\r
+                       {\r
+                               switch(MessageBox(GetMainHwnd(), MSGJPN351, "FFFTP", MB_YESNOCANCEL | MB_DEFBUTTON2))\r
+                               {\r
+                                       case IDCANCEL:\r
+                                               ReadOnlySettings = YES;\r
+                                               break;\r
+                                       case IDYES:\r
+                                               break;\r
+                                       case IDNO:\r
+                                               ImportPortable = YES;\r
+                                               break;\r
                                }\r
                        }\r
                }\r
+               // ポータブル版判定\r
+               if(ImportPortable == YES)\r
+               {\r
+                       ForceIni = NO;\r
+                       RegType = REGTYPE_REG;\r
+               }\r
 \r
 //             AllocConsole();\r
 \r
@@ -610,7 +657,7 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
                                        DispWindowTitle();\r
                                        // SourceForge.JPによるフォーク\r
 //                                     SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.");\r
-                                       SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.\r\nCopyright (C) 2011-2013 FFFTP Project (Hiromichi Matsushima, Suguru Kawamoto, IWAMOTO Kouichi, vitamin0x, unarist, Asami, fortran90, tomo1192, Yuji Tanaka, Moriguchi Hirokazu).");\r
+                                       SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.\r\nCopyright (C) 2011-2014 FFFTP Project (Hiromichi Matsushima, Suguru Kawamoto, IWAMOTO Kouichi, vitamin0x, unarist, Asami, fortran90, tomo1192, Yuji Tanaka, Moriguchi Hirokazu, Fu-sen).");\r
 \r
                                        if(ForceIni)\r
                                                SetTaskMsg("%s%s", MSGJPN283, IniPath);\r
@@ -713,6 +760,10 @@ static int MakeAllWindows(int cmdShow)
        wClass.hIconSm       = NULL;\r
        RegisterClassEx(&wClass);\r
 \r
+       // 高DPI対応\r
+//     ToolWinHeight = TOOLWIN_HEIGHT;\r
+       ToolWinHeight = CalcPixelY(16) + 12;\r
+\r
        if(SaveWinPos == NO)\r
        {\r
                WinPosX = CW_USEDEFAULT;\r
@@ -797,7 +848,25 @@ void DispWindowTitle(void)
        char Tmp[HOST_ADRS_LEN+FILTER_EXT_LEN+20];\r
 \r
        if(AskConnecting() == YES)\r
-               sprintf(Tmp, "%s (%s) - FFFTP", TitleHostName, FilterStr);\r
+       // 暗号化通信対応\r
+//             sprintf(Tmp, "%s (%s) - FFFTP", TitleHostName, FilterStr);\r
+       {\r
+               switch(AskCryptMode())\r
+               {\r
+               case CRYPT_NONE:\r
+                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN352);\r
+                       break;\r
+               case CRYPT_FTPES:\r
+                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN353);\r
+                       break;\r
+               case CRYPT_FTPIS:\r
+                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN354);\r
+                       break;\r
+               case CRYPT_SFTP:\r
+                       sprintf(Tmp, "%s (%s) %s - FFFTP", TitleHostName, FilterStr, MSGJPN355);\r
+                       break;\r
+               }\r
+       }\r
        else\r
                sprintf(Tmp, "FFFTP (%s)", FilterStr);\r
 \r
@@ -934,12 +1003,15 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
        switch (message)\r
        {\r
                // ローカル側自動更新\r
+               // タスクバー進捗表示\r
                case WM_CREATE :\r
                        SetTimer(hWnd, 1, 1000, NULL);\r
+                       SetTimer(hWnd, 2, 100, NULL);\r
                        break;\r
 \r
                // ローカル側自動更新\r
                // 自動切断対策\r
+               // タスクバー進捗表示\r
                case WM_TIMER :\r
                        switch(wParam)\r
                        {\r
@@ -972,6 +1044,10 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        LastDataConnectionTime = time(NULL);\r
                                }\r
                                break;\r
+                       case 2:\r
+                               if(IsTaskbarList3Loaded() == YES)\r
+                                       UpdateTaskbarProgress();\r
+                               break;\r
                        }\r
                        break;\r
 \r
@@ -1582,6 +1658,11 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                        break;\r
 #endif\r
 \r
+                               // 上位のディレクトリへ移動対応\r
+                               case MENU_REMOTE_MOVE_UPDIR :\r
+                                       MoveRemoteFileProc(-1);\r
+                                       break;\r
+\r
                                default :\r
                                        if((LOWORD(wParam) >= MENU_BMARK_TOP) &&\r
                                           (LOWORD(wParam) < MENU_BMARK_TOP+100))\r
@@ -1842,6 +1923,8 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                        KillTimer(hWnd, 1);\r
                        if(ChangeNotification != INVALID_HANDLE_VALUE)\r
                                FindCloseChangeNotification(ChangeNotification);\r
+                       // タスクバー進捗表示\r
+                       KillTimer(hWnd, 2);\r
 //                     WSACleanup();\r
 //                     DestroyWindow(hWndFtp);\r
                        PostQuitMessage(0);\r
@@ -2560,16 +2643,24 @@ static void ResizeWindowProc(void)
        SendMessage(GetSbarWnd(), WM_SIZE, SIZE_RESTORED, MAKELPARAM(Rect.right, Rect.bottom));\r
 \r
        CalcWinSize();\r
-       SetWindowPos(GetMainTbarWnd(), 0, 0, 0, Rect.right, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
-       SetWindowPos(GetLocalTbarWnd(), 0, 0, TOOLWIN_HEIGHT, LocalWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
-       SetWindowPos(GetRemoteTbarWnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT, RemoteWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
+       // 高DPI対応\r
+//     SetWindowPos(GetMainTbarWnd(), 0, 0, 0, Rect.right, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
+//     SetWindowPos(GetLocalTbarWnd(), 0, 0, TOOLWIN_HEIGHT, LocalWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
+//     SetWindowPos(GetRemoteTbarWnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT, RemoteWidth, TOOLWIN_HEIGHT, SWP_NOACTIVATE | SWP_NOZORDER);\r
+       SetWindowPos(GetMainTbarWnd(), 0, 0, 0, Rect.right, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER);\r
+       SetWindowPos(GetLocalTbarWnd(), 0, 0, AskToolWinHeight(), LocalWidth, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER);\r
+       SetWindowPos(GetRemoteTbarWnd(), 0, LocalWidth + SepaWidth, AskToolWinHeight(), RemoteWidth, AskToolWinHeight(), SWP_NOACTIVATE | SWP_NOZORDER);\r
        SendMessage(GetLocalTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);\r
        SetWindowPos(GetLocalHistHwnd(), 0, Rect.right, Rect.top, LocalWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);\r
        SendMessage(GetRemoteTbarWnd(), TB_GETITEMRECT, 3, (LPARAM)&Rect);\r
        SetWindowPos(GetRemoteHistHwnd(), 0, Rect.right, Rect.top, RemoteWidth - Rect.right, 200, SWP_NOACTIVATE | SWP_NOZORDER);\r
-       SetWindowPos(GetLocalHwnd(), 0, 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
-       SetWindowPos(GetRemoteHwnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
-       SetWindowPos(GetTaskWnd(), 0, 0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
+       // 高DPI対応\r
+//     SetWindowPos(GetLocalHwnd(), 0, 0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
+//     SetWindowPos(GetRemoteHwnd(), 0, LocalWidth + SepaWidth, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
+//     SetWindowPos(GetTaskWnd(), 0, 0, TOOLWIN_HEIGHT*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
+       SetWindowPos(GetLocalHwnd(), 0, 0, AskToolWinHeight()*2, LocalWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
+       SetWindowPos(GetRemoteHwnd(), 0, LocalWidth + SepaWidth, AskToolWinHeight()*2, RemoteWidth, ListHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
+       SetWindowPos(GetTaskWnd(), 0, 0, AskToolWinHeight()*2+ListHeight+SepaWidth, ClientWidth, TaskHeight, SWP_NOACTIVATE | SWP_NOZORDER);\r
 #endif\r
 \r
        return;\r
@@ -2609,7 +2700,9 @@ static void CalcWinSize(void)
 \r
        GetClientRect(GetSbarWnd(), &Rect);\r
 \r
-       ListHeight = max1(0, ClientHeight - TOOLWIN_HEIGHT * 2 - TaskHeight - SepaWidth - Rect.bottom);\r
+       // 高DPI対応\r
+//     ListHeight = max1(0, ClientHeight - TOOLWIN_HEIGHT * 2 - TaskHeight - SepaWidth - Rect.bottom);\r
+       ListHeight = max1(0, ClientHeight - AskToolWinHeight() * 2 - TaskHeight - SepaWidth - Rect.bottom);\r
 \r
        return;\r
 }\r
@@ -2657,8 +2750,11 @@ static void CheckResizeFrame(WPARAM Keys, int x, int y)
 \r
        if((Resizing == RESIZE_OFF) && (Keys == 0))\r
        {\r
+               // 高DPI対応\r
+//             if((x >= LocalWidth) && (x <= LocalWidth + SepaWidth) &&\r
+//                (y > TOOLWIN_HEIGHT) && (y < (TOOLWIN_HEIGHT * 2 + ListHeight)))\r
                if((x >= LocalWidth) && (x <= LocalWidth + SepaWidth) &&\r
-                  (y > TOOLWIN_HEIGHT) && (y < (TOOLWIN_HEIGHT * 2 + ListHeight)))\r
+                  (y > AskToolWinHeight()) && (y < (AskToolWinHeight() * 2 + ListHeight)))\r
                {\r
                        /* 境界位置変更用カーソルに変更 */\r
                        SetCapture(hWndFtp);\r
@@ -2667,7 +2763,9 @@ static void CheckResizeFrame(WPARAM Keys, int x, int y)
                        Resizing = RESIZE_PREPARE;\r
                        ResizePos = RESIZE_HPOS;\r
                }\r
-               else if((y >= TOOLWIN_HEIGHT*2+ListHeight) && (y <= TOOLWIN_HEIGHT*2+ListHeight+SepaWidth))\r
+               // 高DPI対応\r
+//             else if((y >= TOOLWIN_HEIGHT*2+ListHeight) && (y <= TOOLWIN_HEIGHT*2+ListHeight+SepaWidth))\r
+               else if((y >= AskToolWinHeight()*2+ListHeight) && (y <= AskToolWinHeight()*2+ListHeight+SepaWidth))\r
                {\r
                        /* 境界位置変更用カーソルに変更 */\r
                        SetCapture(hWndFtp);\r
@@ -2687,17 +2785,25 @@ static void CheckResizeFrame(WPARAM Keys, int x, int y)
                        GetClientRect(GetSbarWnd(), &Rect1);\r
                        Rect.left += GetSystemMetrics(SM_CXFRAME);\r
                        Rect.right -= GetSystemMetrics(SM_CXFRAME);\r
-                       Rect.top += TOOLWIN_HEIGHT*2 + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);\r
+                       // 高DPI対応\r
+//                     Rect.top += TOOLWIN_HEIGHT*2 + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);\r
+                       Rect.top += AskToolWinHeight()*2 + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME);\r
                        Rect.bottom -= GetSystemMetrics(SM_CYFRAME) + Rect1.bottom;\r
                        ClipCursor(&Rect);\r
                }\r
                else\r
                {\r
+                       // 高DPI対応\r
+//                     if(((ResizePos == RESIZE_HPOS) &&\r
+//                             ((x < LocalWidth) || (x > LocalWidth + SepaWidth) ||\r
+//                              (y <= TOOLWIN_HEIGHT) || (y >= (TOOLWIN_HEIGHT * 2 + ListHeight)))) ||\r
+//                        ((ResizePos == RESIZE_VPOS) &&\r
+//                             ((y < TOOLWIN_HEIGHT*2+ListHeight) || (y > TOOLWIN_HEIGHT*2+ListHeight+SepaWidth))))\r
                        if(((ResizePos == RESIZE_HPOS) &&\r
                                ((x < LocalWidth) || (x > LocalWidth + SepaWidth) ||\r
-                                (y <= TOOLWIN_HEIGHT) || (y >= (TOOLWIN_HEIGHT * 2 + ListHeight)))) ||\r
+                                (y <= AskToolWinHeight()) || (y >= (AskToolWinHeight() * 2 + ListHeight)))) ||\r
                           ((ResizePos == RESIZE_VPOS) &&\r
-                               ((y < TOOLWIN_HEIGHT*2+ListHeight) || (y > TOOLWIN_HEIGHT*2+ListHeight+SepaWidth))))\r
+                               ((y < AskToolWinHeight()*2+ListHeight) || (y > AskToolWinHeight()*2+ListHeight+SepaWidth))))\r
                        {\r
                                /* 元のカーソルに戻す */\r
                                ReleaseCapture();\r
@@ -3290,7 +3396,7 @@ BOOL LoadSSLRootCAFile()
                                for(i = 0; i < 5; i++)\r
                                        Hash[i] = _byteswap_ulong(Hash[i]);\r
                                // 同梱する"ssl.pem"に合わせてSHA1ハッシュ値を変更すること\r
-                               if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\xD8\x8A\x7B\x2F\xBF\x23\x57\x16\xDA\x02\x14\x2B\xD4\x2E\x09\x80\xA0\x4C\x72\x62", 20) == 0\r
+                               if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\x57\x50\x4F\xF9\x95\xFC\x41\x2F\x10\x2B\x36\xFA\x92\xAB\x08\xBB\xC3\x7F\x9A\xDB", 20) == 0\r
                                        || DialogBox(GetFtpInst(), MAKEINTRESOURCE(updatesslroot_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
                                {\r
                                        memcpy(&SSLRootCAFileHash, &Hash, 20);\r
@@ -3360,3 +3466,51 @@ void RestartAndTerminate()
        exit(1);\r
 }\r
 \r
+// タスクバー進捗表示\r
+int LoadTaskbarList3()\r
+{\r
+       int Sts;\r
+       Sts = FFFTP_FAIL;\r
+       if(CoCreateInstance(&CLSID_TaskbarList, NULL, CLSCTX_ALL, &IID_ITaskbarList3, (void**)&pTaskbarList3) == S_OK)\r
+       {\r
+               Sts = FFFTP_SUCCESS;\r
+       }\r
+       return Sts;\r
+}\r
+\r
+void FreeTaskbarList3()\r
+{\r
+       if(pTaskbarList3 != NULL)\r
+               pTaskbarList3->lpVtbl->Release(pTaskbarList3);\r
+       pTaskbarList3 = NULL;\r
+}\r
+\r
+int IsTaskbarList3Loaded()\r
+{\r
+       int Sts;\r
+       Sts = NO;\r
+       if(pTaskbarList3 != NULL)\r
+               Sts = YES;\r
+       return Sts;\r
+}\r
+\r
+void UpdateTaskbarProgress()\r
+{\r
+       if(AskTransferSizeTotal() > 0)\r
+       {\r
+               if(AskTransferErrorDisplay() > 0)\r
+                       pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_ERROR);\r
+               else\r
+                       pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_NORMAL);\r
+               pTaskbarList3->lpVtbl->SetProgressValue(pTaskbarList3, GetMainHwnd(), (ULONGLONG)(AskTransferSizeTotal() - AskTransferSizeLeft()), (ULONGLONG)AskTransferSizeTotal());\r
+       }\r
+       else\r
+               pTaskbarList3->lpVtbl->SetProgressState(pTaskbarList3, GetMainHwnd(), TBPF_NOPROGRESS);\r
+}\r
+\r
+// 高DPI対応\r
+int AskToolWinHeight(void)\r
+{\r
+       return(ToolWinHeight);\r
+}\r
+\r