OSDN Git Service

複数のXPIに対応するよう変更。
authorsirakaba <sirakaba@9df91469-1e22-0410-86e7-ea8537beb833>
Sun, 22 Nov 2009 12:56:09 +0000 (12:56 +0000)
committersirakaba <sirakaba@9df91469-1e22-0410-86e7-ea8537beb833>
Sun, 22 Nov 2009 12:56:09 +0000 (12:56 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/tpi/tpi@153 9df91469-1e22-0410-86e7-ea8537beb833

src/plugin/xpiLibrary/xpiLibrary.cpp

index 1e1a968..133ee95 100644 (file)
@@ -159,7 +159,7 @@ int __stdcall LoadPlugin
                FARPROC fpProc = ::GetProcAddress(g_hLib, "GetPluginInfo");\r
                char szPluginType[5]; // \8eí\97Þ4bytes + NULL\r
                if (fpProc == NULL\r
-                       || ((int (PASCAL *)(int, char *, int)) fpProc)(0, szPluginType, sizeof(szPluginType)) < 0\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
@@ -256,18 +256,81 @@ int __stdcall GetFileInformation
        bool _bFirst\r
 )\r
 {\r
-       if (! _bFirst)\r
+       static wxString szXPIPath, szXPIName, szArcName = * (wxString *) _hArchive;\r
+       static int nColorDepth;\r
+       static wxDir fs;\r
+       bool b;\r
+       if (_bFirst)\r
        {\r
-               return TPI_ERROR_S_ENDOFDATA;\r
+               wxStandardPaths p;\r
+               szXPIPath = wxPathOnly(p.GetExecutablePath()) + wxT("/lib/");\r
+               fs.Open(szXPIPath);\r
+\r
+               // \89æ\91\9c\82Ì\8fî\95ñ\82ð\8eæ\93¾\81B\r
+               FARPROC fpProc = ::GetProcAddress(g_hLib, "GetPictureInfo");\r
+               if (fpProc == NULL)\r
+               {\r
+                       return TPI_ERROR_U_USE_LIBRARY;\r
+               }\r
+               PictureInfo picInfo;\r
+               int nErrorCode = ErrorCodeConvert(((int (PASCAL *)(const char *, long, unsigned int, PictureInfo *)) fpProc)(szArcName.ToUTF8(), 0, 0, & picInfo));\r
+               if (nErrorCode != TPI_ERROR_SUCCESS)\r
+               {\r
+                       return nErrorCode;\r
+               }\r
+               nColorDepth = picInfo.colorDepth;\r
+               ::LocalUnlock(picInfo.hInfo);\r
+               ::LocalFree(picInfo.hInfo);\r
+\r
+               b = fs.GetFirst(& szXPIName, wxT("*.xpi"));\r
+       }\r
+       else\r
+       {\r
+               b = fs.GetNext(& szXPIName);\r
        }\r
+       while (b)\r
+       {\r
+               // XPI\82ð\83\8d\81[\83h\81B\r
+               wxString szLibName = szXPIPath + szXPIName;\r
+               HMODULE hXPI = ::LoadLibrary(szLibName.wchar_str());\r
+               if (hXPI == NULL)\r
+               {\r
+                       b = fs.GetNext(& szXPIName);\r
+                       continue;\r
+               }\r
+\r
+               // GetPluginInfo\82ð\8eÀ\8ds\81B\r
+               FARPROC fpProc = ::GetProcAddress(hXPI, "GetPluginInfo");\r
+               char szTemp[20];\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
+               {\r
+                       ::FreeLibrary(hXPI);\r
+                       b = fs.GetNext(& szXPIName);\r
+                       continue;\r
+               }\r
 \r
-       _fiInfo->fnFileName     = wxFileName(* (wxString *) _hArchive);\r
-       _fiInfo->fnFileName.SetVolume(wxEmptyString);\r
-       _fiInfo->fnFileName.SetPath(wxEmptyString);\r
-       _fiInfo->fnFileName.SetExt(wxT("bmp"));\r
-       _fiInfo->szStoredName   = _fiInfo->fnFileName.GetFullPath();\r
+               // \91Î\89\9e\8am\94F\81B\r
+               fpProc = ::GetProcAddress(hXPI, "IsSupported");\r
+               if (fpProc == NULL || ! ((BOOL (PASCAL *)(int)) fpProc)(nColorDepth))\r
+               {\r
+                       ::FreeLibrary(hXPI);\r
+                       b = fs.GetNext(& szXPIName);\r
+                       continue;\r
+               }\r
 \r
-       return TPI_ERROR_SUCCESS;\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
+\r
+               return TPI_ERROR_SUCCESS;\r
+       }\r
+\r
+       return TPI_ERROR_S_ENDOFDATA;\r
 }\r
 \r
 int __stdcall GetArchiveInformation\r
@@ -318,7 +381,7 @@ int __stdcall Command
        unsigned int _uCommand,\r
        TPI_SWITCHES * _swInfo,\r
        const wxString & _szArcName,\r
-       const wxArrayString &\r
+       const wxArrayString & _asFiles\r
 )\r
 {\r
        if (_uCommand != TPI_COMMAND_EXTRACT)\r
@@ -339,13 +402,6 @@ int __stdcall Command
                return nErrorCode;\r
        }\r
 \r
