--- /dev/null
+/*******************************************************************************\r
+ TPI - flexible but useless plug-in framework.\r
+ Copyright (C) 2002-2009 Silky\r
+\r
+ This library is free software; you can redistribute it and/or modify it under\r
+ the terms of the GNU Lesser General Public License as published by the Free\r
+ Software Foundation; either version 2.1 of the License, or (at your option)\r
+ any later version.\r
+\r
+ This library is distributed in the hope that it will be useful, but WITHOUT\r
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or \r
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License\r
+ for more details.\r
+\r
+ You should have received a copy of the GNU Lesser General Public License along\r
+ with this library; if not, write to the Free Software Foundation, Inc.,\r
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\r
+\r
+ $Id$\r
+*******************************************************************************/\r
+\r
+//******************************************************************************\r
+// Includes\r
+//******************************************************************************\r
+\r
+#include "../../common/header/plugin.h"\r
+#include "../../common/header/plugin-extra.h"\r
+#include "../../common/library/library.h"\r
+#include <wx/file.h>\r
+#include <wx/stdpaths.h>\r
+#include <wx/dir.h>\r
+#include <windows.h>\r
+#include "xpiLibrary.h"\r
+\r
+//******************************************************************************\r
+// Global varients\r
+//******************************************************************************\r
+\r
+HMODULE g_hLib;\r
+TPI_PROC g_prProc;\r
+wxString g_szArcName;\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
+int __stdcall CallbackProc(int _nNow, int _nMax, long _lData)\r
+{\r
+ // \8d\\91¢\91Ì\82ð\8f\89\8aú\89»\81B\r
+ TPI_PROCESSINFO piInfo;\r
+ piInfo.uMessage = TPI_MESSAGE_STATUS;\r
+ piInfo.uStatus = _nNow == 0 ? TPI_STATUS_BEGINPROCESS\r
+ : _nNow == _nMax ? TPI_STATUS_ENDPROCESS\r
+ : _nNow < 0 ? TPI_STATUS_OPENARCHIVE : TPI_STATUS_INPROCESS;\r
+ piInfo.llProcessedSize = _nNow;\r
+ piInfo.fiInfo.llUnpackedSize = _nMax;\r
+// piInfo.fiInfo.fnFileName = * (wxFileName *) _lData;\r
+\r
+ // \83R\81[\83\8b\83o\83b\83N\8aÖ\90\94\82É\91\97\90M\81B\r
+ return g_prProc != NULL && g_prProc(TPI_NOTIFY_COMMON, & piInfo) == TPI_CALLBACK_CANCEL;\r
+}\r
+\r
+//******************************************************************************\r
+// Inside Functions\r
+//******************************************************************************\r
+\r
+int XpiErrorCodeConvert(int nXpiErrorCode)\r
+{\r
+ switch (nXpiErrorCode)\r
+ { \r
+ case -1:case XPI_NO_FUNCTION: return TPI_ERROR_U_USE_LIBRARY;\r
+ case 0: return TPI_ERROR_SUCCESS;\r
+ case 1: case XPI_ABORT: return TPI_ERROR_D_SKIPPED;\r
+ case 2: case XPI_NOT_SUPPRORT: return TPI_ERROR_ARC_UNSUPPORTED;\r
+ case 3: case XPI_OUT_OF_ORDER: return TPI_ERROR_ARC_BROKEN_MISC;\r
+ case 4: case XPI_NO_MEMORY: return TPI_ERROR_D_OUTOFMEMORY;\r
+ case 5: case XPI_MEMORY_ERROR: return TPI_ERROR_D_USEMEMORY;\r
+ case 6: case XPI_FILE_READ_ERROR: return TPI_ERROR_IO_ARC_READ;\r
+ case XPI_OTHER_ERROR: return TPI_ERROR_UNDEFINED;\r
+ case XPI_WINDOW_ERROR: return TPI_ERROR_UNDEFINED;\r
+ case XPI_FILE_WRITE_ERROR: return TPI_ERROR_IO_FILE_WRITE;\r
+ case XPI_END_OF_FILE: return TPI_ERROR_ARC_BROKEN_MISC;\r
+ default: return TPI_ERROR_UNDEFINED;\r
+ }\r
+}\r
+\r
+//******************************************************************************\r
+// Functions\r
+//******************************************************************************\r
+\r
+#ifdef __cplusplus\r
+extern "C"\r
+{\r
+#endif\r
+\r
+int __stdcall GetPluginInformation\r
+(\r
+ unsigned int _uInfoId,\r
+ wxULongLong,\r
+ void * _pPtr\r
+)\r
+{\r
+ if (_pPtr == NULL)\r
+ {\r
+ return TPI_ERROR_D_PARAMETER;\r
+ }\r
+ switch (_uInfoId)\r
+ {\r
+ case TPI_INFO_VERSION_MAJOR:\r
+ case TPI_INFO_VERSION_MINOR:\r
+ * (int *) _pPtr = 0;\r
+ break;\r
+ case TPI_INFO_VERSION_API:\r
+ * (int *) _pPtr = 2;\r
+ break;\r
+ default:\r
+ return TPI_ERROR_D_PARAMETER;\r
+ }\r
+ return TPI_ERROR_SUCCESS;\r
+}\r
+\r
+int __stdcall GetFormatInformation(TPI_FORMATINFO *, bool)\r
+{\r
+ return TPI_ERROR_D_UNSUPPORTED;\r
+}\r
+\r
+int __stdcall LoadPlugin\r
+(\r
+ const wxString & _szArcName,\r
+ wxULongLong _llSubOption\r
+)\r
+{\r
+ wxStandardPaths p;\r
+ wxString szSPIPath = wxPathOnly(p.GetExecutablePath()) + wxT("/lib/"), szSPIName;\r
+ wxDir fs(szSPIPath);\r
+\r
+ bool b = fs.GetFirst(& szSPIName, wxT("*.spi"));\r
+ while (b)\r
+ {\r
+ // SPI\82ð\83\8d\81[\83h\81B\r
+ wxString szLibName = szSPIPath + szSPIName;\r
+ g_hLib = ::LoadLibrary(szLibName.wchar_str());\r
+ if (g_hLib == NULL)\r
+ {\r
+ b = fs.GetNext(& szSPIName);\r
+ continue;\r
+ }\r
+\r
+ // GetPluginInfo\82ð\8eÀ\8ds\81B\r
+ 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
+ || szPluginType[2] != 'I' || szPluginType[3] != 'N')\r
+ {\r
+ ::FreeLibrary(g_hLib);\r
+ b = fs.GetNext(& szSPIName);\r
+ continue;\r
+ }\r
+\r
+ // \8f\91\8cÉ\82É\91Î\89\9e\82µ\82Ä\82¢\82é\82©\83`\83F\83b\83N\81B\r
+ if (CheckArchive(_szArcName, NULL) == TPI_ERROR_SUCCESS)\r
+ {\r
+ // \91Î\89\9e\82µ\82Ä\82¢\82ê\82Î\8f\88\97\9d\82ð\8fI\97¹\81B\r
+ return TPI_ERROR_SUCCESS;\r
+ }\r
+\r
+ b = fs.GetNext(& szSPIName);\r
+ }\r
+ return TPI_ERROR_U_LOAD_LIBRARY;\r
+}\r
+\r
+int __stdcall FreePlugin\r
+(\r
+ void * // _pReserved\r
+)\r
+{\r
+ ::FreeLibrary(g_hLib);\r
+ return TPI_ERROR_SUCCESS;\r
+}\r
+\r
+int __stdcall CheckArchive\r
+(\r
+ const wxString & _szArcName,\r
+ int * _nFileCount\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 (_nFileCount != NULL)\r
+ {\r
+ * _nFileCount = 1;\r
+ }\r
+\r
+ return TPI_ERROR_SUCCESS;\r
+}\r
+\r
+int __stdcall OpenArchive\r
+(\r
+ const wxString & _szArcName,\r
+ void * * _hArchive\r
+)\r
+{\r
+ g_szArcName = _szArcName;\r
+ * _hArchive = & g_szArcName;\r
+ return TPI_ERROR_SUCCESS;\r
+}\r
+\r
+int __stdcall CloseArchive\r
+(\r
+ void * _hArchive\r
+)\r
+{\r
+ g_szArcName.Clear();\r
+ return TPI_ERROR_SUCCESS;\r
+}\r
+\r
+int __stdcall GetFileInformation\r
+(\r
+ void * _hArchive,\r
+ TPI_FILEINFO * _fiInfo,\r
+ bool _bFirst\r
+)\r
+{\r
+ if (! _bFirst)\r
+ {\r
+ return TPI_ERROR_S_ENDOFDATA;\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
+\r
+ return TPI_ERROR_SUCCESS;\r
+}\r
+\r
+int __stdcall GetArchiveInformation\r
+(\r
+ void * _hArchive,\r
+ TPI_ARCHIVEINFO * _aiInfo\r
+)\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 piInfo;\r
+ int nErrorCode = XpiErrorCodeConvert(((int (PASCAL *)(const char *, long, unsigned int, PictureInfo *)) fpProc)(((wxString *) _hArchive)->ToUTF8(), 0, 0, & piInfo));\r
+ if (nErrorCode != TPI_ERROR_SUCCESS)\r
+ {\r
+ return nErrorCode;\r
+ }\r
+ _aiInfo->szComment = MB2String((char *) ::LocalLock(piInfo.hInfo));\r
+ ::LocalUnlock(piInfo.hInfo);\r
+ ::LocalFree(piInfo.hInfo);\r
+\r
+ // GetPluginInfo\82ð\8eÀ\8ds\81B\r
+ 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
+ {\r
+ _aiInfo->fiInfo.szSuffix = MB2String(szTemp);\r
+ }\r
+ if (((int (PASCAL *)(int, char *, int)) fpProc)(3, szTemp, sizeof(szTemp)) > 0)\r
+ {\r
+ _aiInfo->fiInfo.szTypeName = MB2String(szTemp);\r
+ }\r
+ }\r
+ _aiInfo->fiInfo.fArchive = false;\r
+ _aiInfo->fiInfo.szTPIName = wxT("xpiLibrary");\r
+ _aiInfo->fiInfo.llSupportedCommand = TPI_COMMAND_EXTRACT;\r
+\r
+ return TPI_ERROR_SUCCESS;\r
+}\r
+\r
+int __stdcall Command\r
+(\r
+ unsigned int _uCommand,\r
+ TPI_SWITCHES * _swInfo,\r
+ const wxString & _szArcName,\r
+ const wxArrayString & _szFiles\r
+)\r
+{\r
+ if (_uCommand != TPI_COMMAND_EXTRACT)\r
+ {\r
+ return TPI_ERROR_D_UNSUPPORTED;\r
+ }\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 piInfo;\r
+ int nErrorCode = XpiErrorCodeConvert(((int (PASCAL *)(const char *, long, unsigned int, PictureInfo *)) fpProc)(_szArcName.ToUTF8(), 0, 0, & piInfo));\r
+ if (nErrorCode != TPI_ERROR_SUCCESS)\r
+ {\r
+ 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\95Ö\8bX\8fã-1\82ð\91\97\90M\81B\r
+ wxFileName _fnArcName(_szArcName);\r
+ if (CallbackProc(-1, 0, (long) & _fnArcName))\r
+ {\r
+ return TPI_ERROR_D_SKIPPED;\r
+ }\r
+\r
+ // \83\81\83\82\83\8a\8fo\97Í\81B\r
+ HANDLE hInfo, hMemory;\r
+ nErrorCode = XpiErrorCodeConvert(((int (PASCAL *)(const char *, long, unsigned int, HANDLE *, HANDLE *, FARPROC, long)) fpProc)(_szArcName.ToUTF8(), 0, 0, & hInfo, & hMemory, (FARPROC) CallbackProc, 0));\r
+ if (nErrorCode == TPI_ERROR_SUCCESS && (hMemory == NULL || hInfo == NULL))\r
+ {\r
+ return TPI_ERROR_UNDEFINED;\r
+ }\r
+ if (nErrorCode != TPI_ERROR_SUCCESS)\r
+ {\r
+ 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
+ {\r
+ return TPI_ERROR_U_USE_LIBRARY;\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 (! XpiErrorCodeConvert(((BOOL (PASCAL *)(int)) fpProc)(piInfo.colorDepth)))\r
+ {\r
+ return TPI_ERROR_ARC_UNSUPPORTED;\r
+ }\r
+\r
+ // \8fo\97Í\96¼\8dì\90¬\81B\r
+ wxString szTargetPath = _swInfo->fnDestinationDirectory.GetPathWithSep() + _fnArcName.GetName() + wxT(".bmp");\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
+ }\r
+ nErrorCode = XpiErrorCodeConvert(((int (PASCAL *)(const char *, long, HANDLE *, HANDLE *, PictureInfo *, FARPROC, long)) fpProc)(szTargetPath.ToUTF8(), 0, & hInfo, & hMemory, & piInfo, (FARPROC) CallbackProc, 0));\r
+ ::LocalUnlock(hInfo);\r
+ ::LocalUnlock(hMemory);\r
+ ::LocalFree(hInfo);\r
+ ::LocalFree(hMemory);\r
+ ::FreeLibrary(hXPI);\r
+\r
+ return nErrorCode;\r
+}\r
+\r
+int __stdcall SetCallbackProc\r
+(\r
+ TPI_PROC _prArcProc\r
+)\r
+{\r
+ // \83|\83C\83\93\83^\82ð\95Û\91¶\81B\r
+ if (_prArcProc == NULL)\r
+ {\r
+ return TPI_ERROR_D_PARAMETER;\r
+ }\r
+ g_prProc = * _prArcProc;\r
+\r
+ return TPI_ERROR_SUCCESS;\r
+}\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r