+/*
+ Bacula® - The Network Backup Solution
+
+ Copyright (C) 2004-2008 Free Software Foundation Europe e.V.
+
+ The main author of Bacula is Kern Sibbald, with contributions from
+ many others, a complete list can be found in the file AUTHORS.
+ This program is Free Software; you can redistribute it and/or
+ modify it under the terms of version two of the GNU General Public
+ License as published by the Free Software Foundation and included
+ in the file LICENSE.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
+
+ Bacula® is a registered trademark of Kern Sibbald.
+ The licensor of Bacula is the Free Software Foundation Europe
+ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
+ Switzerland, email:ftf@fsfeurope.org.
+*/
/*
*
* wxbPanel for restoring files
*
* Version $Id$
*/
-/*
- Copyright (C) 2004-2006 Kern Sibbald
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- version 2 as amended with additional clauses defined in the
- file LICENSE in the main source directory.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- the file LICENSE for additional details.
-
- */
/* Note concerning "done" output (modifiable marked with +)
Run Restore job
#undef _DEBUG
#include "bacula.h"
+
#include "wxbrestorepanel.h"
#include "wxbmainframe.h"
#include "csprint.h"
#include "unmarked.xpm"
#include "marked.xpm"
#include "partmarked.xpm"
+#include <wx/imaglist.h>
#include <wx/listimpl.cpp>
/* A macro named Yield is defined under MinGW */
wxbMainFrame::GetInstance()->SetStatusText(_("Please configure your restore parameters."));
}
else if (status == entered) {
-/* if (clientChoice->GetStringSelection().Length() < 1) {
+#ifdef xxx
+ if (clientChoice->GetStringSelection().Length() < 1) {
wxbMainFrame::GetInstance()->SetStatusText(_("Please select a client."));
return;
}
if (jobChoice->GetStringSelection().Length() < 1) {
wxbMainFrame::GetInstance()->SetStatusText(_("Please select a restore date."));
return;
- }*/
+ }
+#endif
+
wxbMainFrame::GetInstance()->SetStatusText(_("Building restore tree..."));
SetStatus(choosing);
wxT("\" storage=\"") << configPanel->GetRowString(wxT("Storage")) <<
wxT("\" before=\"") << configPanel->GetRowString(wxT("Before")) <<
wxT("\" select\n"));
- //wxbUtils::WaitForPrompt("6\n");
- //WaitForEnd();
- /*wxbPromptParser *pp = wxbUtils::WaitForPrompt(wxString() << configPanel->GetRowString(wxT("Before")) << "\n", true);
+
+#ifdef xxx
+ wxbUtils::WaitForPrompt("6\n");
+ WaitForEnd();
+
+ wxbPromptParser *pp = wxbUtils::WaitForPrompt(wxString() << configPanel->GetRowString(wxT("Before")) << "\n", true);
+
int client = pp->getChoices()->Index(configPanel->GetRowString(wxT("Client")));
if (client == wxNOT_FOUND) {
wxbMainFrame::GetInstance()->SetStatusText("Failed to find the selected client.");
return;
}
- delete pp;*/
+ delete pp;
- //wxbMainFrame::GetInstance()->Send(wxString() << configPanel->GetRowString(wxT("Before")) << "\n");
+ wxbMainFrame::GetInstance()->Send(wxString() << configPanel->GetRowString(wxT("Before")) << "\n");
+#endif
while (!tableparser->hasFinished() && !dt->hasFinished()) {
wxTheApp->Yield(true);
gauge->SetValue(0);
gauge->SetRange(tot);
- /*wxbMainFrame::GetInstance()->Print(
- wxString("[") << tot << "]", CS_DEBUG);*/
+#ifdef xxx
+ wxbMainFrame::GetInstance()->Print(
+ wxString("[") << tot << "]", CS_DEBUG);
+#endif
wxDateTime base = wxDateTime::Now();
wxDateTime newdate;
}
int res = ::wxGetSingleChoiceIndex(message,
- _("wx-console: unexpected restore question."), n, choices, this);
+ _("bwx-console: unexpected restore question."), n, choices, this);
if (res == -1) {
delete promptparser;
promptparser = wxbUtils::WaitForPrompt(wxT(".\n"), true);
delete promptparser;
promptparser = wxbUtils::WaitForPrompt(::wxGetTextFromUser(message,
- _("wx-console: unexpected restore question."),
+ _("bwx-console: unexpected restore question."),
wxT(""), this) + wxT("\n"));
}
}
int j;
for (i = 0; i < dt->GetCount(); i++) {
- if ((j = (*dt)[i].Find(_("Job started. JobId="))) > -1) {
+ if ((j = (*dt)[i].Find(_("Job queued. JobId="))) > -1) {
jobid = (*dt)[i].Mid(j+19);
- wxbMainFrame::GetInstance()->SetStatusText(_("Restore started, jobid=") + jobid);
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore queued, jobid=") + jobid);
break;
}
}
if (scheduledtime.Subtract(currenttime).IsLongerThan(wxTimeSpan::Seconds(150))) {
- wxbMainFrame::GetInstance()->Print(_("Restore is scheduled in more than two minutes, wx-console will not wait for its completion.\n"), CS_DEBUG);
- wxbMainFrame::GetInstance()->SetStatusText(_("Restore is scheduled in more than two minutes, wx-console will not wait for its completion."));
+ wxbMainFrame::GetInstance()->Print(_("Restore is scheduled to run. bwx-console will not wait for its completion.\n"), CS_DEBUG);
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore is scheduled to run. bwx-console will not wait for its completion."));
SetStatus(finished);
return;
}
}
if ((!waitforever) && (sw.Time() > 60000)) {
- wxbMainFrame::GetInstance()->Print(_("The restore job has not been started within one minute, wx-console will not wait for its completion anymore.\n"), CS_DEBUG);
- wxbMainFrame::GetInstance()->SetStatusText(_("The restore job has not been started within one minute, wx-console will not wait for its completion anymore."));
+ wxbMainFrame::GetInstance()->Print(_("The restore job has not been started within one minute, bwx-console will not wait for its completion anymore.\n"), CS_DEBUG);
+ wxbMainFrame::GetInstance()->SetStatusText(_("The restore job has not been started within one minute, bwx-console will not wait for its completion anymore."));
break;
}
}
* 11: JobId (no)
*/
-void wxbRestorePanel::CmdConfigApply() {
+void wxbRestorePanel::CmdConfigApply()
+{
if (cfgUpdated == 0) return;
wxbMainFrame::GetInstance()->SetStatusText(_("Applying restore configuration changes..."));
}
else if ((cfgUpdated >> ConfigReplace) & 1) {
wxbUtils::WaitForPrompt(wxT("mod\n")); /* TODO: check results */
- wxbUtils::WaitForPrompt(wxT("10\n"));
+ wxbUtils::WaitForPrompt(wxT("11\n"));
dt = new wxbDataTokenizer(true);
wxbUtils::WaitForPrompt(wxString() << (restorePanel->GetRowSelection(_("Replace"))+1) << wxT("\n"));
def = wxT("1");
cfgUpdated = cfgUpdated & (~(1 << ConfigPriority));
}
else if ((cfgUpdated >> ConfigClient) & 1) {
- wxbUtils::WaitForPrompt(wxT("mod\n")); /* TODO: check results */
- wxbPromptParser *pp = wxbUtils::WaitForPrompt(wxT("5\n"), true);
- int client = pp->getChoices()->Index(restorePanel->GetRowString(_("Client")));
- if (client == wxNOT_FOUND) {
- wxbMainFrame::GetInstance()->SetStatusText(_("Failed to find the selected client."));
- failed = true;
- client = 1;
+ if (restorePanel->GetRowCount(_("Client")) > 1) {
+ wxbUtils::WaitForPrompt(wxT("mod\n")); /* TODO: check results */
+ wxbPromptParser *pp = wxbUtils::WaitForPrompt(wxT("5\n"), true);
+ int client = pp->getChoices()->Index(restorePanel->GetRowString(_("Client")));
+ if (client == wxNOT_FOUND) {
+ wxbMainFrame::GetInstance()->SetStatusText(_("Failed to find the selected client."));
+ failed = true;
+ client = 1;
+ }
+ delete pp;
+ dt = new wxbDataTokenizer(true);
+ wxbUtils::WaitForPrompt(wxString() << client << wxT("\n"));
+ def = wxT("1");
+ cfgUpdated = cfgUpdated & (~(1 << ConfigClient));
+ } else {
+ cfgUpdated = cfgUpdated & (~(1 << ConfigClient));
+ continue;
}
- delete pp;
- dt = new wxbDataTokenizer(true);
- wxbUtils::WaitForPrompt(wxString() << client << wxT("\n"));
- def = wxT("1");
- cfgUpdated = cfgUpdated & (~(1 << ConfigClient));
}
else if ((cfgUpdated >> ConfigFileset) & 1) {
- wxbUtils::WaitForPrompt(wxT("mod\n")); /* TODO: check results */
- wxbPromptParser *pp = wxbUtils::WaitForPrompt(wxT("4\n"), true);
- int fileset = pp->getChoices()->Index(restorePanel->GetRowString(_("Fileset")));
- if (fileset == wxNOT_FOUND) {
- wxbMainFrame::GetInstance()->SetStatusText(_("Failed to find the selected fileset."));
- failed = true;
- fileset = 1;
+ if (restorePanel->GetRowCount(_("Fileset")) > 1) {
+ wxbUtils::WaitForPrompt(wxT("mod\n")); /* TODO: check results */
+ wxbPromptParser *pp = wxbUtils::WaitForPrompt(wxT("4\n"), true);
+ int fileset = pp->getChoices()->Index(restorePanel->GetRowString(_("Fileset")));
+ if (fileset == wxNOT_FOUND) {
+ wxbMainFrame::GetInstance()->SetStatusText(_("Failed to find the selected fileset."));
+ failed = true;
+ fileset = 1;
+ }
+ delete pp;
+ dt = new wxbDataTokenizer(true);
+ wxbUtils::WaitForPrompt(wxString() << fileset << wxT("\n"));
+ def = wxT("1");
+ cfgUpdated = cfgUpdated & (~(1 << ConfigFileset));
+ } else {
+ cfgUpdated = cfgUpdated & (~(1 << ConfigFileset));
+ continue;
}
- delete pp;
- dt = new wxbDataTokenizer(true);
- wxbUtils::WaitForPrompt(wxString() << fileset << wxT("\n"));
- def = wxT("1");
- cfgUpdated = cfgUpdated & (~(1 << ConfigFileset));
}
else if ((cfgUpdated >> ConfigStorage) & 1) {
- wxbUtils::WaitForPrompt(wxT("mod\n")); /* TODO: check results */
- wxbPromptParser *pp = wxbUtils::WaitForPrompt(wxT("2\n"), true);
- int fileset = pp->getChoices()->Index(restorePanel->GetRowString(_("Storage")));
- if (fileset == wxNOT_FOUND) {
- wxbMainFrame::GetInstance()->SetStatusText(_("Failed to find the selected storage."));
- failed = true;
- fileset = 1;
+ if (restorePanel->GetRowCount(_("Storage")) > 1) {
+ wxbUtils::WaitForPrompt(wxT("mod\n")); /* TODO: check results */
+ wxbPromptParser *pp = wxbUtils::WaitForPrompt(wxT("2\n"), true);
+ int storage = pp->getChoices()->Index(restorePanel->GetRowString(_("Storage")));
+ if (storage == wxNOT_FOUND) {
+ wxbMainFrame::GetInstance()->SetStatusText(_("Failed to find the selected storage."));
+ failed = true;
+ storage = 1;
+ }
+ delete pp;
+ dt = new wxbDataTokenizer(true);
+ wxbUtils::WaitForPrompt(wxString() << storage << wxT("\n"));
+ def = wxT("1");
+ cfgUpdated = cfgUpdated & (~(1 << ConfigStorage));
+ } else {
+ cfgUpdated = cfgUpdated & (~(1 << ConfigStorage));
+ continue;
}
- delete pp;
- dt = new wxbDataTokenizer(true);
- wxbUtils::WaitForPrompt(wxString() << fileset << wxT("\n"));
- def = wxT("1");
- cfgUpdated = cfgUpdated & (~(1 << ConfigStorage));
}
else {
cfgUpdated = 0;
}
}
- if (i == dt->GetCount()) {
+ if (i != 0 && i == dt->GetCount()) {
delete dt;
dt = wxbUtils::WaitForEnd(def + wxT("\n"), true);
failed = true;
UpdateSecondConfig(dt); /* TODO: Check result */
EnableConfig(true);
+ restorePanel->EnableApply(false);
if (!failed) {
wxbMainFrame::GetInstance()->SetStatusText(_("Restore configuration changes were applied."));
wxString file;
if (dir != wxT("/")) {
- if (dir.GetChar(dir.Length()-1) == '/') {
+ if (IsPathSeparator(dir.GetChar(dir.Length()-1))) {
dir.RemoveLast();
}
wxTreeItemId treeid;
- if (entry.fullname.GetChar(entry.fullname.Length()-1) == '/') {
+ if (IsPathSeparator(entry.fullname.GetChar(entry.fullname.Length()-1))) {
wxString itemStr;
#if wxCHECK_VERSION(2, 6, 0)
entry->fullname = tkz.GetString();
/* Get only the filename (cut path by finding the last '/') */
- if (entry->fullname.GetChar(entry->fullname.Length()-1) == '/') {
+ if (IsPathSeparator(entry->fullname.GetChar(entry->fullname.Length()-1))) {
wxString tmp = entry->fullname;
tmp.RemoveLast();
entry->filename = entry->fullname.Mid(tmp.Find('/', true)+1);
restorePanel->SetRowString(_("Storage"), (*dt)[i].Mid(10).Trim(false).RemoveLast());
if ((k = (*dt)[++i].Find(_("When:"))) != 0) return false;
restorePanel->SetRowString(_("When"), (*dt)[i].Mid(10).Trim(false).RemoveLast());
+ i++; /* Skip catalog field */
if ((k = (*dt)[++i].Find(_("Priority:"))) != 0) return false;
restorePanel->SetRowString(_("Priority"), (*dt)[i].Mid(10).Trim(false).RemoveLast());
cfgUpdated = 0;
cfgUpdated = 0;
break;
case listing:
-
break;
case choosing:
start->Enable(true);
centerSizer->Layout();
this->Layout();
restorePanel->EnableApply(false);
+ cancel->Enable(true);
break;
case restoring:
start->SetLabel(_("Restoring..."));
long cookie;
#endif
- if (name.GetChar(name.Length()-1) == '/') {
+ if (IsPathSeparator(name.GetChar(name.Length()-1))) {
wxTreeItemId currentChild = tree->GetFirstChild(currentTreeItem, cookie);
while (currentChild.IsOk()) {
listremove->Enable(false);
}
-void wxbRestorePanel::OnListRefresh(wxCommandEvent& event) {
+void wxbRestorePanel::OnListRefresh(wxCommandEvent& event)
+{
if (IsWorking()) {
return;
}
SetWorking(false);
}
-void wxbRestorePanel::OnConfigUpdated(wxCommandEvent& event) {
+void wxbRestorePanel::OnConfigUpdated(wxCommandEvent& event)
+{
if (status == entered) {
if (event.GetId() == ConfigJobName) {
if (IsWorking()) {