OSDN Git Service

書庫の作成に失敗した際に、必要な解放処理がなされていなかったバグを修正。
[tpi/lychee.git] / src / lychee / frm_main.cpp
index 093e8e2..463c59d 100644 (file)
@@ -45,15 +45,12 @@ bool g_fSortAscend;
 // MainFrame\r
 //******************************************************************************\r
 \r
-MainFrame::MainFrame(): wxFrame()\r
+MainFrame::MainFrame(): wxFrame(), gFrame(NULL)\r
 {\r
 }\r
 \r
 MainFrame::~MainFrame()\r
 {\r
-       wxCommandEvent e;\r
-       this->OnArcClose(e);\r
-\r
        // 設定を記録。\r
        if (! this->IsIconized() && ! this->IsMaximized())\r
        {\r
@@ -65,7 +62,12 @@ MainFrame::~MainFrame()
                this->conf.WriteId(CONF_WINDOW_X, a);\r
                this->conf.WriteId(CONF_WINDOW_Y, b);\r
        }\r
-       this->conf.WriteId(CONF_WINDOW_SPLITTER_POS, this->window_splitter->GetSashPosition());\r
+\r
+       // ウインドウが表示されていないときは、GetSashPosition()が不正な値を返す。\r
+       if (this->IsShown())\r
+       {\r
+               this->conf.WriteId(CONF_WINDOW_SPLITTER_POS, this->window_splitter->GetSashPosition());\r
+       }\r
 \r
        // ツールバー/ステータスバー関連。\r
        this->conf.WriteId(CONF_WINDOW_STATUSBAR, this->statusbar->IsShown());\r
@@ -90,7 +92,10 @@ MainFrame::~MainFrame()
                this->conf.WriteId(CONF_LISTVIEW_S_ASCEND,   g_fSortAscend);\r
        }\r
 \r
-       this->Close(true);\r
+       wxCommandEvent e;\r
+       delete this->gFrame;\r
+       this->Show(false);\r
+       this->OnArcClose(e);\r
 }\r
 \r
 //******************************************************************************\r
@@ -98,7 +103,9 @@ MainFrame::~MainFrame()
 //******************************************************************************\r
 \r
 BEGIN_EVENT_TABLE(MainFrame, wxFrame)\r
-       EVT_INIT_DIALOG(      MainFrame::OnInit)\r
+       EVT_INIT_DIALOG(MainFrame::OnInit)\r
+       EVT_SIZE(       MainFrame::OnSize)\r
+       EVT_CLOSE(      MainFrame::OnClose)\r
        // Menu\r
        EVT_MENU(XRCID("Arc_Create"),  MainFrame::OnArcCreate)\r
        EVT_MENU(XRCID("Arc_Open"),    MainFrame::OnArcOpen)\r
@@ -195,6 +202,33 @@ void MainFrame::OnInit(wxInitDialogEvent&)
        fShow = this->conf.ReadId(CONF_WINDOW_TOOLBAR, true);\r
        this->menubar->Check(XRCID("Exe_View_ToolBar"), fShow);\r
        this->toolbar->Show(fShow);\r
+\r
+       // ステータスバー上にプログレスバーを作成。\r
+       this->gFrame = new wxGauge(this->statusbar, -1, 0, wxPoint(0, 0), wxSize(200, 10));\r
+       this->gFrame->Show(false);\r
+}\r
+\r
+void MainFrame::OnClose(wxCloseEvent& e)\r
+{\r
+       if (e.CanVeto() && g_procDlg != NULL)\r
+       {\r
+               g_procDlg->OnClose(e);\r
+               e.Veto();\r
+       }\r
+       else\r
+       {\r
+               this->Destroy();\r
+       }\r
+}\r
+\r
+void MainFrame::OnSize(wxSizeEvent& e)\r
+{\r
+       // プログレスバーの位置を変更。\r
+       if (this->gFrame != NULL)\r
+       {\r
+               this->gFrame->SetPosition(wxPoint(this->statusbar->GetSize().GetWidth() - 230, 10));\r
+       }\r
+       e.Skip();\r
 }\r
 \r
 // MenuBar\r
@@ -210,8 +244,7 @@ void MainFrame::OnArcCreate(wxCommandEvent& e)
        swInfo.pCustomSwitches = NULL;\r
 \r
        // 作成ダイアログを設定。\r
