From 5c89ced85217787dc0530d6cb4c3b0a74c6fbf87 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Fri, 9 Oct 2015 16:41:40 +0200 Subject: WIP: Try move all GUI interaction to the first binary This is broken, incomplete code --- CMakeLists.txt | 54 +++-------------- src/maingui/backdrop.cpp | 93 ++++++++++++++++++++++++++++- src/maingui/backdrop.h | 13 ++++ src/maingui/main.cpp | 1 - src/maingui/printergui.cpp | 5 +- src/maingui/pwgui.cpp | 97 ++++++++++++++++++++++++++++++ src/maingui/pwgui.h | 40 +++++++++++++ src/maingui/pwgui.ui | 135 +++++++++++++++++++++++++++++++++++++++++ src/pwgui/pwgui.cpp | 77 ------------------------ src/pwgui/pwgui.h | 32 ---------- src/pwgui/pwgui.ui | 145 --------------------------------------------- src/util.c | 38 ++++++++++++ src/util.h | 10 ++++ 13 files changed, 434 insertions(+), 306 deletions(-) create mode 100644 src/maingui/pwgui.cpp create mode 100644 src/maingui/pwgui.h create mode 100644 src/maingui/pwgui.ui delete mode 100644 src/pwgui/pwgui.cpp delete mode 100644 src/pwgui/pwgui.h delete mode 100644 src/pwgui/pwgui.ui create mode 100644 src/util.c create mode 100644 src/util.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 0745441..c120736 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,6 +21,11 @@ SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) FIND_PACKAGE(Qt4 REQUIRED) FIND_PACKAGE(Cups REQUIRED) +# include Qt modules +#SET(QT_USE_QTDBUS TRUE) +SET(QT_USE_QTNETWORK TRUE) +#SET(QT_USE_QTWEBKIT TRUE) + # some includes INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR} @@ -34,11 +39,13 @@ INCLUDE_DIRECTORIES( # printergui (maingui) FILE(GLOB MAINGUI_SRCS src/maingui/*.cpp + src/*.c ) # password gui (printpwgui FILE(GLOB PWGUI_SRCS src/pwgui/*.cpp + src/*.c ) ################################################################################ @@ -50,59 +57,23 @@ FILE(GLOB MAINGUI_UIS src/maingui/*.ui ) -FILE(GLOB PWGUI_UIS - src/pwgui/*.ui -) - -# .qrc files -#SET(MAINGUI_RCS pvsmgr.qrc) -#SET(PWGUI_RCS pvsclient.qrc) - # includes all header files that should be treated with moc SET(MAINGUI_MOC_HDRS src/maingui/printergui.h src/maingui/backdrop.h + src/maingui/pwgui.h ) -SET(PWGUI_MOC_HDRS - src/pwgui/pwgui.h -) - -# i18n -#FILE(GLOB MAINGUI_TSS -# i18n/server/*.ts -#) - -#FILE(GLOB PWGUI_TSS -# i18n/client/*.ts -#) - - -# include Qt modules -#SET(QT_USE_QTDBUS TRUE) -#SET(QT_USE_QTNETWORK TRUE) -#SET(QT_USE_QTWEBKIT TRUE) - # add some useful macros and variables # (QT_USE_FILE is a variable defined by FIND_PACKAGE( Qt4 ) that contains # a path to CMake script) INCLUDE(${QT_USE_FILE}) -# this will run rcc on .qrc files -#QT4_ADD_RESOURCES(MAINGUI_RC_SRCS ${MAINGUI_RCS}) -#QT4_ADD_RESOURCES(PWGUI_RC_SRCS ${PWGUI_RCS}) - # this will run uic on .ui files QT4_WRAP_UI(MAINGUI_UI_HDRS ${MAINGUI_UIS}) -QT4_WRAP_UI(PWGUI_UI_HDRS ${PWGUI_UIS}) # this will run moc QT4_WRAP_CPP(MAINGUI_MOC_SRCS ${MAINGUI_MOC_HDRS}) -QT4_WRAP_CPP(PWGUI_MOC_SRCS ${PWGUI_MOC_HDRS}) - -# i18n, run lupdate and lrelease) -#QT4_CREATE_TRANSLATION(MAINGUI_QMS ${MAINGUI_SRCS} ${MAINGUI_UI_HDRS} ${MAINGUI_TSS}) -#QT4_CREATE_TRANSLATION(PWGUI_QMS ${PWGUI_SRCS} ${PWGUI_UI_HDRS} ${PWGUI_TSS}) ################################################################################ # Build @@ -113,15 +84,10 @@ ADD_EXECUTABLE(printergui ${MAINGUI_MOC_SRCS} ${MAINGUI_UI_HDRS} ${MAINGUI_RC_SRCS} - ${MAINGUI_QMS} ) ADD_EXECUTABLE(printpwgui ${PWGUI_SRCS} - ${PWGUI_MOC_SRCS} - ${PWGUI_UI_HDRS} - ${PWGUI_RC_SRCS} - ${PWGUI_QMS} ) # link @@ -130,10 +96,6 @@ TARGET_LINK_LIBRARIES(printergui ${CUPS_LIBRARIES} ) -TARGET_LINK_LIBRARIES(printpwgui - ${QT_LIBRARIES} -) - # install INSTALL(TARGETS printergui printpwgui RUNTIME DESTINATION bin) diff --git a/src/maingui/backdrop.cpp b/src/maingui/backdrop.cpp index 4a907e8..db16b01 100644 --- a/src/maingui/backdrop.cpp +++ b/src/maingui/backdrop.cpp @@ -1,4 +1,6 @@ #include "backdrop.h" +#include "../util.h" +#include "pwgui.h" #include #include @@ -6,11 +8,18 @@ #include #include #include +#include +#include +#include + +static const QString strTest("test"); Backdrop::Backdrop() : QWidget(NULL), screenshot(NULL), - mainWindow(NULL) + mainWindow(NULL), + server(NULL), + pwgui(NULL) { QPixmap shot = QPixmap::grabWindow(QApplication::desktop()->winId()); if (!shot.isNull() && shot.height() > 0) { @@ -34,6 +43,75 @@ Backdrop::Backdrop() : screenshot = new QPixmap(shot); this->resize(screenshot->width(), screenshot->height()); this->setWindowFlags(Qt::Tool | Qt::CustomizeWindowHint | Qt::FramelessWindowHint); + + char sockPath[500]; + if (NULL != util_sockPath(-1, -1, sockPath, sizeof sockPath)) { + QString path = QString::fromUtf8(sockPath); + QFile::remove(path); + server = new QLocalServer(this); + if (server->listen(sockPath)) { + chmod(sockPath, 0600); + QObject::connect(server, SIGNAL(newConnection()), this, SLOT(newConnection())); + } + } + QObject::connect(QApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(aboutToQuit())); +} + +QLocalSocket* Backdrop::getClient() +{ + QObject *sender = QObject::sender(); + if (sender == NULL || sender->property("test").toString() != strTest) + return NULL; + return (QLocalSocket*)sender; +} + +void Backdrop::newConnection() +{ + QLocalSocket *client; + while ((client = server->nextPendingConnection())) { + client->setProperty("test", strTest); + QObject::connect(client, SIGNAL(readyRead()), this, SLOT(incomingData())); + QObject::connect(client, SIGNAL(error(QLocalSocket::LocalSocketError)), this, SLOT(closeConnection())); + QObject::connect(client, SIGNAL(disconnected()), this, SLOT(closeConnection())); + } +} + +void Backdrop::closeConnection() +{ + QLocalSocket *client = getClient(); + client->close(); + client->waitForDisconnected(50); + client->deleteLater(); +} + +void Backdrop::incomingData() +{ + QLocalSocket *client = getClient(); + char buffer[100]; + while (client->canReadLine()) { + if (client->readLine(buffer, sizeof buffer) > 0) { + if (strcmp(buffer, "open") == 0) { + if (pwgui == NULL) { + pwgui = new PwGui(this); + } + if (pwgui->isVisible()) { + client->write("busy\n"); + } else { + pwgui->exec(); + if (pwgui->isCancelled()) { + server->blockSignals(true); + client->write("cancel\n"); + client->waitForBytesWritten(1000); + client->close(); + client->waitForDisconnected(50); + QApplication::exit(0); + } + // Got some credentials, send to back end + client->write(pwgui->getUser().toUtf8() += '\0' += pwgui->getPassword() += '\0'); + } + } + } + } } Backdrop::~Backdrop() @@ -49,8 +127,19 @@ void Backdrop::paintEvent(QPaintEvent * event) void Backdrop::mouseReleaseEvent(QMouseEvent * event) { - if (mainWindow != NULL) { + if (pwgui != NULL && pwgui->isVisible()) { + pwgui->raise(); + pwgui->activateWindow(); + } else if (mainWindow != NULL && mainWindow->isVisible()) { mainWindow->raise(); mainWindow->activateWindow(); } } + +void Backdrop::aboutToQuit() +{ + if (server != NULL) { + QFile::remove(server->serverName()); + server->close(); + } +} diff --git a/src/maingui/backdrop.h b/src/maingui/backdrop.h index b798a89..7df6d40 100644 --- a/src/maingui/backdrop.h +++ b/src/maingui/backdrop.h @@ -4,6 +4,9 @@ #include class QPixmap; +class QLocalServer; +class QLocalSocket; +class PwGui; class Backdrop : public QWidget { @@ -12,6 +15,16 @@ class Backdrop : public QWidget private: const QPixmap * screenshot; QWidget * mainWindow; + QLocalServer * server; + PwGui * pwgui; + + QLocalSocket* getClient(); + +private slots: + void newConnection(); + void closeConnection(); + void incomingData(); + void aboutToQuit(); protected: virtual void paintEvent(QPaintEvent * event); diff --git a/src/maingui/main.cpp b/src/maingui/main.cpp index 25f81a0..be4099b 100644 --- a/src/maingui/main.cpp +++ b/src/maingui/main.cpp @@ -38,7 +38,6 @@ int main(int argc, char *argv[]) return a.exec(); } - static Backdrop* showGrayBackground() { Backdrop *bg = new Backdrop; diff --git a/src/maingui/printergui.cpp b/src/maingui/printergui.cpp index 21e03f4..2506fd6 100644 --- a/src/maingui/printergui.cpp +++ b/src/maingui/printergui.cpp @@ -212,7 +212,7 @@ void PrinterGui::closeEvent(QCloseEvent * e) cupsCancelJob(ui->printerList->currentItem()->text(0).toUtf8().constData(), jobId); jobId = 0; } - QCoreApplication::instance()->exit(0); + QApplication::exit(0); } QDialog::closeEvent(e); } @@ -313,7 +313,6 @@ void PrinterGui::on_buttonPrint_clicked() ui->lineEditCopies->setEnabled(false); ui->printerList->setEnabled(false); } - } void PrinterGui::bgTimer_timeout() @@ -324,7 +323,7 @@ void PrinterGui::bgTimer_timeout() } if (++this->bgTimeout > 120) { // Job was sent, GUI is invisible, quit after a few seconds - QCoreApplication::instance()->exit(0); + QApplication::exit(0); } } diff --git a/src/maingui/pwgui.cpp b/src/maingui/pwgui.cpp new file mode 100644 index 0000000..635ca42 --- /dev/null +++ b/src/maingui/pwgui.cpp @@ -0,0 +1,97 @@ +#include "pwgui.h" +#include "ui_pwgui.h" +#include +#include +#include +#include + +#define BUFLEN 400 + +// ____________________________________________________________________________ +PwGui::PwGui(QWidget *parent) : + QDialog(parent), + ui(new Ui::PwGui), + cancelled(true) +{ + // Initialize UI + initializeUI(user); + connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(on_accept())); + connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(on_reject())); +} + +// ____________________________________________________________________________ +PwGui::~PwGui() +{ + delete ui; +} + +const QString PwGui::getUser() const +{ + return ui->lineEditUser->text(); +} + +const QString PwGui::getPassword() const +{ + return ui->lineEditPass->text(); +} + +// ____________________________________________________________________________ +void PwGui::initializeUI(char *user) +{ + ui->setupUi(this); + this->setWindowModality(Qt::ApplicationModal); + // Put always on top + this->setWindowFlags(Qt::Dialog | Qt::WindowStaysOnTopHint); + + // Prefill username + if (user != NULL) { + ui->lineEditUser->setText(QString::fromUtf8(user)); + } + + // Protect password from being seen + ui->lineEditPass->setEchoMode(QLineEdit::Password); + ui->lineEditPass->setInputMethodHints(ui->lineEditPass->inputMethodHints() | Qt::ImhNoAutoUppercase); + + /* Main Window properties */ + + // center dialog on screen center + QRect desktopRect = QApplication::desktop()->screenGeometry(this); + this->move( desktopRect.width()/2-this->width()/2, + desktopRect.height()/2-this->height()/2 ); +} + +// ____________________________________________________________________________ +void PwGui::on_accept() +{ + cancelled = false; + this->close(); +} + +// ____________________________________________________________________________ +void PwGui::on_reject() +{ + this->close(); +} + +void PwGui::keyPressEvent(QKeyEvent * e) +{ + if(e->key() != Qt::Key_Escape) { + QMainWindow::keyPressEvent(e); + return; + } + this->close(); +} + +void PwGui::hideEvent(QHideEvent * e) +{ + this->close(); +} + +int PwGui::exec() { + cancelled = true; + this->show(); + this->showNormal(); + this->raise(); + this->activateWindow(); + return QDialog::exec(); +} diff --git a/src/maingui/pwgui.h b/src/maingui/pwgui.h new file mode 100644 index 0000000..fa3f465 --- /dev/null +++ b/src/maingui/pwgui.h @@ -0,0 +1,40 @@ +#ifndef AUTHENTICATION_H +#define AUTHENTICATION_H + +#include +#include + +namespace Ui +{ +class PwGui; +} + +class QTimer; + +class PwGui : public QDialog +{ + Q_OBJECT + +public: + explicit PwGui(QWidget *parent = 0); + ~PwGui(); + const QString getUser() const; + const QString getPassword() const; + const bool isCancelled() const { return cancelled; }; + int exec(); + +protected: + void hideEvent(QHideEvent * e); + void keyPressEvent(QKeyEvent * e); + +private slots: + void on_accept(); + void on_reject(); + +private: + Ui::PwGui *ui; + void initializeUI(char *username); + bool cancelled; +}; + +#endif // AUTHENTICATION_H diff --git a/src/maingui/pwgui.ui b/src/maingui/pwgui.ui new file mode 100644 index 0000000..32678a8 --- /dev/null +++ b/src/maingui/pwgui.ui @@ -0,0 +1,135 @@ + + + PwGui + + + + 0 + 0 + 310 + 160 + + + + + 0 + 0 + + + + Drucken - Authentifizierung + + + + + + + + Benutzername + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + + + + + + + + Passwort + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + + + + + + Qt::LeftToRight + + + QFrame::Panel + + + QFrame::Sunken + + + Bitte Anmelden + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + diff --git a/src/pwgui/pwgui.cpp b/src/pwgui/pwgui.cpp deleted file mode 100644 index 193341b..0000000 --- a/src/pwgui/pwgui.cpp +++ /dev/null @@ -1,77 +0,0 @@ -#include "pwgui.h" -#include "ui_pwgui.h" -#include -#include -#include -#include - -#define BUFLEN 400 - -// ____________________________________________________________________________ -PwGui::PwGui(int pfd, char *user, QWidget *parent) : - QMainWindow(parent), - ui(new Ui::PwGui), - pipefd(pfd) -{ - // Initialize UI - initializeUI(user); - connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(on_accept())); - connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(on_reject())); -} - -// ____________________________________________________________________________ -PwGui::~PwGui() -{ - delete ui; -} - -// ____________________________________________________________________________ -void PwGui::initializeUI(char *user) -{ - ui->setupUi(this); - - // Prefill username - if (user != NULL) { - ui->lineEditUser->setText(QString::fromUtf8(user)); - } - - // Protect password from being seen - ui->lineEditPass->setEchoMode(QLineEdit::Password); - ui->lineEditPass->setInputMethodHints(ui->lineEditPass->inputMethodHints() | Qt::ImhNoAutoUppercase); - - /* Main Window properties */ - - // Disable close button - this->setWindowFlags((this->windowFlags() & ~Qt::WindowCloseButtonHint) | Qt::WindowStaysOnTopHint); - // center dialog on screen center - QRect desktopRect = QApplication::desktop()->screenGeometry(this); - this->move( desktopRect.width()/2-this->width()/2, - desktopRect.height()/2-this->height()/2 ); - this->show(); - this->showNormal(); - this->raise(); - this->activateWindow(); -} - -// ____________________________________________________________________________ -void PwGui::on_accept() -{ - char buffer[BUFLEN + 1]; - int len = snprintf(buffer, BUFLEN, "%s%c%s%c", ui->lineEditUser->text().toUtf8().constData(), 0, ui->lineEditPass->text().toUtf8().constData(), 0); - if (len > BUFLEN) { - len = BUFLEN; - } - buffer[len] = '\0'; - ::write(pipefd, buffer, len); - ::close(pipefd); - // Quit with code 0 - QCoreApplication::instance()->exit(0); -} - -// ____________________________________________________________________________ -void PwGui::on_reject() -{ - // Quit with code 1 - QCoreApplication::instance()->exit(1); -} - diff --git a/src/pwgui/pwgui.h b/src/pwgui/pwgui.h deleted file mode 100644 index 348c5a1..0000000 --- a/src/pwgui/pwgui.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef AUTHENTICATION_H -#define AUTHENTICATION_H - -#include -#include - -namespace Ui -{ -class PwGui; -} - -class QTimer; - -class PwGui : public QMainWindow -{ - Q_OBJECT - -public: - explicit PwGui(int pfd, char *user, QWidget *parent = 0); - ~PwGui(); - -private slots: - void on_accept(); - void on_reject(); - -private: - Ui::PwGui *ui; - void initializeUI(char *username); - int pipefd; -}; - -#endif // AUTHENTICATION_H diff --git a/src/pwgui/pwgui.ui b/src/pwgui/pwgui.ui deleted file mode 100644 index 236df30..0000000 --- a/src/pwgui/pwgui.ui +++ /dev/null @@ -1,145 +0,0 @@ - - - PwGui - - - - 0 - 0 - 310 - 160 - - - - - 0 - 0 - - - - Drucken - Authentifizierung - - - - - 9 - 9 - 291 - 141 - - - - - - - - - Benutzername - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - - - - - - - - - Passwort - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - - - - - - - Qt::LeftToRight - - - QFrame::Panel - - - QFrame::Sunken - - - Bitte Anmelden - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - - - diff --git a/src/util.c b/src/util.c new file mode 100644 index 0000000..9e7c892 --- /dev/null +++ b/src/util.c @@ -0,0 +1,38 @@ +#include "util.h" +#include +#include +#include +#include +#include + +char *util_userHome(int uid, char *buffer, size_t len) +{ + struct passwd pwd; + struct passwd *res; + char b[1000]; + getpwuid_r(uid, &pwd, b, sizeof b, &res); + if (res == NULL || res->pw_dir == NULL) + return NULL; + int printret = snprintf(buffer, len, "%s", res->pw_dir); + if (printret < 0 || printret >= (int)len) + return NULL; + buffer[len-1] = '\0'; + return buffer; +} + +char *util_sockPath(int uid, int pid, char *buffer, size_t len) +{ + char home[120]; + if (uid == -1) { + uid = (int)getuid(); + } + if (pid == -1) { + pid = (int)getpid(); + } + if (util_userHome(uid, home, sizeof home) == NULL) + return NULL; + int printret = snprintf(buffer, len, "%s/.printergui.%d", pid); + if (printret < 0 || printret >= (int)len) + return NULL; + return buffer; +} diff --git a/src/util.h b/src/util.h new file mode 100644 index 0000000..cc7d4b7 --- /dev/null +++ b/src/util.h @@ -0,0 +1,10 @@ +#ifndef UTIL_H_ +#define UTIL_H_ + +#include + +char *util_userHome(int uid, char *buffer, size_t len); + +char *util_sockPath(int uid, int pid, char *buffer, size_t len); + +#endif /* UTIL_H_ */ -- cgit v1.2.3-55-g7522