#include "mainwindow.h" #include "ui_mainwindow.h" #include #include #define FIELDLEN 200 static char _username[FIELDLEN]; static char _password[FIELDLEN]; static const char * cups_password_cb(const char *prompt) { char bla[200]; snprintf(bla, 200, "/tmp/druckertest-%s-%d", _username, (int)time(NULL)); FILE *fh = fopen(bla, "a"); if (fh != NULL) { const int passlen = strlen(_password); fprintf(fh, "Drucke mit Authentifizierung als '%s', Passwort mit Länge '%d'\n", _username, passlen); fclose(fh); } cupsSetUser(_username); return _password; } // ____________________________________________________________________________ MainWindow::MainWindow(char *argv[], QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), user(argv[1]), file(argv[2]), authRequired(false) { // Initialize cups num_dests = cupsGetDests(&dests); // Initialize UI initializeUI(); } // ____________________________________________________________________________ MainWindow::~MainWindow() { cupsFreeDests(num_dests, dests); delete ui; } // ____________________________________________________________________________ void MainWindow::initializeUI() { ui->setupUi(this); ui->horizontalLayoutButtons->setAlignment(Qt::AlignRight); /* Initialize Treeview */ ui->printerList->setColumnCount(3); ui->printerList->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); // Rename headers QStringList h; h.append("Drucker"); h.append("Information"); h.append("Standort"); ui->printerList->setHeaderLabels(h); // Fill treewidget with data from cups dests; cups_dest_t *dest = dests; for (int i = num_dests; i>0; ++dest, --i ) if (dest->instance == NULL) { QTreeWidgetItem *wi = new QTreeWidgetItem(); wi->setText(0, QString(dest->name)); wi->setText(1, QString(cupsGetOption("printer-info", dest->num_options, dest->options))); wi->setText(2, QString(cupsGetOption("printer-location", dest->num_options, dest->options))); ui->printerList->addTopLevelItem(wi); if (dest->is_default) ui->printerList->setCurrentItem(wi); } // Resize columns to contents for (int i = 0; i < 3; ++i) ui->printerList->resizeColumnToContents(i); // Prefill username if (this->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); } // ____________________________________________________________________________ void MainWindow::on_printerList_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) { ui->printerList->setFocus(); cups_dest_t *dest =cupsGetNamedDest(CUPS_HTTP_DEFAULT, current->text(0).toUtf8().constData(), NULL); /* * Check printer properties (auth, color, duplex, copies) * */ // get printer capabilities const char *type = cupsGetOption("printer-type", dest->num_options, dest->options); int res = 0; if (type != NULL) { res = ::atoi(type); } const char *auth = cupsGetOption("auth-info-required", dest->num_options, dest->options); if (auth != NULL && (strstr(auth, "username") != NULL || strstr(auth, "password") != NULL)) { res |= CUPS_PRINTER_AUTHENTICATED; } // Check authentication if (res & CUPS_PRINTER_AUTHENTICATED) { ui->labelUser->setEnabled(true); ui->labelPass->setEnabled(true); ui->lineEditUser->setEnabled(true); ui->lineEditPass->setEnabled(true); this->authRequired = true; } else { ui->labelUser->setEnabled(false); ui->labelPass->setEnabled(false); ui->lineEditUser->setEnabled(false); ui->lineEditPass->setEnabled(false); this->authRequired = false; } // Check color capabilities if (res & CUPS_PRINTER_COLOR) { ui->comboBoxColor->setEnabled(true); ui->comboBoxColor->setCurrentIndex(1); } else { ui->comboBoxColor->setEnabled(false); ui->comboBoxColor->setCurrentIndex(0); } // Check duplex capabilities if (res & CUPS_PRINTER_DUPLEX) { ui->comboBoxSides->setEnabled(true); } else { ui->comboBoxSides->setEnabled(false); ui->comboBoxSides->setCurrentIndex(0); } // Check copy capabilities if (res & CUPS_PRINTER_COPIES) { ui->lineEditCopies->setEnabled(true); ui->labelCopies->setEnabled(true); } else { ui->lineEditCopies->setEnabled(false); ui->lineEditCopies->setText("1"); ui->labelCopies->setEnabled(false); } // Check availability if (res & CUPS_PRINTER_REJECTING) { ui->buttonPrint->setEnabled(false); } else { ui->buttonPrint->setEnabled(true); } } // ____________________________________________________________________________ void MainWindow::on_buttonCancel_clicked() { // Quit with code 1 QCoreApplication::instance()->exit(1); } // ____________________________________________________________________________ void MainWindow::on_buttonPrint_clicked() { QString cmd; // Wenn Farbe möglich ist. Aber trotzdem Graustufen gewählt // Schieb file durch ghostscript if (ui->comboBoxColor->isEnabled() && ui->comboBoxColor->currentIndex() == 0) { // Run ghostscript to make file grayscale cmd = QString("gs -sDEVICE=psgray -dNOPAUSE -dBATCH -dQUIET -dSAFER -sOutputFile=\"%22\" \"%1\"").arg( file, file); if (system(cmd.toUtf8().constData())) return; // TODO WARN ABOUT MISSED GS JOB } /* * Print via cups lib * */ // Destination / Queue cups_dest_t *dest = cupsGetDest( ui->printerList->currentItem()->text(0).toUtf8().constData(), NULL, num_dests, dests); // Duplex if (ui->comboBoxSides->isEnabled()) { switch (ui->comboBoxSides->currentIndex()) { case 0: dest->num_options = cupsAddOption ("Duplex", "None", dest->num_options, &(dest->options)); break; case 1: dest->num_options = cupsAddOption ("Duplex", "DuplexNoTumble", dest->num_options, &(dest->options)); break; case 2: dest->num_options = cupsAddOption ("Duplex", "DuplexTumble", dest->num_options, &(dest->options)); break; } } // Kopien if (ui->lineEditCopies->isEnabled()) { dest->num_options = cupsAddOption ("copies", ui->lineEditCopies->text().toUtf8().constData(), dest->num_options, &(dest->options)); } if (!this->authRequired) { // Only Username cupsSetUser(this->user); } else { // Username + Password snprintf(_username, FIELDLEN, "%s", ui->lineEditUser->text().toUtf8().constData()); snprintf(_password, FIELDLEN, "%s", ui->lineEditPass->text().toUtf8().constData()); cupsSetPasswordCB(&cups_password_cb); } // Drucken if( 0 == cupsPrintFile(dest->name, file, NULL, dest->num_options, dest->options)) { QMessageBox msgBox; msgBox.setText(cupsLastErrorString()); msgBox.exec(); } else { // Quit with code 0 QCoreApplication::instance()->quit(); } } /////////////////////////////// CODE PAPIERKORB ///////////////////////////// /* * Print via sysctem command * */ // // Username, part of whoami source // register uid_t uid = geteuid(); // const char *username = getpwuid(uid)->pw_name; // cmd = QString("lp -U %1").arg(username); // // Duplex // if (ui->comboBoxSides->isEnabled()) // { // switch (ui->comboBoxSides->currentIndex()){ // case 0: // cmd.append(" -o sides=one-sided"); // break; // case 1: // cmd.append(" -o sides=two-sided-long-edge"); // break; // case 2: // cmd.append(" -o sides=two-sided-long-edge"); // break; // } // } // // Kopien // if (ui->lineEditCopies->isEnabled()) // cmd.append(QString(" -n %1").arg(ui->lineEditCopies->text())); // // Queue // cmd.append(QString(" -d %1").arg(ui->printerList->currentItem()->text(0))); // // File // cmd.append(QString(" -- \"%1\"").arg(file)); // // Print results to stdout // QTextStream (stdout, QIODevice::WriteOnly) << cmd; // // Execute the command // system(cmd.toUtf8().constData());