-       MakeDialog mkDlg;\r
-       mkDlg.SetParent(this);\r
+       MakeDialog mkDlg(this, TPI_COMMAND_CREATE);\r
        if (e.GetClientData() == NULL)\r
        {\r
                // 処理対象のファイルを選択。\r
@@ -254,7 +287,7 @@ void MainFrame::OnArcCreate(wxCommandEvent& e)
        int nSelected = mkDlg.chType->GetSelection();\r
        swInfo.nArchiveType         = mkDlg.afInfo[nSelected].nTypeId;\r
        swInfo.fStoreDirectoryPathes= ! mkDlg.cbIgnorePath->IsChecked();\r
-       swInfo.fMakeSFX                     = mkDlg.cbMakeSFX->IsChecked();\r
+       swInfo.fMakeSFX             = mkDlg.cbMakeSFX->IsChecked();\r
        swInfo.fSolid               = mkDlg.cbSolid->IsChecked();\r
        swInfo.fMMOptimize          = mkDlg.cbMMOptimize->IsChecked();\r
        swInfo.fEncryptHeader       = mkDlg.cbEncryptHeader->IsChecked();\r
@@ -268,6 +301,7 @@ void MainFrame::OnArcCreate(wxCommandEvent& e)
 \r
        // TPIを読み込み。\r
        this->fnArchive = wxFileName(mkDlg.cbDir->GetValue(), mkDlg.cbFileName->GetValue());\r
+       swInfo.szArcName            = this->fnArchive.GetFullPath();\r
        if (! tpi.InitLibrary(mkDlg.afInfo[nSelected].szTPIName, this->fnArchive.GetFullPath(), TPICallbackProc, mkDlg.afInfo[nSelected].nTypeId))\r
        {\r
                this->ErrorCheck(tpi.nErrorCode, wxT("InitLibrary"));\r
@@ -276,14 +310,14 @@ void MainFrame::OnArcCreate(wxCommandEvent& e)
 \r
        // 処理を行う。\r
        {\r
-               ProcessDialog procDlg;\r
-               procDlg.fnArchive  = & this->fnArchive;\r
-               procDlg.nFileCount = mkDlg.files.GetCount();\r
-               procDlg.Show(true);\r
-\r
-               tpi.Command(TPI_COMMAND_CREATE, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files);\r
-               this->ErrorCheck(tpi.nErrorCode);\r
+               ProcessDialog procDlg(this, mkDlg.files.GetCount());\r
+               tpi.Command(TPI_COMMAND_CREATE, & swInfo, mkDlg.files);\r
                procDlg.Show(false);\r
+               if (this->ErrorCheck(tpi.nErrorCode) != TPI_ERROR_SUCCESS)\r
+               {\r
+                       tpi.FreeLibrary();\r
+                       return;\r
+               }\r
        }\r
        tpi.FreeLibrary();\r
 \r
@@ -300,13 +334,17 @@ void MainFrame::OnArcCreate(wxCommandEvent& e)
        }\r
 \r
        // 終了しない場合は書庫を開く。\r
-       this->OnArcOpen(e);\r
+       if (this->fnArchive.FileExists())\r
+       {\r
+               e.SetInt(1);\r
+               this->OnArcOpen(e);\r
+       }\r
 }\r
 \r
 void MainFrame::OnArcOpen(wxCommandEvent& e)\r
 {\r
        // モード取得。通常は0, それ以外で開く場合は1, ファイルDnDなら2。\r
-       int nMode = e.GetInt() == 2 ? 2 : e.GetId() == XRCID("Arc_Open") ? 0 : 1;\r
+       int nMode = e.GetInt();\r
 \r
        // 書庫を選択。\r
        if (nMode == 0)\r
@@ -320,16 +358,12 @@ void MainFrame::OnArcOpen(wxCommandEvent& e)
                this->fnArchive = wxFileName(fd.GetPath());\r
        }\r
 \r
-       // 進捗ダイアログ表示。\r
-       ProcessDialog procDlg;\r
-       procDlg.fnArchive  = & this->fnArchive;\r
-       procDlg.Show(true);\r
-\r
-       // DnD以外で書庫を開く場合、TPIを読み込み。\r
+       // TPIを読み込み。\r
+       ProcessDialog procDlg(this);\r
        TPI_PROCESSINFO piInfo;\r
