X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fqt-console%2Fconsole%2Fconsole.cpp;h=b0bde34df22f1b80cdcf558e37aec1eb4a9e5b4d;hb=fd18c27a531b11fcfe67c17fa0ff818c11bef3e7;hp=9048774c5b360443d90110c34a8f66769da1f8c0;hpb=8b8099f49f814f2af7588cae413ed0a407b908d3;p=bacula%2Fbacula diff --git a/bacula/src/qt-console/console/console.cpp b/bacula/src/qt-console/console/console.cpp index 9048774c5b..b0bde34df2 100644 --- a/bacula/src/qt-console/console/console.cpp +++ b/bacula/src/qt-console/console/console.cpp @@ -1,7 +1,7 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2007 Free Software Foundation Europe e.V. + Copyright (C) 2007-2007 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. @@ -25,13 +25,12 @@ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, Switzerland, email:ftf@fsfeurope.org. */ - /* * Version $Id$ * * Console Class * - * Kern Sibbald, January MMVI + * Kern Sibbald, January MMVII * */ @@ -81,9 +80,18 @@ Console::Console(QStackedWidget *parent) treeWidget->expandItem(topItem); readSettings(); + /* Check for messages every 5 seconds */ +// m_timer = new QTimer(this); +// QWidget::connect(m_timer, SIGNAL(timeout()), this, SLOT(poll_messages())); +// m_timer->start(5000); } +void Console::poll_messages() +{ + m_messages_pending = true; +} + /* Terminate any open socket */ void Console::terminate() { @@ -91,6 +99,7 @@ void Console::terminate() m_sock->close(); m_sock = NULL; } + m_timer->stop(); } /* @@ -104,17 +113,17 @@ void Console::connect() m_textEdit = textEdit; /* our console screen */ if (!m_dir) { - mainWin->set_status(" No Director found."); + mainWin->set_status("No Director found."); return; } if (m_sock) { - mainWin->set_status(" Already connected."); + mainWin->set_status("Already connected."); return; } memset(&jcr, 0, sizeof(jcr)); - mainWin->set_statusf(_(" Connecting to Director %s:%d"), m_dir->address, m_dir->DIRport); + mainWin->set_statusf(_("Connecting to Director %s:%d"), m_dir->address, m_dir->DIRport); display_textf(_("Connecting to Director %s:%d\n\n"), m_dir->address, m_dir->DIRport); /* Give GUI a chance */ @@ -147,12 +156,16 @@ void Console::connect() /* Give GUI a chance */ app->processEvents(); - mainWin->set_status(_(" Initializing ...")); + mainWin->set_status(_("Initializing ...")); /* Set up input notifier */ m_notifier = new QSocketNotifier(m_sock->fd, QSocketNotifier::Read, 0); QObject::connect(m_notifier, SIGNAL(activated(int)), this, SLOT(read_dir(int))); + write(".api"); + discardToPrompt(); + + beginNewCommand(); job_list = get_list(".jobs"); client_list = get_list(".clients"); fileset_list = get_list(".filesets"); @@ -162,7 +175,7 @@ void Console::connect() type_list = get_list(".types"); level_list = get_list(".levels"); - mainWin->set_status(_(" Connected")); + mainWin->set_status(_("Connected")); return; } @@ -183,7 +196,7 @@ QStringList Console::get_list(char *cmd) list << msg(); } setEnabled(true); - list.sort(); +// list.sort(); return list; } @@ -193,13 +206,15 @@ QStringList Console::get_list(char *cmd) */ bool Console::get_job_defaults(struct job_defaults &job_defs) { + QString scmd; char cmd[1000]; int stat; char *def; setEnabled(false); - bsnprintf(cmd, sizeof(cmd), ".defaults job=\"%s\"", job_defs.job_name.toUtf8().data()); - write(cmd); + beginNewCommand(); + scmd = QString(".defaults job=\"%1\"").arg(job_defs.job_name); + write(scmd); while ((stat = read()) > 0) { def = strchr(msg(), '='); if (!def) { @@ -331,6 +346,7 @@ const QFont Console::get_font() void Console::status_dir() { write_dir("status dir\n"); + displayToPrompt(); } /* @@ -383,12 +399,9 @@ char *Console::msg() void Console::write_dir(const char *msg) { if (m_sock) { - m_at_prompt = false; - mainWin->set_status(_(" Processing command ...")); + mainWin->set_status(_("Processing command ...")); QApplication::setOverrideCursor(Qt::WaitCursor); - m_sock->msglen = strlen(msg); - pm_strcpy(&m_sock->msg, msg); - bnet_send(m_sock); + write(msg); } else { mainWin->set_status(" Director not connected. Click on connect button."); mainWin->actionConnect->setIcon(QIcon(QString::fromUtf8("images/disconnected.png"))); @@ -397,32 +410,142 @@ void Console::write_dir(const char *msg) } } +int Console::write(const QString msg) +{ + return write(msg.toUtf8().data()); +} + int Console::write(const char *msg) { m_sock->msglen = strlen(msg); pm_strcpy(&m_sock->msg, msg); - return bnet_send(m_sock); + m_at_prompt = false; + if (commDebug) Pmsg1(000, "send: %s\n", msg); + return m_sock->send(); +} + +/* + * Get to main command prompt + */ +void Console::beginNewCommand() +{ + write(".\n"); + while (read() > 0) { + } + write(".\n"); + while (read() > 0) { + } + write(".\n"); + while (read() > 0) { + } + display_text("\n"); +} + +void Console::displayToPrompt() +{ + int stat; + if (commDebug) Pmsg0(000, "DisplaytoPrompt\n"); + m_notifier->setEnabled(false); + while ((stat = read()) > 0) { + display_text(msg()); + } + if (commDebug) Pmsg1(000, "endDisplaytoPrompt=%d\n", stat); + m_notifier->setEnabled(true); } +void Console::discardToPrompt() +{ + int stat; + if (commDebug) Pmsg0(000, "discardToPrompt\n"); + m_notifier->setEnabled(false); + while ((stat = read()) > 0) { + } + if (commDebug) Pmsg1(000, "endDisplayToPrompt=%d\n", stat); + m_notifier->setEnabled(true); +} + + /* - * Blocking read from director */ + * Blocking read from director + */ int Console::read() { - int stat; - if (m_sock) { + int stat = BNET_HARDEOF; + while (m_sock) { for (;;) { stat = bnet_wait_data_intr(m_sock, 1); if (stat > 0) { break; } app->processEvents(); - if (stat < 0) { - return BNET_ERROR; +// if (m_api_set && m_messages_pending) { +// write_dir(".messages"); +// m_messages_pending = false; +// } + } + stat = m_sock->recv(); + if (stat >= 0) { + if (m_at_prompt) { + display_text("\n"); + m_at_prompt = false; } + if (commDebug) Pmsg1(000, "got: %s", m_sock->msg); + } - return bnet_recv(m_sock); + switch (m_sock->msglen) { + case BNET_SERVER_READY: +// if (m_api_set && m_messages_pending) { +// write_dir(".messages"); +// m_messages_pending = false; +// } + m_at_prompt = true; + continue; + case BNET_MESSAGES_PENDING: + m_messages_pending = true; + continue; + case BNET_CMD_BEGIN: + m_at_prompt = false; + continue; + case BNET_PROMPT: + case BNET_CMD_OK: + if (commDebug) Pmsg0(000, "CMD OK/PROMPT\n"); + m_at_prompt = true; + mainWin->set_status(_("At prompt waiting for input ...")); + update_cursor(); + QApplication::restoreOverrideCursor(); + break; + case BNET_CMD_FAILED: + if (commDebug) Pmsg0(000, "CMD FAIL\n"); + m_at_prompt = true; + mainWin->set_status(_("Command failed. At prompt waiting for input ...")); + update_cursor(); + QApplication::restoreOverrideCursor(); + break; + case BNET_EOD: + if (commDebug) Pmsg0(000, "EOD\n"); + mainWin->set_status_ready(); + update_cursor(); + QApplication::restoreOverrideCursor(); + if (!m_api_set) { + break; + } + continue; + } + if (is_bnet_stop(m_sock)) { /* error or term request */ + m_sock->close(); + m_sock = NULL; + mainWin->actionConnect->setIcon(QIcon(QString::fromUtf8("images/disconnected.png"))); + QBrush redBrush(Qt::red); + m_consoleItem->setForeground(0, redBrush); + m_notifier->setEnabled(false); + delete m_notifier; + m_notifier = NULL; + mainWin->set_status(_("Director disconnected.")); + QApplication::restoreOverrideCursor(); + } + break; } - return BNET_HARDEOF; + return stat; } /* Called by signal when the Director has output for us */ @@ -431,40 +554,8 @@ void Console::read_dir(int fd) int stat; (void)fd; - if (!m_sock) { - return; + if (commDebug) Pmsg0(000, "read_dir\n"); + while ((stat = read()) >= 0) { + display_text(msg()); } - stat = bnet_recv(m_sock); - if (stat >= 0) { - if (m_at_prompt) { - display_text("\n"); - m_at_prompt = false; - } - display_text(m_sock->msg); - return; - } - if (is_bnet_stop(m_sock)) { /* error or term request */ - m_sock->close(); - m_sock = NULL; - mainWin->actionConnect->setIcon(QIcon(QString::fromUtf8("images/disconnected.png"))); - QBrush redBrush(Qt::red); - m_consoleItem->setForeground(0, redBrush); - m_notifier->setEnabled(false); - delete m_notifier; - m_notifier = NULL; - mainWin->set_status(_(" Director disconnected.")); - QApplication::restoreOverrideCursor(); - return; - } - /* Must be a signal -- either do something or ignore it */ - if (m_sock->msglen == BNET_PROMPT) { - m_at_prompt = true; - mainWin->set_status(_(" At prompt waiting for input ...")); - update_cursor(); - } - if (m_sock->msglen == BNET_EOD) { - mainWin->set_status_ready(); - update_cursor(); - } - return; }