OSDN Git Service

使用しているSPIの情報をTPI_ARCHIVEINFO::TPI_FORMATINFOに格納する機能を追加。
[tpi/lychee.git] / src / plugin / xpiLibrary / xpiLibrary.cpp
index 01dad01..829e0be 100644 (file)
@@ -40,21 +40,6 @@ HMODULE g_hLib;
 TPI_PROC g_prProc;\r
 \r
 //******************************************************************************\r
-//    Entry\r
-//******************************************************************************\r
-\r
-BOOL __stdcall DllMain(HMODULE, DWORD fdwReason, void *)\r
-{\r
-       switch (fdwReason)\r
-       {\r
-       case DLL_PROCESS_DETACH:\r
-               ::FreeLibrary(g_hLib);\r
-               break;\r
-       }\r
-       return TRUE;\r
-}\r
-\r
-//******************************************************************************\r
 //    Callback Wrapper\r
 //******************************************************************************\r
 \r
@@ -139,41 +124,63 @@ int __stdcall LoadPlugin
        wxULongLong_t\r
 )\r
 {\r
+       // ファイルを開く。\r
+       wxFile hFile;\r
+       if (! hFile.Exists(_szArcName) || ! hFile.Open(_szArcName, wxFile::read))\r
+       {\r
+               return TPI_ERROR_IO_ARC_OPEN;\r
+       }\r
+\r
+       // 最初の2KBを読み込み。\r
+       char buffer[2050];\r
+       ::ZeroMemory(buffer, sizeof(buffer));\r
+       if (hFile.Read(buffer, sizeof(buffer)) == wxInvalidOffset)\r
+       {\r
+               hFile.Close();\r
+               return TPI_ERROR_IO_ARC_READ;\r
+       }\r
+       hFile.Close();\r
+\r
        wxStandardPaths p;\r
        wxString szSPIPath = wxPathOnly(p.GetExecutablePath()) + wxT("/lib/"), szSPIName;\r
        wxDir fs(szSPIPath);\r
-       bool b = fs.GetFirst(& szSPIName, wxT("*.spi"));\r
-       while (b)\r
+       if (fs.GetFirst(& szSPIName, wxT("*.spi")))\r
        {\r
-               // SPIをロード。\r
-               wxString szLibName = szSPIPath + szSPIName;\r
-               g_hLib = ::LoadLibrary(szLibName.wchar_str());\r
-               if (g_hLib == NULL)\r
+               do\r
                {\r
-                       b = fs.GetNext(& szSPIName);\r
-                       continue;\r
-               }\r
+                       // SPIをロード。\r
+                       g_hLib = ::LoadLibrary((szSPIPath + szSPIName).wchar_str());\r
+                       if (g_hLib == NULL)\r
+                       {\r
+                               continue;\r
+                       }\r
 \r
-               // GetPluginInfoを実行。\r
-               FARPROC fpProc = ::GetProcAddress(g_hLib, "GetPluginInfo");\r
-               char szPluginType[5]; // 種類4bytes + NULL\r
-               if (fpProc == NULL\r
-                       || ((int (PASCAL *)(int, char *, int)) fpProc)(0, szPluginType, sizeof(szPluginType)) <= 0\r
-                       || szPluginType[2] != 'I' || szPluginType[3] != 'N')\r
-               {\r
-                       ::FreeLibrary(g_hLib);\r
-                       b = fs.GetNext(& szSPIName);\r
-                       continue;\r
-               }\r
+                       // GetPluginInfoを実行。\r
+                       FARPROC fpProc = ::GetProcAddress(g_hLib, "GetPluginInfo");\r
+                       char szPluginType[5]; // 種類4bytes + NULL\r
+                       if (fpProc == NULL\r
+                               || ((int (PASCAL *)(int, char *, int)) fpProc)(0, szPluginType, sizeof(szPluginType)) <= 0\r
+                               || szPluginType[2] != 'I' || szPluginType[3] != 'N')\r
+                       {\r
+                               ::FreeLibrary(g_hLib);\r
+                               continue;\r
+                       }\r
 \r
-               // 書庫に対応しているかチェック。\r
-               if (CheckArchive(_szArcName, NULL) == TPI_ERROR_SUCCESS)\r
-               {\r
-                       // 対応していれば処理を終了。\r
-                       return TPI_ERROR_SUCCESS;\r
-               }\r
+                       // 書庫に対応しているかチェック。\r
+                       fpProc = ::GetProcAddress(g_hLib, "IsSupported");\r
+                       if (fpProc == NULL)\r
+                       {\r
+                               ::FreeLibrary(g_hLib);\r
+                               continue;\r
+                       }\r
 \r
-               b = fs.GetNext(& szSPIName);\r
+                       if (((BOOL (PASCAL *)(const char *, unsigned long)) fpProc)(_szArcName.ToUTF8(), (unsigned long) buffer))\r
+                       {\r
+                               // 対応していれば処理を終了。\r
+                               return TPI_ERROR_SUCCESS;\r
+                       }\r
+               }\r
+               while (fs.GetNext(& szSPIName));\r
        }\r
        return TPI_ERROR_U_LOAD_LIBRARY;\r
 }\r