+       piInfo.fiInfo.nUnpackedSize = 0;\r
        if (! this->LoadTPI(this->fnArchive.GetFullPath(), & piInfo.fiInfo.nUnpackedSize))\r
        {\r
-               procDlg.Show(false);\r
                if (nMode == 2)\r
                {\r
                        // DnDの場合は書庫を作成する。\r
@@ -348,14 +382,20 @@ void MainFrame::OnArcOpen(wxCommandEvent& e)
                return;\r
        }\r
 \r
+       // コマンドラインから書庫を開く場合にはウインドウが表示されていないので表示。\r
+       if (! this->IsShown())\r
+       {\r
+               this->Show();\r
+       }\r
+\r
        piInfo.eMessage = TPI_MESSAGE_STATUS;\r
        piInfo.eStatus = 0x1001;\r
        if (this->ErrorCheck(procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo), wxT("Callback")) == TPI_CALLBACK_CANCEL)\r
        {\r
                procDlg.Show(false);\r
                tpi.CloseArchive();\r
-               wxCommandEvent e;\r
-               this->OnArcClose(e);\r
+               // OnArcClose処理はProcessDialogのデストラクタで行う。\r
+               // this->OnArcClose(e);\r
                return;\r
        }\r
 \r
@@ -372,12 +412,8 @@ void MainFrame::OnArcOpen(wxCommandEvent& e)
        g_hIconT.Add(wxBitmap(L_DIR_S_ICO wxT("folder_open.png"), wxBITMAP_TYPE_ANY));\r
        this->tree_ctrl->SetImageList(& g_hIconT);\r
        wxTreeItemId\r
-               idRoot = this->tree_ctrl->AddRoot(wxEmptyString),\r
-#ifdef __WINDOWS__\r
-               idArchive = this->tree_ctrl->AppendItem(idRoot, this->fnArchive.GetFullName(), g_hIconT.Add(GetFileTypeIcon(piInfo.fiInfo.fnFileName))),\r
-#else\r
-               idArchive = this->tree_ctrl->AppendItem(idRoot, this->fnArchive.GetFullName(), g_hIconT.Add(GetFileTypeIcon(piInfo.fiInfo.fnFileName).ConvertToImage().Rescale(16, 16))),\r
-#endif\r
+               idRoot    = this->tree_ctrl->AddRoot(wxEmptyString),\r
+               idArchive = this->tree_ctrl->AppendItem(idRoot, this->fnArchive.GetFullName(), g_hIconT.Add(myRescaleIcon(GetFileTypeIcon(this->fnArchive)))),\r
                idArcRoot = this->tree_ctrl->AppendItem(idRoot, wxT("-----"), 0, 1);\r
 \r
        // 巨大書庫のときにファイル名検査を省略するか。\r
@@ -395,8 +431,8 @@ void MainFrame::OnArcOpen(wxCommandEvent& e)
                        {\r
                                procDlg.Show(false);\r
                                tpi.CloseArchive();\r
-                               wxCommandEvent e;\r
-                               this->OnArcClose(e);\r
+                               // OnArcClose処理はProcessDialogのデストラクタで行う。\r
+                               // this->OnArcClose(e);\r
                                return;\r
                        }\r
 \r
@@ -490,14 +526,17 @@ void MainFrame::OnArcOpen(wxCommandEvent& e)
        // 書庫の情報を取得。\r
        tpi.GetArchiveInformation(& this->aiArchive);\r
        this->ErrorCheck(tpi.nErrorCode, wxT("GetArchiveInformation"));\r
+       this->szPassword = procDlg.szPassword;\r
 \r
-       // 書庫を閉じる。\r
-       tpi.CloseArchive();\r
-       this->ErrorCheck(tpi.nErrorCode, wxT("CloseArchive"));\r
+       // Command()でハンドルを用いない場合は、ここで書庫を閉じる。\r
+       if (! tpi.bHandleOnCommand)\r
+       {\r
+               tpi.CloseArchive();\r
+               this->ErrorCheck(tpi.nErrorCode, wxT("CloseArchive"));\r
+       }\r
 \r
        // 以下、UI処理。\r
        this->fileinfo.Shrink();\r
