OSDN Git Service

使用しているSPIの情報をTPI_ARCHIVEINFO::TPI_FORMATINFOに格納する機能を追加。
[tpi/lychee.git] / src / plugin / spiLibrary / spiLibrary.cpp
index 32ca549..f37316a 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
@@ -134,6 +119,23 @@ 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
@@ -160,7 +162,14 @@ int __stdcall LoadPlugin
                        }\r
 \r
                        // 書庫に対応しているかチェック。\r
-                       if (CheckArchive(_szArcName, NULL) == TPI_ERROR_SUCCESS)\r
+                       fpProc = ::GetProcAddress(g_hLib, "IsSupported");\r
+                       if (fpProc == NULL)\r
+                       {\r
+                               ::FreeLibrary(g_hLib);\r
+                               continue;\r
+                       }\r
+\r
+                       if (((BOOL (PASCAL *)(const char *, unsigned long)) fpProc)(_szArcName.ToUTF8(), (unsigned long) buffer))\r
                        {\r
                                // 対応していれば処理を終了。\r
                                return TPI_ERROR_SUCCESS;\r
@@ -180,63 +189,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
-       fpProc = ::GetProcAddress(g_hLib, "GetArchiveInfo");\r
-       if (fpProc == NULL)\r
-       {\r
-               return TPI_ERROR_U_USE_LIBRARY;\r
-       }\r
-\r
-       HLOCAL hMemory;\r
-       int nReturnCode = ErrorCodeConvert(((int (PASCAL *)(const char *, long, unsigned int, HLOCAL *)) fpProc)(_szArcName.ToUTF8(), 0, 0, & hMemory));\r
-       if (nReturnCode == TPI_ERROR_SUCCESS)\r
-       {\r
-               if (_llFileCount != NULL)\r
-               {\r
-                       * _llFileCount = ::LocalSize(hMemory) / sizeof(fileInfo);\r
-               }\r
-               ::LocalFree(hMemory);\r
-       }\r
-\r
-       return nReturnCode;\r
-}\r
-\r
 int __stdcall OpenArchive\r
 (\r
        const wxString & _szArcName,\r
-       void * * _hArchive\r
+       void * * _hArchive,\r
+       wxULongLong_t * _nFileCount\r
 )\r
 {\r
        FARPROC fpProc = ::GetProcAddress(g_hLib, "GetArchiveInfo");\r
@@ -250,7 +207,10 @@ int __stdcall OpenArchive
        {\r
                return nReturnCode;\r
        }\r
-\r
+       if (_nFileCount != NULL)\r
+       {\r
+               * _nFileCount = ::LocalSize(* _hArchive) / sizeof(fileInfo);\r
+       }\r
        return * _hArchive == NULL ? TPI_ERROR_IO_ARC_OPEN : nReturnCode;\r
 }\r
 \r
@@ -316,12 +276,17 @@ int __stdcall GetArchiveInformation
        FARPROC 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
@@ -378,38 +343,42 @@ int __stdcall Command
        {\r
                do\r
                {\r
-                       // コールバックを送信。\r
-                       piInfo.eStatus = TPI_STATUS_BEGINPROCESS;\r
+                       // 処理対象かどうか判定。\r
+                       if ((! _szFiles.IsEmpty()) && _szFiles.Index(piInfo.fiInfo.szStoredName) == wxNOT_FOUND)\r
+                       {\r
+                               continue;\r
+                       }\r
+\r
+                       // 処理を行うか確認。\r
+                       piInfo.eMessage = TPI_MESSAGE_ASK;\r
+                       piInfo.eStatus = TPI_PARAM_DEST;\r
+                       piInfo.fnDestination = wxFileName(_swInfo->fnDestinationDirectory.GetPathWithSep() + (_swInfo->fStoreDirectoryPathes ? piInfo.fiInfo.fnFileName.GetFullPath() : piInfo.fiInfo.fnFileName.GetFullName()));\r
                        if (CallbackProc(0, 0, (long) & piInfo))\r
                        {\r
                                nErrorCode = TPI_ERROR_D_SKIPPED;\r
                                break;\r
                        }\r
-                       piInfo.eStatus = TPI_STATUS_INPROCESS;\r
-\r
-                       // 処理対象かどうか判定。\r
-                       if ((! _szFiles.IsEmpty()) && _szFiles.Index(piInfo.fiInfo.szStoredName) == wxNOT_FOUND)\r
+                       if (! piInfo.fnDestination.IsOk())\r
                        {\r
                                continue;\r
                        }\r
 \r
-                       // 出力名作成。\r
-                       wxString szTargetPath = _swInfo->fnDestinationDirectory.GetPathWithSep();\r
-                       if (_swInfo->fStoreDirectoryPathes)\r
+                       // 出力先作成。\r
+                       if (! piInfo.fnDestination.Mkdir(0777, wxPATH_MKDIR_FULL))\r
                        {\r
-                               // 展開先ディレクトリを作成。\r
-                               szTargetPath += piInfo.fiInfo.fnFileName.GetFullPath();\r
-                               wxFileName fnDest(szTargetPath);\r
-                               if (! fnDest.Mkdir(0777, wxPATH_MKDIR_FULL) || ::wxDirExists(fnDest.GetFullPath()))\r
-                               {\r
-                                       nErrorCode = TPI_ERROR_IO_DIR_WRITE;\r
-                                       break;\r
-                               }\r
+                               nErrorCode = TPI_ERROR_IO_DIR_WRITE;\r
+                               break;\r
                        }\r
-                       else\r
+\r
+                       // コールバックを送信。\r
+                       piInfo.eMessage = TPI_MESSAGE_STATUS;\r
+                       piInfo.eStatus = TPI_STATUS_BEGINPROCESS;\r
+                       if (CallbackProc(0, 0, (long) & piInfo))\r
                        {\r
-                               szTargetPath += piInfo.fiInfo.fnFileName.GetFullName();\r
+                               nErrorCode = TPI_ERROR_D_SKIPPED;\r
+                               break;\r
                        }\r
+                       piInfo.eStatus = TPI_STATUS_INPROCESS;\r
 \r
                        // ファイル出力には対応してないのでメモリ出力で代行。\r
                        HLOCAL hMemory = NULL;\r
@@ -425,8 +394,7 @@ int __stdcall Command
 \r
                        // 展開先に出力。\r
                        wxFile hFile;\r
-                       // 強制上書きするので注意。\r
-                       if (! hFile.Create(szTargetPath, true))\r
+                       if (! hFile.Create(piInfo.fnDestination.GetFullPath()))\r
                        {\r
                                nErrorCode = TPI_ERROR_IO_FILE_OPEN;\r
                                break;\r