summaryrefslogblamecommitdiffstats
path: root/src/mainwindow.cpp
blob: e8111850efdef21e881cc3f392340bdc75f86812 (plain) (tree)
1
2

                          























                                                                                                         
 
                                                                               
                                                       

                           
                  

                         

                                   
 

                  

 



                                                                               

 



























                                                                                                   

     


                                               
 








                                                                                                       
                                
 
                         
                                                                                                      



                                                                    

 



                                                                                                         
                                                                                                      



                                                                  











                                                                                               






                                         
                              




                                        
                               


































                                          

 




                                                                               
 










                                                                                                           
                                         





                                              

                                  
                                                                           
























                                                           
     




                                                
                                                                                       



                                                         

















                                                                                       








                                           
                              
                                         
   
 
 

 
                                                                               






























                                                                                 
                                       
#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());