summaryrefslogblamecommitdiffstats
path: root/src/maingui/printergui.cpp
blob: bbe58c02f7ca98eabf2c7c1b2b72e1a224ab1c57 (plain) (tree)
1
2
3
4
5
6
7
8

                          
                      

                   
                
                     
 


                                                                               

                                      
 


                                                                     
                                                        







                                             
 



                                                                                      

                                   
 

                  
 




                                                                          

 
                                                                               

                         
                                  


                      

 
                                                                               

                               



















                                                                            


                                                                                                             


                                            

     


                                               
 
                                
 
                         
                                                                                                      



                                                                    
                                                                          




                                  

 

 
                                                                               

                                                                                                       

                              
                                                                                                      


                                                                  
 
                             





                                                                                     



                                  









                                                                                  
                                                                                                  



























































                                                                                                                             
















                                          

 
                                                                               

                                          


                                        
 
                                                                               

                                         

              

                              

                                  
                                                                           



                        











                                                                                                                                                                                                                                                         


                                                
                                                                                       



                                                         
                          
                     
                                                                  
 


                                    
                                  

                                           

                                                                      

                                                      

                                                                                     
   
 
 
 










                                                                 
 
#include "printergui.h"
#include "ui_printergui.h"
#include <QMessageBox>
#include <unistd.h>
#include <QTimer>
#include <pwd.h>
#include <cups/ppd.h>

// ____________________________________________________________________________
PrinterGui::PrinterGui(char *argv[], QWidget *parent) :
    QMainWindow(parent),
		ui(new Ui::PrinterGui)
		//bgTimeout(-1)
{
  // When called it is guaranteed that argv has (at least) 3 elements

  // Set username
  // Do not use getlogin[_r] as it doesn't fucking work!
//  struct passwd *pw = getpwuid(getuid());
//  if (pw != NULL && pw->pw_name != NULL) {
//    // Detect real name
//    this->user = strdup(pw->pw_name);
//  } else {
//    // Fallback to what command line says
		this->user = strdup(argv[1]);
//  }

  // Filename
  this->file = new char[strlen(argv[2]) + 10]; // + 10 in case we rename (ghostscript)
  strcpy(this->file, argv[2]);

  // Initialize cups
  num_dests = cupsGetDests(&dests);

  // Initialize UI
  initializeUI();

//  // Timer
//  this->bgTimer = new QTimer(this);
//  this->bgTimer->setInterval(1000);
//	this->bgTimer->start(1000);
//  connect(bgTimer, SIGNAL(timeout()), this, SLOT(on_bgTimer_timeout()));
}

// ____________________________________________________________________________
PrinterGui::~PrinterGui()
{
  cupsFreeDests(num_dests, dests);
  free(this->user);
  delete[] this->file;
  delete this->ui;
}

