OSDN Git Service

Add support for linux-ftpd (untested).
[ffftp/ffftp.git] / main.c
diff --git a/main.c b/main.c
index 2c162f2..25ef052 100644 (file)
--- a/main.c
+++ b/main.c
@@ -84,7 +84,9 @@ static void CalcWinSize(void);
 static void CheckResizeFrame(WPARAM Keys, int x, int y);\r
 static void DispDirInfo(void);\r
 static void DeleteAlltempFile(void);\r
-static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
+// 64ビット対応\r
+//static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
+static INT_PTR CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
 static int EnterMasterPasswordAndSet( int Res, HWND hWnd );\r
 \r
 /*===== ローカルなワーク =====*/\r
@@ -132,6 +134,8 @@ static DWORD dwCookie;
 \r
 // 暗号化通信対応\r
 static char SSLRootCAFilePath[FMAX_PATH+1];\r
+// マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
+static DWORD MainThreadId;\r
 \r
 \r
 /*===== グローバルなワーク =====*/\r
@@ -313,9 +317,11 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
                InitializeLoadLibraryHook();\r
 #endif\r
 \r
+       // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
 #ifdef DISABLE_MULTI_CPUS\r
        SetProcessAffinityMask(GetCurrentProcess(), 1);\r
 #endif\r
+       MainThreadId = GetCurrentThreadId();\r
 \r
        // yutaka\r
        if(OleInitialize(NULL) != S_OK){\r
@@ -341,7 +347,9 @@ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLi
                        if((Sts == 0) || (Sts == -1))\r
                                break;\r
 \r
-                       if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))\r
+                       // 64ビット対応\r
+//                     if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))\r
+                       if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD_PTR)&Msg))\r
                        { \r
                                /* ディレクトリ名の表示コンボボックスでBSやRETが効くように */\r
                                /* コンボボックス内ではアクセラレータを無効にする */\r
@@ -395,7 +403,9 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
        aes_init();\r
        srand(GetTickCount());\r
        \r
-       HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD)&dwCookie);\r
+       // 64ビット対応\r
+//     HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD)&dwCookie);\r
+       HtmlHelp(NULL, NULL, HH_INITIALIZE, (DWORD_PTR)&dwCookie);\r
 \r
        SaveUpdateBellInfo();\r
 \r
@@ -405,7 +415,11 @@ static int InitApp(LPSTR lpszCmdLine, int cmdShow)
        {\r
                Accel = LoadAccelerators(hInstFtp, MAKEINTRESOURCE(ffftp_accel));\r
 \r
-               GetTempPath(FMAX_PATH, TmpPath);\r
+               // 環境依存の不具合対策\r
+//             GetTempPath(FMAX_PATH, TmpPath);\r
+               GetAppTempPath(TmpPath);\r
+               _mkdir(TmpPath);\r
+               SetYenTail(TmpPath);\r
 \r
                GetModuleFileName(NULL, HelpPath, FMAX_PATH);\r
                strcpy(GetFileName(HelpPath), "ffftp.chm");\r
@@ -628,13 +642,7 @@ static int MakeAllWindows(int cmdShow)
                WinPosX = CW_USEDEFAULT;\r
                WinPosY = 0;\r
        }\r