-       // \93W\8aJ\8f\88\97\9d\82Ì\82Ý\82ð\8ds\82¤\81B\r
-       fpProc = ::GetProcAddress(g_hLib, "GetPicture");\r
-       if (fpProc == NULL)\r
-       {\r
-               return TPI_ERROR_U_USE_LIBRARY;\r
-       }\r
-\r
        // \83R\81[\83\8b\83o\83b\83N\82ð\91\97\90M\81B\r
        wxFileName _fnArcName(_szArcName);\r
        TPI_PROCESSINFO piInfo;\r
@@ -357,19 +413,13 @@ int __stdcall Command
                return TPI_ERROR_D_SKIPPED;\r
        }\r
 \r
-       // \83\81\83\82\83\8a\8fo\97Í\81B\r
+       // \83\81\83\82\83\8a\8fã\82É\93W\8aJ\81B\r
        HANDLE hInfo, hMemory;\r
-       // \8fo\97Í\96¼\8dì\90¬\81B\r
-       piInfo.uStatus  = TPI_STATUS_BEGINPROCESS;\r
-       piInfo.fnDestination = _fnArcName;\r
-       piInfo.fnDestination.SetPath(_swInfo->fnDestinationDirectory.GetPath());\r
-       piInfo.fnDestination.SetExt(wxT("bmp"));\r
-       piInfo.fiInfo.fnFileName = wxFileName(piInfo.fnDestination.GetFullName());\r
-       if (CallbackProc(0, 0, (long) & piInfo))\r
+       fpProc = ::GetProcAddress(g_hLib, "GetPicture");\r
+       if (fpProc == NULL)\r
        {\r
-               return TPI_ERROR_D_SKIPPED;\r
+               return TPI_ERROR_U_USE_LIBRARY;\r
        }\r
-       piInfo.uStatus  = TPI_STATUS_INPROCESS;\r
        nErrorCode = ErrorCodeConvert(((int (PASCAL *)(const char *, long, unsigned int, HANDLE *, HANDLE *, FARPROC, long)) fpProc)(_szArcName.ToUTF8(), 0, 0, & hInfo, & hMemory, (FARPROC) CallbackProc, (long) & piInfo));\r
        if (nErrorCode == TPI_ERROR_SUCCESS && (hMemory == NULL || hInfo == NULL))\r
        {\r
@@ -380,45 +430,71 @@ int __stdcall Command
                return nErrorCode;\r
        }\r
 \r
-       // XPI\82ð\93Ç\82Ý\8d\9e\82Þ\81B\r
-       wxStandardPaths p;\r
-       wxString szXPIPath = wxPathOnly(p.GetExecutablePath()) + wxT("/lib/exbmp.xpi");\r
-       HMODULE hXPI = ::LoadLibrary(szXPIPath.wchar_str());\r
-       if (hXPI == NULL)\r
+       for (size_t i = 0; i < _asFiles.GetCount(); i++)\r
        {\r
-               return TPI_ERROR_U_USE_LIBRARY;\r
-       }\r
+               // XPI\82ð\83\8d\81[\83h\81B\r
+               HMODULE hXPI = ::LoadLibrary(wxFileName(_asFiles[i]).GetPath().wchar_str());\r
+               if (hXPI == NULL)\r
+               {\r
+                       nErrorCode = TPI_ERROR_U_USE_LIBRARY;\r
+                       break;\r
+               }\r
 \r