-       this->tree_ctrl->Freeze();\r
        if (this->fileinfo.Count() < 10000)\r
        {\r
                this->tree_ctrl->ExpandAll();\r
@@ -512,7 +551,6 @@ void MainFrame::OnArcOpen(wxCommandEvent& e)
        // ツリービューの位置合わせ。\r
        this->tree_ctrl->ScrollTo(idArchive);\r
        this->tree_ctrl->SetScrollPos(wxHORIZONTAL, 0);\r
-       this->tree_ctrl->Thaw();\r
        this->list_ctrl->atDangerItem.SetTextColour(* wxRED);\r
        this->list_ctrl->atEncryptedItem.SetTextColour(wxColour(wxT("forest green")));\r
 \r
@@ -524,30 +562,40 @@ void MainFrame::OnArcOpen(wxCommandEvent& e)
        this->statusbar->SetStatusText(this->fnArchive.GetFullPath(), 4);\r
        this->statusbar->SetToolTip(\r
                wxString::Format(\r
-                       _("%s(%s)\nModify: %s\nCreate: %s\nTPI: %s(%s)"),\r
+                       _("%s(%s)\nTPI: %s(%s)\nAccess: %s\nModify: %s\nCreate: %s\nComment:\n%s"),\r
                        this->fnArchive.GetFullName().c_str(), this->aiArchive.fiInfo.szTypeName.c_str(),\r
+                       this->aiArchive.fiInfo.szTPIName.c_str(), this->aiArchive.fiInfo.szEngineName.c_str(),\r
+                       this->aiArchive.tmAccess.Format(_("%Y/%m/%d %H:%M:%S")).c_str(),\r
                        this->aiArchive.tmModify.Format(_("%Y/%m/%d %H:%M:%S")).c_str(),\r
                        this->aiArchive.tmCreate.Format(_("%Y/%m/%d %H:%M:%S")).c_str(),\r
-                       this->aiArchive.fiInfo.szTPIName.c_str(), this->aiArchive.fiInfo.szEngineName.c_str()\r
+                       this->aiArchive.szComment.c_str()\r
                )\r
        );\r
 \r
        // ツールバー・メニューバー設定。ファイル選択時しか動作しない削除などは別に設定。\r
        SetMenuToolState("Arc_Close",   true);\r
-       SetMenuToolState("Arc_Add",     (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_ADD)   == TPI_COMMAND_ADD   && this->aiArchive.fiInfo.fArchive);\r
+       SetMenuToolState("Arc_Add",     (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_ADD)    == TPI_COMMAND_ADD   &&   this->aiArchive.fiInfo.fArchive);\r
        SetMenuToolState("Arc_SFX",     (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_SFX)    == TPI_COMMAND_SFX   && ! this->aiArchive.fSFX);\r
-       SetMenuToolState("Arc_UnSFX",   (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_UNSFX)  == TPI_COMMAND_UNSFX && this->aiArchive.fSFX);\r
+       SetMenuToolState("Arc_UnSFX",   (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_UNSFX)  == TPI_COMMAND_UNSFX &&   this->aiArchive.fSFX);\r
        SetMenuToolState("Arc_Extract", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_EXTRACT)== TPI_COMMAND_EXTRACT);\r
        SetMenuToolState("Arc_Test",    (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_TEST)   == TPI_COMMAND_TEST);\r
        SetMenuToolState("Arc_Repair",  (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_REPAIR) == TPI_COMMAND_REPAIR);\r
        this->menubar->Enable(XRCID("Arc_Clone"), true);\r
 \r
+       // タイトルバー設定。\r
+       this->SetTitle(this->fnArchive.GetFullName() + wxT(" - Lychee"));\r
+\r
        procDlg.Show(false);\r
        this->Raise();\r
 }\r
 \r
 void MainFrame::OnArcClose(wxCommandEvent& e)\r
 {\r
+       if (tpi.bHandleOnCommand)\r
+       {\r
+               tpi.CloseArchive();\r
+       }\r
+\r
        // ツリービュー・リストビュー設定。\r
        this->tree_ctrl->DeleteAllItems();\r
        this->list_ctrl->DeleteAllItems();\r
@@ -570,6 +618,7 @@ void MainFrame::OnArcClose(wxCommandEvent& e)
        }\r
        this->statusbar->SetToolTip(wxEmptyString);\r
        this->fileinfo.Clear();\r
+       this->szPassword.Empty();\r
        this->aiArchive.szComment.Empty();\r
        this->aiArchive.fnArchive.Clear();\r
        this->aiArchive.fiInfo.szTypeName.Empty();\r
