OSDN Git Service

Fix bugs of drag-and-drop handling.
[ffftp/ffftp.git] / misc.c
diff --git a/misc.c b/misc.c
index 58700a7..a6f89ee 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -33,7 +33,9 @@
 #include <stdarg.h>\r
 #include <string.h>\r
 #include <mbstring.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
+#include <winsock2.h>\r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 #include <shlobj.h>\r
@@ -62,7 +64,9 @@ typedef struct {
 \r
 /*===== プロトタイプ =====*/\r
 \r
-static BOOL CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+// 64ビット対応\r
+//static BOOL CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static INT_PTR CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
 \r
 /*===== 外部参照 =====*/\r
 \r
@@ -72,6 +76,9 @@ extern HWND hHelpWin;
 \r
 static DIALOGDATA *DialogData;         /* 入力ダイアログデータ */\r
 static int HelpPage;\r
+// 高DPI対応\r
+static int DisplayDPIX;\r
+static int DisplayDPIY;\r
 \r
 \r
 \r
@@ -132,13 +139,17 @@ int InputDialogBox(int Res, HWND hWnd, char *Title, char *Buf, int Max, int *Flg
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-static BOOL CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+// 64ビット対応\r
+//static BOOL CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+static INT_PTR CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
 {\r
        char Tmp[FMAX_PATH+1];\r
 \r
        switch (iMessage)\r
        {\r
                case WM_INITDIALOG :\r
+                       // プロセス保護\r
+                       ProtectAllEditControls(hDlg);\r
                        if(strlen(DialogData->Title) != 0)\r
                                SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)DialogData->Title);\r
                        SendDlgItemMessage(hDlg, INP_INPSTR, EM_LIMITTEXT, DialogData->MaxLen-1, 0);\r
@@ -186,7 +197,9 @@ static BOOL CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-BOOL CALLBACK ExeEscDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+// 64ビット対応\r
+//BOOL CALLBACK ExeEscDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+INT_PTR CALLBACK ExeEscDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
 {\r
        switch (message)\r
        {\r
@@ -222,7 +235,9 @@ BOOL CALLBACK ExeEscDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lP
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-BOOL CALLBACK ExeEscTextDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+// 64ビット対応\r
+//BOOL CALLBACK ExeEscTextDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+INT_PTR CALLBACK ExeEscTextDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
 {\r
        switch (message)\r
        {\r
@@ -247,6 +262,27 @@ BOOL CALLBACK ExeEscTextDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARA
 }\r
 \r
 \r
+// 全設定暗号化対応\r
+// 何らかのボタンが押されたときに終了\r
+INT_PTR CALLBACK AnyButtonDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+{\r
+       switch (message)\r
+       {\r
+               case WM_INITDIALOG :\r
+                       return(TRUE);\r
+\r
+               case WM_COMMAND :\r
+                       switch(GET_WM_COMMAND_CMD(wParam, lParam))\r
+                       {\r
+                               case BN_CLICKED :\r
+                                       EndDialog(hDlg, GET_WM_COMMAND_ID(wParam, lParam));\r
+                                       break;\r
+                       }\r
+                       return(TRUE);\r
+       }\r
+    return(FALSE);\r
+}\r
+\r
 /*----- 文字列の最後に "\" を付ける -------------------------------------------\r
 *\r
 *      Parameter\r
@@ -308,6 +344,13 @@ void RemoveYenTail(char *Str)
 \r
 void SetSlashTail(char *Str)\r
 {\r
+#if defined(HAVE_TANDEM)\r
+    /* Tandem では / の代わりに . を追加 */\r
+       if(AskHostType() == HTYPE_TANDEM) {\r
+               if(_mbscmp(_mbsninc(Str, _mbslen(Str) - 1), ".") != 0)\r
+                       strcat(Str, ".");\r
+       } else\r
+#endif\r
        if(_mbscmp(_mbsninc(Str, _mbslen(Str) - 1), "/") != 0)\r
                strcat(Str, "/");\r
 \r
@@ -354,6 +397,12 @@ void ReplaceAll(char *Str, char Src, char Dst)
 {\r
        char *Pos;\r
 \r
+/* Tandem ではノード名の変換を行わない */\r
+/* 最初の1文字が \ でもそのままにする */\r
+#if defined(HAVE_TANDEM)\r
+       if (AskRealHostType() == HTYPE_TANDEM && strlen(Str) > 0)\r
+               Str++;\r
+#endif\r
        while((Pos = _mbschr(Str, Src)) != NULL)\r
                *Pos = Dst;\r
        return;\r
@@ -587,6 +636,11 @@ char *GetFileName(char *Path)
        if((Pos = _mbsrchr(Path, '/')) != NULL)\r
                Path = Pos + 1;\r
 \r
+#if defined(HAVE_TANDEM)\r
+       /* Tandem は . がデリミッタとなる */\r
+       if((AskHostType() == HTYPE_TANDEM) && ((Pos = _mbsrchr(Path, '.')) != NULL))\r
+               Path = Pos + 1;\r
+#endif\r
        return(Path);\r
 }\r
 \r
@@ -775,18 +829,44 @@ int AskDirLevel(char *Path)
 \r
 void MakeSizeString(double Size, char *Buf)\r
 {\r
-       if(Size >= (1024*1024))\r
+       // 修正\r
+//     if(Size >= (1024*1024))\r
+//     {\r
+//             Size /= (1024*1024);\r
+//             sprintf(Buf, "%.2fM Bytes", Size);\r
+//     }\r
+//     else if (Size >= 1024)\r
+//     {\r
+//             Size /= 1024;\r
+//             sprintf(Buf, "%.2fK Bytes", Size);\r
+//     }\r
+//     else\r
+//             sprintf(Buf, "%.0f Bytes", Size);\r
+       if(Size >= 1024.0)\r
        {\r
-               Size /= (1024*1024);\r
-               sprintf(Buf, "%.2fM Bytes", Size);\r
-       }\r
-       else if (Size >= 1024)\r
-       {\r
-               Size /= 1024;\r
-               sprintf(Buf, "%.2fK Bytes", Size);\r
+               Size /= 1024.0;\r
+               if(Size >= 1024.0)\r
+               {\r
+                       Size /= 1024.0;\r
+                       if(Size >= 1024.0)\r
+                       {\r
+                               Size /= 1024.0;\r
+                               if(Size >= 1024.0)\r
+                               {\r
+                                       Size /= 1024.0;\r
+                                       sprintf(Buf, "%.2lfT Bytes", Size);\r
+                               }\r
+                               else\r
+                                       sprintf(Buf, "%.2lfG Bytes", Size);\r
+                       }\r
+                       else\r
+                               sprintf(Buf, "%.2lfM Bytes", Size);\r
+               }\r
+               else\r
+                       sprintf(Buf, "%.2lfK Bytes", Size);\r
        }\r
        else\r
-               sprintf(Buf, "%.0f Bytes", Size);\r
+               sprintf(Buf, "%.0lf Bytes", Size);\r
 \r
        return;\r
 }\r
@@ -987,9 +1067,23 @@ int SplitUNCpath(char *unc, char *Host, char *Path, char *File, char *User, char
                        strncpy(User, Tmp, USER_NAME_LEN);\r
        }\r
 \r
+       // IPv6対応\r
+       if((Pos2 = _mbschr(Pos1, '[')) != NULL && Pos2 < _mbschr(Pos1, ':'))\r
+       {\r
+               Pos1 = Pos2 + 1;\r
+               if((Pos2 = _mbschr(Pos2, ']')) != NULL)\r
+               {\r
+                       memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
+                       Pos1 = Pos2 + 1;\r
+               }\r
+       }\r
+\r
        if((Pos2 = _mbschr(Pos1, ':')) != NULL)\r
        {\r
-               memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
+               // IPv6対応\r
+//             memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
+               if(strlen(Host) == 0)\r
+                       memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
                Pos2++;\r
                if(IsDigit(*Pos2))\r
                {\r
@@ -1006,13 +1100,19 @@ int SplitUNCpath(char *unc, char *Host, char *Path, char *File, char *User, char
        }\r
        else if((Pos2 = _mbschr(Pos1, '/')) != NULL)\r
        {\r
-               memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
+               // IPv6対応\r
+//             memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
+               if(strlen(Host) == 0)\r
+                       memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
                RemoveFileName(Pos2, Path);\r
                strncpy(File, GetFileName(Pos2), FMAX_PATH);\r
        }\r
        else\r
        {\r
-               strncpy(Host, Pos1, HOST_ADRS_LEN);\r
+               // IPv6対応\r
+//             strncpy(Host, Pos1, HOST_ADRS_LEN);\r
+               if(strlen(Host) == 0)\r
+                       strncpy(Host, Pos1, HOST_ADRS_LEN);\r
        }\r
 \r
        Sts = FFFTP_FAIL;\r
@@ -1060,7 +1160,12 @@ int TimeString2FileTime(char *Time, FILETIME *Buf)
                else\r
                        sTime.wHour = atoi(Time + 12);\r
                sTime.wMinute = atoi(Time + 14);\r
-               sTime.wSecond = 0;\r
+               // タイムスタンプのバグ修正\r
+//             sTime.wSecond = 0;\r
+               if(strlen(Time) >= 19)\r
+                       sTime.wSecond = atoi(Time + 17);\r
+               else\r
+                       sTime.wSecond = 0;\r
                sTime.wMilliseconds = 0;\r
 \r
                SystemTimeToFileTime(&sTime, &fTime);\r
@@ -1082,7 +1187,9 @@ int TimeString2FileTime(char *Time, FILETIME *Buf)
 *              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
-void FileTime2TimeString(FILETIME *Time, char *Buf, int Mode, int InfoExist)\r
+// タイムスタンプのバグ修正\r
+//void FileTime2TimeString(FILETIME *Time, char *Buf, int Mode, int InfoExist)\r
+void FileTime2TimeString(FILETIME *Time, char *Buf, int Mode, int InfoExist, int ShowSeconds)\r
 {\r
        SYSTEMTIME sTime;\r
        FILETIME fTime;\r
@@ -1092,19 +1199,45 @@ void FileTime2TimeString(FILETIME *Time, char *Buf, int Mode, int InfoExist)
                if((Time->dwLowDateTime == 0) && (Time->dwHighDateTime == 0))\r
                        InfoExist = 0;\r
 \r
-               /* "yyyy/mm/dd hh:mm" */\r
+               // タイムスタンプのバグ修正\r
+//             /* "yyyy/mm/dd hh:mm" */\r
+               /* "yyyy/mm/dd hh:mm:ss" */\r
                FileTimeToLocalFileTime(Time, &fTime);\r
                FileTimeToSystemTime(&fTime, &sTime);\r
 \r
-               if(InfoExist & FINFO_DATE)\r
-                       sprintf(Buf, "%04d/%02d/%02d ", sTime.wYear, sTime.wMonth, sTime.wDay);\r
-               else\r
-                       sprintf(Buf, "           ");\r
-\r
-               if(InfoExist & FINFO_TIME)\r
-                       sprintf(Buf+11, "%2d:%02d", sTime.wHour, sTime.wMinute);\r
+               // タイムスタンプのバグ修正\r
+//             if(InfoExist & FINFO_DATE)\r
+//                     sprintf(Buf, "%04d/%02d/%02d ", sTime.wYear, sTime.wMonth, sTime.wDay);\r
+//             else\r
+//                     sprintf(Buf, "           ");\r
+//\r
+//             if(InfoExist & FINFO_TIME)\r
+//                     sprintf(Buf+11, "%2d:%02d", sTime.wHour, sTime.wMinute);\r
+//             else\r
+//                     sprintf(Buf+11, "     ");\r
+               if(InfoExist & (FINFO_DATE | FINFO_TIME))\r
+               {\r
+                       if(InfoExist & FINFO_DATE)\r
+                               sprintf(Buf, "%04d/%02d/%02d ", sTime.wYear, sTime.wMonth, sTime.wDay);\r
+                       else\r
+                               sprintf(Buf, "           ");\r
+                       if(ShowSeconds == YES)\r
+                       {\r
+                               if(InfoExist & FINFO_TIME)\r
+                                       sprintf(Buf+11, "%2d:%02d:%02d", sTime.wHour, sTime.wMinute, sTime.wSecond);\r
+                               else\r
+                                       sprintf(Buf+11, "        ");\r
+                       }\r
+                       else\r
+                       {\r
+                               if(InfoExist & FINFO_TIME)\r
+                                       sprintf(Buf+11, "%2d:%02d", sTime.wHour, sTime.wMinute);\r
+                               else\r
+                                       sprintf(Buf+11, "     ");\r
+                       }\r
+               }\r
                else\r
-                       sprintf(Buf+11, "     ");\r
+                       Buf[0] = NUL;\r
        }\r
        else\r
        {\r
@@ -1157,28 +1290,59 @@ int AttrString2Value(char *Str)
 \r
        Ret = 0;\r
        memset(Tmp, 0, 10);\r
-       strncpy(Tmp, Str, 9);\r
-\r
-       if(Tmp[0] != '-')\r
-               Ret |= 0x400;\r
-       if(Tmp[1] != '-')\r
-               Ret |= 0x200;\r
-       if(Tmp[2] != '-')\r
-               Ret |= 0x100;\r
-\r
-       if(Tmp[3] != '-')\r
-               Ret |= 0x40;\r
-       if(Tmp[4] != '-')\r
-               Ret |= 0x20;\r
-       if(Tmp[5] != '-')\r
-               Ret |= 0x10;\r
-\r
-       if(Tmp[6] != '-')\r
-               Ret |= 0x4;\r
-       if(Tmp[7] != '-')\r
-               Ret |= 0x2;\r
-       if(Tmp[8] != '-')\r
-               Ret |= 0x1;\r
+       // ファイルの属性を数字で表示\r
+//     strncpy(Tmp, Str, 9);\r
+//\r
+//     if(Tmp[0] != '-')\r
+//             Ret |= 0x400;\r
+//     if(Tmp[1] != '-')\r
+//             Ret |= 0x200;\r
+//     if(Tmp[2] != '-')\r
+//             Ret |= 0x100;\r
+//\r
+//     if(Tmp[3] != '-')\r
+//             Ret |= 0x40;\r
+//     if(Tmp[4] != '-')\r
+//             Ret |= 0x20;\r
+//     if(Tmp[5] != '-')\r
+//             Ret |= 0x10;\r
+//\r
+//     if(Tmp[6] != '-')\r
+//             Ret |= 0x4;\r
+//     if(Tmp[7] != '-')\r
+//             Ret |= 0x2;\r
+//     if(Tmp[8] != '-')\r
+//             Ret |= 0x1;\r
+       if(strlen(Str) >= 9)\r
+       {\r
+               strncpy(Tmp, Str, 9);\r
+\r
+               if(Tmp[0] != '-')\r
+                       Ret |= 0x400;\r
+               if(Tmp[1] != '-')\r
+                       Ret |= 0x200;\r
+               if(Tmp[2] != '-')\r
+                       Ret |= 0x100;\r
+\r
+               if(Tmp[3] != '-')\r
+                       Ret |= 0x40;\r
+               if(Tmp[4] != '-')\r
+                       Ret |= 0x20;\r
+               if(Tmp[5] != '-')\r
+                       Ret |= 0x10;\r
+\r
+               if(Tmp[6] != '-')\r
+                       Ret |= 0x4;\r
+               if(Tmp[7] != '-')\r
+                       Ret |= 0x2;\r
+               if(Tmp[8] != '-')\r
+                       Ret |= 0x1;\r
+       }\r
+       else if(strlen(Str) >= 3)\r
+       {\r
+               strncpy(Tmp, Str, 3);\r
+               Ret = strtol(Tmp, NULL, 16);\r
+       }\r
 \r
        return(Ret);\r
 }\r
@@ -1194,30 +1358,62 @@ int AttrString2Value(char *Str)
 *              int 値\r
 *----------------------------------------------------------------------------*/\r
 \r
-void AttrValue2String(int Attr, char *Buf)\r
+// ファイルの属性を数字で表示\r
+//void AttrValue2String(int Attr, char *Buf)\r
+void AttrValue2String(int Attr, char *Buf, int ShowNumber)\r
 {\r
-       strcpy(Buf, "---------");\r
-\r
-       if(Attr & 0x400)\r
-               Buf[0] = 'r';\r
-       if(Attr & 0x200)\r
-               Buf[1] = 'w';\r
-       if(Attr & 0x100)\r
-               Buf[2] = 'x';\r
-\r
-       if(Attr & 0x40)\r
-               Buf[3] = 'r';\r
-       if(Attr & 0x20)\r
-               Buf[4] = 'w';\r
-       if(Attr & 0x10)\r
-               Buf[5] = 'x';\r
-\r
-       if(Attr & 0x4)\r
-               Buf[6] = 'r';\r
-       if(Attr & 0x2)\r
-               Buf[7] = 'w';\r
-       if(Attr & 0x1)\r
-               Buf[8] = 'x';\r
+       // ファイルの属性を数字で表示\r
+//     strcpy(Buf, "---------");\r
+//\r
+//     if(Attr & 0x400)\r
+//             Buf[0] = 'r';\r
+//     if(Attr & 0x200)\r
+//             Buf[1] = 'w';\r
+//     if(Attr & 0x100)\r
+//             Buf[2] = 'x';\r
+//\r
+//     if(Attr & 0x40)\r
+//             Buf[3] = 'r';\r
+//     if(Attr & 0x20)\r
+//             Buf[4] = 'w';\r
+//     if(Attr & 0x10)\r
+//             Buf[5] = 'x';\r
+//\r
+//     if(Attr & 0x4)\r
+//             Buf[6] = 'r';\r
+//     if(Attr & 0x2)\r
+//             Buf[7] = 'w';\r
+//     if(Attr & 0x1)\r
+//             Buf[8] = 'x';\r
+       if(ShowNumber == YES)\r
+       {\r
+               sprintf(Buf, "%03x", Attr);\r
+       }\r
+       else\r
+       {\r
+               strcpy(Buf, "---------");\r
+\r
+               if(Attr & 0x400)\r
+                       Buf[0] = 'r';\r
+               if(Attr & 0x200)\r
+                       Buf[1] = 'w';\r
+               if(Attr & 0x100)\r
+                       Buf[2] = 'x';\r
+\r
+               if(Attr & 0x40)\r
+                       Buf[3] = 'r';\r
+               if(Attr & 0x20)\r
+                       Buf[4] = 'w';\r
+               if(Attr & 0x10)\r
+                       Buf[5] = 'x';\r
+\r
+               if(Attr & 0x4)\r
+                       Buf[6] = 'r';\r
+               if(Attr & 0x2)\r
+                       Buf[7] = 'w';\r
+               if(Attr & 0x1)\r
+                       Buf[8] = 'x';\r
+       }\r
 \r
        return;\r
 }\r
@@ -1247,7 +1443,7 @@ void FormatIniString(char *Str)
 \r
        while(*Str != NUL)\r
        {\r
-               if((*Str != 0x22) && (*Str != '\n'))\r
+               if((*Str != '\"') && (*Str != '\n'))\r
                        *Put++ = *Str;\r
                Str++;\r
        }\r
@@ -1283,6 +1479,8 @@ int SelectFile(HWND hWnd, char *Fname, char *Title, char *Filters, char *Ext, in
        GetCurrentDirectory(FMAX_PATH, Cur);\r
 \r
        strcpy(Tmp, Fname);\r
+       // 変数が未初期化のバグ修正\r
+       memset(&OpenFile, 0, sizeof(OPENFILENAME));\r
        OpenFile.lStructSize = sizeof(OPENFILENAME);\r
        OpenFile.hwndOwner = hWnd;\r
        OpenFile.hInstance = 0;\r
@@ -1704,3 +1902,172 @@ char *MakeNumString(LONGLONG Num, char *Buf, BOOL Comma)
 }\r
 \r
 \r
+// 異なるファイルが表示されるバグ修正\r
+\r
+// ShellExecute等で使用されるファイル名を修正\r
+// UNCでない場合に末尾の半角スペースは無視されるため拡張子が補完されなくなるまで半角スペースを追加\r
+// 現在UNC対応の予定は無い\r
+char* MakeDistinguishableFileName(char* Out, char* In)\r
+{\r
+       char* Fname;\r
+       char Tmp[FMAX_PATH+1];\r
+       char Tmp2[FMAX_PATH+3];\r
+       HANDLE hFind;\r
+       WIN32_FIND_DATA Find;\r
+       if(strlen(GetFileExt(GetFileName(In))) > 0)\r
+               strcpy(Out, In);\r
+       else\r
+       {\r
+               Fname = GetFileName(In);\r
+               strcpy(Tmp, In);\r
+               strcpy(Tmp2, Tmp);\r
+               strcat(Tmp2, ".*");\r
+               while(strlen(Tmp) < FMAX_PATH && (hFind = FindFirstFile(Tmp2, &Find)) != INVALID_HANDLE_VALUE)\r
+               {\r
+                       do\r
+                       {\r
+                               if(strcmp(Find.cFileName, Fname) != 0)\r
+                                       break;\r
+                       }\r
+                       while(FindNextFile(hFind, &Find));\r
+                       FindClose(hFind);\r
+                       if(strcmp(Find.cFileName, Fname) != 0)\r
+                       {\r
+                               strcat(Tmp, " ");\r
+                               strcpy(Tmp2, Tmp);\r
+                               strcat(Tmp2, ".*");\r
+                       }\r
+                       else\r
+                               break;\r
+               }\r
+               strcpy(Out, Tmp);\r
+       }\r
+       return Out;\r
+}\r
+\r
+// 環境依存の不具合対策\r
+char* GetAppTempPath(char* Buf)\r
+{\r
+       char Temp[32];\r
+       GetTempPath(MAX_PATH, Buf);\r
+       SetYenTail(Buf);\r
+       sprintf(Temp, "ffftp%08x", GetCurrentProcessId());\r
+       strcat(Buf, Temp);\r
+       return Buf;\r
+}\r
+\r
+#if defined(HAVE_TANDEM)\r
+/*----- ファイルサイズからEXTENTサイズの計算を行う ----------------------------\r
+*\r
+*      Parameter\r
+*              LONGLONG Size : ファイルサイズ\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+void CalcExtentSize(TRANSPACKET *Pkt, LONGLONG Size)\r
+{\r
+       LONGLONG extent;\r
+\r
+       /* EXTENTS(4,28) MAXEXTENTS 978 */\r
+       if(Size < 56025088) {\r
+               Pkt->PriExt = DEF_PRIEXT;\r
+               Pkt->SecExt = DEF_SECEXT;\r
+               Pkt->MaxExt = DEF_MAXEXT;\r
+       } else {\r
+               /* 増加余地を残すため Used 75% 近辺になるように EXTENT サイズを調整) */\r
+               extent = (LONGLONG)(Size / ((DEF_MAXEXT * 0.75) * 2048LL));\r
+               /* 28未満にすると誤差でFile Fullになる可能性がある */\r
+               if(extent < 28)\r
+                       extent = 28;\r
+\r
+               Pkt->PriExt = (int)extent;\r
+               Pkt->SecExt = (int)extent;\r
+               Pkt->MaxExt = DEF_MAXEXT;\r
+       }\r
+}\r
+#endif\r
+\r
+// 高DPI対応\r
+void QueryDisplayDPI()\r
+{\r
+       HDC hDC;\r
+       if(DisplayDPIX == 0)\r
+       {\r
+               if(hDC = GetDC(NULL))\r
+               {\r
+                       DisplayDPIX = GetDeviceCaps(hDC, LOGPIXELSX);\r
+                       DisplayDPIY = GetDeviceCaps(hDC, LOGPIXELSY);\r
+                       ReleaseDC(NULL, hDC);\r
+               }\r
+       }\r
+}\r
+\r
+int CalcPixelX(int x)\r
+{\r
+       QueryDisplayDPI();\r
+       return (x * DisplayDPIX + 96 / 2) / 96;\r
+}\r
+\r
+int CalcPixelY(int y)\r
+{\r
+       QueryDisplayDPI();\r
+       return (y * DisplayDPIY + 96 / 2) / 96;\r
+}\r
+\r
+HBITMAP ResizeBitmap(HBITMAP hBitmap, int UnitSizeX, int UnitSizeY, int ScaleNumerator, int ScaleDenominator)\r
+{\r
+       HBITMAP hDstBitmap;\r
+       HDC hDC;\r
+       HDC hSrcDC;\r
+       HDC hDstDC;\r
+       BITMAP Bitmap;\r
+       HGDIOBJ hSrcOld;\r
+       HGDIOBJ hDstOld;\r
+       int Width;\r
+       int Height;\r
+       hDstBitmap = NULL;\r
+       if(hDC = GetDC(NULL))\r
+       {\r
+               if(hSrcDC = CreateCompatibleDC(hDC))\r
+               {\r
+                       if(hDstDC = CreateCompatibleDC(hDC))\r
+                       {\r
+                               if(GetObject(hBitmap, sizeof(BITMAP), &Bitmap) > 0)\r
+                               {\r
+                                       if(UnitSizeX == 0)\r
+                                               UnitSizeX = Bitmap.bmWidth;\r
+                                       if(UnitSizeY == 0)\r
+                                               UnitSizeY = Bitmap.bmHeight;\r
+                                       Width = (Bitmap.bmWidth / UnitSizeX) * CalcPixelX((UnitSizeX * ScaleNumerator) / ScaleDenominator);\r
+                                       Height = (Bitmap.bmHeight / UnitSizeY) * CalcPixelY((UnitSizeY * ScaleNumerator) / ScaleDenominator);\r
+                                       if(hDstBitmap = CreateCompatibleBitmap(hDC, Width, Height))\r
+                                       {\r
+                                               hSrcOld = SelectObject(hSrcDC, hBitmap);\r
+                                               hDstOld = SelectObject(hDstDC, hDstBitmap);\r
+                                               SetStretchBltMode(hDstDC, COLORONCOLOR);\r
+                                               StretchBlt(hDstDC, 0, 0, Width, Height, hSrcDC, 0, 0, Bitmap.bmWidth, Bitmap.bmHeight, SRCCOPY);\r
+                                               SelectObject(hSrcDC, hSrcOld);\r
+                                               SelectObject(hDstDC, hDstOld);\r
+                                       }\r
+                               }\r
+                               DeleteDC(hDstDC);\r
+                       }\r
+                       DeleteDC(hSrcDC);\r
+               }\r
+               ReleaseDC(NULL, hDC);\r
+       }\r
+       return hDstBitmap;\r
+}\r
+\r
+// ソフトウェア自動更新\r
+void DecodeLineFeed(char* Str)\r
+{\r
+       char* p;\r
+       p = Str;\r
+       while(p = strstr(p, "\\n"))\r
+       {\r
+               strncpy(p, "\r\n", 2);\r
+       }\r
+}\r
+\r