const wxArrayString * g_asFiles;\r
\r
//******************************************************************************\r
+// Inside Functions\r
+//******************************************************************************\r
+\r
+#define GetAPIAddress(name) GetProcAddress(g_hLib, "EGG_" name)\r
+\r
+int ErrorCodeConvert(int nErrorCode)\r
+{\r
+ switch (nErrorCode)\r
+ {\r
+ case EGG_ERROR_FAIL: return TPI_ERROR_UNDEFINED;\r
+ case EGG_ERROR_SUCCESS: return TPI_ERROR_SUCCESS;\r
+ case EGG_ERROR_SKIP: return TPI_ERROR_D_SKIPPED;\r
+ case EGG_ERROR_CANCEL: return TPI_ERROR_D_SKIPPED;\r
+ case EGG_ERROR_IO: return TPI_ERROR_IO_MISC;\r
+ case EGG_ERROR_TYPEMISMATCH:return TPI_ERROR_ARC_UNSUPPORTED;\r
+ case EGG_ERROR_FILE: return TPI_ERROR_IO_MISC;\r
+ case EGG_ERROR_FORMAT: return TPI_ERROR_IO_ARC_MISC;\r
+ case EGG_ERROR_ALGORITHM: return TPI_ERROR_UNDEFINED;\r
+ default: return TPI_ERROR_UNDEFINED;\r
+ }\r
+}\r
+\r
+int __stdcall GetFileInformation2\r
+(\r
+ void * _hArchive,\r
+ TPI_FILEINFO * _fiInfo,\r
+ wxULongLong_t _nIndex\r
+)\r
+{\r
+ static FARPROC fpProc = ::GetAPIAddress("GetFileHeader");\r
+ if (fpProc == NULL)\r
+ {\r
+ return TPI_ERROR_U_USE_LIBRARY;\r
+ }\r
+\r
+ EGGFileHeader fhInfo;\r
+ int nErrorCode = ErrorCodeConvert(((UINT (__cdecl *)(void *, size_t, EGGFileHeader *)) fpProc)(_hArchive, _nIndex, & fhInfo));\r
+ if (nErrorCode == TPI_ERROR_SUCCESS)\r
+ {\r
+ _fiInfo->dwAttribute = fhInfo.attribute;\r
+ if (fhInfo.encrypted)\r
+ {\r
+ _fiInfo->dwAttribute |= TPI_ATTRIBUTE_ENCRYPTED;\r
+ }\r
+ _fiInfo->dwCRC32 = fhInfo.crc;\r
+ _fiInfo->nPackedSize = fhInfo.packedSize;\r
+ _fiInfo->nUnpackedSize = fhInfo.unpackedSize;\r
+ _fiInfo->tmModified = fhInfo.lastModified;\r
+ _fiInfo->szComment = WC2String(fhInfo.comment);\r
+ _fiInfo->szStoredName = WC2String(fhInfo.fileName);\r
+ _fiInfo->szMethod = fhInfo.method == 2 ? wxT("ALZ") : fhInfo.method == 0 ? wxT("EGG") : wxT("unknown");\r
+ _fiInfo->nFileId = _nIndex;\r
+ _fiInfo->fnFileName = wxFileName(_fiInfo->szStoredName);\r
+ }\r
+\r
+ return nErrorCode;\r
+}\r
+\r
+//******************************************************************************\r
// Callback Wrapper\r
//******************************************************************************\r
\r
break;\r
case eggevent::Extract::CODE:\r
{\r
- // 展開するかどうか判断。\r
- // TODO : アプリケーション側へ。\r
+ // 対象ファイルか確認。\r
eggevent::Extract * p = (eggevent::Extract *) param;\r
- wxString szFileName = WC2String(p->nameInArchive);\r
- if (g_asFiles->Count() != 0 && g_asFiles->Index(szFileName) == wxNOT_FOUND)\r
+ GetFileInformation2(* (void **) user, & piInfo.fiInfo, p->index);\r
+ if (g_asFiles->Count() != 0 && g_asFiles->Index(piInfo.fiInfo.fnFileName.GetFullPath()) == wxNOT_FOUND)\r
+ {\r
+ return EGG_ERROR_SKIP;\r
+ }\r
+\r
+ // 処理するかどうか確認。\r
+ piInfo.eMessage = TPI_MESSAGE_ASK;\r
+ piInfo.eStatus = TPI_PARAM_DEST;\r
+ piInfo.fnDestination = wxFileName(g_swInfo->fnDestinationDirectory.GetPathWithSep() + (g_swInfo->fStoreDirectoryPathes ? piInfo.fiInfo.fnFileName.GetFullPath() : piInfo.fiInfo.fnFileName.GetFullName()));\r
+ if (g_prProc != NULL && g_prProc(TPI_NOTIFY_COMMON, & piInfo) != TPI_CALLBACK_CONTINUE)\r
+ {\r
+ return EGG_ERROR_CANCEL;\r
+ }\r
+ if (! piInfo.fnDestination.IsOk())\r
{\r
return EGG_ERROR_SKIP;\r
}\r
\r
// 展開する。\r
- wcsncpy(p->fileName, (g_swInfo->fnDestinationDirectory.GetPathWithSep() + (g_swInfo->fStoreDirectoryPathes ? szFileName : wxFileName(szFileName).GetFullName())).wchar_str(), MAX_PATH - 1);\r
+ wcsncpy(p->fileName, piInfo.fnDestination.GetFullPath().wchar_str(), MAX_PATH - 1);\r
return EGG_ERROR_SUCCESS;\r
}\r
case eggevent::ActivityStart::CODE:\r
piInfo.eStatus = TPI_STATUS_BEGINPROCESS;\r
- GetFileInformation(* (void **) user, & piInfo.fiInfo, ((eggevent::ActivityStart *) param)->index == 0);\r
+ GetFileInformation2(* (void **) user, & piInfo.fiInfo, ((eggevent::ActivityStart *) param)->index);\r
break;\r
case eggevent::Progress::CODE:\r
piInfo.eStatus = TPI_STATUS_INPROCESS;\r
case eggevent::QueryPassword::CODE:\r
{\r
// パスワード問い合わせ。\r
- // TODO : 個別ファイルに対する問い合わせの実装。\r
piInfo.eMessage = TPI_MESSAGE_ASK;\r
piInfo.eStatus = TPI_PARAM_PASSWORD;\r
\r
}\r
\r
//******************************************************************************\r
-// Inside Functions\r
-//******************************************************************************\r
-\r
-#define GetAPIAddress(name) GetProcAddress(g_hLib, "EGG_" name)\r
-\r
-int ErrorCodeConvert(int nErrorCode)\r
-{\r
- switch (nErrorCode)\r
- {\r
- case EGG_ERROR_FAIL: return TPI_ERROR_UNDEFINED;\r
- case EGG_ERROR_SUCCESS: return TPI_ERROR_SUCCESS;\r
- case EGG_ERROR_SKIP: return TPI_ERROR_D_SKIPPED;\r
- case EGG_ERROR_CANCEL: return TPI_ERROR_D_SKIPPED;\r
- case EGG_ERROR_IO: return TPI_ERROR_IO_MISC;\r
- case EGG_ERROR_TYPEMISMATCH:return TPI_ERROR_ARC_UNSUPPORTED;\r
- case EGG_ERROR_FILE: return TPI_ERROR_IO_MISC;\r
- case EGG_ERROR_FORMAT: return TPI_ERROR_IO_ARC_MISC;\r
- case EGG_ERROR_ALGORITHM: return TPI_ERROR_UNDEFINED;\r
- default: return TPI_ERROR_UNDEFINED;\r
- }\r
-}\r
-\r
-//******************************************************************************\r
// Functions\r
//******************************************************************************\r
\r
{\r
static wxULongLong_t s_nFileId;\r
static size_t s_nFileCount;\r
- static FARPROC fpProc;\r
- int nErrorCode;\r
-\r
if (_bFirst)\r
{\r
s_nFileId = 0;\r
- fpProc = ::GetAPIAddress("GetFileCount");\r
+ FARPROC fpProc = ::GetAPIAddress("GetFileCount");\r
if (fpProc == NULL)\r
{\r
return TPI_ERROR_U_USE_LIBRARY;\r
}\r
- nErrorCode = ErrorCodeConvert(((UINT (__cdecl *)(void *, size_t *)) fpProc)(_hArchive, & s_nFileCount));\r
+ int nErrorCode = ErrorCodeConvert(((UINT (__cdecl *)(void *, size_t *)) fpProc)(_hArchive, & s_nFileCount));\r
if (nErrorCode != TPI_ERROR_SUCCESS)\r
{\r
return nErrorCode;\r
}\r
-\r
- fpProc = ::GetAPIAddress("GetFileHeader");\r
- if (fpProc == NULL)\r
- {\r
- return TPI_ERROR_U_USE_LIBRARY;\r
- }\r
- }\r
- if (s_nFileId >= s_nFileCount)\r
- {\r
- return TPI_ERROR_S_ENDOFDATA;\r
- }\r
-\r
- EGGFileHeader fhInfo;\r
- nErrorCode = ErrorCodeConvert(((UINT (__cdecl *)(void *, size_t, EGGFileHeader *)) fpProc)(_hArchive, s_nFileId, & fhInfo));\r
- if (nErrorCode == TPI_ERROR_SUCCESS)\r
- {\r
- _fiInfo->dwAttribute = fhInfo.attribute;\r
- if (fhInfo.encrypted)\r
- {\r
- _fiInfo->dwAttribute |= TPI_ATTRIBUTE_ENCRYPTED;\r
- }\r
- _fiInfo->dwCRC32 = fhInfo.crc;\r
- _fiInfo->nPackedSize = fhInfo.packedSize;\r
- _fiInfo->nUnpackedSize = fhInfo.unpackedSize;\r
- _fiInfo->tmModified = fhInfo.lastModified;\r
- _fiInfo->szComment = WC2String(fhInfo.comment);\r
- _fiInfo->szStoredName = WC2String(fhInfo.fileName);\r
- _fiInfo->szMethod = fhInfo.method == 2 ? wxT("ALZ") : fhInfo.method == 0 ? wxT("EGG") : wxT("unknown");\r
- _fiInfo->nFileId = s_nFileId++;\r
- _fiInfo->fnFileName = wxFileName(_fiInfo->szStoredName);\r
}\r
-\r
- return nErrorCode;\r
+ return s_nFileId >= s_nFileCount ? TPI_ERROR_S_ENDOFDATA : GetFileInformation2(_hArchive, _fiInfo, s_nFileId++);\r
}\r
\r
int __stdcall GetArchiveInformation\r
g_hdInfo = & hdInfo;\r
while (nErrorCode == TPI_ERROR_SUCCESS && ErrorCodeConvert(((int (__stdcall *)(void *, RARHeaderDataEx *)) pR)(hArc, & hdInfo)) == TPI_ERROR_SUCCESS)\r
{\r
- nErrorCode =\r
- ErrorCodeConvert(\r
- ((int (__stdcall *)(void *, int, wchar_t *, wchar_t *)) pP)(\r
- hArc,\r
- (_szFiles.GetCount() != 0 && _szFiles.Index(wxString(hdInfo.FileNameW)) == wxNOT_FOUND) ? RAR_SKIP : _eCommand == TPI_COMMAND_EXTRACT ? RAR_EXTRACT : RAR_TEST,\r
- _swInfo->fStoreDirectoryPathes ? _swInfo->fnDestinationDirectory.GetFullPath().wchar_str() : NULL,\r
- _swInfo->fStoreDirectoryPathes ? NULL : (_swInfo->fnDestinationDirectory.GetPathWithSep() + wxFileName(hdInfo.FileNameW).GetFullName()).wchar_str()\r
- )\r
- );\r
+ TPI_PROCESSINFO piInfo;\r
+ piInfo.fiInfo.fnFileName = wxFileName(WC2String(hdInfo.FileNameW));\r
+ piInfo.fnDestination = wxFileName(_swInfo->fnDestinationDirectory.GetPathWithSep() + (_swInfo->fStoreDirectoryPathes ? piInfo.fiInfo.fnFileName.GetFullPath() : piInfo.fiInfo.fnFileName.GetFullName()));\r
+ bool bSkip = _szFiles.GetCount() != 0 && _szFiles.Index(piInfo.fiInfo.fnFileName.GetFullPath()) == wxNOT_FOUND;\r
+ if (! bSkip && _eCommand == TPI_COMMAND_EXTRACT)\r
+ {\r
+ // 処理するかどうか確認。\r
+ piInfo.eMessage = TPI_MESSAGE_ASK;\r
+ piInfo.eStatus = TPI_PARAM_DEST;\r
+ piInfo.fiInfo.nUnpackedSize = hdInfo.UnpSizeHigh;\r
+ piInfo.fiInfo.nUnpackedSize = piInfo.fiInfo.nUnpackedSize << 32;\r
+ piInfo.fiInfo.nUnpackedSize += hdInfo.UnpSize;\r
+ piInfo.fiInfo.tmModified.SetFromDOS(hdInfo.FileTime);\r
+ if (g_prProc != NULL && g_prProc(TPI_NOTIFY_COMMON, & piInfo) != TPI_CALLBACK_CONTINUE)\r
+ {\r
+ nErrorCode = TPI_ERROR_D_SKIPPED;\r
+ break;\r
+ }\r
+ bSkip = ! piInfo.fnDestination.IsOk();\r
+ }\r
+\r
+ nErrorCode = ErrorCodeConvert(((int (__stdcall *)(void *, int, wchar_t *, wchar_t *)) pP)(hArc, bSkip ? RAR_SKIP : _eCommand == TPI_COMMAND_EXTRACT ? RAR_EXTRACT : RAR_TEST, NULL, piInfo.fnDestination.GetFullPath().wchar_str()));\r
}\r
CloseArchive(hArc);\r
return nErrorCode;\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