-       // \91Î\89\9e\8am\94F\81B\r
-       fpProc = ::GetProcAddress(hXPI, "IsSupported");\r
-       if (fpProc == NULL)\r
-       {\r
-               return TPI_ERROR_U_USE_LIBRARY;\r
-       }\r
-       if (! ErrorCodeConvert(((BOOL (PASCAL *)(int)) fpProc)(picInfo.colorDepth)))\r
-       {\r
-               return TPI_ERROR_ARC_UNSUPPORTED;\r
-       }\r
+               // GetPluginInfo\82ð\8eÀ\8ds\81B\r
+               FARPROC fpProc = ::GetProcAddress(hXPI, "GetPluginInfo");\r
+               char szTemp[20];\r
+               if (fpProc == NULL\r
+                       || ((int (PASCAL *)(int, char *, int)) fpProc)(2, szTemp, sizeof(szTemp)) <= 0)\r
+               {\r
+                       ::FreeLibrary(hXPI);\r
+                       nErrorCode = TPI_ERROR_U_USE_LIBRARY;\r
+                       break;\r
+               }\r
 \r
-       // \8f\91\82«\8d\9e\82Ý\81B\r
-       fpProc = ::GetProcAddress(hXPI, "CreatePicture");\r
-       if (fpProc == NULL)\r
-       {\r
-               return TPI_ERROR_U_USE_LIBRARY;\r
+               // \83R\81[\83\8b\83o\83b\83N\82ð\91\97\90M\81B\r
+               piInfo.uStatus = 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
+                       nErrorCode = TPI_ERROR_D_SKIPPED;\r
+                       break;\r
+               }\r
+\r
+               // \8f\91\82«\8d\9e\82Ý\81B\r
+               piInfo.uStatus = TPI_STATUS_INPROCESS;\r
+               fpProc = ::GetProcAddress(hXPI, "CreatePicture");\r
+               if (fpProc == NULL)\r
+               {\r
+                       ::FreeLibrary(hXPI);\r
+                       nErrorCode = TPI_ERROR_U_USE_LIBRARY;\r
+                       break;\r
+               }\r
+               nErrorCode = ErrorCodeConvert(((int (PASCAL *)(const char *, long, HANDLE *, HANDLE *, PictureInfo *, FARPROC, long)) fpProc)(piInfo.fnDestination.GetFullPath().ToUTF8(), 0, & hInfo, & hMemory, & picInfo, (FARPROC) CallbackProc, (long) & piInfo));\r
+               ::FreeLibrary(hXPI);\r
+\r
+               // \8dÅ\8cã\82É\83R\81[\83\8b\83o\83b\83N\82ð\91\97\90M\81B\r
+               piInfo.uStatus  = TPI_STATUS_ENDPROCESS;\r
+               if (CallbackProc(0, 0, (long) & piInfo))\r
+               {\r
+                       nErrorCode = TPI_ERROR_D_SKIPPED;\r
+                       break;\r
+               }\r
        }\r
-       nErrorCode = ErrorCodeConvert(((int (PASCAL *)(const char *, long, HANDLE *, HANDLE *, PictureInfo *, FARPROC, long)) fpProc)(piInfo.fnDestination.GetFullPath().ToUTF8(), 0, & hInfo, & hMemory, & picInfo, (FARPROC) CallbackProc, (long) & piInfo));\r
        ::LocalUnlock(hInfo);\r
        ::LocalUnlock(hMemory);\r
+       ::LocalUnlock(picInfo.hInfo);\r
        ::LocalFree(hInfo);\r
        ::LocalFree(hMemory);\r
-       ::FreeLibrary(hXPI);\r
-\r
-       // \8dÅ\8cã\82É\83R\81[\83\8b\83o\83b\83N\82ð\91\97\90M\81B\r
-       piInfo.uStatus  = TPI_STATUS_ENDPROCESS;\r
-       if (CallbackProc(0, 0, (long) & piInfo))\r
+       ::LocalFree(picInfo.hInfo);\r
+       if (nErrorCode != TPI_ERROR_SUCCESS)\r
        {\r
-               return TPI_ERROR_D_SKIPPED;\r
+               return nErrorCode;\r
        }\r
+\r
+       // \8dÅ\8fI\82Ì\83R\81[\83\8b\83o\83b\83N\81B\r
        piInfo.uStatus  = TPI_STATUS_CLOSEARCHIVE;\r
        piInfo.fiInfo.fnFileName = _fnArcName;\r
        if (CallbackProc(0, 0, (long) & piInfo))\r
@@ -426,7 +502,7 @@ int __stdcall Command
                return TPI_ERROR_D_SKIPPED;\r
        }\r
 \r
-       return nErrorCode;\r
+       return TPI_ERROR_SUCCESS;\r
 }\r
 \r
 int __stdcall SetCallbackProc\r