OSDN Git Service

Change to encode reply messages with Kanji code of filenames.
[ffftp/ffftp.git] / mbswrapper.c
index 771bcc9..28c9a2c 100644 (file)
@@ -387,6 +387,166 @@ char* DuplicateWtoA(LPCWSTR lpString, int c)
        return p;\r
 }\r
 \r
+// マルチバイト文字列の冗長表現を修正\r
+// 修正があればTRUEを返す\r
+// 修正後の文字列の長さは元の文字列の長さ以下のためpDstとpSrcに同じ値を指定可能\r
+BOOL FixStringM(LPSTR pDst, LPCSTR pSrc)\r
+{\r
+       BOOL bResult;\r
+       char* p;\r
+       DWORD Code;\r
+       int i;\r
+       char c;\r
+       bResult = FALSE;\r
+       p = (char*)pSrc;\r
+       while(*pSrc != '\0')\r
+       {\r
+               Code = 0;\r
+               if((*pSrc & 0xfe) == 0xfc)\r
+               {\r
+                       i = 5;\r
+                       Code |= (DWORD)*pSrc & 0x01;\r
+               }\r
+               else if((*pSrc & 0xfc) == 0xf8)\r
+               {\r
+                       i = 4;\r
+                       Code |= (DWORD)*pSrc & 0x03;\r
+               }\r
+               else if((*pSrc & 0xf8) == 0xf0)\r
+               {\r
+                       i = 3;\r
+                       Code |= (DWORD)*pSrc & 0x07;\r
+               }\r
+               else if((*pSrc & 0xf0) == 0xe0)\r
+               {\r
+                       i = 2;\r
+                       Code |= (DWORD)*pSrc & 0x0f;\r
+               }\r
+               else if((*pSrc & 0xe0) == 0xc0)\r
+               {\r
+                       i = 1;\r
+                       Code |= (DWORD)*pSrc & 0x1f;\r
+               }\r
+               else if((*pSrc & 0x80) == 0x00)\r
+               {\r
+                       i = 0;\r
+                       Code |= (DWORD)*pSrc & 0x7f;\r
+               }\r
+               else\r
+                       i = -1;\r
+               pSrc++;\r
+               while((*pSrc & 0xc0) == 0x80)\r
+               {\r
+                       i--;\r
+                       Code = Code << 6;\r
+                       Code |= (DWORD)*pSrc & 0x3f;\r
+                       pSrc++;\r
+               }\r
+               if(i != 0)\r
+                       continue;\r
+               else if(Code & 0x7c000000)\r
+               {\r
+                       i = 5;\r
+                       c = (char)(0xfc | (Code >> (6 * i)));\r
+               }\r
+               else if(Code & 0x03e00000)\r
+               {\r
+                       i = 4;\r
+                       c = (char)(0xf8 | (Code >> (6 * i)));\r
+               }\r
+               else if(Code & 0x001f0000)\r
+               {\r
+                       i = 3;\r
+                       c = (char)(0xf0 | (Code >> (6 * i)));\r
+               }\r
+               else if(Code & 0x0000f800)\r
+               {\r
+                       i = 2;\r
+                       c = (char)(0xe0 | (Code >> (6 * i)));\r
+               }\r
+               else if(Code & 0x00000780)\r
+               {\r
+                       i = 1;\r
+                       c = (char)(0xc0 | (Code >> (6 * i)));\r
+               }\r
+               else\r
+               {\r
+                       i = 0;\r
+                       c = (char)Code;\r
+               }\r
+               if(c != *p)\r
+                       bResult = TRUE;\r
+               p++;\r
+               *pDst = c;\r
+               pDst++;\r
+               while(i > 0)\r
+               {\r
+                       i--;\r
+                       c = (char)(0x80 | ((Code >> (6 * i)) & 0x3f));\r
+                       if(c != *p)\r
+                               bResult = TRUE;\r
+                       p++;\r
+                       *pDst = c;\r
+                       pDst++;\r
+               }\r
+       }\r
+       if(*p != '\0')\r
+               bResult = TRUE;\r
+       *pDst = '\0';\r
+       return bResult;\r
+}\r
+\r
+// NULL区切りマルチバイト文字列の冗長表現を修正\r
+// 修正があればTRUEを返す\r
+// 修正後の文字列の長さは元の文字列の長さ以下のためpDstとpSrcに同じ値を指定可能\r
+BOOL FixMultiStringM(LPSTR pDst, LPCSTR pSrc)\r
+{\r
+       BOOL bResult;\r
+       int Length;\r
+       bResult = FALSE;\r
+       while(*pSrc != '\0')\r
+       {\r
+               Length = strlen(pSrc) + 1;\r
+               bResult = bResult | FixStringM(pDst, pSrc);\r
+               pSrc += Length;\r
+               pDst += strlen(pDst) + 1;\r
+       }\r
+       *pDst = '\0';\r
+       return bResult;\r
+}\r
+\r
+// マルチバイト文字列の冗長表現を確認\r
+// 冗長表現があればTRUEを返す\r
+BOOL CheckStringM(LPCSTR lpString)\r
+{\r
+       BOOL bResult;\r
+       char* p;\r
+       bResult = FALSE;\r
+       p = AllocateStringM(strlen(lpString) + 1);\r
+       if(p)\r
+       {\r
+               bResult = FixStringM(p, lpString);\r
+               FreeDuplicatedString(p);\r
+       }\r
+       return bResult;\r
+}\r
+\r
+// NULL区切りマルチバイト文字列の冗長表現を確認\r
+// 冗長表現があればTRUEを返す\r
+BOOL CheckMultiStringM(LPCSTR lpString)\r
+{\r
+       BOOL bResult;\r
+       char* p;\r
+       bResult = FALSE;\r
+       p = AllocateStringM(GetMultiStringLengthM(lpString) + 1);\r
+       if(p)\r
+       {\r
+               bResult = FixMultiStringM(p, lpString);\r
+               FreeDuplicatedString(p);\r
+       }\r
+       return bResult;\r
+}\r
+\r
 // 文字列用に確保したメモリを開放\r
 // リソースIDならば何もしない\r
 void FreeDuplicatedString(void* p)\r
