2
* This file is part of the KDE libraries
3
* Copyright (c) 2001 Michael Goffioul <kdeprint@swing.be>
5
* This library is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU Library General Public
7
* License version 2 as published by the Free Software Foundation.
9
* This library is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
* Library General Public License for more details.
14
* You should have received a copy of the GNU Library General Public License
15
* along with this library; see the file COPYING.LIB. If not, write to
16
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17
* Boston, MA 02110-1301, USA.
20
#include "kio_print.h"
21
#include <kdeprint/kmprinter.h>
22
#include <kdeprint/kmmanager.h>
23
#include <kdeprint/kmjobmanager.h>
24
#include <kdeprint/kmjob.h>
25
#include <kdeprint/driver.h>
28
#include <qtextstream.h>
31
#include <kinstance.h>
32
#include <kio/global.h>
33
#include <kstandarddirs.h>
34
#include <kiconloader.h>
35
#include <kmimetype.h>
37
#include <kapplication.h>
38
#include <kcmdlineargs.h>
39
#include <kaboutdata.h>
41
#include <ktempfile.h>
49
#define PRINT_DEBUG kdDebug(7019) << "kio_print: "
53
int KDE_EXPORT kdemain(int argc, char **argv);
56
void addAtom(KIO::UDSEntry& entry, unsigned int ID, long l, const QString& s = QString::null)
65
static void createDirEntry(KIO::UDSEntry& entry, const QString& name, const QString& url, const QString& mime)
68
addAtom(entry, KIO::UDS_NAME, 0, name);
69
addAtom(entry, KIO::UDS_FILE_TYPE, S_IFDIR);
70
addAtom(entry, KIO::UDS_ACCESS, 0500);
71
addAtom(entry, KIO::UDS_MIME_TYPE, 0, mime);
72
addAtom(entry, KIO::UDS_URL, 0, url);
73
PRINT_DEBUG << "creating dir entry url=" << url << " mimetype=" << mime << endl;
74
addAtom(entry, KIO::UDS_SIZE, 0);
75
//addAtom(entry, KIO::UDS_GUESSED_MIME_TYPE, 0, "application/octet-stream");
78
static void createFileEntry(KIO::UDSEntry& entry, const QString& name, const QString& url, const QString& mime)
81
addAtom(entry, KIO::UDS_NAME, 0, name);
82
addAtom(entry, KIO::UDS_FILE_TYPE, S_IFREG);
83
addAtom(entry, KIO::UDS_URL, 0, url);
84
addAtom(entry, KIO::UDS_ACCESS, 0400);
85
addAtom(entry, KIO::UDS_MIME_TYPE, 0, mime);
86
addAtom(entry, KIO::UDS_SIZE, 0);
87
addAtom(entry, KIO::UDS_GUESSED_MIME_TYPE, 0, "application/octet-stream");
90
QString buildMenu(const QStringList& items, const QStringList& links, int active)
92
if (items.count() == 0 || items.count() != links.count())
93
return QString("<td height=20 class=\"menu\"> </td>");
97
for (QStringList::ConstIterator it1=items.begin(), it2=links.begin(); it1!=items.end() && it2!=links.end(); ++it1, ++it2, index++)
100
s.append("<td height=20 class=\"menuactive\"> ").append(*it1).append(" </td>");
102
s.append("<td height=20 class=\"menu\"> <a class=\"menu\" href=\"").append(*it2).append("\">").append(*it1).append("</a> </td>");
103
if ((unsigned int)index < items.count()-1)
104
s.append("<td height=20 class=\"menu\">|</td>");
109
QString buildOptionRow(DrBase *opt, bool f)
111
QString s("<tr class=\"%1\"><td width=\"41%\">%1</td><td width=\"59%\">%1</td></tr>\n");
112
s = s.arg(f ? "contentwhite" : "contentyellow").arg(opt->get("text")).arg(opt->prettyText());
116
QString buildGroupTable(DrGroup *grp, bool showHeader = true)
118
QString s("<tr class=\"top\"><td colspan=\"2\">%1</td></tr>\n");
120
s = s.arg(grp->get("text"));
124
QPtrListIterator<DrBase> oit(grp->options());
126
for (; oit.current(); ++oit, f = !f)
127
s.append(buildOptionRow(oit.current(), f));
129
QPtrListIterator<DrGroup> git(grp->groups());
130
for (; git.current(); ++git)
131
s.append(buildGroupTable(git.current()));
136
int kdemain(int argc, char **argv)
138
KInstance instance("kio_print");
140
PRINT_DEBUG << "starting ioslave" << endl;
143
fprintf(stderr, "Usage: kio_print protocol domain-socket1 domain-socket2\n");
147
/* create fake KApplicatiom object, needed for job stuffs */
148
KAboutData about( "kio_print", "kio_print", "fake_version",
149
"KDEPrint IO slave", KAboutData::License_GPL, "(c) 2003, Michael Goffioul" );
150
KCmdLineArgs::init( &about );
153
KIO_Print slave(argv[2], argv[3]);
154
slave.dispatchLoop();
156
PRINT_DEBUG << "done" << endl;
160
KIO_Print::KIO_Print(const QCString& pool, const QCString& app)
161
: KIO::SlaveBase("print", pool, app)
165
void KIO_Print::listDir(const KURL& url)
167
if ( url.protocol() == "printdb" )
173
QStringList path = QStringList::split('/', url.path(), false);
175
PRINT_DEBUG << "listing " << url.path() << endl;
176
QString group = path[0].lower();
177
if (path.count() == 0)
179
else if (path.count() == 1 && group != "manager" && group != "jobs")
181
PRINT_DEBUG << "listing group " << path[0] << endl;
187
if (group == "printers")
189
mask = KMPrinter::Printer;
190
mimeType = "print/printer";
192
else if (group == "classes")
194
mask = KMPrinter::Class | KMPrinter::Implicit;
195
mimeType = "print/class";
197
else if (group == "specials")
199
mask = KMPrinter::Special;
200
mimeType = "print/printer";
204
error(KIO::ERR_DOES_NOT_EXIST, url.url());
208
QPtrListIterator<KMPrinter> it(*(KMManager::self()->printerList()));
209
for (;it.current();++it)
211
if (!(it.current()->type() & mask) || !it.current()->instanceName().isEmpty())
213
PRINT_DEBUG << "rejecting " << it.current()->name() << endl;
217
//createFileEntry(entry, it.current()->name(), ("print:/"+path[0]+"/"+it.current()->name()), mimeType, "text/html", S_IFDIR);
218
createDirEntry(entry, it.current()->name(), ("print:/"+group+"/"+KURL::encode_string_no_slash(it.current()->name())), mimeType);
219
PRINT_DEBUG << "accepting " << it.current()->name() << endl;
220
listEntry(entry, false);
223
listEntry(KIO::UDSEntry(), true);
228
//error(KIO::ERR_UNSUPPORTED_ACTION, i18n("Unsupported path %1").arg(url.path()));
230
listEntry(KIO::UDSEntry(), true);
236
void KIO_Print::listRoot()
238
PRINT_DEBUG << "listing root entry" << endl;
243
createDirEntry(entry, i18n("Classes"), "print:/classes", "print/folder");
244
listEntry(entry, false);
247
createDirEntry(entry, i18n("Printers"), "print:/printers", "print/folder");
248
listEntry(entry, false);
251
createDirEntry(entry, i18n("Specials"), "print:/specials", "print/folder");
252
listEntry(entry, false);
255
//createFileEntry(entry, i18n("Manager"), "print:/manager", "print/manager", QString::null, S_IFDIR);
256
createDirEntry(entry, i18n("Manager"), "print:/manager", "print/manager");
257
listEntry(entry, false);
260
createDirEntry(entry, i18n("Jobs"), "print:/jobs", "print/jobs");
261
listEntry(entry, false);
265
listEntry(entry, true);
269
void KIO_Print::listDirDB( const KURL& url )
271
PRINT_DEBUG << "listDirDB: " << url << endl;
273
QStringList pathComps = QStringList::split( '/', url.path(), false );
276
remUrl.setProtocol( "http" );
277
remUrl.setHost( url.host() );
278
remUrl.setPort( url.port() );
279
remUrl.setPath( "/list-data.cgi" );
280
switch ( pathComps.size() )
282
case 0: /* list manufacturers */
283
remUrl.addQueryItem( "type", "makes" );
285
case 1: /* list printers for the given manufacturer */
286
remUrl.addQueryItem( "type", "printers" );
287
remUrl.addQueryItem( "make", pathComps[ 0 ] );
289
case 2: /* list drivers for given printer */
290
remUrl.addQueryItem( "type", "drivers" );
291
remUrl.addQueryItem( "printer", pathComps[ 1 ] );
294
error( KIO::ERR_UNSUPPORTED_ACTION, "Not implemented" );
297
remUrl.addQueryItem( "format", "xml" );
299
if ( getDBFile( remUrl ) )
302
if ( doc.setContent( &m_httpBuffer, false ) )
306
switch ( pathComps.size() )
309
l = doc.documentElement().elementsByTagName( "make" );
310
for ( unsigned int i=0; i<l.count(); i++ )
312
QString make = l.item( i ).toElement().text();
314
makeUrl.addPath( "/" + make );
315
createDirEntry( entry, make, makeUrl.url(), "print/folder" );
316
listEntry( entry, false );
317
PRINT_DEBUG << "make: " << make << endl;
321
l = doc.documentElement().elementsByTagName( "printer" );
322
for ( unsigned int i=0; i<l.count(); i++ )
325
for ( QDomNode n=l.item( i ).firstChild(); !n.isNull(); n=n.nextSibling() )
327
QDomElement e = n.toElement();
328
if ( e.tagName() == "id" )
330
else if ( e.tagName() == "model" )
333
if ( !ID.isEmpty() && !name.isEmpty() )
335
KURL printerUrl = url;
336
printerUrl.addPath( "/" + ID );
337
createDirEntry( entry, name, printerUrl.url(), "print/printermodel" );
338
listEntry( entry, false );
339
PRINT_DEBUG << "printer: " << ID << endl;
344
l = doc.documentElement().elementsByTagName( "driver" );
345
for ( unsigned int i=0; i<l.count(); i++ )
347
QString driver = l.item( i ).toElement().text();
348
KURL driverUrl = url;
349
driverUrl.addPath( "/" + driver );
350
createFileEntry( entry, driver, driverUrl.url(), "print/driver" );
351
listEntry( entry, false );
352
PRINT_DEBUG << "driver: " << driver << endl;
356
error( KIO::ERR_UNSUPPORTED_ACTION, "Not implemented" );
359
listEntry( KIO::UDSEntry(), true );
364
if ( m_httpBuffer.buffer().size() == 0 )
365
error( KIO::ERR_INTERNAL, i18n( "Empty data received (%1)." ).arg( url.host() ) );
367
error( KIO::ERR_INTERNAL, i18n( "Corrupted/incomplete data or server error (%1)." ).arg( url.host() ) );
371
* If error occured while downloading, error has been called by
372
* getDBFile. No need for a "else" statement.
376
void KIO_Print::stat(const KURL& url)
378
if ( url.protocol() == "printdb" )
384
PRINT_DEBUG << "stat: " << url.url() << endl;
385
QStringList path = QStringList::split('/', url.encodedPathAndQuery(-1), false);
390
PRINT_DEBUG << "path components: " << path.join(", ") << endl;
392
switch (path.count())
395
createDirEntry(entry, i18n("Print System"), "print:/", "print/folder");
398
if (path[0].lower() == "classes")
399
createDirEntry(entry, i18n("Classes"), "print:/classes", "print/folder");
400
else if (path[0].lower() == "printers")
401
createDirEntry(entry, i18n("Printers"), "print:/printers", "print/folder");
402
else if (path[0].lower() == "specials")
403
createDirEntry(entry, i18n("Specials"), "print:/specials", "print/folder");
404
else if (path[0].lower() == "manager")
405
createDirEntry(entry, i18n("Manager"), "print:/manager", "print/manager");
406
else if (path[0].lower().startsWith("jobs"))
407
createFileEntry(entry, i18n("Jobs"), url.url(), "text/html");
412
if (path[0].lower() == "printers")
413
mime = "print/printer";
414
else if (path[0].lower() == "classes")
415
mime = "print/class";
416
else if (path[0].lower() == "specials")
417
mime = "print/printer";
420
createFileEntry(entry, path[1], "print:/"+path[0]+"/"+path[1], "text/html");
430
error(KIO::ERR_DOES_NOT_EXIST, url.path());
433
void KIO_Print::statDB( const KURL& url )
435
PRINT_DEBUG << "statDB: " << url << endl;
437
QStringList pathComps = QStringList::split( '/', url.path(), false );
438
if ( pathComps.size() == 3 )
439
createFileEntry( entry, i18n( "Printer driver" ), url.url(), "print/driver" );
441
createDirEntry( entry, i18n( "On-line printer driver database" ), url.url(), "inode/directory" );
446
bool KIO_Print::getDBFile( const KURL& src )
448
PRINT_DEBUG << "downloading " << src.url() << endl;
450
/* re-initialize the internal buffer */
451
if ( m_httpBuffer.isOpen() )
452
m_httpBuffer.close();
454
m_httpBuffer.open( IO_WriteOnly|IO_Truncate ); // be sure to erase the existing data
456
/* start the transfer job */
457
KIO::TransferJob *job = KIO::get( src, false, false );
458
connect( job, SIGNAL( result( KIO::Job* ) ), SLOT( slotResult( KIO::Job* ) ) );
459
connect( job, SIGNAL( data( KIO::Job*, const QByteArray& ) ), SLOT( slotData( KIO::Job*, const QByteArray& ) ) );
460
connect( job, SIGNAL( totalSize( KIO::Job*, KIO::filesize_t ) ), SLOT( slotTotalSize( KIO::Job*, KIO::filesize_t ) ) );
461
connect( job, SIGNAL( processedSize( KIO::Job*, KIO::filesize_t ) ), SLOT( slotProcessedSize( KIO::Job*, KIO::filesize_t ) ) );
463
m_httpBuffer.close();
465
/* return the result */
466
if ( m_httpError != 0 )
467
error( m_httpError, m_httpErrorTxt );
468
return ( m_httpError == 0 );
471
void KIO_Print::getDB( const KURL& url )
473
PRINT_DEBUG << "downloading PPD file for " << url.url() << endl;
475
QStringList pathComps = QStringList::split( '/', url.path(), false );
476
if ( pathComps.size() != 3 )
477
error( KIO::ERR_MALFORMED_URL, url.url() );
482
remUrl.setProtocol( "http" );
483
remUrl.setHost( url.host() );
484
remUrl.setPath( "/ppd-o-matic.cgi" );
485
remUrl.addQueryItem( "driver", pathComps[ 2 ] );
486
remUrl.addQueryItem( "printer", pathComps[ 1 ] );
488
if ( getDBFile( remUrl ) )
490
mimeType( "text/plain" );
491
data( m_httpBuffer.buffer() );
495
* no "else" statement needed, the error has
496
* already been emitted by the getDBFile function
501
void KIO_Print::slotResult( KIO::Job *j )
504
* store slave results for later user (job gets deleted
505
* after this function). Store only if no other error
506
* occured previously (when writing to the buffer).
508
if ( m_httpError == 0 )
510
m_httpError = j->error();
511
m_httpErrorTxt = j->errorText();
516
void KIO_Print::slotData( KIO::Job *j, const QByteArray& d )
518
PRINT_DEBUG << "HTTP data received (size=" << d.size() << ")" << endl;
521
int len = m_httpBuffer.writeBlock( d );
522
if ( len == -1 || len != ( int )d.size() )
524
m_httpError = KIO::ERR_INTERNAL;
525
m_httpErrorTxt = "Unable to write to the internal buffer.";
531
void KIO_Print::slotTotalSize( KIO::Job*, KIO::filesize_t sz )
536
void KIO_Print::slotProcessedSize( KIO::Job*, KIO::filesize_t sz )
541
void KIO_Print::get(const KURL& url)
543
if ( url.protocol() == "printdb" )
549
QStringList elems = QStringList::split('/', url.encodedPathAndQuery(), false);
550
QString group(elems[0].lower()), printer(KURL::decode_string(elems[1])), path, query;
551
KMPrinter *mprinter(0);
553
if (group == "manager")
555
PRINT_DEBUG << "opening print management part" << endl;
557
mimeType("print/manager");
562
PRINT_DEBUG << "getting " << url.url() << endl;
564
if (group.startsWith("jobs"))
566
int p = group.find('?');
568
query = group.mid(p+1);
569
if (!query.isEmpty() && query != "jobs" && query != "completed_jobs")
571
error(KIO::ERR_MALFORMED_URL, QString::null);
574
PRINT_DEBUG << "listing jobs for all printers" << endl;
575
showJobs(0, query == "completed_jobs");
579
int p = printer.find('?');
582
query = printer.mid(p+1);
583
printer = printer.left(p);
586
PRINT_DEBUG << "opening " << url.url() << endl;
587
PRINT_DEBUG << "extracted printer name = " << printer << endl;
589
KMManager::self()->printerList(false);
590
mprinter = KMManager::self()->findPrinter(printer);
592
path = locateData(printer.isEmpty() ? group : printer);
594
if (elems.count() > 2 || (path.isEmpty() && group != "printers" && group != "classes" && group != "specials")
595
|| (mprinter == 0 && path.isEmpty()))
597
error(KIO::ERR_DOES_NOT_EXIST, url.path());
603
if (!query.isEmpty() && query != "general")
606
showJobs(mprinter, false);
607
else if (query == "completed_jobs")
608
showJobs(mprinter, true);
609
else if (query == "driver")
610
showDriver(mprinter);
612
error(KIO::ERR_MALFORMED_URL, KURL::decode_string(elems[1]));
614
else if (group == "printers" && mprinter->isPrinter())
615
showPrinterInfo(mprinter);
616
else if (group == "classes" && mprinter->isClass(true))
617
showClassInfo(mprinter);
618
else if (group == "specials" && mprinter->isSpecial())
619
showSpecialInfo(mprinter);
621
error(KIO::ERR_INTERNAL, i18n("Unable to determine object type for %1.").arg(printer));
623
else if (!path.isEmpty())
626
error(KIO::ERR_INTERNAL, i18n("Unable to determine source type for %1.").arg(printer));
629
void KIO_Print::showPrinterInfo(KMPrinter *printer)
631
if (!KMManager::self()->completePrinter(printer))
632
error(KIO::ERR_INTERNAL, i18n("Unable to retrieve printer information for %1.").arg(printer->name()));
635
mimeType("text/html");
638
if (!loadTemplate(QString::fromLatin1("printer.template"), content))
640
error(KIO::ERR_INTERNAL, i18n("Unable to load template %1").arg("printer.template"));
645
.arg(i18n("Properties of %1").arg(printer->printerName()))
646
.arg(i18n("Properties of %1").arg(printer->printerName()))
647
.arg(buildMenu(QStringList::split('|', i18n("General|Driver|Active jobs|Completed jobs"), false),
648
QStringList::split('|', "?general|?driver|?jobs|?completed_jobs", true),
651
.arg(printer->pixmap())
652
.arg(printer->name())
653
.arg(i18n("General Properties"))
654
.arg(i18n("Type")).arg(printer->isRemote() ? i18n("Remote") : i18n("Local"))
655
.arg(i18n("State")).arg(printer->stateString())
656
.arg(i18n("Location")).arg(printer->location())
657
.arg(i18n("Description")).arg(printer->description())
658
.arg(i18n("URI")).arg(printer->uri().prettyURL())
659
.arg(i18n("Interface (Backend)")).arg(printer->device())
661
.arg(i18n("Manufacturer")).arg(printer->manufacturer())
662
.arg(i18n("Model")).arg(printer->model())
663
.arg(i18n("Driver Information")).arg(printer->driverInfo());
665
data(content.local8Bit());
670
void KIO_Print::showClassInfo(KMPrinter *printer)
672
if (!KMManager::self()->completePrinter(printer))
673
error(KIO::ERR_INTERNAL, i18n("Unable to retrieve class information for %1.").arg(printer->name()));
676
mimeType("text/html");
679
if (!loadTemplate(QString::fromLatin1("class.template"), content))
681
error(KIO::ERR_INTERNAL, i18n("Unable to load template %1").arg("class.template"));
685
QString memberContent("<ul>\n");
686
QStringList members(printer->members());
687
for (QStringList::ConstIterator it=members.begin(); it!=members.end(); ++it)
689
memberContent.append(QString::fromLatin1("<li><a href=\"print:/printers/%1\">%2</a></li>\n").arg(*it).arg(*it));
691
memberContent.append("</ul>\n");
693
QString typeContent = (printer->isImplicit() ? i18n("Implicit") : (printer->isRemote() ? i18n("Remote") : i18n("Local")));
696
.arg(i18n("Properties of %1").arg(printer->printerName()))
697
.arg(i18n("Properties of %1").arg(printer->printerName()))
698
.arg(buildMenu(QStringList::split('|', i18n("General|Active jobs|Completed jobs"), false),
699
QStringList::split('|', "?general|?jobs|?completed_jobs", true),
702
.arg(printer->pixmap())
703
.arg(printer->name())
704
.arg(i18n("General Properties"))
705
.arg(i18n("Type")).arg(typeContent)
706
.arg(i18n("State")).arg(printer->stateString())
707
.arg(i18n("Location")).arg(printer->location())
708
.arg(i18n("Description")).arg(printer->description())
709
.arg(i18n("URI")).arg(printer->uri().prettyURL())
710
.arg(i18n("Members")).arg(memberContent);
712
data(content.local8Bit());
717
void KIO_Print::showSpecialInfo(KMPrinter *printer)
719
mimeType("text/html");
722
if (!loadTemplate(QString::fromLatin1("pseudo.template"), content))
724
error(KIO::ERR_INTERNAL, i18n("Unable to load template %1").arg("pseudo.template"));
728
QString reqContent("<ul>\n");
729
QStringList requirements = QStringList::split(",", printer->option("kde-special-require"), false);
730
for (QStringList::ConstIterator it=requirements.begin(); it!=requirements.end(); ++it)
731
reqContent += ("<li>" + (*it) + "</li>\n");
732
reqContent.append("</ul>\n");
735
.arg(i18n("Properties of %1").arg(printer->printerName()))
736
.arg(i18n("Properties of %1").arg(printer->printerName()))
737
.arg(buildMenu(QStringList::split('|', i18n("General"), false),
738
QStringList::split('|', "?general", true),
741
.arg(printer->pixmap())
742
.arg(printer->name())
743
.arg(i18n("General Properties"))
744
.arg(i18n("Location")).arg(printer->location())
745
.arg(i18n("Description")).arg(printer->description())
746
.arg(i18n("Requirements")).arg(reqContent)
747
.arg(i18n("Command Properties"))
748
.arg(i18n("Command")).arg("<tt>"+printer->option("kde-special-command")+"</tt>")
749
.arg(i18n("Use Output File")).arg(printer->option("kde-special-file") == "1" ? i18n("Yes") : i18n("No"))
750
.arg(i18n("Default Extension")).arg(printer->option("kde-special-extension"));
752
data(content.local8Bit());
756
bool KIO_Print::loadTemplate(const QString& filename, QString& buffer)
758
QFile f(locate("data", QString::fromLatin1("kdeprint/template/")+filename));
759
if (f.exists() && f.open(IO_ReadOnly))
767
buffer = QString::null;
772
void KIO_Print::showData(const QString& pathname)
774
PRINT_DEBUG << "sending data: " << pathname << endl;
776
if (f.exists() && f.open(IO_ReadOnly))
778
QByteArray arr(f.readAll());
779
mimeType(KMimeType::findByURL(KURL(pathname), 0, true, true)->name());
785
PRINT_DEBUG << "file not found" << endl;
786
error(KIO::ERR_DOES_NOT_EXIST, pathname);
791
* Locate a data in this order:
792
* - $KDEDIR/share/apps/kdeprint/template/
793
* - as a desktop icon
795
QString KIO_Print::locateData(const QString& item)
797
QString path = locate("data", "kdeprint/template/"+item);
799
path = KGlobal::iconLoader()->iconPath(item, KIcon::Desktop, true);
803
void KIO_Print::showJobs(KMPrinter *prt, bool completed)
805
mimeType("text/html");
807
// Add the printer to the current list in the job manager
808
KMJobManager::JobType type = (completed ? KMJobManager::CompletedJobs : KMJobManager::ActiveJobs);
809
KMJobManager *mgr = KMJobManager::self();
811
mgr->addPrinter(prt->printerName(), type);
814
QPtrListIterator<KMPrinter> pit(*(KMManager::self()->printerList()));
815
for (; pit.current(); ++pit)
816
if (pit.current()->isVirtual() || pit.current()->isSpecial())
819
mgr->addPrinter(pit.current()->printerName(), type);
823
if (!loadTemplate(QString::fromLatin1("jobs.template"), content))
825
error(KIO::ERR_INTERNAL, i18n("Unable to load template %1").arg("pseudo.template"));
832
.arg(i18n("Jobs of %1").arg(prt->printerName()))
833
.arg(i18n("Jobs of %1").arg(prt->printerName()))
834
.arg(prt->isClass () ?
835
buildMenu(QStringList::split('|', i18n("General|Active jobs|Completed jobs"), false),
836
QStringList::split('|', "?general|?jobs|?completed_jobs", true),
837
(completed ? 2 : 1)) :
838
buildMenu(QStringList::split('|', i18n("General|Driver|Active jobs|Completed jobs"), false),
839
QStringList::split('|', "?general|?driver|?jobs|?completed_jobs", true),
840
(completed ? 3 : 2)))
843
.arg(prt->printerName());
848
.arg(i18n("All jobs"))
849
.arg(buildMenu(QStringList::split('|', i18n("Active jobs|Completed jobs"), false),
850
QStringList::split('|', "?jobs|?completed_jobs", true),
851
(completed ? 1 : 0)))
853
.arg(i18n("All jobs"));
855
content = content.arg(i18n("ID")).arg(i18n("Owner")).arg(i18n("Printer")).arg(i18n("Name")).arg(i18n("State"));
857
QString jobContent, cellContent("<td>%1</td>\n");
858
QPtrListIterator<KMJob> it(mgr->jobList());
860
for (; it.current(); ++it, flag = !flag)
862
jobContent.append("<tr class=\"").append(flag ? "contentyellow" : "contentwhite").append("\">\n");
863
jobContent.append(cellContent.arg(it.current()->id()));
864
jobContent.append(cellContent.arg(it.current()->owner()));
865
jobContent.append(cellContent.arg(it.current()->printer()));
866
jobContent.append(cellContent.arg(it.current()->name()));
867
jobContent.append(cellContent.arg(it.current()->stateString()));
868
jobContent.append("</tr>\n");
870
content = content.arg(jobContent);
872
// remove the current printer to the current list in the job manager
874
mgr->removePrinter(prt->printerName(), type);
877
QPtrListIterator<KMPrinter> pit(*(KMManager::self()->printerList()));
878
for (; pit.current(); ++pit)
879
if (pit.current()->isVirtual() || pit.current()->isSpecial())
882
mgr->removePrinter(pit.current()->printerName(), type);
885
data(content.local8Bit());
889
void KIO_Print::showDriver(KMPrinter *prt)
891
mimeType("text/html");
894
if (!loadTemplate(QString::fromLatin1("driver.template"), content))
896
error(KIO::ERR_INTERNAL, i18n("Unable to load template %1").arg("pseudo.template"));
900
DrMain *driver = KMManager::self()->loadPrinterDriver(prt, true);
902
.arg(i18n("Driver of %1").arg(prt->printerName()))
903
.arg(i18n("Driver of %1").arg(prt->printerName()))
904
.arg(buildMenu(QStringList::split('|', i18n("General|Driver|Active jobs|Completed jobs"), false),
905
QStringList::split('|', "?general|?driver|?jobs|?completed_jobs", true),
909
.arg(prt->printerName() + " (" + (driver ? driver->get("text") : i18n("No driver found")) + ")");
912
content = content.arg(buildGroupTable(driver, false));
914
content = content.arg(QString::null);
916
data(content.local8Bit());
920
#include "kio_print.moc"