From: Kern Sibbald Date: Tue, 6 Feb 2007 08:16:35 +0000 (+0000) Subject: Add qstd class X-Git-Tag: Release-7.0.0~6952 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=f74f96c2ce82a3a917448b167890ff0fd69d04a2;p=bacula%2Fbacula Add qstd class git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@4108 91ce42f0-d328-0410-95d8-f526ca767f89 --- diff --git a/bacula/src/qt-console/qstd.cpp b/bacula/src/qt-console/qstd.cpp new file mode 100644 index 0000000000..8093d78c24 --- /dev/null +++ b/bacula/src/qt-console/qstd.cpp @@ -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 index 0000000000..27b7b998fa --- /dev/null +++ b/bacula/src/qt-console/qstd.h @@ -0,0 +1,79 @@ +#ifndef QSTD_H +#define QSTD_H + +#include +#include +#include + +/** @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 +