+/*
+ 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 three of the GNU Affero 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 Affero 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
*
* Nicolas Boichat, April-July 2004
*
+ * Version $Id$
*/
-/*
- Copyright (C) 2004 Kern Sibbald and John Walker
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
-
- 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
/* Note concerning "done" output (modifiable marked with +)
Run Restore job
+JobName: RestoreFiles
Select parameter to modify (1-11):
*/
-#include "wxbrestorepanel.h"
+/* Windows debug builds set _DEBUG which is used by wxWidgets to select their
+ * debug memory allocator. Unfortunately it conflicts with Bacula's SmartAlloc.
+ * So we turn _DEBUG off since we aren't interested in things it enables.
+ */
-#include "wxbmainframe.h"
+#undef _DEBUG
-#include "csprint.h"
+#include "bacula.h"
+#include "wxbrestorepanel.h"
+#include "wxbmainframe.h"
+#include "csprint.h"
#include <wx/choice.h>
#include <wx/datetime.h>
-
#include <wx/timer.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 */
class wxbTreeItemData : public wxTreeItemData {
public:
wxbTreeItemData(wxString path, wxString name, int marked, long listid = -1);
- wxbTreeItemData(wxString path, wxString name, wxString marked, long listid = -1);
~wxbTreeItemData();
wxString GetPath();
wxString GetName();
int GetMarked();
void SetMarked(int marked);
- void SetMarked(wxString marked);
long GetListId();
-
- static int GetMarkedStatus(wxString file);
private:
wxString* path; /* Full path */
wxString* name; /* File name */
this->listid = listid;
}
-wxbTreeItemData::wxbTreeItemData(wxString path, wxString name, wxString marked, long listid): wxTreeItemData() {
- this->path = new wxString(path);
- this->name = new wxString(name);
- SetMarked(marked);
- this->listid = listid;
-}
-
wxbTreeItemData::~wxbTreeItemData() {
delete path;
delete name;
return marked;
}
-void wxbTreeItemData::SetMarked(wxString marked) {
- if (marked == "*") {
- this->marked = 1;
- }
- else if (marked == "+") {
- this->marked = 2;
- }
- else {
- this->marked = 0;
- }
-}
-
void wxbTreeItemData::SetMarked(int marked) {
this->marked = marked;
}
return *name;
}
-/*wxbTreeItemData* wxbTreeItemData::GetChild(wxString dirname) {
- int marked = GetMarkedStatus(dirname);
- return new wxbTreeItemData(path + (marked ? dirname.Mid(1) : dirname), marked);
-}*/
-
-int wxbTreeItemData::GetMarkedStatus(wxString file) {
- if (file.Length() == 0)
- return 0;
-
- switch (file.GetChar(0)) {
- case '*':
- return 1;
- case '+':
- return 2;
- default:
- return 0;
- }
-}
-
// ----------------------------------------------------------------------------
// event tables and other macros for wxWindows
// ----------------------------------------------------------------------------
/*
* wxbRestorePanel constructor
*/
-wxbRestorePanel::wxbRestorePanel(wxWindow* parent): wxbPanel(parent) {
+wxbRestorePanel::wxbRestorePanel(wxWindow* parent): wxbPanel(parent)
+{
//pendingEvents = new wxbEventList(); //EVTQUEUE
//processing = false; //EVTQUEUE
SetWorking(false);
firstSizer->AddGrowableCol(0);
firstSizer->AddGrowableRow(0);
- start = new wxButton(this, RestoreStart, "Enter restore mode", wxDefaultPosition, wxSize(150, 30));
+ start = new wxButton(this, RestoreStart, _("Enter restore mode"), wxDefaultPosition, wxSize(150, 30));
firstSizer->Add(start, 0, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 10);
- cancel = new wxButton(this, RestoreCancel, "Cancel restore", wxDefaultPosition, wxSize(150, 30));
+ cancel = new wxButton(this, RestoreCancel, _("Cancel restore"), wxDefaultPosition, wxSize(150, 30));
firstSizer->Add(cancel, 0, wxALIGN_CENTER_HORIZONTAL | wxALIGN_RIGHT, 10);
wxString elist[1];
treeSizer->Add(tree, 1, wxEXPAND, 0);
wxBoxSizer *treeCtrlSizer = new wxBoxSizer(wxHORIZONTAL);
- treeadd = new wxButton(treePanel, TreeAdd, "Add", wxDefaultPosition, wxSize(60, 25));
+ treeadd = new wxButton(treePanel, TreeAdd, _("Add"), wxDefaultPosition, wxSize(60, 25));
treeCtrlSizer->Add(treeadd, 0, wxLEFT | wxRIGHT, 3);
- treeremove = new wxButton(treePanel, TreeRemove, "Remove", wxDefaultPosition, wxSize(60, 25));
+ treeremove = new wxButton(treePanel, TreeRemove, _("Remove"), wxDefaultPosition, wxSize(60, 25));
treeCtrlSizer->Add(treeremove, 0, wxLEFT | wxRIGHT, 3);
- treerefresh = new wxButton(treePanel, TreeRefresh, "Refresh", wxDefaultPosition, wxSize(60, 25));
+ treerefresh = new wxButton(treePanel, TreeRefresh, _("Refresh"), wxDefaultPosition, wxSize(60, 25));
treeCtrlSizer->Add(treerefresh, 0, wxLEFT | wxRIGHT, 3);
treeSizer->Add(treeCtrlSizer, 1, wxALIGN_CENTER_HORIZONTAL, 0);
wxListItem info;
info.SetMask(wxLIST_MASK_TEXT | wxLIST_MASK_FORMAT);
- info.SetText("M");
+ info.SetText(_("M"));
info.SetAlign(wxLIST_FORMAT_CENTER);
list->InsertColumn(0, info);
- info.SetText("Filename");
+ info.SetText(_("Filename"));
info.SetAlign(wxLIST_FORMAT_LEFT);
list->InsertColumn(1, info);
- info.SetText("Size");
+ info.SetText(_("Size"));
info.SetAlign(wxLIST_FORMAT_RIGHT);
list->InsertColumn(2, info);
- info.SetText("Date");
+ info.SetText(_("Date"));
info.SetAlign(wxLIST_FORMAT_LEFT);
list->InsertColumn(3, info);
- info.SetText("Perm.");
+ info.SetText(_("Perm."));
info.SetAlign(wxLIST_FORMAT_LEFT);
list->InsertColumn(4, info);
- info.SetText("User");
+ info.SetText(_("User"));
info.SetAlign(wxLIST_FORMAT_RIGHT);
list->InsertColumn(5, info);
- info.SetText("Group");
+ info.SetText(_("Group"));
info.SetAlign(wxLIST_FORMAT_RIGHT);
list->InsertColumn(6, info);
listSizer->Add(list, 1, wxEXPAND, 0);
wxBoxSizer *listCtrlSizer = new wxBoxSizer(wxHORIZONTAL);
- listadd = new wxButton(listPanel, ListAdd, "Add", wxDefaultPosition, wxSize(60, 25));
+ listadd = new wxButton(listPanel, ListAdd, _("Add"), wxDefaultPosition, wxSize(60, 25));
listCtrlSizer->Add(listadd, 0, wxLEFT | wxRIGHT, 5);
- listremove = new wxButton(listPanel, ListRemove, "Remove", wxDefaultPosition, wxSize(60, 25));
+ listremove = new wxButton(listPanel, ListRemove, _("Remove"), wxDefaultPosition, wxSize(60, 25));
listCtrlSizer->Add(listremove, 0, wxLEFT | wxRIGHT, 5);
- listrefresh = new wxButton(listPanel, ListRefresh, "Refresh", wxDefaultPosition, wxSize(60, 25));
+ listrefresh = new wxButton(listPanel, ListRefresh, _("Refresh"), wxDefaultPosition, wxSize(60, 25));
listCtrlSizer->Add(listrefresh, 0, wxLEFT | wxRIGHT, 5);
listSizer->Add(listCtrlSizer, 1, wxALIGN_CENTER_HORIZONTAL, 0);
treelistPanel->Show(false);
wxbConfig* config = new wxbConfig();
- config->Add(new wxbConfigParam("Job Name", ConfigJobName, choice, 0, elist));
- config->Add(new wxbConfigParam("Client", ConfigClient, choice, 0, elist));
- config->Add(new wxbConfigParam("Fileset", ConfigFileset, choice, 0, elist));
- config->Add(new wxbConfigParam("Pool", ConfigPool, choice, 0, elist));
- config->Add(new wxbConfigParam("Storage", ConfigStorage, choice, 0, elist));
- config->Add(new wxbConfigParam("Before", ConfigWhen, choice, 0, elist));
+ config->Add(new wxbConfigParam(_("Job Name"), ConfigJobName, choice, 0, elist));
+ config->Add(new wxbConfigParam(_("Client"), ConfigClient, choice, 0, elist));
+ config->Add(new wxbConfigParam(_("Fileset"), ConfigFileset, choice, 0, elist));
+ config->Add(new wxbConfigParam(_("Pool"), ConfigPool, choice, 0, elist));
+ config->Add(new wxbConfigParam(_("Storage"), ConfigStorage, choice, 0, elist));
+ config->Add(new wxbConfigParam(_("Before"), ConfigWhen, choice, 0, elist));
- configPanel = new wxbConfigPanel(this, config, "Please configure parameters concerning files to restore :", RestoreStart, RestoreCancel, -1);
+ configPanel = new wxbConfigPanel(this, config, _("Please configure parameters concerning files to restore :"), RestoreStart, RestoreCancel, -1);
configPanel->Show(true);
configPanel->Enable(false);
config = new wxbConfig();
- config->Add(new wxbConfigParam("Job Name", -1, text, ""));
- config->Add(new wxbConfigParam("Bootstrap", -1, text, ""));
- config->Add(new wxbConfigParam("Where", ConfigWhere, modifiableText, ""));
- wxString erlist[] = {"always", "if newer", "if older", "never"};
- config->Add(new wxbConfigParam("Replace", ConfigReplace, choice, 4, erlist));
- config->Add(new wxbConfigParam("Fileset", ConfigFileset, choice, 0, erlist));
- config->Add(new wxbConfigParam("Client", ConfigClient, choice, 0, erlist));
- config->Add(new wxbConfigParam("Storage", ConfigStorage, choice, 0, erlist));
- config->Add(new wxbConfigParam("When", ConfigWhen, modifiableText, ""));
- config->Add(new wxbConfigParam("Priority", ConfigPriority, modifiableText, ""));
-
- restorePanel = new wxbConfigPanel(this, config, "Please configure parameters concerning files restoration :", ConfigOk, ConfigCancel, ConfigApply);
+ config->Add(new wxbConfigParam(_("Job Name"), -1, text, wxT("")));
+ config->Add(new wxbConfigParam(_("Bootstrap"), -1, text, wxT("")));
+ config->Add(new wxbConfigParam(_("Where"), ConfigWhere, modifiableText, wxT("")));
+ wxString erlist[] = {_("always"), _("if newer"), _("if older"), _("never")};
+ config->Add(new wxbConfigParam(_("Replace"), ConfigReplace, choice, 4, erlist));
+ config->Add(new wxbConfigParam(_("Fileset"), ConfigFileset, choice, 0, erlist));
+ config->Add(new wxbConfigParam(_("Client"), ConfigClient, choice, 0, erlist));
+ config->Add(new wxbConfigParam(_("Storage"), ConfigStorage, choice, 0, erlist));
+ config->Add(new wxbConfigParam(_("When"), ConfigWhen, modifiableText, wxT("")));
+ config->Add(new wxbConfigParam(_("Priority"), ConfigPriority, modifiableText, wxT("")));
+
+ restorePanel = new wxbConfigPanel(this, config, _("Please configure parameters concerning files restoration :"), ConfigOk, ConfigCancel, ConfigApply);
restorePanel->Show(false);
SetCursor(*wxSTANDARD_CURSOR);
- markWhenListingDone = false;
+ markWhenCommandDone = false;
cancelled = 0;
}
/*
* wxbRestorePanel destructor
*/
-wxbRestorePanel::~wxbRestorePanel() {
+wxbRestorePanel::~wxbRestorePanel()
+{
delete imagelist;
}
wxbPanel overloadings
----------------------------------------------------------------------------*/
-wxString wxbRestorePanel::GetTitle() {
- return "Restore";
+wxString wxbRestorePanel::GetTitle()
+{
+ return _("Restore");
}
-void wxbRestorePanel::EnablePanel(bool enable) {
+void wxbRestorePanel::EnablePanel(bool enable)
+{
if (enable) {
if (status == disabled) {
SetStatus(activable);
}
- }
- else {
+ } else {
SetStatus(disabled);
}
}
----------------------------------------------------------------------------*/
/* The main button has been clicked */
-void wxbRestorePanel::CmdStart() {
+void wxbRestorePanel::CmdStart()
+{
unsigned int i;
if (status == activable) {
- wxbMainFrame::GetInstance()->SetStatusText("Getting parameters list.");
- wxbDataTokenizer* dt = wxbUtils::WaitForEnd(".clients\n", true, false);
+ wxbMainFrame::GetInstance()->SetStatusText(_("Getting parameters list."));
+ wxbDataTokenizer* dt = wxbUtils::WaitForEnd(wxT(".clients\n"), true, false);
wxString str;
- configPanel->ClearRowChoices("Client");
- restorePanel->ClearRowChoices("Client");
+ configPanel->ClearRowChoices(_("Client"));
+ restorePanel->ClearRowChoices(_("Client"));
if (dt->GetCount() == 0) {
- wxbMainFrame::GetInstance()->SetStatusText("Error : no clients returned by the director.");
+ wxbMainFrame::GetInstance()->SetStatusText(_("Error : no clients returned by the director."));
return;
}
for (i = 0; i < dt->GetCount(); i++) {
str = (*dt)[i];
str.RemoveLast();
- configPanel->AddRowChoice("Client", str);
- restorePanel->AddRowChoice("Client", str);
+ configPanel->AddRowChoice(_("Client"), str);
+ restorePanel->AddRowChoice(_("Client"), str);
}
delete dt;
return;
}
- dt = wxbUtils::WaitForEnd(".filesets\n", true, false);
+ dt = wxbUtils::WaitForEnd(wxT(".filesets\n"), true, false);
- configPanel->ClearRowChoices("Fileset");
- restorePanel->ClearRowChoices("Fileset");
+ configPanel->ClearRowChoices(_("Fileset"));
+ restorePanel->ClearRowChoices(_("Fileset"));
if (dt->GetCount() == 0) {
- wxbMainFrame::GetInstance()->SetStatusText("Error : no filesets returned by the director.");
+ wxbMainFrame::GetInstance()->SetStatusText(_("Error : no filesets returned by the director."));
return;
}
for (i = 0; i < dt->GetCount(); i++) {
str = (*dt)[i];
str.RemoveLast();
- configPanel->AddRowChoice("Fileset", str);
- restorePanel->AddRowChoice("Fileset", str);
+ configPanel->AddRowChoice(_("Fileset"), str);
+ restorePanel->AddRowChoice(_("Fileset"), str);
}
delete dt;
return;
}
- dt = wxbUtils::WaitForEnd(".storage\n", true, false);
+ dt = wxbUtils::WaitForEnd(wxT(".storage\n"), true, false);
- configPanel->ClearRowChoices("Storage");
- restorePanel->ClearRowChoices("Storage");
+ configPanel->ClearRowChoices(_("Storage"));
+ restorePanel->ClearRowChoices(_("Storage"));
if (dt->GetCount() == 0) {
- wxbMainFrame::GetInstance()->SetStatusText("Error : no storage returned by the director.");
+ wxbMainFrame::GetInstance()->SetStatusText(_("Error : no storage returned by the director."));
return;
}
for (i = 0; i < dt->GetCount(); i++) {
str = (*dt)[i];
str.RemoveLast();
- configPanel->AddRowChoice("Storage", str);
- restorePanel->AddRowChoice("Storage", str);
+ configPanel->AddRowChoice(_("Storage"), str);
+ restorePanel->AddRowChoice(_("Storage"), str);
}
delete dt;
return;
}
- dt = wxbUtils::WaitForEnd(".jobs\n", true, false);
+ dt = wxbUtils::WaitForEnd(wxT(".jobs\n"), true, false);
- configPanel->ClearRowChoices("Job Name");
+ configPanel->ClearRowChoices(_("Job Name"));
if (dt->GetCount() == 0) {
- wxbMainFrame::GetInstance()->SetStatusText("Error : no jobs returned by the director.");
+ wxbMainFrame::GetInstance()->SetStatusText(_("Error : no jobs returned by the director."));
return;
}
for (i = 0; i < dt->GetCount(); i++) {
str = (*dt)[i];
str.RemoveLast();
- configPanel->AddRowChoice("Job Name", str);
+ configPanel->AddRowChoice(_("Job Name"), str);
}
- configPanel->SetRowString("Job Name", "RestoreFiles");
+ configPanel->SetRowString(_("Job Name"), _("RestoreFiles"));
delete dt;
return;
}
- dt = wxbUtils::WaitForEnd(".pools\n", true, false);
+ dt = wxbUtils::WaitForEnd(wxT(".pools\n"), true, false);
- configPanel->ClearRowChoices("Pool");
+ configPanel->ClearRowChoices(_("Pool"));
if (dt->GetCount() == 0) {
- wxbMainFrame::GetInstance()->SetStatusText("Error : no jobs returned by the director.");
+ wxbMainFrame::GetInstance()->SetStatusText(_("Error : no jobs returned by the director."));
return;
}
for (i = 0; i < dt->GetCount(); i++) {
str = (*dt)[i];
str.RemoveLast();
- configPanel->AddRowChoice("Pool", str);
+ configPanel->AddRowChoice(_("Pool"), str);
}
delete dt;
UpdateFirstConfig();
- wxbMainFrame::GetInstance()->SetStatusText("Please configure your restore parameters.");
+ wxbMainFrame::GetInstance()->SetStatusText(_("Please configure your restore parameters."));
}
else if (status == entered) {
-/* if (clientChoice->GetStringSelection().Length() < 1) {
- wxbMainFrame::GetInstance()->SetStatusText("Please select a client.");
+#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.");
+ wxbMainFrame::GetInstance()->SetStatusText(_("Please select a restore date."));
return;
- }*/
- wxbMainFrame::GetInstance()->SetStatusText("Building restore tree...");
+ }
+#endif
+
+ wxbMainFrame::GetInstance()->SetStatusText(_("Building restore tree..."));
SetStatus(choosing);
- wxbUtils::WaitForPrompt(wxString("restore") <<
- " client=\"" << configPanel->GetRowString("Client") <<
- "\" fileset=\"" << configPanel->GetRowString("Fileset") <<
- "\" pool=\"" << configPanel->GetRowString("Pool") <<
- "\" storage=\"" << configPanel->GetRowString("Storage") << "\"\n");
+ wxbTableParser* tableparser = new wxbTableParser();
+ wxbDataTokenizer* dt = new wxbDataTokenizer(false);
+
+/*
+ * The following line was removed from ::GetInstance below because
+ * it does not work with multiple pools -- KES 5Oct05 see bug #433
+ * wxT("\" pool=\"") << configPanel->GetRowString(wxT("Pool")) <<
+ */
+ wxbMainFrame::GetInstance()->Send(wxString(wxT("restore")) <<
+ wxT(" client=\"") << configPanel->GetRowString(wxT("Client")) <<
+ wxT("\" fileset=\"") << configPanel->GetRowString(wxT("Fileset")) <<
+ wxT("\" storage=\"") << configPanel->GetRowString(wxT("Storage")) <<
+ wxT("\" before=\"") << configPanel->GetRowString(wxT("Before")) <<
+ wxT("\" select\n"));
+
+#ifdef xxx
wxbUtils::WaitForPrompt("6\n");
- //WaitForEnd();
- /*wxbPromptParser *pp = wxbUtils::WaitForPrompt(wxString() << configPanel->GetRowString("Before") << "\n", true);
- int client = pp->getChoices()->Index(configPanel->GetRowString("Client"));
+ 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;
- wxbTableParser* tableparser = new wxbTableParser();
- wxbDataTokenizer* dt = new wxbDataTokenizer(true);
-
- wxbMainFrame::GetInstance()->Send(wxString() << configPanel->GetRowString("Before") << "\n");
+ wxbMainFrame::GetInstance()->Send(wxString() << configPanel->GetRowString(wxT("Before")) << "\n");
+#endif
while (!tableparser->hasFinished() && !dt->hasFinished()) {
wxTheApp->Yield(true);
- ::wxUsleep(100);
+ wxbUtils::MilliSleep(100);
}
wxString str;
if (dt->hasFinished() && !tableparser->hasFinished()) {
- str = "";
+ str = wxT("");
if (dt->GetCount() > 1) {
str = (*dt)[dt->GetCount()-2];
str.RemoveLast();
}
- wxbMainFrame::GetInstance()->SetStatusText(wxString("Error while starting restore: ") << str);
+ wxbMainFrame::GetInstance()->SetStatusText(wxString(_("Error while starting restore: ")) << str);
delete dt;
delete tableparser;
SetStatus(finished);
for (i = 0; i < tableparser->GetCount(); i++) {
str = (*tableparser)[i][2];
- str.Replace(",", "");
+ str.Replace(wxT(","), wxT(""));
if (str.ToLong(&l)) {
tot += l;
}
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 var = 0;
- while (!dt->hasFinished()) {
+ int i1, i2;
+
+ while (true) {
newdate = wxDateTime::Now();
if (newdate.Subtract(base).GetMilliseconds() > 10 ) {
base = newdate;
for (; lastindex < dt->GetCount(); lastindex++) {
- if (((*dt)[lastindex].Find("Building directory tree for JobId ") == 0) &&
- ((i = (*dt)[lastindex].Find(" ...")) > 0)) {
- str = (*dt)[lastindex].Mid(34, i-34);
+ if (((i1 = (*dt)[lastindex].Find(wxT("Building directory tree for JobId "))) >= 0) &&
+ ((i2 = (*dt)[lastindex].Find(wxT(" ..."))) > 0)) {
+ str = (*dt)[lastindex].Mid(i1+34, i2-(i1+34));
for (i = 0; i < tableparser->GetCount(); i++) {
if (str == (*tableparser)[i][0]) {
str = (*tableparser)[i][2];
- str.Replace(",", "");
+ str.Replace(wxT(","), wxT(""));
if (str.ToLong(&l)) {
done += willdo;
willdo += l;
- var = (willdo-done)/3;
+ var = (willdo-done)/50;
+ gauge->SetValue(done);
+ wxTheApp->Yield(true);
}
break;
}
}
}
+ else if ((*dt)[lastindex] == wxT("+")) {
+ gauge->SetValue(gauge->GetValue()+var);
+ wxTheApp->Yield(true);
+ }
}
- if (gauge->GetValue() <= done) {
- gauge->SetValue(done);
- if (var < 0)
- var = -var;
- }
- else if (gauge->GetValue() >= willdo) {
- gauge->SetValue(willdo);
- if (var > 0)
- var = -var;
+
+ if (dt->hasFinished()) {
+ break;
}
-
- gauge->SetValue(gauge->GetValue()+var);
-
- /*wxbMainFrame::GetInstance()->Print(
- wxString("[") << gauge->GetValue() << "/" << done
- << "-" << willdo << "]", CS_DEBUG);*/
}
wxTheApp->Yield(true);
- ::wxUsleep(1);
+ wxbUtils::MilliSleep(1);
}
gauge->SetValue(tot);
return;
}
- wxbUtils::WaitForEnd("unmark *\n");
- wxTreeItemId root = tree->AddRoot(configPanel->GetRowString("Client"), -1, -1, new wxbTreeItemData("/", configPanel->GetRowString("Client"), 0));
+ wxbUtils::WaitForEnd(wxT("unmark *\n"));
+ wxTreeItemId root = tree->AddRoot(configPanel->GetRowString(_("Client")), -1, -1, new wxbTreeItemData(wxT("/"), configPanel->GetRowString(_("Client")), 0));
currentTreeItem = root;
tree->Refresh();
tree->SelectItem(root);
CmdList(root);
- wxbMainFrame::GetInstance()->SetStatusText("Right click on a file or on a directory, or double-click on its mark to add it to the restore list.");
+ wxbMainFrame::GetInstance()->SetStatusText(_("Right click on a file or on a directory, or double-click on its mark to add it to the restore list."));
tree->Expand(root);
}
else if (status == choosing) {
int j;
dt = new wxbDataTokenizer(true);
- wxbUtils::WaitForPrompt("done\n");
+ wxbPromptParser* promptparser = wxbUtils::WaitForPrompt(wxT("done\n"), true);
+
+ while (!promptparser->getChoices() || (promptparser->getChoices()->Index(wxT("mod")) < 0)) {
+ wxbMainFrame::GetInstance()->Print(_("Unexpected question has been received.\n"), CS_DEBUG);
+
+ wxString message;
+ if (promptparser->getIntroString() != wxT("")) {
+ message << promptparser->getIntroString() << wxT("\n");
+ }
+ message << promptparser->getQuestionString();
+
+ if (promptparser->getChoices()) {
+ wxString *choices = new wxString[promptparser->getChoices()->GetCount()];
+ int *numbers = new int[promptparser->getChoices()->GetCount()];
+ int n = 0;
+
+ for (unsigned int i = 0; i < promptparser->getChoices()->GetCount(); i++) {
+ if ((*promptparser->getChoices())[i] != wxT("")) {
+ choices[n] = (*promptparser->getChoices())[i];
+ numbers[n] = i;
+ n++;
+ }
+ }
+
+ int res = ::wxGetSingleChoiceIndex(message,
+ _("bwx-console: unexpected restore question."), n, choices, this);
+ if (res == -1) {
+ delete promptparser;
+ promptparser = wxbUtils::WaitForPrompt(wxT(".\n"), true);
+ }
+ else {
+ if (promptparser->isNumericalChoice()) {
+ delete promptparser;
+ promptparser = wxbUtils::WaitForPrompt(wxString() << numbers[res] << wxT("\n"), true);
+ }
+ else {
+ delete promptparser;
+ promptparser = wxbUtils::WaitForPrompt(wxString() << choices[res] << wxT("\n"), true);
+ }
+ }
+ delete[] choices;
+ delete[] numbers;
+ }
+ else {
+ delete promptparser;
+
+ promptparser = wxbUtils::WaitForPrompt(::wxGetTextFromUser(message,
+ _("bwx-console: unexpected restore question."),
+ wxT(""), this) + wxT("\n"));
+ }
+ }
+ printf("promptparser->getChoices()=%ld", (long)promptparser->getChoices());
+
+ delete promptparser;
SetStatus(configuring);
for (i = 0; i < dt->GetCount(); i++) {
- if ((j = (*dt)[i].Find(" files selected to be restored.")) > -1) {
+ if ((j = (*dt)[i].Find(_(" files selected to be restored."))) > -1) {
(*dt)[i].Mid(0, j).ToLong(&totfilemessages);
break;
}
- if ((j = (*dt)[i].Find(" file selected to be restored.")) > -1) {
+ if ((j = (*dt)[i].Find(_(" file selected to be restored."))) > -1) {
(*dt)[i].Mid(0, j).ToLong(&totfilemessages);
break;
}
}
wxbMainFrame::GetInstance()->SetStatusText(
- wxString("Please configure your restore (")
- << totfilemessages << " files selected to be restored)...");
+ wxString::Format(_("Please configure your restore (%ld files selected to be restored)..."), totfilemessages));
UpdateSecondConfig(dt);
restorePanel->EnableApply(false);
if (totfilemessages == 0) {
- wxbMainFrame::GetInstance()->Print("Restore failed : no file selected.\n", CS_DEBUG);
- wxbMainFrame::GetInstance()->SetStatusText("Restore failed : no file selected.");
+ wxbMainFrame::GetInstance()->Print(_("Restore failed : no file selected.\n"), CS_DEBUG);
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore failed : no file selected."));
SetStatus(finished);
return;
}
}
else if (status == configuring) {
cancel->Enable(false);
- jobid = "";
+ jobid = wxT("");
EnableConfig(false);
- wxbMainFrame::GetInstance()->SetStatusText("Restoring, please wait...");
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restoring, please wait..."));
wxbDataTokenizer* dt;
SetStatus(restoring);
- wxbUtils::WaitForEnd("yes\n");
+ dt = wxbUtils::WaitForEnd(wxT("yes\n"), true);
gauge->SetValue(0);
gauge->SetRange(totfilemessages);
+ int j;
+
+ for (i = 0; i < dt->GetCount(); i++) {
+ if ((j = (*dt)[i].Find(_("Job queued. JobId="))) > -1) {
+ jobid = (*dt)[i].Mid(j+19);
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore queued, jobid=") + jobid);
+ break;
+ }
+
+ if ((j = (*dt)[i].Find(_("Job failed."))) > -1) {
+ wxbMainFrame::GetInstance()->Print(_("Restore failed, please look at messages.\n"), CS_DEBUG);
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore failed, please look at messages in console."));
+ return;
+ }
+ }
+
+ if (jobid == wxT("")) {
+ wxbMainFrame::GetInstance()->Print(_("Failed to retrieve jobid.\n"), CS_DEBUG);
+ wxbMainFrame::GetInstance()->SetStatusText(_("Failed to retrieve jobid.\n"));
+ return;
+ }
+
wxDateTime currenttime;
- dt = wxbUtils::WaitForEnd("time\n", true);
- wxStringTokenizer ttkz((*dt)[0], " ", wxTOKEN_STRTOK);
+ dt = wxbUtils::WaitForEnd(wxT("time\n"), true);
+ wxStringTokenizer ttkz((*dt)[0], wxT(" "), wxTOKEN_STRTOK);
if ((currenttime.ParseDate(ttkz.GetNextToken()) == NULL) || // Date
(currenttime.ParseTime(ttkz.GetNextToken()) == NULL)) { // Time
currenttime.SetYear(1990); // If parsing fails, set currenttime to a dummy date
delete dt;
wxDateTime scheduledtime;
- wxStringTokenizer stkz(restorePanel->GetRowString("When"), " ", wxTOKEN_STRTOK);
+ wxStringTokenizer stkz(restorePanel->GetRowString(_("When")), wxT(" "), wxTOKEN_STRTOK);
if ((scheduledtime.ParseDate(stkz.GetNextToken()) == NULL) || // Date
(scheduledtime.ParseTime(stkz.GetNextToken()) == NULL)) { // Time
}
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;
}
- wxString cmd = "list jobid=";
-
- wxString jobname = restorePanel->GetRowString("Job Name");
-
- wxStopWatch sw;
+ wxString cmd = wxString(wxT("list jobid=")) + jobid;
wxbTableParser* tableparser;
-
- while (true) {
- tableparser = wxbUtils::CreateAndWaitForParser("list jobs\n");
-
- wxDateTime jobtime;
-
- for (i = 0; i < tableparser->GetCount(); i++) {
- if (jobname == (*tableparser)[i][1]) {
- wxStringTokenizer jtkz((*tableparser)[i][2], " ", wxTOKEN_STRTOK);
- if ((jobtime.ParseDate(jtkz.GetNextToken()) != NULL) && // Date
- (jobtime.ParseTime(jtkz.GetNextToken()) != NULL)) { // Time
- if (jobtime.IsLaterThan(currenttime)) {
- jobid = (*tableparser)[i][0];
- cmd << jobid << "\n";
- delete tableparser;
- tableparser = NULL;
- cancel->Enable(true);
- break;
- }
- }
- }
- }
-
- if (tableparser == NULL) { //The job was found
- break;
- }
-
- delete tableparser;
-
- wxStopWatch sw2;
- while (sw2.Time() < 2000) {
- wxTheApp->Yield(true);
- ::wxUsleep(100);
- }
- if (sw.Time() > 60000) {
- wxbMainFrame::GetInstance()->Print("The restore job has not been created within one minute, wx-console will not wait for its completion anymore.\n", CS_DEBUG);
- wxbMainFrame::GetInstance()->SetStatusText("The restore job has not been created within one minute, wx-console will not wait for its completion anymore.");
- SetStatus(finished);
- cancel->Enable(true);
- return;
- }
- }
long filemessages = 0;
+
+ bool ended = false;
+ bool waitforever = false;
+
+ char status = '?';
+ wxStopWatch sw;
+
+ wxbUtils::WaitForEnd(wxT("autodisplay off\n"));
+ wxbUtils::WaitForEnd(wxT("gui on\n"));
while (true) {
tableparser = wxbUtils::CreateAndWaitForParser(cmd);
- if ((*tableparser)[0][7] != "C") {
+ ended = false;
+ status = (*tableparser)[0][7].GetChar(0);
+ switch (status) {
+ case JS_Created:
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore job created, but not yet running."));
+ waitforever = false;
+ break;
+ case JS_Running:
+ wxbMainFrame::GetInstance()->SetStatusText(
+ wxString::Format(_("Restore job running, please wait (%ld of %ld files restored)..."), filemessages, totfilemessages));
+ waitforever = true;
+ break;
+ case JS_Terminated:
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore job terminated successfully."));
+ wxbMainFrame::GetInstance()->Print(_("Restore job terminated successfully.\n"), CS_DEBUG);
+ waitforever = false;
+ ended = true;
+ break;
+ case JS_ErrorTerminated:
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore job terminated in error, see messages in console."));
+ wxbMainFrame::GetInstance()->Print(_("Restore job terminated in error, see messages.\n"), CS_DEBUG);
+ waitforever = false;
+ ended = true;
+ break;
+ case JS_Error:
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore job reported a non-fatal error."));
+ waitforever = false;
+ break;
+ case JS_FatalError:
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore job reported a fatal error."));
+ waitforever = false;
+ ended = true;
+ break;
+ case JS_Canceled:
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore job cancelled by user."));
+ wxbMainFrame::GetInstance()->Print(_("Restore job cancelled by user.\n"), CS_DEBUG);
+ waitforever = false;
+ ended = true;
+ break;
+ case JS_WaitFD:
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore job is waiting on File daemon."));
+ waitforever = false;
+ break;
+ case JS_WaitMedia:
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore job is waiting for new media."));
+ waitforever = false;
+ break;
+ case JS_WaitStoreRes:
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore job is waiting for storage resource."));
+ waitforever = false;
+ break;
+ case JS_WaitJobRes:
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore job is waiting for job resource."));
+ waitforever = false;
+ break;
+ case JS_WaitClientRes:
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore job is waiting for Client resource."));
+ waitforever = false;
+ break;
+ case JS_WaitMaxJobs:
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore job is waiting for maximum jobs."));
+ waitforever = false;
+ break;
+ case JS_WaitStartTime:
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore job is waiting for start time."));
+ waitforever = false;
+ break;
+ case JS_WaitPriority:
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore job is waiting for higher priority jobs to finish."));
+ waitforever = false;
break;
}
delete tableparser;
-
- dt = wxbUtils::WaitForEnd("messages\n", true);
+ dt = wxbUtils::WaitForEnd(wxT(".messages\n"), true);
+
for (unsigned int i = 0; i < dt->GetCount(); i++) {
- wxStringTokenizer tkz((*dt)[i], " ", wxTOKEN_STRTOK);
+ wxStringTokenizer tkz((*dt)[i], wxT(" "), wxTOKEN_STRTOK);
wxDateTime datetime;
}
delete dt;
-
- wxbMainFrame::GetInstance()->SetStatusText(wxString("Restoring, please wait (") << filemessages << " of " << totfilemessages << " files done)...");
-
+
wxStopWatch sw2;
while (sw2.Time() < 10000) {
wxTheApp->Yield(true);
- ::wxUsleep(100);
+ wxbUtils::MilliSleep(100);
+ }
+
+ if (ended) {
+ break;
+ }
+
+ if ((!waitforever) && (sw.Time() > 60000)) {
+ 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;
}
}
-
- wxbUtils::WaitForEnd("messages\n");
+ wxbUtils::WaitForEnd(wxT("autodisplay on\n"));
+ wxbUtils::WaitForEnd(wxT(".messages\n"));
gauge->SetValue(totfilemessages);
- if ((*tableparser)[0][7] == "T") {
- wxbMainFrame::GetInstance()->Print("Restore done successfully.\n", CS_DEBUG);
- wxbMainFrame::GetInstance()->SetStatusText("Restore done successfully.");
- }
- else {
- wxbMainFrame::GetInstance()->Print("Restore failed, please look at messages.\n", CS_DEBUG);
- wxbMainFrame::GetInstance()->SetStatusText("Restore failed, please look at messages in console.");
+ if (status == JS_Terminated) {
+ wxbMainFrame::GetInstance()->Print(_("Restore done successfully.\n"), CS_DEBUG);
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore done successfully."));
}
- delete tableparser;
SetStatus(finished);
}
}
cancelled = 1;
if (status == restoring) {
- if (jobid != "") {
- wxbMainFrame::GetInstance()->Send(wxString("cancel job=") << jobid << "\n");
+ if (jobid != wxT("")) {
+ wxbMainFrame::GetInstance()->Send(wxString(wxT("cancel job=")) << jobid << wxT("\n"));
}
cancel->Enable(true);
return;
wxStopWatch sw;
while ((IsWorking()) && (cancelled != 2)) {
wxTheApp->Yield(true);
- ::wxUsleep(100);
+ wxbUtils::MilliSleep(100);
if (sw.Time() > 30000) { /* 30 seconds timeout */
if (status == choosing) {
- wxbMainFrame::GetInstance()->Send("quit\n");
+ wxbMainFrame::GetInstance()->Send(wxT("quit\n"));
}
else if (status == configuring) {
- wxbMainFrame::GetInstance()->Send("no\n");
+ wxbMainFrame::GetInstance()->Send(wxT("no\n"));
}
else if (status == restoring) {
}
SetStatus(finished);
- ::wxUsleep(1000);
+ wxbUtils::MilliSleep(1000);
return;
}
}
switch (status) {
case choosing:
- wxbMainFrame::GetInstance()->Send("quit\n");
+ wxbMainFrame::GetInstance()->Send(wxT("quit\n"));
break;
case configuring:
- wxbMainFrame::GetInstance()->Send("no\n");
+ wxbMainFrame::GetInstance()->Send(wxT("no\n"));
break;
default:
break;
}
- ::wxUsleep(1000);
+ wxbUtils::MilliSleep(1000);
SetStatus(finished);
}
* 11: JobId (no)
*/
-void wxbRestorePanel::CmdConfigApply() {
+void wxbRestorePanel::CmdConfigApply()
+{
if (cfgUpdated == 0) return;
- wxbMainFrame::GetInstance()->SetStatusText("Applying restore configuration changes...");
+ wxbMainFrame::GetInstance()->SetStatusText(_("Applying restore configuration changes..."));
EnableConfig(false);
}
wxString def; //String to send if can't use our data
if ((cfgUpdated >> ConfigWhere) & 1) {
- wxbUtils::WaitForPrompt("mod\n"); /* TODO: check results */
- wxbUtils::WaitForPrompt("9\n");
+ wxbUtils::WaitForPrompt(wxT("mod\n")); /* TODO: check results */
+ wxbUtils::WaitForPrompt(wxT("9\n"));
dt = new wxbDataTokenizer(true);
- wxbUtils::WaitForPrompt(restorePanel->GetRowString("Where") + "\n");
- def = "/tmp";
+ wxbUtils::WaitForPrompt(restorePanel->GetRowString(_("Where")) + wxT("\n"));
+ def = wxT("/tmp");
cfgUpdated = cfgUpdated & (~(1 << ConfigWhere));
}
else if ((cfgUpdated >> ConfigReplace) & 1) {
- wxbUtils::WaitForPrompt("mod\n"); /* TODO: check results */
- wxbUtils::WaitForPrompt("10\n");
+ wxbUtils::WaitForPrompt(wxT("mod\n")); /* TODO: check results */
+ wxbUtils::WaitForPrompt(wxT("11\n"));
dt = new wxbDataTokenizer(true);
- wxbUtils::WaitForPrompt(wxString() << (restorePanel->GetRowSelection("Replace")+1) << "\n");
- def = "1";
+ wxbUtils::WaitForPrompt(wxString() << (restorePanel->GetRowSelection(_("Replace"))+1) << wxT("\n"));
+ def = wxT("1");
cfgUpdated = cfgUpdated & (~(1 << ConfigReplace));
}
else if ((cfgUpdated >> ConfigWhen) & 1) {
- wxbUtils::WaitForPrompt("mod\n"); /* TODO: check results */
- wxbUtils::WaitForPrompt("6\n");
+ wxbUtils::WaitForPrompt(wxT("mod\n")); /* TODO: check results */
+ wxbUtils::WaitForPrompt(wxT("6\n"));
dt = new wxbDataTokenizer(true);
- wxbUtils::WaitForPrompt(restorePanel->GetRowString("When") + "\n");
- def = "";
+ wxbUtils::WaitForPrompt(restorePanel->GetRowString(wxT("When")) + wxT("\n"));
+ def = wxT("");
cfgUpdated = cfgUpdated & (~(1 << ConfigWhen));
}
else if ((cfgUpdated >> ConfigPriority) & 1) {
- wxbUtils::WaitForPrompt("mod\n"); /* TODO: check results */
- wxbUtils::WaitForPrompt("7\n");
+ wxbUtils::WaitForPrompt(wxT("mod\n")); /* TODO: check results */
+ wxbUtils::WaitForPrompt(wxT("7\n"));
dt = new wxbDataTokenizer(true);
- wxbUtils::WaitForPrompt(restorePanel->GetRowString("Priority") + "\n");
- def = "10";
+ wxbUtils::WaitForPrompt(restorePanel->GetRowString(_("Priority")) + wxT("\n"));
+ def = wxT("10");
cfgUpdated = cfgUpdated & (~(1 << ConfigPriority));
}
else if ((cfgUpdated >> ConfigClient) & 1) {
- wxbUtils::WaitForPrompt("mod\n"); /* TODO: check results */
- wxbPromptParser *pp = wxbUtils::WaitForPrompt("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 << "\n");
- def = "1";
- cfgUpdated = cfgUpdated & (~(1 << ConfigClient));
}
else if ((cfgUpdated >> ConfigFileset) & 1) {
- wxbUtils::WaitForPrompt("mod\n"); /* TODO: check results */
- wxbPromptParser *pp = wxbUtils::WaitForPrompt("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 << "\n");
- def = "1";
- cfgUpdated = cfgUpdated & (~(1 << ConfigFileset));
}
else if ((cfgUpdated >> ConfigStorage) & 1) {
- wxbUtils::WaitForPrompt("mod\n"); /* TODO: check results */
- wxbPromptParser *pp = wxbUtils::WaitForPrompt("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 << "\n");
- def = "1";
- cfgUpdated = cfgUpdated & (~(1 << ConfigFileset));
}
else {
cfgUpdated = 0;
unsigned int i;
for (i = 0; i < dt->GetCount(); i++) {
- if ((*dt)[i].Find("Run Restore job") == 0) {
+ if ((*dt)[i].Find(_("Run Restore job")) == 0) {
break;
}
}
- if (i == dt->GetCount()) {
+ if (i != 0 && i == dt->GetCount()) {
delete dt;
- dt = wxbUtils::WaitForEnd(def + "\n", true);
+ 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.");
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore configuration changes were applied."));
}
delete dt;
/* Cancel restore */
void wxbRestorePanel::CmdConfigCancel() {
- wxbUtils::WaitForEnd("no\n");
- wxbMainFrame::GetInstance()->Print("Restore cancelled.\n", CS_DEBUG);
- wxbMainFrame::GetInstance()->SetStatusText("Restore cancelled.");
+ wxbUtils::WaitForEnd(wxT("no\n"));
+ wxbMainFrame::GetInstance()->Print(_("Restore cancelled.\n"), CS_DEBUG);
+ wxbMainFrame::GetInstance()->SetStatusText(_("Restore cancelled."));
SetStatus(finished);
}
-/* List jobs for a specified client */
+/* List jobs for a specified client and fileset */
void wxbRestorePanel::CmdListJobs() {
if (status == entered) {
- configPanel->ClearRowChoices("Before");
- wxbUtils::WaitForPrompt("query\n");
- wxbUtils::WaitForPrompt("6\n");
- wxbTableParser* tableparser = new wxbTableParser();
- wxbDataTokenizer* dt = wxbUtils::WaitForEnd(configPanel->GetRowString("Client") + "\n", true);
+ configPanel->ClearRowChoices(_("Before"));
+ /*wxbUtils::WaitForPrompt("query\n");
+ wxbUtils::WaitForPrompt("6\n");*/
+ wxbTableParser* tableparser = new wxbTableParser(false);
+ wxbDataTokenizer* dt = wxbUtils::WaitForEnd(
+ wxString(wxT(".backups client=\"")) + configPanel->GetRowString(_("Client")) +
+ wxT("\" fileset=\"") + configPanel->GetRowString(_("Fileset")) + wxT("\"\n"), true);
- if (!tableparser->hasFinished()) {
- for (int i = 0; i < dt->Count(); i++) {
- if ((*dt)[i].Index("No results to list.") == 0) {
- configPanel->AddRowChoice("Before", "No backup found for this client.");
- configPanel->SetRowSelection("Before", 0);
+ while (!tableparser->hasFinished()) {
+ wxTheApp->Yield(true);
+ wxbUtils::MilliSleep(100);
+ }
+
+ if (!tableparser->GetCount() == 0) {
+ for (unsigned int i = 0; i < dt->Count(); i++) {
+ if ((*dt)[i].Find(_("No results to list.")) == 0) {
+ configPanel->AddRowChoice(_("Before"),
+ _("No backup found for this client."));
+ configPanel->SetRowSelection(_("Before"), 0);
configPanel->EnableApply(true); // Enabling the not existing apply button disables the ok button.
delete tableparser;
delete dt;
return;
}
- else if (((*dt)[i].Index("ERROR") > -1) || ((*dt)[i].Index("Query failed") > -1)) {
- configPanel->AddRowChoice("Before", "Cannot get previous backups list, see console.");
- configPanel->SetRowSelection("Before", 0);
+ else if (((*dt)[i].Find(_("ERROR")) > -1) ||
+ ((*dt)[i].Find(_("Query failed")) > -1)) {
+ configPanel->AddRowChoice(_("Before"),
+ _("Cannot get previous backups list, see console."));
+ configPanel->SetRowSelection(_("Before"), 0);
configPanel->EnableApply(true); // Enabling the not existing apply button disables the ok button.
delete tableparser;
delete dt;
}
}
- while (!tableparser->hasFinished()) {
- wxTheApp->Yield(true);
- ::wxUsleep(100);
- }
-
delete dt;
+ wxDateTime lastdatetime = (time_t) 0;
for (int i = tableparser->GetCount()-1; i > -1; i--) {
wxString str = (*tableparser)[i][3];
wxDateTime datetime;
- const char* chr;
- if ( ( (chr = datetime.ParseDate(str.GetData()) ) != NULL ) && ( datetime.ParseTime(++chr) != NULL ) ) {
+ const wxChar* chr;
+ if ( ( (chr = datetime.ParseDate(str.GetData()) ) != NULL ) && ( datetime.ParseTime(++chr) != NULL ) && ! lastdatetime.IsEqualTo(datetime) ) {
+ lastdatetime = datetime;
datetime += wxTimeSpan::Seconds(1);
- //wxbMainFrame::GetInstance()->Print(wxString("-") << datetime.Format("%Y-%m-%d %H:%M:%S"), CS_DEBUG);
- configPanel->AddRowChoice("Before", datetime.Format("%Y-%m-%d %H:%M:%S"));
+ configPanel->AddRowChoice(_("Before"),
+ datetime.Format(wxT("%Y-%m-%d %H:%M:%S")));
}
- /*else {
- jobChoice->Append("Invalid");
- }*/
}
delete tableparser;
- configPanel->SetRowSelection("Before", 0);
+ configPanel->SetRowSelection(_("Before"), 0);
configPanel->EnableApply(false); // Disabling the not existing apply button enables the ok button.
}
}
}
if (listitems != NULL) {
- for (int i = 0; i < listsize; i++) {
+ for (int i = 0; i < itemdatasize; i++) {
itemdata[i] = (wxbTreeItemData*)list->GetItemData(listitems[i]);
}
}
wxString dir = itemdata[0]->GetPath();
wxString file;
- if (dir != "/") {
- if (dir.GetChar(dir.Length()-1) == '/') {
+ if (dir != wxT("/")) {
+ if (IsPathSeparator(dir.GetChar(dir.Length()-1))) {
dir.RemoveLast();
}
int i = dir.Find('/', TRUE);
if (i == -1) {
file = dir;
- dir = "/";
+ dir = wxT("/");
}
else { /* first dir below root */
file = dir.Mid(i+1);
}
}
else {
- dir = "/";
- file = "*";
+ dir = wxT("/");
+ file = wxT("*");
}
if (state == -1) {
}
}
- wxbUtils::WaitForEnd(wxString("cd \"") << dir << "\"\n");
- wxbUtils::WaitForEnd(wxString((state==1) ? "mark" : "unmark") << " \"" << file << "\"\n");
+ wxbUtils::WaitForEnd(wxString(wxT("cd \"")) << dir << wxT("\"\n"));
+ wxbUtils::WaitForEnd(wxString((state==1) ? wxT("mark") : wxT("unmark")) << wxT(" \"") << file << wxT("\"\n"));
/* TODO: Check commands results */
treeitem = tree->GetItemParent(treeitem);*/
}
else {
- for (int i = 0; i < listsize; i++) {
+ for (int i = 0; i < itemdatasize; i++) {
SetListItemState(listitems[i], state);
}
+ listadd->Enable(state == 0);
+ listremove->Enable(state == 1);
/*UpdateTree(treeitem, (tree->GetSelection() == treeitem));
treeitem = tree->GetItemParent(treeitem);*/
}
----------------------------------------------------------------------------*/
/* Run a dir command, and waits until result is fully received. */
-void wxbRestorePanel::UpdateTreeItem(wxTreeItemId item, bool updatelist, bool recurse) {
+void wxbRestorePanel::UpdateTreeItem(wxTreeItemId item, bool updatelist, bool recurse)
+{
// this->updatelist = updatelist;
wxbDataTokenizer* dt;
- dt = wxbUtils::WaitForEnd(wxString("cd \"") <<
+ dt = wxbUtils::WaitForEnd(wxString(wxT("cd \"")) <<
static_cast<wxbTreeItemData*>(tree->GetItemData(item))
- ->GetPath() << "\"\n", false);
+ ->GetPath() << wxT("\"\n"), false);
/* TODO: check command result */
if (updatelist)
list->DeleteAllItems();
- dt = wxbUtils::WaitForEnd("dir\n", true);
+ dt = wxbUtils::WaitForEnd(wxT(".dir\n"), true);
wxString str;
for (unsigned int i = 0; i < dt->GetCount(); i++) {
str = (*dt)[i];
- if (str.Find("cwd is:") == 0) { // Sometimes cd command result "infiltrate" into listings.
+ if (str.Find(wxT("cwd is:")) == 0) { // Sometimes cd command result "infiltrate" into listings.
break;
}
str.RemoveLast();
- wxString* file = ParseList(str);
+ wxbDirEntry entry;
- if (file == NULL)
+ if (!ParseList(str, &entry))
break;
wxTreeItemId treeid;
- if (file[8].GetChar(file[8].Length()-1) == '/') {
+ if (IsPathSeparator(entry.fullname.GetChar(entry.fullname.Length()-1))) {
wxString itemStr;
+#if wxCHECK_VERSION(2, 6, 0)
+ wxTreeItemIdValue cookie;
+#else
long cookie;
+#endif
+
treeid = tree->GetFirstChild(item, cookie);
bool updated = false;
while (treeid.IsOk()) {
- itemStr = tree->GetItemText(treeid);
- if (file[8] == itemStr) {
- int stat = wxbTreeItemData::GetMarkedStatus(file[6]);
- if (static_cast<wxbTreeItemData*>(tree->GetItemData(treeid))->GetMarked() != stat) {
- tree->SetItemImage(treeid, stat, wxTreeItemIcon_Normal);
- tree->SetItemImage(treeid, stat, wxTreeItemIcon_Selected);
- static_cast<wxbTreeItemData*>(tree->GetItemData(treeid))->SetMarked(file[6]);
+ itemStr = ((wxbTreeItemData*)tree->GetItemData(treeid))->GetName();
+ if (entry.filename == itemStr) {
+ if (static_cast<wxbTreeItemData*>(tree->GetItemData(treeid))->GetMarked() != entry.marked) {
+ tree->SetItemImage(treeid, entry.marked, wxTreeItemIcon_Normal);
+ tree->SetItemImage(treeid, entry.marked, wxTreeItemIcon_Selected);
+ static_cast<wxbTreeItemData*>(tree->GetItemData(treeid))->SetMarked(entry.marked);
}
if ((recurse) && (tree->IsExpanded(treeid))) {
UpdateTreeItem(treeid, false, true);
}
if (!updated) {
- int img = wxbTreeItemData::GetMarkedStatus(file[6]);
- treeid = tree->AppendItem(item, file[8], img, img, new wxbTreeItemData(file[7], file[8], file[6]));
+ treeid = tree->AppendItem(item, wxbUtils::ConvertToPrintable(entry.filename), entry.marked, entry.marked, new wxbTreeItemData(entry.fullname, entry.filename, entry.marked));
}
}
if (updatelist) {
- long ind = list->InsertItem(list->GetItemCount(), wxbTreeItemData::GetMarkedStatus(file[6]));
- wxbTreeItemData* data = new wxbTreeItemData(file[7], file[8], file[6], ind);
+ long ind = list->InsertItem(list->GetItemCount(), entry.marked);
+ wxbTreeItemData* data = new wxbTreeItemData(entry.fullname, entry.filename, entry.marked, ind);
data->SetId(treeid);
list->SetItemData(ind, (long)data);
- list->SetItem(ind, 1, file[8]); // filename
- list->SetItem(ind, 2, file[4]); //Size
- list->SetItem(ind, 3, file[5]); //date
- list->SetItem(ind, 4, file[0]); //perm
- list->SetItem(ind, 5, file[2]); //user
- list->SetItem(ind, 6, file[3]); //grp
+ list->SetItem(ind, 1, wxbUtils::ConvertToPrintable(entry.filename));
+ list->SetItem(ind, 2, entry.size);
+ list->SetItem(ind, 3, entry.date);
+ list->SetItem(ind, 4, entry.perm);
+ list->SetItem(ind, 5, entry.user);
+ list->SetItem(ind, 6, entry.group);
}
-
- delete[] file;
}
delete dt;
status = choosing;
}
-/* Parse dir command results. */
-wxString* wxbRestorePanel::ParseList(wxString line) {
+/* Parse .dir command results, returns true if the result has been stored in entry, false otherwise. */
+int wxbRestorePanel::ParseList(wxString line, wxbDirEntry* entry)
+{
/* See ls_output in dird/ua_tree.c */
-
- //drwxrwxrwx 1 root root 0 2004-04-03 14:35:21 f:/tocd/NVSU 1.00.00/
- //+ 10 + ++ + 8 + + 8 ++ 8 + + 19 + *+ ->
- //0 12 15 24 32 42 62
-
- if (line.Length() < 63)
- return NULL;
+ //-rw-r-----,1,root,root,41575,2005-10-18 18:21:36, ,/usr/var/bacula/working/bacula.sql
- wxString* ret = new wxString[9];
-
- ret[0] = line.Mid(0, 10).Trim();
- ret[1] = line.Mid(12, 2).Trim();
- ret[2] = line.Mid(15, 8).Trim();
- ret[3] = line.Mid(24, 8).Trim();
- ret[4] = line.Mid(32, 8).Trim();
- ret[5] = line.Mid(42, 19).Trim();
- ret[6] = line.Mid(62, 1);
- ret[7] = line.Mid(63).Trim();
-
- if (ret[6] == " ") ret[6] = "";
-
- if (ret[7].GetChar(ret[7].Length()-1) == '/') {
- ret[8] = ret[7];
- ret[8].RemoveLast();
- ret[8] = ret[7].Mid(ret[8].Find('/', true)+1);
+ wxStringTokenizer tkz(line, wxT(","));
+
+ if (!tkz.HasMoreTokens())
+ return false;
+ entry->perm = tkz.GetNextToken();
+
+ if (!tkz.HasMoreTokens())
+ return false;
+ entry->nlink = tkz.GetNextToken();
+
+ if (!tkz.HasMoreTokens())
+ return false;
+ entry->user = tkz.GetNextToken();
+
+ if (!tkz.HasMoreTokens())
+ return false;
+ entry->group = tkz.GetNextToken();
+
+ if (!tkz.HasMoreTokens())
+ return false;
+ entry->size = tkz.GetNextToken();
+
+ if (!tkz.HasMoreTokens())
+ return false;
+ entry->date = tkz.GetNextToken();
+
+ if (!tkz.HasMoreTokens())
+ return false;
+ wxString marked = tkz.GetNextToken();
+ if (marked == wxT("*")) {
+ entry->marked = 1;
+ }
+ else if (marked == wxT("+")) {
+ entry->marked = 2;
}
else {
- ret[8] = ret[7].Mid(ret[7].Find('/', true)+1);
+ entry->marked = 0;
+ }
+
+ if (!tkz.HasMoreTokens())
+ return false;
+ entry->fullname = tkz.GetString();
+
+ /* Get only the filename (cut path by finding the last '/') */
+ if (IsPathSeparator(entry->fullname.GetChar(entry->fullname.Length()-1))) {
+ wxString tmp = entry->fullname;
+ tmp.RemoveLast();
+ entry->filename = entry->fullname.Mid(tmp.Find('/', true)+1);
+ }
+ else {
+ entry->filename = entry->fullname.Mid(entry->fullname.Find('/', true)+1);
}
- return ret;
+ return true;
}
/* Sets a list item state, and update its parents and children if it is a directory */
-void wxbRestorePanel::SetListItemState(long listitem, int newstate) {
+void wxbRestorePanel::SetListItemState(long listitem, int newstate)
+{
wxbTreeItemData* itemdata = (wxbTreeItemData*)list->GetItemData(listitem);
wxTreeItemId treeitem;
/* Sets a tree item state, and update its children, parents and list (if necessary) */
void wxbRestorePanel::SetTreeItemState(wxTreeItemId item, int newstate) {
+#if wxCHECK_VERSION(2, 6, 0)
+ wxTreeItemIdValue cookie;
+#else
long cookie;
+#endif
wxTreeItemId currentChild = tree->GetFirstChild(item, cookie);
wxbTreeItemData* itemdata;
int state = 0;
+#if wxCHECK_VERSION(2, 6, 0)
+ wxTreeItemIdValue cookie;
+#else
long cookie;
+#endif
wxTreeItemId currentChild = tree->GetFirstChild(item, cookie);
bool onechildmarked = false;
bool match;
for (int i = current.Count()-1; i >= 0; i--) {
+#if wxCHECK_VERSION(2, 6, 0)
+ wxTreeItemIdValue cookie;
+#else
long cookie;
+#endif
wxTreeItemId currentChild = tree->GetFirstChild(item, cookie);
match = false;
while (currentChild.IsOk()) {
- if (tree->GetItemText(currentChild) == current[i]) {
+ if (((wxbTreeItemData*)tree->GetItemData(currentChild))->GetName() == current[i]) {
item = currentChild;
match = true;
break;
/* Update first config, adapting settings to the job name selected */
void wxbRestorePanel::UpdateFirstConfig() {
configPanel->Enable(false);
- wxbDataTokenizer* dt = wxbUtils::WaitForEnd(wxString(".defaults job=") + configPanel->GetRowString("Job Name") + "\n", true, false);
+ wxbDataTokenizer* dt = wxbUtils::WaitForEnd(wxString(wxT(".defaults job=")) + configPanel->GetRowString(_("Job Name")) + wxT("\n"), true, false);
/* job=RestoreFiles
* pool=Default
* messages=Standard
* where=/tmp/bacula-restores
* level=0
* type=Restore
- * fileset=Full Set */
+ * fileset=***
+ */
wxString name, str;
unsigned int i;
str = (*dt)[i];
if ((j = str.Find('=')) > -1) {
name = str.Mid(0, j);
- if (name == "pool") {
- configPanel->SetRowString("Pool", str.Mid(j+1));
+ if (name == wxT("pool")) {
+ configPanel->SetRowString(_("Pool"), str.Mid(j+1));
}
- else if (name == "client") {
+ else if (name == wxT("client")) {
str = str.Mid(j+1);
- if ((str != configPanel->GetRowString("Client")) || (configPanel->GetRowString("Before") == "")) {
- configPanel->SetRowString("Client", str);
+ if ((str != configPanel->GetRowString(_("Client"))) ||
+ (configPanel->GetRowString(_("Before"))) == wxT("")) {
+ configPanel->SetRowString(_("Client"), str);
dolistjobs = true;
}
}
- else if (name == "storage") {
- configPanel->SetRowString("Storage", str.Mid(j+1));
+ else if (name == wxT("storage")) {
+ configPanel->SetRowString(_("Storage"), str.Mid(j+1));
}
- else if (name == "fileset") {
- configPanel->SetRowString("Fileset", str.Mid(j+1));
+ else if (name == wxT("fileset")) {
+ str = str.Mid(j+1);
+ if ((str != configPanel->GetRowString(_("Fileset"))) ||
+ (configPanel->GetRowString(_("Before"))) == wxT("")) {
+ configPanel->SetRowString(_("Fileset"), str);
+ dolistjobs = true;
+ }
}
}
}
bool wxbRestorePanel::UpdateSecondConfig(wxbDataTokenizer* dt) {
unsigned int i;
for (i = 0; i < dt->GetCount(); i++) {
- if ((*dt)[i].Find("Run Restore job") == 0)
+ if ((*dt)[i].Find(_("Run Restore job")) == 0)
break;
}
int k;
- if ((k = (*dt)[++i].Find("JobName:")) != 0) return false;
- restorePanel->SetRowString("Job Name", (*dt)[i].Mid(10).Trim(false).RemoveLast());
- if ((k = (*dt)[++i].Find("Bootstrap:")) != 0) return false;
- restorePanel->SetRowString("Bootstrap", (*dt)[i].Mid(10).Trim(false).RemoveLast());
- if ((k = (*dt)[++i].Find("Where:")) != 0) return false;
- restorePanel->SetRowString("Where", (*dt)[i].Mid(10).Trim(false).RemoveLast());
+ if ((k = (*dt)[++i].Find(_("JobName:"))) != 0) return false;
+ restorePanel->SetRowString(_("Job Name"), (*dt)[i].Mid(10).Trim(false).RemoveLast());
+ if ((k = (*dt)[++i].Find(_("Bootstrap:"))) != 0) return false;
+ restorePanel->SetRowString(_("Bootstrap"), (*dt)[i].Mid(10).Trim(false).RemoveLast());
+ if ((k = (*dt)[++i].Find(_("Where:"))) != 0) return false;
+ restorePanel->SetRowString(_("Where"), (*dt)[i].Mid(10).Trim(false).RemoveLast());
- if ((k = (*dt)[++i].Find("Replace:")) != 0) return false;
+ if ((k = (*dt)[++i].Find(_("Replace:"))) != 0) return false;
wxString str = (*dt)[i].Mid(10).Trim(false).RemoveLast();
- if (str == "always") restorePanel->SetRowSelection("Replace", 0);
- else if (str == "ifnewer") restorePanel->SetRowSelection("Replace", 1);
- else if (str == "ifolder") restorePanel->SetRowSelection("Replace", 2);
- else if (str == "never") restorePanel->SetRowSelection("Replace", 3);
- else restorePanel->SetRowSelection("Replace", 0);
-
- if ((k = (*dt)[++i].Find("FileSet:")) != 0) return false;
- restorePanel->SetRowString("Fileset", (*dt)[i].Mid(10).Trim(false).RemoveLast());
- if ((k = (*dt)[++i].Find("Client:")) != 0) return false;
- restorePanel->SetRowString("Client", (*dt)[i].Mid(10).Trim(false).RemoveLast());
- if ((k = (*dt)[++i].Find("Storage:")) != 0) return false;
- 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());
- if ((k = (*dt)[++i].Find("Priority:")) != 0) return false;
- restorePanel->SetRowString("Priority", (*dt)[i].Mid(10).Trim(false).RemoveLast());
+ if (str == _("always")) restorePanel->SetRowSelection(_("Replace"), 0);
+ else if (str == _("ifnewer")) restorePanel->SetRowSelection(_("Replace"), 1);
+ else if (str == _("ifolder")) restorePanel->SetRowSelection(_("Replace"), 2);
+ else if (str == _("never")) restorePanel->SetRowSelection(_("Replace"), 3);
+ else restorePanel->SetRowSelection(_("Replace"), 0);
+
+ if ((k = (*dt)[++i].Find(_("FileSet:"))) != 0) return false;
+ restorePanel->SetRowString(_("Fileset"), (*dt)[i].Mid(10).Trim(false).RemoveLast());
+ if ((k = (*dt)[++i].Find(_("Client:"))) != 0) return false;
+ restorePanel->SetRowString(_("Client"), (*dt)[i].Mid(10).Trim(false).RemoveLast());
+ if ((k = (*dt)[++i].Find(_("Storage:"))) != 0) return false;
+ 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;
restorePanel->Layout();
configPanel->Layout();
centerSizer->Layout();
this->Layout();
- start->SetLabel("Enter restore mode");
+ start->SetLabel(_("Enter restore mode"));
start->Enable(false);
configPanel->Enable(false);
tree->Enable(false);
this->Layout();
tree->DeleteAllItems();
list->DeleteAllItems();
- configPanel->ClearRowChoices("Client");
- configPanel->ClearRowChoices("Before");
+ configPanel->ClearRowChoices(_("Client"));
+ configPanel->ClearRowChoices(_("Before"));
wxbMainFrame::GetInstance()->EnablePanels();
newstatus = activable;
case activable:
cancelled = 0;
- start->SetLabel("Enter restore mode");
+ start->SetLabel(_("Enter restore mode"));
start->Enable(true);
configPanel->Enable(false);
tree->Enable(false);
wxbMainFrame::GetInstance()->DisablePanels(this);
gauge->SetValue(0);
start->Enable(false);
- //start->SetLabel("Choose files to restore");
+ //start->SetLabel(_("Choose files to restore"));
configPanel->Enable(true);
tree->Enable(false);
list->Enable(false);
cfgUpdated = 0;
break;
case listing:
-
break;
case choosing:
start->Enable(true);
- start->SetLabel("Restore");
+ start->SetLabel(_("Restore"));
centerSizer->Remove(configPanel);
configPanel->Show(false);
centerSizer->Add(treelistPanel, 1, wxEXPAND);
centerSizer->Layout();
this->Layout();
restorePanel->EnableApply(false);
+ cancel->Enable(true);
break;
case restoring:
- start->SetLabel("Restoring...");
+ start->SetLabel(_("Restoring..."));
gauge->Enable(true);
gauge->SetValue(0);
start->Enable(false);
void wxbRestorePanel::OnStart(wxCommandEvent& event) {
if (IsWorking()) {
- AddPendingEvent(event);
return;
}
SetWorking(true);
void wxbRestorePanel::OnTreeChanging(wxTreeEvent& event) {
if (IsWorking()) {
- AddPendingEvent(event);
event.Veto();
}
}
void wxbRestorePanel::OnTreeExpanding(wxTreeEvent& event) {
if (IsWorking()) {
- AddPendingEvent(event);
event.Veto();
return;
}
void wxbRestorePanel::OnTreeChanged(wxTreeEvent& event) {
if (IsWorking()) {
- AddPendingEvent(event);
return;
}
if (currentTreeItem == event.GetItem()) {
treeadd->Enable(false);
treeremove->Enable(false);
treerefresh->Enable(false);
- markWhenListingDone = false;
+ markWhenCommandDone = false;
SetWorking(true);
currentTreeItem = event.GetItem();
CmdList(event.GetItem());
- if (markWhenListingDone) {
+ if (markWhenCommandDone) {
CmdMark(event.GetItem(), NULL, 0);
tree->Refresh();
}
}
void wxbRestorePanel::OnTreeMarked(wxbTreeMarkedEvent& event) {
- csprint("Tree marked", CS_DEBUG);
if (IsWorking()) {
if (tree->GetSelection() == event.GetItem()) {
- markWhenListingDone = !markWhenListingDone;
+ markWhenCommandDone = !markWhenCommandDone;
}
- AddPendingEvent(event);
return;
}
SetWorking(true);
+ markWhenCommandDone = false;
CmdMark(event.GetItem(), NULL, 0);
- //event.Skip();
+ if (markWhenCommandDone) {
+ CmdMark(event.GetItem(), NULL, 0);
+ tree->Refresh();
+ }
tree->Refresh();
SetWorking(false);
if (event.GetItem().IsOk()) {
void wxbRestorePanel::OnTreeAdd(wxCommandEvent& event) {
if (IsWorking()) {
- AddPendingEvent(event);
return;
}
void wxbRestorePanel::OnTreeRemove(wxCommandEvent& event) {
if (IsWorking()) {
- AddPendingEvent(event);
return;
}
void wxbRestorePanel::OnTreeRefresh(wxCommandEvent& event) {
if (IsWorking()) {
- AddPendingEvent(event);
return;
}
void wxbRestorePanel::OnListMarked(wxbListMarkedEvent& event) {
if (IsWorking()) {
- AddPendingEvent(event);
- //event.Skip();
return;
}
num++;
item = list->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
}
-
+
CmdMark(wxTreeItemId(), items, num);
delete[] items;
void wxbRestorePanel::OnListActivated(wxListEvent& event) {
if (IsWorking()) {
- AddPendingEvent(event);
- //event.Skip();
return;
}
SetWorking(true);
wxString itemStr;
+#if wxCHECK_VERSION(2, 6, 0)
+ wxTreeItemIdValue cookie;
+#else
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()) {
- wxString name2 = tree->GetItemText(currentChild);
+ wxString name2 = ((wxbTreeItemData*)tree->GetItemData(currentChild))->GetName();
if (name2 == name) {
//tree->UnselectAll();
SetWorking(false);
void wxbRestorePanel::OnListChanged(wxListEvent& event) {
if (IsWorking()) {
- AddPendingEvent(event);
return;
}
void wxbRestorePanel::OnListAdd(wxCommandEvent& event) {
if (IsWorking()) {
- AddPendingEvent(event);
return;
}
void wxbRestorePanel::OnListRemove(wxCommandEvent& event) {
if (IsWorking()) {
- AddPendingEvent(event);
return;
}
listremove->Enable(false);
}
-void wxbRestorePanel::OnListRefresh(wxCommandEvent& event) {
+void wxbRestorePanel::OnListRefresh(wxCommandEvent& event)
+{
if (IsWorking()) {
- AddPendingEvent(event);
return;
}
SetWorking(false);
}
-void wxbRestorePanel::OnConfigUpdated(wxCommandEvent& event) {
+void wxbRestorePanel::OnConfigUpdated(wxCommandEvent& event)
+{
if (status == entered) {
if (event.GetId() == ConfigJobName) {
if (IsWorking()) {
UpdateFirstConfig();
SetWorking(false);
}
- else if (event.GetId() == ConfigClient) {
+ else if ((event.GetId() == ConfigClient) || (event.GetId() == ConfigFileset)) {
if (IsWorking()) {
return;
}
CmdConfigCancel();
SetWorking(false);
}
-