X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fqt-console%2Frestore%2Frestore.cpp;h=144a17667a019a18605fcf20a2ccefda97590d0a;hb=18800f5ea61b6d6dc86ec610b41ad159a6f20918;hp=f37891d1fb458243d81e78a3d435eded04f93533;hpb=845fed839318e45116663db1b182f8d505c616c9;p=bacula%2Fbacula diff --git a/bacula/src/qt-console/restore/restore.cpp b/bacula/src/qt-console/restore/restore.cpp index f37891d1fb..144a17667a 100644 --- a/bacula/src/qt-console/restore/restore.cpp +++ b/bacula/src/qt-console/restore/restore.cpp @@ -27,77 +27,241 @@ */ /* - * Version $Id: restore.cpp 0 2007-02-12 10:39:38Z kerns $ + * Version $Id$ * * Restore Class * - * Kern Sibbald, February MMVI + * Kern Sibbald, February MMVII * */ #include "bat.h" #include "restore.h" -restoreDialog::restoreDialog(Console *parent) +restoreDialog::restoreDialog(Console *console) { - (void)parent; /* keep compiler quiet */ + QStringList titles; + m_console = console; + + m_console->setEnabled(false); setupUi(this); + connect(fileWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), + this, SLOT(fileDoubleClicked(QTreeWidgetItem *, int))); + connect(upButton, SIGNAL(pressed()), this, SLOT(upButtonPushed())); + connect(markButton, SIGNAL(pressed()), this, SLOT(markButtonPushed())); + connect(unmarkButton, SIGNAL(pressed()), this, SLOT(unmarkButtonPushed())); + setFont(m_console->get_font()); + m_console->displayToPrompt(); + + + titles << "Mark" << "File" << "Mode" << "User" << "Group" << "Size" << "Date"; + fileWidget->setHeaderLabels(titles); + + get_cwd(); + fillDirectory(); this->show(); } -prerestoreDialog::prerestoreDialog(Console *console) +/* + * Fill the fileWidget box with the contents of the current directory + */ +void restoreDialog::fillDirectory() { - m_console = console; /* keep compiler quiet */ - setupUi(this); - jobCombo->addItems(console->job_list); - filesetCombo->addItems(console->fileset_list); - clientCombo->addItems(console->client_list); - poolCombo->addItems(console->pool_list); - storageCombo->addItems(console->storage_list); - job_name_change(0); - connect(jobCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(job_name_change(int))); + char modes[20], user[20], group[20], size[20], date[30]; + char marked[10]; + int pnl, fnl; + POOLMEM *file = get_pool_memory(PM_FNAME); + POOLMEM *path = get_pool_memory(PM_FNAME); - this->show(); + fileWidget->clear(); + m_console->write_dir("dir"); + QList items; + QStringList item; + while (m_console->read() > 0) { + char *p = m_console->msg(); + char *l; + strip_trailing_junk(p); + if (*p == '$' || !*p) { + continue; + } + l = p; + skip_nonspaces(&p); /* permissions */ + *p++ = 0; + bstrncpy(modes, l, sizeof(modes)); + skip_spaces(&p); + skip_nonspaces(&p); /* link count */ + *p++ = 0; + skip_spaces(&p); + l = p; + skip_nonspaces(&p); /* user */ + *p++ = 0; + skip_spaces(&p); + bstrncpy(user, l, sizeof(user)); + l = p; + skip_nonspaces(&p); /* group */ + *p++ = 0; + bstrncpy(group, l, sizeof(group)); + skip_spaces(&p); + l = p; + skip_nonspaces(&p); /* size */ + *p++ = 0; + bstrncpy(size, l, sizeof(size)); + skip_spaces(&p); + l = p; + skip_nonspaces(&p); /* date/time */ + skip_spaces(&p); + skip_nonspaces(&p); + *p++ = 0; + bstrncpy(date, l, sizeof(date)); + skip_spaces(&p); + if (*p == '*') { + bstrncpy(marked, "*", sizeof(marked)); + p++; + } else { + bstrncpy(marked, " ", sizeof(marked)); + } + split_path_and_filename(p, &path, &pnl, &file, &fnl); + item.clear(); + item << marked << file << modes << user << group << size << date; + QTreeWidgetItem *ti = new QTreeWidgetItem((QTreeWidget *)0, item); + ti->setTextAlignment(5, Qt::AlignRight); /* right align size */ + items.append(ti); + } + fileWidget->clear(); + fileWidget->insertTopLevelItems(0, items); + + free_pool_memory(file); + free_pool_memory(path); } -void prerestoreDialog::accept() +void restoreDialog::accept() { - QString cmd; - this->hide(); - - cmd = QString( - "restore select current fileset=\"%1\" client=\"%2\" pool=\"%3\" " - "storage=\"%4\"\n") - .arg(filesetCombo->currentText()) - .arg(clientCombo->currentText()) - .arg(poolCombo->currentText()) - .arg(storageCombo->currentText()); - -// m_console->write(cmd); - m_console->display_text(cmd); + m_console->write("done"); delete this; + m_console->setEnabled(true); + mainWin->resetFocus(); } -void prerestoreDialog::reject() +void restoreDialog::reject() { - mainWin->set_status("Canceled"); this->hide(); + m_console->write("quit"); + mainWin->set_status("Canceled"); delete this; + m_console->setEnabled(true); + mainWin->resetFocus(); +} + +void restoreDialog::fileDoubleClicked(QTreeWidgetItem *item, int column) +{ + char cmd[1000]; + if (column == 0) { /* mark/unmark */ + if (item->text(0) == "*") { + bsnprintf(cmd, sizeof(cmd), "unmark \"%s\"", item->text(1).toUtf8().data()); + item->setText(0, " "); + } else { + bsnprintf(cmd, sizeof(cmd), "mark \"%s\"", item->text(1).toUtf8().data()); + item->setText(0, "*"); + } + m_console->write_dir(cmd); + if (m_console->read() > 0) { + strip_trailing_junk(m_console->msg()); + statusLine->setText(m_console->msg()); + } + m_console->displayToPrompt(); + return; + } + /* + * Double clicking other than column 0 means to decend into + * the directory -- or nothing if it is not a directory. + */ + if (item->text(1).endsWith("/")) { + cwd(item->text(1).toUtf8().data()); + fillDirectory(); + } +} + +void restoreDialog::upButtonPushed() +{ + cwd(".."); + fillDirectory(); +} + +void restoreDialog::markButtonPushed() +{ + QList items = fileWidget->selectedItems(); + QTreeWidgetItem *item; + char cmd[1000]; + foreach (item, items) { + bsnprintf(cmd, sizeof(cmd), "mark \"%s\"", item->text(1).toUtf8().data()); + item->setText(0, "*"); + m_console->write_dir(cmd); + if (m_console->read() > 0) { + strip_trailing_junk(m_console->msg()); + statusLine->setText(m_console->msg()); + } + Dmsg1(100, "cmd=%s\n", cmd); + m_console->discardToPrompt(); + } +} + +void restoreDialog::unmarkButtonPushed() +{ + QList items = fileWidget->selectedItems(); + QTreeWidgetItem *item; + char cmd[1000]; + foreach (item, items) { + bsnprintf(cmd, sizeof(cmd), "unmark \"%s\"", item->text(1).toUtf8().data()); + item->setText(0, " "); + m_console->write_dir(cmd); + if (m_console->read() > 0) { + strip_trailing_junk(m_console->msg()); + statusLine->setText(m_console->msg()); + } + Dmsg1(100, "cmd=%s\n", cmd); + m_console->discardToPrompt(); + } } +/* + * Change current working directory + */ +bool restoreDialog::cwd(const char *dir) +{ + int stat; + char cd_cmd[MAXSTRING]; + + bsnprintf(cd_cmd, sizeof(cd_cmd), "cd \"%s\"", dir); + Dmsg2(100, "dir=%s cmd=%s\n", dir, cd_cmd); + m_console->write_dir(cd_cmd); + if ((stat = m_console->read()) > 0) { + m_cwd = m_console->msg(); + Dmsg2(100, "cwd=%s msg=%s\n", m_cwd.toUtf8().data(), m_console->msg()); + } else { + Dmsg1(000, "stat=%d\n", stat); + } + m_console->discardToPrompt(); + lineEdit->clear(); + lineEdit->insert(m_cwd); + return true; /* ***FIXME*** return real status */ +} -void prerestoreDialog::job_name_change(int index) +/* + * Return cwd when in tree restore mode + */ +char *restoreDialog::get_cwd() { - job_defaults job_defs; - - (void)index; - job_defs.job_name = jobCombo->currentText(); - if (m_console->get_job_defaults(job_defs)) { - filesetCombo->setCurrentIndex(filesetCombo->findText(job_defs.fileset_name, Qt::MatchExactly)); - clientCombo->setCurrentIndex(clientCombo->findText(job_defs.client_name, Qt::MatchExactly)); - poolCombo->setCurrentIndex(poolCombo->findText(job_defs.pool_name, Qt::MatchExactly)); - storageCombo->setCurrentIndex(storageCombo->findText(job_defs.store_name, Qt::MatchExactly)); + int stat; + m_console->write_dir(".pwd"); + Dmsg0(100, "send: .pwd\n"); + if ((stat = m_console->read()) > 0) { + m_cwd = m_console->msg(); + Dmsg2(100, "cwd=%s msg=%s\n", m_cwd.toUtf8().data(), m_console->msg()); + } else { + Dmsg1(000, "stat=%d\n", stat); } + m_console->displayToPrompt(); + return m_cwd.toUtf8().data(); }