OSDN Git Service

ヘッダ暗号化書庫に対して処理を行う際にパスワードを要求する回数を削減。
authorsirakaba <sirakaba@9df91469-1e22-0410-86e7-ea8537beb833>
Sat, 21 May 2011 12:18:22 +0000 (12:18 +0000)
committersirakaba <sirakaba@9df91469-1e22-0410-86e7-ea8537beb833>
Sat, 21 May 2011 12:18:22 +0000 (12:18 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/tpi/tpi@547 9df91469-1e22-0410-86e7-ea8537beb833

doc/history.html
src/plugin/7zArc/7zArc.cpp

index cff4b55..39c3a43 100644 (file)
        <li class="chg">一部の無駄なメッセージを削除。</li>\r
       </ul>\r
      </dd>\r
+     <dt>7zArc</dt>\r
+     <dd>\r
+      <ul>\r
+       <li class="chg">ヘッダ暗号化書庫に対して処理を行う際にパスワードを要求する回数を削減。</li>\r
+       <li class="fix">7z書庫内のファイルの削除には現時点で未対応であるのに、機能を有効にしていたバグを修正。</li>\r
+      </ul>\r
+     </dd>\r
      <dt>cuiWrapper</dt>\r
      <dd>\r
       <ul>\r
index 86c6d03..0669579 100644 (file)
@@ -148,13 +148,13 @@ int GetFileInformation2(void * _hArchive, TPI_FILEINFO * _fiInfo, wxULongLong_t
 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
@@ -229,11 +229,14 @@ STDMETHODIMP CArchiveOpenCallback::SetSubArchiveName(const wchar_t * szName)
        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
@@ -607,6 +610,78 @@ STDMETHODIMP CArchiveUpdateCallback::CryptoGetTextPassword2(int * nPasswordIsDef
 }\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
@@ -732,69 +807,7 @@ int __stdcall OpenArchive
        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
@@ -888,7 +901,7 @@ int __stdcall Command
        {\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