1 /*******************************************************************************
\r
2 TPI - flexible but useless plug-in framework.
\r
3 Copyright (C) 2002-2009 Silky
\r
5 This library is free software; you can redistribute it and/or modify it under
\r
6 the terms of the GNU Lesser General Public License as published by the Free
\r
7 Software Foundation; either version 2.1 of the License, or (at your option)
\r
10 This library is distributed in the hope that it will be useful, but WITHOUT
\r
11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
\r
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
\r
15 You should have received a copy of the GNU Lesser General Public License along
\r
16 with this library; if not, write to the Free Software Foundation, Inc.,
\r
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
\r
20 *******************************************************************************/
\r
24 #include "frm_main.h"
\r
25 #include "cls_filedroptarget.h"
\r
26 #include "dlg_make.h"
\r
27 #include "dlg_process.h"
\r
28 #include "functions.h"
\r
30 #include <wx/arrimpl.cpp>
\r
32 WX_DEFINE_OBJARRAY(ArrayTPI_FILEINFO);
\r
34 #define SetMenuToolState(id, state) this->toolbar->EnableTool(XRCID(id), state); this->menubar->Enable(XRCID(id), state)
\r
36 //******************************************************************************
\r
38 //******************************************************************************
\r
40 wxImageList g_hIconT(16, 16), g_hIconLL(32, 32), g_hIconLS(16, 16);
\r
44 //******************************************************************************
\r
46 //******************************************************************************
\r
48 MainFrame::MainFrame(): wxFrame()
\r
52 MainFrame::~MainFrame()
\r
55 this->OnArcClose(e);
\r
58 if (! this->IsIconized() && ! this->IsMaximized())
\r
61 this->GetSize(& a, & b);
\r
62 this->conf.WriteId(CONF_WINDOW_WIDTH, a);
\r
63 this->conf.WriteId(CONF_WINDOW_HEIGHT, b);
\r
64 this->GetPosition(& a, & b);
\r
65 this->conf.WriteId(CONF_WINDOW_X, a);
\r
66 this->conf.WriteId(CONF_WINDOW_Y, b);
\r
68 this->conf.WriteId(CONF_WINDOW_SPLITTER_POS, this->window_splitter->GetSashPosition());
\r
71 this->conf.WriteId(CONF_WINDOW_STATUSBAR, this->statusbar->IsShown());
\r
72 this->conf.WriteId(CONF_WINDOW_TOOLBAR, this->toolbar->IsShown());
\r
75 this->conf.WriteId(CONF_LISTVIEW_SHOWMODE, this->menubar->IsChecked(XRCID("Exe_View_Icons")) ? 1 : this->menubar->IsChecked(XRCID("Exe_View_List")) ? 2 : 0);
\r
76 if (this->menubar->IsChecked(XRCID("Exe_View_Details")))
\r
78 this->conf.WriteId(CONF_LISTVIEW_C_FILENAME, this->list_ctrl->GetColumnWidth(0));
\r
79 this->conf.WriteId(CONF_LISTVIEW_C_UNPACKED, this->list_ctrl->GetColumnWidth(1));
\r
80 this->conf.WriteId(CONF_LISTVIEW_C_PACKED, this->list_ctrl->GetColumnWidth(2));
\r
81 this->conf.WriteId(CONF_LISTVIEW_C_RATIO, this->list_ctrl->GetColumnWidth(3));
\r
82 this->conf.WriteId(CONF_LISTVIEW_C_METHOD, this->list_ctrl->GetColumnWidth(4));
\r
83 this->conf.WriteId(CONF_LISTVIEW_C_ATTR, this->list_ctrl->GetColumnWidth(5));
\r
84 this->conf.WriteId(CONF_LISTVIEW_C_LASTMOD, this->list_ctrl->GetColumnWidth(6));
\r
85 this->conf.WriteId(CONF_LISTVIEW_C_PATH, this->list_ctrl->GetColumnWidth(7));
\r
86 this->conf.WriteId(CONF_LISTVIEW_C_TYPE, this->list_ctrl->GetColumnWidth(8));
\r
87 this->conf.WriteId(CONF_LISTVIEW_C_NO, this->list_ctrl->GetColumnWidth(9));
\r
88 this->conf.WriteId(CONF_LISTVIEW_C_COMMENT, this->list_ctrl->GetColumnWidth(10));
\r
89 this->conf.WriteId(CONF_LISTVIEW_S_COLUMN, g_nSortColumn);
\r
90 this->conf.WriteId(CONF_LISTVIEW_S_ASCEND, g_fSortAscend);
\r
96 //******************************************************************************
\r
98 //******************************************************************************
\r
100 BEGIN_EVENT_TABLE(MainFrame, wxFrame)
\r
101 EVT_INIT_DIALOG( MainFrame::OnInit)
\r
103 EVT_MENU(XRCID("Arc_Create"), MainFrame::OnArcCreate)
\r
104 EVT_MENU(XRCID("Arc_Open"), MainFrame::OnArcOpen)
\r
105 EVT_MENU(XRCID("Arc_Close"), MainFrame::OnArcClose)
\r
106 EVT_MENU(XRCID("Arc_Add"), MainFrame::OnArcAdd)
\r
107 EVT_MENU(XRCID("Arc_SFX"), MainFrame::OnArcConvert)
\r
108 EVT_MENU(XRCID("Arc_UnSFX"), MainFrame::OnArcConvert)
\r
109 EVT_MENU(XRCID("Exe_Exit"), MainFrame::OnExit)
\r
110 EVT_MENU(XRCID("Arc_Extract"), MainFrame::OnArcExtract)
\r
111 EVT_MENU(XRCID("Arc_Delete"), MainFrame::OnArcDelete)
\r
112 EVT_MENU(XRCID("Arc_Test"), MainFrame::OnArcTest)
\r
113 EVT_MENU(XRCID("Arc_Repair"), MainFrame::OnArcRepair)
\r
114 EVT_MENU(XRCID("Exe_Copy"), MainFrame::OnExeCopy)
\r
115 EVT_MENU(XRCID("Exe_View_Icons"), MainFrame::OnViewMode)
\r
116 EVT_MENU(XRCID("Exe_View_Details"),MainFrame::OnViewMode)
\r
117 EVT_MENU(XRCID("Exe_View_List"), MainFrame::OnViewMode)
\r
118 EVT_MENU(XRCID("Exe_View_ToolBar"),MainFrame::OnShowToolBar)
\r
119 EVT_MENU(XRCID("Exe_View_StatusBar"),MainFrame::OnShowStatusBar)
\r
120 EVT_MENU(XRCID("Exe_View_SelectAll"),MainFrame::OnSelectAll)
\r
122 EVT_TREE_SEL_CHANGED(XRCID("TreeView"), MainFrame::OnTreeChanged)
\r
123 EVT_TREE_BEGIN_DRAG( XRCID("TreeView"), MainFrame::OnTreeBeginDrag)
\r
125 EVT_LIST_ITEM_SELECTED( XRCID("ListView"), MainFrame::OnListItemSelect)
\r
126 EVT_LIST_ITEM_DESELECTED(XRCID("ListView"), MainFrame::OnListItemSelect)
\r
127 EVT_LIST_ITEM_ACTIVATED( XRCID("ListView"), MainFrame::OnListItemDClick)
\r
128 EVT_LIST_BEGIN_DRAG( XRCID("ListView"), MainFrame::OnListBeginDrag)
\r
130 EVT_TEXT(XRCID("tcFilter"), MainFrame::OnFilter)
\r
133 //******************************************************************************
\r
135 //******************************************************************************
\r
137 void MainFrame::OnInit(wxInitDialogEvent&)
\r
140 this->menubar = this->GetMenuBar();
\r
141 this->toolbar = this->GetToolBar();
\r
142 this->statusbar = XRCCTRL(* this, "statusbar", wxStatusBar);
\r
143 this->tree_ctrl = XRCCTRL(* this, "TreeView", wxTreeCtrl);
\r
144 this->list_ctrl = XRCCTRL(* this, "ListView", myListCtrl);
\r
145 this->window_splitter = XRCCTRL(* this, "window_splitter", wxSplitterWindow);
\r
146 this->tcFilter = XRCCTRL(* this->toolbar, "tcFilter", wxTextCtrl);
\r
149 this->SetSize(this->conf.ReadId(CONF_WINDOW_X, 0l), this->conf.ReadId(CONF_WINDOW_Y, 0l), this->conf.ReadId(CONF_WINDOW_WIDTH, 800l), this->conf.ReadId(CONF_WINDOW_HEIGHT, 400l), wxSIZE_ALLOW_MINUS_ONE);
\r
150 wxTheMimeTypesManager->Initialize(wxMAILCAP_ALL);
\r
155 icon.CopyFromBitmap(wxBitmap(L_DIR_S_ICO wxT("app.png"), wxBITMAP_TYPE_ANY));
\r
156 this->SetIcon(icon);
\r
159 this->OnArcClose(e);
\r
160 this->SetDropTarget(new myFileDropTarget(this));
\r
163 this->window_splitter->SetSashPosition(this->conf.ReadId(CONF_WINDOW_SPLITTER_POS, 200l));
\r
166 int nIconMode = this->conf.ReadId(CONF_LISTVIEW_SHOWMODE, 0l);
\r
167 e.SetId(nIconMode == 1 ? XRCID("Exe_View_Icons") : (nIconMode == 2 ? XRCID("Exe_View_List") : XRCID("Exe_View_Details")));
\r
168 this->OnViewMode(e);
\r
169 // wxGTKでは直接wxLC_VIRTUALを指定しないと反映されない。
\r
170 this->list_ctrl->SetSingleStyle(wxLC_VIRTUAL);
\r
171 this->list_ctrl->InsertColumn(0, _("Filename"), wxLIST_FORMAT_LEFT, this->conf.ReadId(CONF_LISTVIEW_C_FILENAME, 140l));
\r
172 this->list_ctrl->InsertColumn(1, _("Unpacked"), wxLIST_FORMAT_RIGHT, this->conf.ReadId(CONF_LISTVIEW_C_UNPACKED, 80l));
\r
173 this->list_ctrl->InsertColumn(2, _("Packed"), wxLIST_FORMAT_RIGHT, this->conf.ReadId(CONF_LISTVIEW_C_PACKED, 80l));
\r
174 this->list_ctrl->InsertColumn(3, _("Ratio"), wxLIST_FORMAT_RIGHT, this->conf.ReadId(CONF_LISTVIEW_C_RATIO, 50l));
\r
175 this->list_ctrl->InsertColumn(4, _("Method"), wxLIST_FORMAT_LEFT, this->conf.ReadId(CONF_LISTVIEW_C_METHOD, 60l));
\r
176 this->list_ctrl->InsertColumn(5, _("Attr"), wxLIST_FORMAT_LEFT, this->conf.ReadId(CONF_LISTVIEW_C_ATTR, 50l));
\r
177 this->list_ctrl->InsertColumn(6, _("Last modified"), wxLIST_FORMAT_RIGHT, this->conf.ReadId(CONF_LISTVIEW_C_LASTMOD, 150l));
\r
178 this->list_ctrl->InsertColumn(7, _("Path"), wxLIST_FORMAT_LEFT, this->conf.ReadId(CONF_LISTVIEW_C_PATH, 100l));
\r
179 this->list_ctrl->InsertColumn(8, _("Type"), wxLIST_FORMAT_LEFT, this->conf.ReadId(CONF_LISTVIEW_C_TYPE, 100l));
\r
180 this->list_ctrl->InsertColumn(9, _("No."), wxLIST_FORMAT_RIGHT, this->conf.ReadId(CONF_LISTVIEW_C_NO, 35l));
\r
181 this->list_ctrl->InsertColumn(10,_("Comment"), wxLIST_FORMAT_LEFT, this->conf.ReadId(CONF_LISTVIEW_C_COMMENT, 35l));
\r
182 g_nSortColumn = this->conf.ReadId(CONF_LISTVIEW_S_COLUMN, 9l);
\r
183 g_fSortAscend = this->conf.ReadId(CONF_LISTVIEW_S_ASCEND, true);
\r
185 // ツールバー/ステータスバー設定。
\r
186 int nStatusBarParts[] = {70, 70, 180, 50, -1};
\r
187 this->statusbar->SetFieldsCount(5, nStatusBarParts);
\r
188 this->SetStatusBarPane(-1);
\r
189 bool fShow = this->conf.ReadId(CONF_WINDOW_STATUSBAR, true);
\r
190 this->menubar->Check(XRCID("Exe_View_StatusBar"), fShow);
\r
191 this->statusbar->Show(fShow);
\r
192 fShow = this->conf.ReadId(CONF_WINDOW_TOOLBAR, true);
\r
193 this->menubar->Check(XRCID("Exe_View_ToolBar"), fShow);
\r
194 this->toolbar->Show(fShow);
\r
199 void MainFrame::OnExit(wxCommandEvent&)
\r
204 void MainFrame::OnArcCreate(wxCommandEvent& e)
\r
206 TPI_SWITCHES swInfo;
\r
207 swInfo.pCustomSwitches = NULL;
\r
211 ::wxXmlResource::Get()->Load(L_DIR_S_XRC wxT("dlg_make.xrc"));
\r
212 ::wxXmlResource::Get()->LoadDialog(& mkDlg, this, wxT("dlg_make"));
\r
214 if (e.GetClientData() == NULL)
\r
217 wxFileDialog fd(this, _("Choose files to compress"), this->conf.ReadHistory(CONF_HISTORY_PATH, 0));
\r
218 fd.SetWindowStyleFlag(wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE);
\r
219 if (fd.ShowModal() == wxID_CANCEL)
\r
223 swInfo.fnDestinationDirectory = wxFileName::DirName(fd.GetDirectory());
\r
224 this->conf.WriteHistory(CONF_HISTORY_PATH, fd.GetDirectory());
\r
225 fd.GetFilenames(mkDlg.files);
\r
229 mkDlg.files = * (wxArrayString *) e.GetClientData();
\r
230 swInfo.fnDestinationDirectory = wxFileName::DirName(wxFileName(mkDlg.files[0]).GetPath());
\r
232 for (size_t n = 0; n < mkDlg.files.GetCount(); n++)
\r
234 wxFileName fn(mkDlg.files[n]);
\r
235 fn.MakeRelativeTo(swInfo.fnDestinationDirectory.GetPath());
\r
236 mkDlg.files[n] = fn.GetFullPath();
\r
240 this->OnArcClose(e);
\r
241 // 書庫名はファイル名の拡張子より前、もしくはディレクトリ名。
\r
242 this->fnArchive = wxFileName(mkDlg.files[0]);
\r
243 this->fnArchive.SetName(mkDlg.files.GetCount() == 1 ? (this->fnArchive.GetName().IsEmpty() ? this->fnArchive.GetDirs().Last() : this->fnArchive.GetName()) : swInfo.fnDestinationDirectory.GetDirs().Last());
\r
244 this->fnArchive.SetEmptyExt();
\r
245 this->fnArchive.SetPath(swInfo.fnDestinationDirectory.GetPath());
\r
248 if (mkDlg.ShowModal() == wxID_CANCEL)
\r
254 swInfo.fStoreDirectoryPathes= ! mkDlg.cbIgnorePath->IsChecked();
\r
255 swInfo.fMakeSFX = mkDlg.cbMakeSFX->IsChecked();
\r
256 swInfo.fSolid = mkDlg.cbSolid->IsChecked();
\r
257 swInfo.fMMOptimize = mkDlg.cbMMOptimize->IsChecked();
\r
258 swInfo.fEncryptHeader = mkDlg.cbEncryptHeader->IsChecked();
\r
259 swInfo.fCompressHeader = mkDlg.cbCompressHeader->IsChecked();
\r
260 swInfo.nCompressLevel = mkDlg.scLevel->GetValue();
\r
261 swInfo.nRecoveryRecord = mkDlg.scRR->GetValue();
\r
262 swInfo.szPassword = mkDlg.tcPassword->GetValue();
\r
263 swInfo.szKeyFile = mkDlg.tcKeyfile->GetValue();
\r
264 swInfo.szComment = mkDlg.tcComment->GetValue();
\r
265 mkDlg.cbSplitSize->GetValue().ToULongLong(& swInfo.nSplitSize);
\r
268 int nSelected = mkDlg.chType->GetSelection();
\r
269 this->fnArchive = wxFileName(mkDlg.cbDir->GetValue(), mkDlg.cbFileName->GetValue());
\r
270 if (! tpi.InitLibrary(mkDlg.afInfo[nSelected].szTPIName, this->fnArchive.GetFullPath(), mkDlg.afInfo[nSelected].nTypeId))
\r
272 this->ErrorCheck(tpi.nErrorCode, wxT("InitLibrary"));
\r
277 tpi.SetCallbackProc(TPICallbackProc);
\r
278 this->ErrorCheck(tpi.nErrorCode, wxT("SetCallbackProc"));
\r
282 ProcessDialog procDlg;
\r
283 procDlg.Show(true);
\r
286 TPI_PROCESSINFO piInfo;
\r
287 piInfo.eMessage = TPI_MESSAGE_STATUS;
\r
288 piInfo.eStatus = 0x1000;
\r
289 piInfo.fiInfo.fnFileName = this->fnArchive;
\r
290 piInfo.fiInfo.nUnpackedSize = mkDlg.files.GetCount();
\r
291 procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo);
\r
293 tpi.Command(TPI_COMMAND_CREATE, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files);
\r
294 this->ErrorCheck(tpi.nErrorCode);
\r
295 procDlg.Show(false);
\r
299 if (mkDlg.cbOpenAfter->IsChecked())
\r
302 ::wxExecute(DIR_APP + QuoteString(swInfo.fnDestinationDirectory.GetFullPath()));
\r
305 if (mkDlg.cbExitAfter->IsChecked())
\r
312 this->OnArcOpen(e);
\r
315 void MainFrame::OnArcOpen(wxCommandEvent& e)
\r
318 if (e.GetId() == XRCID("Arc_Open"))
\r
320 wxFileDialog fd(this);
\r
321 fd.SetDirectory(this->conf.ReadHistory(CONF_HISTORY_PATH, 0));
\r
322 fd.SetWindowStyleFlag(wxFD_OPEN | wxFD_FILE_MUST_EXIST);
\r
323 if (fd.ShowModal() == wxID_CANCEL)
\r
327 this->conf.WriteHistory(CONF_HISTORY_PATH, fd.GetDirectory());
\r
328 this->fnArchive = wxFileName(fd.GetPath());
\r
332 ProcessDialog procDlg;
\r
333 procDlg.Show(true);
\r
335 // DnD以外で書庫を開く場合、TPIを読み込み。
\r
336 TPI_PROCESSINFO piInfo;
\r
337 piInfo.fiInfo.nUnpackedSize = e.GetExtraLong();
\r
338 if (e.GetInt() != 1 && ! this->LoadTPI(this->fnArchive.GetFullPath(), & piInfo.fiInfo.nUnpackedSize))
\r
340 procDlg.Show(false);
\r
342 if (this->IsShown())
\r
345 this->statusbar->SetStatusText(_("No plug-in supporting this archive was found!"), 4);
\r
349 wxLogError(_("No plug-in supporting this archive was found!"));
\r
356 piInfo.eMessage = TPI_MESSAGE_STATUS;
\r
357 piInfo.eStatus = 0x1000;
\r
358 piInfo.nProcessedSize = 0;
\r
359 piInfo.fiInfo.fnFileName = this->fnArchive;
\r
360 procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo);
\r
363 this->fileinfo.Alloc(piInfo.fiInfo.nUnpackedSize);
\r
366 this->conf.WriteHistory(CONF_HISTORY_PATH, this->fnArchive.GetPath());
\r
367 this->conf.WriteHistory(CONF_HISTORY_NAME, this->fnArchive.GetFullName());
\r
368 this->conf.WriteHistory(CONF_HISTORY_FULL, this->fnArchive.GetFullPath());
\r
370 // 書庫のアイコンを取得し、書庫ルートを作成。
\r
371 g_hIconT.Add(wxBitmap(L_DIR_S_ICO wxT("folder_closed.png"), wxBITMAP_TYPE_ANY));
\r
372 g_hIconT.Add(wxBitmap(L_DIR_S_ICO wxT("folder_open.png"), wxBITMAP_TYPE_ANY));
\r
373 this->tree_ctrl->SetImageList(& g_hIconT);
\r
375 idRoot = this->tree_ctrl->AddRoot(wxEmptyString),
\r
377 idArchive = this->tree_ctrl->AppendItem(idRoot, piInfo.fiInfo.fnFileName.GetFullName(), g_hIconT.Add(GetFileTypeIcon(piInfo.fiInfo.fnFileName))),
\r
379 idArchive = this->tree_ctrl->AppendItem(idRoot, piInfo.fiInfo.fnFileName.GetFullName(), g_hIconT.Add(GetFileTypeIcon(piInfo.fiInfo.fnFileName).ConvertToImage().Rescale(16, 16))),
\r
381 idArcRoot = this->tree_ctrl->AppendItem(idRoot, wxT("-----"), 0, 1);
\r
384 if (tpi.GetFileInformation(& piInfo.fiInfo, true))
\r
386 piInfo.eStatus = 0x1001;
\r
389 piInfo.nProcessedSize++;
\r
390 if (this->ErrorCheck(procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo)) == TPI_CALLBACK_CANCEL)
\r
392 procDlg.Show(false);
\r
393 tpi.CloseArchive();
\r
395 this->OnArcClose(e);
\r
400 wxString szPath = piInfo.fiInfo.fnFileName.GetPathWithSep(wxPATH_UNIX);
\r
401 if (szPath.StartsWith(wxT("/")))
\r
403 piInfo.fiInfo.fnFileName = wxFileName(szPath.AfterFirst(wxT('/')), piInfo.fiInfo.fnFileName.GetFullName(), wxPATH_DOS);
\r
407 bool fDir = piInfo.fiInfo.dwAttribute & TPI_ATTRIBUTE_DIRECTORY ? true : false;
\r
408 TreeView_CheckNewerItem(this->tree_ctrl, idArcRoot, fDir ? piInfo.fiInfo.fnFileName.GetFullPath() : piInfo.fiInfo.fnFileName.GetPath(), true);
\r
412 if (piInfo.fiInfo.fnFileName.GetPathWithSep(wxPATH_UNIX).Find(wxT("../")) != wxNOT_FOUND)
\r
414 piInfo.fiInfo.eDanger = TRUE;
\r
415 wxLogWarning(_("This archive may have Directory Traversal Vulnerability(DTV) problem, and some danger files may be extracted to the unexpected system directory! You should use the \"Ignore file pathes\" option when extracting this archive.\nDanger file is:\n%s"), piInfo.fiInfo.fnFileName.GetFullPath().c_str());
\r
417 // 空白の連続による拡張子偽装を検査。
\r
418 if (piInfo.fiInfo.fnFileName.GetFullName().Find(wxT(" ")) != wxNOT_FOUND)
\r
420 piInfo.fiInfo.eDanger = TRUE;
\r
421 wxLogWarning(_("This archive may contain extension-disguised files whose real extension is hidden by using many blank charactor and you may mistake that it is a \"safe\" file. Don\'t execute these files carelessly.\nDanger file is:\n%s"), piInfo.fiInfo.fnFileName.GetFullPath().c_str());
\r
424 for (wxChar c = 0x200c; c <= 0x206f; c++)
\r
426 if (piInfo.fiInfo.fnFileName.GetFullName().Find(c) != wxNOT_FOUND)
\r
428 piInfo.fiInfo.eDanger = TRUE;
\r
429 wxLogWarning(_("This archive may contain extension-disguised files whose real extension is hidden by using Unicode control character and you may mistake that it is a \"safe\" file. Don\'t execute these files carelessly.\nDanger file is:\n%s"), piInfo.fiInfo.fnFileName.GetFullPath().c_str());
\r
433 case 0x200f: c = 0x2027; break;
\r
434 case 0x202e: c = 0x2060; break;
\r
438 // ディレクトリ属性を含むものについては情報を保存しない。
\r
445 this->fileinfo.Add(piInfo.fiInfo);
\r
447 while (tpi.GetFileInformation(& piInfo.fiInfo));
\r
450 // GetFileInformationがエラー終了した場合。
\r
451 this->ErrorCheck(tpi.nErrorCode, wxT("GetFileInformation"));
\r
454 tpi.GetArchiveInformation(& this->aiArchive);
\r
455 this->ErrorCheck(tpi.nErrorCode, wxT("GetArchiveInformation"));
\r
458 tpi.CloseArchive();
\r
459 this->ErrorCheck(tpi.nErrorCode, wxT("CloseArchive"));
\r
462 this->fileinfo.Shrink();
\r
463 this->tree_ctrl->ExpandAll();
\r
464 this->tree_ctrl->ScrollTo(idArchive);
\r
465 this->tree_ctrl->SelectItem(idArchive);
\r
466 this->list_ctrl->atDangerItem.SetTextColour(* wxRED);
\r
467 this->list_ctrl->atEncryptedItem.SetTextColour(wxColour(wxT("forest green")));
\r
470 this->statusbar->SetStatusText(this->aiArchive.fiInfo.szTypeName, 0);
\r
471 this->statusbar->SetStatusText(wxString::Format(_("%u file(s)"), this->fileinfo.GetCount()), 1);
\r
472 this->statusbar->SetStatusText(wxString::Format(wxString("%" wxLongLongFmtSpec "uB -> %" wxLongLongFmtSpec "uB"), this->aiArchive.nUnpackedSize, this->aiArchive.nPackedSize), 2);
\r
473 this->statusbar->SetStatusText(wxString::Format(wxT("%3.1f%%"), this->aiArchive.wCompressRatio / 10.0), 3);
\r
474 this->statusbar->SetStatusText(this->fnArchive.GetFullPath(), 4);
\r
476 // ツールバー・メニューバー設定。ファイル選択時しか動作しない削除などは別に設定。
\r
477 SetMenuToolState("Arc_Close", true);
\r
478 SetMenuToolState("Arc_Add", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_ADD) == TPI_COMMAND_ADD && this->aiArchive.fiInfo.fArchive);
\r
479 SetMenuToolState("Arc_SFX", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_SFX) == TPI_COMMAND_SFX && ! this->aiArchive.fSFX);
\r
480 SetMenuToolState("Arc_UnSFX", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_UNSFX) == TPI_COMMAND_UNSFX && this->aiArchive.fSFX);
\r
481 SetMenuToolState("Arc_Extract", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_EXTRACT)== TPI_COMMAND_EXTRACT);
\r
482 SetMenuToolState("Arc_Test", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_TEST) == TPI_COMMAND_TEST);
\r
483 SetMenuToolState("Arc_Repair", (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_REPAIR) == TPI_COMMAND_REPAIR);
\r
485 procDlg.Show(false);
\r
489 void MainFrame::OnArcClose(wxCommandEvent& e)
\r
491 // ツリービュー・リストビュー設定。
\r
492 this->tree_ctrl->DeleteAllItems();
\r
493 this->list_ctrl->DeleteAllItems();
\r
494 this->list_ctrl->apShowFile.Clear();
\r
497 SetMenuToolState("Arc_Close", false);
\r
498 SetMenuToolState("Arc_Add", false);
\r
499 SetMenuToolState("Arc_SFX", false);
\r
500 SetMenuToolState("Arc_UnSFX", false);
\r
501 SetMenuToolState("Arc_Extract", false);
\r
502 SetMenuToolState("Arc_Delete", false);
\r
503 SetMenuToolState("Arc_Test", false);
\r
504 SetMenuToolState("Arc_Repair", false);
\r
506 for (int i = 0; i < this->statusbar->GetFieldsCount(); i++)
\r
508 this->statusbar->SetStatusText(wxEmptyString, i);
\r
510 this->fileinfo.Clear();
\r
511 this->aiArchive.szComment.Empty();
\r
512 this->aiArchive.fnArchive.Clear();
\r
513 this->aiArchive.fiInfo.szTypeName.Empty();
\r
514 this->aiArchive.fiInfo.szSuffix.Empty();
\r
515 this->aiArchive.fiInfo.szEngineName.Empty();
\r
516 this->aiArchive.fiInfo.szTPIName.Empty();
\r
518 g_hIconT.RemoveAll();
\r
519 g_hIconLL.RemoveAll();
\r
520 g_hIconLS.RemoveAll();
\r
522 // DnDで書庫を開くときは既に読み込まれているTPIを用いるので、解放してはいけない。
\r
523 if (e.GetExtraLong() == 0)
\r
529 void MainFrame::OnArcAdd(wxCommandEvent& e)
\r
533 ::wxXmlResource::Get()->Load(L_DIR_S_XRC wxT("dlg_make.xrc"));
\r
534 ::wxXmlResource::Get()->LoadDialog(& mkDlg, this, wxT("dlg_make"));
\r
535 mkDlg.uCommand = TPI_COMMAND_ADD;
\r
538 wxFileDialog fd(this, _("Choose files to add"), this->conf.ReadHistory(CONF_HISTORY_PATH, 0));
\r
539 fd.SetWindowStyleFlag(wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE);
\r
540 if (fd.ShowModal() == wxID_CANCEL)
\r
544 fd.GetFilenames(mkDlg.files);
\r
545 this->conf.WriteHistory(CONF_HISTORY_PATH, fd.GetDirectory());
\r
548 if (mkDlg.ShowModal() == wxID_CANCEL)
\r
554 TPI_SWITCHES swInfo;
\r
555 swInfo.pCustomSwitches = NULL;
\r
556 swInfo.fMakeSFX = false;
\r
557 swInfo.fnDestinationDirectory= wxFileName::DirName(fd.GetDirectory());
\r
558 swInfo.fStoreDirectoryPathes = ! mkDlg.cbIgnorePath->IsChecked();
\r
559 swInfo.fSolid = mkDlg.cbSolid->IsChecked();
\r
560 swInfo.fMMOptimize = mkDlg.cbMMOptimize->IsChecked();
\r
561 swInfo.fEncryptHeader = mkDlg.cbEncryptHeader->IsChecked();
\r
562 swInfo.nCompressLevel = mkDlg.scLevel->GetValue();
\r
563 swInfo.nRecoveryRecord = mkDlg.scRR->GetValue();
\r
564 swInfo.szPassword = mkDlg.tcPassword->GetValue();
\r
565 swInfo.szKeyFile = mkDlg.tcKeyfile->GetValue();
\r
566 swInfo.szComment = mkDlg.tcComment->GetValue();
\r
570 ProcessDialog procDlg;
\r
571 procDlg.Show(true);
\r
574 TPI_PROCESSINFO piInfo;
\r
575 piInfo.eMessage = TPI_MESSAGE_STATUS;
\r
576 piInfo.eStatus = 0x1000;
\r
577 piInfo.fiInfo.fnFileName = this->fnArchive;
\r
578 piInfo.fiInfo.nUnpackedSize = mkDlg.files.GetCount();
\r
579 procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo);
\r
581 tpi.Command(TPI_COMMAND_ADD, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files);
\r
582 this->ErrorCheck(tpi.nErrorCode);
\r
583 procDlg.Show(false);
\r
586 if (mkDlg.cbOpenAfter->IsChecked())
\r
589 ::wxExecute(DIR_APP + QuoteString(swInfo.fnDestinationDirectory.GetFullPath()));
\r
592 if (mkDlg.cbExitAfter->IsChecked())
\r
598 // 終了しない場合は書庫を再読み込み。
\r
599 this->OnArcOpen(e);
\r
602 void MainFrame::OnArcConvert(wxCommandEvent& e)
\r
604 TPI_SWITCHES swInfo;
\r
605 swInfo.fMakeSFX = e.GetId() == XRCID("Arc_SFX");
\r
608 wxFileDialog fd(this, swInfo.fMakeSFX ? _("Save as SFX") : _("Save as normal archive"), this->fnArchive.GetPath(), this->fnArchive.GetName() + (swInfo.fMakeSFX ? EXE_EXT : (wxString) wxEmptyString));
\r
609 fd.SetWindowStyleFlag(wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
\r
610 if (fd.ShowModal() == wxID_CANCEL)
\r
614 swInfo.fnDestinationDirectory = wxFileName::DirName(fd.GetDirectory());
\r
615 this->conf.WriteHistory(CONF_HISTORY_PATH, fd.GetDirectory());
\r
617 wxArrayString files;
\r
618 files.Add(fd.GetPath());
\r
620 ProcessDialog procDlg;
\r
621 procDlg.Show(true);
\r
622 tpi.Command(swInfo.fMakeSFX ? TPI_COMMAND_SFX : TPI_COMMAND_UNSFX, & swInfo, this->fnArchive.GetFullPath(), files);
\r
623 this->ErrorCheck(tpi.nErrorCode);
\r
624 procDlg.Show(false);
\r
627 void MainFrame::OnArcExtract(wxCommandEvent& e)
\r
629 TPI_SWITCHES swInfo;
\r
630 swInfo.pCustomSwitches = NULL;
\r
632 // モード取得。通常は0, 実行なら1, ファイルDnDなら2、ディレクトリDnDなら3、クリップボードなら4。
\r
633 int nMode = e.GetInt();
\r
635 wxFileType * ftFile = NULL;
\r
637 // 展開ダイアログを作成。DnDまたは実行時は表示しない。
\r
639 ::wxXmlResource::Get()->Load(L_DIR_S_XRC wxT("dlg_make.xrc"));
\r
640 ::wxXmlResource::Get()->LoadDialog(& mkDlg, this, wxT("dlg_make"));
\r
641 mkDlg.uCommand = TPI_COMMAND_EXTRACT;
\r
642 mkDlg.files = MakeTargetFileList(this, nMode == 1);
\r
649 ftFile = wxTheMimeTypesManager->GetFileTypeFromExtension(wxFileName(mkDlg.files[0], wxPATH_DOS).GetExt());
\r
650 if (! ftFile || ftFile->GetOpenCommand(wxEmptyString).IsEmpty())
\r
652 // 種類が取得できないときはテキストとみなす。
\r
653 ftFile = wxTheMimeTypesManager->GetFileTypeFromExtension(this->conf.ReadId(CONF_DEFAULT_EXT, (wxString) wxT("txt")));
\r
656 wxLogError(_("Unable to get the file type!"));
\r
663 swInfo.fStoreDirectoryPathes = false;
\r
664 wxString szDestDirBase = nMode == 3 ? this->tree_ctrl->GetItemText(this->tree_ctrl->GetSelection()) : wxT("tpi_tmp");
\r
666 if (szDestDirBase == wxT("-----"))
\r
668 // 書庫ルートのときは書庫名にしておく。
\r
669 szDestDirBase = this->fnArchive.GetName();
\r
671 swInfo.fnDestinationDirectory = MakeDirPath(wxFileName::DirName(p.GetTempDir()), szDestDirBase, true);
\r
672 if (! swInfo.fnDestinationDirectory.IsOk())
\r
674 wxLogError(_("Unable to make the temporary directory!"));
\r
680 if (mkDlg.ShowModal() == wxID_CANCEL)
\r
686 swInfo.fStoreDirectoryPathes = ! mkDlg.cbIgnorePath->IsChecked();
\r
687 swInfo.fnDestinationDirectory = wxFileName::DirName(mkDlg.cbDir->GetValue());
\r
688 swInfo.szPassword = mkDlg.tcPassword->GetValue();
\r
689 swInfo.szKeyFile = mkDlg.tcKeyfile->GetValue();
\r
691 // 必要なら書庫名でディレクトリを作成する。
\r
692 if (WillMakeDirByArcName(this, & mkDlg))
\r
694 swInfo.fnDestinationDirectory = MakeDirPath(swInfo.fnDestinationDirectory, this->fnArchive.GetName(), true);
\r
695 if (! swInfo.fnDestinationDirectory.IsOk())
\r
697 wxLogError(_("Unable to make the destination directory!"));
\r
705 ProcessDialog procDlg;
\r
706 procDlg.Show(true);
\r
709 TPI_PROCESSINFO piInfo;
\r
710 piInfo.eMessage = TPI_MESSAGE_STATUS;
\r
711 piInfo.eStatus = 0x1000;
\r
712 piInfo.fiInfo.fnFileName = this->fnArchive;
\r
713 piInfo.fiInfo.nUnpackedSize = mkDlg.files.GetCount();
\r
714 procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo);
\r
716 tpi.Command(TPI_COMMAND_EXTRACT, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files);
\r
717 this->ErrorCheck(tpi.nErrorCode);
\r
718 procDlg.Show(false);
\r
723 if (mkDlg.cbOpenAfter->IsChecked())
\r
726 ::wxExecute(DIR_APP + QuoteString(swInfo.fnDestinationDirectory.GetFullPath()));
\r
729 if (mkDlg.cbExitAfter->IsChecked())
\r
740 wxString szTempFile = swInfo.fnDestinationDirectory.GetPathWithSep() + wxFileName(mkDlg.files[0], wxPATH_DOS).GetFullName();
\r
741 bool fSuccess = tpi.nErrorCode == TPI_ERROR_SUCCESS;
\r
742 myProcess * pCallback = new myProcess(szTempFile, swInfo.fnDestinationDirectory.GetPath());
\r
746 // Linuxでは引用符で囲む必要がある。
\r
747 fSuccess = ::wxExecute(ftFile->GetOpenCommand(QuoteString(szTempFile)), wxEXEC_ASYNC, pCallback) > 0;
\r
749 fSuccess = ::wxExecute(ftFile->GetOpenCommand(szTempFile), wxEXEC_ASYNC, pCallback) > 0;
\r
754 pCallback->OnTerminate(0, 0);
\r
760 wxArrayString asFiles;
\r
761 myFileDataObject * objFile = new myFileDataObject();
\r
762 objFile->szTempDir = nMode == 3 ? swInfo.fnDestinationDirectory.GetPath() : swInfo.fnDestinationDirectory.GetFullPath();
\r
763 for (size_t i = 0; i < mkDlg.files.GetCount(); i++)
\r
765 wxString szFileName = swInfo.fnDestinationDirectory.GetPathWithSep() + wxFileName(mkDlg.files[i], wxPATH_DOS).GetFullName();
\r
768 asFiles.Add(szFileName);
\r
773 objFile->AddFile(szFileName);
\r
778 objFile->AddFile(objFile->szTempDir);
\r
783 wxTheClipboard->SetData(objFile);
\r
787 // 自身にドロップされると煩雑なので、一時的にドロップを受け付けないようにしておく。
\r
788 this->SetDropTarget(NULL);
\r
791 wxDropSource dropSource(* objFile, this);
\r
792 wxDragResult drResult = dropSource.DoDragDrop();
\r
793 if (drResult != wxDragCancel && drResult != wxDragNone && drResult != wxDragMove)
\r
796 // Linuxではまだ処理が終わっていない(コンテキストメニューが表示されている)ので、とりあえず3秒だけ待つ。
\r
800 this->SetDropTarget(new myFileDropTarget(this));
\r
802 // ディレクトリDnDのときは、先にディレクトリの中のファイルを消しておく。
\r
805 for (size_t i = 0; i < asFiles.GetCount(); i++)
\r
807 ::wxRemoveFile(asFiles[i]);
\r
817 void MainFrame::OnArcDelete(wxCommandEvent& e)
\r
819 // 全ファイル削除は危険ではないかと。
\r
820 if (this->list_ctrl->GetSelectedItemCount() == 0)
\r
822 // wxのバグで自動では無効化できないので、実行しようとしたときに無効化する。
\r
823 SetMenuToolState("Arc_Delete", false);
\r
827 if (::AskDlg(_("Are you sure to delete selected files?"), this) == wxNO)
\r
834 TPI_SWITCHES swInfo;
\r
835 ProcessDialog procDlg;
\r
836 procDlg.Show(true);
\r
837 wxArrayString asFiles = MakeTargetFileList(this, false);
\r
840 TPI_PROCESSINFO piInfo;
\r
841 piInfo.eMessage = TPI_MESSAGE_STATUS;
\r
842 piInfo.eStatus = 0x1000;
\r
843 piInfo.fiInfo.fnFileName = this->fnArchive;
\r
844 piInfo.fiInfo.nUnpackedSize = asFiles.GetCount();
\r
845 procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo);
\r
847 tpi.Command(TPI_COMMAND_DELETE, & swInfo, this->fnArchive.GetFullPath(), asFiles);
\r
848 this->ErrorCheck(tpi.nErrorCode);
\r
849 procDlg.Show(false);
\r
853 this->OnArcOpen(e);
\r
856 void MainFrame::OnArcTest(wxCommandEvent&)
\r
859 ProcessDialog procDlg;
\r
860 procDlg.Show(true);
\r
861 wxArrayString asFiles = MakeTargetFileList(this, false);
\r
864 TPI_PROCESSINFO piInfo;
\r
865 piInfo.eMessage = TPI_MESSAGE_STATUS;
\r
866 piInfo.eStatus = 0x1000;
\r
867 piInfo.fiInfo.fnFileName = this->fnArchive;
\r
868 piInfo.fiInfo.nUnpackedSize = asFiles.GetCount();
\r
869 procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo);
\r
871 TPI_SWITCHES swInfo;
\r
872 bool bIsCorrect = tpi.Command(TPI_COMMAND_TEST, & swInfo, this->fnArchive.GetFullPath(), asFiles);
\r
873 procDlg.Show(false);
\r
877 wxLogMessage(_("This is a correct archive."));
\r
881 this->ErrorCheck(tpi.nErrorCode);
\r
885 void MainFrame::OnArcRepair(wxCommandEvent&)
\r
888 ProcessDialog procDlg;
\r
889 procDlg.Show(true);
\r
890 wxArrayString asFiles = MakeTargetFileList(this, false);
\r
893 TPI_PROCESSINFO piInfo;
\r
894 piInfo.eMessage = TPI_MESSAGE_STATUS;
\r
895 piInfo.eStatus = 0x1000;
\r
896 piInfo.fiInfo.fnFileName = this->fnArchive;
\r
897 piInfo.fiInfo.nUnpackedSize = asFiles.GetCount();
\r
898 procDlg.CallbackProc(TPI_NOTIFY_COMMON, & piInfo);
\r
900 TPI_SWITCHES swInfo;
\r
901 tpi.Command(TPI_COMMAND_REPAIR, & swInfo, this->fnArchive.GetFullPath(), asFiles);
\r
902 this->ErrorCheck(tpi.nErrorCode);
\r
903 procDlg.Show(false);
\r
906 void MainFrame::OnExeCopy(wxCommandEvent & e)
\r
908 if (this->list_ctrl->GetSelectedItemCount() == 0)
\r
910 // wxのバグで自動では無効化できないので、実行しようとしたときに無効化する。
\r
911 this->menubar->Enable(XRCID("Exe_Copy"), false);
\r
915 if (! wxTheClipboard->Open())
\r
921 this->OnArcExtract(e);
\r
922 wxTheClipboard->Close();
\r
925 void MainFrame::OnViewMode(wxCommandEvent & e)
\r
928 this->menubar->Check(n, true);
\r
929 this->list_ctrl->SetSingleStyle(wxLC_REPORT, n == XRCID("Exe_View_Details"));
\r
930 this->list_ctrl->SetSingleStyle(wxLC_ICON, n == XRCID("Exe_View_Icons"));
\r
931 this->list_ctrl->SetSingleStyle(wxLC_LIST, n == XRCID("Exe_View_List"));
\r
934 void MainFrame::OnShowToolBar(wxCommandEvent & e)
\r
936 this->toolbar->Show(e.IsChecked());
\r
939 void MainFrame::OnShowStatusBar(wxCommandEvent & e)
\r
941 this->statusbar->Show(e.IsChecked());
\r
944 void MainFrame::OnSelectAll(wxCommandEvent &)
\r
946 for (int i = 0; i < this->list_ctrl->GetItemCount(); i++)
\r
948 this->list_ctrl->Select(i, true);
\r
954 void MainFrame::OnTreeChanged(wxTreeEvent& e)
\r
957 wxString szNodePath = TreeView_GetItemPath(this->tree_ctrl, e.GetItem());
\r
959 this->list_ctrl->apShowFile.Clear();
\r
960 this->list_ctrl->DeleteAllItems();
\r
961 g_hIconLL.RemoveAll();
\r
962 g_hIconLS.RemoveAll();
\r
964 // 現在のアイテムの選択状態を無効にしておく。
\r
965 long nSelected = this->list_ctrl->GetFirstSelected();
\r
966 while (nSelected != -1)
\r
968 this->list_ctrl->Select(nSelected, false);
\r
969 nSelected = this->list_ctrl->GetNextSelected(nSelected);
\r
973 this->list_ctrl->SetImageList(& g_hIconLL, wxIMAGE_LIST_NORMAL);
\r
974 this->list_ctrl->SetImageList(& g_hIconLS, wxIMAGE_LIST_SMALL);
\r
976 // 配列と比較し、パスが一致しなければ消す。
\r
977 for (size_t i = 0; i < this->fileinfo.GetCount(); i++)
\r
980 if (szNodePath == wxT("*") || szNodePath == this->fileinfo[i].fnFileName.GetPath())
\r
983 if (this->fileinfo[i].fnFileName.IsDir() || ! TreeView_CheckNewerItem(this->tree_ctrl, this->tree_ctrl->GetLastChild(this->tree_ctrl->GetRootItem()), this->fileinfo[i].fnFileName.GetFullPath(), false))
\r
989 if (this->fileinfo[i].fnFileName.GetFullName().MakeLower().Find(this->tcFilter->GetValue().MakeLower()) == wxNOT_FOUND)
\r
994 this->list_ctrl->apShowFile.Add(& this->fileinfo[i]);
\r
999 this->list_ctrl->apShowFile.Sort(& ListCtrlCompareProc);
\r
1000 this->list_ctrl->SetItemCount(this->list_ctrl->apShowFile.GetCount());
\r
1003 void MainFrame::OnTreeBeginDrag(wxTreeEvent& e)
\r
1005 // TODO : アイテムが子階層を持っていても展開できない。
\r
1006 this->tree_ctrl->SelectItem(e.GetItem());
\r
1008 wxCommandEvent e1;
\r
1010 this->OnArcExtract(e1);
\r
1015 void MainFrame::OnListItemSelect(wxListEvent&)
\r
1017 // ファイルに対する動作の設定。但し、選択解除時はwxのバグで呼び出されない。
\r
1018 bool fEnable = this->list_ctrl->GetSelectedItemCount() > 0;
\r
1019 SetMenuToolState("Arc_Delete", fEnable && (this->aiArchive.fiInfo.eSupportedCommand & TPI_COMMAND_DELETE) == TPI_COMMAND_DELETE && this->aiArchive.fiInfo.fArchive);
\r
1020 this->menubar->Enable(XRCID("Exe_Copy"), fEnable);
\r
1023 void MainFrame::OnListItemDClick(wxListEvent&)
\r
1027 this->OnArcExtract(e);
\r
1030 void MainFrame::OnListBeginDrag(wxListEvent&)
\r
1032 if (this->list_ctrl->GetSelectedItemCount() == 0)
\r
1034 // アイテムを選択せずドラッグしようとした場合。
\r
1040 this->OnArcExtract(e);
\r
1045 void MainFrame::OnFilter(wxCommandEvent&)
\r
1048 e.SetItem(this->tree_ctrl->GetSelection());
\r
1049 this->OnTreeChanged(e);
\r
1054 bool MainFrame::LoadTPI(const wxString & szFileName, wxULongLong_t * llFileCount)
\r
1056 // 書庫を開いていれば閉じておく。
\r
1058 this->OnArcClose(e);
\r
1061 wxDir fs(L_DIR_B_LIB);
\r
1062 wxString szTPIName;
\r
1063 if (fs.GetFirst(& szTPIName, wxT("*" TPI_EXT)))
\r
1068 if (! tpi.InitLibrary(L_DIR_B_LIB + szTPIName, szFileName))
\r
1070 tpi.FreeLibrary();
\r
1075 tpi.SetCallbackProc(TPICallbackProc);
\r
1078 if (! tpi.OpenArchive(szFileName, llFileCount))
\r
1080 tpi.FreeLibrary();
\r
1081 * llFileCount = 0;
\r
1086 while (fs.GetNext(& szTPIName));
\r
1091 int MainFrame::ErrorCheck(int nErrorCode, const wxString & szAPIName)
\r
1093 switch (nErrorCode)
\r
1095 case TPI_ERROR_SUCCESS:
\r
1096 case TPI_ERROR_S_ENDOFDATA:
\r
1097 case TPI_CALLBACK_CONTINUE:
\r
1099 case TPI_ERROR_D_UNSUPPORTED:
\r
1100 wxLogError(_("Sorry, this function is not supported yet."));
\r
1102 case TPI_ERROR_D_SKIPPED:
\r
1103 case TPI_CALLBACK_CANCEL:
\r
1104 wxLogError(_("This operation is canceled by the user."));
\r
1107 wxLogError(_("Error: %s()!\nError code: %d"), szAPIName.c_str(), nErrorCode);
\r
1109 return nErrorCode;
\r