X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fqt-console%2Frestore%2Frestore.cpp;h=144a17667a019a18605fcf20a2ccefda97590d0a;hb=18800f5ea61b6d6dc86ec610b41ad159a6f20918;hp=f6185b746b2838e6165ffa736475826112b91823;hpb=013c56ab7ebbac4e995ab2926409c79f4af02919;p=bacula%2Fbacula diff --git a/bacula/src/qt-console/restore/restore.cpp b/bacula/src/qt-console/restore/restore.cpp index f6185b746b..144a17667a 100644 --- a/bacula/src/qt-console/restore/restore.cpp +++ b/bacula/src/qt-console/restore/restore.cpp @@ -31,114 +31,57 @@ * * Restore Class * - * Kern Sibbald, February MMVI + * Kern Sibbald, February MMVII * */ #include "bat.h" #include "restore.h" - -prerestoreDialog::prerestoreDialog(Console *console) +restoreDialog::restoreDialog(Console *console) { - m_console = console; /* keep compiler quiet */ + QStringList titles; + m_console = console; + + m_console->setEnabled(false); 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))); - - this->show(); -} - -void prerestoreDialog::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); - delete this; - new restoreDialog(m_console); -} - - -void prerestoreDialog::reject() -{ - mainWin->set_status("Canceled"); - this->hide(); - delete 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(); -void prerestoreDialog::job_name_change(int index) -{ - 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)); - } -} + titles << "Mark" << "File" << "Mode" << "User" << "Group" << "Size" << "Date"; + fileWidget->setHeaderLabels(titles); -restoreDialog::restoreDialog(Console *console) -{ - m_console = console; - setupUi(this); - fillDirectory("/"); + get_cwd(); + fillDirectory(); this->show(); } /* - * Fill the CList box with files at path + * Fill the fileWidget box with the contents of the current directory */ -void restoreDialog::fillDirectory(const char *path) +void restoreDialog::fillDirectory() { - char pathbuf[MAXSTRING]; char modes[20], user[20], group[20], size[20], date[30]; - char file[1000]; char marked[10]; - int row = 0; - - m_console->setEnabled(false); - m_fname = path; + int pnl, fnl; + POOLMEM *file = get_pool_memory(PM_FNAME); + POOLMEM *path = get_pool_memory(PM_FNAME); - - m_console->displayToPrompt(); - bsnprintf(pathbuf, sizeof(pathbuf), "cd %s", path); - Dmsg1(100, "%s\n", pathbuf); - - m_console->write(pathbuf); - m_console->display_text(pathbuf); - m_console->displayToPrompt(); - - m_console-> write_dir("dir"); - m_console->display_text("dir"); + 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 == '$') { - break; - } - Dmsg1(200, "Got: %s\n", p); - if (!*p) { + if (*p == '$' || !*p) { continue; } l = p; @@ -172,23 +115,153 @@ void restoreDialog::fillDirectory(const char *path) bstrncpy(date, l, sizeof(date)); skip_spaces(&p); if (*p == '*') { - bstrncpy(marked, "x", sizeof(marked)); + bstrncpy(marked, "*", sizeof(marked)); p++; } else { bstrncpy(marked, " ", sizeof(marked)); } -// split_path_and_filename(p, &restore->path, &restore->pnl, -// &restore->file, &restore->fnl); + 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 restoreDialog::accept() +{ + this->hide(); + m_console->write("done"); + delete this; + m_console->setEnabled(true); + mainWin->resetFocus(); +} + + +void restoreDialog::reject() +{ + 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(); + } +} -// Dmsg1(000, "restore->fname=%s\n", restore->fname); -// bstrncpy(file, restore->file, sizeof(file)); - printf("modes=%s user=%s group=%s size=%s date=%s file=%s\n", - modes, user, group, size, date, file); +void restoreDialog::upButtonPushed() +{ + cwd(".."); + fillDirectory(); +} -// append to list +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(); + } +} - row++; +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(); } +} - m_console->setEnabled(true); +/* + * 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 */ +} + +/* + * Return cwd when in tree restore mode + */ +char *restoreDialog::get_cwd() +{ + 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(); }