wxULongLong_t\r
)\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
- {\r
- // SPIをロード。\r
- g_hLib = ::LoadLibrary((szSPIPath + szSPIName).wchar_str());\r
- if (g_hLib == NULL)\r
- {\r
- b = fs.GetNext(& szSPIName);\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
-\r
- // 書庫に対応しているかチェック。\r
- if (CheckArchive(_szArcName, NULL) == TPI_ERROR_SUCCESS)\r
- {\r
- // 対応していれば処理を終了。\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
- 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
+ // ファイルを開く。\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
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
+ wxStandardPaths p;\r
+ wxString szSPIPath = wxPathOnly(p.GetExecutablePath()) + wxT("/lib/"), szSPIName;\r
+ wxDir fs(szSPIPath);\r
+ if (fs.GetFirst(& szSPIName, wxT("*.spi")))\r
{\r
- * _llFileCount = 1;\r
+ do\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
+ continue;\r
+ }\r
+\r
+ // 書庫に対応しているかチェック。\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
+ }\r
+ }\r
+ while (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 OpenArchive\r
(\r
const wxString & _szArcName,\r
- void * * _hArchive\r
+ void * * _hArchive,\r
+ wxULongLong_t *\r
)\r
{\r
* _hArchive = new wxString(_szArcName);\r
\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
::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
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
\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((szXPIPath + 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
}\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
}\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