@@ -187,51 +194,11 @@ int __stdcall FreePlugin
        return TPI_ERROR_SUCCESS;\r
 }\r
 \r
-int __stdcall CheckArchive\r
-(\r
-       const wxString & _szArcName,\r
-       wxULongLong_t * _llFileCount\r
-)\r
-{\r
-       FARPROC fpProc = ::GetProcAddress(g_hLib, "IsSupported");\r
-       if (fpProc == NULL)\r
-       {\r
-               return TPI_ERROR_U_USE_LIBRARY;\r
-       }\r
-\r
-       wxFile hFile(_szArcName, wxFile::read);\r
-       if (! hFile.IsOpened())\r
-       {\r
-               return TPI_ERROR_IO_ARC_OPEN;\r
-       }\r
-\r
-       char buffer[2050];\r
-       ::ZeroMemory(buffer, sizeof(buffer));\r
-       if (hFile.Read(buffer, sizeof(buffer)) == wxInvalidOffset)\r
-       {\r
-               hFile.Close();\r
-               return TPI_ERROR_IO_ARC_READ;\r
-       }\r
-\r
-       if (! ((BOOL (PASCAL *)(const char *, unsigned long)) fpProc)(_szArcName.ToUTF8(), (unsigned long) buffer))\r
-       {\r
-               hFile.Close();\r
-               return TPI_ERROR_D_UNSUPPORTED;\r
-       }\r
-       hFile.Close();\r
-\r
-       if (_llFileCount != NULL)\r
-       {\r
-               * _llFileCount = 1;\r
-       }\r
-\r
-       return TPI_ERROR_SUCCESS;\r
-}\r
-\r
 int __stdcall OpenArchive\r
 (\r
        const wxString & _szArcName,\r
-       void * * _hArchive\r
+       void * * _hArchive,\r
+       wxULongLong_t *\r
 )\r
 {\r
        * _hArchive = new wxString(_szArcName);\r
@@ -285,8 +252,7 @@ int __stdcall GetFileInformation
                do\r
                {\r
                        // XPIをロード。\r
-                       wxString szLibName = szXPIPath + szXPIName;\r
-                       HMODULE hXPI = ::LoadLibrary(szLibName.wchar_str());\r
+                       HMODULE hXPI = ::LoadLibrary((szXPIPath + szXPIName).wchar_str());\r
                        if (hXPI == NULL)\r
                        {\r
                                continue;\r
@@ -294,16 +260,29 @@ int __stdcall GetFileInformation
 \r
                        // GetPluginInfoを実行。\r
                        FARPROC fpProc = ::GetProcAddress(hXPI, "GetPluginInfo");\r
-                       char szTemp[20];\r
+                       char szTemp[513];\r
+                       memset(szTemp, 0, sizeof(szTemp));\r
                        if (fpProc == NULL\r
-                               || ((int (PASCAL *)(int, char *, int)) fpProc)(0, szTemp, sizeof(szTemp)) <= 0\r
-                               || szTemp[2] != 'X' || szTemp[3] != 'N'\r
-                               || ((int (PASCAL *)(int, char *, int)) fpProc)(2, szTemp, sizeof(szTemp)) <= 0)\r
+                               || ((int (PASCAL *)(int, char *, int)) fpProc)(0, szTemp, sizeof(szTemp) - 1) <= 0\r
+                               || szTemp[2] != 'X' || szTemp[3] != 'N')\r
                        {\r
                                ::FreeLibrary(hXPI);\r
                                continue;\r
                        }\r
 \r
+                       _fiInfo->fnFileName = wxFileName(szArcName);\r
+                       _fiInfo->fnFileName.SetVolume(wxEmptyString);\r
+                       _fiInfo->fnFileName.SetPath(szXPIName);\r
+                       if (((int (PASCAL *)(int, char *, int)) fpProc)(1, szTemp, sizeof(szTemp) - 1) > 0)\r
+                       {\r
+                               _fiInfo->szComment = MB2String(szTemp);\r
+                       }\r
+                       if (((int (PASCAL *)(int, char *, int)) fpProc)(2, szTemp, sizeof(szTemp) - 1) > 0)\r
+                       {\r
+                               _fiInfo->fnFileName.SetExt(MB2String(szTemp));\r
+                       }\r
+                       _fiInfo->szStoredName = _fiInfo->fnFileName.GetFullPath();\r
+\r
                        // 対応確認。\r
                        fpProc = ::GetProcAddress(hXPI, "IsSupported");\r
                        if (fpProc == NULL || ! ((BOOL (PASCAL *)(int)) fpProc)(nColorDepth))\r
@@ -311,12 +290,6 @@ int __stdcall GetFileInformation
                                ::FreeLibrary(hXPI);\r
                                continue;\r
                        }\r
-\r
-                       _fiInfo->fnFileName = wxFileName(szArcName);\r
-                       _fiInfo->fnFileName.SetVolume(wxEmptyString);\r
-                       _fiInfo->fnFileName.SetPath(szXPIName);\r
-                       _fiInfo->fnFileName.SetExt(MB2String(szTemp));\r
-                       _fiInfo->szStoredName = _fiInfo->fnFileName.GetFullPath();\r
                        return TPI_ERROR_SUCCESS;\r
                }\r
                while (fs.GetNext(& szXPIName));\r