// ____________________________________________________________________________
void PrinterGui::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::fromUtf8(dest->name));
      wi->setText(1, QString::fromUtf8(cupsGetOption("printer-info", dest->num_options, dest->options)));
      wi->setText(2, QString::fromUtf8(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((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->setWindowTitle(QString::fromUtf8("Drucken - %1").arg(this->user));

	ui->comboBoxColor->hide();
	ui->comboBoxSides->hide();
	ui->label_color->hide();
	ui->label_duplex->hide();
}



// ____________________________________________________________________________
void PrinterGui::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);
  }

//	ui->comboBoxSides->hide();
//	ui->comboBoxColor->hide();
//	ui->label_color->hide();
//	ui->label_duplex->hide();

	ppd_file_t *ppd = ppdOpenFile(cupsGetPPD2(CUPS_HTTP_DEFAULT, dest->name));
	if (ppd != NULL)
	{
		// Check color capabilities
		if (res & CUPS_PRINTER_COLOR)
		{
			// Check for each option if it matches an
			_colorOptionName.clear();
			QStringList knownColorOptions;
			knownColorOptions  << "ColorModel" << "XRXColor"; // TODO read from a file

			for (ppd_option_t *o = ppdFirstOption(ppd); o != NULL; o = ppdNextOption(ppd))
			{
				QString option(o->keyword);
				for (QStringList::iterator it = knownColorOptions.begin();
						 it != knownColorOptions.end(); ++it)
				{
					if(option.contains(*it))
					{
						_colorOptionName = option;
						// Add the choices to the combobox
						ui->comboBoxColor->clear();
						for (int i = 0; i < o->num_choices; ++i) {
							ui->comboBoxColor->addItem(o->choices[i].text, o->choices[i].choice);
							if (strcmp(o->choices[i].choice, o->defchoice) == 0)
								ui->comboBoxColor->setCurrentIndex(i);
						}
						ui->comboBoxColor->show();
						ui->label_color->show();
						ui->comboBoxColor->adjustSize();
						break;
					}
				}
			}
		}

		// Check duplex capabilities
		if (res & CUPS_PRINTER_DUPLEX) {
			// Check for each option if it matches an
			_duplexOptionName.clear();
			QStringList knownDuplexOptions;
			knownDuplexOptions << "Duplex"; // TODO read from a file

			for (ppd_option_t *o = ppdFirstOption(ppd); o != NULL; o = ppdNextOption(ppd))
			{
				QString option(o->keyword);
				for (QStringList::iterator it = knownDuplexOptions.begin();
						 it != knownDuplexOptions.end(); ++it)
				{
					if (option == *it)
					{
						_duplexOptionName = option;
						// Add the choices to the combobox
						ui->comboBoxSides->clear();
						for (int i = 0; i < o->num_choices; ++i) {
							ui->comboBoxSides->addItem(o->choices[i].text, o->choices[i].choice);
							if (strcmp(o->choices[i].choice, o->defchoice) == 0)
								ui->comboBoxSides->setCurrentIndex(i);
						}
						ui->comboBoxSides->show();
						ui->label_duplex->show();
						ui->comboBoxSides->adjustSize();
						break;
					}
				}
			}
		}
	}
	else
		qDebug() << "ppd is null"<< dest->name << cupsLastErrorString();

  // 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 PrinterGui::on_buttonCancel_clicked()
{
  // Quit with code 1
  QCoreApplication::instance()->exit(1);
}

// ____________________________________________________________________________
void PrinterGui::on_buttonPrint_clicked()
{
  QString cmd;

  /* * Print via cups lib * */

  // Destination / Queue
  cups_dest_t *dest = cupsGetDest(
              ui->printerList->currentItem()->text(0).toUtf8().constData(),
              NULL,
              num_dests,
              dests);

	// Color
	if (!_colorOptionName.isEmpty())
		dest->num_options = cupsAddOption (_colorOptionName.toStdString().c_str(),
																			 ui->comboBoxColor->itemData(ui->comboBoxColor->currentIndex()).toString().toStdString().c_str(),
																			 dest->num_options,
																			 &(dest->options));
	// Duplex
	if (!_duplexOptionName.isEmpty())
		dest->num_options = cupsAddOption (_duplexOptionName.toStdString().c_str(),
																			 ui->comboBoxSides->itemData(ui->comboBoxSides->currentIndex()).toString().toStdString().c_str(),
																			 dest->num_options,
																			 &(dest->options));
  // Kopien
  if (ui->lineEditCopies->isEnabled()) {
    dest->num_options = cupsAddOption ("copies",
                                       ui->lineEditCopies->text().toUtf8().constData(),
                                       dest->num_options,
                                       &(dest->options));
  }

  cupsSetUser(this->user);
  char jobtitle[100];
  snprintf(jobtitle, 100, "gui-%d-%s", (int)getpid(), this->user);

  // Drucken
  if( 0 == cupsPrintFile(dest->name,
                         file,
                         jobtitle,
                         dest->num_options,
                         dest->options)) {
    QMessageBox::critical(this, "CUPS Fehler", cupsLastErrorString());
  } else {
		//this->bgTimeout = 0;
		QCoreApplication::instance()->exit(0);
		this->hide();
		QTimer::singleShot(4000, QCoreApplication::instance(), SLOT(quit()));
  }

}

//void PrinterGui::on_bgTimer_timeout()
//{
//  if (this->bgTimeout == -1) {
//    // Could do something here every second....
//    return;
//  }
//  if (++this->bgTimeout > 4) {
//    // Job was sent, GUI is invisible, quit after a few seconds
//    QCoreApplication::instance()->exit(0);
//  }
//}