@@ -581,6 +630,9 @@ void MainFrame::OnArcClose(wxCommandEvent& e)
        g_hIconLL.RemoveAll();\r
        g_hIconLS.RemoveAll();\r
 \r
+       // タイトルバー設定。\r
+       this->SetTitle(wxT("Lychee"));\r
+\r
        // DnDで書庫を開くときは既に読み込まれているTPIを用いるので、解放してはいけない。\r
        if (e.GetExtraLong() == 0)\r
        {\r
@@ -609,9 +661,7 @@ void MainFrame::OnArcClone(wxCommandEvent&)
 void MainFrame::OnArcAdd(wxCommandEvent& e)\r
 {\r
        // 作成ダイアログを設定。\r
-       MakeDialog mkDlg;\r
-       mkDlg.SetParent(this);\r
-       mkDlg.uCommand = TPI_COMMAND_ADD;\r
+       MakeDialog mkDlg(this, TPI_COMMAND_ADD);\r
 \r
        TPI_SWITCHES swInfo;\r
        swInfo.pCustomSwitches       = NULL;\r
@@ -663,8 +713,9 @@ void MainFrame::OnArcAdd(wxCommandEvent& e)
        }\r
 \r
        // 各種設定。\r
-       swInfo.fMakeSFX              = false;\r
-       swInfo.fStoreDirectoryPathes = ! mkDlg.cbIgnorePath->IsChecked();\r
+       swInfo.szArcName            = this->fnArchive.GetFullPath();\r
+       swInfo.fMakeSFX             = false;\r
+       swInfo.fStoreDirectoryPathes= ! mkDlg.cbIgnorePath->IsChecked();\r
        swInfo.fSolid               = mkDlg.cbSolid->IsChecked();\r
        swInfo.fMMOptimize          = mkDlg.cbMMOptimize->IsChecked();\r
        swInfo.fEncryptHeader       = mkDlg.cbEncryptHeader->IsChecked();\r
@@ -676,12 +727,8 @@ void MainFrame::OnArcAdd(wxCommandEvent& e)
 \r
        // 処理を行う。\r
        {\r
-               ProcessDialog procDlg;\r
-               procDlg.fnArchive  = & this->fnArchive;\r
-               procDlg.nFileCount = mkDlg.files.GetCount();\r
-               procDlg.Show(true);\r
-\r
-               tpi.Command(TPI_COMMAND_ADD, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files);\r
+               ProcessDialog procDlg(this, mkDlg.files.GetCount(), this->szPassword);\r
+               tpi.Command(TPI_COMMAND_ADD, & swInfo, mkDlg.files);\r
                this->ErrorCheck(tpi.nErrorCode);\r
                procDlg.Show(false);\r
        }\r
@@ -699,13 +746,15 @@ void MainFrame::OnArcAdd(wxCommandEvent& e)
        }\r
 \r
        // 終了しない場合は書庫を再読み込み。\r
+       e.SetInt(1);\r
        this->OnArcOpen(e);\r
 }\r
 \r
 void MainFrame::OnArcConvert(wxCommandEvent& e)\r
 {\r
        TPI_SWITCHES swInfo;\r
-       swInfo.fMakeSFX = e.GetId() == XRCID("Arc_SFX");\r
+       swInfo.szArcName            = this->fnArchive.GetFullPath();\r
+       swInfo.fMakeSFX             = e.GetId() == XRCID("Arc_SFX");\r
 \r
        // 保存先を尋ねる。\r
        wxFileDialog fd(this, swInfo.fMakeSFX ? _("Save as SFX") : _("Save as normal archive"), this->fnArchive.GetPath(), this->fnArchive.GetName() + (swInfo.fMakeSFX ? EXE_EXT : (wxString) wxEmptyString), wxFileSelectorDefaultWildcardStr, wxFD_SAVE | wxFD_OVERWRITE_PROMPT);\r
@@ -719,9 +768,8 @@ void MainFrame::OnArcConvert(wxCommandEvent& e)
        wxArrayString files;\r
        files.Add(fd.GetPath());\r
 \r
-       ProcessDialog procDlg;\r
-       procDlg.Show(true);\r
-       tpi.Command(swInfo.fMakeSFX ? TPI_COMMAND_SFX : TPI_COMMAND_UNSFX, & swInfo, this->fnArchive.GetFullPath(), files);\r
+       ProcessDialog procDlg(this);\r
+       tpi.Command(swInfo.fMakeSFX ? TPI_COMMAND_SFX : TPI_COMMAND_UNSFX, & swInfo, files);\r
        this->ErrorCheck(tpi.nErrorCode);\r
        procDlg.Show(false);\r
 }\r
