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: calLibrary.cpp,v 1.23 2009/09/27 13:44:12 sirakaba Exp $\r
+ $Id$\r
*******************************************************************************/\r
\r
//******************************************************************************\r
#include "../../common/header/plugin.h"\r
#include "../../common/header/plugin-extra.h"\r
#include "../../common/library/library.h"\r
+#include "../../common/library/xmldoc.h"\r
#include <wx/dynlib.h>\r
#include <wx/config.h>\r
#include <wx/stdpaths.h>\r
} g_LibInfo, g_LibInfoAlt;\r
\r
TPI_PROC g_prProc;\r
-bool g_fExistUnicodeMode;\r
\r
//******************************************************************************\r
-// Entry\r
+// Inline Functions\r
//******************************************************************************\r
\r
-#ifdef __LINUX__\r
-void __attribute__((destructor)) Detach(void)\r
-{\r
- ::FreeLibrary(g_LibInfo.hLib);\r
- ::FreeLibrary(g_LibInfo.hLibAlt);\r
-}\r
-#else\r
-BOOL __stdcall DllMain(HMODULE, DWORD fdwReason, void *)\r
-{\r
- switch (fdwReason)\r
- {\r
- case DLL_PROCESS_DETACH:\r
- ::FreeLibrary(g_LibInfo.hLib);\r
- break;\r
+#define MyConvEI322PI(EI, strconv) \\r
+ EI * ex = (EI *) _lpEis; \\r
+ \\r
+ piInfo.fiInfo.dwCRC32 = ex->dwCRC; \\r
+ piInfo.fiInfo.tmModify.SetFromDOS(MAKELONG(ex->wTime, ex->wDate)); \\r
+ piInfo.fiInfo.nPackedSize = ex->dwCompressedSize; \\r
+ piInfo.fiInfo.nUnpackedSize = ex->exinfo.dwFileSize; \\r
+ piInfo.fiInfo.eOSType = ex->uOSType; \\r
+ piInfo.fiInfo.wCompressRatio = ex->wRatio; \\r
+ piInfo.fiInfo.szStoredName = strconv(ex->exinfo.szSourceFileName); \\r
+ piInfo.fiInfo.szMethod = strconv(ex->szMode); \\r
+ \\r
+ piInfo.nProcessedSize = ex->exinfo.dwWriteSize; \\r
+ piInfo.fnDestination = wxFileName(strconv(ex->exinfo.szDestFileName));\r
+\r
+#define MyConvEI642PI(EI, strconv) \\r
+ EI * ex = (EI *) _lpEis; \\r
+ \\r
+ piInfo.fiInfo.dwAttribute = ex->dwAttributes; \\r
+ piInfo.fiInfo.dwCRC32 = ex->dwCRC; \\r
+ piInfo.fiInfo.tmAccess = FileTimeToWxDateTime(& ex->ftAccessTime); \\r
+ piInfo.fiInfo.tmCreate = FileTimeToWxDateTime(& ex->ftCreateTime); \\r
+ piInfo.fiInfo.tmModify = FileTimeToWxDateTime(& ex->ftWriteTime); \\r
+ piInfo.fiInfo.nPackedSize = ex->llCompressedSize; \\r
+ piInfo.fiInfo.nUnpackedSize = ex->llFileSize; \\r
+ piInfo.fiInfo.eOSType = ex->uOSType; \\r
+ piInfo.fiInfo.wCompressRatio = ex->wRatio; \\r
+ piInfo.fiInfo.szStoredName = strconv(ex->exinfo.szSourceFileName); \\r
+ piInfo.fiInfo.szMethod = strconv(ex->szMode); \\r
+ \\r
+ piInfo.nProcessedSize = ex->llWriteSize; \\r
+ piInfo.fnDestination = wxFileName(strconv(ex->exinfo.szDestFileName));\r
+\r
+#define MyConvEM322PI(EM, strconv) \\r
+ EM * ex = (EM *) _lpEis; \\r
+ if (ex->uCommand != COMMAND_EXTRACT) \\r
+ { \\r
+ return TRUE; \\r
+ } \\r
+ \\r
+ piInfo.fiInfo.dwAttribute = ex->dwAttributes; \\r
+ piInfo.fiInfo.dwCRC32 = ex->dwCRC; \\r
+ piInfo.fiInfo.tmAccess = FileTimeToWxDateTime(& ex->ftAccessTime); \\r
+ piInfo.fiInfo.tmCreate = FileTimeToWxDateTime(& ex->ftCreateTime); \\r
+ piInfo.fiInfo.tmModify = FileTimeToWxDateTime(& ex->ftWriteTime); \\r
+ piInfo.fiInfo.nPackedSize = ex->dwCompressedSize; \\r
+ piInfo.fiInfo.nUnpackedSize = ex->dwOriginalSize; \\r
+ piInfo.fiInfo.eOSType = ex->uOSType; \\r
+ piInfo.fiInfo.wCompressRatio = ex->wRatio; \\r
+ piInfo.fiInfo.szStoredName = strconv(ex->szFileName); \\r
+ piInfo.fiInfo.fnFileName = wxFileName(piInfo.fiInfo.szStoredName); \\r
+ \\r
+ piInfo.fnDestination = wxFileName(strconv(ex->szAddFileName)); \\r
+ g_prProc(TPI_NOTIFY_COMMON, & piInfo);\r
+\r
+#define MyConvEM642PI(EM, strconv) \\r
+ EM * ex = (EM *) _lpEis; \\r
+ if (ex->uCommand != COMMAND_EXTRACT) \\r
+ { \\r
+ return TRUE; \\r
+ } \\r
+ \\r
+ piInfo.fiInfo.dwAttribute = ex->dwAttributes; \\r
+ piInfo.fiInfo.dwCRC32 = ex->dwCRC; \\r
+ piInfo.fiInfo.tmAccess = FileTimeToWxDateTime(& ex->ftAccessTime); \\r
+ piInfo.fiInfo.tmCreate = FileTimeToWxDateTime(& ex->ftCreateTime); \\r
+ piInfo.fiInfo.tmModify = FileTimeToWxDateTime(& ex->ftWriteTime); \\r
+ piInfo.fiInfo.nPackedSize = ex->llCompressedSize; \\r
+ piInfo.fiInfo.nUnpackedSize = ex->llOriginalSize; \\r
+ piInfo.fiInfo.eOSType = ex->uOSType; \\r
+ piInfo.fiInfo.wCompressRatio = ex->wRatio; \\r
+ piInfo.fiInfo.szStoredName = strconv(ex->szFileName); \\r
+ piInfo.fiInfo.fnFileName = wxFileName(piInfo.fiInfo.szStoredName); \\r
+ \\r
+ piInfo.fnDestination = wxFileName(strconv(ex->szAddFileName)); \\r
+ g_prProc(TPI_NOTIFY_COMMON, & piInfo);\r
+\r
+#define MySetArcSize(api_base, var) \\r
+ fpProc = ::GetAPIAddress(#api_base L"Ex", false); \\r
+ if (fpProc != NULL) \\r
+ { \\r
+ ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->var); \\r
+ } \\r
+ else \\r
+ { \\r
+ fpProc = ::GetAPIAddress(#api_base, false); \\r
+ if (fpProc != NULL) \\r
+ { \\r
+ _aiInfo->var = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive); \\r
+ } \\r
+ }\r
+\r
+#define MySetArcTime(api_base, var, ismod) \\r
+ fpProc = ::GetAPIAddress(#api_base L"64", false); \\r
+ if (fpProc != NULL) \\r
+ { \\r
+ ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, & ll); \\r
+ _aiInfo->var.Set((time_t) ll); \\r
+ } \\r
+ else \\r
+ { \\r
+ fpProc = ::GetAPIAddress(#api_base L"Ex", false); \\r
+ if (fpProc != NULL) \\r
+ { \\r
+ ((BOOL (__stdcall *)(void *, FILETIME *)) fpProc)(_hArchive, & ft); \\r
+ _aiInfo->var = FileTimeToWxDateTime(& ft); \\r
+ } \\r
+ else \\r
+ { \\r
+ fpProc = ::GetAPIAddress(#api_base, false); \\r
+ if (fpProc != NULL) \\r
+ { \\r
+ _aiInfo->var.Set((time_t) ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive)); \\r
+ } \\r
+ else \\r
+ { \\r
+ if (ismod) \\r
+ { \\r
+ fpProc = ::GetAPIAddress("GetArcDate", false); \\r
+ WORD wDate = fpProc == NULL ? 0 : ((WORD (__stdcall *)(void *)) fpProc)(_hArchive); \\r
+ fpProc = ::GetAPIAddress("GetArcTime", false); \\r
+ WORD wTime = fpProc == NULL ? 0 : ((WORD (__stdcall *)(void *)) fpProc)(_hArchive); \\r
+ _aiInfo->var.SetFromDOS(MAKELONG(wTime, wDate)); \\r
+ } \\r
+ } \\r
+ } \\r
}\r
- return TRUE;\r
-}\r
-#endif\r
\r
-wxDateTime FileTimeToWxDateTime(FILETIME * pft)\r
-{\r
-#ifdef __WINDOWS__\r
- FILETIME ftLocal;\r
- SYSTEMTIME st;\r
- if (! ::FileTimeToLocalFileTime(pft, & ftLocal) || ! ::FileTimeToSystemTime(& ftLocal, & st))\r
- {\r
- return (time_t) 0;\r
- }\r
- wxDateTime dt(st.wDay, wxDateTime::Month(st.wMonth - 1), st.wYear, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);\r
- return dt;\r
-#else\r
- return (time_t) 0;\r
-#endif\r
-}\r
+#define GetAPIAddress(name, unicode) GetProcAddress(g_LibInfo.hLib, (g_LibInfo.szPrefix + wxT(name) + ((unicode && g_LibInfo.fUnicode) ? wxT("W") : wxEmptyString)).char_str())\r
+#define GetAPIAddressAlt(name, unicode) GetProcAddress(g_LibInfoAlt.hLib, (g_LibInfoAlt.szPrefix + wxT(name) + ((unicode && g_LibInfoAlt.fUnicode) ? wxT("W") : wxEmptyString)).char_str())\r
\r
//******************************************************************************\r
// Callback Wrapper\r
\r
BOOL __stdcall CallbackProc(HWND, unsigned int _uMsg, unsigned int _uState, void * _lpEis)\r
{\r
- if (_uMsg != ::RegisterWindowMessage((const wchar_t *) WM_ARCEXTRACT))\r
+ static unsigned int uWM = ::RegisterWindowMessage(WM_ARCEXTRACT);\r
+ if (_uMsg != uWM)\r
{\r
- // \93Æ\8e©\8ed\97l\82È\82Ç\82É\91Î\82·\82é\97\\94õ\83R\81[\83h\81B\r
+ // 独自仕様などに対する予備コード。\r
return TRUE;\r
}\r
\r
- // \8d\\91¢\91Ì\82ð\8f\89\8aú\89»\81B\r
+ // 構造体を初期化。\r
TPI_PROCESSINFO piInfo;\r
- piInfo.uMessage = TPI_MESSAGE_STATUS;\r
+ piInfo.eMessage = TPI_MESSAGE_STATUS;\r
\r
if (_lpEis != NULL)\r
{\r
{\r
if ((g_LibInfo.fRunning && g_LibInfo.fUnicode) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fUnicode))\r
{\r
- // \8f\89\8aú\89»\81B\r
- EXTRACTINGINFOEXW * ex = (EXTRACTINGINFOEXW *) _lpEis;\r
-\r
- // EXTRACTINGINFOEXW -> TPI_FILEINFO\95Ï\8a·\81B\r
- piInfo.fiInfo.dwCRC32 = ex->dwCRC;\r
- piInfo.fiInfo.tmModified.SetFromDOS(ex->wTime | (ex->wDate << 16));\r
- piInfo.fiInfo.llPackedSize = ex->dwCompressedSize;\r
- piInfo.fiInfo.llUnpackedSize = ex->exinfo.dwFileSize;\r
- piInfo.fiInfo.uOSType = ex->uOSType;\r
- piInfo.fiInfo.wCompressRatio = ex->wRatio;\r
- piInfo.fiInfo.szStoredName = WC2String(ex->exinfo.szSourceFileName);\r
- piInfo.fiInfo.szMethod = WC2String(ex->szMode);\r
-\r
- // EXTRACTINGINFOEXW -> TPI_PROCESSINFO\95Ï\8a·\81B\r
- piInfo.llProcessedSize = ex->exinfo.dwWriteSize;\r
- piInfo.fnDestination = wxFileName(WC2String(ex->exinfo.szDestFileName));\r
+ // EXTRACTINGINFOEXW -> TPI_PROCESSINFO変換。\r
+ MyConvEI322PI(EXTRACTINGINFOEXW, WC2String);\r
}\r
else\r
{\r
- // \8f\89\8aú\89»\81B\r
- EXTRACTINGINFOEX * ex = (EXTRACTINGINFOEX *) _lpEis;\r
-\r
- // EXTRACTINGINFOEX -> TPI_FILEINFO\95Ï\8a·\81B\r
- piInfo.fiInfo.dwCRC32 = ex->dwCRC;\r
- piInfo.fiInfo.tmModified.SetFromDOS(ex->wTime | (ex->wDate << 16));\r
- piInfo.fiInfo.llPackedSize = ex->dwCompressedSize;\r
- piInfo.fiInfo.llUnpackedSize = ex->exinfo.dwFileSize;\r
- piInfo.fiInfo.uOSType = ex->uOSType;\r
- piInfo.fiInfo.wCompressRatio = ex->wRatio;\r
- piInfo.fiInfo.szStoredName = UTF82String(ex->exinfo.szSourceFileName);\r
- piInfo.fiInfo.szMethod = UTF82String(ex->szMode);\r
-\r
- // EXTRACTINGINFOEX -> TPI_PROCESSINFO\95Ï\8a·\81B\r
- piInfo.llProcessedSize = ex->exinfo.dwWriteSize;\r
- piInfo.fnDestination = wxFileName(UTF82String(ex->exinfo.szDestFileName));\r
+ // EXTRACTINGINFOEX -> TPI_PROCESSINFO変換。\r
+ MyConvEI322PI(EXTRACTINGINFOEX, UTF82String);\r
}\r
piInfo.fiInfo.dwAttribute = 0;\r
}\r
{\r
if ((g_LibInfo.fRunning && g_LibInfo.fUnicode) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fUnicode))\r
{\r
- // \8f\89\8aú\89»\81B\r
- EXTRACTINGINFOEX64W * ex = (EXTRACTINGINFOEX64W *) _lpEis;\r
-\r
- // EXTRACTINGINFOEX64W -> TPI_FILEINFO\95Ï\8a·\81B\r
- piInfo.fiInfo.dwAttribute = ex->dwAttributes;\r
- piInfo.fiInfo.dwCRC32 = ex->dwCRC;\r
- piInfo.fiInfo.tmAccess = FileTimeToWxDateTime(& ex->ftAccessTime);\r
- piInfo.fiInfo.tmCreate = FileTimeToWxDateTime(& ex->ftCreateTime);\r
- piInfo.fiInfo.tmModified = FileTimeToWxDateTime(& ex->ftWriteTime);\r
- piInfo.fiInfo.llPackedSize = ex->llCompressedSize;\r
- piInfo.fiInfo.llUnpackedSize = ex->llFileSize;\r
- piInfo.fiInfo.uOSType = ex->uOSType;\r
- piInfo.fiInfo.wCompressRatio = ex->wRatio;\r
- piInfo.fiInfo.szStoredName = WC2String(ex->exinfo.szSourceFileName);\r
- piInfo.fiInfo.szMethod = WC2String(ex->szMode);\r
-\r
- // EXTRACTINGINFOEX64 -> TPI_PROCESSINFO\95Ï\8a·\81B\r
- piInfo.llProcessedSize = ex->llWriteSize;\r
- piInfo.fnDestination = wxFileName(WC2String(ex->exinfo.szDestFileName));\r
+ // EXTRACTINGINFOEX64W -> TPI_PROCESSINFO変換。\r
+ MyConvEI642PI(EXTRACTINGINFOEX64W, WC2String);\r
}\r
else\r
{\r
- // \8f\89\8aú\89»\81B\r
- EXTRACTINGINFOEX64 * ex = (EXTRACTINGINFOEX64 *) _lpEis;\r
-\r
- // EXTRACTINGINFOEX64 -> TPI_FILEINFO\95Ï\8a·\81B\r
- piInfo.fiInfo.dwAttribute = ex->dwAttributes;\r
- piInfo.fiInfo.dwCRC32 = ex->dwCRC;\r
- piInfo.fiInfo.tmAccess = FileTimeToWxDateTime(& ex->ftAccessTime);\r
- piInfo.fiInfo.tmCreate = FileTimeToWxDateTime(& ex->ftCreateTime);\r
- piInfo.fiInfo.tmModified = FileTimeToWxDateTime(& ex->ftWriteTime);\r
- piInfo.fiInfo.llPackedSize = ex->llCompressedSize;\r
- piInfo.fiInfo.llUnpackedSize = ex->llFileSize;\r
- piInfo.fiInfo.uOSType = ex->uOSType;\r
- piInfo.fiInfo.wCompressRatio = ex->wRatio;\r
- piInfo.fiInfo.szStoredName = UTF82String(ex->exinfo.szSourceFileName);\r
- piInfo.fiInfo.szMethod = UTF82String(ex->szMode);\r
-\r
- // EXTRACTINGINFOEX64 -> TPI_PROCESSINFO\95Ï\8a·\81B\r
- piInfo.llProcessedSize = ex->llWriteSize;\r
- piInfo.fnDestination = wxFileName(UTF82String(ex->exinfo.szDestFileName));\r
+ // EXTRACTINGINFOEX64 -> TPI_PROCESSINFO変換。\r
+ MyConvEI642PI(EXTRACTINGINFOEX64, UTF82String);\r
}\r
}\r
piInfo.fiInfo.fnFileName = wxFileName(piInfo.fiInfo.szStoredName);\r
}\r
\r
- // \90\94\8e\9a\82Ì\8f\87\82Å\82È\82\8f\88\97\9d\82Ì\8f\87\82Å\95À\82ñ\82Å\82¢\82é\82±\82Æ\82É\92\8d\88Ó\81B\r
+ // 数字の順でなく処理の順で並んでいることに注意。\r
switch (_uState)\r
{\r
case ARCEXTRACT_OPEN:\r
- // \93\96\8aY\8f\91\8cÉ\82Ì\8f\88\97\9d\82ð\8aJ\8en\81B\r
- piInfo.uStatus = TPI_STATUS_OPENARCHIVE;\r
+ // 当該書庫の処理を開始。\r
+ piInfo.eStatus = TPI_STATUS_OPENARCHIVE;\r
break;\r
case 5:\r
- // \93\96\8aY\83t\83@\83C\83\8b\82Ì\8c\9f\8dõ\92\86\81B\r
- piInfo.uStatus = TPI_STATUS_SEEKFILE;\r
+ // 当該ファイルの検索中。\r
+ piInfo.eStatus = TPI_STATUS_SEEKFILE;\r
break;\r
case ARCEXTRACT_BEGIN:\r
- // \93\96\8aY\83t\83@\83C\83\8b\82Ì\8f\88\97\9d\82ð\8aJ\8en\81B\r
- piInfo.uStatus = TPI_STATUS_BEGINPROCESS;\r
+ // 当該ファイルの処理を開始。\r
+ piInfo.eStatus = TPI_STATUS_BEGINPROCESS;\r
break;\r
case ARCEXTRACT_INPROCESS:\r
- // \93\96\8aY\83t\83@\83C\83\8b\82Ì\8f\88\97\9d\82ð\8eÀ\8ds\92\86\81B\r
- piInfo.uStatus = TPI_STATUS_INPROCESS;\r
+ // 当該ファイルの処理を実行中。\r
+ piInfo.eStatus = TPI_STATUS_INPROCESS;\r
break;\r
case 6:\r
- // \93\96\8aY\83t\83@\83C\83\8b\82Ì\8f\88\97\9d\82ð\8fI\97¹\81B\r
- piInfo.uStatus = TPI_STATUS_ENDPROCESS;\r
+ // 当該ファイルの処理を終了。\r
+ piInfo.eStatus = TPI_STATUS_ENDPROCESS;\r
break;\r
case 7:\r
- // \93\96\8aY\8f\91\8cÉ\82Ì\8c\9f\8d¸\92\86\81B\r
- piInfo.uStatus = TPI_STATUS_TESTARCHIVE;\r
+ // 当該書庫の検査中。\r
+ piInfo.eStatus = TPI_STATUS_TESTARCHIVE;\r
break;\r
case ARCEXTRACT_COPY:\r
- // \93\96\8aY\8f\91\8cÉ\82Ì\8f\91\82«\96ß\82µ\92\86\81B\r
- piInfo.uStatus = TPI_STATUS_COPYARCHIVE;\r
+ // 当該書庫の書き戻し中。\r
+ piInfo.eStatus = TPI_STATUS_COPYARCHIVE;\r
break;\r
case ARCEXTRACT_END:\r
- // \93\96\8aY\8f\91\8cÉ\82Ì\8f\88\97\9d\82ð\8fI\97¹\81B\r
- piInfo.uStatus = TPI_STATUS_CLOSEARCHIVE;\r
+ // 当該書庫の処理を終了。\r
+ piInfo.eStatus = TPI_STATUS_CLOSEARCHIVE;\r
break;\r
}\r
\r
- // \83R\81[\83\8b\83o\83b\83N\8aÖ\90\94\82É\91\97\90M\81B\r
+ // コールバック関数に送信。\r
if (g_prProc == NULL)\r
{\r
return TRUE;\r
return g_prProc(TPI_NOTIFY_COMMON, & piInfo) != TPI_CALLBACK_CANCEL;\r
}\r
\r
+BOOL __stdcall EnumMembersProc(void * _lpEis)\r
+{\r
+ // 構造体を初期化。\r
+ TPI_PROCESSINFO piInfo;\r
+ piInfo.eMessage = TPI_MESSAGE_ASK;\r
+ piInfo.eStatus = TPI_PARAM_DEST;\r
+ if (g_prProc == NULL)\r
+ {\r
+ return TRUE;\r
+ }\r
+\r
+ if (_lpEis != NULL)\r
+ {\r
+ if ((g_LibInfo.fRunning && g_LibInfo.fCallback32bit) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fCallback32bit))\r
+ {\r
+ if ((g_LibInfo.fRunning && g_LibInfo.fUnicode) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fUnicode))\r
+ {\r
+ // ENUM_MEMBER_INFOW -> TPI_FILEINFO変換。\r
+ MyConvEM322PI(ENUM_MEMBER_INFOW, WC2String);\r
+ wcsncpy(ex->szAddFileName, piInfo.fnDestination.GetFullPath().c_str(), FNAME_MAX32);\r
+ }\r
+ else\r
+ {\r
+ // ENUM_MEMBER_INFO -> TPI_FILEINFO変換。\r
+ MyConvEM322PI(ENUM_MEMBER_INFO, UTF82String);\r
+ strncpy(ex->szAddFileName, piInfo.fnDestination.GetFullPath().ToUTF8(), FNAME_MAX32);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if ((g_LibInfo.fRunning && g_LibInfo.fUnicode) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fUnicode))\r
+ {\r
+ // ENUM_MEMBER_INFO64W -> TPI_FILEINFO変換。\r
+ MyConvEM642PI(ENUM_MEMBER_INFO64W, WC2String);\r
+ wcsncpy(ex->szAddFileName, piInfo.fnDestination.GetFullPath().c_str(), FNAME_MAX32);\r
+ }\r
+ else\r
+ {\r
+ // ENUM_MEMBER_INFO64 -> TPI_FILEINFO変換。\r
+ MyConvEM642PI(ENUM_MEMBER_INFO64, UTF82String);\r
+ strncpy(ex->szAddFileName, piInfo.fnDestination.GetFullPath().ToUTF8(), FNAME_MAX32);\r
+ }\r
+ }\r
+ }\r
+\r
+ return piInfo.fnDestination.IsOk();\r
+}\r
+\r
//******************************************************************************\r
// Inside Functions\r
//******************************************************************************\r
\r
-#define GetAPIAddress(name, unicode) GetProcAddress(g_LibInfo.hLib, (g_LibInfo.szPrefix + wxT(name) + ((unicode && g_LibInfo.fUnicode) ? wxT("W") : wxEmptyString)).char_str())\r
-#define GetAPIAddressAlt(name, unicode) GetProcAddress(g_LibInfoAlt.hLib, (g_LibInfoAlt.szPrefix + wxT(name) + ((unicode && g_LibInfoAlt.fUnicode) ? wxT("W") : wxEmptyString)).char_str())\r
-\r
-int CalErrorCodeConvert(int nCalErrorCode)\r
+int ErrorCodeConvert(int nErrorCode)\r
{\r
- switch (nCalErrorCode)\r
+ switch (nErrorCode)\r
{\r
case 0: return TPI_ERROR_SUCCESS;\r
+ case -1: return TPI_ERROR_S_ENDOFDATA;\r
case ERROR_DISK_SPACE: return TPI_ERROR_IO_ARC_WRITE;\r
case ERROR_READ_ONLY: return TPI_ERROR_IO_FILE_WRITE;\r
case ERROR_USER_SKIP: return TPI_ERROR_D_SKIPPED;\r
\r
int CalSetCallbackProc(bool fAlt)\r
{\r
- // \90æ\82É\83R\81[\83\8b\83o\83b\83N\8aÖ\90\94\82Ì\90Ý\92è\82ð\89ð\8f\9c\82µ\82Ä\82¨\82\81B\r
+ // 先にコールバック関数の設定を解除しておく。\r
FARPROC fpProc;\r
if (fAlt)\r
{\r
{\r
return TPI_ERROR_U_USE_LIBRARY;\r
}\r
- // \83G\83\89\81[\82Å\82à\96³\8e\8b\82·\82é\81B\r
+ // エラーでも無視する。\r
((BOOL (__stdcall *)(HWND)) fpProc)(NULL);\r
\r
- // \91±\82¢\82Ä\83R\81[\83\8b\83o\83b\83N\8aÖ\90\94\82Ì\90Ý\92è\81B\r
+ // 続いてコールバック関数の設定。\r
if (fAlt)\r
{\r
fpProc = ::GetAPIAddressAlt("SetOwnerWindowEx64", false);\r
}\r
}\r
\r
- return (fpProc == NULL || ! ((fAlt ? g_LibInfoAlt.fCallback32bit : g_LibInfo.fCallback32bit)\r
+ if (fpProc == NULL || ! ((fAlt ? g_LibInfoAlt.fCallback32bit : g_LibInfo.fCallback32bit)\r
? ((BOOL (__stdcall *)(HWND, ARCHIVERPROC * )) fpProc)(NULL, (ARCHIVERPROC *) CallbackProc)\r
: ((BOOL (__stdcall *)(HWND, ARCHIVERPROC *, DWORD)) fpProc)(NULL, (ARCHIVERPROC *) CallbackProc, (fAlt ? g_LibInfoAlt.fUnicode : g_LibInfo.fUnicode) ? sizeof(EXTRACTINGINFOEX64W) : sizeof(EXTRACTINGINFOEX64))))\r
+ {\r
+ return TPI_ERROR_U_USE_LIBRARY;\r
+ }\r
+\r
+ // EnumMembersProc系。\r
+ if (fAlt)\r
+ {\r
+ fpProc = ::GetAPIAddressAlt("ClearEnumMembersProc64", false);\r
+ g_LibInfoAlt.fCallback32bit = fpProc == NULL;\r
+ if (g_LibInfoAlt.fCallback32bit)\r
+ {\r
+ fpProc = ::GetAPIAddressAlt("ClearEnumMembersProc", false);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ fpProc = ::GetAPIAddress("ClearEnumMembersProc64", false);\r
+ g_LibInfo.fCallback32bit = fpProc == NULL;\r
+ if (g_LibInfo.fCallback32bit)\r
+ {\r
+ fpProc = ::GetAPIAddress("ClearEnumMembersProc", false);\r
+ }\r
+ }\r
+ if (fpProc == NULL)\r
+ {\r
+ return TPI_ERROR_U_USE_LIBRARY;\r
+ }\r
+ // エラーでも無視する。\r
+// ((BOOL (__stdcall *)(void)) fpProc)();\r
+\r
+ // 続いて設定。\r
+ if (fAlt)\r
+ {\r
+ fpProc = ::GetAPIAddressAlt("SetEnumMembersProc64", false);\r
+ g_LibInfoAlt.fCallback32bit = fpProc == NULL;\r
+ if (g_LibInfoAlt.fCallback32bit)\r
+ {\r
+ fpProc = ::GetAPIAddressAlt("SetEnumMembersProc", true);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ fpProc = ::GetAPIAddress("SetEnumMembersProc64", false);\r
+ g_LibInfo.fCallback32bit = fpProc == NULL;\r
+ if (g_LibInfo.fCallback32bit)\r
+ {\r
+ fpProc = ::GetAPIAddress("SetEnumMembersProc", true);\r
+ }\r
+ }\r
+\r
+ return (fpProc == NULL || ! ((fAlt ? g_LibInfoAlt.fCallback32bit : g_LibInfo.fCallback32bit)\r
+ ? ((BOOL (__stdcall *)(WND_ENUMMEMBPROC * )) fpProc)((WND_ENUMMEMBPROC *) EnumMembersProc)\r
+ : ((BOOL (__stdcall *)(WND_ENUMMEMBPROC *, DWORD)) fpProc)((WND_ENUMMEMBPROC *) EnumMembersProc, (fAlt ? g_LibInfoAlt.fUnicode : g_LibInfo.fUnicode) ? sizeof(ENUM_MEMBER_INFO64W) : sizeof(ENUM_MEMBER_INFO))))\r
? TPI_ERROR_U_USE_LIBRARY : TPI_ERROR_SUCCESS;\r
}\r
\r
int __stdcall GetPluginInformation\r
(\r
unsigned int _uInfoId,\r
- wxULongLong,\r
+ wxULongLong_t,\r
void * _pPtr\r
)\r
{\r
{\r
return TPI_ERROR_D_PARAMETER;\r
}\r
- switch (LOWORD(_uInfoId))\r
+ switch (_uInfoId)\r
{\r
case TPI_INFO_VERSION_MAJOR:\r
case TPI_INFO_VERSION_MINOR:\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/calLibrary.xml"));\r
- // \88ê\8bC\82É\90æ\93ª\82Ì\83\89\83C\83u\83\89\83\8a\82Ì\8fî\95ñ\82ð\8eæ\93¾\81B\r
- wxXmlNode * xmlLibrary = config.GetRoot()->GetChildren();\r
-\r
+ static wxULongLong_t s_nFileId;\r
+ static wxXmlDocument xmlDoc(myMakeXMLName(wxT("calLibrary")));\r
+ static wxXmlNode * xmlLibrary;\r
if (_bFirst)\r
{\r
- // xml\89ð\90Í\8aJ\8en\81B\r
- s_uFileID = 0;\r
+ // xml解析開始。\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
- // xml\95¶\96@\83G\83\89\81[\81B\r
- return TPI_ERROR_UNDEFINED;\r
+ // データの終端に達した場合。\r
+ return TPI_ERROR_S_ENDOFDATA;\r
}\r
\r
- MakeFormatInfo(wxT("calLibrary"), _fiInfo, xmlLibrary, s_uFileID++);\r
-\r
+ MakeFormatInfo(xmlLibrary, wxT("calLibrary"), _fiInfo, s_nFileId++);\r
return TPI_ERROR_SUCCESS;\r
}\r
\r
int __stdcall LoadPlugin\r
(\r
const wxString & _szArcName,\r
- wxULongLong _llSubOption\r
+ TPI_PROC _prProc,\r
+ wxULongLong_t _nTypeId\r
)\r
{\r
- // xml\89ð\90Í\8aJ\8en\81B\r
- wxStandardPaths p;\r
- wxXmlDocument config(wxPathOnly(p.GetExecutablePath()) + wxT("/lib/calLibrary.xml"));\r
- if (! config.IsOk())\r
- {\r
- return TPI_ERROR_UNDEFINED;\r
- }\r
- // \88ê\8bC\82É\90æ\93ª\82Ì\83\89\83C\83u\83\89\83\8a\82Ì\8fî\95ñ\82ð\8eæ\93¾\81B\r
- wxXmlNode * xmlLibrary = config.GetRoot()->GetChildren();\r
+ // xml解析開始。\r
+ wxXmlDocument xmlDoc(myMakeXMLName(wxT("calLibrary")));\r
+ wxXmlNode * xmlLibrary;\r
\r
- // \91Î\8fÛ\82ª\91¶\8dÝ\82·\82é\82È\82ç\82Î\91Î\89\9e\82·\82é\83\89\83C\83u\83\89\83\8a\82ð\92²\8d¸\81A\r
- // \91Î\8fÛ\82ª\91¶\8dÝ\82µ\82È\82¢\82È\82ç\82Î\8ew\8e¦\82³\82ê\82½\83\89\83C\83u\83\89\83\8a\82ð\83\8d\81[\83h\81B\r
+ // 対象が存在するならば対応するライブラリを調査、\r
+ // 対象が存在しないならば指示されたライブラリをロード。\r
+ ::RemoveCwdFromSearchPath();\r
if (! ::wxFileExists(_szArcName))\r
{\r
- // \93K\93\96\82È\88Ê\92u\82Ü\82Å\88Ú\93®\81B\r
- for (g_LibInfo.nLibIndex = 0; g_LibInfo.nLibIndex < _llSubOption && xmlLibrary != NULL; g_LibInfo.nLibIndex++)\r
+ xmlLibrary = myGetFirstLib(& xmlDoc, _nTypeId);\r
+ if (xmlLibrary == NULL)\r
{\r
- xmlLibrary = xmlLibrary->GetNext();\r
- }\r
- if (xmlLibrary == NULL || xmlLibrary->GetName() != wxT("library"))\r
- {\r
- // xml\95¶\96@\83G\83\89\81[\81B\r
+ // xml文法エラー。\r
return TPI_ERROR_UNDEFINED;\r
}\r
- g_LibInfo.node = * xmlLibrary;\r
\r
- // \83\89\83C\83u\83\89\83\8a\82ð\83\8d\81[\83h\81B\r
- g_LibInfo.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetPropVal(wxT("name"), wxEmptyString).c_str());\r
+ // ライブラリをロード。\r
+ g_LibInfo.hLib = ::LoadLibrary(xmlLibrary->GetAttribute(wxT("name"), wxEmptyString).wchar_str());\r
if (g_LibInfo.hLib == NULL)\r
{\r
return TPI_ERROR_U_LOAD_LIBRARY;\r
}\r
- g_LibInfo.szPrefix = xmlLibrary->GetPropVal(wxT("prefix"), wxEmptyString);\r
- g_LibInfo.fUnicode = xmlLibrary->GetPropVal(wxT("unicode"), wxT("0")) == wxT("1");\r
+ g_LibInfo.szPrefix = xmlLibrary->GetAttribute(wxT("prefix"), wxEmptyString);\r
+ g_LibInfo.fUnicode = myGetAttributeBool(xmlLibrary, wxT("unicode"));\r
+ g_LibInfo.node = * xmlLibrary;\r
+ g_LibInfo.nLibIndex = _nTypeId;\r
\r
- // \91ã\91Ö\83\89\83C\83u\83\89\83\8a\82à\83\8d\81[\83h\81B\83\8d\81[\83h\82Å\82«\82È\82\82Ä\82à\83G\83\89\81[\82É\82Í\82µ\82È\82¢\81B\r
- g_LibInfoAlt.szPrefix = xmlLibrary->GetPropVal(wxT("prefix-alt"), wxEmptyString);\r
- g_LibInfoAlt.fUnicode = xmlLibrary->GetPropVal(wxT("unicode-alt"), wxT("0")) == wxT("1");\r
- g_LibInfoAlt.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetPropVal(wxT("name-alt"), wxEmptyString).c_str());\r
+ // 代替ライブラリもロード。ロードできなくてもエラーにはしない。\r
+ g_LibInfoAlt.szPrefix = xmlLibrary->GetAttribute(wxT("prefix-alt"), wxEmptyString);\r
+ g_LibInfoAlt.fUnicode = myGetAttributeBool(xmlLibrary, wxT("unicode-alt"));\r
+ g_LibInfoAlt.hLib = ::LoadLibrary(xmlLibrary->GetAttribute(wxT("name-alt"), wxEmptyString).wchar_str());\r
\r
+ // コールバック関数を設定。\r
+ if (_prProc != NULL)\r
+ {\r
+ g_prProc = * _prProc;\r
+ CalSetCallbackProc(true);\r
+ CalSetCallbackProc(false);\r
+ }\r
return TPI_ERROR_SUCCESS;\r
}\r
\r
- // \96³\8cÀ\83\8b\81[\83v\82É\8a×\82ç\82È\82¢\82æ\82¤\8fã\8cÀ\82ð\90Ý\92è\81B\r
+ // 無限ループに陥らないよう上限を設定。\r
+ xmlLibrary = myGetFirstLib(& xmlDoc);\r
for (g_LibInfo.nLibIndex = 0; g_LibInfo.nLibIndex < 300 && xmlLibrary != NULL; g_LibInfo.nLibIndex++)\r
{\r
- // \83\89\83C\83u\83\89\83\8a\82ð\83\8d\81[\83h\81B\r
- g_LibInfo.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetPropVal(wxT("name"), wxEmptyString).c_str());\r
+ // ライブラリをロード。\r
+ g_LibInfo.hLib = ::LoadLibrary(xmlLibrary->GetAttribute(wxT("name"), wxEmptyString).wchar_str());\r
if (g_LibInfo.hLib == NULL)\r
{\r
- xmlLibrary = xmlLibrary->GetNext();\r
+ xmlLibrary = myGetNextLib(xmlLibrary);\r
continue;\r
}\r
- g_LibInfo.szPrefix = xmlLibrary->GetPropVal(wxT("prefix"), wxEmptyString);\r
- g_LibInfo.fUnicode = xmlLibrary->GetPropVal(wxT("unicode"), wxT("0")) == wxT("1");\r
-\r
- // \91ã\91Ö\83\89\83C\83u\83\89\83\8a\82à\83\8d\81[\83h\81B\83\8d\81[\83h\82Å\82«\82È\82\82Ä\82à\83G\83\89\81[\82É\82Í\82µ\82È\82¢\81B\r
- g_LibInfoAlt.szPrefix = xmlLibrary->GetPropVal(wxT("prefix-alt"), wxEmptyString);\r
- g_LibInfoAlt.fUnicode = xmlLibrary->GetPropVal(wxT("unicode-alt"), wxT("0")) == wxT("1");\r
- g_LibInfoAlt.hLib = ::LoadLibrary((const WCHAR *) xmlLibrary->GetPropVal(wxT("name-alt"), wxEmptyString).c_str());\r
+ g_LibInfo.szPrefix = xmlLibrary->GetAttribute(wxT("prefix"), wxEmptyString);\r
+ g_LibInfo.fUnicode = myGetAttributeBool(xmlLibrary, wxT("unicode"));\r
g_LibInfo.node = * xmlLibrary;\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
+ g_LibInfoAlt.szPrefix = xmlLibrary->GetAttribute(wxT("prefix-alt"), wxEmptyString);\r
+ g_LibInfoAlt.fUnicode = myGetAttributeBool(xmlLibrary, wxT("unicode-alt"));\r
+ g_LibInfoAlt.hLib = ::LoadLibrary(xmlLibrary->GetAttribute(wxT("name-alt"), wxEmptyString).wchar_str());\r
+\r
+ // Unicodeモードに設定。\r
+ FARPROC fpProc = ::GetAPIAddress("SetUnicodeMode", false);\r
+ if (fpProc != NULL)\r
{\r
- // \91Î\89\9e\82µ\82Ä\82¢\82ê\82Î\8f\88\97\9d\82ð\8fI\97¹\81B\r
- return TPI_ERROR_SUCCESS;\r
+ ((BOOL (__stdcall *)(BOOL)) fpProc)(TRUE);\r
}\r
\r
+ // 書庫に対応しているかチェック。\r
+ fpProc = ::GetAPIAddress("CheckArchive", true);\r
+ if (fpProc != NULL && (g_LibInfo.fUnicode\r
+ ? ((BOOL (__stdcall *)(const wchar_t *, const int)) fpProc)(_szArcName.wchar_str(), 0)\r
+ : ((BOOL (__stdcall *)(const char *, const int)) fpProc)(_szArcName.ToUTF8(), 0)))\r
+ {\r
+ // コールバック関数を設定。\r
+ if (_prProc != NULL)\r
+ {\r
+ g_prProc = * _prProc;\r
+ CalSetCallbackProc(true);\r
+ CalSetCallbackProc(false);\r
+ }\r
+ return TPI_ERROR_SUCCESS;\r
+ }\r
::FreeLibrary(g_LibInfo.hLib);\r
- xmlLibrary = xmlLibrary->GetNext();\r
+ ::FreeLibrary(g_LibInfoAlt.hLib);\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
- int * _nFileCount\r
+ void * * _hArchive,\r
+ wxULongLong_t * _nFileCount\r
)\r
{\r
- // Unicode\83\82\81[\83h\82É\90Ý\92è\81B\r
- FARPROC fpProc = ::GetAPIAddress("SetUnicodeMode", false);\r
- g_fExistUnicodeMode = fpProc != NULL;\r
- if (g_fExistUnicodeMode)\r
- {\r
- ((BOOL (__stdcall *)(BOOL)) fpProc)(TRUE);\r
- }\r
-\r
- fpProc = ::GetAPIAddress("CheckArchive", true);\r
- if (fpProc == NULL)\r
- {\r
- return TPI_ERROR_U_USE_LIBRARY;\r
- }\r
-\r
- if (! (g_LibInfo.fUnicode\r
- ? ((BOOL (__stdcall *)(const wchar_t *, const int)) fpProc)(_szArcName.wchar_str(), 0)\r
- : ((BOOL (__stdcall *)(const char *, const int)) fpProc)(_szArcName.ToUTF8(), 0)\r
- ))\r
- {\r
- return TPI_ERROR_D_UNSUPPORTED;\r
- }\r
-\r
+ // ファイル数を取得。\r
+ FARPROC fpProc;\r
if (_nFileCount != NULL)\r
{\r
fpProc = ::GetAPIAddress("GetFileCount", true);\r
- if (fpProc == NULL)\r
- {\r
- return TPI_ERROR_U_USE_LIBRARY;\r
- }\r
-\r
- * _nFileCount = g_LibInfo.fUnicode\r
- ? ((int (__stdcall *)(const wchar_t *)) fpProc)(_szArcName.wchar_str())\r
- : ((int (__stdcall *)(const char *)) fpProc)(_szArcName.ToUTF8());\r
- if (* _nFileCount == -1)\r
+ if (fpProc != NULL)\r
{\r
- return TPI_ERROR_ARC_UNSUPPORTED;\r
+ int n = g_LibInfo.fUnicode\r
+ ? ((int (__stdcall *)(const wchar_t *)) fpProc)(_szArcName.wchar_str())\r
+ : ((int (__stdcall *)(const char *)) fpProc)(_szArcName.ToUTF8());\r
+ * _nFileCount = n < 0 ? 0 : n;\r
}\r
}\r
\r
- return TPI_ERROR_SUCCESS;\r
-}\r
-\r
-int __stdcall OpenArchive\r
-(\r
- const wxString & _szArcName,\r
- void * * _hArchive\r
-)\r
-{\r
- FARPROC fpProc = ::GetAPIAddress("OpenArchive", true);\r
+ fpProc = ::GetAPIAddress("OpenArchive", true);\r
if (fpProc == NULL)\r
{\r
return TPI_ERROR_U_USE_LIBRARY;\r
)\r
{\r
FARPROC fpProc = ::GetAPIAddress("CloseArchive", false);\r
- return fpProc == NULL ? TPI_ERROR_U_USE_LIBRARY : CalErrorCodeConvert(((int (__stdcall *)(void *)) fpProc)(_hArchive));\r
+ return fpProc == NULL ? TPI_ERROR_U_USE_LIBRARY : ErrorCodeConvert(((int (__stdcall *)(void *)) fpProc)(_hArchive));\r
}\r
\r
int __stdcall GetFileInformation\r
bool _bFirst\r
)\r
{\r
- static unsigned int s_uFileID;\r
- static FARPROC fpNext, fpAttr;\r
- int nResult;\r
+ static wxULongLong_t s_nFileId;\r
+ static FARPROC fpNext, fpAttr, fpName;\r
+ int nErrorCode;\r
INDIVIDUALINFO iiInfo;\r
INDIVIDUALINFOW iiInfoW;\r
memset(& iiInfo, 0, sizeof(iiInfo));\r
\r
if (_bFirst)\r
{\r
- s_uFileID = 0;\r
+ s_nFileId = 0;\r
FARPROC fpProc = ::GetAPIAddress("FindFirst", true);\r
fpNext = ::GetAPIAddress("FindNext", true);\r
fpAttr = ::GetAPIAddress("GetAttribute", false);\r
+ fpName = ::GetAPIAddress("GetFileName", true);\r
if (fpProc == NULL)\r
{\r
return TPI_ERROR_U_USE_LIBRARY;\r
}\r
\r
- nResult = g_LibInfo.fUnicode\r
+ nErrorCode = g_LibInfo.fUnicode\r
? ((int (__stdcall *)(void *, const wchar_t *, LPINDIVIDUALINFOW)) fpProc)(_hArchive, L"*", & iiInfoW)\r
: ((int (__stdcall *)(void *, const char *, LPINDIVIDUALINFO)) fpProc)(_hArchive, "*", & iiInfo);\r
}\r
return TPI_ERROR_U_USE_LIBRARY;\r
}\r
\r
- nResult = g_LibInfo.fUnicode\r
+ nErrorCode = g_LibInfo.fUnicode\r
? ((int (__stdcall *)(void *, LPINDIVIDUALINFOW)) fpNext)(_hArchive, & iiInfoW)\r
: ((int (__stdcall *)(void *, LPINDIVIDUALINFO)) fpNext)(_hArchive, & iiInfo);\r
}\r
\r
- nResult = CalErrorCodeConvert(nResult);\r
- if (nResult == TPI_ERROR_SUCCESS)\r
+ nErrorCode = ErrorCodeConvert(nErrorCode);\r
+ if (nErrorCode == TPI_ERROR_SUCCESS)\r
{\r
_fiInfo->dwAttribute = (fpAttr == NULL) ? 0 : ((int (__stdcall *)(void *)) fpAttr)(_hArchive);\r
- if ((signed) _fiInfo->dwAttribute == -1)\r
+ if (_fiInfo->dwAttribute == (unsigned) -1)\r
{\r
_fiInfo->dwAttribute = 0;\r
}\r
if (g_LibInfo.fUnicode)\r
{\r
_fiInfo->dwCRC32 = iiInfoW.dwCRC;\r
- _fiInfo->uOSType = iiInfoW.uOSType;\r
- _fiInfo->llPackedSize = iiInfoW.dwCompressedSize;\r
- _fiInfo->llUnpackedSize = iiInfoW.dwOriginalSize;\r
- _fiInfo->tmModified.SetFromDOS(MAKELONG(iiInfoW.wTime, iiInfoW.wDate));\r
+ _fiInfo->eOSType = iiInfoW.uOSType;\r
+ _fiInfo->nPackedSize = iiInfoW.dwCompressedSize;\r
+ _fiInfo->nUnpackedSize = iiInfoW.dwOriginalSize;\r
+ _fiInfo->tmModify.SetFromDOS(MAKELONG(iiInfoW.wTime, iiInfoW.wDate));\r
_fiInfo->szStoredName = WC2String(iiInfoW.szFileName);\r
+ if (wcslen(iiInfoW.szFileName) >= 510 && fpName)\r
+ {\r
+ ((int (__stdcall *)(void *, wchar_t *, const int)) fpName)(_hArchive, wxStringBuffer(_fiInfo->szStoredName, 32769), 32768);\r
+ }\r
_fiInfo->szMethod = WC2String(iiInfoW.szMode);\r
_fiInfo->wCompressRatio = iiInfoW.wRatio;\r
}\r
else\r
{\r
_fiInfo->dwCRC32 = iiInfo.dwCRC;\r
- _fiInfo->uOSType = iiInfo.uOSType;\r
- _fiInfo->llPackedSize = iiInfo.dwCompressedSize;\r
- _fiInfo->llUnpackedSize = iiInfo.dwOriginalSize;\r
- _fiInfo->tmModified.SetFromDOS(MAKELONG(iiInfo.wTime, iiInfo.wDate));\r
+ _fiInfo->eOSType = iiInfo.uOSType;\r
+ _fiInfo->nPackedSize = iiInfo.dwCompressedSize;\r
+ _fiInfo->nUnpackedSize = iiInfo.dwOriginalSize;\r
+ _fiInfo->tmModify.SetFromDOS(MAKELONG(iiInfo.wTime, iiInfo.wDate));\r
_fiInfo->szStoredName = UTF82String(iiInfo.szFileName);\r
+ if (strlen(iiInfo.szFileName) >= 510 && fpName)\r
+ {\r
+ char * sz = (char *) malloc(32769);\r
+ memset(sz, 0, 32769);\r
+ ((int (__stdcall *)(void *, char *, const int)) fpName)(_hArchive, sz, 32768);\r
+ _fiInfo->szStoredName = UTF82String(sz);\r
+ free(sz);\r
+ }\r
_fiInfo->szMethod = UTF82String(iiInfo.szMode);\r
_fiInfo->wCompressRatio = iiInfo.wRatio;\r
}\r
- _fiInfo->llFileID = s_uFileID++;\r
+ _fiInfo->nFileId = s_nFileId++;\r
_fiInfo->fnFileName = wxFileName(_fiInfo->szStoredName);\r
// _fiInfo->ftAccessTime = 0;\r
// _fiInfo->ftCreateTime = 0;\r
}\r
\r
- return nResult;\r
+ return nErrorCode;\r
}\r
\r
int __stdcall GetArchiveInformation\r
FARPROC fpProc = ::GetAPIAddress("GetArcFileName", true);\r
if (fpProc != NULL)\r
{\r
- // TODO : \83t\83@\83C\83\8b\96¼\82Ì\95¶\8e\9a\90\94\90§\8cÀ\82ð\93P\94p\81B\r
+ // TODO : ファイル名の文字数制限を撤廃。\r
wxString s;\r
if (g_LibInfo.fUnicode)\r
{\r
wchar_t sz[2049];\r
+ memset(sz, 0, sizeof(sz));\r
((int (__stdcall *)(void *, wchar_t *, const int)) fpProc)(_hArchive, sz, 2048);\r
s = WC2String(sz);\r
}\r
else\r
{\r
char sz[2049];\r
+ memset(sz, 0, sizeof(sz));\r
((int (__stdcall *)(void *, char *, const int)) fpProc)(_hArchive, sz, 2048);\r
s = UTF82String(sz);\r
}\r
_aiInfo->fnArchive = wxFileName(s);\r
}\r
\r
- fpProc = ::GetAPIAddress("GetArcFileSizeEx", false);\r
- if (fpProc != NULL)\r
- {\r
- ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->llFileSize);\r
- }\r
- else\r
- {\r
- fpProc = ::GetAPIAddress("GetArcFileSize", false);\r
- if (fpProc != NULL)\r
- {\r
- _aiInfo->llFileSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
- }\r
- }\r
-\r
- fpProc = ::GetAPIAddress("GetArcOriginalSizeEx", false);\r
- if (fpProc != NULL)\r
- {\r
- ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->llUnpackedSize);\r
- }\r
- else\r
- {\r
- fpProc = ::GetAPIAddress("GetArcOriginalSize", false);\r
- if (fpProc != NULL)\r
- {\r
- _aiInfo->llUnpackedSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
- }\r
- }\r
-\r
- fpProc = ::GetAPIAddress("GetArcCompressedSizeEx", false);\r
- if (fpProc != NULL)\r
+ wxLongLong_t ll = 0;\r
+ MySetArcSize(GetArcFileSize, nFileSize);\r
+ MySetArcSize(GetArcOriginalSize, nUnpackedSize);\r
+ MySetArcSize(GetArcCompressedSize, nPackedSize);\r
+ MySetArcSize(GetArcReadSize, nReadSize);\r
+ if (_aiInfo->nPackedSize == (DWORD) -1)\r
{\r
- ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->llPackedSize);\r
- }\r
- else\r
- {\r
- fpProc = ::GetAPIAddress("GetArcCompressedSize", false);\r
- if (fpProc != NULL)\r
- {\r
- _aiInfo->llPackedSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
- }\r
+ // 圧縮後サイズの取得に対応していない場合、書庫のサイズで代替。\r
+ _aiInfo->nPackedSize = _aiInfo->nFileSize;\r
}\r
\r
- fpProc = ::GetAPIAddress("GetArcReadSizeEx", false);\r
- if (fpProc != NULL)\r
- {\r
- ((BOOL (__stdcall *)(void *, LONGLONG *)) fpProc)(_hArchive, (LONGLONG *) & _aiInfo->llReadSize);\r
- }\r
- else\r
- {\r
- fpProc = ::GetAPIAddress("GetArcReadSize", false);\r
- if (fpProc != NULL)\r
- {\r
- _aiInfo->llReadSize = ((DWORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
- }\r
- }\r
+ FILETIME ft;\r
+ MySetArcTime(GetArcAccessTime, tmAccess, false);\r
+ MySetArcTime(GetArcCreateTime, tmCreate, false);\r
+ MySetArcTime(GetArcWriteTime, tmModify, true);\r
\r
fpProc = ::GetAPIAddress("GetArcRatio", false);\r
if (fpProc != NULL)\r
{\r
_aiInfo->wCompressRatio = ((WORD (__stdcall *)(void *)) fpProc)(_hArchive);\r
- }\r
-\r
- FILETIME ft;\r
- fpProc = ::GetAPIAddress("GetArcAccessTimeEx", false);\r
- if (fpProc != NULL)\r
- {\r
- ((BOOL (__stdcall *)(void *, FILETIME *)) fpProc)(_hArchive, & ft);\r
- _aiInfo->tmAccess = FileTimeToWxDateTime(& ft);\r
- }\r
-\r
- fpProc = ::GetAPIAddress("GetArcCreatedTimeEx", false);\r
- if (fpProc != NULL)\r
- {\r
- ((BOOL (__stdcall *)(void *, FILETIME *)) fpProc)(_hArchive, & ft);\r
- _aiInfo->tmCreate = FileTimeToWxDateTime(& ft);\r
- }\r
-\r
- fpProc = ::GetAPIAddress("GetArcWriteTimeEx", false);\r
- if (fpProc != NULL)\r
- {\r
- ((BOOL (__stdcall *)(void *, FILETIME *)) fpProc)(_hArchive, & ft);\r
- _aiInfo->tmModified = FileTimeToWxDateTime(& ft);\r
+ if (_aiInfo->wCompressRatio == (WORD) -1)\r
+ {\r
+ // エラーなら0にしておく。\r
+ _aiInfo->wCompressRatio = 0;\r
+ }\r
}\r
\r
fpProc = ::GetAPIAddress("GetArcOSType", false);\r
if (fpProc != NULL)\r
{\r
- _aiInfo->uOSType = ((UINT (__stdcall *)(void *)) fpProc)(_hArchive);\r
+ _aiInfo->eOSType = ((UINT (__stdcall *)(void *)) fpProc)(_hArchive);\r
}\r
\r
fpProc = ::GetAPIAddress("IsSFXFile", false);\r
- if (fpProc != NULL)\r
- {\r
- _aiInfo->nSFXType = ((int (__stdcall *)(void *)) fpProc)(_hArchive);\r
- }\r
- if (fpProc == NULL || _aiInfo->nSFXType < 0)\r
- {\r
- // \83G\83\89\81[\82Ì\8fê\8d\87\82Í\82Æ\82è\82 \82¦\82¸\92Ê\8fí\82Ì\8f\91\8cÉ\82Æ\82Ý\82È\82·\81B\r
- _aiInfo->nSFXType = 0;\r
- }\r
+ _aiInfo->fSFX = fpProc != NULL && ((int (__stdcall *)(void *)) fpProc)(_hArchive) > 0;\r
\r
- // \8c`\8e®\82É\8aÖ\82·\82é\8fî\95ñ\82ð\8eæ\93¾\81B\r
- MakeFormatInfo(wxT("calLibrary"), & _aiInfo->fiInfo, & g_LibInfo.node, 0);\r
+ // 形式に関する情報を取得。\r
+ MakeFormatInfo(& g_LibInfo.node, wxT("calLibrary"), & _aiInfo->fiInfo, 0);\r
\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
const wxArrayString & _szFiles\r
)\r
{\r
- // Ini\82©\82ç\83R\83}\83\93\83h\83\89\83C\83\93\82ð\8eæ\93¾\81B\r
+ // xmlからコマンドラインを取得。\r
wxString szPath, szCommandLine;\r
\r
- // API\83A\83h\83\8c\83X\8eæ\93¾\81B\r
+ // APIアドレス取得。\r
g_LibInfoAlt.fRunning\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
g_LibInfo.fRunning\r
- = 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
+ = 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
FARPROC fpProc =\r
g_LibInfo.fRunning ? ::GetAPIAddress( "", true) :\r
return TPI_ERROR_U_USE_LIBRARY;\r
}\r
\r
- // \83R\83}\83\93\83h\83\89\83C\83\93\81E\83\8c\83X\83|\83\93\83X\83t\83@\83C\83\8b\8dì\90¬\81B\r
+ // コマンドライン・レスポンスファイル作成。\r
wxString\r
- szResponceFileName = MakeResponceFile(_szFiles, g_LibInfo.node.GetPropVal(wxT("quote-resp"), wxT("1")) == wxT("1")),\r
+ szResponceFileName = g_LibInfo.fRunning ?\r
+ MakeResponceFile(_szFiles, myGetAttributeBool(& g_LibInfo.node, wxT("quote-resp"), true), g_LibInfo.fUnicode) :\r
+ MakeResponceFile(_szFiles, myGetAttributeBool(& g_LibInfoAlt.node, wxT("quote-resp"), true), g_LibInfoAlt.fUnicode),\r
szCommandLineSend = MakeCommandLineSend(szCommandLine, _szArcName, _swInfo, _szFiles, szResponceFileName);\r
\r
- // \83R\83}\83\93\83h\83\89\83C\83\93\8eÀ\8ds\81B\r
+ // コマンドライン実行。\r
int nErrorCode;\r
wxString szOutput;\r
if ((g_LibInfo.fRunning && g_LibInfo.fUnicode) || (g_LibInfoAlt.fRunning && g_LibInfoAlt.fUnicode))\r
szOutput = UTF82String(szTmpOut);\r
}\r
\r
- // \83\8c\83X\83|\83\93\83X\83t\83@\83C\83\8b\8dí\8f\9c\81B\r
+ // レスポンスファイル削除。\r
::wxRemoveFile(szResponceFileName);\r
\r
if (nErrorCode != 0)\r
{\r
-#ifdef __LINUX__\r
- ::wxMessageBox(wxString::Format(wxT("Error :\n%x\n\nCommandLine:\n%s\n\nOutput:\n%s"), nErrorCode, szCommandLineSend.c_str(), szOutput.c_str()));\r
-#else\r
- MessageBox(NULL, wxString::Format(wxT("Error :\n%x\n\nCommandLine:\n%s\n\nOutput:\n%s"), nErrorCode, szCommandLineSend.c_str(), szOutput.c_str()), NULL, 0);\r
-#endif\r
+ wxLogError(L"Error :\n%x\n\nCommandLine:\n%s\n\nOutput:\n%s", nErrorCode, szCommandLineSend.c_str(), szOutput.c_str());\r
}\r
- return CalErrorCodeConvert(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
- // \83R\81[\83\8b\83o\83b\83N\8aÖ\90\94\82ð\90Ý\92è\81B\r
- CalSetCallbackProc(true);\r
- return CalSetCallbackProc(false);\r
+ return ErrorCodeConvert(nErrorCode);\r
}\r
\r
#ifdef __cplusplus\r