// Includes\r
//******************************************************************************\r
\r
+#define MYUSE_LIBPATH 1\r
#include "../../common/header/plugin.h"\r
#include "../../common/header/plugin-extra.h"\r
#include "../../common/library/library.h"\r
-#include <wx/config.h>\r
-#include <wx/stdpaths.h>\r
-#include <wx/xml/xml.h>\r
+#include "../../common/library/xmldoc.h"\r
#include <wx/tokenzr.h>\r
-#ifdef __WINDOWS__\r
-#include <windows.h>\r
-#endif\r
#include "cuiWrapper.h"\r
+#define min(a, b) ((a) < (b) ? (a) : (b))\r
\r
//******************************************************************************\r
// Global varients\r
wxString szExeFile;\r
wxString szExeFileAlt;\r
wxString szListCommand;\r
- int nLibIndex;\r
+ wxULongLong_t nLibIndex;\r
wxXmlNode node;\r
} g_LibInfo;\r
\r
TPI_PROC g_prProc;\r
-wxString g_szCurrentArchive;\r
-wxArrayString g_asOutput;\r
-\r
-//******************************************************************************\r
-// Entry\r
-//******************************************************************************\r
-\r
-#ifdef __WINDOWS__\r
-BOOL __stdcall DllMain(HMODULE, DWORD, void *)\r
-{\r
- return TRUE;\r
-}\r
-#endif\r
\r
//******************************************************************************\r
// Inside Functions\r
//******************************************************************************\r
\r
-int myExecute(wxString szCommandLine, wxString * szOutput, wxString szCwd)\r
+int myExecute(const wxString & szCommandLine, wxString * szOutput, const wxString & szCwd, bool fWine)\r
{\r
#ifdef __LINUX__\r
wxString sz = ::wxGetCwd();\r
::wxSetWorkingDirectory(szCwd);\r
- FILE * fp = popen(szCommandLine.ToUTF8(), "r");\r
+ FILE * fp = popen(fWine ? (wxT("wine ") + szCommandLine).ToUTF8() : szCommandLine.ToUTF8(), "r");\r
::wxSetWorkingDirectory(sz);\r
if (fp == NULL)\r
{\r
- ::wxLogError(L"Error :\n\nCommandLine:\n%s", szCommandLine.c_str());\r
+ wxLogError(L"Error :\n\nCommandLine:\n%s", szCommandLine.c_str());\r
return TPI_ERROR_U_USE_LIBRARY;\r
}\r
\r
// ::wxMessageBox(* szOutput);\r
}\r
\r
- pclose(fp);\r
+ // 127を返した場合はコマンドが存在しない。\r
+ int nErrorCode = pclose(fp);\r
+ return (WIFEXITED(nErrorCode) && WEXITSTATUS(nErrorCode) != 127) ? TPI_ERROR_SUCCESS : TPI_ERROR_U_USE_LIBRARY;\r
#else\r
SECURITY_ATTRIBUTES sa;\r
memset(& sa, 0, sizeof(SECURITY_ATTRIBUTES));\r
sa.bInheritHandle = TRUE;\r
sa.nLength = sizeof(SECURITY_ATTRIBUTES);\r
HANDLE hRead, hWrite;\r
- if (! ::CreatePipe(& hRead, & hWrite, & sa, 0))\r
+ if (! ::CreatePipe(& hRead, & hWrite, & sa, 4096))\r
{\r
return TPI_ERROR_U_USE_LIBRARY;\r
}\r
\r
if (szOutput != NULL)\r
{\r
- char sz[32768];\r
- while (true)\r
+ bool bSignal;\r
+ do\r
{\r
DWORD dwSize = 0;\r
- if (! ::PeekNamedPipe(hRead, NULL, 0, NULL, & dwSize, NULL))\r
- {\r
- continue;\r
- }\r
-\r
- if (dwSize > 0)\r
+ bSignal = ::WaitForSingleObject(pi.hProcess, 100) == WAIT_OBJECT_0;\r
+ ::PeekNamedPipe(hRead, NULL, 0, NULL, & dwSize, NULL);\r
+ while (dwSize > 0)\r
{\r
+ char sz[4097];\r
memset(sz, 0, sizeof(sz));\r
- ::ReadFile(hRead, & sz, sizeof(sz), & dwSize, NULL);\r
- * szOutput += UTF82String(sz);\r
+ ::ReadFile(hRead, & sz, sizeof(sz) - 1, & dwSize, NULL);\r
+ * szOutput += wxString(sz);\r
+ // UTF-8以外の文字コードだと、UTF82Stringを使うと書庫が開けなくなる。データの切り出しにも影響。\r
+// * szOutput += UTF82String(sz);\r
// ::MessageBoxA(NULL, sz, NULL, 0);\r
- }\r
- else if (::WaitForSingleObject(pi.hProcess, 0) == WAIT_OBJECT_0)\r
- {\r
- break;\r
+ ::PeekNamedPipe(hRead, NULL, 0, NULL, & dwSize, NULL);\r
}\r
}\r
+ while (! bSignal);\r
}\r
\r
::CloseHandle(pi.hProcess);\r
::CloseHandle(hRead);\r
::CloseHandle(hWrite);\r
-#endif\r
return TPI_ERROR_SUCCESS;\r
+#endif\r
}\r
\r
-PosInfo MakePosInfo(wxString szPrefix)\r
+PosInfo MakePosInfo(const wxString & szPrefix)\r
{\r
PosInfo pi;\r
- g_LibInfo.node.GetPropVal(wxT("list-") + szPrefix + wxT("-s"), wxEmptyString).ToULong(& pi.nStart);\r
- g_LibInfo.node.GetPropVal(wxT("list-") + szPrefix + wxT("-c"), wxEmptyString).ToULong(& pi.nCount);\r
- g_LibInfo.node.GetPropVal(wxT("list-") + szPrefix + wxT("-l"), wxT("0")).ToULong(& pi.nLine);\r
+ pi.nStart = myGetAttributeInt(& g_LibInfo.node, wxT("list-") + szPrefix + wxT("-s"));\r
+ pi.nCount = myGetAttributeInt(& g_LibInfo.node, wxT("list-") + szPrefix + wxT("-c"));\r
+ pi.nLine = myGetAttributeInt(& g_LibInfo.node, wxT("list-") + szPrefix + wxT("-l"));\r
return pi;\r
}\r
\r
-wxULongLong GetSize(PosInfo & pi, size_t uCurrent, wxArrayString & as)\r
+wxULongLong_t GetSize(const PosInfo & pi, wxULongLong_t nCurrent, const wxArrayString & as)\r
{\r
if (pi.nStart == 0 && pi.nCount == 0)\r
{\r
return 0;\r
}\r
\r
- wxULongLong_t nTemp;\r
- size_t nPos = uCurrent + pi.nLine;\r
+ wxULongLong_t nTemp = 0, nPos = nCurrent + pi.nLine;\r
wxString sz = pi.nCount == 0 ? as[nPos].Mid(pi.nStart) : as[nPos].Mid(pi.nStart, pi.nCount);\r
sz.ToULongLong(& nTemp);\r
return nTemp;\r
int __stdcall GetPluginInformation\r
(\r
unsigned int _uInfoId,\r
- wxULongLong,\r
+ wxULongLong_t,\r
void * _pPtr\r
)\r
{\r
case TPI_INFO_VERSION_API:\r
* (int *) _pPtr = 2;\r
break;\r
+ case TPI_INFO_HANDLE_ON_COMMAND:\r
+ * (int *) _pPtr = 0;\r
+ break;\r
default:\r
return TPI_ERROR_D_UNSUPPORTED;\r
}\r
\r
int __stdcall GetFormatInformation(TPI_FORMATINFO * _fiInfo, bool _bFirst)\r
{\r
- static unsigned int s_uFileId;\r
- wxStandardPaths p;\r
- wxXmlDocument config(wxPathOnly(p.GetExecutablePath()) + wxT("/lib/cuiWrapper.xml"));\r
- // 一気に先頭のライブラリの情報を取得。\r
- wxXmlNode * xmlLibrary = config.GetRoot()->GetChildren();\r
-\r
+ static wxULongLong_t s_nFileId;\r
+ static wxXmlDocument xmlDoc(myMakeXMLName(wxT("cuiWrapper")));\r
+ static wxXmlNode * xmlLibrary;\r
if (_bFirst)\r
{\r
// xml解析開始。\r
- s_uFileId = 0;\r
+ s_nFileId = 0;\r
+ xmlLibrary = myGetFirstLib(& xmlDoc);\r
}\r
else\r
{\r
- for (unsigned int i = 0; i < s_uFileId && xmlLibrary != NULL; i++)\r
- {\r
- xmlLibrary = xmlLibrary->GetNext();\r
- }\r
+ xmlLibrary = myGetNextLib(xmlLibrary);\r
}\r
-\r
- if (xmlLibrary == NULL || xmlLibrary->GetName() != wxT("library"))\r
+ if (xmlLibrary == NULL)\r
{\r
- // 終端に達した場合。\r
+ // データの終端に達した場合。\r
return TPI_ERROR_S_ENDOFDATA;\r
}\r
\r
- MakeFormatInfo(wxT("cuiWrapper"), _fiInfo, xmlLibrary, s_uFileId++);\r
- if (myExecute(xmlLibrary->GetPropVal(wxT("name"), wxEmptyString), NULL, wxEmptyString) != TPI_ERROR_SUCCESS)\r
+ MakeFormatInfo(xmlLibrary, wxT("cuiWrapper"), _fiInfo, s_nFileId++);\r
+ wxString szExeFile = xmlLibrary->GetAttribute(wxT("name"), wxEmptyString);\r
+ if (myExecute(szExeFile, NULL, wxEmptyString, szExeFile.MakeLower().EndsWith(wxT(".exe"))) != TPI_ERROR_SUCCESS)\r
{\r
- _fiInfo->llSupportedCommand = 0;\r
+ _fiInfo->eSupportedCommand = 0;\r
}\r
-\r
return TPI_ERROR_SUCCESS;\r
}\r
\r
int __stdcall LoadPlugin\r
(\r
const wxString & _szArcName,\r
- wxULongLong _llTypeId\r
+ TPI_PROC _prProc,\r
+ wxULongLong_t _nTypeId\r
)\r
{\r
// xml解析開始。\r
- wxStandardPaths p;\r
- wxXmlDocument config(wxPathOnly(p.GetExecutablePath()) + wxT("/lib/cuiWrapper.xml"));\r
- if (! config.IsOk())\r
+ wxXmlDocument xmlDoc(myMakeXMLName(wxT("cuiWrapper")));\r
+ wxXmlNode * xmlLibrary;\r
+\r
+ // コールバック関数を設定。\r
+ if (_prProc != NULL)\r
{\r
- return TPI_ERROR_UNDEFINED;\r
+ g_prProc = * _prProc;\r
}\r
- // 一気に先頭のライブラリの情報を取得。\r
- wxXmlNode * xmlLibrary = config.GetRoot()->GetChildren();\r
\r
// 対象が存在するならば対応するライブラリを調査、\r
// 対象が存在しないならば指示されたライブラリをロード。\r
if (! ::wxFileExists(_szArcName))\r
{\r
- // 適当な位置まで移動。\r
- for (g_LibInfo.nLibIndex = 0; g_LibInfo.nLibIndex < _llTypeId && xmlLibrary != NULL; g_LibInfo.nLibIndex++)\r
- {\r
- xmlLibrary = xmlLibrary->GetNext();\r
- }\r
- if (xmlLibrary == NULL || xmlLibrary->GetName() != wxT("library"))\r
+ xmlLibrary = myGetFirstLib(& xmlDoc, _nTypeId);\r
+ if (xmlLibrary == NULL)\r
{\r
// xml文法エラー。\r
return TPI_ERROR_UNDEFINED;\r
}\r
- g_LibInfo.szExeFile = xmlLibrary->GetPropVal(wxT("name"), wxEmptyString);\r
- g_LibInfo.szExeFileAlt = xmlLibrary->GetPropVal(wxT("name-alt"), wxEmptyString);\r
+ g_LibInfo.szExeFile = xmlLibrary->GetAttribute(wxT("name"), wxEmptyString);\r
+ g_LibInfo.szExeFileAlt = xmlLibrary->GetAttribute(wxT("name-alt"), wxEmptyString);\r
g_LibInfo.node = * xmlLibrary;\r
-\r
+ g_LibInfo.nLibIndex = _nTypeId;\r
return TPI_ERROR_SUCCESS;\r
}\r
\r
// 無限ループに陥らないよう上限を設定。\r
+ xmlLibrary = myGetFirstLib(& xmlDoc);\r
for (g_LibInfo.nLibIndex = 0; g_LibInfo.nLibIndex < 300 && xmlLibrary != NULL; g_LibInfo.nLibIndex++)\r
{\r
- // ライブラリをロード。\r
- g_LibInfo.szExeFile = xmlLibrary->GetPropVal(wxT("name"), wxEmptyString);\r
- g_LibInfo.szExeFileAlt = xmlLibrary->GetPropVal(wxT("name-alt"), wxEmptyString);\r
- g_LibInfo.node = * xmlLibrary;\r
-\r
// 書庫に対応しているかチェック。\r
- if (CheckArchive(_szArcName, NULL) == TPI_ERROR_SUCCESS)\r
+ wxFileName fnArchive(_szArcName);\r
+ wxArrayString asExt = ::wxStringTokenize(xmlLibrary->GetAttribute(wxT("suffix"), wxEmptyString), wxT(";"));\r
+ if (xmlLibrary->HasAttribute(wxT("list")))\r
{\r
- // 対応していれば処理を終了。\r
- return TPI_ERROR_SUCCESS;\r
+ for (size_t i = 0; i < asExt.GetCount(); i++)\r
+ {\r
+ // .tar.XXXなど二重判定への対応。\r
+// if (asExt[i].IsSameAs(fnArchive.GetExt(), false))\r
+ if (fnArchive.GetFullName().MakeLower().EndsWith(wxT('.') + asExt[i].MakeLower()))\r
+ {\r
+ // ライブラリをロード。\r
+ g_LibInfo.szExeFile = xmlLibrary->GetAttribute(wxT("name"), wxEmptyString);\r
+ g_LibInfo.szExeFileAlt = xmlLibrary->GetAttribute(wxT("name-alt"), wxEmptyString);\r
+ g_LibInfo.node = * xmlLibrary;\r
+ g_LibInfo.nLibIndex = _nTypeId;\r
+ return TPI_ERROR_SUCCESS;\r
+ }\r
+ }\r
}\r
-\r
- xmlLibrary = xmlLibrary->GetNext();\r
+ xmlLibrary = myGetNextLib(xmlLibrary);\r
}\r
-\r
return TPI_ERROR_U_LOAD_LIBRARY;\r
}\r
\r
return TPI_ERROR_SUCCESS;\r
}\r
\r
-int __stdcall CheckArchive\r
+int __stdcall OpenArchive\r
(\r
const wxString & _szArcName,\r
- wxULongLong * _llFileCount\r
+ void * * _hArchive,\r
+ wxULongLong_t * _nFileCount\r
)\r
{\r
- wxFileName fnArchive(_szArcName);\r
- wxArrayString asExt = ::wxStringTokenize(g_LibInfo.node.GetPropVal(wxT("suffix"), wxEmptyString), wxT(";"));\r
- if (! g_LibInfo.node.HasProp(wxT("list")))\r
+ wxString szOutput;\r
+ TPI_SWITCHES swInfo;\r
+ swInfo.szArcName = _szArcName;\r
+ if (myExecute(g_LibInfo.szExeFile + wxT(" ") + MakeCommandLineSend(g_LibInfo.node.GetAttribute(wxT("list"), wxEmptyString), & swInfo), & szOutput, wxEmptyString, g_LibInfo.szExeFile.MakeLower().EndsWith(wxT(".exe"))) != TPI_ERROR_SUCCESS)\r
{\r
- return TPI_ERROR_ARC_UNSUPPORTED;\r
+ return TPI_ERROR_U_USE_LIBRARY;\r
}\r
-\r
- for (size_t i = 0; i < asExt.GetCount(); i++)\r
+ wxArrayString * as = new wxArrayString(::wxStringTokenize(szOutput, wxT("\r\n")));\r
+ * _hArchive = (void *) as;\r
+ as->Shrink();\r
+ if (_nFileCount != NULL)\r
{\r
- // .tar.XXXなど二重判定への対応。\r
-// if (asExt[i].IsSameAs(fnArchive.GetExt(), false))\r
- if (fnArchive.GetFullName().EndsWith(wxT('.') + asExt[i]))\r
- {\r
- // 開いて確認。先行してデータを取得しておく。\r
- int nErrorCode = OpenArchive(_szArcName, NULL);\r
-\r
- // 対応。\r
- if (_llFileCount != NULL)\r
- {\r
- // ファイル数は多めに取っておく。\r
- * _llFileCount = g_asOutput.GetCount();\r
- }\r
- return nErrorCode;\r
- }\r
+ * _nFileCount = as->GetCount();\r
}\r
\r
- return TPI_ERROR_ARC_UNSUPPORTED;\r
-}\r
-\r
-int __stdcall OpenArchive\r
-(\r
- const wxString & _szArcName,\r
- void * * _hArchive\r
-)\r
-{\r
- if (g_szCurrentArchive != _szArcName)\r
+ wxString szStartLine = g_LibInfo.node.GetAttribute(wxT("list-line-s"), wxEmptyString);\r
+ if ((! szStartLine.IsEmpty() && as->Index(szStartLine) == wxNOT_FOUND) || as->IsEmpty())\r
{\r
- wxString szOutput;\r
- if (myExecute(g_LibInfo.szExeFile + wxT(" ") + MakeCommandLineSend(g_LibInfo.node.GetPropVal(wxT("list"), wxEmptyString), _szArcName, NULL, NULL, wxEmptyString), & szOutput, wxEmptyString) != TPI_ERROR_SUCCESS)\r
- {\r
- return TPI_ERROR_U_USE_LIBRARY;\r
- }\r
- g_szCurrentArchive = _szArcName;\r
- g_asOutput = ::wxStringTokenize(szOutput, wxT("\r\n"));\r
- g_asOutput.Shrink();\r
- }\r
- if (_hArchive != NULL)\r
- {\r
- * _hArchive = & g_asOutput;\r
+ // 書庫が読み込めなかった?\r
+ delete as;\r
+ return TPI_ERROR_ARC_UNSUPPORTED;\r
}\r
- return g_asOutput.IsEmpty() ? TPI_ERROR_UNDEFINED : TPI_ERROR_SUCCESS;\r
+\r
+ return TPI_ERROR_SUCCESS;\r
}\r
\r
int __stdcall CloseArchive\r
void * _hArchive\r
)\r
{\r
- ((wxArrayString *) _hArchive)->Clear();\r
+ wxArrayString * as = (wxArrayString *) _hArchive;\r
+ as->Clear();\r
+ delete as;\r
return TPI_ERROR_SUCCESS;\r
}\r
\r
bool _bFirst\r
)\r
{\r
- static size_t s_uCurrentLine;\r
- static wxULongLong s_llFileId;\r
+ static size_t s_nCurrentLine;\r
+ static wxULongLong_t s_nFileId;\r
if (_hArchive == NULL)\r
{\r
return TPI_ERROR_UNDEFINED;\r
\r
// XMLからの読み込みは初回に行う。\r
static wxString szEndLine, szDateFormat;\r
- static unsigned long nProcessPerLine;\r
+ static wxULongLong_t nProcessPerLine;\r
static PosInfo piFName, piPSize, piUSize, piDate;\r
if (_bFirst)\r
{\r
- s_llFileId = 0;\r
- wxString szStartLine = g_LibInfo.node.GetPropVal(wxT("list-line-s"), wxEmptyString);\r
+ s_nFileId = 0;\r
+ wxString szStartLine = g_LibInfo.node.GetAttribute(wxT("list-line-s"), wxEmptyString);\r
if (! szStartLine.IsEmpty())\r
{\r
- // 開始行の次の行にセット。\r
- s_uCurrentLine = asOutput.Index(szStartLine) + 1;\r
- if (s_uCurrentLine == wxNOT_FOUND + 1)\r
- {\r
- // 書庫が読み込めなかった?\r
- return TPI_ERROR_ARC_UNSUPPORTED;\r
- }\r
+ // 開始行の次の行にセット。エラーはOpenArchiveでチェック済み。\r
+ s_nCurrentLine = asOutput.Index(szStartLine) + 1;\r
}\r
\r
// 初期設定。\r
- g_LibInfo.node.GetPropVal(wxT("list-line-c"), wxT("1")).ToULong(& nProcessPerLine);\r
- szEndLine = g_LibInfo.node.GetPropVal(wxT("list-line-e"), szStartLine);\r
- szDateFormat = g_LibInfo.node.GetPropVal(wxT("list-date-f"), wxDefaultDateTimeFormat);\r
+ nProcessPerLine = myGetAttributeInt(& g_LibInfo.node, wxT("list-line-c"), 1);\r
+ szEndLine = g_LibInfo.node.GetAttribute(wxT("list-line-e"), szStartLine);\r
+ szDateFormat = g_LibInfo.node.GetAttribute(wxT("list-date-f"), wxDefaultDateTimeFormat);\r
piFName = MakePosInfo(wxT("fname"));\r
piPSize = MakePosInfo(wxT("psize"));\r
piUSize = MakePosInfo(wxT("usize"));\r
- piDate = MakePosInfo(wxT("date"));\r
+ piDate = MakePosInfo(wxT("date"));\r
}\r
\r
- if (s_uCurrentLine >= asOutput.GetCount())\r
+ if (s_nCurrentLine >= asOutput.GetCount())\r
{\r
- // 書庫が読み込めなかった?\r
- return TPI_ERROR_ARC_UNSUPPORTED;\r
+ // 空行で終わるとき以外はエラーとする。\r
+ return szEndLine.IsEmpty() ? TPI_ERROR_S_ENDOFDATA : TPI_ERROR_ARC_UNSUPPORTED;\r
}\r
\r
// 最終行かどうか確認。\r
- if (asOutput[s_uCurrentLine] == szEndLine)\r
+ if (asOutput[s_nCurrentLine] == szEndLine)\r
{\r
return TPI_ERROR_S_ENDOFDATA;\r
}\r
\r
// ファイル名を取得。\r
- _fiInfo->szStoredName = piFName.nCount == 0 ? asOutput[s_uCurrentLine + piFName.nLine].Mid(piFName.nStart) : asOutput[s_uCurrentLine + piFName.nLine].Mid(piFName.nStart, piFName.nCount);\r
+ _fiInfo->szStoredName = piFName.nCount == 0 ? asOutput[s_nCurrentLine + piFName.nLine].Mid(piFName.nStart) : asOutput[s_nCurrentLine + piFName.nLine].Mid(piFName.nStart, piFName.nCount);\r
_fiInfo->szStoredName.Trim();\r
- _fiInfo->fnFileName = wxFileName::wxFileName(_fiInfo->szStoredName);\r
+ _fiInfo->fnFileName = wxFileName(_fiInfo->szStoredName, wxPATH_DOS);\r
\r
// サイズ取得。\r
- _fiInfo->llPackedSize = GetSize(piPSize, s_uCurrentLine, asOutput);\r
- _fiInfo->llUnpackedSize = GetSize(piUSize, s_uCurrentLine, asOutput);\r
+ _fiInfo->nPackedSize = GetSize(piPSize, s_nCurrentLine, asOutput);\r
+ _fiInfo->nUnpackedSize = GetSize(piUSize, s_nCurrentLine, asOutput);\r
\r
// 更新時刻取得。\r
if (piDate.nStart != 0 || piDate.nCount != 0)\r
{\r
- _fiInfo->tmModified.ParseFormat(piDate.nCount == 0 ? asOutput[s_uCurrentLine + piDate.nLine].Mid(piDate.nStart) : asOutput[s_uCurrentLine + piDate.nLine].Mid(piDate.nStart, piDate.nCount), szDateFormat);\r
+ _fiInfo->tmModify.ParseFormat(piDate.nCount == 0 ? asOutput[s_nCurrentLine + piDate.nLine].Mid(piDate.nStart) : asOutput[s_nCurrentLine + piDate.nLine].Mid(piDate.nStart, piDate.nCount), szDateFormat);\r
}\r
\r
// 最後に次の行へ進めておく。\r
- _fiInfo->llFileId = s_llFileId++;\r
- s_uCurrentLine += nProcessPerLine;\r
+ _fiInfo->nFileId = s_nFileId++;\r
+ s_nCurrentLine += nProcessPerLine;\r
\r
return TPI_ERROR_SUCCESS;\r
}\r
)\r
{\r
// 形式に関する情報を取得。\r
- MakeFormatInfo(wxT("cuiWrapper"), & _aiInfo->fiInfo, & g_LibInfo.node, 0);\r
+ MakeFormatInfo(& g_LibInfo.node, wxT("cuiWrapper"), & _aiInfo->fiInfo, 0);\r
return TPI_ERROR_SUCCESS;\r
}\r
\r
int __stdcall Command\r
(\r
- unsigned int _uCommand,\r
+ wxULongLong_t _eCommand,\r
TPI_SWITCHES * _swInfo,\r
- const wxString & _szArcName,\r
+ void *,// _hArchive,\r
const wxArrayString & _szFiles\r
)\r
{\r
wxString szPath, szCommandLine;\r
\r
// APIアドレス取得。\r
- if (! g_LibInfo.node.GetPropVal(\r
- _uCommand == TPI_COMMAND_ADD ? wxT("add") :\r
- _uCommand == TPI_COMMAND_EXTRACT ? wxT("extract") : \r
- _uCommand == TPI_COMMAND_DELETE ? wxT("delete") : \r
- _uCommand == TPI_COMMAND_UPDATE ? wxT("update") : \r
- _uCommand == TPI_COMMAND_TEST ? wxT("test") : \r
- _uCommand == TPI_COMMAND_REPAIR ? wxT("repair") : \r
- _uCommand == TPI_COMMAND_MOVE ? wxT("move") : \r
- _uCommand == TPI_COMMAND_SFX ? wxT("sfx") : \r
- _uCommand == TPI_COMMAND_UNSFX ? wxT("unsfx") : wxEmptyString, & szCommandLine))\r
+ if (! g_LibInfo.node.GetAttribute(\r
+ _eCommand == TPI_COMMAND_CREATE ? wxT("create") :\r
+ _eCommand == TPI_COMMAND_ADD ? wxT("add") :\r
+ _eCommand == TPI_COMMAND_EXTRACT ? wxT("extract") : \r
+ _eCommand == TPI_COMMAND_DELETE ? wxT("delete") : \r
+ _eCommand == TPI_COMMAND_UPDATE ? wxT("update") : \r
+ _eCommand == TPI_COMMAND_TEST ? wxT("test") : \r
+ _eCommand == TPI_COMMAND_REPAIR ? wxT("repair") : \r
+ _eCommand == TPI_COMMAND_MOVE ? wxT("move") : \r
+ _eCommand == TPI_COMMAND_SFX ? wxT("sfx") : \r
+ _eCommand == TPI_COMMAND_UNSFX ? wxT("unsfx") : wxEmptyString, & szCommandLine))\r
{\r
- g_LibInfo.node.GetPropVal(\r
- _uCommand == TPI_COMMAND_ADD ? wxT("add-alt") :\r
- _uCommand == TPI_COMMAND_EXTRACT ? wxT("extract-alt") : \r
- _uCommand == TPI_COMMAND_DELETE ? wxT("delete-alt") : \r
- _uCommand == TPI_COMMAND_UPDATE ? wxT("update-alt") : \r
- _uCommand == TPI_COMMAND_TEST ? wxT("test-alt") : \r
- _uCommand == TPI_COMMAND_REPAIR ? wxT("repair-alt") : \r
- _uCommand == TPI_COMMAND_MOVE ? wxT("move-alt") : \r
- _uCommand == TPI_COMMAND_SFX ? wxT("sfx-alt") : \r
- _uCommand == TPI_COMMAND_UNSFX ? wxT("unsfx-alt") : wxEmptyString, & szCommandLine);\r
+ g_LibInfo.node.GetAttribute(\r
+ _eCommand == TPI_COMMAND_CREATE ? wxT("create-alt") :\r
+ _eCommand == TPI_COMMAND_ADD ? wxT("add-alt") :\r
+ _eCommand == TPI_COMMAND_EXTRACT ? wxT("extract-alt") : \r
+ _eCommand == TPI_COMMAND_DELETE ? wxT("delete-alt") : \r
+ _eCommand == TPI_COMMAND_UPDATE ? wxT("update-alt") : \r
+ _eCommand == TPI_COMMAND_TEST ? wxT("test-alt") : \r
+ _eCommand == TPI_COMMAND_REPAIR ? wxT("repair-alt") : \r
+ _eCommand == TPI_COMMAND_MOVE ? wxT("move-alt") : \r
+ _eCommand == TPI_COMMAND_SFX ? wxT("sfx-alt") : \r
+ _eCommand == TPI_COMMAND_UNSFX ? wxT("unsfx-alt") : wxEmptyString, & szCommandLine);\r
}\r
\r
if (szCommandLine.IsEmpty())\r
\r
// コマンドライン・レスポンスファイル作成。\r
wxString\r
- szResponceFileName = MakeResponceFile(_szFiles, g_LibInfo.node.GetPropVal(wxT("quote-resp"), wxT("1")) == wxT("1")),\r
- szCommandLineSend = MakeCommandLineSend(szCommandLine, _szArcName, _swInfo, _szFiles, szResponceFileName);\r
+ szResponceFileName = MakeResponceFile(_szFiles, myGetAttributeBool(& g_LibInfo.node, wxT("quote-resp"), true)),\r
+ szCommandLineSend = MakeCommandLineSend(szCommandLine, _swInfo, _szFiles, szResponceFileName);\r
\r
// コマンドライン実行。\r
wxString szOutput;\r
- int nErrorCode = myExecute(g_LibInfo.szExeFile + wxT(" ") + szCommandLineSend, & szOutput, _swInfo->fnDestinationDirectory.GetFullPath());\r
+ int nErrorCode = myExecute(g_LibInfo.szExeFile + wxT(" ") + szCommandLineSend, & szOutput, _swInfo->fnDestinationDirectory.GetFullPath(), g_LibInfo.szExeFile.MakeLower().EndsWith(wxT(".exe")));\r
\r
// レスポンスファイル削除。\r
::wxRemoveFile(szResponceFileName);\r
\r
if (nErrorCode != TPI_ERROR_SUCCESS)\r
{\r
- ::wxLogError(L"Error :\n%x\n\nCommandLine:\n%s\n\nOutput:\n%s", nErrorCode, szCommandLineSend.c_str(), szOutput.c_str());\r
+ wxLogError(L"Error :\n%x\n\nCommandLine:\n%s\n\nOutput:\n%s", nErrorCode, szCommandLineSend.c_str(), szOutput.c_str());\r
}\r
return nErrorCode;\r
}\r
\r
-int __stdcall SetCallbackProc\r
-(\r
- TPI_PROC _prArcProc\r
-)\r
-{\r
- // ポインタを保存。\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