From: Landon F. <la...@us...> - 2005-10-23 23:44:55
|
Update of /cvsroot/bacula/bacula/src/wx-console In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19645/src/wx-console Modified Files: Tag: Branch-1_38-encryption console_thread.cpp csprint.h wxbmainframe.cpp wxbrestorepanel.cpp wxbrestorepanel.h Log Message: Merge changes from HEAD as of Oct 23 23:42:42 UTC 2005 This includes a fix for the volume labeling bug that broke the regression tests. Index: wxbmainframe.cpp =================================================================== RCS file: /cvsroot/bacula/bacula/src/wx-console/wxbmainframe.cpp,v retrieving revision 1.45 retrieving revision 1.45.4.1 diff -u -d -r1.45 -r1.45.4.1 --- wxbmainframe.cpp 27 Aug 2005 22:37:09 -0000 1.45 +++ wxbmainframe.cpp 23 Oct 2005 23:44:39 -0000 1.45.4.1 @@ -568,6 +568,13 @@ EnableConsole(false); } + if (status == CS_REMOVEPROMPT) { + if (consoleCtrl->GetLastPosition() > 0) { + consoleCtrl->Remove(consoleCtrl->GetLastPosition()-1, consoleCtrl->GetLastPosition()+1); + } + return; + } + if (status == CS_TERMINATED) { consoleCtrl->AppendText(consoleBuffer); consoleBuffer = wxT(""); @@ -679,6 +686,8 @@ Send(wxString() << choices[res] << wxT("\n")); } } + delete[] choices; + delete[] numbers; } else { Send(::wxGetTextFromUser(message, @@ -714,7 +723,7 @@ if (lockedbyconsole) { EnableConsole(true); } - //consoleBuffer << "<P>"; + //consoleBuffer << wxT("<P>"); } if ((status == CS_END) || (status == CS_PROMPT) || (str.Find(wxT("\n")) > -1)) { Index: console_thread.cpp =================================================================== RCS file: /cvsroot/bacula/bacula/src/wx-console/console_thread.cpp,v retrieving revision 1.38 retrieving revision 1.38.4.1 diff -u -d -r1.38 -r1.38.4.1 --- console_thread.cpp 27 Aug 2005 14:33:39 -0000 1.38 +++ console_thread.cpp 23 Oct 2005 23:44:39 -0000 1.38.4.1 @@ -427,13 +427,30 @@ csprint(NULL, CS_CONNECTED); + Write("autodisplay on\n"); Write(".messages\n"); int stat; + int last_is_eod = 0; /* Last packet received is BNET_EOD */ + int do_not_forward_eod = 0; /* Last packet received/sent is .messages, so don't forward EOD. (so wx-console don't show the prompt again) */ + /* main loop */ while(!TestDestroy()) { /* Tests if thread has been ended */ + stat = bnet_wait_data(UA_sock, 10); + if (stat == 0) { + if (last_is_eod) { + Write(".messages\n"); + do_not_forward_eod = 1; + } + continue; + } + + last_is_eod = 0; if ((stat = bnet_recv(UA_sock)) >= 0) { + if (do_not_forward_eod) { /* .messages got data: remove the prompt */ + csprint(NULL, CS_REMOVEPROMPT); + } csprint(UA_sock->msg); } else if (stat == BNET_SIGNAL) { @@ -441,7 +458,9 @@ csprint(NULL, CS_PROMPT); } else if (UA_sock->msglen == BNET_EOD) { - csprint(NULL, CS_END); + last_is_eod = 1; + if (!do_not_forward_eod) + csprint(NULL, CS_END); } else if (UA_sock->msglen == BNET_HEARTBEAT) { bnet_sig(UA_sock, BNET_HB_RESPONSE); @@ -462,6 +481,8 @@ csprint(NULL, CS_END); break; /* error or term */ } + + do_not_forward_eod = 0; } csprint(NULL, CS_DISCONNECTED); @@ -482,9 +503,9 @@ void console_thread::Write(const char* str) { if (UA_sock) { - UA_sock->msglen = (int32_t)strlen(str); - pm_strcpy(&UA_sock->msg, str); - bnet_send(UA_sock); + UA_sock->msglen = (int32_t)strlen(str); + pm_strcpy(&UA_sock->msg, str); + bnet_send(UA_sock); } else if (choosingdirector) { // wxString number = str; // number.RemoveLast(); /* Removes \n */ Index: wxbrestorepanel.h =================================================================== RCS file: /cvsroot/bacula/bacula/src/wx-console/wxbrestorepanel.h,v retrieving revision 1.21 retrieving revision 1.21.4.1 diff -u -d -r1.21 -r1.21.4.1 --- wxbrestorepanel.h 24 Mar 2005 14:56:35 -0000 1.21 +++ wxbrestorepanel.h 23 Oct 2005 23:44:39 -0000 1.21.4.1 @@ -50,6 +50,20 @@ WX_DECLARE_LIST(wxEvent, wxbEventList); +/* Class for storing directory entries (results from dir commands). */ +class wxbDirEntry { +public: + wxString perm; + wxString nlink; + wxString user; + wxString group; + wxString size; + wxString date; + int marked; /* 0 - Not Marked, 1 - Marked, 2 - Some file under is marked */ + wxString fullname; /* full name with path */ + wxString filename; /* only filename, no path */ +}; + /* * wxbPanel for restoring files */ @@ -100,7 +114,7 @@ void UpdateTreeItem(wxTreeItemId item, bool updatelist, bool recurse); /* Parse dir command results. */ - wxString* ParseList(wxString line); + int ParseList(wxString line, wxbDirEntry* entry); /* Sets a list item state, and update its parents and children if it is a directory */ void SetListItemState(long listitem, int newstate); Index: wxbrestorepanel.cpp =================================================================== RCS file: /cvsroot/bacula/bacula/src/wx-console/wxbrestorepanel.cpp,v retrieving revision 1.55 retrieving revision 1.55.2.1 diff -u -d -r1.55 -r1.55.2.1 --- wxbrestorepanel.cpp 15 Oct 2005 16:24:32 -0000 1.55 +++ wxbrestorepanel.cpp 23 Oct 2005 23:44:39 -0000 1.55.2.1 @@ -78,18 +78,14 @@ 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 */ @@ -104,13 +100,6 @@ 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; @@ -120,18 +109,6 @@ return marked; } -void wxbTreeItemData::SetMarked(wxString marked) { - if (marked == wxT("*")) { - this->marked = 1; - } - else if (marked == wxT("+")) { - this->marked = 2; - } - else { - this->marked = 0; - } -} - void wxbTreeItemData::SetMarked(int marked) { this->marked = marked; } @@ -148,25 +125,6 @@ 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 // ---------------------------------------------------------------------------- @@ -725,7 +683,60 @@ int j; dt = new wxbDataTokenizer(true); - wxbUtils::WaitForPrompt(wxT("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, + _("wx-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, + _("wx-console: unexpected restore question."), + wxT(""), this) + wxT("\n")); + } + } + printf("promptparser->getChoices()=%ld", (long)promptparser->getChoices()); + + delete promptparser; SetStatus(configuring); @@ -835,7 +846,8 @@ char status = '?'; wxStopWatch sw; - + + wxbUtils::WaitForEnd(wxT("autodisplay off\n")); while (true) { tableparser = wxbUtils::CreateAndWaitForParser(cmd); ended = false; @@ -912,7 +924,7 @@ } delete tableparser; - dt = wxbUtils::WaitForEnd(wxT(".messages\n"), true); + dt = wxbUtils::WaitForEnd(wxT("messages\n"), true); for (unsigned int i = 0; i < dt->GetCount(); i++) { wxStringTokenizer tkz((*dt)[i], wxT(" "), wxTOKEN_STRTOK); @@ -960,7 +972,7 @@ break; } } - + wxbUtils::WaitForEnd(wxT("autodisplay on\n")); wxbUtils::WaitForEnd(wxT(".messages\n")); gauge->SetValue(totfilemessages); @@ -1166,7 +1178,7 @@ 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")); @@ -1174,7 +1186,8 @@ wxbUtils::WaitForPrompt("6\n");*/ wxbTableParser* tableparser = new wxbTableParser(false); wxbDataTokenizer* dt = wxbUtils::WaitForEnd( - wxString(wxT(".backups client=")) + configPanel->GetRowString(_("Client")) + wxT("\n"), true); + wxString(wxT(".backups client=\"")) + configPanel->GetRowString(_("Client")) + + wxT("\" fileset=\"") + configPanel->GetRowString(_("Fileset")) + wxT("\"\n"), true); while (!tableparser->hasFinished()) { wxTheApp->Yield(true); @@ -1207,11 +1220,13 @@ delete dt; + wxDateTime lastdatetime = (time_t) 0; for (int i = tableparser->GetCount()-1; i > -1; i--) { wxString str = (*tableparser)[i][3]; wxDateTime datetime; const wxChar* chr; - if ( ( (chr = datetime.ParseDate(str.GetData()) ) != NULL ) && ( datetime.ParseTime(++chr) != NULL ) ) { + if ( ( (chr = datetime.ParseDate(str.GetData()) ) != NULL ) && ( datetime.ParseTime(++chr) != NULL ) && ! lastdatetime.IsEqualTo(datetime) ) { + lastdatetime = datetime; datetime += wxTimeSpan::Seconds(1); configPanel->AddRowChoice(_("Before"), datetime.Format(wxT("%Y-%m-%d %H:%M:%S"))); @@ -1397,7 +1412,7 @@ if (updatelist) list->DeleteAllItems(); - dt = wxbUtils::WaitForEnd(wxT("dir\n"), true); + dt = wxbUtils::WaitForEnd(wxT(".dir\n"), true); wxString str; @@ -1410,14 +1425,14 @@ 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 (entry.fullname.GetChar(entry.fullname.Length()-1) == '/') { wxString itemStr; #if wxCHECK_VERSION(2, 6, 0) @@ -1432,12 +1447,11 @@ while (treeid.IsOk()) { itemStr = ((wxbTreeItemData*)tree->GetItemData(treeid))->GetName(); - 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]); + if (entry.fullname == 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); @@ -1449,25 +1463,22 @@ } if (!updated) { - int img = wxbTreeItemData::GetMarkedStatus(file[6]); - treeid = tree->AppendItem(item, wxbUtils::ConvertToPrintable(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.filename, entry.fullname, 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.filename, entry.fullname, entry.marked, ind); data->SetId(treeid); list->SetItemData(ind, (long)data); - list->SetItem(ind, 1, wxbUtils::ConvertToPrintable(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; @@ -1476,55 +1487,65 @@ status = choosing; } -/* Parse dir command results. */ - -/* - * It sure would be nice to have some comments here, especially - * when setting up ret[7] and ret[8]. - * Also, it would be a lot easier for everyone if this were based - * on variable width fields everywhere. All the fields except - * the last (filename) are separated by spaces (the date is - * composed of two blank terminated fields date + time. - */ -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 111 root root 0 2004-04-03 14:35:21 f:/tocd/NVSU 1.00.00/ - //+ 10 + +i+ + 8 + + 8 ++ 10 + + 19 + *+ -> - //0 12 i+15 i+24 i+32 i+42 i+62 - - int i; - - if (line.Length() < 63) - return NULL; - - wxString* ret = new wxString[9]; + //-rw-r-----,1,root,root,41575,2005-10-18 18:21:36, ,/usr/var/bacula/working/bacula.sql - ret[0] = line.Mid(0, 10).Trim(); // modes + wxStringTokenizer tkz(line, wxT(",")); - /* Column 1 has a variable width */ - i = line.find(' ', 14) - 14; - ret[1] = line.Mid(12, 2+i).Trim(); // number of links + if (!tkz.HasMoreTokens()) + return false; + entry->perm = tkz.GetNextToken(); - ret[2] = line.Mid(15+i, 8).Trim(); // user - ret[3] = line.Mid(24+i, 8).Trim(); // group - ret[4] = line.Mid(32+i, 10).Trim(); // file size - ret[5] = line.Mid(42+i, 19).Trim(); // date + time - ret[6] = line.Mid(63+i, 1); // drive letter or / - ret[7] = line.Mid(63+i).Trim(); // filename + if (!tkz.HasMoreTokens()) + return false; + entry->nlink = tkz.GetNextToken(); - if (ret[6] == wxT(" ")) ret[6] = wxT(""); - - 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); + 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.GetNextToken(); + + /* Get only the filename (cut path by finding the last '/') */ + if (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 */ @@ -1744,7 +1765,8 @@ * where=/tmp/bacula-restores * level=0 * type=Restore - * fileset=Full Set */ + * fileset=*** + */ wxString name, str; unsigned int i; @@ -1771,7 +1793,12 @@ configPanel->SetRowString(_("Storage"), str.Mid(j+1)); } else if (name == wxT("fileset")) { - configPanel->SetRowString(_("Fileset"), str.Mid(j+1)); + str = str.Mid(j+1); + if ((str != configPanel->GetRowString(_("Fileset"))) || + (configPanel->GetRowString(_("Before"))) == wxT("")) { + configPanel->SetRowString(_("Fileset"), str); + dolistjobs = true; + } } } } @@ -2329,7 +2356,7 @@ UpdateFirstConfig(); SetWorking(false); } - else if (event.GetId() == ConfigClient) { + else if ((event.GetId() == ConfigClient) || (event.GetId() == ConfigFileset)) { if (IsWorking()) { return; } Index: csprint.h =================================================================== RCS file: /cvsroot/bacula/bacula/src/wx-console/csprint.h,v retrieving revision 1.7 retrieving revision 1.7.4.1 diff -u -d -r1.7 -r1.7.4.1 --- csprint.h 13 May 2005 14:38:17 -0000 1.7 +++ csprint.h 23 Oct 2005 23:44:39 -0000 1.7.4.1 @@ -34,6 +34,9 @@ #define CS_PROMPT 3 /* prompt signal received */ #define CS_CONNECTED 4 /* the socket is now connected */ #define CS_DISCONNECTED 5 /* the socket is now disconnected */ + +#define CS_REMOVEPROMPT 6 /* remove the prompt (#), when automatic messages are comming */ + #define CS_DEBUG 10 /* used to print debug messages */ #define CS_TERMINATED 99 /* used to signal that the thread is terminated */ |