00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "kmwippprinter.h"
00021 #include "kmwizard.h"
00022 #include "kmprinter.h"
00023 #include "ipprequest.h"
00024 #include "kmcupsmanager.h"
00025 #include "networkscanner.h"
00026
00027 #include <klistview.h>
00028 #include <qheader.h>
00029 #include <kpushbutton.h>
00030 #include <qlineedit.h>
00031 #include <qlabel.h>
00032 #include <kmessagebox.h>
00033 #include <qtextview.h>
00034 #include <qlayout.h>
00035 #include <qregexp.h>
00036 #include <kseparator.h>
00037 #include <klocale.h>
00038 #include <kiconloader.h>
00039 #include <kguiitem.h>
00040 #include <kurl.h>
00041
00042 KMWIppPrinter::KMWIppPrinter(QWidget *parent, const char *name)
00043 : KMWizardPage(parent,name)
00044 {
00045 m_title = i18n("IPP Printer Information");
00046 m_ID = KMWizard::Custom+1;
00047 m_nextpage = KMWizard::Driver;
00048
00049 m_list = new KListView(this);
00050 m_list->addColumn("");
00051 m_list->header()->hide();
00052 m_list->setFrameStyle(QFrame::WinPanel|QFrame::Sunken);
00053 m_list->setLineWidth(1);
00054
00055 QLabel *l1 = new QLabel(i18n("&Printer URI:"),this);
00056
00057 m_uri = new QLineEdit(this);
00058
00059 l1->setBuddy(m_uri);
00060
00061 m_info = new QTextView(this);
00062 m_info->setPaper(colorGroup().background());
00063 m_info->setMinimumHeight(100);
00064 m_info->setText(i18n("<p>Either enter the printer URI directly, or use the network scanning facility.</p>"));
00065 m_ippreport = new KPushButton(KGuiItem(i18n("&IPP Report"), "kdeprint_report"), this);
00066 m_ippreport->setEnabled(false);
00067
00068 m_scanner = new NetworkScanner( 631, this );
00069
00070 KSeparator* sep = new KSeparator( KSeparator::HLine, this);
00071 sep->setFixedHeight(20);
00072
00073 connect(m_list,SIGNAL(selectionChanged(QListViewItem*)),SLOT(slotPrinterSelected(QListViewItem*)));
00074 connect( m_scanner, SIGNAL( scanStarted() ), SLOT( slotScanStarted() ) );
00075 connect( m_scanner, SIGNAL( scanFinished() ), SLOT( slotScanFinished() ) );
00076 connect( m_scanner, SIGNAL( scanStarted() ), parent, SLOT( disableWizard() ) );
00077 connect( m_scanner, SIGNAL( scanFinished() ), parent, SLOT( enableWizard() ) );
00078 connect(m_ippreport, SIGNAL(clicked()), SLOT(slotIppReport()));
00079
00080
00081 QHBoxLayout *lay3 = new QHBoxLayout(this, 0, 10);
00082 QVBoxLayout *lay2 = new QVBoxLayout(0, 0, 0);
00083 QHBoxLayout *lay4 = new QHBoxLayout(0, 0, 0);
00084
00085 lay3->addWidget(m_list,1);
00086 lay3->addLayout(lay2,1);
00087 lay2->addWidget(l1);
00088 lay2->addWidget(m_uri);
00089 lay2->addSpacing(10);
00090 lay2->addWidget(m_info, 1);
00091 lay2->addSpacing(5);
00092 lay2->addLayout(lay4);
00093 lay4->addStretch(1);
00094 lay4->addWidget(m_ippreport);
00095 lay2->addWidget(sep);
00096 lay2->addWidget( m_scanner );
00097 }
00098
00099 KMWIppPrinter::~KMWIppPrinter()
00100 {
00101 }
00102
00103 void KMWIppPrinter::updatePrinter(KMPrinter *p)
00104 {
00105 p->setDevice(m_uri->text());
00106 }
00107
00108 bool KMWIppPrinter::isValid(QString& msg)
00109 {
00110 if (m_uri->text().isEmpty())
00111 {
00112 msg = i18n("You must enter a printer URI.");
00113 return false;
00114 }
00115
00116 KURL uri( m_uri->text() );
00117 if (!m_scanner->checkPrinter(uri.host(),(uri.port()==0?631:uri.port())))
00118 {
00119 msg = i18n("No printer found at this address/port.");
00120 return false;
00121 }
00122 return true;
00123 }
00124
00125 void KMWIppPrinter::slotScanStarted()
00126 {
00127 m_list->clear();
00128 }
00129
00130 void KMWIppPrinter::slotScanFinished()
00131 {
00132 m_ippreport->setEnabled(false);
00133 const QPtrList<NetworkScanner::SocketInfo> *list = m_scanner->printerList();
00134 QPtrListIterator<NetworkScanner::SocketInfo> it(*list);
00135 for (;it.current();++it)
00136 {
00137 QString name;
00138 if (it.current()->Name.isEmpty())
00139 name = i18n("Unknown host - 1 is the IP", "<Unknown> (%1)").arg(it.current()->IP);
00140 else
00141 name = it.current()->Name;
00142 QListViewItem *item = new QListViewItem(m_list,name,it.current()->IP,QString::number(it.current()->Port));
00143 item->setPixmap(0,SmallIcon("kdeprint_printer"));
00144 }
00145 }
00146
00147 void KMWIppPrinter::slotPrinterSelected(QListViewItem *item)
00148 {
00149 m_ippreport->setEnabled(item != 0);
00150 if (!item) return;
00151
00152
00153 IppRequest req;
00154 QString uri;
00155 QStringList keys;
00156
00157 req.setOperation(IPP_GET_PRINTER_ATTRIBUTES);
00158 req.setHost(item->text(1));
00159 req.setPort(item->text(2).toInt());
00160 uri = QString::fromLatin1("ipp://%1:%2/ipp").arg(item->text(1)).arg(item->text(2));
00161 req.addURI(IPP_TAG_OPERATION,"printer-uri",uri);
00162 keys.append("printer-name");
00163 keys.append("printer-state");
00164 keys.append("printer-info");
00165 keys.append("printer-uri-supported");
00166 keys.append("printer-make-and-model");
00167 keys.append("printer-location");
00168 req.addKeyword(IPP_TAG_OPERATION,"requested-attributes",keys);
00169 if (req.doRequest("/ipp/") && (req.status() == IPP_OK || req.status() == IPP_OK_SUBST || req.status() == IPP_OK_CONFLICT))
00170 {
00171 QString value, txt;
00172 int state;
00173 if (req.name("printer-name",value)) txt.append(i18n("<b>Name</b>: %1<br>").arg(value));
00174 if (req.text("printer-location",value) && !value.isEmpty()) txt.append(i18n("<b>Location</b>: %1<br>").arg(value));
00175 if (req.text("printer-info",value) && !value.isEmpty()) txt.append(i18n("<b>Description</b>: %1<br>").arg(value.replace(QRegExp(";"),"<br>")));
00176 if (req.uri("printer-uri-supported",value))
00177 {
00178 if (value[0] == '/')
00179 value.prepend(QString::fromLatin1("ipp://%1:%2").arg(item->text(1)).arg(item->text(2)));
00180 m_uri->setText(value);
00181 }
00182 if (req.text("printer-make-and-model",value) && !value.isEmpty()) txt.append(i18n("<b>Model</b>: %1<br>").arg(value));
00183 if (req.enumvalue("printer-state",state))
00184 {
00185 switch (state)
00186 {
00187 case IPP_PRINTER_IDLE: value = i18n("Idle"); break;
00188 case IPP_PRINTER_STOPPED: value = i18n("Stopped"); break;
00189 case IPP_PRINTER_PROCESSING: value = i18n("Processing..."); break;
00190 default: value = i18n("Unknown State", "Unknown"); break;
00191 }
00192 txt.append(i18n("<b>State</b>: %1<br>").arg(value));
00193 }
00194 m_info->setText(txt);
00195 }
00196 else
00197 {
00198 m_uri->setText(uri);
00199 m_info->setText(i18n("Unable to retrieve printer info. Printer answered:<br><br>%1").arg(ippErrorString((ipp_status_t)req.status())));
00200 }
00201 }
00202
00203 void KMWIppPrinter::slotIppReport()
00204 {
00205 IppRequest req;
00206 QString uri("ipp://%1:%2/ipp");
00207 QListViewItem *item = m_list->currentItem();
00208
00209 if (item)
00210 {
00211 req.setOperation(IPP_GET_PRINTER_ATTRIBUTES);
00212 req.setHost(item->text(1));
00213 req.setPort(item->text(2).toInt());
00214 uri = uri.arg(item->text(1)).arg(item->text(2));
00215 req.addURI(IPP_TAG_OPERATION, "printer-uri", uri);
00216 if (req.doRequest("/ipp/"))
00217 {
00218 QString caption = i18n("IPP Report for %1").arg(item->text(0));
00219 static_cast<KMCupsManager*>(KMManager::self())->ippReport(req, IPP_TAG_PRINTER, caption);
00220 }
00221 else
00222 KMessageBox::error(this, i18n("Unable to generate report. IPP request failed with message: "
00223 "%1 (0x%2).").arg(ippErrorString((ipp_status_t)req.status())).arg(req.status(),0,16));
00224 }
00225 }
00226
00227 #include "kmwippprinter.moc"