]> git.sur5r.net Git - bacula/bacula/commitdiff
Add qstd class
authorKern Sibbald <kern@sibbald.com>
Tue, 6 Feb 2007 08:16:35 +0000 (08:16 +0000)
committerKern Sibbald <kern@sibbald.com>
Tue, 6 Feb 2007 08:16:35 +0000 (08:16 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@4108 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/qt-console/qstd.cpp [new file with mode: 0644]
bacula/src/qt-console/qstd.h [new file with mode: 0644]

diff --git a/bacula/src/qt-console/qstd.cpp b/bacula/src/qt-console/qstd.cpp
new file mode 100644 (file)
index 0000000..8093d78
--- /dev/null
@@ -0,0 +1,104 @@
+//start id=namespace
+#include "qstd.h"
+
+/* QTextStreams look a lot like iostreams,
+we just have to point them to the right place. */
+
+//start id=streamdefs
+QTextStream qstd::cin(stdin, QIODevice::ReadOnly);
+QTextStream qstd::cout(stdout, QIODevice::WriteOnly);
+QTextStream qstd::cerr(stderr, QIODevice::WriteOnly);
+//end
+
+
+/* Namespace members are like static class members */
+bool qstd::yes(QString question) {
+    QString ans;
+    cout << QString(" %1 [y/n]? ").arg(question);
+    cout.flush();
+    ans = cin.readLine();
+    return (ans.toUpper().startsWith("Y", Qt::CaseInsensitive));
+}
+//end
+
+bool qstd::more(QString s) {
+    return yes(QString("Another %1").arg(s));
+}
+
+
+int qstd::promptInt(int base /* =10 */) { /* Usage: int n = promptInt(); */
+    QString numstr;
+    int result;
+    bool ok;
+    cout << ": " << flush;
+    while (1) {
+        numstr = cin.readLine();
+        result = numstr.toInt(&ok, base);
+        if (!ok) {
+            cout << "Invalid number. Try again: ";
+            cout.flush();
+        }
+        else
+            return result;
+    }
+}
+
+
+double qstd::promptDouble() { /* Usage: double d = promptDouble(); */
+    QString numstr;
+    double result;
+    bool ok;
+    while (1) {
+        numstr = cin.readLine();
+        result = numstr.toDouble(&ok);
+        if (!ok) {
+            cout << "Invalid number. Try again: ";
+            cout.flush();
+        }
+        else
+            return result;
+    }
+}
+
+
+void qstd::promptOutputFile(QFile& outfile) {
+    QString filename;
+    while (1) {
+        cout << "Please enter the file name for saving this data: ";
+        cout.flush();
+        filename = cin.readLine();
+        outfile.setFileName(filename);
+        bool fileExists = outfile.open(QIODevice::ReadOnly);
+        if (!fileExists)
+            break;
+        if (yes("File already exists ... Ok to overwrite"))
+            break;
+        outfile.close();
+        outfile.reset();
+    }
+    outfile.close();
+    outfile.reset();
+    outfile.open(QIODevice::WriteOnly);
+    cout << filename << " open for writing ...\n";
+    cout.flush();
+}
+
+
+void qstd::promptInputFile(QFile& infile) {
+    QString filename;
+    while (1) {
+        cout << "Name of the file to be read:  ";
+        cout.flush();
+        filename = cin.readLine();
+        infile.setFileName(filename);
+        bool fileExists = infile.open(QIODevice::ReadOnly);
+        if (fileExists)
+            break;
+        cout << "File does not exist ... Please try again. \n";
+        cout.flush();
+        infile.reset();
+    }
+    cout << filename << " open for reading ...\n";
+    cout.flush();
+}
+
diff --git a/bacula/src/qt-console/qstd.h b/bacula/src/qt-console/qstd.h
new file mode 100644 (file)
index 0000000..27b7b99
--- /dev/null
@@ -0,0 +1,79 @@
+#ifndef QSTD_H
+#define QSTD_H
+
+#include <QTextStream>
+#include <QFile>
+#include <QString>
+
+/** @short helper objects and functions which help reduce the
+       need for char[] and the standard library.  
+
+    defines three @ref QTextStream instances
+    which behave like the c++ standard iostreams, bound to the
+    standard in/out/error. 
+    
+    Also provided, some helper functions for writing
+    interactive stdin/stdout applications.
+*/
+//start
+namespace qstd {
+
+    /** @short  An alias for standard input
+     */
+    extern QTextStream cin;  /* declared only, defined in the .cpp file */
+    /** @short  An alias for standard output
+     */
+    extern QTextStream cout;
+    /** @short  An alias for standard error
+     */
+    extern QTextStream cerr;
+    /** yes/no prompt
+        interactive stdin UI - prompts user with
+        a yes/no question. Repeatedly-asks
+        until user supplies a valid answer.
+        @param yesNoQuestion the yes/no question
+        @return true/false depending on what the
+        user responded.
+    */
+    bool yes(QString yesNoQuestion);
+    /** Convenience function that feeds a  specific question
+        to the yes() function.
+        @usage do {.....} while(more ("foobar"));
+        so that user sees the question: "Another foobar (y/n)? "
+        @param name of the item being handled by the loop.
+    */
+    bool more(QString prompt);
+    /** A function for safely taking an int from the keyboard.
+        Takes data into a  QString and tests to make sure it
+        can be converted to int before returning.
+        @param base allows choice of number base.
+        @return returns validated int.
+    */
+    int promptInt(int base = 10);
+    /** A function for safely taking a double from the keyboard.
+        Takes data into a  QString and tests to make sure it
+        can be converted to double before returning.
+        @return returns validated int.
+    */
+    double promptDouble();
+    /** Complete dialog for opening a file for output.
+        Asks user for file name, checks to see if
+        file already exists and, if so, asks the user if
+        it is ok to overwrite.
+        @param Reference QFile parameter is set to point
+        to the (eventually) opened file.
+    */
+    /** @short Dialog for a output file prompt
+     */
+    void promptOutputFile(QFile& outfile);
+
+    /** @short Dialog for input file prompt */
+    void promptInputFile(QFile& infile);
+    
+    
+//end
+}
+
+#endif
+