/*
Bacula® - The Network Backup Solution
- Copyright (C) 2007-2009 Free Software Foundation Europe e.V.
+ Copyright (C) 2007-2010 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.
Switzerland, email:ftf@fsfeurope.org.
*/
/*
- * Version $Id$
- *
- * Console Class
+ * DirComm, Director communications,class
*
* Kern Sibbald, January MMVII
*
mainWin->set_status( tr("Already connected."));
m_console->display_textf(_("Already connected\"%s\".\n"),
m_console->m_dir->name());
- if (mainWin->m_connDebug)
+ if (mainWin->m_connDebug) {
Pmsg2(000, "DirComm %i BAILING already connected %s\n", m_conn, m_console->m_dir->name());
+ }
goto bail_out;
}
+ if (mainWin->m_connDebug) {
+ Pmsg2(000, "DirComm %i connecting %s\n", m_conn, m_console->m_dir->name());
+ }
memset(jcr, 0, sizeof(JCR));
mainWin->set_statusf(_("Connecting to Director %s:%d"), m_console->m_dir->address, m_console->m_dir->DIRport);
mainWin->set_status(_("Connected"));
- if (mainWin->m_connDebug)
+ if (mainWin->m_connDebug) {
Pmsg2(000, "Returning TRUE from DirComm->connect_dir : %i %s\n", m_conn, m_console->m_dir->name());
+ }
return true;
bail_out:
- if (mainWin->m_connDebug)
+ if (mainWin->m_connDebug) {
Pmsg2(000, "Returning FALSE from DirComm->connect_dir : %i %s\n", m_conn, m_console->m_dir->name());
+ }
delete jcr;
return false;
}
}
continue;
case BNET_START_SELECT:
- notify(false);
if (mainWin->m_commDebug) Pmsg1(000, "conn %i START SELECT\n", m_conn);
m_in_select = true;
new selectDialog(m_console, m_conn);
prev_enabled = m_notifier->isEnabled();
m_notifier->setEnabled(enable);
if (mainWin->m_connDebug) {
- if (prev_enabled && !enable)
- Pmsg2(000, "m_notifier Disabling notifier: %i %s\n", m_conn, m_console->m_dir->name());
- else if (!prev_enabled && enable)
- Pmsg2(000, "m_notifier Enabling notifier: %i %s\n", m_conn, m_console->m_dir->name());
+ Pmsg3(000, "conn=%i notify=%d prev=%d\n", m_conn, enable, prev_enabled);
}
} else if (mainWin->m_connDebug)
Pmsg2(000, "m_notifier does not exist: %i %s\n", m_conn, m_console->m_dir->name());
void Console::poll_messages()
{
int conn;
- if (!availableDirComm(conn)) {
- return;
+
+ /*
+ * Note if we call getDirComm here, we continuously consume
+ * file descriptors.
+ */
+ if (!findDirComm(conn)) { /* find a free DirComm */
+ return; /* try later */
}
- DirComm *dircomm = m_dircommHash.value(conn);
+ DirComm *dircomm = m_dircommHash.value(conn);
if (mainWin->m_checkMessages && dircomm->m_at_main_prompt && hasFocus() && !mainWin->getWaitState()){
messagesPending(true);
dircomm->write(".messages");
m_textEdit = textEdit; /* our console screen */
if (dircomm->connect_dir()) {
- if (mainWin->m_connDebug)
+ if (mainWin->m_connDebug) {
Pmsg1(000, "DirComm 0 Seems to have Connected %s\n", m_dir->name());
+ }
beginNewCommand(0);
}
mainWin->set_status(_("Connected"));
void Console::populateLists(bool /*forcenew*/)
{
int conn;
- if (!availableDirComm(conn) && !newDirComm(conn)) {
- Emsg1(M_ABORT, 0, "Failed to connect to %s for populateLists.\n", m_dir->name());
- return;
+ if (!getDirComm(conn)) {
+ if (mainWin->m_connDebug) {
+ Pmsg0(000, "call newDirComm\n");
+ }
+ if (!newDirComm(conn)) {
+ Emsg1(M_ABORT, 0, "Failed to connect to %s for populateLists.\n", m_dir->name());
+ return;
+ }
}
populateLists(conn);
}
bool Console::dir_cmd(const char *cmd, QStringList &results)
{
int conn;
- if (availableDirComm(conn)) {
+ if (getDirComm(conn)) {
dir_cmd(conn, cmd, results);
return true;
} else {
bool Console::sql_cmd(QString &query, QStringList &results)
{
int conn;
- if (!availableDirComm(conn)) {
+ if (!getDirComm(conn)) {
return false;
}
return sql_cmd(conn, query.toUtf8().data(), results, true);
bool Console::sql_cmd(const char *query, QStringList &results)
{
int conn;
- if (!availableDirComm(conn)) {
+ if (!getDirComm(conn)) {
return false;
}
return sql_cmd(conn, query, results, true);
int Console::write_dir(const char *msg)
{
int conn;
- if (availableDirComm(conn)) {
+ if (getDirComm(conn)) {
write_dir(conn, msg);
}
return conn;
int Console::write_dir(const char *msg, bool dowait)
{
int conn;
- if (availableDirComm(conn)) {
+ if (getDirComm(conn)) {
write_dir(conn, msg, dowait);
}
return conn;
}
}
}
- if (mainWin->m_commDebug) Pmsg2(000, "endDiscardToPrompt=%d %s\n", stat, m_dir->name());
+ if (mainWin->m_commDebug) {
+ Pmsg2(000, "endDiscardToPrompt conn=%i %s\n", conn, m_dir->name());
+ }
}
QString Console::returnFromPrompt(int conn)
* m_console->notifiy(false);
*/
-/* dual purpose function to turn notify off and return an available connection */
+/* dual purpose function to turn notify off and return a connection */
int Console::notifyOff()
{
int conn = 0;
- if (availableDirComm(conn)) {
+ if (getDirComm(conn)) {
notify(conn, false);
}
return conn;
}
/*
- * Need an available connection. Check existing connections or create one
+ * Need a connection. Check existing connections or create one
*/
-bool Console::availableDirComm(int &conn)
+bool Console::getDirComm(int &conn)
{
- if (currentDirComm(conn)) {
+ if (findDirComm(conn)) {
return true;
}
+ if (mainWin->m_connDebug) {
+ Pmsg0(000, "call newDirComm\n");
+ }
return newDirComm(conn);
}
/*
- * Need current connection.
+ * Try to find a free (unused but established) connection
+ * KES: Note, I think there is a problem here because for
+ * some reason, the notifier is often turned off on file
+ * descriptors that seem to me to be available. That means
+ * that we do not use a free descriptor and thus we will create
+ * a new connection that is maybe not necessary. Someone needs
+ * to look into whether or not notify() is correctly turned on
+ * when we are back at the command prompt and idle.
+ *
*/
-bool Console::currentDirComm(int &conn)
+bool Console::findDirComm(int &conn)
{
int i = 1;
QHash<int, DirComm*>::const_iterator iter = m_dircommHash.constBegin();