1 /*******************************************************************************
2 TPI - flexible but useless plug-in framework.
3 Copyright (C) 2002-2009 Silky
5 This library is free software; you can redistribute it and/or modify it under
6 the terms of the GNU Lesser General Public License as published by the Free
7 Software Foundation; either version 2.1 of the License, or (at your option)
10 This library is distributed in the hope that it will be useful, but WITHOUT
11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
15 You should have received a copy of the GNU Lesser General Public License along
16 with this library; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 *******************************************************************************/
25 #include "cls_filedroptarget.h"
27 #include "dlg_process.h"
28 #include "functions.h"
30 #include <wx/arrimpl.cpp>
32 WX_DEFINE_OBJARRAY(ArrayTPI_FILEINFO);
34 #define SetMenuToolState(id, state) this->toolbar->EnableTool(XRCID(id), state); this->menubar->Enable(XRCID(id), state)
36 //******************************************************************************
37 //
\83O
\83\8d\81[
\83o
\83\8b\95Ï
\90\94
38 //******************************************************************************
40 wxImageList g_hIconT(16, 16), g_hIconLL(32, 32), g_hIconLS(16, 16);
44 //******************************************************************************
46 //******************************************************************************
48 MainFrame::MainFrame(): wxFrame(), conf(wxEmptyString, wxEmptyString, L_DIR_BIN wxT("lychee.conf"), wxEmptyString, wxCONFIG_USE_LOCAL_FILE | wxCONFIG_USE_RELATIVE_PATH)
52 MainFrame::~MainFrame()
57 //
\90Ý
\92è
\82ð
\8bL
\98^
\81B
58 if (! this->IsIconized() && ! this->IsMaximized())
61 this->GetSize(& a, & b);
62 this->conf.Write(wxT("Window-Width"), a);
63 this->conf.Write(wxT("Window-Height"), b);
64 this->GetPosition(& a, & b);
65 this->conf.Write(wxT("Window-X"), a);
66 this->conf.Write(wxT("Window-Y"), b);
68 this->conf.Write(wxT("Splitter-Pos"), this->window_splitter->GetSashPosition());
70 //
\83c
\81[
\83\8b\83o
\81[/
\83X
\83e
\81[
\83^
\83X
\83o
\81[
\8aÖ
\98A
\81B
71 this->conf.Write(wxT("StatusBar-Show"), this->statusbar->IsShown());
72 this->conf.Write(wxT("ToolBar-Show"), this->toolbar->IsShown());
74 // ListView
\8aÖ
\98A
\81B
75 this->conf.Write(wxT("ListView-IconMode"), this->menubar->IsChecked(XRCID("Exe_View_Icons")) ? 1 : this->menubar->IsChecked(XRCID("Exe_View_List")) ? 2 : 0);
76 if (this->menubar->IsChecked(XRCID("Exe_View_Details")))
78 this->conf.Write(wxT("ListView-C-Filename"), this->list_ctrl->GetColumnWidth(0));
79 this->conf.Write(wxT("ListView-C-Unpacked"), this->list_ctrl->GetColumnWidth(1));
80 this->conf.Write(wxT("ListView-C-Packed"), this->list_ctrl->GetColumnWidth(2));
81 this->conf.Write(wxT("ListView-C-Ratio"), this->list_ctrl->GetColumnWidth(3));
82 this->conf.Write(wxT("ListView-C-Method"), this->list_ctrl->GetColumnWidth(4));
83 this->conf.Write(wxT("ListView-C-Attr"), this->list_ctrl->GetColumnWidth(5));
84 this->conf.Write(wxT("ListView-C-Lastmodified"), this->list_ctrl->GetColumnWidth(6));
85 this->conf.Write(wxT("ListView-C-Path"), this->list_ctrl->GetColumnWidth(7));
86 this->conf.Write(wxT("ListView-C-Type"), this->list_ctrl->GetColumnWidth(8));
87 this->conf.Write(wxT("ListView-C-No"), this->list_ctrl->GetColumnWidth(9));
88 this->conf.Write(wxT("ListView-SortColumn"), g_nSortColumn);
89 this->conf.Write(wxT("ListView-SortAscend"), g_fSortAscend);
95 //******************************************************************************
97 //******************************************************************************
99 BEGIN_EVENT_TABLE(MainFrame, wxFrame)
100 EVT_INIT_DIALOG( MainFrame::OnInit)
102 EVT_MENU(XRCID("Arc_Create"), MainFrame::OnArcCreate)
103 EVT_MENU(XRCID("Arc_Open"), MainFrame::OnArcOpen)
104 EVT_MENU(XRCID("Arc_Close"), MainFrame::OnArcClose)
105 EVT_MENU(XRCID("Arc_Add"), MainFrame::OnArcAdd)
106 EVT_MENU(XRCID("Arc_SFX"), MainFrame::OnArcConvert)
107 EVT_MENU(XRCID("Arc_UnSFX"), MainFrame::OnArcConvert)
108 EVT_MENU(XRCID("Exe_Exit"), MainFrame::OnExit)
109 EVT_MENU(XRCID("Arc_Extract"), MainFrame::OnArcExtract)
110 EVT_MENU(XRCID("Arc_Delete"), MainFrame::OnArcDelete)
111 EVT_MENU(XRCID("Arc_Test"), MainFrame::OnArcTest)
112 EVT_MENU(XRCID("Arc_Repair"), MainFrame::OnArcRepair)
113 EVT_MENU(XRCID("Exe_View_Icons"), MainFrame::OnViewMode)
114 EVT_MENU(XRCID("Exe_View_Details"),MainFrame::OnViewMode)
115 EVT_MENU(XRCID("Exe_View_List"), MainFrame::OnViewMode)
116 EVT_MENU(XRCID("Exe_View_ToolBar"),MainFrame::OnShowToolBar)
117 EVT_MENU(XRCID("Exe_View_StatusBar"),MainFrame::OnShowStatusBar)
118 EVT_MENU(XRCID("Exe_View_SelectAll"),MainFrame::OnSelectAll)
120 EVT_TREE_SEL_CHANGED(XRCID("TreeView"), MainFrame::OnTreeChanged)
121 EVT_TREE_BEGIN_DRAG( XRCID("TreeView"), MainFrame::OnTreeBeginDrag)
123 EVT_LIST_ITEM_ACTIVATED(XRCID("ListView"), MainFrame::OnListItemDClick)
124 EVT_LIST_BEGIN_DRAG( XRCID("ListView"), MainFrame::OnListBeginDrag)
126 EVT_TEXT(XRCID("tcFilter"), MainFrame::OnFilter)
129 //******************************************************************************
131 //******************************************************************************
133 void MainFrame::OnInit(wxInitDialogEvent&)
135 // XRC
\82Æ
\8c\8b\82Ñ
\82Â
\82¯
\81B
136 this->menubar = this->GetMenuBar();
137 this->toolbar = this->GetToolBar();
138 this->statusbar = XRCCTRL(* this, "statusbar", wxStatusBar);
139 this->tree_ctrl = XRCCTRL(* this, "TreeView", wxTreeCtrl);
140 this->list_ctrl = XRCCTRL(* this, "ListView", myListCtrl);
141 this->window_splitter = XRCCTRL(* this, "window_splitter", wxSplitterWindow);
142 this->tcFilter = XRCCTRL(* this->toolbar, "tcFilter", wxTextCtrl);
144 //
\90Ý
\92è
\82ð
\93Ç
\82Ý
\8d\9e\82Ý
\81B
145 this->SetSize(this->conf.Read(wxT("Window-X"), 0l), this->conf.Read(wxT("Window-Y"), 0l), this->conf.Read(wxT("Window-Width"), 800), this->conf.Read(wxT("Window-Height"), 400));
146 wxTheMimeTypesManager->Initialize(wxMAILCAP_ALL);
148 //
\8f\89\8aú
\92l
\90Ý
\92è
\81B
151 icon.CopyFromBitmap(wxBitmap(L_DIR_S_ICO wxT("app.png"), wxBITMAP_TYPE_ANY));
157 //
\83X
\83v
\83\8a\83b
\83^
\81[
\90Ý
\92è
\81B
158 this->window_splitter->SetSashPosition(this->conf.Read(wxT("Splitter-Pos"), 200));
160 //
\83\8a\83X
\83g
\83r
\83\85\81[
\90Ý
\92è
\81B
161 int nIconMode = this->conf.Read(wxT("ListView-IconMode"), 0l);
162 e.SetId(nIconMode == 1 ? XRCID("Exe_View_Icons") : (nIconMode == 2 ? XRCID("Exe_View_List") : XRCID("Exe_View_Details")));
164 // wxGTK
\82Å
\82Í
\92¼
\90ÚwxLC_VIRTUAL
\82ð
\8ew
\92è
\82µ
\82È
\82¢
\82Æ
\94½
\89f
\82³
\82ê
\82È
\82¢
\81B
165 this->list_ctrl->SetSingleStyle(wxLC_VIRTUAL);
166 this->list_ctrl->InsertColumn(0, wxT("Filename"), wxLIST_FORMAT_LEFT, this->conf.Read(wxT("ListView-C-Filename"), 140));
167 this->list_ctrl->InsertColumn(1, wxT("Unpacked"), wxLIST_FORMAT_RIGHT, this->conf.Read(wxT("ListView-C-Unpacked"), 80));
168 this->list_ctrl->InsertColumn(2, wxT("Packed"), wxLIST_FORMAT_RIGHT, this->conf.Read(wxT("ListView-C-Packed"), 80));
169 this->list_ctrl->InsertColumn(3, wxT("Ratio"), wxLIST_FORMAT_RIGHT, this->conf.Read(wxT("ListView-C-Ratio"), 50));
170 this->list_ctrl->InsertColumn(4, wxT("Method"), wxLIST_FORMAT_LEFT, this->conf.Read(wxT("ListView-C-Method"), 60));
171 this->list_ctrl->InsertColumn(5, wxT("Attr"), wxLIST_FORMAT_LEFT, this->conf.Read(wxT("ListView-C-Attr"), 50));
172 this->list_ctrl->InsertColumn(6, wxT("Last modified"), wxLIST_FORMAT_RIGHT, this->conf.Read(wxT("ListView-C-Lastmodified"), 150));
173 this->list_ctrl->InsertColumn(7, wxT("Path"), wxLIST_FORMAT_LEFT, this->conf.Read(wxT("ListView-C-Path"), 100));
174 this->list_ctrl->InsertColumn(8, wxT("Type"), wxLIST_FORMAT_LEFT, this->conf.Read(wxT("ListView-C-Type"), 100));
175 this->list_ctrl->InsertColumn(9, wxT("No."), wxLIST_FORMAT_RIGHT, this->conf.Read(wxT("ListView-C-No"), 35));
176 g_nSortColumn = this->conf.Read(wxT("ListView-SortColumn"), 9);
177 g_fSortAscend = this->conf.Read(wxT("ListView-SortAscend"), 1) == 1;
178 this->list_ctrl->SetDropTarget(new myFileDropTarget(this));
180 //
\83c
\81[
\83\8b\83o
\81[/
\83X
\83e
\81[
\83^
\83X
\83o
\81[
\90Ý
\92è
\81B
181 int nStatusBarParts[] = {70, 70, 180, 50, -1};
182 this->statusbar->SetFieldsCount(5, nStatusBarParts);
183 this->SetStatusBarPane(-1);
184 bool fShow = this->conf.Read(wxT("StatusBar-Show"), 1) == 1;
185 this->menubar->Check(XRCID("Exe_View_StatusBar"), fShow);
186 this->statusbar->Show(fShow);
187 fShow = this->conf.Read(wxT("ToolBar-Show"), 1) == 1;
188 this->menubar->Check(XRCID("Exe_View_ToolBar"), fShow);
189 this->toolbar->Show(fShow);
191 //
\83R
\83}
\83\93\83h
\83\89\83C
\83\93\93Ç
\82Ý
\8d\9e\82Ý
\81B
192 this->cmdLine.SetSwitchChars(wxT("-"));
193 this->cmdLine.AddSwitch(wxT("x"), wxEmptyString, wxT("(command) Extract filenames in archive."));
194 this->cmdLine.AddSwitch(wxT("l"), wxEmptyString, wxT("(command) List archive(default)."));
195 this->cmdLine.AddParam(wxT("archive"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL);
196 this->cmdLine.AddParam(wxT("filenames"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL | wxCMD_LINE_PARAM_MULTIPLE);
197 if (this->cmdLine.Parse() == 0)
199 if (this->cmdLine.GetParamCount() == 0)
204 //
\8f\91\8cÉ
\82ð
\8aJ
\82
\81B
205 this->fnArchive = wxFileName(this->cmdLine.GetParam(0));
206 this->fnArchive.Normalize(wxPATH_NORM_ALL, this->szCurrentPath);
208 if (this->cmdLine.Found(wxT("x")))
210 //
\8f\91\8cÉ
\82ð
\93W
\8aJ
\81B
211 this->OnArcExtract(e);
219 void MainFrame::OnExit(wxCommandEvent&)
224 void MainFrame::OnArcCreate(wxCommandEvent& e)
227 swInfo.pCustomSwitches = NULL;
229 //
\8dì
\90¬
\83_
\83C
\83A
\83\8d\83O
\82ð
\90Ý
\92è
\81B
231 ::wxXmlResource::Get()->Load(L_DIR_S_XRC wxT("dlg_make.xrc"));
232 ::wxXmlResource::Get()->LoadDialog(& mkDlg, this, wxT("dlg_make"));
234 if (e.GetClientData() == NULL)
236 //
\8f\88\97\9d\91Î
\8fÛ
\82Ì
\83t
\83@
\83C
\83\8b\82ð
\91I
\91ð
\81B
237 wxFileDialog fd(this, wxT("Choose files to compress"), this->conf.Read(wxT("LastOpenPath"), ::wxGetCwd()));
238 fd.SetWindowStyleFlag(wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE);
239 if (fd.ShowModal() == wxID_CANCEL)
243 swInfo.fnDestinationDirectory = wxFileName::DirName(fd.GetDirectory());
244 this->conf.Write(wxT("LastOpenPath"), fd.GetDirectory());
245 this->statusbar->SetStatusText(swInfo.fnDestinationDirectory.GetFullPath(), 4);
247 fd.GetFilenames(mkDlg.files);
251 mkDlg.files = * (wxArrayString *) e.GetClientData();
252 swInfo.fnDestinationDirectory = wxFileName::DirName(wxFileName(mkDlg.files[0]).GetPath());
253 //
\91\8a\91Î
\83p
\83X
\82É
\95Ï
\8a·
\81B
254 for (size_t n = 0; n < mkDlg.files.GetCount(); n++)
256 wxFileName fn(mkDlg.files[n]);
257 bool fIsDir = fn.DirExists() && ! fn.FileExists();
258 fn.MakeRelativeTo(swInfo.fnDestinationDirectory.GetPath());
259 mkDlg.files[n] = fn.GetFullPath();
262 mkDlg.files[n] += fn.GetPathSeparator();
269 mkDlg.cbDir->SetValue(swInfo.fnDestinationDirectory.GetPath());
270 //
\8f\91\8cÉ
\96¼
\82Í
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\8ag
\92£
\8eq
\82æ
\82è
\91O
\81A
\82à
\82µ
\82
\82Í
\83f
\83B
\83\8c\83N
\83g
\83\8a\96¼
\81B
271 this->fnArchive = wxFileName(mkDlg.files[0]);
272 this->fnArchive.SetName(mkDlg.files.GetCount() == 1 ? (this->fnArchive.GetName().IsEmpty() ? this->fnArchive.GetDirs().Last() : this->fnArchive.GetName()) : swInfo.fnDestinationDirectory.GetDirs().Last());
273 this->fnArchive.SetPath(swInfo.fnDestinationDirectory.GetPath());
274 mkDlg.cbFileName->SetValue(this->fnArchive.GetName());
276 //
\83_
\83C
\83A
\83\8d\83O
\82ð
\95\
\8e¦
\81B
277 if (mkDlg.ShowModal() == wxID_CANCEL)
279 this->statusbar->SetStatusText(wxEmptyString, 4);
282 this->statusbar->SetStatusText(wxEmptyString, 4);
284 //
\8ae
\8eí
\90Ý
\92è
\81B
285 swInfo.fStoreDirectoryPathes= ! mkDlg.cbIgnorePath->IsChecked();
286 swInfo.fMakeSFX = mkDlg.cbMakeSFX->IsChecked();
287 swInfo.fSolid = mkDlg.cbSolid->IsChecked();
288 swInfo.fMMOptimize = mkDlg.cbMMOptimize->IsChecked();
289 swInfo.fEncryptHeader = mkDlg.cbEncryptHeader->IsChecked();
290 swInfo.sCompressLevel = mkDlg.scLevel->GetValue();
291 swInfo.sRecoveryRecord = mkDlg.scRR->GetValue();
292 swInfo.szPassword = mkDlg.tcPassword->GetValue();
293 swInfo.szKeyFile = mkDlg.tcKeyfile->GetValue();
294 swInfo.szComment = mkDlg.tcComment->GetValue();
297 mkDlg.cbSplitSize->GetValue().ToULongLong(& ll);
298 swInfo.llSplitSize = ll;
301 // TPI
\82ð
\93Ç
\82Ý
\8d\9e\82Ý
\81B
302 int nSelected = mkDlg.chType->GetSelection();
303 this->fnArchive = wxFileName(mkDlg.cbDir->GetValue(), mkDlg.cbFileName->GetValue(), swInfo.fMakeSFX ? EXE_EXT : mkDlg.afInfo[nSelected].szSuffix.BeforeFirst(wxT(';')));
304 if (! tpi.InitLibrary(mkDlg.afInfo[nSelected].szTPIName, this->fnArchive.GetFullPath(), mkDlg.afInfo[nSelected].llTypeId))
306 ::ErrDlg(wxT("InitLibrary()!"), this);
310 //
\83R
\81[
\83\8b\83o
\83b
\83N
\8aÖ
\90\94\82ð
\90Ý
\92è
\81B
311 if (! tpi.SetCallbackProc(TPICallbackProc))
313 ::ErrDlg(wxT("SetCallbackProc()!"), this);
316 //
\8f\88\97\9d\82ð
\8ds
\82¤
\81B
317 ProcessDialog procDlg;
318 procDlg.InitDialog();
320 if (! tpi.Command(TPI_COMMAND_ADD, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files))
322 this->ErrorCheck(tpi.nErrorCode);
328 if (mkDlg.cbOpenAfter->IsChecked())
330 //
\8dì
\90¬
\90æ
\82ð
\8aJ
\82
\81B
332 ::wxExecute(wxT("explorer ") + swInfo.fnDestinationDirectory.GetFullPath());
336 if (mkDlg.cbExitAfter->IsChecked())
342 //
\8fI
\97¹
\82µ
\82È
\82¢
\8fê
\8d\87\82Í
\8f\91\8cÉ
\82ð
\8aJ
\82
\81B
346 void MainFrame::OnArcOpen(wxCommandEvent& e)
348 //
\8f\91\8cÉ
\82ð
\91I
\91ð
\81B
349 if (e.GetId() == XRCID("Arc_Open"))
351 wxFileDialog fd(this);
352 fd.SetDirectory(this->conf.Read(wxT("LastOpenPath"), ::wxGetCwd()));
353 fd.SetWindowStyleFlag(wxFD_OPEN | wxFD_FILE_MUST_EXIST);
354 if (fd.ShowModal() == wxID_CANCEL)
358 this->conf.Write(wxT("LastOpenPath"), fd.GetDirectory());
359 this->fnArchive = wxFileName(fd.GetPath());
363 //
\90i
\92»
\83_
\83C
\83A
\83\8d\83O
\95\
\8e¦
\81B
364 ProcessDialog procDlg;
365 procDlg.InitDialog();
368 // TPI
\82ð
\93Ç
\82Ý
\8d\9e\82Ý
\81A
\8dÅ
\8f\89\82Ì
\83R
\81[
\83\8b\83o
\83b
\83N
\82ð
\91\97\90M
\81B
369 TPI_PROCESSINFO piInfo;
370 piInfo.uMessage = TPI_MESSAGE_STATUS;
371 piInfo.uStatus = 0x1000;
372 piInfo.llProcessedSize = 0;
373 piInfo.fiInfo.fnFileName = this->fnArchive;
374 piInfo.fiInfo.llUnpackedSize = this->LoadTPI(this->fnArchive.GetFullPath());
375 if (piInfo.fiInfo.llUnpackedSize.ToULong() == 0)
379 ::ErrDlg(wxT("No plug-in supporting this archive was found!"), this);
382 TPICallbackProc(TPI_NOTIFY_COMMON, & piInfo);
384 //
\83R
\81[
\83\8b\83o
\83b
\83N
\8aÖ
\90\94\82ð
\90Ý
\92è
\81B
385 tpi.SetCallbackProc(TPICallbackProc);
387 //
\94z
\97ñ
\82Ì
\83T
\83C
\83Y
\82ð
\8am
\95Û
\81B
388 this->fileinfo.Alloc(piInfo.fiInfo.llUnpackedSize.ToULong());
390 //
\8f\91\8cÉ
\82ð
\8aJ
\82
\81B
391 if (! tpi.OpenArchive(this->fnArchive.GetFullPath()))
395 ::ErrDlg(wxT("OpenArchive()!"), this);
399 //
\8f\91\8cÉ
\82Ì
\83A
\83C
\83R
\83\93\82ð
\8eæ
\93¾
\82µ
\81A
\8f\91\8cÉ
\83\8b\81[
\83g
\82ð
\8dì
\90¬
\81B
400 g_hIconT.Add(wxBitmap(L_DIR_S_ICO wxT("folder_closed.png"), wxBITMAP_TYPE_ANY));
401 g_hIconT.Add(wxBitmap(L_DIR_S_ICO wxT("folder_open.png"), wxBITMAP_TYPE_ANY));
402 this->tree_ctrl->SetImageList(& g_hIconT);
404 idRoot = this->tree_ctrl->AddRoot(wxEmptyString),
406 idArchive = this->tree_ctrl->AppendItem(idRoot, piInfo.fiInfo.fnFileName.GetFullName(), g_hIconT.Add(GetFileTypeIcon(piInfo.fiInfo.fnFileName))),
408 idArchive = this->tree_ctrl->AppendItem(idRoot, piInfo.fiInfo.fnFileName.GetFullName(), g_hIconT.Add(GetFileTypeIcon(piInfo.fiInfo.fnFileName).ConvertToImage().Rescale(16, 16))),
410 idArcRoot = this->tree_ctrl->AppendItem(idRoot, wxT("-----"), 0, 1);
412 //
\83t
\83@
\83C
\83\8b\8fî
\95ñ
\82ð
\83\8d\81[
\83h
\81B
413 if (tpi.GetFileInformation(& piInfo.fiInfo, true))
415 piInfo.uStatus = 0x1001;
418 piInfo.llProcessedSize++;
419 if (this->ErrorCheck(TPICallbackProc(TPI_NOTIFY_COMMON, & piInfo)) == TPI_CALLBACK_CANCEL)
428 //
\83c
\83\8a\81[
\83r
\83\85\81[
\82É
\94½
\89f
\81B
429 TreeView_CheckNewerItem(this->tree_ctrl, idArcRoot, piInfo.fiInfo.fnFileName.GetPath(), true);
431 //
\83f
\83B
\83\8c\83N
\83g
\83\8a\91®
\90«
\82ð
\8aÜ
\82Þ
\82à
\82Ì
\82É
\82Â
\82¢
\82Ä
\82Í
\8f\9c\8b\8e\81B
432 if (piInfo.fiInfo.dwAttribute & TPI_ATTRIBUTE_DIRECTORY)
437 //
\83Z
\83L
\83\85\83\8a\83e
\83B
\83`
\83F
\83b
\83N
\81B
439 if (piInfo.fiInfo.fnFileName.GetPathWithSep().Find(wxT("..")) != wxNOT_FOUND)
441 piInfo.fiInfo.uDanger = TRUE;
442 ::WrnDlg(wxT("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") + piInfo.fiInfo.szStoredName, this);
444 //
\8bó
\94\92\82Ì
\98A
\91±
\82É
\82æ
\82é
\8ag
\92£
\8eq
\8bU
\91\95\82ð
\8c\9f\8d¸
\81B
445 if (piInfo.fiInfo.fnFileName.GetFullName().Find(wxT(" ")) != wxNOT_FOUND)
447 piInfo.fiInfo.uDanger = TRUE;
448 ::WrnDlg(wxT("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") + piInfo.fiInfo.szStoredName, this);
450 // Unicode
\90§
\8cä
\95¶
\8e\9a\82ð
\8c\9f\8d¸
\81B
451 for (wxChar c = 0x200c; c <= 0x206f; c++)
453 if (piInfo.fiInfo.fnFileName.GetFullName().Find(c) != wxNOT_FOUND)
455 piInfo.fiInfo.uDanger = TRUE;
456 ::WrnDlg(wxT("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") + piInfo.fiInfo.szStoredName, this);
460 case 0x200f: c = 0x2027; break;
461 case 0x202e: c = 0x2060; break;
465 //
\8fî
\95ñ
\82ð
\95Û
\91¶
\82µ
\82Ä
\83J
\83E
\83\93\83g
\83A
\83b
\83v
\81B
466 this->fileinfo.Add(piInfo.fiInfo);
468 while (tpi.GetFileInformation(& piInfo.fiInfo, false));
471 //
\8f\91\8cÉ
\82Ì
\8fî
\95ñ
\82ð
\8eæ
\93¾
\81B
472 TPI_ARCHIVEINFO aiInfo;
473 if (! tpi.GetArchiveInformation(& aiInfo))
477 ::ErrDlg(wxT("GetArchiveInformation()!"), this);
480 this->szComment = aiInfo.szComment;
482 //
\8f\91\8cÉ
\82ð
\95Â
\82¶
\82é
\81B
483 if (! tpi.CloseArchive())
485 ::ErrDlg(wxT("CloseArchive()!"), this);
488 //
\88È
\89º
\81AUI
\8f\88\97\9d\81B
489 this->fileinfo.Shrink();
490 this->tree_ctrl->ExpandAll();
491 this->tree_ctrl->ScrollTo(idArchive);
492 this->tree_ctrl->SelectItem(idArchive);
493 this->list_ctrl->atDangerItem.SetTextColour(* wxRED);
495 //
\83X
\83e
\81[
\83^
\83X
\83o
\81[
\90Ý
\92è
\81B
496 this->statusbar->SetStatusText(aiInfo.fiInfo.szTypeName, 0);
497 this->statusbar->SetStatusText(wxString::Format(wxT("%d file(s)"), this->fileinfo.GetCount()), 1);
498 this->statusbar->SetStatusText(aiInfo.llUnpackedSize.ToString() + wxT(" B -> ") + aiInfo.llPackedSize.ToString() + wxT(" B"), 2);
499 this->statusbar->SetStatusText(wxString::Format(wxT("%3.1f%%"), aiInfo.wCompressRatio / 10.0), 3);
500 this->statusbar->SetStatusText(this->fnArchive.GetFullPath(), 4);
502 //
\83c
\81[
\83\8b\83o
\81[
\81E
\83\81\83j
\83\85\81[
\83o
\81[
\90Ý
\92è
\81B
503 SetMenuToolState("Arc_Close", true);
504 SetMenuToolState("Arc_Add", (aiInfo.fiInfo.llSupportedCommand & TPI_COMMAND_ADD) == TPI_COMMAND_ADD && aiInfo.fiInfo.fArchive);
505 SetMenuToolState("Arc_SFX", (aiInfo.fiInfo.llSupportedCommand & TPI_COMMAND_SFX) == TPI_COMMAND_SFX && aiInfo.nSFXType == 0);
506 SetMenuToolState("Arc_UnSFX", (aiInfo.fiInfo.llSupportedCommand & TPI_COMMAND_UNSFX) == TPI_COMMAND_UNSFX && aiInfo.nSFXType != 0);
507 SetMenuToolState("Arc_Extract", (aiInfo.fiInfo.llSupportedCommand & TPI_COMMAND_EXTRACT)== TPI_COMMAND_EXTRACT);
508 SetMenuToolState("Arc_Delete", (aiInfo.fiInfo.llSupportedCommand & TPI_COMMAND_DELETE) == TPI_COMMAND_DELETE && aiInfo.fiInfo.fArchive);
509 SetMenuToolState("Arc_Test", (aiInfo.fiInfo.llSupportedCommand & TPI_COMMAND_TEST) == TPI_COMMAND_TEST);
510 SetMenuToolState("Arc_Repair", (aiInfo.fiInfo.llSupportedCommand & TPI_COMMAND_REPAIR) == TPI_COMMAND_REPAIR);
515 void MainFrame::OnArcClose(wxCommandEvent&)
517 //
\83c
\83\8a\81[
\83r
\83\85\81[
\81E
\83\8a\83X
\83g
\83r
\83\85\81[
\90Ý
\92è
\81B
518 this->tree_ctrl->DeleteAllItems();
519 this->list_ctrl->DeleteAllItems();
520 this->list_ctrl->showFileInfo.Clear();
522 //
\83c
\81[
\83\8b\83o
\81[
\81E
\83\81\83j
\83\85\81[
\83o
\81[
\90Ý
\92è
\81B
523 SetMenuToolState("Arc_Close", false);
524 SetMenuToolState("Arc_Add", false);
525 SetMenuToolState("Arc_SFX", false);
526 SetMenuToolState("Arc_UnSFX", false);
527 SetMenuToolState("Arc_Extract", false);
528 SetMenuToolState("Arc_Delete", false);
529 SetMenuToolState("Arc_Test", false);
530 SetMenuToolState("Arc_Repair", false);
532 for (int i = 0; i < this->statusbar->GetFieldsCount(); i++)
534 this->statusbar->SetStatusText(wxEmptyString, i);
536 this->fileinfo.Clear();
537 this->szComment.Clear();
539 g_hIconT.RemoveAll();
540 g_hIconLL.RemoveAll();
541 g_hIconLS.RemoveAll();
542 this->tpi.FreeLibrary();
545 void MainFrame::OnArcAdd(wxCommandEvent& e)
547 //
\8f\88\97\9d\91Î
\8fÛ
\82Ì
\83t
\83@
\83C
\83\8b\82ð
\91I
\91ð
\81B
549 wxFileDialog fd(this, wxT("Choose files to add"), this->conf.Read(wxT("LastOpenPath"), ::wxGetCwd()));
550 fd.SetWindowStyleFlag(wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_MULTIPLE);
551 if (fd.ShowModal() == wxID_CANCEL)
555 fd.GetFilenames(files);
556 this->conf.Write(wxT("LastOpenPath"), fd.GetDirectory());
558 //
\8ae
\8eí
\90Ý
\92è
\81B
560 swInfo.fnDestinationDirectory = wxFileName::DirName(fd.GetDirectory());
561 swInfo.fMakeSFX = false;
562 swInfo.pCustomSwitches = NULL;
564 ProcessDialog procDlg;
565 procDlg.InitDialog();
567 if (! this->tpi.Command(TPI_COMMAND_ADD, & swInfo, this->fnArchive.GetFullPath(), files))
569 this->ErrorCheck(tpi.nErrorCode);
573 //
\8f\91\8cÉ
\82ð
\8dÄ
\93Ç
\82Ý
\8d\9e\82Ý
\81B
577 void MainFrame::OnArcConvert(wxCommandEvent& e)
580 swInfo.fMakeSFX = e.GetId() == XRCID("Arc_SFX");
582 //
\95Û
\91¶
\90æ
\82ð
\90q
\82Ë
\82é
\81B
583 wxFileDialog fd(this, swInfo.fMakeSFX ? wxT("Save as SFX") : wxT("Save as normal archive"), this->fnArchive.GetPath(), this->fnArchive.GetName() + (swInfo.fMakeSFX ? EXE_EXT : (wxString) wxEmptyString));
584 fd.SetWindowStyleFlag(wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
585 if (fd.ShowModal() == wxID_CANCEL)
589 swInfo.fnDestinationDirectory = wxFileName::DirName(fd.GetDirectory());
590 this->conf.Write(wxT("LastOpenPath"), fd.GetDirectory());
593 files.Add(fd.GetPath());
595 ProcessDialog procDlg;
596 procDlg.InitDialog();
598 if (! this->tpi.Command(swInfo.fMakeSFX ? TPI_COMMAND_SFX : TPI_COMMAND_UNSFX, & swInfo, this->fnArchive.GetFullPath(), files))
600 this->ErrorCheck(tpi.nErrorCode);
605 void MainFrame::OnArcExtract(wxCommandEvent& e)
608 swInfo.pCustomSwitches = NULL;
610 //
\83\82\81[
\83h
\8eæ
\93¾
\81B
\92Ê
\8fí
\82Í0,
\8eÀ
\8ds
\82È
\82ç1,
\83t
\83@
\83C
\83\8bDnD
\82È
\82ç2
\81A
\83f
\83B
\83\8c\83N
\83g
\83\8aDnD
\82È
\82ç3
\81B
611 int nMode = e.GetInt();
612 //
\8eÀ
\8ds
\8e\9e\82Ì
\82Ý
\8eg
\97p
\81B
613 wxFileType * ftFile = NULL;
615 //
\93W
\8aJ
\83_
\83C
\83A
\83\8d\83O
\82ð
\8dì
\90¬
\81BDnD
\82Ü
\82½
\82Í
\8eÀ
\8ds
\8e\9e\82Í
\95\
\8e¦
\82µ
\82È
\82¢
\81B
617 ::wxXmlResource::Get()->Load(L_DIR_S_XRC wxT("dlg_make.xrc"));
618 ::wxXmlResource::Get()->LoadDialog(& mkDlg, this, wxT("dlg_make"));
619 mkDlg.bIsMake = false;
620 mkDlg.files = MakeTargetFileList(this, nMode == 1);
626 //
\83R
\83}
\83\93\83h
\82ð
\8eæ
\93¾
\81B
627 ftFile = wxTheMimeTypesManager->GetFileTypeFromExtension(wxFileName(mkDlg.files[0]).GetExt());
630 //
\8eí
\97Þ
\82ª
\8eæ
\93¾
\82Å
\82«
\82È
\82¢
\82Æ
\82«
\82Í
\90Ý
\92è
\82ð
\93Ç
\82Ý
\8d\9e\82Þ
\81B
\8f\89\8aú
\90Ý
\92è
\82Å
\82Í
\83e
\83L
\83X
\83g
\82Æ
\82Ý
\82È
\82·
\81B
631 ftFile = wxTheMimeTypesManager->GetFileTypeFromExtension(this->conf.Read(wxT("DefaultExt"), wxT("txt")));
634 ::ErrDlg(wxT("Unable to get the file type!"), this);
640 //
\8dì
\8bÆ
\83f
\83B
\83\8c\83N
\83g
\83\8a\8dì
\90¬
\81B
641 swInfo.fStoreDirectoryPathes = false;
642 wxString szDestDirBase = nMode == 3 ? this->tree_ctrl->GetItemText(this->tree_ctrl->GetSelection()) : wxT("tpi_tmp");
643 if (szDestDirBase == wxT("-----"))
645 //
\8f\91\8cÉ
\83\8b\81[
\83g
\82Ì
\82Æ
\82«
\82Í
\8f\91\8cÉ
\96¼
\82É
\82µ
\82Ä
\82¨
\82
\81B
646 szDestDirBase = this->fnArchive.GetName();
648 swInfo.fnDestinationDirectory = MakeDirPath(wxFileName::DirName(::wxGetCwd()), szDestDirBase, true);
649 if (! swInfo.fnDestinationDirectory.IsOk())
651 ::ErrDlg(wxT("Unable to make the temporary directory!"), this);
658 if (mkDlg.ShowModal() == wxID_CANCEL)
663 //
\8ae
\8eí
\90Ý
\92è
\81B
664 swInfo.fStoreDirectoryPathes = ! mkDlg.cbIgnorePath->IsChecked();
665 swInfo.fnDestinationDirectory = wxFileName::DirName(mkDlg.cbDir->GetValue());
666 swInfo.szPassword = mkDlg.tcPassword->GetValue();
667 swInfo.szKeyFile = mkDlg.tcKeyfile->GetValue();
669 //
\95K
\97v
\82È
\82ç
\8f\91\8cÉ
\96¼
\82Å
\83f
\83B
\83\8c\83N
\83g
\83\8a\82ð
\8dì
\90¬
\82·
\82é
\81B
670 if (WillMakeDirByArcName(this, & mkDlg))
672 swInfo.fnDestinationDirectory = MakeDirPath(swInfo.fnDestinationDirectory, this->fnArchive.GetName(), true);
673 if (! swInfo.fnDestinationDirectory.IsOk())
675 ::ErrDlg(wxT("Unable to make the destination directory!"), this);
681 ProcessDialog procDlg;
682 procDlg.InitDialog();
684 if (! this->tpi.Command(TPI_COMMAND_EXTRACT, & swInfo, this->fnArchive.GetFullPath(), mkDlg.files))
686 this->ErrorCheck(tpi.nErrorCode);
692 if (mkDlg.cbOpenAfter->IsChecked())
694 //
\93W
\8aJ
\90æ
\82ð
\8aJ
\82
\81B
696 ::wxExecute(wxT("explorer ") + swInfo.fnDestinationDirectory.GetFullPath());
700 if (mkDlg.cbExitAfter->IsChecked())
708 wxArrayString asFiles;
711 //
\83R
\83}
\83\93\83h
\82ð
\8eÀ
\8ds
\81B
712 asFiles.Add(swInfo.fnDestinationDirectory.GetPathWithSep() + wxFileName(mkDlg.files[0]).GetFullName());
713 if (tpi.nErrorCode == TPI_ERROR_SUCCESS)
716 // Linux
\82Å
\82Í
\88ø
\97p
\95\84\82Å
\88Í
\82Þ
\95K
\97v
\82ª
\82 \82é
\81B
717 ::wxExecute(ftFile->GetOpenCommand(wxT('"') + asFiles[0] + wxT('"')), wxEXEC_SYNC);
719 ::wxExecute(ftFile->GetOpenCommand(asFiles[0]), wxEXEC_SYNC);
725 //
\93W
\8aJ
\91Î
\8fÛ
\82ð
\8c\88\92è
\81B
726 wxFileDataObject objFile;
727 for (size_t i = 0; i < mkDlg.files.GetCount(); i++)
729 wxString szFileName = swInfo.fnDestinationDirectory.GetPathWithSep() + wxFileName(mkDlg.files[i]).GetFullName();
732 //
\83\8a\83X
\83g
\82É
\92Ç
\89Á
\81B
733 objFile.AddFile(szFileName);
735 asFiles.Add(szFileName);
739 objFile.AddFile(swInfo.fnDestinationDirectory.GetPath());
743 wxDropSource dropSource(objFile, this);
744 if (dropSource.DoDragDrop() != wxDragMove)
747 // Linux
\82Å
\82Í
\82Ü
\82¾
\8f\88\97\9d\82ª
\8fI
\82í
\82Á
\82Ä
\82¢
\82È
\82¢(
\83R
\83\93\83e
\83L
\83X
\83g
\83\81\83j
\83\85\81[
\82ª
\95\
\8e¦
\82³
\82ê
\82Ä
\82¢
\82é)
\82Ì
\82Å
\81A
\82Æ
\82è
\82 \82¦
\82¸3
\95b
\82¾
\82¯
\91Ò
\82Â
\81B
753 //
\83t
\83@
\83C
\83\8b\82Æ
\88ê
\8e\9e\83f
\83B
\83\8c\83N
\83g
\83\8a\82ð
\8dí
\8f\9c\81B
754 for (size_t i = 0; i < asFiles.GetCount(); i++)
756 ::wxRemoveFile(asFiles[i]);
758 ::wxRmdir(swInfo.fnDestinationDirectory.GetFullPath());
762 void MainFrame::OnArcDelete(wxCommandEvent& e)
764 //
\91S
\83t
\83@
\83C
\83\8b\8dí
\8f\9c\82Í
\8aë
\8c¯
\82Å
\82Í
\82È
\82¢
\82©
\82Æ
\81B
765 if (this->list_ctrl->GetSelectedItemCount() == 0)
770 if (::AskDlg(wxT("Are you sure to delete selected files?"), this) == wxNO)
775 //
\8ae
\8eí
\90Ý
\92è
\81B
777 ProcessDialog procDlg;
778 procDlg.InitDialog();
780 if (! this->tpi.Command(TPI_COMMAND_DELETE, & swInfo, this->fnArchive.GetFullPath(), MakeTargetFileList(this, false)))
782 this->ErrorCheck(tpi.nErrorCode);
786 //
\8f\91\8cÉ
\82ð
\8dÄ
\93Ç
\82Ý
\8d\9e\82Ý
\82·
\82é
\81B
790 void MainFrame::OnArcTest(wxCommandEvent&)
793 ProcessDialog procDlg;
794 procDlg.InitDialog();
796 if (this->tpi.Command(TPI_COMMAND_TEST, & swInfo, this->fnArchive.GetFullPath(), MakeTargetFileList(this, false)))
798 ::MsgDlg(wxT("This is a correct archive."), & procDlg, wxICON_INFORMATION);
802 this->ErrorCheck(tpi.nErrorCode);
807 void MainFrame::OnArcRepair(wxCommandEvent&)
810 ProcessDialog procDlg;
811 procDlg.InitDialog();
813 if (! this->tpi.Command(TPI_COMMAND_REPAIR, & swInfo, this->fnArchive.GetFullPath(), MakeTargetFileList(this, false)))
815 this->ErrorCheck(tpi.nErrorCode);
820 void MainFrame::OnViewMode(wxCommandEvent & e)
823 this->menubar->Check(n, true);
824 this->list_ctrl->SetSingleStyle(wxLC_REPORT, n == XRCID("Exe_View_Details"));
825 this->list_ctrl->SetSingleStyle(wxLC_ICON, n == XRCID("Exe_View_Icons"));
826 this->list_ctrl->SetSingleStyle(wxLC_LIST, n == XRCID("Exe_View_List"));
829 void MainFrame::OnShowToolBar(wxCommandEvent & e)
831 this->toolbar->Show(e.IsChecked());
834 void MainFrame::OnShowStatusBar(wxCommandEvent & e)
836 this->statusbar->Show(e.IsChecked());
839 void MainFrame::OnSelectAll(wxCommandEvent &)
841 for (int i = 0; i < this->list_ctrl->GetItemCount(); i++)
843 this->list_ctrl->Select(i, true);
849 void MainFrame::OnTreeChanged(wxTreeEvent& e)
851 //
\83c
\83\8a\81[
\83r
\83\85\81[
\82©
\82ç
\83p
\83X
\82ð
\8eæ
\93¾
\81B
852 wxString szNodePath = TreeView_GetItemPath(this->tree_ctrl, e.GetItem());
853 //
\83\8a\83X
\83g
\83r
\83\85\81[
\82ð
\8f\89\8aú
\89»
\81B
854 this->list_ctrl->showFileInfo.Clear();
855 this->list_ctrl->DeleteAllItems();
856 g_hIconLL.RemoveAll();
857 g_hIconLS.RemoveAll();
859 //
\8c»
\8dÝ
\82Ì
\83A
\83C
\83e
\83\80\82Ì
\91I
\91ð
\8fó
\91Ô
\82ð
\96³
\8cø
\82É
\82µ
\82Ä
\82¨
\82
\81B
860 long nSelected = this->list_ctrl->GetFirstSelected();
861 while (nSelected != -1)
863 this->list_ctrl->Select(nSelected, false);
864 nSelected = this->list_ctrl->GetNextSelected(nSelected);
867 //
\83A
\83C
\83R
\83\93\90Ý
\92è
\81B
868 this->list_ctrl->SetImageList(& g_hIconLL, wxIMAGE_LIST_NORMAL);
869 this->list_ctrl->SetImageList(& g_hIconLS, wxIMAGE_LIST_SMALL);
871 //
\94z
\97ñ
\82Æ
\94ä
\8ar
\82µ
\81A
\83p
\83X
\82ª
\88ê
\92v
\82µ
\82È
\82¯
\82ê
\82Î
\8fÁ
\82·
\81B
872 for (size_t i = 0; i < this->fileinfo.GetCount(); i++)
874 //
\83p
\83X
\82ð
\94ä
\8ar
\81B
875 if (szNodePath == wxT("*") || szNodePath == this->fileinfo[i].fnFileName.GetPath())
877 //
\8d\80\96Ú
\82ª
\83t
\83H
\83\8b\83_
\82Å
\82 \82é
\82È
\82ç
\96³
\8e\8b\81B
878 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))
883 //
\83t
\83B
\83\8b\83^
\82É
\82©
\82©
\82ç
\82È
\82¯
\82ê
\82Î
\96³
\8e\8b\81B
884 if (this->fileinfo[i].fnFileName.GetFullName().MakeLower().Find(this->tcFilter->GetValue().MakeLower()) == wxNOT_FOUND)
889 this->list_ctrl->showFileInfo.Add(this->fileinfo[i]);
893 //
\83\
\81[
\83g
\82µ
\82Ä
\95\
\8e¦
\81B
894 this->list_ctrl->showFileInfo.Sort(& ListCtrlCompareProc);
895 this->list_ctrl->SetItemCount(this->list_ctrl->showFileInfo.GetCount());
898 void MainFrame::OnTreeBeginDrag(wxTreeEvent& e)
900 // TODO :
\83A
\83C
\83e
\83\80\82ª
\8eq
\8aK
\91w
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82Ä
\82à
\93W
\8aJ
\82Å
\82«
\82È
\82¢
\81B
901 this->tree_ctrl->SelectItem(e.GetItem());
905 this->OnArcExtract(e1);
910 void MainFrame::OnListItemDClick(wxListEvent&)
914 this->OnArcExtract(e);
917 void MainFrame::OnListBeginDrag(wxListEvent&)
919 if (this->list_ctrl->GetSelectedItemCount() == 0)
921 //
\83A
\83C
\83e
\83\80\82ð
\91I
\91ð
\82¹
\82¸
\83h
\83\89\83b
\83O
\82µ
\82æ
\82¤
\82Æ
\82µ
\82½
\8fê
\8d\87\81B
927 this->OnArcExtract(e);
932 void MainFrame::OnFilter(wxCommandEvent&)
935 e.SetItem(this->tree_ctrl->GetSelection());
936 this->OnTreeChanged(e);
939 //
\83C
\83x
\83\93\83g
\83n
\83\93\83h
\83\89\88È
\8aO
\81B
941 wxULongLong MainFrame::LoadTPI(wxString szFileName)
943 // TPI
\82ð
\93Ç
\82Ý
\8d\9e\82Ý
\81B
945 fs.ChangePathTo(L_DIR_B_LIB, true);
946 wxString szTPIName = fs.FindFirst(wxT("*" TPI_EXT), wxFILE);
947 wxULongLong llFileCount = 0;
948 while (! szTPIName.IsEmpty())
950 //
\91Î
\89\9e\8am
\94F
\81B
951 if (! tpi.InitLibrary(szTPIName, szFileName, 0) || ! tpi.CheckArchive(szFileName, & llFileCount) || llFileCount == 0)
954 szTPIName = fs.FindNext();
962 int MainFrame::ErrorCheck(int nErrorCode)
966 case TPI_ERROR_SUCCESS:
967 case TPI_CALLBACK_CONTINUE:
969 case TPI_ERROR_D_UNSUPPORTED:
970 ::ErrDlg(wxT("Sorry, this function is not supported yet."), this);
972 case TPI_ERROR_D_SKIPPED:
973 case TPI_CALLBACK_CANCEL:
974 ::ErrDlg(wxT("This operation is canceled by the user."), this);
977 ::ErrDlg(wxT("Error code is ") + wxString::Format(wxT("%d."), nErrorCode), this);