summaryrefslogblamecommitdiffstats
path: root/PrinterGUI/PrinterGUI_SRC/mainwindow.cpp
blob: cc40d5e1104c3fd45c02c38c784d8c20a264d639 (plain) (tree)
1
2
3
4
5
6
7
8
9





                          
                                                       

                           

                  












































                                                                                                         

                                                    




















































































































                                                                                                               


                                                    

     
















































                                                                                 





                                                   



                                                                 

                  



                                                                 

                  



                                                                 





                                        





                                                                                
 








                                             
 
 
 
 
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <pwd.h>



MainWindow::MainWindow(char *argv[], QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    user(argv[1]),
    file(argv[2])
{
    // 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);

    /*  Main Window properties  */

    // Disable close button
    this->setWindowFlags(windowFlags() & ~Qt::WindowCloseButtonHint);
    // 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).toAscii(), NULL);


    /* * Check printer properties (auth, color, duplex, copies) * */
    // get printer capabilities
    int res = ::atoi(cupsGetOption("printer-type",
                                   dest->num_options,
                                   dest->options));

    // Check authentication
    if (res & CUPS_PRINTER_AUTHENTICATED)
    {
        ui->labelUser->setEnabled(true);
        ui->labelPass->setEnabled(true);
        ui->lineEditUser->setEnabled(true);
        ui->lineEditPass->setEnabled(true);
    }
    else
    {
        ui->labelUser->setEnabled(false);
        ui->labelPass->setEnabled(false);
        ui->lineEditUser->setEnabled(false);
        ui->lineEditPass->setEnabled(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.toAscii()))
            return; // TODO WARN ABOUT MISSED GS JOB

    }




/* * 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.toAscii());




    /* * Print via cups lib * */

    // Username
    cupsSetUser(user);

    // Destination / Queue
    cups_dest_t *dest = cupsGetDest(
                ui->printerList->currentItem()->text(0).toAscii(),
                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().toAscii(),
                                           dest->num_options,
                                           &(dest->options));
    }

    // Drucken
    if( 0 == cupsPrintFile(dest->name,
                           file,
                           NULL,
                           dest->num_options,
                           dest->options))
        return; // TODO ERROR OUTPUT
    else // Quit with code 0
        QCoreApplication::instance()->quit();

}