@@ -1558,6 +1718,51 @@ END_ROUTINE
        return r;\r
 }\r
 \r
+BOOL ShellExecuteExM(LPSHELLEXECUTEINFOA lpExecInfo)\r
+{\r
+       BOOL r = FALSE;\r
+       wchar_t* pw0 = NULL;\r
+       wchar_t* pw1 = NULL;\r
+       wchar_t* pw2 = NULL;\r
+       wchar_t* pw3 = NULL;\r
+       wchar_t* pw4 = NULL;\r
+       SHELLEXECUTEINFOW wExecInfo;\r
+START_ROUTINE\r
+       wExecInfo.cbSize = sizeof(SHELLEXECUTEINFOW);\r
+       wExecInfo.fMask = lpExecInfo->fMask;\r
+       wExecInfo.hwnd = lpExecInfo->hwnd;\r
+       pw0 = DuplicateMtoW(lpExecInfo->lpVerb, -1);\r
+       wExecInfo.lpVerb = pw0;\r
+       pw1 = DuplicateMtoW(lpExecInfo->lpFile, -1);\r
+       wExecInfo.lpFile = pw1;\r
+       pw2 = DuplicateMtoW(lpExecInfo->lpParameters, -1);\r
+       wExecInfo.lpParameters = pw2;\r
+       pw3 = DuplicateMtoW(lpExecInfo->lpDirectory, -1);\r
+       wExecInfo.lpDirectory = pw3;\r
+       wExecInfo.nShow = lpExecInfo->nShow;\r
+       wExecInfo.hInstApp = lpExecInfo->hInstApp;\r
+       wExecInfo.lpIDList = lpExecInfo->lpIDList;\r
+       if(lpExecInfo->fMask & SEE_MASK_CLASSNAME)\r
+       {\r
+               pw4 = DuplicateMtoW(lpExecInfo->lpClass, -1);\r
+               wExecInfo.lpClass = pw4;\r
+       }\r
+       wExecInfo.hkeyClass = lpExecInfo->hkeyClass;\r
+       wExecInfo.dwHotKey = lpExecInfo->dwHotKey;\r
+       wExecInfo.hIcon = lpExecInfo->hIcon;\r
+       wExecInfo.hProcess = lpExecInfo->hProcess;\r
+       r = ShellExecuteExW(&wExecInfo);\r
+       lpExecInfo->hInstApp = wExecInfo.hInstApp;\r
+       lpExecInfo->hProcess = wExecInfo.hProcess;\r
+END_ROUTINE\r
+       FreeDuplicatedString(pw0);\r
+       FreeDuplicatedString(pw1);\r
+       FreeDuplicatedString(pw2);\r
+       FreeDuplicatedString(pw3);\r
+       FreeDuplicatedString(pw4);\r
+       return r;\r
+}\r
+\r
 PIDLIST_ABSOLUTE SHBrowseForFolderM(LPBROWSEINFOA lpbi)\r
 {\r
        PIDLIST_ABSOLUTE r = NULL;\r
@@ -1808,7 +2013,7 @@ END_ROUTINE
 \r
 BOOL sndPlaySoundM(LPCSTR pszSound, UINT fuSound)\r
 {\r
-       HWND r = NULL;\r
+       BOOL r = FALSE;\r
        wchar_t* pw0 = NULL;\r
 START_ROUTINE\r
        pw0 = DuplicateMtoW(pszSound, -1);\r
@@ -1818,6 +2023,49 @@ END_ROUTINE
        return r;\r
 }\r
 \r
+HANDLE SetClipboardDataM(UINT uFormat, HANDLE hMem)\r
+{\r
+       HANDLE r = NULL;\r
+       char* p;\r
+       int Length;\r
+       int BufferLength;\r
+       HGLOBAL hBufferMem;\r
+START_ROUTINE\r
+       if(uFormat == CF_TEXT)\r
+       {\r
+               p = (char*)GlobalLock(hMem);\r
+               Length = (int)GlobalSize(hMem);\r
+               BufferLength = MtoW(NULL, 0, p, Length);\r
+               if(hBufferMem = GlobalAlloc(GMEM_MOVEABLE, sizeof(wchar_t) * BufferLength))\r
+               {\r
+                       MtoW((LPWSTR)GlobalLock(hBufferMem), BufferLength, p, Length);\r
+                       GlobalUnlock(hBufferMem);\r
+                       r = SetClipboardData(CF_UNICODETEXT, hBufferMem);\r
+               }\r
+               GlobalUnlock(hMem);\r
+               GlobalFree(hMem);\r
+       }\r
+       else\r
+               r = SetClipboardData(uFormat, hMem);\r
+END_ROUTINE\r
+       return r;\r
+}\r
+\r
+BOOL CopyFileM(LPCSTR lpExistingFileName, LPCSTR lpNewFileName, BOOL bFailIfExists)\r
+{\r
+       BOOL r = FALSE;\r
+       wchar_t* pw0 = NULL;\r
+       wchar_t* pw1 = NULL;\r
+START_ROUTINE\r
+       pw0 = DuplicateMtoW(lpExistingFileName, -1);\r
+       pw1 = DuplicateMtoW(lpNewFileName, -1);\r
+       r = CopyFileW(pw0, pw1, bFailIfExists);\r
+END_ROUTINE\r
+       FreeDuplicatedString(pw0);\r
+       FreeDuplicatedString(pw1);\r
+       return r;\r
+}\r
+\r
 int mkdirM(const char * _Path)\r
 {\r
        int r = 0;\r