]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/qt-console/joblog/joblog.cpp
Change copyright as per agreement with FSFE
[bacula/bacula] / bacula / src / qt-console / joblog / joblog.cpp
index f9b6539f306d70b5e760c419e02bc33284bbfbd9..46ae5546fda0d09632fb9c3e1dad39b6a3f3029e 100644 (file)
@@ -1,34 +1,23 @@
 /*
-   Bacula® - The Network Backup Solution
-
-   Copyright (C) 2000-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.
-   This program is Free Software; you can redistribute it and/or
-   modify it under the terms of version two of the GNU General Public
-   License as published by the Free Software Foundation plus additions
-   that are listed in the file LICENSE.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.
-
-   Bacula® is a registered trademark of John Walker.
-   The licensor of Bacula is the Free Software Foundation Europe
-   (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
-   Switzerland, email:ftf@fsfeurope.org.
+   Bacula(R) - The Network Backup Solution
+
+   Copyright (C) 2000-2016 Kern Sibbald
+
+   The original author of Bacula is Kern Sibbald, with contributions
+   from many others, a complete list can be found in the file AUTHORS.
+
+   You may use this file and others of this release according to the
+   license defined in the LICENSE file, which includes the Affero General
+   Public License, v3.0 ("AGPLv3") and some additional permissions and
+   terms pursuant to its AGPLv3 Section 7.
+
+   This notice must be preserved when any source code is 
+   conveyed and/or propagated.
+
+   Bacula(R) is a registered trademark of Kern Sibbald.
 */
  
 /*
- *   Version $Id: joblog.cpp 4230 2007-02-21 20:07:37Z kerns $
- *
  *  JobLog Class
  *
  *   Dirk Bartley, March 2007
 #include "bat.h"
 #include "joblog.h"
 
-JobLog::JobLog(QString &jobId, QTreeWidgetItem *parentTreeWidgetItem)
+JobLog::JobLog(QString &jobId, QTreeWidgetItem *parentTreeWidgetItem) : Pages()
 {
    setupUi(this);
-   m_name = "JobLog";
-   m_closeable = true;
-   pgInitialize(parentTreeWidgetItem);
+   pgInitialize(tr("JobLog"), parentTreeWidgetItem);
+   QTreeWidgetItem* thisitem = mainWin->getFromHash(this);
+   thisitem->setIcon(0,QIcon(QString::fromUtf8(":images/joblog.png")));
    m_cursor = new QTextCursor(textEdit->document());
 
    m_jobId = jobId;
@@ -74,57 +63,95 @@ void JobLog::getFont()
  */
 void JobLog::populateText()
 {
-   QString heading("<A href=\"#top\">Log records for job ");
-   heading += m_jobId + "</A>\n";
-   textEdit->insertHtml(heading);
-
-   if (!m_console->preventInUseConnect())
-       return;
-   
-   QString query("");
-   query = "SELECT Time, LogText FROM Log WHERE JobId='" + m_jobId + "'";
-
+   QString query;
+   query = "SELECT Time, LogText FROM Log WHERE JobId='" + m_jobId + "' order by Time";
+
+   /* This could be a log item */
+   if (mainWin->m_sqlDebug) {
+      Pmsg1(000, "Log query cmd : %s\n", query.toUtf8().data());
+   }
+  
    QStringList results;
    if (m_console->sql_cmd(query, results)) {
-      QString field;
-      QStringList fieldlist;
-      int resultcount = 0;
 
+      if (!results.size()) {
+         QMessageBox::warning(this, tr("Bat"),
+            tr("There were no results!\n"
+               "It is possible you may need to add \"catalog = all\" "
+               "to the Messages resource for this job.\n"), QMessageBox::Ok);
+         return;
+      } 
+
+      QString jobstr("JobId "); /* FIXME: should this be translated ? */
+      jobstr += m_jobId;
+
+      QString htmlbuf("<html><body><b>" + tr("Log records for job %1").arg(m_jobId) );
+      htmlbuf += "</b><table>";
+  
       /* Iterate through the lines of results. */
+      QString field;
+      QStringList fieldlist;
+      QString lastTime;
+      QString lastSvc;
       foreach (QString resultline, results) {
          fieldlist = resultline.split("\t");
-
-         int column = 0;
-         /* Iterate through fields in the record */
-         foreach (field, fieldlist) {
-            display_text(field);
-            if (column <= 1) display_text("\n");
-            column += 1;
-         } /* foreach field */
-         resultcount += 1;
+         
+         if (fieldlist.size() < 2)
+            continue;
+
+         htmlbuf +="<tr>";
+
+         QString curTime = fieldlist[0].trimmed();
+
+         field = fieldlist[1].trimmed();
+         int colon = field.indexOf(":");
+         if (colon > 0) {
+            /* string is like <service> <jobId xxxx>: ..." 
+             * we split at ':' then remove the jobId xxxx string (always the same) */ 
+            QString curSvc(field.left(colon).replace(jobstr,"").trimmed());
+            if (curSvc == lastSvc  && curTime == lastTime) {
+               curTime.clear();
+               curSvc.clear(); 
+            } else {
+               lastTime = curTime;
+               lastSvc = curSvc;
+            }
+            htmlbuf += "<td>" + curTime + "</td>";
+            htmlbuf += "<td><p>" + curSvc + "</p></td>";
+
+            /* rest of string is marked as pre-formatted (here trimming should
+             * be avoided, to preserve original formatting) */
+            QString msg(field.mid(colon+2));
+            if (msg.startsWith( tr("Error:")) ) { /* FIXME: should really be translated ? */
+               /* error msg, use a specific class */
+               htmlbuf += "<td><pre class=err>" + msg + "</pre></td>";
+            } else {
+               htmlbuf += "<td><pre>" + msg + "</pre></td>";
+            }
+         } else {
+            /* non standard string, place as-is */
+            if (curTime == lastTime) {
+               curTime.clear();
+            } else {
+               lastTime = curTime;
+            }
+            htmlbuf += "<td>" + curTime + "</td>";
+            htmlbuf += "<td><pre>" + field + "</pre></td>";
+         }
+
+         htmlbuf += "</tr>";
+  
       } /* foreach resultline */
-      if (resultcount == 0) {
-         /* show a message about configuration item */
-         QMessageBox::warning(this, tr("Bat"),
-            tr("There were no results ??  !!!.\n"
-"It is possible you may need to add \"catalog = all\" to the Messages stanza"
-" for this job.\n"), QMessageBox::Ok);
-      }
-   } /* if results from query */
-   textEdit->scrollToAnchor("top");
-}
 
-/*
- * Put text into the joblog window with an overload
- */
-void JobLog::display_text(const QString buf)
-{
-   m_cursor->movePosition(QTextCursor::End);
-   m_cursor->insertText(buf);
-}
+      htmlbuf += "</table></body></html>";
 
-void JobLog::display_text(const char *buf)
-{
-   m_cursor->movePosition(QTextCursor::End);
-   m_cursor->insertText(buf);
+      /* full text ready. Here a custom sheet is used to align columns */
+      QString logSheet("p,pre,.err {margin-left: 10px} .err {color:#FF0000;}");
+      textEdit->document()->setDefaultStyleSheet(logSheet);
+      textEdit->document()->setHtml(htmlbuf); 
+      textEdit->moveCursor(QTextCursor::Start);
+
+   } /* if results from query */
+  
 }
+