-       // UTF-8対応\r
-       // ユーザー定義のクラスはデフォルトのWNDPROCがShift_JIS専用のため\r
-//     hWndFtp = CreateWindow(FtpClassStr, "FFFTP",\r
-//                             WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,\r
-//                             WinPosX, WinPosY, WinWidth, WinHeight,\r
-//                             HWND_DESKTOP, 0, hInstFtp, NULL);\r
-       hWndFtp = CreateWindowA(FtpClassStr, "FFFTP",\r
+       hWndFtp = CreateWindow(FtpClassStr, "FFFTP",\r
                                WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,\r
                                WinPosX, WinPosY, WinWidth, WinHeight,\r
                                HWND_DESKTOP, 0, hInstFtp, NULL);\r
@@ -841,6 +849,8 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
 {\r
        PAINTSTRUCT ps;\r
        LPTOOLTIPTEXT lpttt;\r
+       // UTF-8対応\r
+       LPTOOLTIPTEXTW wlpttt;\r
        RECT Rect;\r
 \r
        int TmpTransType;\r
@@ -1406,8 +1416,13 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                        switch(((LPNMHDR)lParam)->code)\r
                        {\r
                                /* ツールチップコントロールメッセージの処理 */\r
-                               case TTN_NEEDTEXT:\r
+                               // UTF-8対応\r
+//                             case TTN_NEEDTEXT:\r
+                               case TTN_NEEDTEXTW:\r
                                        lpttt = (LPTOOLTIPTEXT)lParam;\r
+                                       // UTF-8対応\r
+                                       // lptttは単なる警告回避用\r
+                                       wlpttt = (LPTOOLTIPTEXTW)lParam;\r
                                        lpttt->hinst = hInstFtp;\r
                                        switch(lpttt->hdr.idFrom)\r
                                        {\r
@@ -1537,15 +1552,14 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA
                                                        lpttt->lpszText = MSGJPN176;\r
                                                        break;\r
                                        }\r
-                                       // UTF-8からShift_JISへ変換\r
+                                       // UTF-8対応\r
+                                       // UTF-8からUTF-16 LEへ変換\r
                                        {\r
                                                static wchar_t StringBufferUTF16[1024];\r
-                                               static char StringBufferSJIS[1024];\r
                                                if(lpttt->lpszText)\r
                                                {\r
                                                        MtoW(StringBufferUTF16, sizeof(StringBufferUTF16)/ sizeof(wchar_t), lpttt->lpszText, -1);\r
-                                                       WtoA(StringBufferSJIS, sizeof(StringBufferSJIS)/ sizeof(char), StringBufferUTF16, -1);\r
-                                                       lpttt->lpszText = StringBufferSJIS;\r
+                                                       wlpttt->lpszText = StringBufferUTF16;\r
                                                }\r
                                        }\r
                                        break;\r
@@ -2009,6 +2023,9 @@ static char *GetToken(char *Str, char *Buf)
 \r
 static void ExitProc(HWND hWnd)\r
 {\r
+       // 環境依存の不具合対策\r
+       char Tmp[FMAX_PATH+1];\r
+\r
        CancelFlg = YES;\r
 \r
        CloseTransferThread();\r
@@ -2037,6 +2054,14 @@ static void ExitProc(HWND hWnd)
        else\r
                DeleteCache();\r
 \r
+       // 環境依存の不具合対策\r
+       GetAppTempPath(Tmp);\r
+       SetYenTail(Tmp);\r
+       strcat(Tmp, "file");\r
+       _rmdir(Tmp);\r
+       GetAppTempPath(Tmp);\r
+       _rmdir(Tmp);\r
+\r
        if(RasClose == YES)\r
        {\r
                DisconnectRas(RasCloseNotify);\r
@@ -2110,6 +2135,10 @@ void DoubleClickProc(int Win, int Mode, int App)
 \r
                                                        strcpy(Remote, TmpPath);\r
                                                        SetYenTail(Remote);\r
+                                                       // 環境依存の不具合対策\r
+                                                       strcat(Remote, "file");\r
+                                                       _mkdir(Remote);\r
+                                                       SetYenTail(Remote);\r
                                                        if (UseDiffViewer == YES) {\r
                                                                strcat(Remote, "remote.");\r
                                                        }\r
@@ -2703,7 +2732,9 @@ static void DeleteAlltempFile(void)
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+// 64ビット対応\r
+//static BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+static INT_PTR CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
 {\r
        static char Tmp[80];\r
        int Ver;\r
@@ -2831,7 +2862,11 @@ int BackgrndMessageProc(void)
        Ret = NO;\r
        while(PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE))\r
        {\r
-               if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))\r
+               // マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
+//             if(!HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))\r
+               // 64ビット対応\r
+//             if(!IsMainThread() || !HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD)&Msg))\r
+               if(!IsMainThread() || !HtmlHelp(NULL, NULL, HH_PRETRANSLATEMESSAGE, (DWORD_PTR)&Msg))\r
                {\r
                        /* ディレクトリ名の表示コンボボックスでBSやRETが効くように */\r
                        /* コンボボックス内ではアクセラレータを無効にする */\r
@@ -2953,11 +2988,14 @@ BOOL __stdcall SSLTimeoutCallback(BOOL* pbAborted)
 BOOL __stdcall SSLConfirmCallback(BOOL* pbAborted, BOOL bVerified, LPCSTR Certificate, LPCSTR CommonName)\r
 {\r
        BOOL bResult;\r
-       int i;\r
        uint32 Hash[5];\r
+       int i;\r
        char* pm0;\r
        bResult = FALSE;\r
        sha_memory((char*)Certificate, (uint32)(strlen(Certificate) * sizeof(char)), (uint32*)&Hash);\r
+       // sha.cはビッグエンディアンのため\r
+       for(i = 0; i < 5; i++)\r
+               Hash[i] = _byteswap_ulong(Hash[i]);\r
        i = 0;\r
        while(i < MAX_CERT_CACHE_HASH)\r
        {\r
@@ -2995,6 +3033,7 @@ BOOL LoadSSLRootCAFile()
        DWORD Size;\r
        BYTE* pBuffer;\r
        uint32 Hash[5];\r
+       int i;\r
        bResult = FALSE;\r
        if((hFile = CreateFile(SSLRootCAFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)\r
        {\r
@@ -3004,8 +3043,11 @@ BOOL LoadSSLRootCAFile()
                        if(ReadFile(hFile, pBuffer, Size, &Size, NULL))\r
                        {\r
                                sha_memory((char*)pBuffer, (uint32)Size, (uint32*)&Hash);\r
+                               // sha.cはビッグエンディアンのため\r
+                               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, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 20) == 0\r
+                               if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\xF0\x1B\x48\x26\x67\x44\x3A\xFF\x0A\x16\xD3\xBB\x8A\x33\xEB\x70\x6D\x75\xA6\x0D", 20) == 0\r
                                        || DialogBox(GetFtpInst(), MAKEINTRESOURCE(updatesslroot_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
                                {\r
                                        memcpy(&SSLRootCAFileHash, &Hash, 20);\r
@@ -3020,3 +3062,10 @@ BOOL LoadSSLRootCAFile()
        return bResult;\r
 }\r
 \r
+// マルチコアCPUの特定環境下でファイル通信中にクラッシュするバグ対策\r
+BOOL IsMainThread()\r
+{\r
+       if(GetCurrentThreadId() != MainThreadId)\r
+               return FALSE;\r
+       return TRUE;\r
+}
\ No newline at end of file