@@ -729,7 +777,9 @@ void MainFrame::OnArcConvert(wxCommandEvent& e)
 void MainFrame::OnArcExtract(wxCommandEvent& e)\r
 {\r
        TPI_SWITCHES swInfo;\r
-       swInfo.pCustomSwitches = NULL;\r
+       swInfo.szArcName            = this->fnArchive.GetFullPath();\r
+       swInfo.pCustomSwitches      = NULL;\r
+       swInfo.szPassword           = this->szPassword;\r
 \r
        // モード取得。通常は0, 実行なら1, ファイルDnDなら2、ディレクトリDnDなら3、クリップボードなら4、コンテキストメニューからなら8。\r
        int nMode = e.GetInt();\r
@@ -741,9 +791,7 @@ void MainFrame::OnArcExtract(wxCommandEvent& e)
        wxFileType * ftFile = NULL;\r
 \r
        // 展開ダイアログを作成。DnDまたは実行時は表示しない。\r
-       MakeDialog mkDlg;\r
-       mkDlg.SetParent(this);\r
-       mkDlg.uCommand = TPI_COMMAND_EXTRACT;\r
+       MakeDialog mkDlg(this, TPI_COMMAND_EXTRACT);\r
        mkDlg.files    = MakeTargetFileList(this, nMode == 1, nMode == 0);\r
 \r
        bool bMakeDir = false;\r
@@ -752,13 +800,12 @@ void MainFrame::OnArcExtract(wxCommandEvent& e)
                // 作業ディレクトリ作成。\r
                swInfo.fStoreDirectoryPathes = false;\r
                wxString szDestDirBase = nMode == 3 ? this->tree_ctrl->GetItemText(this->tree_ctrl->GetSelection()) : wxT("tpi_tmp");\r
-               wxStandardPaths p;\r
                if (szDestDirBase == wxT("-----"))\r
                {\r
                        // 書庫ルートのときは書庫名にしておく。\r
                        szDestDirBase = this->fnArchive.GetName();\r
                }\r
-               swInfo.fnDestinationDirectory = MakeDirPath(wxFileName::DirName(p.GetTempDir()), szDestDirBase, true);\r
+               swInfo.fnDestinationDirectory = MakeDirPath(wxFileName::DirName(wxStandardPaths::Get().GetTempDir()), szDestDirBase, true);\r
                if (! swInfo.fnDestinationDirectory.IsOk())\r
                {\r
                        wxLogError(_("Unable to make the temporary directory!"));\r
@@ -793,12 +840,8 @@ void MainFrame::OnArcExtract(wxCommandEvent& e)
 \r
        // 処理を行う。\r
        {\r
-               ProcessDialog procDlg;\r
-               procDlg.fnArchive  = & this->fnArchive;\r
-               procDlg.nFileCount = mkDlg.files.GetCount();\r
-               procDlg.Show(true);\r
-\r
-               tpi.Command(TPI_COMMAND_EXTRACT, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files);\r
+               ProcessDialog procDlg(this, mkDlg.files.GetCount(), this->szPassword);\r
+               tpi.Command(TPI_COMMAND_EXTRACT, & swInfo, mkDlg.files);\r
                this->ErrorCheck(tpi.nErrorCode);\r
                procDlg.Show(false);\r
        }\r
@@ -934,18 +977,17 @@ void MainFrame::OnArcDelete(wxCommandEvent& e)
        // 処理を行う。\r
        {\r
                wxArrayString asFiles = MakeTargetFileList(this);\r
-               ProcessDialog procDlg;\r
-               procDlg.fnArchive  = & this->fnArchive;\r
-               procDlg.nFileCount = asFiles.GetCount();\r
-               procDlg.Show(true);\r
-\r
+               ProcessDialog procDlg(this, asFiles.GetCount(), this->szPassword);\r
                TPI_SWITCHES swInfo;\r
-               tpi.Command(TPI_COMMAND_DELETE, & swInfo, this->fnArchive.GetFullPath(), asFiles);\r
+               swInfo.szArcName  = this->fnArchive.GetFullPath();\r
+               swInfo.szPassword = this->szPassword;\r
+               tpi.Command(TPI_COMMAND_DELETE, & swInfo, asFiles);\r
                this->ErrorCheck(tpi.nErrorCode);\r
                procDlg.Show(false);\r
        }\r
 \r
        // 書庫を再読み込みする。\r
+       e.SetInt(1);\r
        this->OnArcOpen(e);\r
 }\r
 \r
@@ -953,36 +995,24 @@ void MainFrame::OnArcTest(wxCommandEvent&)
 {\r
        // 処理を行う。\r
        wxArrayString asFiles = MakeTargetFileList(this);\r
-       ProcessDialog procDlg;\r
-       procDlg.fnArchive  = & this->fnArchive;\r
-       procDlg.nFileCount = asFiles.GetCount();\r
-       procDlg.Show(true);\r
-\r
+       ProcessDialog procDlg(this, asFiles.GetCount(), this->szPassword);\r
        TPI_SWITCHES swInfo;\r
-       bool bIsCorrect = tpi.Command(TPI_COMMAND_TEST, & swInfo, this->fnArchive.GetFullPath(), asFiles);\r
+       swInfo.szArcName  = this->fnArchive.GetFullPath();\r
+       swInfo.szPassword = this->szPassword;\r
+       tpi.Command(TPI_COMMAND_TEST, & swInfo, asFiles);\r
+       this->ErrorCheck(tpi.nErrorCode);\r
        procDlg.Show(false);\r
-\r
-       if (bIsCorrect)\r
-       {\r
-               wxLogMessage(_("This is a correct archive."));\r
-       }\r
-       else\r
-       {\r
-               this->ErrorCheck(tpi.nErrorCode);\r
-       }\r
 }\r
 \r
 void MainFrame::OnArcRepair(wxCommandEvent&)\r
 {\r
        // 処理を行う。\r
        wxArrayString asFiles = MakeTargetFileList(this);\r
-       ProcessDialog procDlg;\r
-       procDlg.fnArchive  = & this->fnArchive;\r
-       procDlg.nFileCount = asFiles.GetCount();\r
-       procDlg.Show(true);\r
-\r
+       ProcessDialog procDlg(this, asFiles.GetCount(), this->szPassword);\r
        TPI_SWITCHES swInfo;\r
-       tpi.Command(TPI_COMMAND_REPAIR, & swInfo, this->fnArchive.GetFullPath(), asFiles);\r
+       swInfo.szArcName  = this->fnArchive.GetFullPath();\r
+       swInfo.szPassword = this->szPassword;\r
+       tpi.Command(TPI_COMMAND_REPAIR, & swInfo, asFiles);\r
        this->ErrorCheck(tpi.nErrorCode);\r
        procDlg.Show(false);    \r
 }\r
@@ -1154,15 +1184,8 @@ bool MainFrame::LoadTPI(const wxString & szFileName, wxULongLong_t * llFileCount
        {\r
                do\r
                {\r
-                       // 初期化。\r
-                       if (! tpi.InitLibrary(L_DIR_B_LIB + szTPIName, szFileName, TPICallbackProc))\r
-                       {\r
-                               tpi.FreeLibrary();\r
-                               continue;\r
-                       }\r
-\r
-                       // 対応確認。\r
-                       if (! tpi.OpenArchive(szFileName, llFileCount))\r
+                       // 初期化と対応確認。\r
+                       if (! tpi.InitLibrary(L_DIR_B_LIB + szTPIName, szFileName, TPICallbackProc) || ! tpi.OpenArchive(szFileName, llFileCount))\r
                        {\r
                                tpi.FreeLibrary();\r
                                * llFileCount = 0;\r
@@ -1188,7 +1211,6 @@ int MainFrame::ErrorCheck(int nErrorCode, const wxString & szAPIName)
                break;\r
        case TPI_ERROR_D_SKIPPED:\r
        case TPI_CALLBACK_CANCEL:\r
-               wxLogError(_("This operation is canceled by the user."));\r
                break;\r
        default:\r
                wxLogError(_("Error: %s()!\nError code: %d"), szAPIName.c_str(), nErrorCode);\r