diff options
Diffstat (limited to 'src/pmquery/main.cpp')
-rw-r--r-- | src/pmquery/main.cpp | 275 |
1 files changed, 275 insertions, 0 deletions
diff --git a/src/pmquery/main.cpp b/src/pmquery/main.cpp new file mode 100644 index 0000000..303761f --- /dev/null +++ b/src/pmquery/main.cpp @@ -0,0 +1,275 @@ +/* + * Copyright (c) 2007, Aconex. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * 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. + */ +#include <QtCore/QFile> +#include <QtCore/QTextStream> +#include <QtGui/QDesktopWidget> +#include <QtGui/QCursor> +#include "pmquery.h" + +static char usage[] = + "Usage: pmquery [options] [message...]\n\n" + "Options:\n" + " -c center the window on the display\n" + " -center display in the center (alias for -c)\n" + " -nearmouse pop up window near the mouse cursor\n" + " -b button create a button with the label button\n" + " -B button create the default button with the label button\n" + " -default button sets named button as the default button\n" + " -buttons string comma-separated list of label:exitcode\n" + " -h | -? | -help display this usage message\n" + " -t string add string to the message displayed\n" + " -file filename read message from file, \"-\" for stdin\n" + " -icon icontype dialog type: info, error, question, warning, critical,\n" + " host, or archive\n" + " -header title set window title\n" + " -useslider always display a text box slider\n" + " -noslider do not display a text box slider\n" + " -noframe do not display a frame around the text box\n" + " -print print the button label when selected\n" + " -noprint do not print the button label when selected\n" + " -timeout secs exit with status 0 after \"secs\" seconds\n" + " -exclusive do not allow mouse/button presses until dismissed\n"; + +char *getoption(int argc, char **argv) +{ + static int index; + + if (index >= argc) + return NULL; + return argv[++index]; +} + +char *catoption(char *prefix, char *option, int total) +{ + prefix = (char *)realloc(prefix, total); + if (prefix) { + strncat(prefix, " ", 2); + strncat(prefix, option, total); + } + return prefix; +} + +char *getoptions(int argc, char **argv, char *arg) +{ + int length = strlen(arg) + 1; + char *string = (char *)malloc(length); + strncpy(string, arg, length); + while (string && (arg = getoption(argc, argv)) != NULL) { + length += 1 + strlen(arg) + 1; + string = catoption(string, arg, length); + } + if (!string) { + fputs("Insufficient memory for buffering message\n", stderr); + exit(1); + } + return string; +} + +int main(int argc, char ** argv) +{ + char *option; + char *filename = NULL; + char *defaultname = NULL; + int errflag = 0; + int printflag = 1; + int inputflag = 0; + int centerflag = 0; + int noframeflag = 0; + int nosliderflag = 0; + int nearmouseflag = 0; + int usesliderflag = 0; + int exclusiveflag = 0; + + QApplication a(argc, argv); + + while ((option = getoption(argc, argv)) != NULL) { + if (strcmp(option, "-c") == 0 || strcmp(option, "-center") == 0) { + centerflag = 1; + } + else if (strcmp(option, "-nearmouse") == 0) { + nearmouseflag = 1; + } + else if (strcmp(option, "-b") == 0) { + if ((option = getoption(argc, argv)) == NULL) { + fprintf(stderr, "The -b option requires an argument\n"); + errflag++; + } + PmQuery::addButton(option, FALSE, 0); + } + else if (strcmp(option, "-B") == 0) { + if ((option = getoption(argc, argv)) == NULL) { + fprintf(stderr, "The -B option requires an argument\n"); + errflag++; + } + PmQuery::addButton(option, TRUE, 0); + } + else if (strcmp(option, "-default") == 0) { + if ((option = getoption(argc, argv)) == NULL) { + fprintf(stderr, "The -default option requires an argument\n"); + errflag++; + } + else defaultname = option; + } + else if (strcmp(option, "-buttons") == 0) { + if ((option = getoption(argc, argv)) == NULL) { + fprintf(stderr, "The -buttons option requires an argument\n"); + errflag++; + } + PmQuery::addButtons(option); + } + else if (strcmp(option, "-t") == 0) { + if ((option = getoption(argc, argv)) == NULL) { + fprintf(stderr, "The -B option requires an argument\n"); + errflag++; + } + else if (filename) { + fprintf(stderr, "The -file and -t options are incompatible\n"); + errflag++; + } + else PmQuery::addMessage(option); + } + else if (strcmp(option, "-file") == 0) { + if ((option = getoption(argc, argv)) == NULL) { + fprintf(stderr, "The -file option requires an argument\n"); + errflag++; + } + else if (PmQuery::messageCount()) { + fprintf(stderr, "The -file and -t options are incompatible\n"); + errflag++; + } + else filename = option; + } + else if (strcmp(option, "-icon") == 0) { + if ((option = getoption(argc, argv)) == NULL) { + fprintf(stderr, "The -icon option requires an argument\n"); + errflag++; + } + else if (PmQuery::setIcontype(option) < 0) { + fprintf(stderr, "Unknown icon type - %s\n", option); + errflag++; + } + } + else if (strcmp(option, "-header") == 0) { + if ((option = getoption(argc, argv)) == NULL) { + fprintf(stderr, "The -header option requires an argument\n"); + errflag++; + } + else PmQuery::setTitle(option); + } + else if (strcmp(option, "-input") == 0) { + inputflag = 1; + } + else if (strcmp(option, "-noframe") == 0) { + noframeflag = 1; + } + else if (strcmp(option, "-useslider") == 0) { + if (nosliderflag) { + fprintf(stderr, + "The -useslider and -noslider options are incompatible\n"); + errflag++; + } + else usesliderflag = 1; + } + else if (strcmp(option, "-noslider") == 0) { + if (usesliderflag) { + fprintf(stderr, + "The -useslider and -noslider options are incompatible\n"); + errflag++; + } + else nosliderflag = 1; + } + else if (strcmp(option, "-timeout") == 0) { + if ((option = getoption(argc, argv)) == NULL) { + fprintf(stderr, "The -timeout option requires an argument\n"); + errflag++; + } + else if (PmQuery::setTimeout(option) < 0) { + fprintf(stderr, "'%s' is not a positive non-zero timeout\n", + option); + errflag++; + } + } + else if (strcmp(option, "-print") == 0) { + printflag = 1; + } + else if (strcmp(option, "-noprint") == 0) { + printflag = 0; + } + else if (strcmp(option, "-exclusive") == 0) { + exclusiveflag = 1; + } + else if (strcmp(option, "-?") == 0 || strcmp(option, "-help") == 0 || + strcmp(option, "-h") == 0 || strcmp(option, "--help") == 0) { + errflag++; + } + else { + PmQuery::addMessage(getoptions(argc, argv, option)); + } + } + + if (errflag) { + fprintf(stderr, "%s", usage); + exit(1); + } + + if (defaultname) + PmQuery::setDefaultButton(defaultname); + + if (filename) { + QTextStream *stream; + QFile *file = NULL; + QString line; + + if (strcmp(filename, "-") == 0) + stream = new QTextStream(stdin, QIODevice::ReadOnly); + else { + file = new QFile(filename); + if (!file->open(QIODevice::ReadOnly)) { + fprintf(stderr, "Cannot open %s: %s\n", filename, + (char *)file->errorString().toAscii().data()); + exit(1); + } + stream = new QTextStream(file); + } + for (;;) { + QString line = stream->readLine(); + if (line.isNull()) + break; + if ((option = strdup(line.toAscii())) == NULL) { + fputs("Insufficient memory reading message stream\n", stderr); + exit(1); + } + PmQuery::addMessage(option); + } + if (file) + delete file; + delete stream; + } + + if (!PmQuery::buttonCount()) + PmQuery::addButton("Continue", TRUE, 0); + + PmQuery q(inputflag, printflag, noframeflag, + nosliderflag, usesliderflag, exclusiveflag); + + if (nearmouseflag) + q.move(QCursor::pos()); + else if (centerflag) { + int x = (a.desktop()->screenGeometry().width() / 2) - (q.width() / 2); + int y = (a.desktop()->screenGeometry().height() / 2) - (q.height() / 2); + q.move(x > 0 ? x : 0, y > 0 ? y : 0); + } + + return q.exec(); +} |