@@ -350,12 +323,17 @@ int __stdcall GetArchiveInformation
        fpProc = ::GetProcAddress(g_hLib, "GetPluginInfo");\r
        if (fpProc != NULL)\r
        {\r
-               char szTemp[20];\r
-               if (((int (PASCAL *)(int, char *, int)) fpProc)(2, szTemp, sizeof(szTemp)) > 0)\r
+               char szTemp[513];\r
+               memset(szTemp, 0, sizeof(szTemp));\r
+               if (((int (PASCAL *)(int, char *, int)) fpProc)(1, szTemp, sizeof(szTemp) - 1) > 0)\r
+               {\r
+                       _aiInfo->fiInfo.szEngineName = MB2String(szTemp);\r
+               }\r
+               if (((int (PASCAL *)(int, char *, int)) fpProc)(2, szTemp, sizeof(szTemp) - 1) > 0)\r
                {\r
                        _aiInfo->fiInfo.szSuffix = MB2String(szTemp);\r
                }\r
-               if (((int (PASCAL *)(int, char *, int)) fpProc)(3, szTemp, sizeof(szTemp)) > 0)\r
+               if (((int (PASCAL *)(int, char *, int)) fpProc)(3, szTemp, sizeof(szTemp) - 1) > 0)\r
                {\r
                        _aiInfo->fiInfo.szTypeName = MB2String(szTemp);\r
                }\r
@@ -421,10 +399,32 @@ int __stdcall Command
                return nErrorCode;\r
        }\r
 \r
+       wxString szXPIPath;\r
+       {\r
+               wxStandardPaths p;\r
+               szXPIPath = wxPathOnly(p.GetExecutablePath()) + wxT("/lib/");\r
+       }\r
+\r
        for (size_t i = 0; i < _asFiles.GetCount(); i++)\r
        {\r
+               // 処理を行うか確認。\r
+               piInfo.eMessage = TPI_MESSAGE_ASK;\r
+               piInfo.eStatus = TPI_PARAM_DEST;\r
+               piInfo.fiInfo.fnFileName = wxFileName(_asFiles[i]);\r
+               piInfo.fnDestination = piInfo.fiInfo.fnFileName;\r
+               piInfo.fnDestination.SetPath(_swInfo->fnDestinationDirectory.GetPath());\r
+               if (CallbackProc(0, 0, (long) & piInfo))\r
+               {\r
+                       nErrorCode = TPI_ERROR_D_SKIPPED;\r
+                       break;\r
+               }\r
+               if (! piInfo.fnDestination.IsOk())\r
+               {\r
+                       continue;\r
+               }\r
+\r
                // XPIをロード。\r
-               HMODULE hXPI = ::LoadLibrary(wxFileName(_asFiles[i]).GetPath().wchar_str());\r
+               HMODULE hXPI = ::LoadLibrary((szXPIPath + piInfo.fiInfo.fnFileName.GetPath()).wchar_str());\r
                if (hXPI == NULL)\r
                {\r
                        nErrorCode = TPI_ERROR_U_USE_LIBRARY;\r
@@ -443,10 +443,8 @@ int __stdcall Command
                }\r
 \r
                // コールバックを送信。\r
+               piInfo.eMessage = TPI_MESSAGE_STATUS;\r
                piInfo.eStatus = TPI_STATUS_BEGINPROCESS;\r
-               piInfo.fiInfo.fnFileName = wxFileName(_asFiles[i]);\r
-               piInfo.fnDestination = piInfo.fiInfo.fnFileName;\r
-               piInfo.fnDestination.SetPath(_swInfo->fnDestinationDirectory.GetPath());\r
                if (CallbackProc(0, 0, (long) & piInfo))\r
                {\r
                        ::FreeLibrary(hXPI);\r
@@ -486,6 +484,7 @@ int __stdcall Command
        }\r
 \r
        // 最終のコールバック。\r
+       piInfo.eMessage = TPI_MESSAGE_STATUS;\r
        piInfo.eStatus  = TPI_STATUS_CLOSEARCHIVE;\r
        piInfo.fiInfo.fnFileName = _fnArcName;\r
        if (CallbackProc(0, 0, (long) & piInfo))\r