#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <time.h>
#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);
}
QMessageBox::information(
NULL,
"CALLBACK",
bla );
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);
QMessageBox::information(
NULL,
"PASS",
"Kein Auth" );
} else {
// Username + Password
QMessageBox::information(
NULL,
"PASS",
"Mit Auth" );
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());