OSDN Git Service

展開時に、最初にパスワードを入力していても、それが反映されていなかったバグを修正。
authorsirakaba <sirakaba@9df91469-1e22-0410-86e7-ea8537beb833>
Thu, 23 Sep 2010 02:08:16 +0000 (02:08 +0000)
committersirakaba <sirakaba@9df91469-1e22-0410-86e7-ea8537beb833>
Thu, 23 Sep 2010 02:08:16 +0000 (02:08 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/tpi/tpi@328 9df91469-1e22-0410-86e7-ea8537beb833

src/plugin/7zArc/7zArc.cpp

index 40ebfcb..6d06d46 100644 (file)
@@ -357,9 +357,9 @@ public:
        MY_UNKNOWN_IMP1(ICryptoGetTextPassword)\r
        INTERFACE_IArchiveExtractCallback(;)\r
        STDMETHOD(CryptoGetTextPassword)(BSTR * szPassword);\r
+       CArchiveExtractCallback(CMyComPtr<IInArchive>, TPI_SWITCHES *);\r
 \r
        int nErrorCode;\r
-       CMyComPtr<IInArchive> hArc;\r
        TPI_SWITCHES * swInfo;\r
 \r
 private:\r
@@ -369,8 +369,16 @@ private:
        wxULongLong_t nCurrentPos;\r
        COutFileStream * _outFileStreamSpec;\r
        CMyComPtr<ISequentialOutStream> _outFileStream;\r
+       CMyComPtr<IInArchive> hArc;\r
 };\r
 \r
+CArchiveExtractCallback::CArchiveExtractCallback(CMyComPtr<IInArchive> hArc, TPI_SWITCHES * swInfo)\r
+{\r
+       this->hArc = hArc;\r
+       this->swInfo = swInfo;\r
+       this->fTriedPassword = false;\r
+}\r
+\r
 STDMETHODIMP CArchiveExtractCallback::SetTotal(wxULongLong_t)\r
 {\r
        return S_OK;\r
@@ -500,6 +508,8 @@ STDMETHODIMP CArchiveExtractCallback::CryptoGetTextPassword(BSTR * szPassword)
        {\r
                this->piInfo.eMessage           = TPI_MESSAGE_ASK;\r
                this->piInfo.eStatus            = TPI_PARAM_PASSWORD;\r
+               // 次のファイル名が取得できないので、とりあえず空にしておく。\r
+               this->piInfo.fiInfo.fnFileName.Clear();\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
        }\r
        else\r
@@ -517,17 +527,23 @@ public:
        MY_UNKNOWN_IMP2(IArchiveUpdateCallback2, ICryptoGetTextPassword2)\r
        INTERFACE_IArchiveUpdateCallback2(;)\r
        STDMETHOD(CryptoGetTextPassword2)(int * nPasswordIsDefined, BSTR * szPassword);\r
-       CArchiveUpdateCallback(): fiItems(0) {};\r
+       CArchiveUpdateCallback(TPI_SWITCHES *, CObjectVector<NWindows::NFile::NFind::CFileInfoW> *);\r
 \r
        const CObjectVector<NWindows::NFile::NFind::CFileInfoW> * fiItems;\r
        int nErrorCode;\r
-       TPI_SWITCHES * swInfo;\r
 \r
 private:\r
        wxULongLong_t nCurrentPos;\r
        TPI_PROCESSINFO piInfo;\r
+       TPI_SWITCHES * swInfo;\r
 };\r
 \r
+CArchiveUpdateCallback::CArchiveUpdateCallback(TPI_SWITCHES * swInfo, CObjectVector<NWindows::NFile::NFind::CFileInfoW> * fiItems)\r
+{\r
+       this->swInfo = swInfo;\r
+       this->fiItems = fiItems;\r
+}\r
+\r
 STDMETHODIMP CArchiveUpdateCallback::SetTotal(wxULongLong_t)\r
 {\r
        return S_OK;\r
@@ -944,10 +960,8 @@ int __stdcall Command
                        while (GetFileInformation(hArc, & fiInfo, false) == TPI_ERROR_SUCCESS);\r
                }\r
 \r
-               CArchiveExtractCallback * extractCallbackSpec = new CArchiveExtractCallback;\r
+               CArchiveExtractCallback * extractCallbackSpec = new CArchiveExtractCallback(hArc,_swInfo);\r
                CMyComPtr<IArchiveExtractCallback> extractCallback(extractCallbackSpec);\r
-               extractCallbackSpec->hArc = hArc;\r
-               extractCallbackSpec->swInfo = _swInfo;\r
                hArc->Extract(& nIndexes.Front(), nIndexes.Size(), _eCommand == TPI_COMMAND_TEST, extractCallback);\r
                nErrorCode = extractCallbackSpec->nErrorCode;\r
                CloseArchive(hArc);\r
@@ -1033,10 +1047,8 @@ int __stdcall Command
                }\r
 \r
                // 更新処理を実行。\r
-               CArchiveUpdateCallback * updateCallbackSpec = new CArchiveUpdateCallback;\r
+               CArchiveUpdateCallback * updateCallbackSpec = new CArchiveUpdateCallback(_swInfo, & fiItems);\r
                CMyComPtr<IArchiveUpdateCallback2> updateCallback(updateCallbackSpec);\r
-               updateCallbackSpec->fiItems = & fiItems;\r
-               updateCallbackSpec->swInfo = _swInfo;\r
                hArc->UpdateItems(outFileStream, fiItems.Size(), updateCallback);\r
                nErrorCode = updateCallbackSpec->nErrorCode;\r
                break;\r