class CArchiveOpenCallback: public IArchiveOpenCallback, public IArchiveOpenVolumeCallback, public IArchiveOpenSetSubArchiveName, public ICryptoGetTextPassword, public CMyUnknownImp\r
{\r
public:\r
- MY_UNKNOWN_IMP1(ICryptoGetTextPassword)\r
+ MY_UNKNOWN_IMP3(ICryptoGetTextPassword, IArchiveOpenVolumeCallback, IArchiveOpenSetSubArchiveName)\r
INTERFACE_IArchiveOpenCallback(;)\r
INTERFACE_IArchiveOpenVolumeCallback(;)\r
STDMETHOD(SetSubArchiveName)(const wchar_t * szName);\r
STDMETHOD(CryptoGetTextPassword)(BSTR *password);\r
int nErrorCode;\r
- wxString szSubArchiveName;\r
+ wxString szSubArchiveName, szPassword;\r
NWindows::NFile::NFind::CFileInfo fiInfo;\r
\r
private:\r
return S_OK;\r
}\r
\r
-STDMETHODIMP CArchiveOpenCallback::CryptoGetTextPassword(BSTR * szPassword)\r
+STDMETHODIMP CArchiveOpenCallback::CryptoGetTextPassword(BSTR * sz)\r
{\r
this->piInfo.eMessage = TPI_MESSAGE_ASK;\r
this->piInfo.eStatus = TPI_PARAM_PASSWORD;\r
- return (g_prProc != NULL && g_prProc(TPI_NOTIFY_COMMON, & this->piInfo) == TPI_CALLBACK_CONTINUE) ? ::StringToBstr(this->piInfo.szParam.c_str(), szPassword) : E_ABORT;\r
+ return\r
+ (! this->szPassword.IsEmpty()) ? ::StringToBstr(this->szPassword.c_str(), sz) :\r
+ (g_prProc != NULL && g_prProc(TPI_NOTIFY_COMMON, & this->piInfo) == TPI_CALLBACK_CONTINUE) ? ::StringToBstr(this->piInfo.szParam.c_str(), sz) :\r
+ E_ABORT;\r
}\r
\r
// CArchiveExtractCallback\r
}\r
\r
//******************************************************************************\r
+// Inside Functions\r
+//******************************************************************************\r
+\r
+int OpenArchive2(const wxString & _szArcName, void * * _hArchive, wxULongLong_t * _nFileCount, const wxString _szPassword = wxEmptyString)\r
+{\r
+ // ***.tar.xxxは不便なので弾く。\r
+ wxString s = _szArcName.BeforeLast(wxT('.'));\r
+ if (s.Find(wxT('.')) != wxNOT_FOUND && s.AfterLast(wxT('.')) == wxT("tar"))\r
+ {\r
+ return TPI_ERROR_IO_ARC_OPEN;\r
+ }\r
+\r
+ // xml解析開始。\r
+ IInArchive * hArc;\r
+ wxXmlDocument xmlDoc(myMakeXMLName(wxT("7zArc")));\r
+ wxXmlNode * xmlLibrary = myGetFirstLib(& xmlDoc);\r
+\r
+ // 対応するライブラリを調査。\r
+ // 無限ループに陥らないよう上限を設定。\r
+ for (g_LibInfo.nLibIndex = 0; g_LibInfo.nLibIndex < 300 && xmlLibrary != NULL; g_LibInfo.nLibIndex++)\r
+ {\r
+ // ライブラリをロード。\r
+ const GUID guid = {0x23170F69, 0x40C1, 0x278A, {0x10, 0x00, 0x00, 0x01, 0x10, myGetAttributeInt(xmlLibrary, wxT("name"), 0, 16), 0x00, 0x00}};\r
+ if (((unsigned int (__stdcall *)(const GUID *, const GUID *, void * *)) g_LibInfo.fpProc)(& guid, & IID_IInArchive, (void **) & hArc) != S_OK)\r
+ {\r
+ xmlLibrary = myGetNextLib(xmlLibrary);\r
+ continue;\r
+ }\r
+ g_LibInfo.node = * xmlLibrary;\r
+\r
+ // 書庫を開く。\r
+ CInFileStream * fileSpec = new CInFileStream;\r
+ CMyComPtr<IInStream> file = fileSpec;\r
+ if (! fileSpec->Open(_szArcName.c_str()))\r
+ {\r
+ return TPI_ERROR_IO_ARC_OPEN;\r
+ }\r
+\r
+ // 形式の情報を取得。\r
+ TPI_FORMATINFO fiInfo;\r
+ MakeFormatInfo(xmlLibrary, wxT("7zArc"), & fiInfo, g_LibInfo.nLibIndex);\r
+\r
+ // 書庫に対応しているかチェック。\r
+ CArchiveOpenCallback * openCallbackSpec = new CArchiveOpenCallback;\r
+ openCallbackSpec->szPassword = _szPassword;\r
+ CMyComPtr<IArchiveOpenCallback> openCallback(openCallbackSpec);\r
+ // SFXを完全に検出するには全体をロードする必要がある。\r
+ wxULongLong_t nMax = fiInfo.fSFX ? 262114 : 1024;\r
+/*\r
+ if (fiInfo.fSFX)\r
+ {\r
+ fileSpec->GetSize(& nMax);\r
+ }\r
+*/\r
+ if (hArc->Open(file, & nMax, openCallback) == S_OK)\r
+ {\r
+ if (_nFileCount != NULL)\r
+ {\r
+ unsigned int n;\r
+ hArc->GetNumberOfItems(& n);\r
+ * _nFileCount = n;\r
+ }\r
+ * _hArchive = hArc;\r
+ return TPI_ERROR_SUCCESS;\r
+ }\r
+ xmlLibrary = myGetNextLib(xmlLibrary);\r
+ }\r
+\r
+ return TPI_ERROR_IO_ARC_OPEN;\r
+}\r
+\r
+//******************************************************************************\r
// Functions\r
//******************************************************************************\r
\r
wxULongLong_t * _nFileCount\r
)\r
{\r
- // ***.tar.xxxは不便なので弾く。\r
- wxString s = _szArcName.BeforeLast(wxT('.'));\r
- if (s.Find(wxT('.')) != wxNOT_FOUND && s.AfterLast(wxT('.')) == wxT("tar"))\r
- {\r
- return TPI_ERROR_IO_ARC_OPEN;\r
- }\r
-\r
- // xml解析開始。\r
- IInArchive * hArc;\r
- wxXmlDocument xmlDoc(myMakeXMLName(wxT("7zArc")));\r
- wxXmlNode * xmlLibrary = myGetFirstLib(& xmlDoc);\r
-\r
- // 対応するライブラリを調査。\r
- // 無限ループに陥らないよう上限を設定。\r
- for (g_LibInfo.nLibIndex = 0; g_LibInfo.nLibIndex < 300 && xmlLibrary != NULL; g_LibInfo.nLibIndex++)\r
- {\r
- // ライブラリをロード。\r
- const GUID guid = {0x23170F69, 0x40C1, 0x278A, {0x10, 0x00, 0x00, 0x01, 0x10, myGetAttributeInt(xmlLibrary, wxT("name"), 0, 16), 0x00, 0x00}};\r
- if (((unsigned int (__stdcall *)(const GUID *, const GUID *, void * *)) g_LibInfo.fpProc)(& guid, & IID_IInArchive, (void **) & hArc) != S_OK)\r
- {\r
- xmlLibrary = myGetNextLib(xmlLibrary);\r
- continue;\r
- }\r
- g_LibInfo.node = * xmlLibrary;\r
-\r
- // 書庫を開く。\r
- CInFileStream * fileSpec = new CInFileStream;\r
- CMyComPtr<IInStream> file = fileSpec;\r
- if (! fileSpec->Open(_szArcName.c_str()))\r
- {\r
- return TPI_ERROR_IO_ARC_OPEN;\r
- }\r
-\r
- // 形式の情報を取得。\r
- TPI_FORMATINFO fiInfo;\r
- MakeFormatInfo(xmlLibrary, wxT("7zArc"), & fiInfo, g_LibInfo.nLibIndex);\r
-\r
- // 書庫に対応しているかチェック。\r
- CArchiveOpenCallback * openCallbackSpec = new CArchiveOpenCallback;\r
- CMyComPtr<IArchiveOpenCallback> openCallback(openCallbackSpec);\r
- // SFXを完全に検出するには全体をロードする必要がある。\r
- wxULongLong_t nMax = fiInfo.fSFX ? 262114 : 1024;\r
-/*\r
- if (fiInfo.fSFX)\r
- {\r
- fileSpec->GetSize(& nMax);\r
- }\r
-*/\r
- if (hArc->Open(file, & nMax, openCallback) == S_OK)\r
- {\r
- if (_nFileCount != NULL)\r
- {\r
- unsigned int n;\r
- hArc->GetNumberOfItems(& n);\r
- * _nFileCount = n;\r
- }\r
- * _hArchive = hArc;\r
- return TPI_ERROR_SUCCESS;\r
- }\r
- xmlLibrary = myGetNextLib(xmlLibrary);\r
- }\r
-\r
- return TPI_ERROR_IO_ARC_OPEN;\r
+ return OpenArchive2(_szArcName, _hArchive, _nFileCount);\r
}\r
\r
int __stdcall CloseArchive\r
{\r
// 開きなおす。\r
IInArchive * hArc;\r
- nErrorCode = OpenArchive(_szArcName, (void **) & hArc);\r
+ nErrorCode = OpenArchive2(_szArcName, (void **) & hArc, NULL, _swInfo->szPassword);\r
if (nErrorCode != TPI_ERROR_SUCCESS)\r
{\r
return nErrorCode;\r