print-manager: removing it, use the web browser interface instead

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2022-03-14 08:03:06 +02:00
parent 9945d17ddc
commit a932a2e3c1
141 changed files with 1 additions and 19365 deletions

View file

@ -53,7 +53,6 @@ macro_optional_add_subdirectory(kuser)
macro_optional_add_subdirectory(kvkbd)
macro_optional_add_subdirectory(okular)
macro_optional_add_subdirectory(partitionmanager)
macro_optional_add_subdirectory(print-manager)
macro_optional_add_subdirectory(skanlite)
macro_optional_add_subdirectory(thumbnailers)
macro_optional_add_subdirectory(yakuake)

View file

@ -21,7 +21,7 @@ build_script:
sudo apt-get install -qq cmake katie-dev katana-baseapps \
katana-workspace xorg-dev zlib1g-dev libgpgme-dev \
libacl1-dev libattr1-dev libarchive-dev libasound2-dev libatasmart-dev \
libavcodec-dev libavformat-dev libavutil-dev libblkid-dev libcups2-dev \
libavcodec-dev libavformat-dev libavutil-dev libblkid-dev \
libdjvulibre-dev libepub-dev libexiv2-dev libfreetype6-dev \
libgcrypt20-dev libgettextpo-dev libgmp-dev libmms-dev libparted-dev \
libqalculate-dev libsane-dev libspectre-dev libspeechd-dev \

View file

@ -1,37 +0,0 @@
project(print-manager)
if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR})
find_package(KDE4 4.21.0 REQUIRED)
include(KDE4Defaults)
include_directories(${KDE4_INCLUDES})
add_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS})
endif()
find_package(Cups "1.5" REQUIRED)
include(MacroLibrary)
# Print-Manager version
set(PM_VERSION "0.3.0" CACHE STRING "Print Manager version")
# Generate config.h
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake
${CMAKE_CURRENT_BINARY_DIR}/config.h
)
include_directories(
${CMAKE_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/libkcups
${CUPS_INCLUDE_DIR}
)
add_subdirectory(libkcups)
add_subdirectory(configure-printer)
add_subdirectory(add-printer)
add_subdirectory(printer-manager-kcm)
add_subdirectory(printqueue)
add_subdirectory(print-manager-kded)
add_subdirectory(plasmoid)
add_subdirectory(declarative-plugins)

View file

@ -1,339 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

View file

@ -1,8 +0,0 @@
#! /usr/bin/env bash
$EXTRACTRC `find . -name "*.rc" -o -name "*.ui" | grep -v "plasmoid"` >> rc.cpp
$XGETTEXT `find . -name "*.cpp" | grep -v "plasmoid"` -o $podir/print-manager.pot
rm -f rc.cpp
$EXTRACTRC `find plasmoid -name "*.rc" -o -name "*.ui"` >> rc.cpp
$XGETTEXT rc.cpp `find plasmoid -name "*.cpp"` -o $podir/plasma_applet_org.kde.printmanager.pot
$XGETTEXT `find plasmoid -name "*.qml"` -j -L Java -o $podir/plasma_applet_org.kde.printmanager.pot

View file

@ -1,25 +0,0 @@
This project aims to be a full replacement for the
current printing management of KDE.
* It should be small and fast
* Simple and functional
* Very well integrated
printd - contains a kded module that checks for user print jobs and shows a systray icon
--TODO
- Integrate with PackageKit, talking to PK is easy
the hard part is understand what s-c-p does.
printqueue - contains an application that show the printers queue
printer-manager-kcm - configure printers in a very simple way
add-printer - a wizard to add new printers
--TODO
- Search for windows printers using samba
- Guess the print queue for some kind of printers
plasmoid - show printers and it's jobs
--TODO
- Move the jobs dataengine to a QML plugin
so we can load all jobs and still be fast

View file

@ -1,112 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "AddPrinter.h"
#include "AddPrinterAssistant.h"
#include <KCupsRequest.h>
#include <QPointer>
#include <KWindowSystem>
#include <KDebug>
AddPrinter::AddPrinter() :
KApplication()
{
setQuitOnLastWindowClosed(true);
}
AddPrinter::~AddPrinter()
{
}
void AddPrinter::addPrinter(qulonglong wid)
{
AddPrinterAssistant *wizard = new AddPrinterAssistant();
wizard->initAddPrinter();
show(wizard, wid);
}
void AddPrinter::addClass(qulonglong wid)
{
AddPrinterAssistant *wizard = new AddPrinterAssistant();
wizard->initAddClass();
show(wizard, wid);
}
void AddPrinter::changePPD(qulonglong wid, const QString &name)
{
// Fist we need to get the printer attributes
QPointer<KCupsRequest> request = new KCupsRequest;
QStringList attr;
attr << KCUPS_PRINTER_TYPE; // needed to know if it's a remote printer
attr << KCUPS_PRINTER_MAKE_AND_MODEL;
attr << KCUPS_DEVICE_URI;
request->getPrinterAttributes(name, false, attr);
request->waitTillFinished();
if (request) {
if (!request->hasError() && request->printers().size() == 1) {
KCupsPrinter printer = request->printers().first();
if (printer.type() & CUPS_PRINTER_REMOTE) {
kWarning() << "Ignoring request, can not change PPD of remote printer" << name;
} else {
AddPrinterAssistant *wizard = new AddPrinterAssistant();
wizard->initChangePPD(name, printer.deviceUri(), printer.makeAndModel());
show(wizard, wid);
}
} else {
kWarning() << "Ignoring request, printer not found" << name << request->errorMsg();
}
request->deleteLater();
}
}
void AddPrinter::newPrinterFromDevice(qulonglong wid, const QString &name, const QString &device_id)
{
// Example of data
// "direct"
// "MFG:Samsung;CMD:GDI;MDL:SCX-4200 Series;CLS:PRINTER;MODE:PCL;STATUS:IDLE;"
// "Samsung SCX-4200 Series"
// "Samsung SCX-4200 Series"
// "usb://Samsung/SCX-4200%20Series"
// ""
// printer = "Samsung SCX-3400 Series";
// deviceId = "MFG:Samsung;CMD:SPL,FWV,PIC,BDN,EXT;MDL:SCX-3400 Series;CLS:PRINTER;MODE:SCN,SPL3,R000105;STATUS:BUSY;";
// printer = "Samsung SCX-4200 Series";
// deviceId = "MFG:Samsung;CMD:GDI;MDL:SCX-4200 Series;CLS:PRINTER;MODE:PCL;STATUS:IDLE;";
// printer = "HP PSC 1400 series";
// deviceId = "MFG:HP;MDL:PSC 1400 series;DES:;CMD:LDL,MLC,PML,DYN;";
AddPrinterAssistant *wizard = new AddPrinterAssistant();
wizard->initAddPrinter(name, device_id);
show(wizard, wid);
}
void AddPrinter::show(QWidget *widget, qulonglong wid) const
{
widget->show();
KWindowSystem::forceActiveWindow(widget->winId());
KWindowSystem::setMainWindow(widget, wid);
}

View file

@ -1,61 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef ADDPRINTER_H
#define ADDPRINTER_H
#include <KApplication>
class AddPrinterInterface;
class AddPrinter : public KApplication
{
Q_OBJECT
public:
AddPrinter();
virtual ~AddPrinter();
/**
* This method allows to browse discovered printers and add them
*/
void addPrinter(qulonglong wid);
/**
* This method allows to browse printers and create a class
*/
void addClass(qulonglong wid);
/**
* This method allows to change the PPD of an existing printer
*/
void changePPD(qulonglong wid, const QString &name);
/**
* This method allows to browse the PPD list,
* and adding the printer described by device_id
*/
void newPrinterFromDevice(qulonglong wid, const QString &name, const QString &device_id);
private:
void show(QWidget *widget, qulonglong wid) const;
AddPrinterInterface *m_pqInterface;
};
#endif //ADDPRINTER_H

View file

@ -1,251 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "AddPrinterAssistant.h"
#include "PageDestinations.h"
#include "PageChoosePrinters.h"
#include "PageChoosePPD.h"
#include "PageAddPrinter.h"
#include <QHostInfo>
#include <KCupsRequest.h>
#include <KLocale>
#include <KPushButton>
#include <KPixmapSequence>
#include <KDebug>
AddPrinterAssistant::AddPrinterAssistant() :
KAssistantDialog(),
m_devicesPage(0),
m_chooseClassPage(0),
m_choosePPDPage(0),
m_addPrinterPage(0)
{
setWindowTitle(i18nc("@title:window", "Add a New Printer"));
setWindowIcon(KIcon("printer"));
showButton(KDialog::Cancel, false);
setDefaultButton(KDialog::User2); // next
setDefaultButton(KDialog::User1); // finished
// Needed so we have our dialog size saved
setAttribute(Qt::WA_DeleteOnClose);
// Configure the help button to be flat, disabled and empty
button(KDialog::Help)->setFlat(true);
button(KDialog::Help)->setEnabled(false);
button(KDialog::Help)->setIcon(QIcon());
button(KDialog::Help)->setText(QString());
// Setup the busy cursor
m_busySeq = new KPixmapSequenceOverlayPainter(this);
m_busySeq->setSequence(KPixmapSequence("process-working", KIconLoader::SizeSmallMedium));
m_busySeq->setAlignment(Qt::AlignHCenter | Qt::AlignBottom);
m_busySeq->setWidget(button(KDialog::Help));
// Restore the dialog size
KConfig config("print-manager");
KConfigGroup configGroup(&config, "AddPrinterAssistant");
restoreDialogSize(configGroup);
}
AddPrinterAssistant::~AddPrinterAssistant()
{
KConfig config("print-manager");
KConfigGroup configGroup(&config, "AddPrinterAssistant");
saveDialogSize(configGroup);
}
void AddPrinterAssistant::initAddPrinter(const QString &printer, const QString &deviceId)
{
// setup our hash args with the information if we are
// adding a new printer or a class
QVariantHash args;
args[ADDING_PRINTER] = true;
KPageWidgetItem *currentPage;
if (deviceId.isNull()) {
m_devicesPage = new KPageWidgetItem(new PageDestinations(args), i18nc("@title:window", "Select a Printer to Add"));
addPage(m_devicesPage);
currentPage = m_devicesPage;
m_choosePPDPage = new KPageWidgetItem(new PageChoosePPD, i18nc("@title:window", "Pick a Driver"));
addPage(m_choosePPDPage);
} else {
args[KCUPS_DEVICE_URI] = printer;
args[KCUPS_DEVICE_ID] = deviceId;
args[KCUPS_DEVICE_LOCATION] = QHostInfo::localHostName();
m_choosePPDPage = new KPageWidgetItem(new PageChoosePPD(args), i18nc("@title:window", "Pick a Driver"));
addPage(m_choosePPDPage);
currentPage = m_choosePPDPage;
}
m_addPrinterPage = new KPageWidgetItem(new PageAddPrinter, i18nc("@title:window", "Please describe you printer"));
addPage(m_addPrinterPage);
// Set this later so that all m_*Pages are created
setCurrentPage(currentPage);
}
void AddPrinterAssistant::initAddClass()
{
// setup our hash args with the information if we are
// adding a new printer or a class
QVariantHash args;
args[ADDING_PRINTER] = false;
args[KCUPS_DEVICE_LOCATION] = QHostInfo::localHostName();
KPageWidgetItem *currentPage;
m_chooseClassPage = new KPageWidgetItem(new PageChoosePrinters(args), i18nc("@title:window", "Configure your connection"));
addPage(m_chooseClassPage);
currentPage = m_chooseClassPage;
m_addPrinterPage = new KPageWidgetItem(new PageAddPrinter, i18nc("@title:window", "Please describe you printer"));
addPage(m_addPrinterPage);
// Set this later so that all m_*Pages are created
setCurrentPage(currentPage);
}
void AddPrinterAssistant::initChangePPD(const QString &printer, const QString &deviceUri, const QString &makeAndModel)
{
// setup our hash args with the information if we are
// adding a new printer or a class
QVariantHash args;
args[ADDING_PRINTER] = true;
args[KCUPS_DEVICE_URI] = deviceUri;
args[KCUPS_PRINTER_NAME] = printer;
args[KCUPS_PRINTER_MAKE_AND_MODEL] = makeAndModel;
m_choosePPDPage = new KPageWidgetItem(new PageChoosePPD(args), i18nc("@title:window", "Pick a Driver"));
addPage(m_choosePPDPage);
setCurrentPage(m_choosePPDPage);
}
void AddPrinterAssistant::back()
{
KAssistantDialog::back();
GenericPage *currPage;
currPage = qobject_cast<GenericPage*>(currentPage()->widget());
enableNextButton(currPage->canProceed());
if (!qobject_cast<GenericPage*>(currentPage()->widget())->isValid()) {
back();
}
}
void AddPrinterAssistant::next()
{
next(currentPage());
}
void AddPrinterAssistant::next(KPageWidgetItem *currentPage)
{
// Each page has all it's settings and previous pages
// settings stored, so when going backwards
// we don't set (or even unset values),
// and we only call setValues on the next page if
// the currentPage() has changes.
QVariantHash args = qobject_cast<GenericPage*>(currentPage->widget())->values();
if (currentPage == m_devicesPage) {
qobject_cast<GenericPage*>(m_choosePPDPage->widget())->setValues(args);
setCurrentPage(m_choosePPDPage);
} else if (currentPage == m_chooseClassPage ||currentPage == m_choosePPDPage) {
qobject_cast<GenericPage*>(m_addPrinterPage->widget())->setValues(args);
setCurrentPage(m_addPrinterPage);
}
}
void AddPrinterAssistant::setCurrentPage(KPageWidgetItem *page)
{
// if after setting the values the page is still valid show
// it up, if not call next with it so we can find the next page
if (qobject_cast<GenericPage*>(page->widget())->isValid()) {
KAssistantDialog::setCurrentPage(page);
GenericPage *currPage = qobject_cast<GenericPage*>(currentPage()->widget());
GenericPage *nextPage = qobject_cast<GenericPage*>(page->widget());
// Disconnect the current page slots
disconnect(currPage, SIGNAL(allowProceed(bool)), this, SLOT(enableNextButton(bool)));
disconnect(currPage, SIGNAL(allowProceed(bool)), this, SLOT(enableFinishButton(bool)));
disconnect(currPage, SIGNAL(startWorking()), m_busySeq, SLOT(start()));
disconnect(currPage, SIGNAL(stopWorking()), m_busySeq, SLOT(stop()));
disconnect(currPage, SIGNAL(proceed()), this, SLOT(next()));
// Connect next page signals
connect(currPage, SIGNAL(startWorking()), m_busySeq, SLOT(start()));
connect(currPage, SIGNAL(stopWorking()), m_busySeq, SLOT(stop()));
connect(nextPage, SIGNAL(proceed()), this, SLOT(next()));
// check the working property
if (nextPage->isWorking()) {
m_busySeq->start();
} else {
m_busySeq->stop();
}
// When ChangePPD() is called addPrinterPage is zero
if (page == m_addPrinterPage || m_addPrinterPage == 0) {
connect(nextPage, SIGNAL(allowProceed(bool)), this, SLOT(enableFinishButton(bool)));
enableNextButton(false);
enableFinishButton(nextPage->canProceed());
} else {
connect(nextPage, SIGNAL(allowProceed(bool)), this, SLOT(enableNextButton(bool)));
enableNextButton(nextPage->canProceed());
}
} else {
// In case page is not valid try the next one
next(page);
}
}
void AddPrinterAssistant::showEvent(QShowEvent *event)
{
KAssistantDialog::showEvent(event);
enableNextButton(false);
enableFinishButton(false);
}
void AddPrinterAssistant::slotButtonClicked(int button)
{
// Finish Button
if (button == KDialog::User1) {
GenericPage *page = qobject_cast<GenericPage*>(currentPage()->widget());
enableFinishButton(false);
if (page->finishClicked()) {
KAssistantDialog::slotButtonClicked(button);
} else {
enableFinishButton(true);
}
} else {
KAssistantDialog::slotButtonClicked(button);
}
}
void AddPrinterAssistant::enableNextButton(bool enable)
{
enableButton(KDialog::User2, enable);
}
void AddPrinterAssistant::enableFinishButton(bool enable)
{
enableButton(KDialog::User1, enable);
}

View file

@ -1,58 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef ADD_PRINTER_ASSISTANT_H
#define ADD_PRINTER_ASSISTANT_H
#include <KAssistantDialog>
#include <KPixmapSequenceOverlayPainter>
class AddPrinterAssistant : public KAssistantDialog
{
Q_OBJECT
public:
AddPrinterAssistant();
virtual ~AddPrinterAssistant();
void initAddPrinter(const QString &printer = QString(), const QString &deviceId = QString());
void initAddClass();
void initChangePPD(const QString &printer, const QString &deviceUri, const QString &makeAndModel);
public slots:
void back();
void next();
void enableNextButton(bool enable);
void enableFinishButton(bool enable);
void slotButtonClicked(int button);
private:
void next(KPageWidgetItem *currentPage);
void setCurrentPage(KPageWidgetItem *page);
virtual void showEvent(QShowEvent * event);
KPageWidgetItem *m_devicesPage;
KPageWidgetItem *m_chooseClassPage;
KPageWidgetItem *m_choosePPDPage;
KPageWidgetItem *m_addPrinterPage;
KPixmapSequenceOverlayPainter *m_busySeq;
};
#endif

View file

@ -1,40 +0,0 @@
find_package(KDE4Internal REQUIRED)
set(addprinter_SRCS
main.cpp
AddPrinter.cpp
DevicesModel.cpp
GenericPage.cpp
PageDestinations.cpp
ChooseLpd.cpp
ChooseSamba.cpp
ChooseSerial.cpp
ChooseSocket.cpp
ChooseUri.cpp
PageChoosePrinters.cpp
PageChoosePPD.cpp
PageAddPrinter.cpp
AddPrinterAssistant.cpp
PageDestinations.ui
ChooseLpd.ui
ChooseSamba.ui
ChooseSerial.ui
ChooseSocket.ui
ChooseUri.ui
PageChoosePrinters.ui
PageChoosePPD.ui
PageAddPrinter.ui
)
add_executable(kde-add-printer
${addprinter_SRCS}
)
target_link_libraries(kde-add-printer
${KDE4_KDEUI_LIBS}
${QT_QTNETWORK_LIBRARY}
${KDE4_KIO_LIBS}
kcupslib
)
install(TARGETS kde-add-printer DESTINATION ${KDE4_BIN_INSTALL_DIR})

View file

@ -1,92 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "ChooseLpd.h"
#include "ui_ChooseLpd.h"
#include <KCupsRequest.h>
#include <QPainter>
#include <KDebug>
#include <KLocale>
ChooseLpd::ChooseLpd(QWidget *parent) :
GenericPage(parent),
ui(new Ui_ChooseLpd),
m_isValid(false)
{
ui->setupUi(this);
// setup default options
setWindowTitle(i18nc("@title:window", "Select a Printer to Add"));
}
ChooseLpd::~ChooseLpd()
{
delete ui;
}
void ChooseLpd::on_addressLE_textChanged(const QString &text)
{
kDebug() << text;
}
void ChooseLpd::setValues(const QVariantHash &args)
{
m_args = args;
QString deviceUri = args[KCUPS_DEVICE_URI].toString();
kDebug() << deviceUri;
if (deviceUri.contains(QLatin1Char('/'))) {
m_isValid = false;
return;
}
m_isValid = true;
ui->addressLE->setText(deviceUri);
ui->addressLE->setFocus();
}
QVariantHash ChooseLpd::values() const
{
QVariantHash ret = m_args;
ret[KCUPS_DEVICE_URI] = static_cast<QString>(QLatin1String("lpd://") + ui->addressLE->text());
return ret;
}
bool ChooseLpd::canProceed() const
{
bool allow = false;
if (!ui->addressLE->text().isEmpty()) {
KUrl url = KUrl(QLatin1String("lpd://") + ui->addressLE->text());
allow = url.isValid();
}
return allow;
}
bool ChooseLpd::isValid() const
{
return m_isValid;
}
void ChooseLpd::checkSelected()
{
// emit allowProceed(!devicesLV->selectionModel()->selection().isEmpty());
}

View file

@ -1,53 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef CHOOSE_LPD_H
#define CHOOSE_LPD_H
#include "GenericPage.h"
QT_BEGIN_NAMESPACE
class Ui_ChooseLpd;
QT_END_NAMESPACE
class ChooseLpd : public GenericPage
{
Q_OBJECT
public:
explicit ChooseLpd(QWidget *parent = 0);
~ChooseLpd();
void setValues(const QVariantHash &args);
QVariantHash values() const;
bool isValid() const;
bool canProceed() const;
public slots:
void on_addressLE_textChanged(const QString &text);
private slots:
void checkSelected();
private:
Ui_ChooseLpd *ui;
bool m_isValid;
};
#endif

View file

@ -1,68 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ChooseLpd</class>
<widget class="QWidget" name="ChooseLpd">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Ignored" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QFormLayout" name="formLayout">
<property name="margin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Address:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="KLineEdit" name="addressLE"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Queue:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="KLineEdit" name="queueLE"/>
</item>
<item>
<widget class="QPushButton" name="detectPB">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Detect</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KLineEdit</class>
<extends>QLineEdit</extends>
<header>klineedit.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View file

@ -1,133 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "ChooseSamba.h"
#include "ui_ChooseSamba.h"
#include <KCupsRequest.h>
#include <QPainter>
#include <KUrl>
#include <KDebug>
#include <KLocale>
ChooseSamba::ChooseSamba(QWidget *parent) :
GenericPage(parent),
ui(new Ui_ChooseSamba)
{
ui->setupUi(this);
// setup default options
setWindowTitle(i18nc("@title:window", "Select a Printer to Add"));
connect(ui->addressLE, SIGNAL(textChanged(QString)), this, SLOT(checkSelected()));
connect(ui->usernameLE, SIGNAL(textChanged(QString)), this, SLOT(checkSelected()));
connect(ui->passwordLE, SIGNAL(textChanged(QString)), this, SLOT(checkSelected()));
}
ChooseSamba::~ChooseSamba()
{
delete ui;
}
void ChooseSamba::setValues(const QVariantHash &args)
{
m_args = args;
ui->addressLE->setFocus();
}
QVariantHash ChooseSamba::values() const
{
QVariantHash ret = m_args;
QString address = ui->addressLE->text().trimmed();
KUrl url;
if (address.startsWith(QLatin1String("//"))) {
url = QLatin1String("smb:") + address;
} else if (address.startsWith(QLatin1String("/"))) {
url = QLatin1String("smb:/") + address;
} else if (address.startsWith(QLatin1String("://"))) {
url = QLatin1String("smb") + address;
} else if (address.startsWith(QLatin1String("smb://"))) {
url = address;
} else if (!KUrl(address).protocol().isEmpty() &&
KUrl(address).protocol() != QLatin1String("smb")) {
url = address;
url.setProtocol(QLatin1String("smb"));
} else {
url = QLatin1String("smb://") + address;
}
kDebug() << 1 << url;
if (!ui->usernameLE->text().isEmpty()) {
url.setUser(ui->usernameLE->text());
}
if (!ui->passwordLE->text().isEmpty()) {
url.setPass(ui->passwordLE->text());
}
kDebug() << 2 << url;
kDebug() << 3 << url.url() << url.path().section(QLatin1Char('/'), -1, -1);// same as url.fileName()
kDebug() << 4 << url.fileName();
kDebug() << 5 << url.host() << url.url().section(QLatin1Char('/'), 3, 3).toLower();
ret[KCUPS_DEVICE_URI] = url.url();
ret[KCUPS_DEVICE_INFO] = url.fileName();
// if there is 4 '/' means the url is like
// smb://group/host/printer, so the location is at a different place
if (url.url().count(QLatin1Char('/') == 4)) {
ret[KCUPS_DEVICE_LOCATION] = url.url().section(QLatin1Char('/'), 3, 3).toLower();
} else {
ret[KCUPS_DEVICE_LOCATION] = url.host();
}
return ret;
}
bool ChooseSamba::isValid() const
{
QVariantHash args = values();
KUrl url(args[KCUPS_DEVICE_URI].toString());
return url.isValid() &&
!url.isEmpty() &&
!url.protocol().isEmpty() &&
url.hasHost() &&
url.hasPath() &&
!url.fileName().isEmpty() &&
url.url().count(QLatin1Char('/')) <= 4;
}
bool ChooseSamba::canProceed() const
{
return isValid();
}
void ChooseSamba::load()
{
}
void ChooseSamba::checkSelected()
{
emit allowProceed(isValid());
}

View file

@ -1,52 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef CHOOSE_SAMBA_H
#define CHOOSE_SAMBA_H
#include "GenericPage.h"
QT_BEGIN_NAMESPACE
class Ui_ChooseSamba;
QT_END_NAMESPACE
class ChooseSamba : public GenericPage
{
Q_OBJECT
public:
explicit ChooseSamba(QWidget *parent = 0);
~ChooseSamba();
void setValues(const QVariantHash &args);
QVariantHash values() const;
bool isValid() const;
bool canProceed() const;
public slots:
void load();
private slots:
void checkSelected();
private:
Ui_ChooseSamba *ui;
};
#endif

View file

@ -1,123 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ChooseSamba</class>
<widget class="QWidget" name="ChooseSamba">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Ignored" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="margin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string comment="@title:group">Windows Printer via SAMBA</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="1" column="0" colspan="2">
<widget class="QLabel" name="label_6">
<property name="text">
<string comment="@label samba URL markup example, this is preceded by a label containing smb://">smb://[workgroup/]server[:port]/printer</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="KLineEdit" name="addressLE"/>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="browsePB">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string comment="@action:button">Browse</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string comment="@title:group">Authentication</string>
</property>
<layout class="QFormLayout" name="formLayout_2">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string comment="@label:textbox">Username:</string>
</property>
<property name="buddy">
<cstring>usernameLE</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="KLineEdit" name="usernameLE"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string comment="@label:textbox">Password</string>
</property>
<property name="buddy">
<cstring>passwordLE</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="KLineEdit" name="passwordLE">
<property name="passwordMode">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="2" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KLineEdit</class>
<extends>QLineEdit</extends>
<header>klineedit.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>addressLE</tabstop>
<tabstop>usernameLE</tabstop>
<tabstop>passwordLE</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

View file

@ -1,122 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "ChooseSerial.h"
#include "ui_ChooseSerial.h"
#include <KCupsRequest.h>
#include <QPainter>
#include <KDebug>
#include <KLocale>
ChooseSerial::ChooseSerial(QWidget *parent) :
GenericPage(parent),
ui(new Ui_ChooseSerial),
m_rx("\\?baud=(\\d+)"),
m_isValid(false)
{
ui->setupUi(this);
// setup default options
setWindowTitle(i18nc("@title:window", "Select a Printer to Add"));
ui->parityCB->addItem(i18nc("@label:listbox", "None"), "none");
ui->parityCB->addItem(i18nc("@label:listbox", "Even"), "even");
ui->parityCB->addItem(i18nc("@label:listbox", "Odd"), "odd");
ui->flowCB->addItem(i18nc("@label:listbox", "None"), "none");
ui->flowCB->addItem(i18nc("@label:listbox", "XON/XOFF (Software)"), "soft");
ui->flowCB->addItem(i18nc("@label:listbox", "RTS/CTS (Hardware)"), "hard");
ui->flowCB->addItem(i18nc("@label:listbox", "DTR/DSR (Hardware)"), "dtrdsr");
}
ChooseSerial::~ChooseSerial()
{
delete ui;
}
bool ChooseSerial::isValid() const
{
return m_isValid;
};
void ChooseSerial::setValues(const QVariantHash &args)
{
m_args = args;
QString deviceUri = args[KCUPS_DEVICE_URI].toString();
if (!deviceUri.startsWith(QLatin1String("serial:"))) {
m_isValid = false;
return;
}
m_isValid = true;
static int baudrates[] = /* Baud rates */
{
1200,
2400,
4800,
9600,
19200,
38400,
57600,
115200,
230400,
460800
};
// Find out the max baud rate
int maxrate;
if (m_rx.indexIn(deviceUri) != -1) {
maxrate = m_rx.cap(1).toInt();
} else {
maxrate = 19200;
}
ui->baudRateCB->clear();
for (int i = 0; i < 10; i ++) {
if (baudrates[i] > maxrate) {
break;
} else {
ui->baudRateCB->addItem(QString::number(baudrates[i]));
}
}
// Set the current index to the maxrate
ui->baudRateCB->setCurrentIndex(ui->baudRateCB->count() - 1);
}
void ChooseSerial::load()
{
}
QVariantHash ChooseSerial::values() const
{
QVariantHash ret = m_args;
QString deviceUri = m_args[KCUPS_DEVICE_URI].toString();
int pos = deviceUri.indexOf(QLatin1Char('?'));
QString baudRate = ui->baudRateCB->currentText();
QString bits = ui->bitsCB->currentText();
QString parity = ui->baudRateCB->itemData(ui->baudRateCB->currentIndex()).toString();
QString flow = ui->flowCB->itemData(ui->flowCB->currentIndex()).toString();
QString replace = QString("?baud=%1+bits=%2+parity=%3+flow=%4").arg(baudRate, bits, parity, flow);
deviceUri.replace(pos, deviceUri.size() - pos, replace);
ret[KCUPS_DEVICE_URI] = deviceUri;
return ret;
}

View file

@ -1,52 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef CHOOSE_SERIAL_H
#define CHOOSE_SERIAL_H
#include "GenericPage.h"
#include <QRegExp>
QT_BEGIN_NAMESPACE
class Ui_ChooseSerial;
QT_END_NAMESPACE
class ChooseSerial : public GenericPage
{
Q_OBJECT
public:
explicit ChooseSerial(QWidget *parent = 0);
~ChooseSerial();
void setValues(const QVariantHash &args);
QVariantHash values() const;
bool isValid() const;
public slots:
void load();
private:
Ui_ChooseSerial *ui;
QRegExp m_rx;
bool m_isValid;
};
#endif

View file

@ -1,100 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ChooseSerial</class>
<widget class="QWidget" name="ChooseSerial">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Ignored" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QFormLayout" name="formLayout">
<property name="formAlignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
<property name="margin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string comment="@label:listbox">Baud Rate:</string>
</property>
<property name="buddy">
<cstring>baudRateCB</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="KComboBox" name="baudRateCB"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string comment="@label:listbox">Parity:</string>
</property>
<property name="buddy">
<cstring>parityCB</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="KComboBox" name="parityCB"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string comment="@label:listbox">Data Bits:</string>
</property>
<property name="buddy">
<cstring>bitsCB</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="KComboBox" name="bitsCB">
<item>
<property name="text">
<string notr="true">8</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">7</string>
</property>
</item>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string comment="@label:listbox">Flow Control:</string>
</property>
<property name="buddy">
<cstring>flowCB</cstring>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="KComboBox" name="flowCB"/>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KComboBox</class>
<extends>QComboBox</extends>
<header>kcombobox.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View file

@ -1,90 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "ChooseSocket.h"
#include "ui_ChooseSocket.h"
#include <KCupsRequest.h>
#include <QPainter>
#include <KDebug>
#include <KLocale>
ChooseSocket::ChooseSocket(QWidget *parent) :
GenericPage(parent),
ui(new Ui_ChooseSocket),
m_isValid(false)
{
ui->setupUi(this);
// setup default options
setWindowTitle(i18nc("@title:window", "Select a Printer to Add"));
}
ChooseSocket::~ChooseSocket()
{
delete ui;
}
void ChooseSocket::setValues(const QVariantHash &args)
{
if (m_args == args) {
return;
}
m_args = args;
ui->addressLE->clear();
ui->portISB->setValue(9100);
QString deviceUri = args[KCUPS_DEVICE_URI].toString();
KUrl url = deviceUri;
if (url.scheme() == QLatin1String("socket")) {
ui->addressLE->setText(url.host());
ui->portISB->setValue(url.port(9100));
}
ui->addressLE->setFocus();
m_isValid = true;
}
QVariantHash ChooseSocket::values() const
{
QVariantHash ret = m_args;
KUrl url = KUrl(QLatin1String("socket://") + ui->addressLE->text());
url.setPort(ui->portISB->value());
ret[KCUPS_DEVICE_URI] = url.prettyUrl();
return ret;
}
bool ChooseSocket::isValid() const
{
return m_isValid;
}
bool ChooseSocket::canProceed() const
{
return !ui->addressLE->text().isEmpty();
}
void ChooseSocket::on_addressLE_textChanged(const QString &text)
{
Q_UNUSED(text)
emit allowProceed(canProceed());
}

View file

@ -1,50 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef CHOOSE_SOCKET_H
#define CHOOSE_SOCKET_H
#include "GenericPage.h"
QT_BEGIN_NAMESPACE
class Ui_ChooseSocket;
QT_END_NAMESPACE
class ChooseSocket : public GenericPage
{
Q_OBJECT
public:
explicit ChooseSocket(QWidget *parent = 0);
~ChooseSocket();
void setValues(const QVariantHash &args);
QVariantHash values() const;
bool isValid() const;
bool canProceed() const;
private slots:
void on_addressLE_textChanged(const QString &text);
private:
Ui_ChooseSocket *ui;
bool m_isValid;
};
#endif

View file

@ -1,81 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ChooseSocket</class>
<widget class="QWidget" name="ChooseSocket">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Ignored" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QFormLayout" name="formLayout">
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing</set>
</property>
<property name="margin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string comment="@label:textbox">Address:</string>
</property>
<property name="buddy">
<cstring>addressLE</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="KLineEdit" name="addressLE"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string comment="@label:spinbox">Port:</string>
</property>
<property name="buddy">
<cstring>portISB</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="KIntSpinBox" name="portISB">
<property name="accelerated">
<bool>true</bool>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>65535</number>
</property>
<property name="value">
<number>9100</number>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KLineEdit</class>
<extends>QLineEdit</extends>
<header>klineedit.h</header>
</customwidget>
<customwidget>
<class>KIntSpinBox</class>
<extends>QSpinBox</extends>
<header>knuminput.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View file

@ -1,175 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "ChooseUri.h"
#include "ui_ChooseUri.h"
#include <KCupsRequest.h>
#include <KUrl>
#include <KDebug>
#include <KLocale>
ChooseUri::ChooseUri(QWidget *parent) :
GenericPage(parent),
ui(new Ui_ChooseUri)
{
ui->setupUi(this);
ui->searchTB->setIcon(KIcon("edit-find"));
// setup default options
setWindowTitle(i18nc("@title:window", "Select a Printer to Add"));
connect(ui->addressLE, SIGNAL(textChanged(QString)), this, SLOT(checkSelected()));
connect(ui->addressLE, SIGNAL(returnPressed()), this, SLOT(findPrinters()));
connect(ui->searchTB, SIGNAL(clicked()), this, SLOT(findPrinters()));
}
ChooseUri::~ChooseUri()
{
delete ui;
}
void ChooseUri::setValues(const QVariantHash &args)
{
m_args = args;
bool visible = false;
KUrl url = args[KCUPS_DEVICE_URI].toString();
if (url.url() == QLatin1String("other")) {
ui->addressLE->clear();
visible = true;
} else if (url.protocol().isEmpty() && url.authority().isEmpty()) {
ui->addressLE->setText(url.url() + QLatin1String("://"));
} else {
ui->addressLE->setText(url.url());
}
ui->searchTB->setVisible(visible);
ui->addressLE->setFocus();
}
QVariantHash ChooseUri::values() const
{
QVariantHash ret = m_args;
ret[KCUPS_DEVICE_URI] = parsedURL(ui->addressLE->text()).url();
return ret;
}
bool ChooseUri::isValid() const
{
QVariantHash args = values();
KUrl url(args[KCUPS_DEVICE_URI].toString());
//kDebug() << url << url.isValid() << url.isEmpty() << url.protocol().isEmpty() << url.hasHost();
return url.isValid() && !url.isEmpty() && !url.protocol().isEmpty() && url.hasHost();
}
bool ChooseUri::canProceed() const
{
return isValid();
}
void ChooseUri::load()
{
}
void ChooseUri::checkSelected()
{
emit allowProceed(isValid());
}
void ChooseUri::on_addressLE_textChanged(const QString &text)
{
KUrl url = parsedURL(text);
if (url.isValid() &&
(url.protocol().isEmpty() ||
url.protocol() == QLatin1String("http") ||
url.protocol() == QLatin1String("https") ||
url.protocol() == QLatin1String("ipp"))) {
// TODO maybe cups library can connect to more protocols
ui->searchTB->setEnabled(true);
} else {
ui->searchTB->setEnabled(false);
}
}
void ChooseUri::findPrinters()
{
KUrl url = parsedURL(ui->addressLE->text());
KCupsConnection *conn = new KCupsConnection(url, this);
KCupsRequest *request = new KCupsRequest(conn);
connect(request, SIGNAL(finished()), this, SLOT(getPrintersFinished()));
QStringList attr;
attr << KCUPS_PRINTER_NAME;
attr << KCUPS_PRINTER_STATE;
attr << KCUPS_PRINTER_IS_SHARED;
attr << KCUPS_PRINTER_IS_ACCEPTING_JOBS;
attr << KCUPS_PRINTER_TYPE;
attr << KCUPS_PRINTER_LOCATION;
attr << KCUPS_PRINTER_INFO;
attr << KCUPS_PRINTER_MAKE_AND_MODEL;
request->setProperty("URI", url);
emit startWorking();
request->getPrinters(attr);
}
void ChooseUri::getPrintersFinished()
{
KCupsRequest *request = qobject_cast<KCupsRequest*>(sender());
KUrl uri = request->property("URI").value<KUrl>();
KUrl url;
url.setProtocol(QLatin1String("ipp"));
url.setAuthority(uri.authority());
KCupsPrinters printers = request->printers();
if (request->hasError()) {
emit errorMessage(request->errorMsg());
} else {
emit insertDevice("network",
url.authority(),
url.authority(),
QString(),
url.url(),
QString(),
printers);
}
request->deleteLater();
request->connection()->deleteLater();
emit stopWorking();
}
KUrl ChooseUri::parsedURL(const QString &text) const
{
KUrl url(text);
if (url.host().isEmpty() && !text.contains(QLatin1String("://"))) {
url = KUrl();
// URI might be scsi, network on anything that didn't match before
if (m_args[KCUPS_DEVICE_URI].toString() != QLatin1String("other")) {
url.setProtocol(m_args[KCUPS_DEVICE_URI].toString());
}
url.setAuthority(text);
}
return url;
}

View file

@ -1,71 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef CHOOSE_URI_H
#define CHOOSE_URI_H
#include "GenericPage.h"
#include <KCupsPrinter.h>
#include <KUrl>
QT_BEGIN_NAMESPACE
class Ui_ChooseUri;
QT_END_NAMESPACE
class ChooseUri : public GenericPage
{
Q_OBJECT
public:
explicit ChooseUri(QWidget *parent = 0);
~ChooseUri();
void setValues(const QVariantHash &args);
QVariantHash values() const;
bool isValid() const;
bool canProceed() const;
public slots:
void load();
signals:
void errorMessage(const QString &message);
void insertDevice(const QString &device_class,
const QString &device_id,
const QString &device_info,
const QString &device_make_and_model,
const QString &device_uri,
const QString &device_location,
const KCupsPrinters &grouped_printers);
private slots:
void checkSelected();
void on_addressLE_textChanged(const QString &text);
void findPrinters();
void getPrintersFinished();
private:
KUrl parsedURL(const QString &text) const;
Ui_ChooseUri *ui;
};
#endif

View file

@ -1,97 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ChooseUri</class>
<widget class="QWidget" name="ChooseUri">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>409</width>
<height>252</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Ignored" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
<property name="rowWrapPolicy">
<enum>QFormLayout::WrapLongRows</enum>
</property>
<property name="margin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string comment="@label:textbox">Connection:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="KLineEdit" name="addressLE"/>
</item>
<item>
<widget class="QToolButton" name="searchTB">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0" colspan="2">
<widget class="QLabel" name="label">
<property name="text">
<string comment="@info">&lt;TABLE&gt;
&lt;TR&gt;
&lt;TD&gt;Examples:
&lt;PRE&gt;
http://hostname:631/ipp/
http://hostname:631/ipp/port1
ipp://hostname/ipp/
ipp://hostname/ipp/port1
lpd://hostname/queue
socket://hostname
socket://hostname:9100
&lt;/PRE&gt;
&lt;P&gt;See &lt;A HREF=&quot;http://localhost:631/help/network.html&quot; TARGET=&quot;_blank&quot;&gt;&quot;Network
Printers&quot;&lt;/A&gt; for the correct URI to use with your printer.&lt;/P&gt;
&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TABLE&gt;</string>
</property>
<property name="textFormat">
<enum>Qt::RichText</enum>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KLineEdit</class>
<extends>QLineEdit</extends>
<header>klineedit.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View file

@ -1,382 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "DevicesModel.h"
#include <KCupsRequest.h>
#include <KLocale>
#include <KMessageBox>
#include <QHostInfo>
#include <QDBusMetaType>
#include <QDBusConnection>
#include <KDebug>
DevicesModel::DevicesModel(QObject *parent)
: QStandardItemModel(parent),
m_request(0),
m_rx("[a-z]+://.*")
{
qDBusRegisterMetaType<MapSS>();
qDBusRegisterMetaType<MapSMapSS>();
m_blacklistedURIs << QLatin1String("hp");
m_blacklistedURIs << QLatin1String("hpfax");
m_blacklistedURIs << QLatin1String("hal");
m_blacklistedURIs << QLatin1String("beh");
m_blacklistedURIs << QLatin1String("scsi");
m_blacklistedURIs << QLatin1String("http");
m_blacklistedURIs << QLatin1String("delete");
// Adds the other device which is meant for manual URI input
insertDevice("other",
QString(),
i18nc("@item", "Manual URI"),
QString(),
"other",
QString());
}
void DevicesModel::update()
{
if (m_request) {
return;
}
// clear the model to don't duplicate items
if (rowCount()) {
removeRows(1, rowCount() - 1);
}
m_request = new KCupsRequest;
connect(m_request, SIGNAL(device(QString,QString,QString,QString,QString,QString)),
this, SLOT(gotDevice(QString,QString,QString,QString,QString,QString)));
connect(m_request, SIGNAL(finished()), this, SLOT(finished()));
// Get devices with 5 seconds of timeout
m_request->getDevices(10);
}
void DevicesModel::gotDevice(const QString &device_class,
const QString &device_id,
const QString &device_info,
const QString &device_make_and_model,
const QString &device_uri,
const QString &device_location)
{
// "direct"
kDebug() << device_class;
// "MFG:Samsung;CMD:GDI;MDL:SCX-4200 Series;CLS:PRINTER;MODE:PCL;STATUS:IDLE;"
kDebug() << device_id;
// "Samsung SCX-4200 Series"
kDebug() << device_info;
// "Samsung SCX-4200 Series"
kDebug() << device_make_and_model;
// "usb://Samsung/SCX-4200%20Series"
kDebug() << device_uri;
// ""
kDebug() << device_location;
if (m_blacklistedURIs.contains(device_uri)) {
// ignore black listed uri's
return;
}
// For the protocols, not real devices
if (device_id.isEmpty() &&
device_make_and_model == QLatin1String("Unknown")) {
insertDevice(device_class,
device_id,
device_info,
device_make_and_model,
device_uri,
device_location);
} else {
// Map the devices so later we try to group them
MapSS mapSS;
mapSS[KCUPS_DEVICE_CLASS] = device_class;
mapSS[KCUPS_DEVICE_ID] = device_id;
mapSS[KCUPS_DEVICE_INFO] = device_info;
mapSS[KCUPS_DEVICE_MAKE_AND_MODEL] = device_make_and_model;
mapSS[KCUPS_DEVICE_LOCATION] = device_location;
m_mappedDevices[device_uri] = mapSS;
}
}
void DevicesModel::finished()
{
bool hasError = m_request->hasError();
if (hasError) {
emit errorMessage(i18n("Failed to get a list of devices: '%1'", m_request->errorMsg()));
}
m_request->deleteLater();
m_request = 0;
if (hasError || m_mappedDevices.isEmpty()) {
emit loaded();
return;
}
QDBusMessage message;
message = QDBusMessage::createMethodCall(QLatin1String("org.fedoraproject.Config.Printing"),
QLatin1String("/org/fedoraproject/Config/Printing"),
QLatin1String("org.fedoraproject.Config.Printing"),
QLatin1String("GroupPhysicalDevices"));
message << qVariantFromValue(m_mappedDevices);
QDBusConnection::sessionBus().callWithCallback(message,
this,
SLOT(getGroupedDevicesSuccess(QDBusMessage)),
SLOT(getGroupedDevicesFailed(QDBusError,QDBusMessage)));
}
void DevicesModel::insertDevice(const QString &device_class,
const QString &device_id,
const QString &device_info,
const QString &device_make_and_model,
const QString &device_uri,
const QString &device_location,
const QStringList &grouped_uris)
{
QStandardItem *stdItem;
stdItem = createItem(device_class,
device_id,
device_info,
device_make_and_model,
device_uri,
device_location,
!grouped_uris.isEmpty());
if (!grouped_uris.isEmpty()) {
stdItem->setData(grouped_uris, DeviceUris);
}
}
void DevicesModel::insertDevice(const QString &device_class,
const QString &device_id,
const QString &device_info,
const QString &device_make_and_model,
const QString &device_uri,
const QString &device_location,
const KCupsPrinters &grouped_printers)
{
QStandardItem *stdItem;
stdItem = createItem(device_class,
device_id,
device_info,
device_make_and_model,
device_uri,
device_location,
!grouped_printers.isEmpty());
if (!grouped_printers.isEmpty()) {
stdItem->setData(qVariantFromValue(grouped_printers), DeviceUris);
}
}
QStandardItem *DevicesModel::createItem(const QString &device_class,
const QString &device_id,
const QString &device_info,
const QString &device_make_and_model,
const QString &device_uri,
const QString &device_location,
bool grouped)
{
// "direct"
kDebug() << device_class;
// "MFG:Samsung;CMD:GDI;MDL:SCX-4200 Series;CLS:PRINTER;MODE:PCL;STATUS:IDLE;"
kDebug() << device_id;
// "Samsung SCX-4200 Series"
kDebug() << device_info;
// "Samsung SCX-4200 Series"
kDebug() << device_make_and_model;
// "usb://Samsung/SCX-4200%20Series"
kDebug() << device_uri;
// ""
kDebug() << device_location;
Kind kind;
// Store the kind of the device
if (device_class == QLatin1String("network")) {
if (m_rx.indexIn(device_uri) > -1) {
kind = Networked;
} else {
// other network devices looks like
// just "http"
kind = OtherNetworked;
}
} else if (device_class == QLatin1String("other") &&
device_uri == QLatin1String("other")) {
kind = Other;
} else {
// If device class is not network assume local
kind = Local;
}
QString location;
if (device_location.isEmpty() && kind == Local) {
location = QHostInfo::localHostName();
} else {
location = device_location;
}
QString text;
if (!device_make_and_model.isEmpty() &&
!grouped &&
device_make_and_model.compare(QLatin1String("unknown"), Qt::CaseInsensitive)) {
text = device_info + QLatin1String(" (") + device_make_and_model + QLatin1Char(')');
} else {
text = device_info;
}
QString toolTip;
if (!grouped) {
if (device_uri.startsWith(QLatin1String("parallel"))) {
toolTip = i18nc("@info:tooltip",
"A printer connected to the parallel port");
} else if (device_uri.startsWith(QLatin1String("usb"))) {
toolTip = i18nc("@info:tooltip",
"A printer connected to a USB port");
} else if (device_uri.startsWith(QLatin1String("bluetooth"))) {
toolTip = i18nc("@info:tooltip",
"A printer connected via Bluetooth");
} else if (device_uri.startsWith(QLatin1String("hal"))) {
toolTip = i18nc("@info:tooltip",
"Local printer detected by the "
"Hardware Abstraction Layer (HAL)");
} else if (device_uri.startsWith(QLatin1String("hp"))) {
toolTip = i18nc("@info:tooltip",
"HPLIP software driving a printer, "
"or the printer function of a multi-function device");
} else if (device_uri.startsWith(QLatin1String("hpfax"))) {
toolTip = i18nc("@info:tooltip",
"HPLIP software driving a fax machine, "
"or the fax function of a multi-function device");
} else if (device_uri.startsWith(QLatin1String("dnssd")) ||
device_uri.startsWith(QLatin1String("mdns"))) {
toolTip = i18nc("@info:tooltip",
"Remote CUPS printer via DNS-SD");
}
}
QStandardItem *stdItem = new QStandardItem;
stdItem->setText(text);
stdItem->setToolTip(toolTip);
stdItem->setData(device_class, DeviceClass);
stdItem->setData(device_id, DeviceId);
stdItem->setData(device_info, DeviceInfo);
stdItem->setData(device_uri, DeviceUri);
stdItem->setData(device_make_and_model, DeviceMakeAndModel);
stdItem->setData(device_location, DeviceLocation);
// Find the proper category to our item
QStandardItem *catItem;
switch (kind) {
case Networked:
catItem = findCreateCategory(i18nc("@item", "Discovered Network Printers"));
catItem->appendRow(stdItem);
break;
case OtherNetworked:
catItem = findCreateCategory(i18nc("@item", "Other Network Printers"));
catItem->appendRow(stdItem);
break;
case Local:
catItem = findCreateCategory(i18nc("@item", "Local Printers"));
catItem->appendRow(stdItem);
break;
default:
appendRow(stdItem);
}
return stdItem;
}
void DevicesModel::getGroupedDevicesSuccess(const QDBusMessage &message)
{
if (message.type() == QDBusMessage::ReplyMessage && message.arguments().size() == 1) {
QDBusArgument argument;
argument = message.arguments().first().value<QDBusArgument>();
QList<QStringList> groupeDevices;
groupeDevices = qdbus_cast<QList<QStringList> >(argument);
foreach (const QStringList &list, groupeDevices) {
if (list.isEmpty()) {
continue;
}
QString uri = list.first();
MapSS device = m_mappedDevices[uri];
insertDevice(device[KCUPS_DEVICE_CLASS],
device[KCUPS_DEVICE_ID],
device[KCUPS_DEVICE_INFO],
device[KCUPS_DEVICE_MAKE_AND_MODEL],
uri,
device[KCUPS_DEVICE_LOCATION],
list.size() > 1 ? list : QStringList());
}
} else {
kWarning() << "Unexpected message" << message;
groupedDevicesFallback();
}
emit loaded();
}
void DevicesModel::getGroupedDevicesFailed(const QDBusError &error, const QDBusMessage &message)
{
kWarning() << error << message;
groupedDevicesFallback();
emit errorMessage(i18n("Failed to group devices: '%1'",error.message()));
emit loaded();
}
void DevicesModel::groupedDevicesFallback()
{
MapSMapSS::const_iterator i = m_mappedDevices.constBegin();
while (i != m_mappedDevices.constEnd()) {
MapSS device = i.value();
insertDevice(device[KCUPS_DEVICE_CLASS],
device[KCUPS_DEVICE_ID],
device[KCUPS_DEVICE_INFO],
device[KCUPS_DEVICE_MAKE_AND_MODEL],
i.key(),
device[KCUPS_DEVICE_LOCATION]);
++i;
}
}
QStandardItem* DevicesModel::findCreateCategory(const QString &category)
{
for (int i = 0; i < rowCount(); ++i) {
QStandardItem *catItem = item(i);
if (catItem->text() == category) {
return catItem;
}
}
QStandardItem *catItem = new QStandardItem(category);
QFont font = catItem->font();
font.setBold(true);
catItem->setFont(font);
catItem->setFlags(Qt::ItemIsEnabled);
appendRow(catItem);
// Emit the parent so the view expand the item
emit parentAdded(indexFromItem(catItem));
return catItem;
}

View file

@ -1,110 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef DEVICES_MODEL_H
#define DEVICES_MODEL_H
#include <QStandardItemModel>
#include <QDBusMessage>
#include <KCupsPrinter.h>
typedef QMap<QString, QString> MapSS;
typedef QMap<QString, MapSS> MapSMapSS;
class KCupsRequest;
class DevicesModel : public QStandardItemModel
{
Q_OBJECT
Q_ENUMS(Role)
public:
enum Role {
DeviceClass = Qt::UserRole + 2,
DeviceId,
DeviceInfo,
DeviceMakeAndModel,
DeviceUri,
DeviceUris,
DeviceLocation
};
enum Kind {
Local,
Networked,
OtherNetworked,
Other
};
explicit DevicesModel(QObject *parent = 0);
signals:
void loaded();
void parentAdded(const QModelIndex &index);
void errorMessage(const QString &message);
public slots:
void update();
void insertDevice(const QString &device_class,
const QString &device_id,
const QString &device_info,
const QString &device_make_and_model,
const QString &device_uri,
const QString &device_location,
const QStringList &grouped_uris = QStringList());
void insertDevice(const QString &device_class,
const QString &device_id,
const QString &device_info,
const QString &device_make_and_model,
const QString &device_uri,
const QString &device_location,
const KCupsPrinters &grouped_printers);
private slots:
QStandardItem* createItem(const QString &device_class,
const QString &device_id,
const QString &device_info,
const QString &device_make_and_model,
const QString &device_uri,
const QString &device_location,
bool grouped);
void gotDevice(const QString &device_class,
const QString &device_id,
const QString &device_info,
const QString &device_make_and_model,
const QString &device_uri,
const QString &device_location);
void finished();
void getGroupedDevicesSuccess(const QDBusMessage &message);
void getGroupedDevicesFailed(const QDBusError &error, const QDBusMessage &message);
void groupedDevicesFallback();
private:
QStandardItem *findCreateCategory(const QString &category);
KCupsRequest *m_request;
MapSMapSS m_mappedDevices;
QRegExp m_rx;
QStringList m_blacklistedURIs;
};
Q_DECLARE_METATYPE(MapSS)
Q_DECLARE_METATYPE(MapSMapSS)
#endif

View file

@ -1,51 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "GenericPage.h"
GenericPage::GenericPage(QWidget *parent) :
QWidget(parent),
m_working(0)
{
}
void GenericPage::working()
{
if (m_working++ == 0) {
emit startWorking();
}
}
void GenericPage::notWorking()
{
if (--m_working == 0) {
emit stopWorking();
}
}
QVariantHash GenericPage::values() const
{
return m_args;
}
void GenericPage::setValues(const QVariantHash &args)
{
m_args = args;
}

View file

@ -1,60 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef GENERIC_PAGE_H
#define GENERIC_PAGE_H
#include <QWidget>
#include <QHash>
#include <QVariant>
#define ADDING_PRINTER "add-new-printer"
#define PPD_NAME "ppd-name"
#define FILENAME "filename"
class GenericPage : public QWidget
{
Q_OBJECT
public:
explicit GenericPage(QWidget *parent = 0);
virtual bool canProceed() const { return true; }
virtual bool isValid() const { return true; }
virtual bool isWorking() const { return m_working; }
virtual void setValues(const QVariantHash &args);
virtual QVariantHash values() const;
virtual bool finishClicked() { return false; }
signals:
void allowProceed(bool allow);
void proceed();
void startWorking();
void stopWorking();
protected slots:
void working();
void notWorking();
protected:
QVariantHash m_args;
int m_working;
};
#endif

View file

@ -1,177 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "PageAddPrinter.h"
#include "ui_PageAddPrinter.h"
#include <KCupsRequest.h>
#include <QPainter>
#include <KCategorizedSortFilterProxyModel>
#include <KCategoryDrawer>
#include <KDebug>
#include <KLocale>
#include <KIconLoader>
PageAddPrinter::PageAddPrinter(QWidget *parent) :
GenericPage(parent),
ui(new Ui_PageAddPrinter)
{
ui->setupUi(this);
setAttribute(Qt::WA_DeleteOnClose);
// setup default options
setWindowTitle(i18nc("@title:window", "Select a Printer to Add"));
// loads the standard key icon
QPixmap pixmap;
pixmap = KIconLoader::global()->loadIcon("printer",
KIconLoader::NoGroup,
KIconLoader::SizeEnormous, // a not so huge icon
KIconLoader::DefaultState);
QPixmap icon(pixmap);
QPainter painter(&icon);
pixmap = KIconLoader::global()->loadIcon("dialog-information",
KIconLoader::NoGroup,
KIconLoader::SizeLarge, // a not so huge icon
KIconLoader::DefaultState);
// the emblem icon to size 32
int overlaySize = KIconLoader::SizeLarge;
QPoint startPoint;
// bottom right corner
startPoint = QPoint(KIconLoader::SizeEnormous - overlaySize - 2,
KIconLoader::SizeEnormous - overlaySize - 2);
painter.drawPixmap(startPoint, pixmap);
ui->printerL->setPixmap(icon);
// May contain any printable characters except "/", "#", and space
QRegExp rx("[^/#\\ ]*");
QValidator *validator = new QRegExpValidator(rx, this);
ui->nameLE->setValidator(validator);
// Hide the message widget
ui->messageWidget->setMessageType(KMessageWidget::Error);
ui->messageWidget->hide();
}
PageAddPrinter::~PageAddPrinter()
{
delete ui;
}
void PageAddPrinter::setValues(const QVariantHash &args)
{
if (m_args != args) {
QString name;
if (!args[KCUPS_PRINTER_NAME].toString().isEmpty()) {
name = args[KCUPS_PRINTER_NAME].toString();
} else if (!args[KCUPS_DEVICE_MAKE_AND_MODEL].toString().isEmpty()) {
name = args[KCUPS_DEVICE_MAKE_AND_MODEL].toString();
} else if (!args[KCUPS_DEVICE_INFO].toString().isEmpty()) {
name = args[KCUPS_DEVICE_INFO].toString();
}
if (!args[KCUPS_PRINTER_INFO].toString().isEmpty()) {
ui->descriptionLE->setText(args[KCUPS_PRINTER_INFO].toString());
} else {
ui->descriptionLE->setText(name);
}
name.replace(QLatin1Char(' '), QLatin1Char('_'));
name.replace(QLatin1Char('/'), QLatin1Char('-'));
name.replace(QLatin1Char('#'), QLatin1Char('='));
ui->nameLE->setText(name);
ui->locationLE->setText(args[KCUPS_DEVICE_LOCATION].toString());
ui->shareCB->setChecked(true);
ui->shareCB->setVisible(args[ADDING_PRINTER].toBool());
m_args = args;
}
}
void PageAddPrinter::load()
{
}
bool PageAddPrinter::canProceed() const
{
return !ui->nameLE->text().isEmpty();
}
bool PageAddPrinter::finishClicked()
{
bool ret = false;
QVariantHash args = values();
args[KCUPS_PRINTER_IS_ACCEPTING_JOBS] = true;
args[KCUPS_PRINTER_STATE] = IPP_PRINTER_IDLE;
// Check if it's a printer or a class that we are adding
bool isClass = !args.take(ADDING_PRINTER).toBool();
QString destName = args[KCUPS_PRINTER_NAME].toString();
QString filename = args.take(FILENAME).toString();
QPointer<KCupsRequest> request = new KCupsRequest;
if (isClass) {
request->addOrModifyClass(destName, args);
} else {
request->addOrModifyPrinter(destName, args, filename);
}
request->waitTillFinished();
if (request) {
if (request->hasError()) {
kDebug() << request->error() << request->errorMsg();
QString message;
if (isClass) {
message = i18nc("@info", "Failed to add class: '%1'", request->errorMsg());
} else {
message = i18nc("@info", "Failed to configure printer: '%1'", request->errorMsg());
}
ui->messageWidget->setText(message);
ui->messageWidget->animatedShow();
} else {
ret = true;
}
request->deleteLater();
}
return ret;
}
QVariantHash PageAddPrinter::values() const
{
QVariantHash ret = m_args;
ret[KCUPS_PRINTER_NAME] = ui->nameLE->text();
ret[KCUPS_PRINTER_LOCATION] = ui->locationLE->text();
ret[KCUPS_PRINTER_INFO] = ui->descriptionLE->text();
if (ret[ADDING_PRINTER].toBool()) {
ret[KCUPS_PRINTER_IS_SHARED] = ui->shareCB->isChecked();
}
return ret;
}
void PageAddPrinter::on_nameLE_textChanged(const QString &text)
{
emit allowProceed(!text.isEmpty());
}
void PageAddPrinter::checkSelected()
{
// emit allowProceed(!devicesLV->selectionModel()->selection().isEmpty());
}

View file

@ -1,54 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef PAGE_ADD_PRINTER_H
#define PAGE_ADD_PRINTER_H
#include "GenericPage.h"
QT_BEGIN_NAMESPACE
class Ui_PageAddPrinter;
QT_END_NAMESPACE
class PageAddPrinter : public GenericPage
{
Q_OBJECT
public:
explicit PageAddPrinter(QWidget *parent = 0);
~PageAddPrinter();
void setValues(const QVariantHash &args);
QVariantHash values() const;
bool canProceed() const;
bool finishClicked();
public slots:
void load();
private slots:
void checkSelected();
void on_nameLE_textChanged(const QString &text);
private:
Ui_PageAddPrinter *ui;
};
#endif

View file

@ -1,150 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>PageAddPrinter</class>
<widget class="QWidget" name="PageAddPrinter">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Ignored" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="margin">
<number>0</number>
</property>
<item row="1" column="3">
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string comment="@label:textbox">Name:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="KLineEdit" name="nameLE">
<property name="toolTip">
<string>May contain any printable characters except &quot;/&quot;, &quot;#&quot;, and space</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string comment="@label:textbox">Description:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="KLineEdit" name="descriptionLE"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string comment="@label:textbox">Location:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="KLineEdit" name="locationLE"/>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="shareCB">
<property name="text">
<string comment="@option:check">Share this printer</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="2">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="sizeConstraint">
<enum>QLayout::SetMinimumSize</enum>
</property>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="printerL">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string notr="true">printer</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="margin">
<number>7</number>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="0" column="1" colspan="3">
<widget class="KMessageWidget" name="messageWidget" native="true"/>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KLineEdit</class>
<extends>QLineEdit</extends>
<header>klineedit.h</header>
</customwidget>
<customwidget>
<class>KMessageWidget</class>
<extends>QWidget</extends>
<header location="global">kmessagewidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View file

@ -1,210 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "PageChoosePPD.h"
#include "ui_PageChoosePPD.h"
#include "DevicesModel.h"
#include <SelectMakeModel.h>
#include <KCupsRequest.h>
#include <KTemporaryFile>
#include <KDebug>
#include <KLocale>
#include <QFileInfo>
#include <QFile>
PageChoosePPD::PageChoosePPD(const QVariantHash &args, QWidget *parent) :
GenericPage(parent),
ui(new Ui_PageChoosePPD),
m_isValid(false)
{
ui->setupUi(this);
setAttribute(Qt::WA_DeleteOnClose);
// setup default options
setWindowTitle(i18nc("@title:window", "Select a Printer to Add"));
m_layout = new QStackedLayout;
m_layout->setContentsMargins(0, 0, 0, 0);
ui->gridLayout->addLayout(m_layout, 1, 3);
m_selectMM = new SelectMakeModel(this);
connect(m_selectMM, SIGNAL(changed(bool)), this, SLOT(checkSelected()));
m_layout->addWidget(m_selectMM);
// Setup the busy cursor
connect(m_selectMM, SIGNAL(changed(bool)), this, SLOT(notWorking()));
if (!args.isEmpty()) {
// set our args
setValues(args);
}
}
PageChoosePPD::~PageChoosePPD()
{
removeTempPPD();
delete ui;
}
void PageChoosePPD::setValues(const QVariantHash &args)
{
m_args = args;
if (args[ADDING_PRINTER].toBool()) {
kDebug() << args;
working();
removeTempPPD();
QString deviceId = args[KCUPS_DEVICE_ID].toString();
QString make;
QString makeAndModel = args[KCUPS_DEVICE_MAKE_AND_MODEL].toString();
QString deviceURI = args[KCUPS_DEVICE_URI].toString();
// If
KUrl url(deviceURI + QLatin1String(".ppd"));
if (url.protocol() == QLatin1String("ipp")) {
KTemporaryFile *tempFile = new KTemporaryFile;
tempFile->setPrefix("print-manager");
tempFile->setSuffix(".ppd");
tempFile->open();
url.setProtocol(QLatin1String("http"));
if (url.port() < 0) {
url.setPort(631);
}
kDebug() << deviceURI << url;
KJob *job = KIO::file_copy(url,
tempFile->fileName(),
-1,
KIO::Overwrite | KIO::HideProgressInfo);
job->setProperty("URI", deviceURI);
connect(job, SIGNAL(result(KJob*)),
this, SLOT(resultJob(KJob*)));
}
// Get the make from the device id
foreach (const QString &pair, deviceId.split(QLatin1Char(';'))) {
if (pair.startsWith(QLatin1String("MFG:"))) {
make = pair.section(QLatin1Char(':'), 1);
break;
}
}
if (makeAndModel.isEmpty()) {
// Get the model from the device id
foreach (const QString &pair, deviceId.split(QLatin1Char(';'))) {
if (pair.startsWith(QLatin1String("MDL:"))) {
// Build the make and model string
if (make.isNull()) {
makeAndModel = pair.section(QLatin1Char(':'), 1);
} else {
makeAndModel = make + QLatin1Char(' ') + pair.section(QLatin1Char(':'), 1);
}
break;
}
}
}
// if the device info is empty use the make and model
// so we can have a nice name for the new printer on the next page
if (!args.contains(KCUPS_DEVICE_INFO) && !makeAndModel.isEmpty()) {
m_args[KCUPS_DEVICE_INFO] = makeAndModel;
}
m_selectMM->setDeviceInfo(deviceId, make, makeAndModel, deviceURI);
m_isValid = true;
} else {
m_isValid = false;
}
}
bool PageChoosePPD::isValid() const
{
return m_isValid;
}
QVariantHash PageChoosePPD::values() const
{
if (!isValid()) {
return m_args;
}
QVariantHash ret = m_args;
if (canProceed()) {
if (!m_ppdFile.isNull()) {
ret[FILENAME] = m_ppdFile;
} else if (m_selectMM->isFileSelected()) {
ret[FILENAME] = m_selectMM->selectedPPDFileName();
} else {
ret[PPD_NAME] = m_selectMM->selectedPPDName();
}
}
return ret;
}
bool PageChoosePPD::canProceed() const
{
// It can proceed if a PPD file (local or not) is provided bool changed = false;
bool allow = false;
if (m_selectMM->isFileSelected()) {
allow = !m_selectMM->selectedPPDFileName().isNull();
} else if (!m_ppdFile.isNull()) {
allow = true;
} else {
allow = !m_selectMM->selectedPPDName().isNull();
}
kDebug() << allow;
return allow;
}
void PageChoosePPD::checkSelected()
{
emit allowProceed(canProceed());
}
void PageChoosePPD::selectDefault()
{
}
void PageChoosePPD::resultJob(KJob *job)
{
if (!job->error() &&
job->property("URI").toString() == m_args[KCUPS_DEVICE_URI].toString()) {
KIO::FileCopyJob *fileCopyJob = qobject_cast<KIO::FileCopyJob*>(job);
// Make sure this job is for the current device
m_ppdFile = fileCopyJob->destUrl().toLocalFile();
m_isValid = false;
emit proceed();
}
}
void PageChoosePPD::removeTempPPD()
{
if (!m_ppdFile.isNull()) {
QFile::remove(m_ppdFile);
m_ppdFile.clear();
}
}

View file

@ -1,62 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef PAGE_CHOOSE_PPD_H
#define PAGE_CHOOSE_PPD_H
#include "GenericPage.h"
#include <QStackedLayout>
#include <KIO/Job>
QT_BEGIN_NAMESPACE
class Ui_PageChoosePPD;
QT_END_NAMESPACE
class SelectMakeModel;
class PageChoosePPD : public GenericPage
{
Q_OBJECT
public:
explicit PageChoosePPD(const QVariantHash &args = QVariantHash(), QWidget *parent = 0);
~PageChoosePPD();
bool canProceed() const;
void setValues(const QVariantHash &args);
QVariantHash values() const;
bool isValid() const;
private slots:
void checkSelected();
void selectDefault();
void resultJob(KJob *job);
private:
void removeTempPPD();
Ui_PageChoosePPD *ui;
bool m_isValid;
SelectMakeModel *m_selectMM;
QStackedLayout *m_layout;
QString m_ppdFile;
};
#endif

View file

@ -1,27 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>PageChoosePPD</class>
<widget class="QWidget" name="PageChoosePPD">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Ignored" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="margin">
<number>0</number>
</property>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View file

@ -1,93 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "PageChoosePrinters.h"
#include "ui_PageChoosePrinters.h"
#include <ClassListWidget.h>
#include <KCupsRequest.h>
#include <QPainter>
#include <KDebug>
#include <KLocale>
#include <KIconLoader>
PageChoosePrinters::PageChoosePrinters(const QVariantHash &args, QWidget *parent) :
GenericPage(parent),
ui(new Ui_PageChoosePrinters)
{
ui->setupUi(this);
// setup default options
setWindowTitle(i18nc("@title:window", "Select a Printer to Add"));
// loads the standard key icon
QPixmap pixmap;
pixmap = KIconLoader::global()->loadIcon("printer",
KIconLoader::NoGroup,
KIconLoader::SizeEnormous, // a not so huge icon
KIconLoader::DefaultState);
QPixmap icon(pixmap);
QPainter painter(&icon);
pixmap = KIconLoader::global()->loadIcon("preferences-other",
KIconLoader::NoGroup,
KIconLoader::SizeLarge, // a not so huge icon
KIconLoader::DefaultState);
// the emblem icon to size 32
int overlaySize = KIconLoader::SizeLarge;
QPoint startPoint;
// bottom right corner
startPoint = QPoint(KIconLoader::SizeEnormous - overlaySize - 2,
KIconLoader::SizeEnormous - overlaySize - 2);
painter.drawPixmap(startPoint, pixmap);
ui->printerL->setPixmap(icon);
connect(ui->membersLV, SIGNAL(changed(bool)),
this, SIGNAL(allowProceed(bool)));
if (!args.isEmpty()) {
setValues(args);
}
}
PageChoosePrinters::~PageChoosePrinters()
{
delete ui;
}
void PageChoosePrinters::setValues(const QVariantHash &args)
{
if (m_args != args) {
m_args = args;
}
}
QVariantHash PageChoosePrinters::values() const
{
QVariantHash ret = m_args;
ret[KCUPS_MEMBER_URIS] = ui->membersLV->currentSelected(true);
return ret;
}
bool PageChoosePrinters::canProceed() const
{
return ui->membersLV->selectedPrinters().count() > 0;
}

View file

@ -1,45 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef PAGE_CHOOSE_PRINTERS_H
#define PAGE_CHOOSE_PRINTERS_H
#include "GenericPage.h"
QT_BEGIN_NAMESPACE
class Ui_PageChoosePrinters;
QT_END_NAMESPACE
class PageChoosePrinters : public GenericPage
{
Q_OBJECT
public:
explicit PageChoosePrinters(const QVariantHash &args, QWidget *parent = 0);
~PageChoosePrinters();
void setValues(const QVariantHash &args);
QVariantHash values() const;
bool canProceed() const;
private:
Ui_PageChoosePrinters *ui;
};
#endif

View file

@ -1,116 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>PageChoosePrinters</class>
<widget class="QWidget" name="PageChoosePrinters">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Ignored" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="1">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="sizeConstraint">
<enum>QLayout::SetMinimumSize</enum>
</property>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="printerL">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string notr="true">printer</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="margin">
<number>7</number>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="0" column="2">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item row="0" column="3">
<layout class="QVBoxLayout" name="vertLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string comment="@label:listbox">Members:</string>
</property>
</widget>
</item>
<item>
<widget class="ClassListWidget" name="membersLV"/>
</item>
</layout>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>ClassListWidget</class>
<extends>QListView</extends>
<header location="global">ClassListWidget.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View file

@ -1,405 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "PageDestinations.h"
#include "ui_PageDestinations.h"
#include "DevicesModel.h"
#include "ChooseLpd.h"
#include "ChooseSamba.h"
#include "ChooseSerial.h"
#include "ChooseSocket.h"
#include "ChooseUri.h"
#include <KCupsRequest.h>
#include <NoSelectionRectDelegate.h>
#include <QItemSelectionModel>
#include <KDebug>
#include <KLocale>
// system-config-printer --setup-printer='file:/tmp/printout' --devid='MFG:Ricoh;MDL:Aficio SP C820DN'
PageDestinations::PageDestinations(const QVariantHash &args, QWidget *parent) :
GenericPage(parent),
ui(new Ui_PageDestinations),
m_chooseLpd(new ChooseLpd(this)),
m_chooseSamba(new ChooseSamba(this)),
m_chooseSerial(new ChooseSerial(this)),
m_chooseSocket(new ChooseSocket(this)),
m_chooseUri(new ChooseUri(this)),
m_chooseLabel(new QLabel(this))
{
ui->setupUi(this);
setAttribute(Qt::WA_DeleteOnClose);
ui->stackedWidget->addWidget(m_chooseLpd);
connect(m_chooseLpd, SIGNAL(allowProceed(bool)), SIGNAL(allowProceed(bool)));
connect(m_chooseLpd, SIGNAL(startWorking()), SLOT(working()));
connect(m_chooseLpd, SIGNAL(stopWorking()), SLOT(notWorking()));
ui->stackedWidget->addWidget(m_chooseSamba);
connect(m_chooseSamba, SIGNAL(allowProceed(bool)), SIGNAL(allowProceed(bool)));
connect(m_chooseSamba, SIGNAL(startWorking()), SLOT(working()));
connect(m_chooseSamba, SIGNAL(stopWorking()), SLOT(notWorking()));
ui->stackedWidget->addWidget(m_chooseSerial);
connect(m_chooseSerial, SIGNAL(allowProceed(bool)), SIGNAL(allowProceed(bool)));
connect(m_chooseSerial, SIGNAL(startWorking()), SLOT(working()));
connect(m_chooseSerial, SIGNAL(stopWorking()), SLOT(notWorking()));
ui->stackedWidget->addWidget(m_chooseSocket);
connect(m_chooseSocket, SIGNAL(allowProceed(bool)), SIGNAL(allowProceed(bool)));
connect(m_chooseSocket, SIGNAL(startWorking()), SLOT(working()));
connect(m_chooseSocket, SIGNAL(stopWorking()), SLOT(notWorking()));
ui->stackedWidget->addWidget(m_chooseUri);
connect(m_chooseUri, SIGNAL(allowProceed(bool)), SIGNAL(allowProceed(bool)));
connect(m_chooseUri, SIGNAL(startWorking()), SLOT(working()));
connect(m_chooseUri, SIGNAL(stopWorking()), SLOT(notWorking()));
connect(m_chooseUri, SIGNAL(errorMessage(QString)), ui->messageWidget, SLOT(setText(QString)));
connect(m_chooseUri, SIGNAL(errorMessage(QString)), ui->messageWidget, SLOT(animatedShow()));
connect(m_chooseUri, SIGNAL(insertDevice(QString,QString,QString,QString,QString,QString,KCupsPrinters)),
SLOT(insertDevice(QString,QString,QString,QString,QString,QString,KCupsPrinters)));
m_chooseLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
ui->stackedWidget->addWidget(m_chooseLabel);
// Hide the message widget
ui->messageWidget->setMessageType(KMessageWidget::Error);
ui->messageWidget->hide();
// setup default options
setWindowTitle(i18nc("@title:window", "Select a Printer to Add"));
m_model = new DevicesModel(this);
ui->devicesTV->setModel(m_model);
ui->devicesTV->setItemDelegate(new NoSelectionRectDelegate(this));
connect(ui->devicesTV->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
this, SLOT(deviceChanged()));
connect(m_model, SIGNAL(errorMessage(QString)), ui->messageWidget, SLOT(setText(QString)));
connect(m_model, SIGNAL(errorMessage(QString)), ui->messageWidget, SLOT(animatedShow()));
// Expand when a parent is added
connect(m_model, SIGNAL(parentAdded(QModelIndex)),
ui->devicesTV, SLOT(expand(QModelIndex)));
// Update the view when the device URI combo box changed
connect(ui->connectionsCB, SIGNAL(currentIndexChanged(int)),
this, SLOT(deviceUriChanged()));
ui->connectionsGB->setVisible(false);
// Setup the busy cursor
working();
connect(m_model, SIGNAL(loaded()), this, SLOT(notWorking()));
if (!args.isEmpty()) {
// set our args
setValues(args);
}
}
PageDestinations::~PageDestinations()
{
delete ui;
}
void PageDestinations::setValues(const QVariantHash &args)
{
m_args = args;
if (args[ADDING_PRINTER].toBool()) {
// m_isValid = true;
m_model->update();
// m_busySeq->start();
} else {
// m_isValid = false;
}
}
bool PageDestinations::isValid() const
{
return true;
}
QVariantHash PageDestinations::values() const
{
QVariantHash ret = m_args;
GenericPage *page = qobject_cast<GenericPage*>(ui->stackedWidget->currentWidget());
if (page) {
ret = page->values();
} else if (canProceed()) {
ret = selectedItemValues();
}
return ret;
}
bool PageDestinations::canProceed() const
{
bool ret = ui->stackedWidget->currentIndex() != 0;
GenericPage *page = qobject_cast<GenericPage*>(ui->stackedWidget->currentWidget());
if (page) {
ret = page->canProceed();
}
return ret;
}
void PageDestinations::deviceChanged()
{
QItemSelectionModel *selection = ui->devicesTV->selectionModel();
if (!selection->selectedIndexes().isEmpty() &&
selection->selectedIndexes().size() == 1) {
QModelIndex index = selection->selectedIndexes().first();
QVariant uris = index.data(DevicesModel::DeviceUris);
if (uris.isNull()) {
ui->connectionsGB->setVisible(false);
} else if (uris.type() == QVariant::StringList) {
ui->connectionsCB->clear();
foreach (const QString &uri, uris.toStringList()) {
ui->connectionsCB->addItem(uriText(uri), uri);
}
ui->connectionsGB->setVisible(true);
} else {
ui->connectionsCB->clear();
foreach (const KCupsPrinter &printer, uris.value<KCupsPrinters>()) {
ui->connectionsCB->addItem(printer.name(), qVariantFromValue(printer));
}
ui->connectionsGB->setVisible(true);
}
} else {
ui->connectionsGB->setVisible(false);
setCurrentPage(0, selectedItemValues());
return;
}
deviceUriChanged();
}
void PageDestinations::deviceUriChanged()
{
// Get the selected values
QVariantHash args = selectedItemValues();
// "beh" is excluded from the list
QString deviceUri = args[KCUPS_DEVICE_URI].toString();
kDebug() << deviceUri;
if (deviceUri.startsWith(QLatin1String("parallel"))) {
m_chooseLabel->setText(i18n("A printer connected to the parallel port."));
setCurrentPage(m_chooseLabel, args);
} else if (deviceUri.startsWith(QLatin1String("usb"))) {
m_chooseLabel->setText(i18n("A printer connected to a USB port."));
setCurrentPage(m_chooseLabel, args);
} else if (deviceUri.startsWith(QLatin1String("bluetooth"))) {
m_chooseLabel->setText(i18n("A printer connected via Bluetooth."));
setCurrentPage(m_chooseLabel, args);
} else if (deviceUri.startsWith(QLatin1String("hal"))) {
m_chooseLabel->setText(i18n("Local printer detected by the "
"Hardware Abstraction Layer (HAL)."));
setCurrentPage(m_chooseLabel, args);
} else if (deviceUri.startsWith(QLatin1String("hp"))) {
m_chooseLabel->setText(i18n("HPLIP software driving a printer, "
"or the printer function of a multi-function device."));
setCurrentPage(m_chooseLabel, args);
} else if (deviceUri.startsWith(QLatin1String("hpfax"))) {
m_chooseLabel->setText(i18n("HPLIP software driving a fax machine, "
"or the fax function of a multi-function device."));
setCurrentPage(m_chooseLabel, args);
} else if (deviceUri.startsWith(QLatin1String("dnssd")) ||
deviceUri.startsWith(QLatin1String("mdns"))) {
// TODO this needs testing...
QString text;
if (deviceUri.contains(QLatin1String("cups"))) {
text = i18n("Remote CUPS printer via DNS-SD");
} else {
QString protocol;
if (deviceUri.contains(QLatin1String("._ipp"))) {
protocol = QLatin1String("IPP");
} else if (deviceUri.contains(QLatin1String("._printer"))) {
protocol = QLatin1String("LPD");
} else if (deviceUri.contains(QLatin1String("._pdl-datastream"))) {
protocol = QLatin1String("AppSocket/JetDirect");
}
if (protocol.isNull()) {
text = i18n("Network printer via DNS-SD");
} else {
text = i18n("%1 network printer via DNS-SD", protocol);
}
}
m_chooseLabel->setText(text);
setCurrentPage(m_chooseLabel, args);
} else if (deviceUri.startsWith(QLatin1String("socket"))) {
kDebug() << "SOCKET";
setCurrentPage(m_chooseSocket, args);
} else if (deviceUri.startsWith(QLatin1String("ipp")) ||
deviceUri.startsWith(QLatin1String("ipps")) ||
deviceUri.startsWith(QLatin1String("http")) ||
deviceUri.startsWith(QLatin1String("https"))) {
setCurrentPage(m_chooseUri, args);
} else if (deviceUri.startsWith(QLatin1String("lpd"))) {
setCurrentPage(m_chooseLpd, args);
} else if (deviceUri.startsWith(QLatin1String("scsi"))) {
// TODO
setCurrentPage(m_chooseUri, args);
} else if (deviceUri.startsWith(QLatin1String("serial"))) {
setCurrentPage(m_chooseSerial, args);
} else if (deviceUri.startsWith(QLatin1String("smb"))) {
setCurrentPage(m_chooseSamba, args);
} else if (deviceUri.startsWith(QLatin1String("network"))) {
setCurrentPage(m_chooseUri, args);
} else {
setCurrentPage(m_chooseUri, args);
}
emit allowProceed(canProceed());
}
void PageDestinations::insertDevice(const QString &device_class, const QString &device_id, const QString &device_info, const QString &device_make_and_model, const QString &device_uri, const QString &device_location, const KCupsPrinters &grouped_printers)
{
m_model->insertDevice(device_class,
device_id,
device_info,
device_make_and_model,
device_uri,
device_location,
grouped_printers);
}
QVariantHash PageDestinations::selectedItemValues() const
{
QVariantHash ret = m_args;
if (!ui->devicesTV->selectionModel()->selectedIndexes().isEmpty() &&
ui->devicesTV->selectionModel()->selectedIndexes().size() == 1) {
QModelIndex index = ui->devicesTV->selectionModel()->selectedIndexes().first();
QVariant uri = index.data(DevicesModel::DeviceUri);
QVariant uris = index.data(DevicesModel::DeviceUris);
// if the devicesTV holds an item with grouped URIs
// get the selected value from the connections combo box
if (uris.isNull() || uris.type() == QVariant::StringList) {
if (uris.type() == QVariant::StringList) {
uri = ui->connectionsCB->itemData(ui->connectionsCB->currentIndex());
}
ret[KCUPS_DEVICE_URI] = uri;
ret[KCUPS_DEVICE_ID] = index.data(DevicesModel::DeviceId);
ret[KCUPS_DEVICE_MAKE_AND_MODEL] = index.data(DevicesModel::DeviceMakeAndModel);
ret[KCUPS_DEVICE_INFO] = index.data(DevicesModel::DeviceInfo);
ret[KCUPS_DEVICE_LOCATION] = index.data(DevicesModel::DeviceLocation);
} else {
QVariant aux = ui->connectionsCB->itemData(ui->connectionsCB->currentIndex());
KCupsPrinter printer = aux.value<KCupsPrinter>();
KUrl url = uri.toString();
url.setPath(QLatin1String("printers/") + printer.name());
ret[KCUPS_DEVICE_URI] = url.url();
ret[KCUPS_DEVICE_ID] = index.data(DevicesModel::DeviceId);
ret[KCUPS_PRINTER_INFO] = printer.info();
kDebug() << KCUPS_PRINTER_INFO << printer.info();
ret[KCUPS_PRINTER_NAME] = printer.name();
ret[KCUPS_DEVICE_LOCATION] = printer.location();
}
kDebug() << uri << ret;
}
return ret;
}
void PageDestinations::setCurrentPage(QWidget *widget, const QVariantHash &args)
{
GenericPage *page = qobject_cast<GenericPage*>(widget);
if (page) {
page->setValues(args);
if (ui->stackedWidget->currentWidget() != page) {;
ui->stackedWidget->setCurrentWidget(page);
}
} else if (qobject_cast<QLabel*>(widget)) {
if (ui->connectionsGB->isVisible() &&
ui->connectionsCB->currentText() == m_chooseLabel->text()) {
// Don't show duplicated text for the user
m_chooseLabel->clear();
}
if (ui->stackedWidget->currentWidget() != widget) {;
ui->stackedWidget->setCurrentWidget(widget);
}
} else {
ui->stackedWidget->setCurrentIndex(0);
}
}
QString PageDestinations::uriText(const QString &uri) const
{
QString ret;
if (uri.startsWith(QLatin1String("parallel"))) {
ret = i18n("Parallel Port");
} else if (uri.startsWith(QLatin1String("serial"))) {
ret = i18n("Serial Port");
} else if (uri.startsWith(QLatin1String("usb"))) {
ret = i18n("USB");
} else if (uri.startsWith(QLatin1String("bluetooth")) ){
ret = i18n("Bluetooth");
} else if (uri.startsWith(QLatin1String("hpfax"))) {
ret = i18n("Fax - HP Linux Imaging and Printing (HPLIP)");
} else if (uri.startsWith(QLatin1String("hp"))) {
ret = i18n("HP Linux Imaging and Printing (HPLIP)");
} else if (uri.startsWith(QLatin1String("hal"))) {
ret = i18n("Hardware Abstraction Layer (HAL)");
} else if (uri.startsWith(QLatin1String("socket"))) {
ret = i18n("AppSocket/HP JetDirect");
} else if (uri.startsWith(QLatin1String("lpd"))) {
// Check if the queue name is defined
QString queue = uri.section(QLatin1Char('/'), -1, -1);
if (queue.isEmpty()) {
ret = i18n("LPD/LPR queue");
} else {
ret = i18n("LPD/LPR queue %1", queue);
}
} else if (uri.startsWith(QLatin1String("smb"))) {
ret = i18n("Windows Printer via SAMBA");
} else if (uri.startsWith(QLatin1String("ipp"))) {
// Check if the queue name (fileName) is defined
QString queue = uri.section(QLatin1Char('/'), -1, -1);
if (queue.isEmpty()) {
ret = i18n("IPP");
} else {
ret = i18n("IPP %1", queue);
}
} else if (uri.startsWith(QLatin1String("https"))) {
ret = i18n("HTTP");
} else if (uri.startsWith(QLatin1String("dnssd")) ||
uri.startsWith(QLatin1String("mdns"))) {
// TODO this needs testing...
QString text;
if (uri.contains(QLatin1String("cups"))) {
text = i18n("Remote CUPS printer via DNS-SD");
} else {
if (uri.contains(QLatin1String("._ipp"))) {
ret = i18n("IPP network printer via DNS-SD");
} else if (uri.contains(QLatin1String("._printer"))) {
ret = i18n("LPD network printer via DNS-SD");
} else if (uri.contains(QLatin1String("._pdl-datastream"))) {
ret = i18n("AppSocket/JetDirect network printer via DNS-SD");
} else {
ret = i18n("Network printer via DNS-SD");
}
}
} else {
ret = uri;
}
return ret;
}

View file

@ -1,83 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef PAGE_DESTINATIONS_H
#define PAGE_DESTINATIONS_H
#include "GenericPage.h"
#include <KCupsPrinter.h>
#include <KUrl>
#include <QLabel>
QT_BEGIN_NAMESPACE
class Ui_PageDestinations;
QT_END_NAMESPACE
class DevicesModel;
class ChooseLpd;
class ChoosePrinters;
class ChooseSamba;
class ChooseSerial;
class ChooseSocket;
class ChooseUri;
class PageDestinations : public GenericPage
{
Q_OBJECT
public:
explicit PageDestinations(const QVariantHash &args = QVariantHash(), QWidget *parent = 0);
~PageDestinations();
bool canProceed() const;
void setValues(const QVariantHash &args);
QVariantHash values() const;
bool isValid() const;
private slots:
void deviceChanged();
void deviceUriChanged();
void insertDevice(const QString &device_class,
const QString &device_id,
const QString &device_info,
const QString &device_make_and_model,
const QString &device_uri,
const QString &device_location,
const KCupsPrinters &grouped_printers);
private:
QString uriText(const QString &uri) const;
QVariantHash selectedItemValues() const;
void setCurrentPage(QWidget *widget, const QVariantHash &args);
Ui_PageDestinations *ui;
DevicesModel *m_model;
QString m_currentUri;
ChooseLpd *m_chooseLpd;
ChoosePrinters *m_choosePrinters;
ChooseSamba *m_chooseSamba;
ChooseSerial *m_chooseSerial;
ChooseSocket *m_chooseSocket;
ChooseUri *m_chooseUri;
QLabel *m_chooseLabel;
};
#endif

View file

@ -1,130 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>PageDestinations</class>
<widget class="QWidget" name="PageDestinations">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>570</width>
<height>355</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Ignored" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="horizontalSpacing">
<number>0</number>
</property>
<property name="margin">
<number>0</number>
</property>
<item row="1" column="0">
<widget class="QTreeView" name="devicesTV">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="itemsExpandable">
<bool>false</bool>
</property>
<property name="animated">
<bool>true</bool>
</property>
<property name="expandsOnDoubleClick">
<bool>false</bool>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
</widget>
</item>
<item row="1" column="1">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="connectionsGB">
<property name="title">
<string>Connections</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<property name="topMargin">
<number>0</number>
</property>
<property name="verticalSpacing">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="KComboBox" name="connectionsCB">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QStackedWidget" name="stackedWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<widget class="QWidget" name="page">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Please choose an item on the list</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</item>
<item row="0" column="0" colspan="2">
<widget class="KMessageWidget" name="messageWidget" native="true"/>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KComboBox</class>
<extends>QComboBox</extends>
<header>kcombobox.h</header>
</customwidget>
<customwidget>
<class>KMessageWidget</class>
<extends>QWidget</extends>
<header location="global">kmessagewidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View file

@ -1,78 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "AddPrinter.h"
#include <config.h>
#include <KDebug>
#include <KLocale>
#include <KAboutData>
#include <KCmdLineArgs>
int main(int argc, char **argv)
{
KAboutData about("add-printer",
"print-manager",
ki18n("AddPrinter"),
PM_VERSION,
ki18n("Tool for adding new printers"),
KAboutData::License_GPL,
ki18n("(C) 2010-2013 Daniel Nicoletti"));
about.addAuthor(ki18n("Daniel Nicoletti"), KLocalizedString(), "dantti12@gmail.com");
KCmdLineArgs::init(argc, argv, &about);
KCmdLineOptions options;
options.add("w").add("parent-window <wid>", ki18n("Parent Window ID"));
options.add("add-printer", ki18n("Add a new printer"));
options.add("add-class", ki18n("Add a new printer class"));
options.add("change-ppd <printer-name>", ki18n("Changes the PPD of a given printer"));
options.add("new-printer-from-device <printername/deviceid>", ki18n("Changes the PPD of a given printer/deviceid"));
KCmdLineArgs::addCmdLineOptions(options);
qulonglong wid = 0;
KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
if (args->isSet("w")) {
wid = args->getOption("parent-window").toULongLong();
}
AddPrinter app;
if (args->isSet("add-printer")) {
app.addPrinter(wid);
} else if (args->isSet("add-class")) {
app.addClass(wid);
} else if (args->isSet("change-ppd")) {
app.changePPD(wid, args->getOption("change-ppd"));
} else if (args->isSet("new-printer-from-device")) {
QString value = args->getOption("new-printer-from-device");
QStringList values = value.split(QLatin1String("/"));
if (values.size() == 2) {
app.newPrinterFromDevice(wid, values.first(), values.last());
} else {
args->usage("new-printer-from-device");
}
} else {
args->usage();
}
return app.exec();
}

View file

@ -1,7 +0,0 @@
#ifndef CONFIG_H
#define CONFIG_H
// Define the app-install database path.
#cmakedefine PM_VERSION "@PM_VERSION@"
#endif //CONFIG_H

View file

@ -1,39 +0,0 @@
set(configureprinter_SRCS
ConfigurePrinterInterface.cpp
ModifyPrinter.cpp
PrinterPage.cpp
PrinterOptions.cpp
PrinterBehavior.cpp
ConfigureDialog.cpp
ConfigurePrinter.cpp
main.cpp
ModifyPrinter.ui
PrinterOptions.ui
PrinterBehavior.ui
)
qt4_add_dbus_adaptor(configureprinter_SRCS
org.kde.ConfigurePrinter.xml
ConfigurePrinterInterface.h
ConfigurePrinterInterface
)
configure_file(
org.kde.ConfigurePrinter.service.in
org.kde.ConfigurePrinter.service
)
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/org.kde.ConfigurePrinter.service
DESTINATION ${KDE4_DBUS_SERVICES_INSTALL_DIR}
)
add_executable(configure-printer ${configureprinter_SRCS})
target_link_libraries(configure-printer
${KDE4_KIO_LIBS}
${CUPS_LIBRARIES}
kcupslib
)
install(TARGETS configure-printer DESTINATION ${KDE4_LIBEXEC_INSTALL_DIR})

View file

@ -1,202 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "ConfigureDialog.h"
#include "PrinterPage.h"
#include "ModifyPrinter.h"
#include "PrinterBehavior.h"
#include "PrinterOptions.h"
#include "KCupsRequest.h"
#include <KConfig>
#include <KLocale>
#include <KMessageBox>
#include <KDebug>
#include <QList>
#include <QPointer>
Q_DECLARE_METATYPE(QList<int>)
ConfigureDialog::ConfigureDialog(const QString &destName, bool isClass, QWidget *parent) :
KPageDialog(parent)
{
setFaceType(List);
setModal(true);
setButtons(KDialog::Ok | KDialog::Cancel | KDialog::Apply);
setWindowTitle(destName);
setWindowIcon(KIcon("configure"));
enableButtonApply(false);
// Needed so we have our dialog size saved
setAttribute(Qt::WA_DeleteOnClose);
QStringList attr;
KPageWidgetItem *page;
modifyPrinter = new ModifyPrinter(destName, isClass, this);
PrinterBehavior *printerBehavior = new PrinterBehavior(destName, isClass, this);
attr << modifyPrinter->neededValues();
attr << printerBehavior->neededValues();
attr << KCUPS_PRINTER_TYPE; // needed to know if it's a remote printer
attr << KCUPS_PRINTER_MAKE_AND_MODEL;
KCupsPrinter printer;
QPointer<KCupsRequest> request = new KCupsRequest;
request->getPrinterAttributes(destName, isClass, attr);
request->waitTillFinished();
if (!request) {
return;
}
if (!request->hasError() && !request->printers().isEmpty()){
printer = request->printers().first();
}
// kDebug() << "VALUES" << printer.a rgument();
// kDebug() << "marker" << values["marker-levels"].value<QList<int> >();
request->deleteLater();
// kDebug() << values;
if (printer.type() & CUPS_PRINTER_LOCAL) {
kDebug() << "CUPS_PRINTER_LOCAL";
}
isClass = printer.isClass();
bool isRemote = false;
if (printer.type() & CUPS_PRINTER_REMOTE) {
kDebug() << "CUPS_PRINTER_REMOTE";
isRemote = true;
}
if (printer.type() & CUPS_PRINTER_BW) {
kDebug() << "CUPS_PRINTER_BW";
}
if (printer.type() & CUPS_PRINTER_COLOR) {
kDebug() << "CUPS_PRINTER_COLOR";
}
if (printer.type() & CUPS_PRINTER_MFP) {
kDebug() << "CUPS_PRINTER_MFP";
}
modifyPrinter->setRemote(isRemote);
modifyPrinter->setValues(printer);
page = new KPageWidgetItem(modifyPrinter, i18n("Modify Printer"));
page->setHeader(i18n("Configure"));
page->setIcon(KIcon("dialog-information"));
// CONNECT this signal ONLY to the first Page
connect(modifyPrinter, SIGNAL(changed(bool)), this, SLOT(enableButtonApply(bool)));
addPage(page);
if (!isClass) {
// At least on localhost:631 modify printer does not show printer options
// for classes
printerOptions = new PrinterOptions(destName, isClass, isRemote, this);
page = new KPageWidgetItem(printerOptions, i18n("Printer Options"));
page->setHeader(i18n("Set the Default Printer Options"));
page->setIcon(KIcon("view-pim-tasks"));
addPage(page);
connect(modifyPrinter, SIGNAL(ppdChanged()), this, SLOT(ppdChanged()));
modifyPrinter->setCurrentMake(printerOptions->currentMake());
modifyPrinter->setCurrentMakeAndModel(printerOptions->currentMakeAndModel());
}
printerBehavior->setRemote(isRemote);
printerBehavior->setValues(printer);
page = new KPageWidgetItem(printerBehavior, i18n("Banners, Policies and Allowed Users"));
page->setHeader(i18n("Banners, Policies and Allowed Users"));
page->setIcon(KIcon("feed-subscribe"));
addPage(page);
// connect this after ALL pages were added, otherwise the slot will be called
connect(this, SIGNAL(currentPageChanged(KPageWidgetItem*,KPageWidgetItem*)),
SLOT(currentPageChanged(KPageWidgetItem*,KPageWidgetItem*)));
KConfig config("print-manager");
KConfigGroup configureDialog(&config, "ConfigureDialog");
restoreDialogSize(configureDialog);
}
void ConfigureDialog::ppdChanged()
{
printerOptions->reloadPPD();
modifyPrinter->setCurrentMake(printerOptions->currentMake());
modifyPrinter->setCurrentMakeAndModel(printerOptions->currentMakeAndModel());
}
ConfigureDialog::~ConfigureDialog()
{
KConfig config("print-manager");
KConfigGroup configureDialog(&config, "ConfigureDialog");
saveDialogSize(configureDialog);
}
void ConfigureDialog::currentPageChanged(KPageWidgetItem *current, KPageWidgetItem *before)
{
PrinterPage *currentPage = qobject_cast<PrinterPage*>(current->widget());
PrinterPage *beforePage = qobject_cast<PrinterPage*>(before->widget());
// Check if the before page has changes
savePage(beforePage);
if (beforePage) {
disconnect(beforePage, SIGNAL(changed(bool)), this, SLOT(enableButtonApply(bool)));
}
// connect the changed signal to the new page and check if it has changes
connect(currentPage, SIGNAL(changed(bool)), this, SLOT(enableButtonApply(bool)));
enableButtonApply(currentPage->hasChanges());
}
void ConfigureDialog::slotButtonClicked(int button)
{
PrinterPage *page = qobject_cast<PrinterPage *>(currentPage()->widget());
if (button == KDialog::Ok) {
page->save();
accept();
} else if (button == KDialog::Apply) {
page->save();
} else {
KDialog::slotButtonClicked(button);
}
}
void ConfigureDialog::closeEvent(QCloseEvent *event)
{
PrinterPage *page = qobject_cast<PrinterPage*>(currentPage()->widget());
if (savePage(page)) {
event->accept();
} else {
event->ignore();
}
}
bool ConfigureDialog::savePage(PrinterPage *page)
{
if (page->hasChanges()) {
int ret;
ret = KMessageBox::warningYesNoCancel(this,
i18n("The current page has changes.\n"
"Do you want to save them?"));
if (ret == KMessageBox::Yes) {
page->save();
} else if (ret == KMessageBox::Cancel) {
return false;
}
}
return true;
}

View file

@ -1,52 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef CONFIGURE_DIALOG_H
#define CONFIGURE_DIALOG_H
#include <QtGui/qevent.h>
#include <KPageDialog>
#include <kdemacros.h>
class PrinterPage;
class ModifyPrinter;
class PrinterOptions;
class KDE_EXPORT ConfigureDialog : public KPageDialog
{
Q_OBJECT
public:
explicit ConfigureDialog(const QString &destName, bool isClass, QWidget *parent = 0);
~ConfigureDialog();
private slots:
void currentPageChanged(KPageWidgetItem *current, KPageWidgetItem *before);
virtual void slotButtonClicked(int button);
void ppdChanged();
private:
ModifyPrinter *modifyPrinter;
PrinterOptions *printerOptions;
void closeEvent(QCloseEvent *event);
// return false if the dialog was canceled
bool savePage(PrinterPage *page);
};
#endif

View file

@ -1,56 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "ConfigurePrinter.h"
#include "ConfigurePrinterInterface.h"
#include <QTimer>
#include <KCmdLineArgs>
#include <KDebug>
ConfigurePrinter::ConfigurePrinter() :
KUniqueApplication()
{
m_cpInterface = new ConfigurePrinterInterface(this);
connect(m_cpInterface, SIGNAL(quit()), this, SLOT(quit()));
}
int ConfigurePrinter::newInstance()
{
KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
QString printerName = args->getOption("configure-printer");
if (!printerName.isEmpty()) {
m_cpInterface->ConfigurePrinter(printerName);
} else {
// If DBus called the ui list won't be empty
QTimer::singleShot(500, m_cpInterface, SLOT(RemovePrinter()));
}
args->clear();
return 0;
}
ConfigurePrinter::~ConfigurePrinter()
{
}
#include "moc_ConfigurePrinter.cpp"

View file

@ -1,40 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef CONFIGURE_PRINTER_H
#define CONFIGURE_PRINTER_H
#include <KUniqueApplication>
class ConfigurePrinterInterface;
class ConfigurePrinter : public KUniqueApplication
{
Q_OBJECT
public:
ConfigurePrinter();
virtual ~ConfigurePrinter();
int newInstance();
private:
ConfigurePrinterInterface *m_cpInterface;
};
#endif // CONFIGURE_PRINTER_H

View file

@ -1,131 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 Daniel Nicoletti <dantti12@gmail.com> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
***************************************************************************/
#include "ConfigurePrinterInterface.h"
#include "configureprinteradaptor.h"
#include "ConfigureDialog.h"
#include <KCupsRequest.h>
#include <KCupsPrinter.h>
#include <QtDBus/QDBusConnection>
#include <QtCore/QTimer>
#include <QtCore/QPointer>
#include <QtGui/QLayout>
#include <KWindowSystem>
#include <KDialog>
#include <KDebug>
ConfigurePrinterInterface::ConfigurePrinterInterface(QObject *parent) :
QObject(parent)
{
kDebug() << "Creating Helper";
(void) new ConfigurePrinterAdaptor(this);
if (!QDBusConnection::sessionBus().registerService("org.kde.ConfigurePrinter")) {
kDebug() << "another helper is already running";
return;
}
if (!QDBusConnection::sessionBus().registerObject("/", this)) {
kDebug() << "unable to register service interface to dbus";
return;
}
// setup the timer that updates the UIs
m_updateUi = new QTimer(this);
m_updateUi->setInterval(1000);
m_updateUi->start();
}
ConfigurePrinterInterface::~ConfigurePrinterInterface()
{
}
void ConfigurePrinterInterface::ConfigurePrinter(const QString &destName)
{
if (!m_uis.contains(destName)) {
// Reserve this since the CUPS call might take a long time
m_uis[destName] = 0;
QStringList att;
att << KCUPS_PRINTER_NAME;
att << KCUPS_PRINTER_TYPE;
// Get destinations with these attributes
QPointer<KCupsRequest> request = new KCupsRequest;
request->getPrinters(att);
request->waitTillFinished();
if (!request) {
return;
}
bool found = false;
KCupsPrinter printer;
KCupsPrinters printers = request->printers();
for (int i = 0; i < printers.size(); i++) {
if (printers.at(i).name() == destName) {
printer = printers.at(i);
found = true;
break;
}
}
request->deleteLater();
if (found) {
ConfigureDialog *ui = new ConfigureDialog(printer.name(), printer.isClass());
connect(m_updateUi, SIGNAL(timeout()),
ui, SLOT(update()));
connect(ui, SIGNAL(finished()),
this, SLOT(RemovePrinter()));
ui->show();
m_uis[printer.name()] = ui;
} else {
// Remove the reservation
m_uis.remove(destName);
// if no destination was found and we aren't showing
// a queue quit the app
if (m_uis.isEmpty()) {
emit quit();
}
return;
}
}
// Check it it's not reserved
if (m_uis.value(destName)) {
KWindowSystem::forceActiveWindow(m_uis.value(destName)->winId());
}
}
void ConfigurePrinterInterface::RemovePrinter()
{
QWidget *ui = qobject_cast<QWidget*>(sender());
if (ui) {
m_uis.remove(m_uis.key(ui));
}
// if no destination was found and we aren't showing
// a queue quit the app
if (m_uis.isEmpty()) {
emit quit();
}
}
#include "moc_ConfigurePrinterInterface.cpp"

View file

@ -1,49 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 Daniel Nicoletti <dantti12@gmail.com> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
***************************************************************************/
#ifndef CONFIGURE_PRINTER_INTERFACE_H
#define CONFIGURE_PRINTER_INTERFACE_H
#include <QtCore/QHash>
#include <QtCore/QObject>
#include <QtDBus/QDBusContext>
#include <QTimer>
#include <QWidget>
class ConfigurePrinterInterface : public QObject, protected QDBusContext
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.kde.ConfigurePrinter")
public:
explicit ConfigurePrinterInterface(QObject *parent = 0);
~ConfigurePrinterInterface();
signals:
void quit();
public slots:
void ConfigurePrinter(const QString &destName);
void RemovePrinter();
private:
QTimer *m_updateUi;
QHash<QString, QWidget *> m_uis;
};
#endif

View file

@ -1,334 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "ModifyPrinter.h"
#include "ui_ModifyPrinter.h"
#include "SelectMakeModel.h"
#include <KDialog>
#include <KPixmapSequenceOverlayPainter>
#include <KPixmapSequence>
#include <KPushButton>
#include <KMessageBox>
#include <KDebug>
#include <KLocale>
ModifyPrinter::ModifyPrinter(const QString &destName, bool isClass, QWidget *parent) :
PrinterPage(parent),
ui(new Ui_ModifyPrinter),
m_destName(destName),
m_isClass(isClass),
m_changes(0)
{
ui->setupUi(this);
ui->nameL->setText(destName);
ui->connectionL->setVisible(!isClass);
ui->connectionLE->setVisible(!isClass);
ui->driverL->setVisible(!isClass);
ui->makeCB->setVisible(!isClass);
ui->membersL->setVisible(isClass);
ui->membersLV->setVisible(isClass);
if (isClass) {
ui->membersLV->setPrinter(destName);
}
connect(ui->descriptionLE, SIGNAL(textChanged(QString)),
this, SLOT(textChanged(QString)));
connect(ui->locationLE, SIGNAL(textChanged(QString)),
this, SLOT(textChanged(QString)));
connect(ui->connectionLE, SIGNAL(textChanged(QString)),
this, SLOT(textChanged(QString)));
connect(ui->membersLV, SIGNAL(changed(bool)),
this, SLOT(modelChanged()));
}
ModifyPrinter::~ModifyPrinter()
{
delete ui;
}
void ModifyPrinter::on_makeCB_activated(int index)
{
bool isDifferent = true;
if (ui->makeCB->itemData(index).toUInt() == PPDList) {
KConfig config("print-manager");
KConfigGroup ppdDialog(&config, "PPDDialog");
SelectMakeModel *widget = new SelectMakeModel(this);
KDialog *dialog = new KDialog(this);
connect(dialog, SIGNAL(accepted()), this, SLOT(ppdSelectionAccepted()));
connect(dialog, SIGNAL(rejected()), this, SLOT(ppdSelectionRejected()));
connect(widget, SIGNAL(changed(bool)), dialog, SLOT(enableButtonOk(bool)));
dialog->setCaption("Select a Driver");
dialog->setButtons(KDialog::Ok | KDialog::Cancel | KDialog::Help);
dialog->setMainWidget(widget);
dialog->enableButtonOk(false);
dialog->restoreDialogSize(ppdDialog);
// Configure the help button to be flat, disabled and empty
KPushButton *button = dialog->button(KDialog::Help);
button->setFlat(true);
button->setEnabled(false);
button->setIcon(QIcon());
button->setText(QString());
// Setup the busy cursor
KPixmapSequenceOverlayPainter *busySeq = new KPixmapSequenceOverlayPainter(dialog);
busySeq->setSequence(KPixmapSequence("process-working", KIconLoader::SizeSmallMedium));
busySeq->setAlignment(Qt::AlignHCenter | Qt::AlignBottom);
busySeq->setWidget(button);
busySeq->start();
connect(widget, SIGNAL(changed(bool)), busySeq, SLOT(stop()));
kDebug() << m_make << m_makeAndModel;
widget->setMakeModel(m_make, m_makeAndModel);
dialog->show();
return;
} else if (ui->makeCB->itemData(index).toUInt() == PPDFile) {
// set the QVariant type to bool makes it possible to know a file was selected
m_changedValues["ppd-name"] = true;
} else if (ui->makeCB->itemData(index).toUInt() == PPDDefault) {
isDifferent = false;
m_changedValues.remove("ppd-name");
} else if (ui->makeCB->itemData(index).toUInt() == PPDCustom) {
m_changedValues["ppd-name"] = ui->makeCB->itemData(index, PPDName).toString();
} else {
kWarning() << "This should not happen";
return;
}
if (isDifferent != ui->makeCB->property("different").toBool()) {
// it's different from the last time so add or remove changes
isDifferent ? m_changes++ : m_changes--;
ui->makeCB->setProperty("different", isDifferent);
emit changed(m_changes);
}
ui->makeCB->setProperty("lastIndex", ui->makeCB->currentIndex());
}
void ModifyPrinter::ppdSelectionAccepted()
{
KDialog *dialog = qobject_cast<KDialog*>(sender());
SelectMakeModel *widget = qobject_cast<SelectMakeModel*>(dialog->mainWidget());
if (widget->isFileSelected()) {
QString fileName = widget->selectedPPDFileName();
ui->makeCB->insertItem(0, fileName, PPDFile);
ui->makeCB->setCurrentIndex(0);
on_makeCB_activated(0);
} else if (!widget->selectedPPDName().isNull()) {
QString makeAndModel = widget->selectedPPDMakeAndModel();
QString ppdName = widget->selectedPPDName();
ui->makeCB->insertItem(0, makeAndModel, PPDCustom);
ui->makeCB->setItemData(0, ppdName, PPDName);
ui->makeCB->setCurrentIndex(0);
on_makeCB_activated(0);
} else {
ui->makeCB->setCurrentIndex(ui->makeCB->property("lastIndex").toInt());
}
KConfig config("print-manager");
KConfigGroup ppdDialog(&config, "PPDDialog");
dialog->saveDialogSize(ppdDialog);
dialog->deleteLater();
}
void ModifyPrinter::ppdSelectionRejected()
{
ui->makeCB->setCurrentIndex(ui->makeCB->property("lastIndex").toInt());
KDialog *dialog = qobject_cast<KDialog*>(sender());
KConfig config("print-manager");
KConfigGroup ppdDialog(&config, "PPDDialog");
dialog->saveDialogSize(ppdDialog);
dialog->deleteLater();
}
void ModifyPrinter::setValues(const KCupsPrinter &printer)
{
// kDebug() << values;
if (m_isClass) {
ui->membersLV->setSelectedPrinters(printer.memberNames().join(QLatin1String("|")));
} else {
ui->makeCB->clear();
ui->makeCB->setProperty("different", false);
ui->makeCB->setProperty("lastIndex", 0);
ui->makeCB->insertItem(0,
i18n("Current - %1", printer.makeAndModel()),
PPDDefault);
ui->makeCB->insertSeparator(1);
ui->makeCB->insertItem(2, i18n("Select a custom driver"), PPDList);
}
ui->membersLV->setProperty("different", false);
ui->descriptionLE->setText(printer.info());
ui->descriptionLE->setProperty("orig_text", printer.info());
ui->descriptionLE->setProperty("different", false);
ui->locationLE->setText(printer.location());
ui->locationLE->setProperty("orig_text", printer.location());
ui->locationLE->setProperty("different", false);
ui->connectionLE->setText(printer.deviceUri());
ui->connectionLE->setProperty("orig_text", printer.deviceUri());
ui->connectionLE->setProperty("different", false);
// clear old values
m_changes = 0;
m_changedValues.clear();
emit changed(0);
}
void ModifyPrinter::modelChanged()
{
bool isDifferent = ui->membersLV->hasChanges();
if (isDifferent != ui->membersLV->property("different").toBool()) {
// it's different from the last time so add or remove changes
isDifferent ? m_changes++ : m_changes--;
ui->membersLV->setProperty("different", isDifferent);
emit changed(m_changes);
}
// store the new values
if (isDifferent) {
m_changedValues[KCUPS_MEMBER_URIS] = ui->membersLV->currentSelected(true);
} else {
m_changedValues.remove(KCUPS_MEMBER_URIS);
}
}
void ModifyPrinter::textChanged(const QString &text)
{
KLineEdit *le = qobject_cast<KLineEdit *>(sender());
bool isDifferent = le->property("orig_text") != text;
if (isDifferent != le->property("different").toBool()) {
// it's different from the last time so add or remove changes
isDifferent ? m_changes++ : m_changes--;
le->setProperty("different", isDifferent);
emit changed(m_changes);
}
// store the new values
QString attribute = le->property("AttributeName").toString();
if (isDifferent) {
m_changedValues[attribute] = text;
} else {
m_changedValues.remove(attribute);
}
}
void ModifyPrinter::save()
{
if (m_changes) {
QVariantHash args = m_changedValues;
QString fileName;
kDebug() << args;
if (args.contains("ppd-name") &&
args["ppd-name"].type() == QVariant::Bool) {
fileName = ui->makeCB->itemData(ui->makeCB->currentIndex(), PPDFile).toString();
args.remove("ppd-name");
}
kDebug() << fileName;
QPointer<KCupsRequest> request = new KCupsRequest;
if (m_isClass) {
request->addOrModifyClass(m_destName, args);
} else {
request->addOrModifyPrinter(m_destName, args, fileName);
}
request->waitTillFinished();
if (request) {
if (!request->hasError()) {
if (m_changedValues.contains("ppd-name")) {
emit ppdChanged();
}
request->getPrinterAttributes(m_destName, m_isClass, neededValues());
request->waitTillFinished();
if (!request->hasError() && !request->printers().isEmpty()) {
KCupsPrinter printer = request->printers().first();
setValues(printer);
}
} else {
KMessageBox::detailedSorry(this,
m_isClass ? i18nc("@info", "Failed to configure class") :
i18nc("@info", "Failed to configure printer"),
request->errorMsg(),
i18nc("@title:window", "Failed"));
}
request->deleteLater();
}
}
}
QVariantHash ModifyPrinter::modifiedValues() const
{
return m_changedValues;
}
bool ModifyPrinter::hasChanges()
{
return m_changes;
}
void ModifyPrinter::setRemote(bool remote)
{
ui->descriptionLE->setReadOnly(remote);
ui->locationLE->setReadOnly(remote);
ui->connectionLE->setReadOnly(remote);
ui->makeCB->setEnabled(!remote);
}
void ModifyPrinter::setCurrentMake(const QString &make)
{
m_make = make;
}
void ModifyPrinter::setCurrentMakeAndModel(const QString &makeAndModel)
{
m_makeAndModel = makeAndModel;
}
QStringList ModifyPrinter::neededValues() const
{
QStringList ret;
ret << KCUPS_PRINTER_INFO;
ret << KCUPS_PRINTER_LOCATION;
if (m_isClass) {
ret << KCUPS_MEMBER_NAMES;
} else {
ret << KCUPS_DEVICE_URI;
ret << KCUPS_PRINTER_MAKE_AND_MODEL;
}
return ret;
}
#include "moc_ModifyPrinter.cpp"

View file

@ -1,78 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef MODIFY_PRINTER_H
#define MODIFY_PRINTER_H
#include "PrinterPage.h"
#include "KCupsRequest.h"
#include <QWidget>
QT_BEGIN_NAMESPACE
class Ui_ModifyPrinter;
QT_END_NAMESPACE
class ModifyPrinter : public PrinterPage
{
Q_OBJECT
Q_ENUMS(Role)
public:
typedef enum {
PPDDefault,
PPDCustom,
PPDFile,
PPDList,
PPDName = Qt::UserRole + 1
} Role;
explicit ModifyPrinter(const QString &destName, bool isClass, QWidget *parent = 0);
~ModifyPrinter();
bool hasChanges();
QVariantHash modifiedValues() const;
QStringList neededValues() const;
void setRemote(bool remote);
void setValues(const KCupsPrinter &printer);
void setCurrentMake(const QString &make);
void setCurrentMakeAndModel(const QString &makeAndModel);
void save();
signals:
void ppdChanged();
private slots:
void textChanged(const QString &text);
void on_makeCB_activated(int index);
void ppdSelectionAccepted();
void ppdSelectionRejected();
void modelChanged();
private:
Ui_ModifyPrinter *ui;
QString m_destName, m_make, m_makeAndModel;
bool m_isClass;
QVariantHash m_changedValues;
int m_changes;
};
#endif

View file

@ -1,185 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ModifyPrinter</class>
<widget class="QWidget" name="ModifyPrinter">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>472</width>
<height>470</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="margin">
<number>0</number>
</property>
<item row="0" column="0">
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Name:</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Description:</string>
</property>
<property name="buddy">
<cstring>descriptionLE</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="KLineEdit" name="descriptionLE">
<property name="toolTip">
<string>Human-readable description such as &quot;HP LaserJet with Duplexer&quot;</string>
</property>
<property name="AttributeName" stdset="0">
<string notr="true">printer-info</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Location:</string>
</property>
<property name="buddy">
<cstring>locationLE</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="KLineEdit" name="locationLE">
<property name="toolTip">
<string>Human-readable location such as &quot;Lab 1&quot;</string>
</property>
<property name="AttributeName" stdset="0">
<string notr="true">printer-location</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="connectionL">
<property name="text">
<string>Connection:</string>
</property>
<property name="buddy">
<cstring>connectionLE</cstring>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="KLineEdit" name="connectionLE">
<property name="whatsThis">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:10pt;&quot;&gt;Examples:&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;http://hostname:631/ipp/&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;http://hostname:631/ipp/port1&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;ipp://hostname/ipp/&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;ipp://hostname/ipp/port1&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;lpd://hostname/queue&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;socket://hostname&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;socket://hostname:9100&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="AttributeName" stdset="0">
<string notr="true">device-uri</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="membersL">
<property name="text">
<string>Members</string>
</property>
<property name="buddy">
<cstring>membersLV</cstring>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="ClassListWidget" name="membersLV"/>
</item>
<item row="6" column="0">
<widget class="QLabel" name="driverL">
<property name="text">
<string>Driver:</string>
</property>
<property name="buddy">
<cstring>makeCB</cstring>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="KComboBox" name="makeCB">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="nameL">
<property name="text">
<string notr="true">name</string>
</property>
<property name="textFormat">
<enum>Qt::PlainText</enum>
</property>
<property name="textInteractionFlags">
<set>Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KComboBox</class>
<extends>QComboBox</extends>
<header>kcombobox.h</header>
</customwidget>
<customwidget>
<class>KLineEdit</class>
<extends>QLineEdit</extends>
<header>klineedit.h</header>
</customwidget>
<customwidget>
<class>ClassListWidget</class>
<extends>QListView</extends>
<header>ClassListWidget.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>descriptionLE</tabstop>
<tabstop>locationLE</tabstop>
<tabstop>connectionLE</tabstop>
<tabstop>membersLV</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

View file

@ -1,326 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "PrinterBehavior.h"
#include "ui_PrinterBehavior.h"
#include <KComboBox>
#include <KDebug>
#include <KLocale>
PrinterBehavior::PrinterBehavior(const QString &destName, bool isClass, QWidget *parent) :
PrinterPage(parent),
ui(new Ui_PrinterBehavior),
m_destName(destName),
m_isClass(isClass),
m_changes(0)
{
ui->setupUi(this);
connect(ui->errorPolicyCB, SIGNAL(currentIndexChanged(int)),
this, SLOT(currentIndexChangedCB(int)));
connect(ui->operationPolicyCB, SIGNAL(currentIndexChanged(int)),
this, SLOT(currentIndexChangedCB(int)));
connect(ui->startingBannerCB, SIGNAL(currentIndexChanged(int)),
this, SLOT(currentIndexChangedCB(int)));
connect(ui->endingBannerCB, SIGNAL(currentIndexChanged(int)),
this, SLOT(currentIndexChangedCB(int)));
connect(ui->usersELB, SIGNAL(changed()),
this, SLOT(userListChanged()));
connect(ui->allowRB, SIGNAL(toggled(bool)),
this, SLOT(userListChanged()));
}
PrinterBehavior::~PrinterBehavior()
{
delete ui;
}
void PrinterBehavior::setValues(const KCupsPrinter &printer)
{
int defaultChoice;
ui->errorPolicyCB->clear();
foreach (const QString &value, printer.errorPolicySupported()) {
ui->errorPolicyCB->addItem(errorPolicyString(value), value);
}
QStringList errorPolicy = printer.errorPolicy();
if (!errorPolicy.isEmpty()) {
defaultChoice = ui->errorPolicyCB->findData(errorPolicy.first());
ui->errorPolicyCB->setCurrentIndex(defaultChoice);
ui->errorPolicyCB->setProperty("defaultChoice", defaultChoice);
}
ui->operationPolicyCB->clear();
foreach (const QString &value, printer.opPolicySupported()) {
ui->operationPolicyCB->addItem(operationPolicyString(value), value);
}
QStringList operationPolicy = printer.opPolicy();
if (!errorPolicy.isEmpty()) {
defaultChoice = ui->operationPolicyCB->findData(operationPolicy.first());
ui->operationPolicyCB->setCurrentIndex(defaultChoice);
ui->operationPolicyCB->setProperty("defaultChoice", defaultChoice);
}
ui->startingBannerCB->clear();
ui->endingBannerCB->clear();
foreach (const QString &value, printer.jobSheetsSupported()) {
ui->startingBannerCB->addItem(jobSheetsString(value), value);
ui->endingBannerCB->addItem(jobSheetsString(value), value);
}
QStringList bannerPolicy = printer.jobSheetsDefault();
if (bannerPolicy.size() == 2) {
defaultChoice = ui->startingBannerCB->findData(bannerPolicy.at(0));
ui->startingBannerCB->setCurrentIndex(defaultChoice);
ui->startingBannerCB->setProperty("defaultChoice", defaultChoice);
defaultChoice = ui->endingBannerCB->findData(bannerPolicy.at(1));
ui->endingBannerCB->setCurrentIndex(defaultChoice);
ui->endingBannerCB->setProperty("defaultChoice", defaultChoice);
}
if (!printer.requestingUserNameAllowed().isEmpty()) {
QStringList list = printer.requestingUserNameAllowed();
list.sort(); // sort the list here to be able to comapare it later
ui->usersELB->setEnabled(true);
if (list != ui->usersELB->items()) {
ui->usersELB->clear();
ui->usersELB->insertStringList(list);
}
ui->usersELB->setProperty("defaultList", list);
ui->allowRB->setProperty("defaultChoice", true);
// Set checked AFTER the default choice was set
// otherwise the signal will be emmited
// which sets that we have a change
ui->allowRB->setChecked(true);
} else if (!printer.requestingUserNameDenied().isEmpty()) {
QStringList list = printer.requestingUserNameDenied();
list.sort(); // sort the list here to be able to comapare it later
ui->usersELB->setEnabled(true);
if (list != ui->usersELB->items()) {
ui->usersELB->clear();
ui->usersELB->insertStringList(list);
}
ui->usersELB->setProperty("defaultList", list);
ui->allowRB->setProperty("defaultChoice", false);
// Set checked AFTER the default choice was set
// otherwise the signal will be emmited
// which sets that we have a change
ui->preventRB->setChecked(true);
}
// Clear previous changes
m_changes = 0;
emit changed(false);
m_changedValues.clear();
ui->errorPolicyCB->setProperty("different", false);
ui->operationPolicyCB->setProperty("different", false);
ui->startingBannerCB->setProperty("different", false);
ui->endingBannerCB->setProperty("different", false);
ui->usersELB->setProperty("different", false);
}
void PrinterBehavior::userListChanged()
{
if (ui->usersELB->isEnabled() == false &&
(ui->allowRB->isChecked() ||
ui->preventRB->isChecked())) {
// this only happen when the list was empty
ui-> usersELB->setEnabled(true);
}
QStringList currentList, defaultList;
currentList = ui->usersELB->items();
// sort the list so we can be sure it's different
currentList.sort();
defaultList = ui->usersELB->property("defaultList").value<QStringList>();
bool isDifferent = currentList != defaultList;
if (isDifferent == false && currentList.isEmpty() == false) {
// if the lists are equal and not empty the user might have
// changed the Radio Button...
if (ui->allowRB->isChecked() != ui->allowRB->property("defaultChoice").toBool()) {
isDifferent = true;
}
}
if (isDifferent != ui->usersELB->property("different").toBool()) {
// it's different from the last time so add or remove changes
isDifferent ? m_changes++ : m_changes--;
ui->usersELB->setProperty("different", isDifferent);
emit changed(m_changes);
}
}
void PrinterBehavior::currentIndexChangedCB(int index)
{
KComboBox *comboBox = qobject_cast<KComboBox*>(sender());
bool isDifferent = comboBox->property("defaultChoice").toInt() != index;
if (isDifferent != comboBox->property("different").toBool()) {
// it's different from the last time so add or remove changes
isDifferent ? m_changes++ : m_changes--;
comboBox->setProperty("different", isDifferent);
emit changed(m_changes);
}
QString attribute = comboBox->property("AttributeName").toString();
QVariant value;
// job-sheets-default has always two values
if (attribute == "job-sheets-default") {
QStringList values;
values << ui->startingBannerCB->itemData(ui->startingBannerCB->currentIndex()).toString();
values << ui->endingBannerCB->itemData(ui->endingBannerCB->currentIndex()).toString();
value = values;
} else {
value = comboBox->itemData(index).toString();
}
// store the new values
if (isDifferent) {
m_changedValues[attribute] = value;
} else {
m_changedValues.remove(attribute);
}
}
QString PrinterBehavior::errorPolicyString(const QString &policy) const
{
// TODO search for others policies of printer-error-policy-supported
if (policy == "abort-job") {
return i18n("Abort job");
} else if (policy == "retry-current-job") {
return i18n("Retry current job");
} else if (policy == "retry-job") {
return i18n("Retry job");
} else if (policy == "stop-printer") {
return i18n("Stop printer");
}
return policy;
}
QString PrinterBehavior::operationPolicyString(const QString &policy) const
{
// TODO search for others policies of printer-error-policy-supported
if (policy == "authenticated") {
return i18n("Authenticated");
} else if (policy == "default") {
return i18n("Default");
}
return policy;
}
QString PrinterBehavior::jobSheetsString(const QString &policy) const
{
// TODO search for others policies of printer-error-policy-supported
if (policy == "none") {
return i18n("None");
} else if (policy == "classified") {
return i18n("Classified");
} else if (policy == "confidential") {
return i18n("Confidential");
} else if (policy == "secret") {
return i18n("Secret");
} else if (policy == "standard") {
return i18n("Standard");
} else if (policy == "topsecret") {
return i18n("Topsecret");
} else if (policy == "unclassified") {
return i18n("Unclassified");
}
return policy;
}
void PrinterBehavior::save()
{
if (m_changes) {
QVariantHash changedValues = m_changedValues;
// since a QStringList might be big we get it here instead
// of adding it at edit time.
if (ui->usersELB->property("different").toBool()) {
QStringList list = ui->usersELB->items();
if (list.isEmpty()) {
list << "all";
changedValues[KCUPS_REQUESTING_USER_NAME_ALLOWED] = list;
} else {
if (ui->allowRB->isChecked()) {
changedValues[KCUPS_REQUESTING_USER_NAME_ALLOWED] = list;
} else {
changedValues[KCUPS_REQUESTING_USER_NAME_DENIED] = list;
}
}
}
QPointer<KCupsRequest> request = new KCupsRequest;
if (m_isClass) {
request->addOrModifyClass(m_destName, changedValues);
} else {
request->addOrModifyPrinter(m_destName, changedValues);
}
request->waitTillFinished();
if (request) {
if (!request->hasError()) {
request->getPrinterAttributes(m_destName, m_isClass, neededValues());
request->waitTillFinished();
if (request && !request->hasError() && !request->printers().isEmpty()){
KCupsPrinter printer = request->printers().first();
setValues(printer);
}
}
request->deleteLater();
}
}
}
void PrinterBehavior::setRemote(bool remote)
{
ui->errorPolicyCB->setEnabled(!remote);
ui->operationPolicyCB->setEnabled(!remote);
ui->startingBannerCB->setEnabled(!remote);
ui->endingBannerCB->setEnabled(!remote);
ui->allowRB->setEnabled(!remote);
ui->preventRB->setEnabled(!remote);
ui->usersELB->setEnabled(!remote);
}
bool PrinterBehavior::hasChanges()
{
return m_changes;
}
QStringList PrinterBehavior::neededValues() const
{
QStringList ret;
ret << KCUPS_JOB_SHEETS_DEFAULT;
ret << KCUPS_JOB_SHEETS_SUPPORTED;
ret << KCUPS_PRINTER_ERROR_POLICY;
ret << KCUPS_PRINTER_ERROR_POLICY_SUPPORTED;
ret << KCUPS_PRINTER_OP_POLICY;
ret << KCUPS_PRINTER_OP_POLICY_SUPPORTED;
ret << KCUPS_REQUESTING_USER_NAME_ALLOWED;
ret << KCUPS_REQUESTING_USER_NAME_DENIED;
return ret;
}

View file

@ -1,63 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef PRINTER_BEHAVIOR_H
#define PRINTER_BEHAVIOR_H
#include "PrinterPage.h"
#include "KCupsRequest.h"
#include <QWidget>
QT_BEGIN_NAMESPACE
class Ui_PrinterBehavior;
QT_END_NAMESPACE
class PrinterBehavior : public PrinterPage
{
Q_OBJECT
public:
explicit PrinterBehavior(const QString &destName, bool isClass, QWidget *parent = 0);
~PrinterBehavior();
void setValues(const KCupsPrinter &printer);
void setRemote(bool remote);
bool hasChanges();
QStringList neededValues() const;
void save();
private slots:
void currentIndexChangedCB(int index);
void userListChanged();
private:
QString errorPolicyString(const QString &policy) const;
QString operationPolicyString(const QString &policy) const;
QString jobSheetsString(const QString &policy) const;
Ui_PrinterBehavior *ui;
QString m_destName;
bool m_isClass;
QVariantHash m_changedValues;
int m_changes;
};
#endif

View file

@ -1,179 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>PrinterBehavior</class>
<widget class="QWidget" name="PrinterBehavior">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>486</width>
<height>484</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="margin">
<number>0</number>
</property>
<item row="4" column="0">
<widget class="QGroupBox" name="BanneryGB">
<property name="title">
<string>Banners</string>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Starting Banner:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>startingBannerCB</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="KComboBox" name="startingBannerCB">
<property name="AttributeName" stdset="0">
<string notr="true">job-sheets-default</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Ending Banner:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>endingBannerCB</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="KComboBox" name="endingBannerCB">
<property name="AttributeName" stdset="0">
<string notr="true">job-sheets-default</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="PoliciesGB">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Policies</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Operation Policy:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>operationPolicyCB</cstring>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Error Policy:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>errorPolicyCB</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="KComboBox" name="errorPolicyCB">
<property name="AttributeName" stdset="0">
<string notr="true">printer-error-policy</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="KComboBox" name="operationPolicyCB">
<property name="AttributeName" stdset="0">
<string notr="true">printer-op-policy</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="7" column="0">
<widget class="QGroupBox" name="AllowGB">
<property name="title">
<string>Allowed Users</string>
</property>
<layout class="QGridLayout" name="gridLayout_6">
<item row="2" column="0">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string/>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="KEditListWidget" name="usersELB">
<property name="enabled">
<bool>false</bool>
</property>
<property name="buttons">
<set>KEditListWidget::Add|KEditListWidget::Remove</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="0" column="0">
<widget class="QRadioButton" name="allowRB">
<property name="text">
<string>Allow these users to print</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="preventRB">
<property name="text">
<string>Prevent these users from printing </string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KEditListWidget</class>
<extends>QWidget</extends>
<header>keditlistwidget.h</header>
</customwidget>
<customwidget>
<class>KComboBox</class>
<extends>QComboBox</extends>
<header>kcombobox.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View file

@ -1,824 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
* *
* The save PPD snipet is from CUPS *
* Copyright 2007-2009 by Apple Inc. *
* Copyright 1997-2007 by Easy Software Products. *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* This is converted from LGPL 2 in accordance with section 3 *
* See http://www.cups.org/documentation.php/license.html *
***************************************************************************/
#include "PrinterOptions.h"
#include "ui_PrinterOptions.h"
#include <KCupsRequest.h>
#include <NoSelectionRectDelegate.h>
#include <QFormLayout>
#include <KComboBox>
#include <QRadioButton>
#include <QButtonGroup>
#include <QStandardItemModel>
#include <QListView>
#include <QGroupBox>
#include <KDebug>
#include <KLocale>
#include <ctype.h>
#define DEFAULT_CHOICE "defaultChoice"
PrinterOptions::PrinterOptions(const QString &destName, bool isClass, bool isRemote, QWidget *parent) :
PrinterPage(parent),
ui(new Ui_PrinterOptions),
m_destName(destName),
m_isClass(isClass),
m_isRemote(isRemote),
m_ppd(NULL),
m_changes(0)
{
ui->setupUi(this);
reloadPPD();
}
void PrinterOptions::on_autoConfigurePB_clicked()
{
QPointer<KCupsRequest> request = new KCupsRequest;
request->printCommand(m_destName, "AutoConfigure", i18n("Set Default Options"));
request->waitTillFinished();
if (request) {
request->deleteLater();
}
}
void PrinterOptions::reloadPPD()
{
// The caller "owns" the file that is created and must unlink the returned filename.
if (!m_filename.isNull()) {
unlink(m_filename.toUtf8());
}
// remove all the options
while (ui->verticalLayout->count()) {
kDebug() << "removing" << ui->verticalLayout->count();
QLayoutItem *item = ui->verticalLayout->itemAt(0);
ui->verticalLayout->removeItem(item);
if (item->widget()) {
item->widget()->deleteLater();
delete item;
} else if (item->layout()) {
kDebug() << "removing layout" << ui->verticalLayout->count();
// item->layout()->deleteLater();
} else if (item->spacerItem()) {
delete item->spacerItem();
}
}
m_changes = 0;
m_customValues.clear();
emit changed(false);
QPointer<KCupsRequest> request = new KCupsRequest;
request->getPrinterPPD(m_destName);
request->waitTillFinished();
if (!request) {
return;
}
m_filename = request->printerPPD();
m_ppd = ppdOpenFile(m_filename.toUtf8());
request->deleteLater();
if (m_ppd == NULL) {
kWarning() << "Could not open ppd file:" << m_filename << request->errorMsg();
m_filename.clear();
return;
}
// select the default options on the ppd file
ppdMarkDefaults(m_ppd);
// TODO tri to use QTextCodec aliases
const char *lang_encoding;
lang_encoding = m_ppd->lang_encoding;
if (lang_encoding && !strcasecmp (lang_encoding, "ISOLatin1")) {
m_codec = QTextCodec::codecForName("ISO-8859-1");
} else if (lang_encoding && !strcasecmp (lang_encoding, "ISOLatin2")) {
m_codec = QTextCodec::codecForName("ISO-8859-2");
} else if (lang_encoding && !strcasecmp (lang_encoding, "ISOLatin5")) {
m_codec = QTextCodec::codecForName("ISO-8859-5");
} else if (lang_encoding && !strcasecmp (lang_encoding, "JIS83-RKSJ")) {
m_codec = QTextCodec::codecForName("SHIFT-JIS");
} else if (lang_encoding && !strcasecmp (lang_encoding, "MacStandard")) {
m_codec = QTextCodec::codecForName("MACINTOSH");
} else if (lang_encoding && !strcasecmp (lang_encoding, "WindowsANSI")) {
m_codec = QTextCodec::codecForName("WINDOWS-1252");
} else {
// Guess
m_codec = QTextCodec::codecForName(lang_encoding);
}
if (m_codec == 0) {
m_codec = QTextCodec::codecForName("UTF-8");
}
if (m_ppd->manufacturer) {
m_make = m_codec->toUnicode(m_ppd->manufacturer);
}
if (m_ppd->nickname) {
m_makeAndModel = m_codec->toUnicode(m_ppd->nickname);
}
ui->autoConfigurePB->hide();
ppd_attr_t *ppdattr;
if (m_ppd->num_filters == 0 ||
((ppdattr = ppdFindAttr(m_ppd, "cupsCommands", NULL)) != NULL &&
ppdattr->value && strstr(ppdattr->value, "AutoConfigure"))) {
ui->autoConfigurePB->show();
} else {
for (int i = 0; i < m_ppd->num_filters; i ++) {
if (!strncmp(m_ppd->filters[i], "application/vnd.cups-postscript", 31)) {
ui->autoConfigurePB->show();
break;
}
}
}
createGroups();
}
void PrinterOptions::createGroups()
{
int i;
ppd_group_t *group;
// Iterate over the groups
for (i = 0, group = m_ppd->groups;
i < m_ppd->num_groups;
i++, group++) {
// The name of the group
QString name = m_codec->toUnicode(group->name);
// The humman name of the group
QString text = m_codec->toUnicode(group->text);
// The group box were the options will be laid out
QGroupBox *groupBox = new QGroupBox(text, ui->scrollArea);
// Create the form layout to put options in
QFormLayout *gFormLayout = new QFormLayout(groupBox);
gFormLayout->setFormAlignment(Qt::AlignCenter);
groupBox->setLayout(gFormLayout);
ui->verticalLayout->addWidget(groupBox);
int j;
ppd_option_t *option;
// Iterate over the options in the group
for (j = 0, option = group->options;
j < group->num_options;
j++, option++) {
QString oKeyword = m_codec->toUnicode(option->keyword);
QString oText = m_codec->toUnicode(option->text);
QString oDefChoice = m_codec->toUnicode(option->defchoice);
// The python system-config-printer skips this one
// which has the same data as "PageSize", let's hope
// they did the right thing
if (oKeyword == "PageRegion") {
continue;
}
QWidget *optionW = 0;
switch (option->ui) {
case PPD_UI_BOOLEAN:
optionW = pickBoolean(option, oKeyword, ui->scrollAreaWidgetContents);
break;
case PPD_UI_PICKMANY:
optionW = pickMany(option, oKeyword, ui->scrollAreaWidgetContents);
break;
case PPD_UI_PICKONE:
optionW = pickOne(option, oKeyword, ui->scrollAreaWidgetContents);
break;
default:
kWarning() << "Option type not recognized: " << option->ui;
// let's use the most common
optionW = pickOne(option, oKeyword, ui->scrollAreaWidgetContents);
break;
}
if (optionW) {
// insert the option widget
gFormLayout->addRow(oText, optionW);
}
}
}
ui->verticalLayout->addStretch();
}
QWidget* PrinterOptions::pickBoolean(ppd_option_t *option, const QString &keyword, QWidget *parent) const
{
Q_UNUSED(keyword)
QWidget *widget = new QWidget(parent);
QHBoxLayout *layout = new QHBoxLayout(widget);
QButtonGroup *radioGroup = new QButtonGroup(widget);
widget->setLayout(layout);
int i;
ppd_choice_t *choice;
QString defChoice = m_codec->toUnicode(option->defchoice);
// Iterate over the choices in the option
for (i = 0, choice = option->choices;
i < option->num_choices;
++i, ++choice) {
QString choiceName = m_codec->toUnicode(choice->choice);
QString cText = m_codec->toUnicode(choice->text);
QRadioButton *button = new QRadioButton(cText, widget);
button->setChecked(defChoice == choiceName);
button->setProperty("choice", choiceName);
// if we are in looking at a remote printer we can't save it
button->setEnabled(!m_isRemote);
layout->addWidget(button);
radioGroup->addButton(button);
}
// store the default choice
radioGroup->setProperty(DEFAULT_CHOICE, defChoice);
radioGroup->setProperty("Keyword", keyword);
connect(radioGroup, SIGNAL(buttonClicked(QAbstractButton*)),
this, SLOT(radioBtClicked(QAbstractButton*)));
return widget;
}
void PrinterOptions::radioBtClicked(QAbstractButton *button)
{
QObject *radioGroup = sender();
bool isDifferent = radioGroup->property(DEFAULT_CHOICE).toString() != button->property("choice").toString();
if (isDifferent != radioGroup->property("different").toBool()) {
// it's different from the last time so add or remove changes
isDifferent ? m_changes++ : m_changes--;
radioGroup->setProperty("different", isDifferent);
emit changed(m_changes);
}
QString keyword = radioGroup->property("Keyword").toString();
QString choice = button->property("choice").toString();
radioGroup->setProperty("currentChoice", choice);
// TODO warning about conflicts
// ppdMarkOption(m_ppd,
// m_codec->fromUnicode(keyword),
// m_codec->fromUnicode(choice));
// store the new value
if (isDifferent) {
m_customValues[keyword] = radioGroup;
} else {
m_customValues.remove(keyword);
}
}
QWidget* PrinterOptions::pickMany(ppd_option_t *option, const QString &keyword, QWidget *parent) const
{
Q_UNUSED(keyword)
QListView *listView = new QListView(parent);
QStandardItemModel *model = new QStandardItemModel(listView);
listView->setModel(model);
listView->setItemDelegate(new NoSelectionRectDelegate(listView));
int i;
ppd_choice_t *choice;
QString oDefChoice = m_codec->toUnicode(option->defchoice);
// Iterate over the choices in the option
for (i = 0, choice = option->choices;
i < option->num_choices;
++i, ++choice) {
QString cName = m_codec->toUnicode(choice->choice);
QString cText = m_codec->toUnicode(choice->text);
QStandardItem *item = new QStandardItem(cText);
item->setData(cName);
item->setCheckable(true);
item->setEditable(false);
// TODO there is only ONE default choice, what about the other
// Items selected?!
item->setCheckState(oDefChoice == cName ? Qt::Checked : Qt::Unchecked);
model->appendRow(item);
}
// if we are in looking at a remote printer we can't save it
listView->setEnabled(!m_isRemote);
return qobject_cast<QWidget*>(listView);
}
QWidget* PrinterOptions::pickOne(ppd_option_t *option, const QString &keyword, QWidget *parent) const
{
int i;
ppd_choice_t *choice;
QString defChoice = m_codec->toUnicode(option->defchoice);
KComboBox *comboBox = new KComboBox(parent);
// Iterate over the choices in the option
for (i = 0, choice = option->choices;
i < option->num_choices;
++i, ++choice) {
QString cName = m_codec->toUnicode(choice->choice);
QString cText = m_codec->toUnicode(choice->text);
comboBox->addItem(cText, cName);
}
// store the default choice
comboBox->setProperty(DEFAULT_CHOICE, defChoice);
comboBox->setProperty("Keyword", keyword);
comboBox->setCurrentIndex(comboBox->findData(defChoice));
// connect the signal AFTER setCurrentIndex is called
connect(comboBox, SIGNAL(currentIndexChanged(int)),
this, SLOT(currentIndexChangedCB(int)));
// if we are in looking at a remote printer we can't save it
comboBox->setEnabled(!m_isRemote);
return qobject_cast<QWidget*>(comboBox);
}
void PrinterOptions::currentIndexChangedCB(int index)
{
KComboBox *comboBox = qobject_cast<KComboBox*>(sender());
bool isDifferent = comboBox->property(DEFAULT_CHOICE).toString() != comboBox->itemData(index).toString();
if (isDifferent != comboBox->property("different").toBool()) {
// it's different from the last time so add or remove changes
isDifferent ? m_changes++ : m_changes--;
comboBox->setProperty("different", isDifferent);
emit changed(m_changes);
}
QString keyword = comboBox->property("Keyword").toString();
QString value = comboBox->itemData(index).toString();
comboBox->setProperty("currentChoice", value);
// TODO warning about conflicts
// ppdMarkOption(m_ppd,
// m_codec->fromUnicode(keyword),
// m_codec->fromUnicode(value));
// store the new value
if (isDifferent) {
m_customValues[keyword] = qobject_cast<QObject*>(comboBox);
} else {
m_customValues.remove(keyword);
}
}
PrinterOptions::~PrinterOptions()
{
if (m_ppd != NULL) {
ppdClose(m_ppd);
}
if (!m_filename.isNull()) {
unlink(m_filename.toUtf8());
}
delete ui;
}
const char * /* O - Value of variable */
PrinterOptions::getVariable(const char *name) const /* I - Name of variable */
{
QString keyword = m_codec->toUnicode(name);
if (m_customValues.contains(keyword)) {
QString value = m_customValues[keyword]->property("currentChoice").toString();
return m_codec->fromUnicode(value);
} else {
return NULL;
}
}
/*
* 'get_points()' - Get a value in points.
*/
double /* O - Number in points */
PrinterOptions::get_points(double number, /* I - Original number */
const char *uval) /* I - Units */
{
if (!strcmp(uval, "mm")) /* Millimeters */
return (number * 72.0 / 25.4);
else if (!strcmp(uval, "cm")) /* Centimeters */
return (number * 72.0 / 2.54);
else if (!strcmp(uval, "in")) /* Inches */
return (number * 72.0);
else if (!strcmp(uval, "ft")) /* Feet */
return (number * 72.0 * 12.0);
else if (!strcmp(uval, "m")) /* Meters */
return (number * 72.0 / 0.0254);
else /* Points */
return (number);
}
/*
* 'get_option_value()' - Return the value of an option.
*
* This function also handles generation of custom option values.
*/
char * /* O - Value string or NULL on error */
PrinterOptions::get_option_value(
ppd_file_t *ppd, /* I - PPD file */
const char *name, /* I - Option name */
char *buffer, /* I - String buffer */
size_t bufsize) const /* I - Size of buffer */
{
char *bufptr, /* Pointer into buffer */
*bufend; /* End of buffer */
ppd_coption_t *coption; /* Custom option */
ppd_cparam_t *cparam; /* Current custom parameter */
char keyword[256]; /* Parameter name */
const char *val, /* Parameter value */
*uval; /* Units value */
long integer; /* Integer value */
double number, /* Number value */
number_points; /* Number in points */
/*
* See if we have a custom option choice...
*/
if ((val = getVariable(name)) == NULL) {
/*
* Option not found!
*/
return (NULL);
} else if (strcasecmp(val, "Custom") ||
(coption = ppdFindCustomOption(ppd, name)) == NULL) {
/*
* Not a custom choice...
*/
qstrncpy(buffer, val, bufsize);
return (buffer);
}
/*
* OK, we have a custom option choice, format it...
*/
*buffer = '\0';
if (!strcmp(coption->keyword, "PageSize")) {
const char *lval; /* Length string value */
double width, /* Width value */
width_points, /* Width in points */
length, /* Length value */
length_points; /* Length in points */
val = getVariable("PageSize.Width");
lval = getVariable("PageSize.Height");
uval = getVariable("PageSize.Units");
if (!val || !lval || !uval ||
(width = strtod(val, NULL)) == 0.0 ||
(length = strtod(lval, NULL)) == 0.0 ||
(strcmp(uval, "pt") && strcmp(uval, "in") && strcmp(uval, "ft") &&
strcmp(uval, "cm") && strcmp(uval, "mm") && strcmp(uval, "m"))) {
return (NULL);
}
width_points = get_points(width, uval);
length_points = get_points(length, uval);
if (width_points < ppd->custom_min[0] ||
width_points > ppd->custom_max[0] ||
length_points < ppd->custom_min[1] ||
length_points > ppd->custom_max[1]) {
return (NULL);
}
snprintf(buffer, bufsize, "Custom.%gx%g%s", width, length, uval);
} else if (cupsArrayCount(coption->params) == 1) {
cparam = ppdFirstCustomParam(coption);
snprintf(keyword, sizeof(keyword), "%s.%s", coption->keyword, cparam->name);
if ((val = getVariable(keyword)) == NULL)
return (NULL);
switch (cparam->type) {
case PPD_CUSTOM_CURVE :
case PPD_CUSTOM_INVCURVE :
case PPD_CUSTOM_REAL :
if ((number = strtod(val, NULL)) == 0.0 ||
number < cparam->minimum.custom_real ||
number > cparam->maximum.custom_real)
return (NULL);
snprintf(buffer, bufsize, "Custom.%g", number);
break;
case PPD_CUSTOM_INT :
if (!*val || (integer = strtol(val, NULL, 10)) == LONG_MIN ||
integer == LONG_MAX ||
integer < cparam->minimum.custom_int ||
integer > cparam->maximum.custom_int)
return (NULL);
snprintf(buffer, bufsize, "Custom.%ld", integer);
break;
case PPD_CUSTOM_POINTS :
snprintf(keyword, sizeof(keyword), "%s.Units", coption->keyword);
if ((number = strtod(val, NULL)) == 0.0 ||
(uval = getVariable(keyword)) == NULL ||
(strcmp(uval, "pt") && strcmp(uval, "in") && strcmp(uval, "ft") &&
strcmp(uval, "cm") && strcmp(uval, "mm") && strcmp(uval, "m")))
return (NULL);
number_points = get_points(number, uval);
if (number_points < cparam->minimum.custom_points ||
number_points > cparam->maximum.custom_points)
return (NULL);
snprintf(buffer, bufsize, "Custom.%g%s", number, uval);
break;
case PPD_CUSTOM_PASSCODE :
for (uval = val; *uval; ++uval) {
if (!isdigit(*uval & 255)) {
return (NULL);
}
}
case PPD_CUSTOM_PASSWORD :
case PPD_CUSTOM_STRING :
integer = (long)strlen(val);
if (integer < cparam->minimum.custom_string ||
integer > cparam->maximum.custom_string) {
return (NULL);
}
snprintf(buffer, bufsize, "Custom.%s", val);
break;
}
} else {
const char *prefix = "{"; /* Prefix string */
bufptr = buffer;
bufend = buffer + bufsize;
for (cparam = ppdFirstCustomParam(coption);
cparam;
cparam = ppdNextCustomParam(coption)) {
snprintf(keyword, sizeof(keyword), "%s.%s", coption->keyword,
cparam->name);
if ((val = getVariable(keyword)) == NULL) {
return (NULL);
}
snprintf(bufptr, bufend - bufptr, "%s%s=", prefix, cparam->name);
bufptr += strlen(bufptr);
prefix = " ";
switch (cparam->type) {
case PPD_CUSTOM_CURVE :
case PPD_CUSTOM_INVCURVE :
case PPD_CUSTOM_REAL :
if ((number = strtod(val, NULL)) == 0.0 ||
number < cparam->minimum.custom_real ||
number > cparam->maximum.custom_real)
return (NULL);
snprintf(bufptr, bufend - bufptr, "%g", number);
break;
case PPD_CUSTOM_INT :
if (!*val || (integer = strtol(val, NULL, 10)) == LONG_MIN ||
integer == LONG_MAX ||
integer < cparam->minimum.custom_int ||
integer > cparam->maximum.custom_int) {
return (NULL);
}
snprintf(bufptr, bufend - bufptr, "%ld", integer);
break;
case PPD_CUSTOM_POINTS :
snprintf(keyword, sizeof(keyword), "%s.Units", coption->keyword);
if ((number = strtod(val, NULL)) == 0.0 ||
(uval = getVariable(keyword)) == NULL ||
(strcmp(uval, "pt") && strcmp(uval, "in") &&
strcmp(uval, "ft") && strcmp(uval, "cm") &&
strcmp(uval, "mm") && strcmp(uval, "m"))) {
return (NULL);
}
number_points = get_points(number, uval);
if (number_points < cparam->minimum.custom_points ||
number_points > cparam->maximum.custom_points) {
return (NULL);
}
snprintf(bufptr, bufend - bufptr, "%g%s", number, uval);
break;
case PPD_CUSTOM_PASSCODE :
for (uval = val; *uval; uval ++) {
if (!isdigit(*uval & 255)) {
return (NULL);
}
}
case PPD_CUSTOM_PASSWORD :
case PPD_CUSTOM_STRING :
integer = (long)strlen(val);
if (integer < cparam->minimum.custom_string ||
integer > cparam->maximum.custom_string) {
return (NULL);
}
if ((bufptr + 2) > bufend) {
return (NULL);
}
bufend --;
*bufptr++ = '\"';
while (*val && bufptr < bufend) {
if (*val == '\\' || *val == '\"') {
if ((bufptr + 1) >= bufend) {
return (NULL);
}
*bufptr++ = '\\';
}
*bufptr++ = *val++;
}
if (bufptr >= bufend) {
return (NULL);
}
*bufptr++ = '\"';
*bufptr = '\0';
bufend ++;
break;
}
bufptr += strlen(bufptr);
}
if (bufptr == buffer || (bufend - bufptr) < 2) {
return (NULL);
}
strcpy(bufptr, "}");
}
return (buffer);
}
void PrinterOptions::save()
{
char tempfile[1024];
const char *var;
cups_file_t *in, /* Input file */
*out; /* Output file */
char line[1024], /* Line from PPD file */
value[1024], /* Option value */
keyword[1024], /* Keyword from Default line */
*keyptr; /* Pointer into keyword... */
// copy cups-1.4.2/cgi-bin line 3779
if (!m_filename.isNull()) {
out = cupsTempFile2(tempfile, sizeof(tempfile));
in = cupsFileOpen(m_filename.toUtf8(), "r");
if (!in || !out)
{
if (in) {
cupsFileClose(in);
}
if (out) {
cupsFileClose(out);
unlink(tempfile);
}
// TODO add a KMessageBox::error
return;
}
while (cupsFileGets(in, line, sizeof(line))) {
if (!strncmp(line, "*cupsProtocol:", 14)) {
continue;
} else if (strncmp(line, "*Default", 8)) {
cupsFilePrintf(out, "%s\n", line);
} else {
/*
* Get default option name...
*/
qstrncpy(keyword, line + 8, sizeof(keyword));
for (keyptr = keyword; *keyptr; keyptr ++) {
if (*keyptr == ':' || isspace(*keyptr & 255)) {
break;
}
}
*keyptr = '\0';
if (!strcmp(keyword, "PageRegion") ||
!strcmp(keyword, "PaperDimension") ||
!strcmp(keyword, "ImageableArea")) {
var = get_option_value(m_ppd, "PageSize", value, sizeof(value));
} else {
var = get_option_value(m_ppd, keyword, value, sizeof(value));
}
if (!var) {
cupsFilePrintf(out, "%s\n", line);
} else {
cupsFilePrintf(out, "*Default%s: %s\n", keyword, var);
}
}
}
cupsFileClose(in);
cupsFileClose(out);
}
QVariantHash values; // we need null values
QPointer<KCupsRequest> request = new KCupsRequest;
if (m_isClass) {
request->addOrModifyClass(m_destName, values);
} else {
request->addOrModifyPrinter(m_destName, values, tempfile);
}
// Disable the widget till the request is processed
// Otherwise the user might change something in the ui
// which won't be saved but the apply but when the request
// finishes we will set the current options as default
setEnabled(false);
request->waitTillFinished();
// unlink the file
unlink(tempfile);
if (request) {
setEnabled(true);
if (!request->hasError()) {
// if we succefully save the new ppd we need now to
// clear our changes
QHash<QString, QObject*>::const_iterator i = m_customValues.constBegin();
while (i != m_customValues.constEnd()) {
QString currentChoice;
currentChoice = i.value()->property("currentChoice").toString();
// Store the current choice as the default one
i.value()->setProperty(DEFAULT_CHOICE, currentChoice);
i.value()->setProperty("currentChoice", QVariant());
i.value()->setProperty("different", false);
++i;
}
m_changes = 0;
m_customValues.clear();
emit changed(false);
}
request->deleteLater();
}
}
bool PrinterOptions::hasChanges()
{
return m_changes;
}
QString PrinterOptions::currentMake() const
{
return m_make;
}
QString PrinterOptions::currentMakeAndModel() const
{
return m_makeAndModel;
}
#include "moc_PrinterOptions.cpp"

View file

@ -1,77 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef PRINTER_OPTIONS_H
#define PRINTER_OPTIONS_H
#include "PrinterPage.h"
#include <cups/ppd.h>
#include <QTextCodec>
#include <QAbstractButton>
#include <QHash>
QT_BEGIN_NAMESPACE
class Ui_PrinterOptions;
QT_END_NAMESPACE
class PrinterOptions : public PrinterPage
{
Q_OBJECT
public:
explicit PrinterOptions(const QString &destName, bool isClass, bool isRemote, QWidget *parent = 0);
~PrinterOptions();
bool hasChanges();
QString currentMake() const;
QString currentMakeAndModel() const;
void reloadPPD();
void save();
private slots:
void on_autoConfigurePB_clicked();
void currentIndexChangedCB(int index);
void radioBtClicked(QAbstractButton *button);
private:
QWidget* pickBoolean(ppd_option_t *option, const QString &keyword, QWidget *parent) const;
QWidget* pickMany(ppd_option_t *option, const QString &keyword, QWidget *parent) const;
QWidget* pickOne(ppd_option_t *option, const QString &keyword, QWidget *parent) const;
const char* getVariable(const char *name) const;
char * get_option_value(ppd_file_t *ppd, const char *name, char *buffer, size_t bufsize) const;
static double get_points(double number, const char *uval);
void createGroups();
Ui_PrinterOptions *ui;
QString m_destName;
bool m_isClass;
bool m_isRemote;
QString m_filename;
ppd_file_t *m_ppd;
int m_changes;
QTextCodec *m_codec;
QHash<QString, QObject*> m_customValues;
QString m_make, m_makeAndModel;
};
#endif

View file

@ -1,69 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>PrinterOptions</class>
<widget class="QWidget" name="PrinterOptions">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>484</width>
<height>427</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="margin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="KPushButton" name="autoConfigurePB">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Query Printer for Default Options</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QScrollArea" name="scrollArea">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<property name="alignment">
<set>Qt::AlignHCenter|Qt::AlignTop</set>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>484</width>
<height>401</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QVBoxLayout" name="verticalLayout"/>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KPushButton</class>
<extends>QPushButton</extends>
<header>kpushbutton.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View file

@ -1,38 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "PrinterPage.h"
#include <QHash>
#include <QVariant>
PrinterPage::PrinterPage(QWidget *parent)
: QWidget(parent)
{
}
QVariantHash PrinterPage::modifiedValues() const
{
return QVariantHash();
}
void PrinterPage::setRemote(bool)
{
}

View file

@ -1,44 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef PRINTER_PAGE_H
#define PRINTER_PAGE_H
#include <QWidget>
#include <KCupsPrinter.h>
class PrinterPage : public QWidget
{
Q_OBJECT
public:
explicit PrinterPage(QWidget *parent = 0);
virtual bool hasChanges() { return false; }
public:
virtual void save() {}
virtual QVariantHash modifiedValues() const;
virtual QStringList neededValues() const { return QStringList(); }
virtual void setRemote(bool remote);
signals:
void changed(bool hasChanges);
};
#endif

View file

@ -1,56 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "ConfigurePrinter.h"
#include <config.h>
#include <KDebug>
#include <KLocale>
#include <KAboutData>
#include <KCmdLineArgs>
int main(int argc, char **argv)
{
KAboutData about("ConfigurePrinter",
"print-manager",
ki18n("ConfigurePrinter"),
PM_VERSION,
ki18n("ConfigurePrinter"),
KAboutData::License_GPL,
ki18n("(C) 2010-2013 Daniel Nicoletti"));
about.addAuthor(ki18n("Daniel Nicoletti"), KLocalizedString(), "dantti12@gmail.com");
KCmdLineArgs::init(argc, argv, &about);
KCmdLineOptions options;
options.add("configure-printer [printer name]", ki18n("Configure printer"));
KCmdLineArgs::addCmdLineOptions(options);
ConfigurePrinter::addCmdLineOptions();
if (!ConfigurePrinter::start()) {
//kDebug() << "ConfigurePrinter is already running!";
return 0;
}
ConfigurePrinter app;
return app.exec();
}

View file

@ -1,3 +0,0 @@
[D-BUS Service]
Name=org.kde.ConfigurePrinter
Exec=@KDE4_LIBEXEC_INSTALL_DIR@/configure-printer

View file

@ -1,8 +0,0 @@
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
<interface name="org.kde.ConfigurePrinter">
<method name="ConfigurePrinter" >
<arg direction="in" type="s" name="printerName" />
</method>
</interface>
</node>

View file

@ -1,13 +0,0 @@
set(printmanager_qml_plugin_SRCS
qmlplugins.cpp
)
add_library(printmanager SHARED ${printmanager_qml_plugin_SRCS})
target_link_libraries(printmanager
${QT_QTDECLARATIVE_LIBRARY}
${KDE4_PLASMA_LIBS}
kcupslib
)
install(TARGETS printmanager DESTINATION ${KDE4_IMPORTS_INSTALL_DIR}/org/kde/printmanager)
install(FILES qmldir DESTINATION ${KDE4_IMPORTS_INSTALL_DIR}/org/kde/printmanager)

View file

@ -1 +0,0 @@
plugin printmanager

View file

@ -1,38 +0,0 @@
/***************************************************************************
* Copyright (C) 2012-2013 by Daniel Nicoletti <dantti12@gmail.com> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
***************************************************************************/
#include "qmlplugins.h"
#include <QtDeclarative/QDeclarativeItem>
#include <PrinterModel.h>
#include <PrinterSortFilterModel.h>
#include <JobModel.h>
#include <JobSortFilterModel.h>
void QmlPlugins::registerTypes(const char* uri)
{
Q_ASSERT(uri == QLatin1String("org.kde.printmanager"));
qmlRegisterType<PrinterModel>(uri, 0, 1, "PrinterModel");
qmlRegisterType<PrinterSortFilterModel>(uri, 0, 1, "PrinterSortFilterModel");
qmlRegisterType<JobModel>(uri, 0, 1, "JobModel");
qmlRegisterType<JobSortFilterModel>(uri, 0, 1, "JobSortFilterModel");
}
Q_EXPORT_PLUGIN2(printmanager, QmlPlugins)

View file

@ -1,31 +0,0 @@
/***************************************************************************
* Copyright (C) 2012-2013 by Daniel Nicoletti <dantti12@gmail.com> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
***************************************************************************/
#ifndef PRINT_MANAGER_PLUGINS_H
#define PRINT_MANAGER_PLUGINS_H
#include <QtDeclarative/QDeclarativeExtensionPlugin>
class QmlPlugins : public QDeclarativeExtensionPlugin
{
public:
virtual void registerTypes(const char * uri);
};
#endif // PRINT_MANAGER_PLUGINS_H

View file

@ -1,26 +0,0 @@
set(libkcups_SRCS
KIppRequest.cpp
KCupsPasswordDialog.cpp
KCupsConnection.cpp
KCupsJob.cpp
KCupsPrinter.cpp
KCupsServer.cpp
KCupsRequest.cpp
ClassListWidget.cpp
PPDModel.cpp
SelectMakeModel.cpp
NoSelectionRectDelegate.cpp
PrinterModel.cpp
PrinterSortFilterModel.cpp
JobModel.cpp
JobSortFilterModel.cpp
SelectMakeModel.ui
)
add_library(kcupslib SHARED ${libkcups_SRCS})
target_link_libraries(kcupslib
${KDE4_KIO_LIBS}
${CUPS_LIBRARIES}
)
install(TARGETS kcupslib ${INSTALL_TARGETS_DEFAULT_ARGS})

View file

@ -1,189 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "ClassListWidget.h"
#include "SelectMakeModel.h"
#include "KCupsRequest.h"
#include "NoSelectionRectDelegate.h"
#include <QPointer>
#include <KFileDialog>
#include <KDebug>
#include <KPixmapSequence>
#include <KConfigDialogManager>
ClassListWidget::ClassListWidget(QWidget *parent) :
QListView(parent),
m_request(0),
m_showClasses(false)
{
KConfigDialogManager::changedMap()->insert("ClassListWidget", SIGNAL(changed(QString)));
m_model = new QStandardItemModel(this);
setModel(m_model);
setItemDelegate(new NoSelectionRectDelegate(this));
// Setup the busy cursor
m_busySeq = new KPixmapSequenceOverlayPainter(this);
m_busySeq->setSequence(KPixmapSequence("process-working", KIconLoader::SizeSmallMedium));
m_busySeq->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
m_busySeq->setWidget(viewport());
connect(m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
this, SLOT(modelChanged()));
m_delayedInit.setInterval(0);
m_delayedInit.setSingleShot(true);
connect(&m_delayedInit, SIGNAL(timeout()), SLOT(init()));
m_delayedInit.start();
}
ClassListWidget::~ClassListWidget()
{
}
void ClassListWidget::init()
{
m_busySeq->start(); // Start spining
m_model->clear();
QStringList att;
att << KCUPS_PRINTER_NAME;
att << KCUPS_PRINTER_URI_SUPPORTED;
// Get destinations with these masks
m_request = new KCupsRequest;
connect(m_request, SIGNAL(finished()), this, SLOT(loadFinished()));
if (m_showClasses) {
m_request->getPrinters(att);
} else {
m_request->getPrinters(att,
CUPS_PRINTER_CLASS | CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT);
}
}
void ClassListWidget::loadFinished()
{
// If we have an old request running discard it's result and get a new one
if (m_request != sender()) {
sender()->deleteLater();
return;
}
m_busySeq->stop(); // Stop spining
KCupsPrinters printers = m_request->printers();
m_request->deleteLater();
m_request = 0;
foreach (const KCupsPrinter &printer, printers) {
QString destName = printer.name();
if (destName != m_printerName) {
QStandardItem *item = new QStandardItem;
item->setText(destName);
item->setCheckable(true);
item->setEditable(false);
item->setData(printer.uriSupported());
updateItemState(item);
m_model->appendRow(item);
}
}
modelChanged();
}
void ClassListWidget::modelChanged()
{
QStringList currentMembers = currentSelected(false);
m_changed = m_selectedPrinters != currentMembers;
emit changed(selectedPrinters());
emit changed(m_changed);
}
QStringList ClassListWidget::currentSelected(bool uri) const
{
QStringList currentMembers;
for (int i = 0; i < m_model->rowCount(); i++) {
QStandardItem *item = m_model->item(i);
if (item && item->checkState() == Qt::Checked) {
if (uri) {
currentMembers << item->data().toString();
} else {
currentMembers << item->text();
}
}
}
currentMembers.sort();
return currentMembers;
}
void ClassListWidget::updateItemState(QStandardItem *item) const
{
if (m_selectedPrinters.contains(item->text())) {
item->setCheckState(Qt::Checked);
} else {
item->setCheckState(Qt::Unchecked);
}
}
bool ClassListWidget::hasChanges()
{
return m_changed;
}
void ClassListWidget::setPrinter(const QString &printer)
{
if (m_printerName != printer) {
m_printerName = printer;
m_delayedInit.start();
}
}
QString ClassListWidget::selectedPrinters() const
{
return currentSelected(false).join(QLatin1String("|"));
}
void ClassListWidget::setSelectedPrinters(const QString &selected)
{
m_selectedPrinters = selected.split(QLatin1Char('|'));
m_selectedPrinters.sort();
m_delayedInit.start();
}
bool ClassListWidget::showClasses() const
{
return m_showClasses;
}
void ClassListWidget::setShowClasses(bool enable)
{
if (m_showClasses != enable) {
m_showClasses = enable;
m_delayedInit.start();
}
}
#include "moc_ClassListWidget.cpp"

View file

@ -1,71 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef CLASS_LIST_WIDGET_H
#define CLASS_LIST_WIDGET_H
#include <QStandardItemModel>
#include <QListView>
#include <QTimer>
#include <KPixmapSequenceOverlayPainter>
#include <kdemacros.h>
class KCupsRequest;
class KDE_EXPORT ClassListWidget : public QListView
{
Q_OBJECT
Q_PROPERTY(QString selectedPrinters READ selectedPrinters WRITE setSelectedPrinters USER true)
Q_PROPERTY(bool showClasses READ showClasses WRITE setShowClasses)
public:
explicit ClassListWidget(QWidget *parent = 0);
~ClassListWidget();
bool hasChanges();
void setPrinter(const QString &printer);
QString selectedPrinters() const;
void setSelectedPrinters(const QString &selected);
bool showClasses() const;
void setShowClasses(bool enable);
QStringList currentSelected(bool uri) const;
signals:
void changed(bool changed);
void changed(const QString &selected);
private slots:
void init();
void loadFinished();
void modelChanged();
private:
void updateItemState(QStandardItem *item) const;
QString m_printerName;
QStringList m_selectedPrinters;
KPixmapSequenceOverlayPainter *m_busySeq;
KCupsRequest *m_request;
bool m_changed;
bool m_showClasses;
QStandardItemModel *m_model;
QTimer m_delayedInit;
};
#endif

View file

@ -1,652 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "JobModel.h"
#include <KCupsRequest.h>
#include <KCupsPrinter.h>
#include <KCupsJob.h>
#include <QDateTime>
#include <QMimeData>
#include <QPointer>
#include <KUser>
#include <KDebug>
#include <KLocale>
#include <KMessageBox>
JobModel::JobModel(QObject *parent) :
QStandardItemModel(parent),
m_jobRequest(0),
m_whichjobs(CUPS_WHICHJOBS_ACTIVE),
m_parentId(0)
{
setHorizontalHeaderItem(ColStatus, new QStandardItem(i18n("Status")));
setHorizontalHeaderItem(ColName, new QStandardItem(i18n("Name")));
setHorizontalHeaderItem(ColUser, new QStandardItem(i18n("User")));
setHorizontalHeaderItem(ColCreated, new QStandardItem(i18n("Created")));
setHorizontalHeaderItem(ColCompleted, new QStandardItem(i18n("Completed")));
setHorizontalHeaderItem(ColPages, new QStandardItem(i18n("Pages")));
setHorizontalHeaderItem(ColProcessed, new QStandardItem(i18n("Processed")));
setHorizontalHeaderItem(ColSize, new QStandardItem(i18n("Size")));
setHorizontalHeaderItem(ColStatusMessage, new QStandardItem(i18n("Status Message")));
setHorizontalHeaderItem(ColPrinter, new QStandardItem(i18n("Printer")));
setHorizontalHeaderItem(ColFromHost, new QStandardItem(i18n("From Hostname")));
// Setup the attributes we want from jobs
m_jobAttributes << KCUPS_JOB_ID;
m_jobAttributes << KCUPS_JOB_NAME;
m_jobAttributes << KCUPS_JOB_K_OCTETS;
m_jobAttributes << KCUPS_JOB_K_OCTETS_PROCESSED;
m_jobAttributes << KCUPS_JOB_STATE;
m_jobAttributes << KCUPS_TIME_AT_COMPLETED;
m_jobAttributes << KCUPS_TIME_AT_CREATION;
m_jobAttributes << KCUPS_TIME_AT_PROCESSING;
m_jobAttributes << KCUPS_JOB_PRINTER_URI;
m_jobAttributes << KCUPS_JOB_ORIGINATING_USER_NAME;
m_jobAttributes << KCUPS_JOB_ORIGINATING_HOST_NAME;
m_jobAttributes << KCUPS_JOB_MEDIA_PROGRESS;
m_jobAttributes << KCUPS_JOB_MEDIA_SHEETS;
m_jobAttributes << KCUPS_JOB_MEDIA_SHEETS_COMPLETED;
m_jobAttributes << KCUPS_JOB_PRINTER_STATE_MESSAGE;
m_jobAttributes << KCUPS_JOB_PRESERVED;
QHash<int, QByteArray> roles = roleNames();
roles[RoleJobId] = "jobId";
roles[RoleJobState] = "jobState";
roles[RoleJobName] = "jobName";
roles[RoleJobPages] = "jobPages";
roles[RoleJobSize] = "jobSize";
roles[RoleJobOwner] = "jobOwner";
roles[RoleJobCreatedAt] = "jobCreatedAt";
roles[RoleJobIconName] = "jobIconName";
roles[RoleJobCancelEnabled] = "jobCancelEnabled";
roles[RoleJobHoldEnabled] = "jobHoldEnabled";
roles[RoleJobReleaseEnabled] = "jobReleaseEnabled";
roles[RoleJobRestartEnabled] = "jobRestartEnabled";
roles[RoleJobPrinter] = "jobPrinter";
roles[RoleJobOriginatingHostName] = "jobFrom";
setRoleNames(roles);
// This is emitted when a job change it's state
connect(KCupsConnection::global(),
SIGNAL(jobState(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint)),
this,
SLOT(insertUpdateJob(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint)));
// This is emitted when a job is created
connect(KCupsConnection::global(),
SIGNAL(jobCreated(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint)),
this,
SLOT(insertUpdateJob(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint)));
// This is emitted when a job is stopped
connect(KCupsConnection::global(),
SIGNAL(jobStopped(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint)),
this,
SLOT(insertUpdateJob(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint)));
// This is emitted when a job has it's config changed
connect(KCupsConnection::global(),
SIGNAL(jobConfigChanged(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint)),
this,
SLOT(insertUpdateJob(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint)));
// This is emitted when a job change it's progress
connect(KCupsConnection::global(),
SIGNAL(jobProgress(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint)),
this,
SLOT(insertUpdateJob(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint)));
// This is emitted when a printer is removed
connect(KCupsConnection::global(),
SIGNAL(jobCompleted(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint)),
this,
SLOT(jobCompleted(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint)));
connect(KCupsConnection::global(), SIGNAL(serverAudit(QString)),
SLOT(getJobs()));
connect(KCupsConnection::global(), SIGNAL(serverStarted(QString)),
SLOT(getJobs()));
connect(KCupsConnection::global(), SIGNAL(serverStopped(QString)),
SLOT(getJobs()));
connect(KCupsConnection::global(), SIGNAL(serverRestarted(QString)),
SLOT(getJobs()));
}
void JobModel::setParentWId(WId parentId)
{
m_parentId = parentId;
}
void JobModel::init(const QString &destName)
{
m_destName = destName;
// Get all jobs
getJobs();
}
void JobModel::hold(const QString &printerName, int jobId)
{
QPointer<KCupsRequest> request = new KCupsRequest;
request->holdJob(printerName, jobId);
request->waitTillFinished();
if (request) {
request->deleteLater();
}
}
void JobModel::release(const QString &printerName, int jobId)
{
QPointer<KCupsRequest> request = new KCupsRequest;
request->releaseJob(printerName, jobId);
request->waitTillFinished();
if (request) {
request->deleteLater();
}
}
void JobModel::cancel(const QString &printerName, int jobId)
{
QPointer<KCupsRequest> request = new KCupsRequest;
request->cancelJob(printerName, jobId);
request->waitTillFinished();
if (request) {
request->deleteLater();
}
}
void JobModel::move(const QString &printerName, int jobId, const QString &toPrinterName)
{
QPointer<KCupsRequest> request = new KCupsRequest;
request->moveJob(printerName, jobId, toPrinterName);
request->waitTillFinished();
if (request) {
request->deleteLater();
}
}
void JobModel::getJobs()
{
if (m_jobRequest) {
return;
}
m_jobRequest = new KCupsRequest;
connect(m_jobRequest, SIGNAL(finished()), this, SLOT(getJobFinished()));
m_jobRequest->getJobs(m_destName, false, m_whichjobs, m_jobAttributes);
m_processingJob.clear();
}
void JobModel::getJobFinished()
{
KCupsRequest *request = static_cast<KCupsRequest *>(sender());
if (request) {
if (request->hasError()) {
// clear the model after so that the proper widget can be shown
clear();
} else {
KCupsJobs jobs = request->jobs();
kDebug() << jobs.size();
for (int i = 0; i < jobs.size(); ++i) {
if (jobs.at(i).state() == IPP_JOB_PROCESSING) {
m_processingJob = jobs.at(i).name();
}
// try to find the job row
int job_row = jobRow(jobs.at(i).id());
if (job_row == -1) {
// not found, insert new one
insertJob(i, jobs.at(i));
} else if (job_row == i) {
// update the job
updateJob(i, jobs.at(i));
} else {
// found at wrong position
// take it and insert on the right position
QList<QStandardItem *> row = takeRow(job_row);
insertRow(i, row);
updateJob(i, jobs.at(i));
}
}
// remove old printers
// The above code starts from 0 and make sure
// dest == modelIndex(x) and if it's not the
// case it either inserts or moves it.
// so any item > num_jobs can be safely deleted
while (rowCount() > jobs.size()) {
removeRow(rowCount() - 1);
}
}
request->deleteLater();
} else {
kWarning() << "Should not be called from a non KCupsRequest class" << sender();
}
m_jobRequest = 0;
}
void JobModel::jobCompleted(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs,
uint jobId,
uint jobState,
const QString &jobStateReasons,
const QString &jobName,
uint jobImpressionsCompleted)
{
// REALLY? all these parameters just to say foo was deleted??
Q_UNUSED(text)
Q_UNUSED(printerUri)
Q_UNUSED(printerName)
Q_UNUSED(printerState)
Q_UNUSED(printerStateReasons)
Q_UNUSED(printerIsAcceptingJobs)
Q_UNUSED(jobId)
Q_UNUSED(jobState)
Q_UNUSED(jobStateReasons)
Q_UNUSED(jobName)
Q_UNUSED(jobImpressionsCompleted)
// We grab all jobs again
getJobs();
}
void JobModel::insertUpdateJob(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs,
uint jobId,
uint jobState,
const QString &jobStateReasons,
const QString &jobName,
uint jobImpressionsCompleted)
{
// REALLY? all these parameters just to say foo was created??
Q_UNUSED(text)
Q_UNUSED(printerUri)
Q_UNUSED(printerName)
Q_UNUSED(printerState)
Q_UNUSED(printerStateReasons)
Q_UNUSED(printerIsAcceptingJobs)
Q_UNUSED(jobId)
Q_UNUSED(jobState)
Q_UNUSED(jobStateReasons)
Q_UNUSED(jobName)
Q_UNUSED(jobImpressionsCompleted)
// We grab all jobs again
getJobs();
}
void JobModel::insertJob(int pos, const KCupsJob &job)
{
// insert the first column which has the job state and id
QList<QStandardItem*> row;
ipp_jstate_e jobState = job.state();
QStandardItem *statusItem = new QStandardItem(jobStatus(jobState));
statusItem->setData(jobState, RoleJobState);
statusItem->setData(job.id(), RoleJobId);
statusItem->setData(job.name(), RoleJobName);
statusItem->setData(job.originatingUserName(), RoleJobOwner);
statusItem->setData(job.originatingHostName(), RoleJobOriginatingHostName);
QString size = KGlobal::locale()->formatByteSize(job.size());
statusItem->setData(size, RoleJobSize);
QString createdAt = KGlobal::locale()->formatDateTime(job.createdAt());
statusItem->setData(createdAt, RoleJobCreatedAt);
// TODO move the update code before the insert and reuse some code...
statusItem->setData(KCupsJob::iconName(jobState), RoleJobIconName);
statusItem->setData(KCupsJob::cancelEnabled(jobState), RoleJobCancelEnabled);
statusItem->setData(KCupsJob::holdEnabled(jobState), RoleJobHoldEnabled);
statusItem->setData(KCupsJob::releaseEnabled(jobState), RoleJobReleaseEnabled);
statusItem->setData(job.reprintEnabled(), RoleJobRestartEnabled);
QString pages = QString::number(job.pages());
if (job.processedPages()) {
pages = QString::number(job.processedPages()) + QLatin1Char('/') + QString::number(job.processedPages());
}
if (statusItem->data(RoleJobPages) != pages) {
statusItem->setData(pages, RoleJobPages);
}
row << statusItem;
for (int i = ColName; i < LastColumn; i++) {
// adds all Items to the model
row << new QStandardItem;
}
// insert the whole row
insertRow(pos, row);
// update the items
updateJob(pos, job);
}
void JobModel::updateJob(int pos, const KCupsJob &job)
{
// Job Status & internal dataipp_jstate_e
ipp_jstate_e jobState = job.state();
if (item(pos, ColStatus)->data(RoleJobState).toInt() != jobState) {
item(pos, ColStatus)->setText(jobStatus(jobState));
item(pos, ColStatus)->setData(static_cast<int>(jobState), RoleJobState);
item(pos, ColStatus)->setData(KCupsJob::iconName(jobState), RoleJobIconName);
item(pos, ColStatus)->setData(KCupsJob::cancelEnabled(jobState), RoleJobCancelEnabled);
item(pos, ColStatus)->setData(KCupsJob::holdEnabled(jobState), RoleJobHoldEnabled);
item(pos, ColStatus)->setData(KCupsJob::releaseEnabled(jobState), RoleJobReleaseEnabled);
item(pos, ColStatus)->setData(job.reprintEnabled(), RoleJobRestartEnabled);
}
QString pages = QString::number(job.pages());
if (job.processedPages()) {
pages = QString::number(job.processedPages()) + QLatin1Char('/') + QString::number(job.processedPages());
}
if (item(pos, ColStatus)->data(RoleJobPages) != pages) {
item(pos, ColStatus)->setData(pages, RoleJobPages);
}
// internal dest name & column
QString destName = job.printer();
if (item(pos, ColStatus)->data(RoleJobPrinter).toString() != destName) {
item(pos, ColStatus)->setData(destName, RoleJobPrinter);
// Column job printer Name
item(pos, ColPrinter)->setText(destName);
}
// job name
QString jobName = job.name();
if (item(pos, ColName)->text() != jobName) {
item(pos, ColStatus)->setData(jobName, RoleJobName);
item(pos, ColName)->setText(jobName);
}
// owner of the job
// try to get the full user name
QString userString = job.originatingUserName();
KUser user(userString);
if (user.isValid() && !user.property(KUser::FullName).toString().isEmpty()) {
userString = user.property(KUser::FullName).toString();
}
// user name
if (item(pos, ColUser)->text() != userString) {
item(pos, ColUser)->setText(userString);
}
// when it was created
QDateTime timeAtCreation = job.createdAt();
if (item(pos, ColCreated)->data(Qt::DisplayRole).toDateTime() != timeAtCreation) {
item(pos, ColCreated)->setData(timeAtCreation, Qt::DisplayRole);
}
// when it was completed
QDateTime completedAt = job.completedAt();
if (item(pos, ColCompleted)->data(Qt::DisplayRole).toDateTime() != completedAt) {
if (!completedAt.isNull()) {
item(pos, ColCompleted)->setData(completedAt, Qt::DisplayRole);
} else {
// Clean the data might happen when the job is restarted
item(pos, ColCompleted)->setText(QString());
}
}
// job pages
int completedPages = job.processedPages();
if (item(pos, ColPages)->data(Qt::UserRole) != completedPages) {
item(pos, ColPages)->setData(completedPages, Qt::UserRole);
item(pos, ColPages)->setText(QString::number(completedPages));
}
// when it was precessed
QDateTime timeAtProcessing = job.processedAt();
if (item(pos, ColProcessed)->data(Qt::DisplayRole).toDateTime() != timeAtProcessing) {
if (!timeAtProcessing.isNull()) {
item(pos, ColProcessed)->setData(timeAtProcessing, Qt::DisplayRole);
} else {
// Clean the data might happen when the job is restarted
item(pos, ColCompleted)->setText(QString());
}
}
// job size TODO use kde converter
int jobSize = job.size();
if (item(pos, ColSize)->data(Qt::UserRole) != jobSize) {
item(pos, ColSize)->setData(jobSize, Qt::UserRole);
item(pos, ColSize)->setText(KGlobal::locale()->formatByteSize(jobSize));
}
// job printer state message
QString stateMessage = job.stateMsg();
if (item(pos, ColStatusMessage)->text() != stateMessage) {
item(pos, ColStatusMessage)->setText(stateMessage);
}
// owner of the job
// try to get the full user name
QString originatingHostName = job.originatingHostName();
if (item(pos, ColFromHost)->text() != originatingHostName) {
item(pos, ColFromHost)->setText(originatingHostName);
}
}
QStringList JobModel::mimeTypes() const
{
return QStringList("application/x-cupsjobs");
}
Qt::DropActions JobModel::supportedDropActions() const
{
return Qt::MoveAction;
}
QMimeData* JobModel::mimeData(const QModelIndexList &indexes) const
{
QMimeData *mimeData = new QMimeData();
QByteArray encodedData;
QDataStream stream(&encodedData, QIODevice::WriteOnly);
foreach (const QModelIndex &index, indexes) {
if (index.isValid() && index.column() == 0) {
// serialize the jobId and fromDestName
stream << data(index, RoleJobId).toInt()
<< data(index, RoleJobPrinter).toString()
<< item(index.row(), ColName)->text();
}
}
mimeData->setData("application/x-cupsjobs", encodedData);
return mimeData;
}
bool JobModel::dropMimeData(const QMimeData *data,
Qt::DropAction action,
int row,
int column,
const QModelIndex &parent)
{
Q_UNUSED(row)
Q_UNUSED(column)
Q_UNUSED(parent)
if (action == Qt::IgnoreAction) {
return true;
}
if (!data->hasFormat("application/x-cupsjobs")) {
return false;
}
QByteArray encodedData = data->data("application/x-cupsjobs");
QDataStream stream(&encodedData, QIODevice::ReadOnly);
bool ret = false;
while (!stream.atEnd()) {
QString fromDestName, displayName;
int jobId;
// get the jobid and the from dest name
stream >> jobId >> fromDestName >> displayName;
if (fromDestName == m_destName) {
continue;
}
QPointer<KCupsRequest> request = new KCupsRequest;
request->moveJob(fromDestName, jobId, m_destName);
request->waitTillFinished();
if (request) {
if (request->hasError()) {
// failed to move one job
// we return here to avoid more password tries
KMessageBox::detailedSorryWId(m_parentId,
i18n("Failed to move '%1' to '%2'",
displayName, m_destName),
request->errorMsg(),
i18n("Failed"));
}
request->deleteLater();
ret = !request->hasError();
}
}
return ret;
}
KCupsRequest* JobModel::modifyJob(int row, JobAction action, const QString &newDestName, const QModelIndex &parent)
{
Q_UNUSED(parent)
if (row < 0 || row >= rowCount()) {
kWarning() << "Row number is invalid:" << row;
return 0;
}
QStandardItem *job = item(row, ColStatus);
int jobId = job->data(RoleJobId).toInt();
QString destName = job->data(RoleJobPrinter).toString();
// ignore some jobs
ipp_jstate_t state = static_cast<ipp_jstate_t>(job->data(RoleJobState).toInt());
if ((state == IPP_JOB_HELD && action == Hold) ||
(state == IPP_JOB_CANCELED && action == Cancel) ||
(state != IPP_JOB_HELD && action == Release)) {
return 0;
}
KCupsRequest *request = new KCupsRequest;
switch (action) {
case Cancel:
request->cancelJob(destName, jobId);
break;
case Hold:
request->holdJob(destName, jobId);
break;
case Release:
request->releaseJob(destName, jobId);
break;
case Reprint:
request->restartJob(destName, jobId);
break;
case Move:
request->moveJob(destName, jobId, newDestName);
break;
default:
kWarning() << "Unknown ACTION called!!!" << action;
return 0;
}
return request;
}
int JobModel::jobRow(int jobId)
{
// find the position of the jobId inside the model
for (int i = 0; i < rowCount(); i++) {
if (jobId == item(i)->data(RoleJobId).toInt())
{
return i;
}
}
// -1 if not found
return -1;
}
QString JobModel::jobStatus(ipp_jstate_e job_state)
{
switch (job_state)
{
case IPP_JOB_PENDING : return i18n("Pending");
case IPP_JOB_HELD : return i18n("On hold");
case IPP_JOB_PROCESSING : return "-";
case IPP_JOB_STOPPED : return i18n("Stopped");
case IPP_JOB_CANCELED : return i18n("Canceled");
case IPP_JOB_ABORTED : return i18n("Aborted");
case IPP_JOB_COMPLETED : return i18n("Completed");
}
return "-";
}
void JobModel::clear()
{
removeRows(0, rowCount());
}
void JobModel::setWhichJobs(WhichJobs whichjobs)
{
switch (whichjobs) {
case WhichActive:
m_whichjobs = CUPS_WHICHJOBS_ACTIVE;
break;
case WhichCompleted:
m_whichjobs = CUPS_WHICHJOBS_COMPLETED;
break;
case WhichAll:
m_whichjobs = CUPS_WHICHJOBS_ALL;
break;
}
getJobs();
}
Qt::ItemFlags JobModel::flags(const QModelIndex &index) const
{
if (index.isValid()) {
ipp_jstate_t state = static_cast<ipp_jstate_t>(item(index.row(), ColStatus)->data(RoleJobState).toInt());
if (state == IPP_JOB_PENDING ||
state == IPP_JOB_PROCESSING) {
return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled;
}
}
return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled;
}
QString JobModel::processingJob() const
{
return m_processingJob;
}
#include "moc_JobModel.cpp"

View file

@ -1,151 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef JOB_MODEL_H
#define JOB_MODEL_H
#include <QStandardItemModel>
#include <cups/cups.h>
#include <kdemacros.h>
class KCupsJob;
class KCupsRequest;
class KDE_EXPORT JobModel : public QStandardItemModel
{
Q_OBJECT
Q_ENUMS(JobAction)
Q_ENUMS(Role)
Q_ENUMS(WhichJobs)
public:
enum Role {
RoleJobId = Qt::UserRole + 2,
RoleJobState,
RoleJobName,
RoleJobPages,
RoleJobSize,
RoleJobOwner,
RoleJobCreatedAt,
RoleJobIconName,
RoleJobCancelEnabled,
RoleJobHoldEnabled,
RoleJobReleaseEnabled,
RoleJobRestartEnabled,
RoleJobPrinter,
RoleJobOriginatingHostName
};
enum JobAction {
Cancel,
Hold,
Release,
Move,
Reprint
};
enum WhichJobs {
WhichAll,
WhichActive,
WhichCompleted
};
enum Columns {
ColStatus = 0,
ColName,
ColUser,
ColCreated,
ColCompleted,
ColPages,
ColProcessed,
ColSize,
ColStatusMessage,
ColPrinter,
ColFromHost,
LastColumn
};
explicit JobModel(QObject *parent = 0);
void setParentWId(WId parentId);
Q_INVOKABLE void init(const QString &destName = QString());
Q_INVOKABLE void hold(const QString &printerName, int jobId);
Q_INVOKABLE void release(const QString &printerName, int jobId);
Q_INVOKABLE void cancel(const QString &printerName, int jobId);
Q_INVOKABLE void move(const QString &printerName, int jobId, const QString &toPrinterName);
QString processingJob() const;
Qt::ItemFlags flags(const QModelIndex &index) const;
QStringList mimeTypes() const;
Qt::DropActions supportedDropActions() const;
QMimeData* mimeData(const QModelIndexList &indexes) const;
bool dropMimeData(const QMimeData *data,
Qt::DropAction action,
int row,
int column,
const QModelIndex &parent);
Q_INVOKABLE void setWhichJobs(WhichJobs whichjobs);
KCupsRequest* modifyJob(int row, JobAction action, const QString &newDestName = QString(), const QModelIndex &parent = QModelIndex());
private slots:
void getJobs();
void getJobFinished();
void jobCompleted(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs,
uint jobId,
uint jobState,
const QString &jobStateReasons,
const QString &jobName,
uint jobImpressionsCompleted);
void insertUpdateJob(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs,
uint jobId,
uint jobState,
const QString &jobStateReasons,
const QString &jobName,
uint jobImpressionsCompleted);
private:
int jobRow(int jobId);
void insertJob(int pos, const KCupsJob &job);
void updateJob(int pos, const KCupsJob &job);
QString jobStatus(ipp_jstate_e job_state);
void clear();
KCupsRequest *m_jobRequest;
QString m_destName;
QString m_processingJob;
int m_whichjobs;
WId m_parentId;
QStringList m_jobAttributes;
};
#endif // JOB_MODEL_H

View file

@ -1,132 +0,0 @@
/***************************************************************************
* Copyright (C) 2012-2013 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "JobSortFilterModel.h"
#include "JobModel.h"
#include <KDebug>
JobSortFilterModel::JobSortFilterModel(QObject *parent) :
QSortFilterProxyModel(parent)
{
setDynamicSortFilter(true);
setSortCaseSensitivity(Qt::CaseInsensitive);
sort(0);
connect(this, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
this, SIGNAL(activeCountChanged()));
connect(this, SIGNAL(rowsInserted(QModelIndex,int,int)),
this, SIGNAL(activeCountChanged()));
connect(this, SIGNAL(rowsRemoved(QModelIndex,int,int)),
this, SIGNAL(activeCountChanged()));
connect(this, SIGNAL(modelReset()),
this, SIGNAL(activeCountChanged()));
}
void JobSortFilterModel::setModel(QAbstractItemModel *model)
{
if (model == sourceModel()) {
return;
}
QSortFilterProxyModel::setSourceModel(model);
emit sourceModelChanged(model);
}
void JobSortFilterModel::setFilteredPrinters(const QString &printers)
{
kDebug() << rowCount() << printers << printers.split(QLatin1Char('|'));
if (printers.isEmpty()) {
m_filteredPrinters.clear();
} else {
m_filteredPrinters = printers.split(QLatin1Char('|'));
}
invalidateFilter();
emit filteredPrintersChanged();
}
QString JobSortFilterModel::filteredPrinters() const
{
return m_filteredPrinters.join(QLatin1String("|"));
}
int JobSortFilterModel::activeCount() const
{
int active = 0;
for (int i = 0; i < rowCount(); ++i) {
QModelIndex item = index(i, 0);
if (weightForState(item.data(JobModel::RoleJobState).toInt())) {
++active;
}
}
return active;
}
bool JobSortFilterModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
QModelIndex index = sourceModel()->index(source_row, 0, source_parent);
// check if the printer is on the blacklist
if (!m_filteredPrinters.isEmpty()) {
return m_filteredPrinters.contains(index.data(JobModel::RoleJobPrinter).toString());
}
return true;
}
bool JobSortFilterModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
if (left.column() == 0) {
int leftWeight = weightForState(left.data(JobModel::RoleJobState).toInt());
int rightWeight = weightForState(right.data(JobModel::RoleJobState).toInt());
if (leftWeight != rightWeight) {
return leftWeight > rightWeight;
} else {
int leftId = left.data(JobModel::RoleJobId).toInt();
int rightId = right.data(JobModel::RoleJobId).toInt();
if (leftWeight) {
return leftId < rightId;
}
return leftId > rightId;
}
}
return QSortFilterProxyModel::lessThan(left, right);
}
int JobSortFilterModel::weightForState(int state) const
{
switch (state) {
case IPP_JOB_PROCESSING:
return 3;
break;
case IPP_JOB_PENDING:
return 2;
break;
case IPP_JOB_HELD:
return 1;
break;
default:
return 0;
break;
}
}

View file

@ -1,58 +0,0 @@
/***************************************************************************
* Copyright (C) 2012-2013 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef JOB_SORT_FILTER_MODEL_H
#define JOB_SORT_FILTER_MODEL_H
#include <QSortFilterProxyModel>
#include <QDeclarativeItem>
#include <kdemacros.h>
class KDE_EXPORT JobSortFilterModel : public QSortFilterProxyModel
{
Q_OBJECT
Q_PROPERTY(QString filteredPrinters READ filteredPrinters WRITE setFilteredPrinters NOTIFY filteredPrintersChanged)
Q_PROPERTY(QAbstractItemModel *sourceModel READ sourceModel WRITE setModel NOTIFY sourceModelChanged)
Q_PROPERTY(int activeCount READ activeCount NOTIFY activeCountChanged)
public:
explicit JobSortFilterModel(QObject *parent = 0);
void setModel(QAbstractItemModel *model);
void setFilteredPrinters(const QString &printers);
QString filteredPrinters() const;
int activeCount() const;
signals:
void activeCountChanged();
void sourceModelChanged(QObject *);
void filteredPrintersChanged();
private:
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
bool lessThan(const QModelIndex &left, const QModelIndex &right) const;
int weightForState(int state) const;
QStringList m_filteredPrinters;
};
#endif // JOB_SORT_FILTER_MODEL_H

View file

@ -1,877 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* Copyright (C) 2012 Harald Sitter <sitter@kde.org> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "KCupsConnection.h"
#include "KCupsPasswordDialog.h"
#include "KIppRequest.h"
#include <config.h>
#include <QCoreApplication>
#include <QDBusConnection>
#include <QByteArray>
#include <KLocale>
#include <KDebug>
#include <cups/cups.h>
#define RENEW_INTERVAL 3500
#define SUBSCRIPTION_DURATION 3600
#define DBUS_SERVER_RESTARTED "server-restarted" // ServerRestarted
#define DBUS_SERVER_STARTED "server-started" // ServerStarted
#define DBUS_SERVER_STOPPED "server-stopped" // ServerStopped
#define DBUS_SERVER_AUDIT "server-audit" // ServerAudit
#define DBUS_PRINTER_RESTARTED "printer-restarted" // PrinterRestarted
#define DBUS_PRINTER_SHUTDOWN "printer-shutdown" // PrinterShutdown
#define DBUS_PRINTER_STOPPED "printer-stopped" // PrinterStopped
#define DBUS_PRINTER_STATE_CHANGED "printer-state-changed" // PrinterStateChanged
#define DBUS_PRINTER_FINISHINGS_CHANGED "printer-finishings-changed" // PrinterFinishingsChanged
#define DBUS_PRINTER_MEDIA_CHANGED "printer-media-changed" // PrinterMediaChanged
#define DBUS_PRINTER_ADDED "printer-added" // PrinterAdded
#define DBUS_PRINTER_DELETED "printer-deleted" // PrinterDeleted
#define DBUS_PRINTER_MODIFIED "printer-modified" // PrinterModified
#define DBUS_JOB_STATE_CHANGED "job-state-changed" // JobState
#define DBUS_JOB_CREATED "job-created" // JobCreated
#define DBUS_JOB_COMPLETED "job-completed" // JobCompleted
#define DBUS_JOB_STOPPED "job-stopped" // JobStopped
#define DBUS_JOB_CONFIG_CHANGED "job-config-changed" // JobConfigChanged
#define DBUS_JOB_PROGRESS "job-progress" // JobProgress
Q_DECLARE_METATYPE(QList<int>)
Q_DECLARE_METATYPE(QList<bool>)
KCupsConnection* KCupsConnection::m_instance = 0;
static int password_retries = 0;
static int internalErrorCount = 0;
const char * password_cb(const char *prompt, http_t *http, const char *method, const char *resource, void *user_data);
KCupsConnection* KCupsConnection::global()
{
if (!m_instance) {
m_instance = new KCupsConnection(qApp);
}
return m_instance;
}
KCupsConnection::KCupsConnection(QObject *parent) :
QThread(parent)
{
init();
}
KCupsConnection::KCupsConnection(const KUrl &server, QObject *parent) :
QThread(parent),
m_serverUrl(server)
{
qRegisterMetaType<KIppRequest>("KIppRequest");
init();
}
KCupsConnection::~KCupsConnection()
{
if (m_instance == this) {
m_instance = 0;
}
m_passwordDialog->deleteLater();
quit();
wait();
delete m_renewTimer;
delete m_subscriptionTimer;
}
void KCupsConnection::setPasswordMainWindow(WId mainwindow)
{
m_passwordDialog->setMainWindow(mainwindow);
}
void KCupsConnection::init()
{
// Creating the dialog before start() will make it run on the gui thread
m_passwordDialog = new KCupsPasswordDialog;
m_subscriptionId = -1;
m_inited = false;
// setup the DBus subscriptions
// Server related signals
// ServerStarted
notifierConnect(QLatin1String("ServerStarted"),
this,
SIGNAL(serverStarted(QString)));
// ServerStopped
notifierConnect(QLatin1String("ServerStopped"),
this,
SIGNAL(serverStopped(QString)));
// ServerRestarted
notifierConnect(QLatin1String("ServerRestarted"),
this,
SIGNAL(serverRestarted(QString)));
// ServerAudit
notifierConnect(QLatin1String("ServerAudit"),
this,
SIGNAL(serverAudit(QString)));
// Printer related signals
// PrinterAdded
notifierConnect(QLatin1String("PrinterAdded"),
this,
SIGNAL(printerAdded(QString,QString,QString,uint,QString,bool)));
// PrinterModified
notifierConnect(QLatin1String("PrinterModified"),
this,
SIGNAL(printerModified(QString,QString,QString,uint,QString,bool)));
// PrinterDeleted
notifierConnect(QLatin1String("PrinterDeleted"),
this,
SIGNAL(printerDeleted(QString,QString,QString,uint,QString,bool)));
// PrinterStateChanged
notifierConnect(QLatin1String("PrinterStateChanged"),
this,
SIGNAL(printerStateChanged(QString,QString,QString,uint,QString,bool)));
// PrinterStopped
notifierConnect(QLatin1String("PrinterStopped"),
this,
SIGNAL(printerStopped(QString,QString,QString,uint,QString,bool)));
// PrinterShutdown
notifierConnect(QLatin1String("PrinterShutdown"),
this,
SIGNAL(printerShutdown(QString,QString,QString,uint,QString,bool)));
// PrinterRestarted
notifierConnect(QLatin1String("PrinterRestarted"),
this,
SIGNAL(printerRestarted(QString,QString,QString,uint,QString,bool)));
// PrinterMediaChanged
notifierConnect(QLatin1String("PrinterMediaChanged"),
this,
SIGNAL(printerMediaChanged(QString,QString,QString,uint,QString,bool)));
// PrinterFinishingsChanged
notifierConnect(QLatin1String("PrinterFinishingsChanged"),
this,
SIGNAL(PrinterFinishingsChanged(QString,QString,QString,uint,QString,bool)));
// Job related signals
// JobState
notifierConnect(QLatin1String("JobState"),
this,
SIGNAL(jobState(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint)));
// JobCreated
notifierConnect(QLatin1String("JobCreated"),
this,
SIGNAL(jobCreated(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint)));
// JobStopped
notifierConnect(QLatin1String("JobStopped"),
this,
SIGNAL(jobStopped(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint)));
// JobConfigChanged
notifierConnect(QLatin1String("JobConfigChanged"),
this,
SIGNAL(jobConfigChanged(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint)));
// JobProgress
notifierConnect(QLatin1String("JobProgress"),
this,
SIGNAL(jobProgress(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint)));
// JobCompleted
notifierConnect(QLatin1String("JobCompleted"),
this,
SIGNAL(jobCompleted(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint)));
// This signal is needed since the cups registration thing
// doesn't emit printerAdded when we add a printer class
// This is emitted when a printer/queue is changed
QDBusConnection::systemBus().connect(QLatin1String(""),
QLatin1String("/com/redhat/PrinterSpooler"),
QLatin1String("com.redhat.PrinterSpooler"),
QLatin1String("PrinterAdded"),
this,
SIGNAL(rhPrinterAdded(QString)));
// This signal is needed since the cups registration thing
// sometimes simple stops working... don't ask me why
// This is emitted when a printer/queue is changed
QDBusConnection::systemBus().connect(QLatin1String(""),
QLatin1String("/com/redhat/PrinterSpooler"),
QLatin1String("com.redhat.PrinterSpooler"),
QLatin1String("QueueChanged"),
this,
SIGNAL(rhQueueChanged(QString)));
// This signal is needed since the cups registration thing
// doesn't emit printerRemoved when we add a printer class
// This is emitted when a printer/queue is changed
QDBusConnection::systemBus().connect(QLatin1String(""),
QLatin1String("/com/redhat/PrinterSpooler"),
QLatin1String("com.redhat.PrinterSpooler"),
QLatin1String("PrinterRemoved"),
this,
SIGNAL(rhPrinterRemoved(QString)));
QDBusConnection::systemBus().connect(QLatin1String(""),
QLatin1String("/com/redhat/PrinterSpooler"),
QLatin1String("com.redhat.PrinterSpooler"),
QLatin1String("JobQueuedLocal"),
this,
SIGNAL(rhJobQueuedLocal(QString,uint,QString)));
QDBusConnection::systemBus().connect(QLatin1String(""),
QLatin1String("/com/redhat/PrinterSpooler"),
QLatin1String("com.redhat.PrinterSpooler"),
QLatin1String("JobStartedLocal"),
this,
SIGNAL(rhJobStartedLocal(QString,uint,QString)));
// Creates the timer that will renew the DBus subscription
m_renewTimer = new QTimer;
m_renewTimer->setInterval(RENEW_INTERVAL*1000);
m_renewTimer->moveToThread(this);
connect(m_renewTimer, SIGNAL(timeout()), this, SLOT(renewDBusSubscription()), Qt::DirectConnection);
// Creates the timer to merge updates on the DBus subscription
m_subscriptionTimer = new QTimer;
m_subscriptionTimer->setInterval(0);
m_subscriptionTimer->setSingleShot(true);
m_subscriptionTimer->moveToThread(this);
connect(m_subscriptionTimer, SIGNAL(timeout()), this, SLOT(updateSubscription()), Qt::DirectConnection);
// Starts this thread
start();
}
void KCupsConnection::run()
{
// Check if we need an special connection
if (!m_serverUrl.isEmpty()) {
if (m_serverUrl.port() < 0) {
// TODO find out if there's a better way of hardcoding
// the CUPS port
m_serverUrl.setPort(631);
}
cupsSetServer(m_serverUrl.authority().toUtf8());
}
// This is dead cool, cups will call the thread_password_cb()
// function when a password set is needed, as we passed the
// password dialog pointer the functions just need to call
// it on a blocking mode.
cupsSetPasswordCB2(password_cb, m_passwordDialog);
m_inited = true;
exec();
// Event loop quit so cancelDBusSubscription()
if (m_subscriptionId != -1) {
cancelDBusSubscription();
}
}
bool KCupsConnection::readyToStart()
{
if (QThread::currentThread() == this) {
password_retries = 0;
internalErrorCount = 0;
return true;
}
return false;
}
ReturnArguments KCupsConnection::request(const KIppRequest &request, ipp_tag_t groupTag) const
{
ReturnArguments ret;
ipp_t *response = NULL;
do {
ippDelete(response);
response = NULL;
response = request.sendIppRequest();
} while (retry(request.resource().toUtf8(), request.operation()));
if (response && groupTag != IPP_TAG_ZERO) {
ret = parseIPPVars(response, groupTag);
}
ippDelete(response);
return ret;
}
int KCupsConnection::renewDBusSubscription(int subscriptionId, int leaseDuration, const QStringList &events)
{
int ret = -1;
ipp_op_t operation;
// check if we have a valid subscription ID
if (subscriptionId >= 0) {
// Add the "notify-events" values to the request
operation = IPP_RENEW_SUBSCRIPTION;
} else {
operation = IPP_CREATE_PRINTER_SUBSCRIPTION;
}
KIppRequest request(operation, "/");
request.addString(IPP_TAG_OPERATION, IPP_TAG_URI,
KCUPS_PRINTER_URI, QLatin1String("/"));
request.addInteger(IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER,
KCUPS_NOTIFY_LEASE_DURATION, leaseDuration);
if (operation == IPP_CREATE_PRINTER_SUBSCRIPTION) {
// Add the "notify-events" values to the request
request.addStringList(IPP_TAG_SUBSCRIPTION, IPP_TAG_KEYWORD,
KCUPS_NOTIFY_EVENTS, events);
request.addString(IPP_TAG_SUBSCRIPTION, IPP_TAG_KEYWORD,
KCUPS_NOTIFY_PULL_METHOD, "ippget");
request.addString(IPP_TAG_SUBSCRIPTION, IPP_TAG_URI,
KCUPS_NOTIFY_RECIPIENT_URI, "dbus://");
} else {
request.addInteger(IPP_TAG_OPERATION, IPP_TAG_INTEGER,
KCUPS_NOTIFY_SUBSCRIPTION_ID, subscriptionId);
}
ipp_t *response = NULL;
do {
// Do the request
response = request.sendIppRequest();
} while (retry("/", operation));
#if !(CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR < 6)
if (response && ippGetStatusCode(response) == IPP_OK) {
#else
if (response && response->request.status.status_code == IPP_OK) {
#endif // !(CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR < 6)
ipp_attribute_t *attr;
if (subscriptionId >= 0) {
// Request was ok, just return the current subscription
ret = subscriptionId;
} else if ((attr = ippFindAttribute(response,
"notify-subscription-id",
IPP_TAG_INTEGER)) == NULL) {
kWarning() << "No notify-subscription-id in response!";
ret = -1;
} else {
#if !(CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR < 6)
ret = ippGetInteger(attr, 0);
}
} else if (subscriptionId >= 0 && response && ippGetStatusCode(response) == IPP_NOT_FOUND) {
kDebug() << "Subscription not found";
// When the subscription is not found try to get a new one
return renewDBusSubscription(-1, leaseDuration, events);
#else
ret = attr->values[0].integer;
}
} else if (subscriptionId >= 0 && response && response->request.status.status_code == IPP_NOT_FOUND) {
kDebug() << "Subscription not found";
// When the subscription is not found try to get a new one
return renewDBusSubscription(-1, leaseDuration, events);
#endif // !(CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR < 6)
} else {
kDebug() << "Request failed" << cupsLastError() << httpGetStatus(CUPS_HTTP_DEFAULT);
// When the server stops/restarts we will have some error so ignore it
ret = subscriptionId;
}
ippDelete(response);
return ret;
}
void KCupsConnection::notifierConnect(const QString &signal, QObject *receiver, const char *slot)
{
QDBusConnection systemBus = QDBusConnection::systemBus();
systemBus.connect(QString(),
QLatin1String("/org/cups/cupsd/Notifier"),
QLatin1String("org.cups.cupsd.Notifier"),
signal,
receiver,
slot);
}
void KCupsConnection::connectNotify(const char *signal)
{
QString event = eventForSignal(signal);
if (!event.isNull()) {
m_connectedEvents << event;
QMetaObject::invokeMethod(m_subscriptionTimer,
"start",
Qt::QueuedConnection);
}
}
void KCupsConnection::disconnectNotify(const char *signal)
{
QString event = eventForSignal(signal);
if (!event.isNull()) {
m_connectedEvents.removeOne(event);
QMetaObject::invokeMethod(m_subscriptionTimer,
"start",
Qt::QueuedConnection);
}
}
QString KCupsConnection::eventForSignal(const char *signal) const
{
// Server signals
if (QLatin1String(signal) == SIGNAL(serverAudit(QString))) {
return DBUS_SERVER_AUDIT;
}
if (QLatin1String(signal) == SIGNAL(serverStarted(QString))) {
return DBUS_SERVER_STARTED;
}
if (QLatin1String(signal) == SIGNAL(serverStopped(QString))) {
return DBUS_SERVER_STOPPED;
}
if (QLatin1String(signal) == SIGNAL(serverRestarted(QString))) {
return DBUS_SERVER_RESTARTED;
}
// Printer signals
if (QLatin1String(signal) == SIGNAL(printerAdded(QString,QString,QString,uint,QString,bool))) {
return DBUS_PRINTER_ADDED;
}
if (QLatin1String(signal) == SIGNAL(printerDeleted(QString,QString,QString,uint,QString,bool))) {
return DBUS_PRINTER_DELETED;
}
if (QLatin1String(signal) == SIGNAL(printerFinishingsChanged(QString,QString,QString,uint,QString,bool))) {
return DBUS_PRINTER_FINISHINGS_CHANGED;
}
if (QLatin1String(signal) == SIGNAL(printerMediaChanged(QString,QString,QString,uint,QString,bool))) {
return DBUS_PRINTER_MEDIA_CHANGED;
}
if (QLatin1String(signal) == SIGNAL(printerModified(QString,QString,QString,uint,QString,bool))) {
return DBUS_PRINTER_MODIFIED;
}
if (QLatin1String(signal) == SIGNAL(printerRestarted(QString,QString,QString,uint,QString,bool))) {
return DBUS_PRINTER_RESTARTED;
}
if (QLatin1String(signal) == SIGNAL(printerShutdown(QString,QString,QString,uint,QString,bool))) {
return DBUS_PRINTER_SHUTDOWN;
}
if (QLatin1String(signal) == SIGNAL(printerStateChanged(QString,QString,QString,uint,QString,bool))) {
return DBUS_PRINTER_STATE_CHANGED;
}
if (QLatin1String(signal) == SIGNAL(printerStopped(QString,QString,QString,uint,QString,bool))) {
return DBUS_PRINTER_STOPPED;
}
// job signals
if (QLatin1String(signal) == SIGNAL(jobCompleted(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint))) {
return DBUS_JOB_COMPLETED;
}
if (QLatin1String(signal) == SIGNAL(jobConfigChanged(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint))) {
return DBUS_JOB_CONFIG_CHANGED;
}
if (QLatin1String(signal) == SIGNAL(jobCreated(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint))) {
return DBUS_JOB_CREATED;
}
if (QLatin1String(signal) == SIGNAL(jobProgress(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint))) {
return DBUS_JOB_PROGRESS;
}
if (QLatin1String(signal) == SIGNAL(jobState(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint))) {
return DBUS_JOB_STATE_CHANGED;
}
if (QLatin1String(signal) == SIGNAL(jobStopped(QString,QString,QString,uint,QString,bool,uint,uint,QString,QString,uint))) {
return DBUS_JOB_STOPPED;
}
// No registered event signal matched
return QString();
}
void KCupsConnection::updateSubscription()
{
// Build the current list
QStringList currentEvents = m_connectedEvents;
currentEvents.sort();
currentEvents.removeDuplicates();
// Check if the requested events are already being asked
if (m_requestedDBusEvents != currentEvents) {
m_requestedDBusEvents = currentEvents;
// If we alread have a subscription lets cancel
// and create a new one
if (m_subscriptionId >= 0) {
cancelDBusSubscription();
}
// Canculates the new events
renewDBusSubscription();
}
}
void KCupsConnection::renewDBusSubscription()
{
// check if we have a valid subscription ID
if (m_subscriptionId >= 0) {
m_subscriptionId = renewDBusSubscription(m_subscriptionId, SUBSCRIPTION_DURATION);
}
// The above request might fail if the subscription was cancelled
if (m_subscriptionId < 0) {
if (m_requestedDBusEvents.isEmpty()) {
m_renewTimer->stop();
} else {
m_subscriptionId = renewDBusSubscription(m_subscriptionId, SUBSCRIPTION_DURATION, m_requestedDBusEvents);
m_renewTimer->start();
}
}
}
void KCupsConnection::cancelDBusSubscription()
{
KIppRequest request(IPP_CANCEL_SUBSCRIPTION, "/");
request.addString(IPP_TAG_OPERATION, IPP_TAG_URI,
KCUPS_PRINTER_URI, "/");
request.addInteger(IPP_TAG_OPERATION, IPP_TAG_INTEGER,
KCUPS_NOTIFY_SUBSCRIPTION_ID, m_subscriptionId);
do {
// Do the request
ippDelete(request.sendIppRequest());
} while (retry(request.resource().toUtf8(), request.operation()));
// Reset the subscription id
m_subscriptionId = -1;
}
ReturnArguments KCupsConnection::parseIPPVars(ipp_t *response, ipp_tag_t group_tag)
{
ipp_attribute_t *attr;
ReturnArguments ret;
#if !(CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR < 6)
QVariantHash destAttributes;
for (attr = ippFirstAttribute(response); attr != NULL; attr = ippNextAttribute(response)) {
// We hit an attribute sepparator
if (ippGetName(attr) == NULL) {
ret << destAttributes;
destAttributes.clear();
continue;
}
// Skip leading attributes until we hit a a group which can be a printer, job...
if (ippGetGroupTag(attr) != group_tag ||
(ippGetValueTag(attr) != IPP_TAG_INTEGER &&
ippGetValueTag(attr) != IPP_TAG_ENUM &&
ippGetValueTag(attr) != IPP_TAG_BOOLEAN &&
ippGetValueTag(attr) != IPP_TAG_TEXT &&
ippGetValueTag(attr) != IPP_TAG_TEXTLANG &&
ippGetValueTag(attr) != IPP_TAG_LANGUAGE &&
ippGetValueTag(attr) != IPP_TAG_NAME &&
ippGetValueTag(attr) != IPP_TAG_NAMELANG &&
ippGetValueTag(attr) != IPP_TAG_KEYWORD &&
ippGetValueTag(attr) != IPP_TAG_RANGE &&
ippGetValueTag(attr) != IPP_TAG_URI)) {
continue;
}
// Add a printer description attribute...
destAttributes[QString::fromUtf8(ippGetName(attr))] = ippAttrToVariant(attr);
}
if (!destAttributes.isEmpty()) {
ret << destAttributes;
}
#else
for (attr = response->attrs; attr != NULL; attr = attr->next) {
/*
* Skip leading attributes until we hit a a group which can be a printer, job...
*/
while (attr && attr->group_tag != group_tag) {
attr = attr->next;
}
if (attr == NULL) {
break;
}
/*
* Pull the needed attributes from this printer...
*/
QVariantHash destAttributes;
for (; attr && attr->group_tag == group_tag; attr = attr->next) {
if (attr->value_tag != IPP_TAG_INTEGER &&
attr->value_tag != IPP_TAG_ENUM &&
attr->value_tag != IPP_TAG_BOOLEAN &&
attr->value_tag != IPP_TAG_TEXT &&
attr->value_tag != IPP_TAG_TEXTLANG &&
attr->value_tag != IPP_TAG_LANGUAGE &&
attr->value_tag != IPP_TAG_NAME &&
attr->value_tag != IPP_TAG_NAMELANG &&
attr->value_tag != IPP_TAG_KEYWORD &&
attr->value_tag != IPP_TAG_RANGE &&
attr->value_tag != IPP_TAG_URI) {
continue;
}
/*
* Add a printer description attribute...
*/
destAttributes[QString::fromUtf8(attr->name)] = ippAttrToVariant(attr);
}
ret << destAttributes;
if (attr == NULL) {
break;
}
}
#endif // !(CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR < 6)
return ret;
}
QVariant KCupsConnection::ippAttrToVariant(ipp_attribute_t *attr)
{
QVariant ret;
#if !(CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR < 6)
switch (ippGetValueTag(attr)) {
case IPP_TAG_INTEGER:
case IPP_TAG_ENUM:
if (ippGetCount(attr) == 1) {
ret = ippGetInteger(attr, 0);
} else {
QList<int> values;
for (int i = 0; i < ippGetCount(attr); ++i) {
values << ippGetInteger(attr, i);
}
ret = qVariantFromValue(values);
}
break;
case IPP_TAG_BOOLEAN:
if (ippGetCount(attr)== 1) {
ret = ippGetBoolean(attr, 0);
} else {
QList<bool> values;
for (int i = 0; i < ippGetCount(attr); ++i) {
values << ippGetBoolean(attr, i);
}
ret = qVariantFromValue(values);
}
break;
case IPP_TAG_RANGE:
{
QVariantList values;
for (int i = 0; i < ippGetCount(attr); ++i) {
int rangeUpper;
values << ippGetRange(attr, i, &rangeUpper);
values << rangeUpper;
}
ret = values;
}
break;
default:
if (ippGetCount(attr)== 1) {
ret = QString::fromUtf8(ippGetString(attr, 0, NULL));
} else {
QStringList values;
for (int i = 0; i < ippGetCount(attr); ++i) {
values << QString::fromUtf8(ippGetString(attr, i, NULL));
}
ret = values;
}
}
#else
switch (attr->value_tag) {
case IPP_TAG_INTEGER:
case IPP_TAG_ENUM:
if (attr->num_values == 1) {
ret = attr->values[0].integer;
} else {
QList<int> values;
for (int i = 0; i < attr->num_values; ++i) {
values << attr->values[i].integer;
}
ret = qVariantFromValue(values);
}
break;
case IPP_TAG_BOOLEAN:
if (attr->num_values == 1) {
ret = static_cast<bool>(attr->values[0].integer);
} else {
QList<bool> values;
for (int i = 0; i < attr->num_values; ++i) {
values << static_cast<bool>(attr->values[i].integer);
}
ret = qVariantFromValue(values);
}
break;
case IPP_TAG_RANGE:
{
QVariantList values;
for (int i = 0; i < attr->num_values; ++i) {
values << attr->values[i].range.lower;
values << attr->values[i].range.upper;
}
ret = values;
}
break;
default:
if (attr->num_values == 1) {
ret = QString::fromUtf8(attr->values[0].string.text);
} else {
QStringList values;
for (int i = 0; i < attr->num_values; ++i) {
values << QString::fromUtf8(attr->values[i].string.text);
}
ret = values;
}
}
#endif // !(CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR < 6)
return ret;
}
bool KCupsConnection::retry(const char *resource, int operation) const
{
ipp_status_t status = cupsLastError();
if (operation != -1) {
kDebug() << ippOpString(static_cast<ipp_op_t>(operation)) << "last error:" << status << cupsLastErrorString();
} else {
kDebug() << operation << "last error:" << status << cupsLastErrorString();
}
// When CUPS process stops our connection
// with it fails and has to be re-established
if (status == IPP_INTERNAL_ERROR) {
// Deleting this connection thread forces it
// to create a new CUPS connection
kWarning() << "IPP_INTERNAL_ERROR: clearing cookies and reconnecting";
// TODO maybe reconnect is enough
// httpClearCookie(CUPS_HTTP_DEFAULT);
// Reconnect to CUPS
if (httpReconnect(CUPS_HTTP_DEFAULT)) {
kWarning() << "Failed to reconnect" << cupsLastErrorString();
// Server might be restarting sleep for a few ms
msleep(500);
}
// Try the request again
return ++internalErrorCount < 3;
}
bool forceAuth = false;
// If our user is forbidden to perform the
// task we try again using the root user
// ONLY if it was the first time
if (status == IPP_FORBIDDEN &&
password_retries == 0) {
// Pretend to be the root user
// Sometimes setting this just works
cupsSetUser("root");
// force authentication
forceAuth = true;
}
if (status == IPP_NOT_AUTHORIZED ||
status == IPP_NOT_AUTHENTICATED) {
if (password_retries > 3 || password_retries == -1) {
// the authentication failed 3 times
// OR the dialog was canceld (-1)
// reset to 0 and quit the do-while loop
password_retries = 0;
return false;
}
// force authentication
forceAuth = true;
}
if (forceAuth) {
// force authentication
kDebug() << "Calling cupsDoAuthentication() password_retries:" << password_retries;
int ret = cupsDoAuthentication(CUPS_HTTP_DEFAULT, "POST", resource);
kDebug() << "Called cupsDoAuthentication(), success:" << (ret == -1 ? true : false);
// If the authentication was succefull
// sometimes just trying to be root works
return ret == -1 ? true : false;
}
// the action was not forbidden
return false;
}
const char * password_cb(const char *prompt, http_t *http, const char *method, const char *resource, void *user_data)
{
Q_UNUSED(prompt)
Q_UNUSED(http)
Q_UNUSED(method)
Q_UNUSED(resource)
if (++password_retries > 3) {
// cancel the authentication
cupsSetUser(NULL);
return NULL;
}
KCupsPasswordDialog *passwordDialog = static_cast<KCupsPasswordDialog *>(user_data);
bool wrongPassword = password_retries > 1;
// This will block this thread until exec is not finished
kDebug() << password_retries;
QMetaObject::invokeMethod(passwordDialog,
"exec",
Qt::BlockingQueuedConnection,
Q_ARG(QString, QString::fromUtf8(cupsUser())),
Q_ARG(bool, wrongPassword));
kDebug() << passwordDialog->accepted();
// The password dialog has just returned check the result
// method that returns QDialog enums
if (passwordDialog->accepted()) {
cupsSetUser(passwordDialog->username().toUtf8());
return passwordDialog->password().toUtf8();
} else {
// the dialog was canceled
password_retries = -1;
cupsSetUser(NULL);
return NULL;
}
}

View file

@ -1,404 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef KCUPSCONNECTION_H
#define KCUPSCONNECTION_H
#include <QThread>
#include <QTimer>
#include <QtCore/qvariant.h>
#include <QStringList>
#include <QWidget>
#include <KUrl>
#include <kdemacros.h>
#include <cups/cups.h>
#define KCUPS_DEVICE_CLASS "device-class"
#define KCUPS_DEVICE_ID "device-id"
#define KCUPS_DEVICE_INFO "device-info"
#define KCUPS_DEVICE_MAKE_AND_MODEL "device-make-and-model"
#define KCUPS_DEVICE_LOCATION "device-location"
#define KCUPS_DEVICE_URI "device-uri"
#define KCUPS_PRINTER_NAME "printer-name"
#define KCUPS_PRINTER_LOCATION "printer-location"
#define KCUPS_PRINTER_INFO "printer-info"
#define KCUPS_PRINTER_URI "printer-uri"
#define KCUPS_PRINTER_MAKE_AND_MODEL "printer-make-and-model"
#define KCUPS_PRINTER_STATE "printer-state"
#define KCUPS_PRINTER_STATE_MESSAGE "printer-state-message"
#define KCUPS_PRINTER_IS_SHARED "printer-is-shared"
#define KCUPS_PRINTER_IS_ACCEPTING_JOBS "printer-is-accepting-jobs"
#define KCUPS_PRINTER_TYPE "printer-type"
#define KCUPS_PRINTER_TYPE_MASK "printer-type-mask"
#define KCUPS_PRINTER_COMMANDS "printer-commands"
#define KCUPS_PRINTER_URI_SUPPORTED "printer-uri-supported"
#define KCUPS_PRINTER_ERROR_POLICY "printer-error-policy"
#define KCUPS_PRINTER_ERROR_POLICY_SUPPORTED "printer-error-policy-supported"
#define KCUPS_PRINTER_OP_POLICY "printer-op-policy"
#define KCUPS_PRINTER_OP_POLICY_SUPPORTED "printer-op-policy-supported"
#define KCUPS_MEMBER_URIS "member-uris"
#define KCUPS_MEMBER_NAMES "member-names"
#define KCUPS_MARKER_CHANGE_TIME "marker-change-time"
#define KCUPS_MARKER_COLORS "marker-colors"
#define KCUPS_MARKER_LEVELS "marker-levels"
#define KCUPS_MARKER_HIGH_LEVELS "marker-high-levels"
#define KCUPS_MARKER_LOW_LEVELS "marker-low-levels"
#define KCUPS_MARKER_NAMES "marker-names"
#define KCUPS_MARKER_TYPES "marker-types"
#define KCUPS_MARKER_MESSAGE "marker-message"
#define KCUPS_JOB_ID "job-id"
#define KCUPS_JOB_NAME "job-name"
#define KCUPS_JOB_K_OCTETS "job-k-octets"
#define KCUPS_JOB_K_OCTETS_PROCESSED "job-k-octets-processed"
#define KCUPS_JOB_PRINTER_URI "job-printer-uri"
#define KCUPS_JOB_PRINTER_STATE_MESSAGE "job-printer-state-message"
#define KCUPS_JOB_ORIGINATING_USER_NAME "job-originating-user-name"
#define KCUPS_JOB_ORIGINATING_HOST_NAME "job-originating-host-name"
#define KCUPS_JOB_MEDIA_PROGRESS "job-media-progress"
#define KCUPS_JOB_MEDIA_SHEETS "job-media-sheets"
#define KCUPS_JOB_MEDIA_SHEETS_COMPLETED "job-media-sheets-completed"
#define KCUPS_JOB_PRESERVED "job-preserved"
#define KCUPS_JOB_STATE "job-state"
#define KCUPS_JOB_SHEETS_DEFAULT "job-sheets-default"
#define KCUPS_JOB_SHEETS_SUPPORTED "job-sheets-supported"
#define KCUPS_JOB_SHEETS_DEFAULT "job-sheets-default"
#define KCUPS_JOB_SHEETS_SUPPORTED "job-sheets-supported"
#define KCUPS_MY_JOBS "my-jobs"
#define KCUPS_WHICH_JOBS "which-jobs"
#define KCUPS_TIME_AT_COMPLETED "time-at-completed"
#define KCUPS_TIME_AT_CREATION "time-at-creation"
#define KCUPS_TIME_AT_PROCESSING "time-at-processing"
#define KCUPS_REQUESTED_ATTRIBUTES "requested-attributes"
#define KCUPS_REQUESTING_USER_NAME "requesting-user-name"
#define KCUPS_REQUESTING_USER_NAME_ALLOWED "requesting-user-name-allowed"
#define KCUPS_REQUESTING_USER_NAME_DENIED "requesting-user-name-denied"
#define KCUPS_PPD_MAKE_AND_MODEL "ppd-make-and-model"
#define KCUPS_NOTIFY_EVENTS "notify-events"
#define KCUPS_NOTIFY_PULL_METHOD "notify-pull-method"
#define KCUPS_NOTIFY_RECIPIENT_URI "notify-recipient-uri"
#define KCUPS_NOTIFY_LEASE_DURATION "notify-lease-duration"
#define KCUPS_NOTIFY_SUBSCRIPTION_ID "notify-subscription-id"
typedef QList<QVariantHash> ReturnArguments;
class KIppRequest;
class KCupsPasswordDialog;
class KDE_EXPORT KCupsConnection : public QThread
{
Q_OBJECT
public:
/**
* This is the main Cups class @author Daniel Nicoletti <dantti12@gmail.com>
*
* By calling KCupsConnection::global() you have access to it.
* Due to cups archtecture, this class has to live on a
* separate thread so we avoid blocking the user interface when
* the cups call blocks.
*
* It is IMPORTANT that we do not create several thread
* for each cups request, doing so is a valid but breaks our
* authentication. We could tho store the user information an
* set the user/password every time it was needed. But I am not
* sure this is safe.
*
* Extending this means either adding methods to the KCupsRequest
* class which will move to this thread and then run.
*/
static KCupsConnection* global();
/**
* @brief KCupsConnection
* @param parent
*
* This is the default constructor that connects to the default server
* If you don't have any special reason for creating a connection
* on your own consider calling global()
*/
explicit KCupsConnection(QObject *parent = 0);
explicit KCupsConnection(const KUrl &server, QObject *parent = 0);
~KCupsConnection();
void setPasswordMainWindow(WId mainwindow);
Q_SIGNALS:
/**
* emitted when "server-started" is registered
*/
void serverStarted(const QString &text);
/**
* emitted when "server-stopped" is registered
*/
void serverStopped(const QString &text);
/**
* emitted when "server-restarted" is registered
*/
void serverRestarted(const QString &text);
/**
* emitted when "server-audit" is registered
*/
void serverAudit(const QString &text);
/**
* emitted when "printer-added" is registered
*/
void printerAdded(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs);
/**
* emitted when "printer-modified" is registered
*/
void printerModified(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs);
/**
* emitted when "printer-deleted" is registered
*/
void printerDeleted(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs);
/**
* emitted when "printer-state-changed" is registered
*/
void printerStateChanged(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs);
/**
* emitted when "printer-stopped" is registered
*/
void printerStopped(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs);
/**
* emitted when "printer-restarted" is registered
*/
void printerRestarted(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs);
/**
* emitted when "printer-shutdown" is registered
*/
void printerShutdown(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs);
/**
* emitted when "printer-media-changed" is registered
*/
void printerMediaChanged(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs);
/**
* emitted when "printer-finishings-changed" is registered
*/
void printerFinishingsChanged(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs);
/**
* emitted when "job-state-changed" is registered
*/
void jobState(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs,
uint jobId,
uint jobState,
const QString &jobStateReasons,
const QString &jobName,
uint jobImpressionsCompleted);
/**
* emitted when "job-created" is registered
*/
void jobCreated(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs,
uint jobId,
uint jobState,
const QString &jobStateReasons,
const QString &jobName,
uint jobImpressionsCompleted);
/**
* emitted when "job-stopped" is registered
*/
void jobStopped(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs,
uint jobId,
uint jobState,
const QString &jobStateReasons,
const QString &jobName,
uint jobImpressionsCompleted);
/**
* emitted when "job-config-changed" is registered
*/
void jobConfigChanged(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs,
uint jobId,
uint jobState,
const QString &jobStateReasons,
const QString &jobName,
uint jobImpressionsCompleted);
/**
* emitted when "job-progress" is registered
*/
void jobProgress(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs,
uint jobId,
uint jobState,
const QString &jobStateReasons,
const QString &jobName,
uint jobImpressionsCompleted);
/**
* emitted when "job-completed" is registered
*/
void jobCompleted(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs,
uint jobId,
uint jobState,
const QString &jobStateReasons,
const QString &jobName,
uint jobImpressionsCompleted);
void rhPrinterAdded(const QString &queueName);
void rhPrinterRemoved(const QString &queueName);
void rhQueueChanged(const QString &queueName);
void rhJobQueuedLocal(const QString &queueName, uint jobId, const QString &jobOwner);
void rhJobStartedLocal(const QString &queueName, uint jobId, const QString &jobOwner);
protected:
friend class KCupsRequest;
virtual void run();
bool readyToStart();
bool retry(const char *resource, int operation) const;
ReturnArguments request(const KIppRequest &request, ipp_tag_t groupTag = IPP_TAG_ZERO) const;
private slots:
void updateSubscription();
void renewDBusSubscription();
void cancelDBusSubscription();
protected:
virtual void connectNotify(const char *signal);
virtual void disconnectNotify(const char *signal);
QString eventForSignal(const char *signal) const;
private:
void init();
int renewDBusSubscription(int subscriptionId, int leaseDuration, const QStringList &events = QStringList());
void notifierConnect(const QString &signal, QObject *receiver, const char *slot);
static ReturnArguments parseIPPVars(ipp_t *response,
ipp_tag_t group_tag);
static QVariant ippAttrToVariant(ipp_attribute_t *attr);
static KCupsConnection* m_instance;
bool m_inited;
KCupsPasswordDialog *m_passwordDialog;
KUrl m_serverUrl;
QTimer *m_subscriptionTimer;
QTimer *m_renewTimer;
QStringList m_connectedEvents;
QStringList m_requestedDBusEvents;
int m_subscriptionId;
};
#endif // KCUPSCONNECTION_H

View file

@ -1,207 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "KCupsJob.h"
#include <KDebug>
KCupsJob::KCupsJob() :
m_jobId(0)
{
}
KCupsJob::KCupsJob(int jobId, const QString &printer) :
m_jobId(jobId),
m_printer(printer)
{
m_arguments[KCUPS_JOB_ID] = QString::number(jobId);
}
KCupsJob::KCupsJob(const QVariantHash &arguments) :
m_arguments(arguments)
{
m_jobId = arguments[KCUPS_JOB_ID].toInt();
m_printer = arguments[KCUPS_JOB_PRINTER_URI].toString().section('/', -1);
}
int KCupsJob::id() const
{
return m_jobId;
}
QString KCupsJob::idStr() const
{
return m_arguments[KCUPS_JOB_ID].toString();
}
QString KCupsJob::name() const
{
return m_arguments[KCUPS_JOB_NAME].toString();
}
QString KCupsJob::originatingUserName() const
{
return m_arguments[KCUPS_JOB_ORIGINATING_USER_NAME].toString();
}
QString KCupsJob::originatingHostName() const
{
return m_arguments[KCUPS_JOB_ORIGINATING_HOST_NAME].toString();
}
QString KCupsJob::printer() const
{
return m_printer;
}
QDateTime KCupsJob::createdAt() const
{
QDateTime ret;
if (m_arguments.contains(KCUPS_TIME_AT_CREATION)) {
ret.setTime_t(m_arguments[KCUPS_TIME_AT_CREATION].toInt());
}
return ret;
}
QDateTime KCupsJob::completedAt() const
{
QDateTime ret;
if (m_arguments.contains(KCUPS_TIME_AT_COMPLETED)) {
ret.setTime_t(m_arguments[KCUPS_TIME_AT_COMPLETED].toInt());
}
return ret;
}
QDateTime KCupsJob::processedAt() const
{
QDateTime ret;
if (m_arguments.contains(KCUPS_TIME_AT_PROCESSING)) {
ret.setTime_t(m_arguments[KCUPS_TIME_AT_PROCESSING].toInt());
}
return ret;
}
int KCupsJob::pages() const
{
return m_arguments[KCUPS_JOB_MEDIA_SHEETS].toInt();
}
int KCupsJob::processedPages() const
{
return m_arguments[KCUPS_JOB_MEDIA_SHEETS_COMPLETED].toInt();
}
int KCupsJob::size() const
{
int jobKOctets = m_arguments[KCUPS_JOB_K_OCTETS].toInt();
jobKOctets *= 1024; // transform it to bytes
return jobKOctets;
}
bool KCupsJob::preserved() const
{
return m_arguments[KCUPS_JOB_PRESERVED].toInt();
}
QString KCupsJob::iconName(ipp_jstate_t state)
{
QString ret;
switch (state){
case IPP_JOB_PENDING:
ret = QLatin1String("chronometer");
break;
case IPP_JOB_HELD:
ret = QLatin1String("media-playback-pause");
break;
case IPP_JOB_PROCESSING:
ret = QLatin1String("draw-arrow-forward");
break;
case IPP_JOB_STOPPED:
ret = QLatin1String("draw-rectangle");
break;
case IPP_JOB_CANCELED:
ret = QLatin1String("archive-remove");
break;
case IPP_JOB_ABORTED:
ret = QLatin1String("task-attempt");
break;
case IPP_JOB_COMPLETED:
ret = QLatin1String("task-complete");
break;
default:
ret = QLatin1String("unknown");
}
return ret;
}
ipp_jstate_t KCupsJob::state() const
{
return static_cast<ipp_jstate_t>(m_arguments[KCUPS_JOB_STATE].toUInt());
}
QString KCupsJob::stateMsg() const
{
return m_arguments[KCUPS_JOB_PRINTER_STATE_MESSAGE].toString();
}
bool KCupsJob::reprintEnabled() const
{
if (state() >= IPP_JOB_STOPPED && preserved()) {
return true;
}
return false;
}
bool KCupsJob::cancelEnabled(ipp_jstate_t state)
{
switch (state) {
case IPP_JOB_CANCELED:
case IPP_JOB_COMPLETED:
case IPP_JOB_ABORTED:
return false;
default:
return true;
}
}
bool KCupsJob::holdEnabled(ipp_jstate_t state)
{
switch (state) {
case IPP_JOB_CANCELED:
case IPP_JOB_COMPLETED:
case IPP_JOB_ABORTED:
case IPP_JOB_HELD:
case IPP_JOB_STOPPED:
return false;
default:
return true;
}
}
bool KCupsJob::releaseEnabled(ipp_jstate_t state)
{
switch (state) {
case IPP_JOB_HELD :
case IPP_JOB_STOPPED :
return true;
default:
return false;
}
}

View file

@ -1,76 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef KCUPSJOB_H
#define KCUPSJOB_H
#include <QString>
#include <QDateTime>
#include <KCupsConnection.h>
class KDE_EXPORT KCupsJob
{
Q_GADGET
Q_ENUMS(Attribute)
public:
KCupsJob();
KCupsJob(int jobId, const QString &printer);
int id() const;
QString idStr() const;
QString name() const;
QString originatingUserName() const;
QString originatingHostName() const;
QString printer() const;
QDateTime createdAt() const;
QDateTime completedAt() const;
QDateTime processedAt() const;
int pages() const;
int processedPages() const;
int size() const;
bool preserved() const;
static QString iconName(ipp_jstate_t state);
ipp_jstate_t state() const;
QString stateMsg() const;
bool reprintEnabled() const;
static bool cancelEnabled(ipp_jstate_t state);
static bool holdEnabled(ipp_jstate_t state);
static bool releaseEnabled(ipp_jstate_t state);
protected:
KCupsJob(const QVariantHash &arguments);
private:
friend class KCupsRequest;
int m_jobId;
QString m_printer;
QVariantHash m_arguments;
};
typedef QList<KCupsJob> KCupsJobs;
Q_DECLARE_METATYPE(KCupsJobs)
Q_DECLARE_METATYPE(KCupsJob)
#endif // KCUPSJOB_H

View file

@ -1,84 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "KCupsPasswordDialog.h"
#include <QPointer>
#include <KPasswordDialog>
#include <KWindowSystem>
#include <KLocale>
#include <KDebug>
KCupsPasswordDialog::KCupsPasswordDialog(QObject *parent) :
QObject(parent),
m_accepted(false),
m_mainwindow(0)
{
}
void KCupsPasswordDialog::setMainWindow(WId mainwindow)
{
m_mainwindow = mainwindow;
}
void KCupsPasswordDialog::exec(const QString &username, bool wrongPassword)
{
QPointer<KPasswordDialog> dialog = new KPasswordDialog(0L, KPasswordDialog::ShowUsernameLine);
dialog->setPrompt(i18n("Enter an username and a password to complete the task"));
dialog->setModal(false);
dialog->setUsername(username);
if (wrongPassword) {
dialog->showErrorMessage(QString(), KPasswordDialog::UsernameError);
dialog->showErrorMessage(i18n("Wrong username or password"), KPasswordDialog::PasswordError);
}
dialog->show();
if (m_mainwindow) {
KWindowSystem::setMainWindow(dialog, m_mainwindow);
}
KWindowSystem::forceActiveWindow(dialog->winId());
// Do not return from this method now
dialog->exec();
if (dialog) {
m_accepted = dialog->result() == QDialog::Accepted;
m_username = dialog->username();
m_password = dialog->password();
dialog->deleteLater();
}
}
bool KCupsPasswordDialog::accepted() const
{
return m_accepted;
}
QString KCupsPasswordDialog::username() const
{
return m_username;
}
QString KCupsPasswordDialog::password() const
{
return m_password;
}

View file

@ -1,48 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef KCUPSPASSWORDDIALOG_H
#define KCUPSPASSWORDDIALOG_H
#include <QObject>
#include <QWidget>
class KCupsPasswordDialog : public QObject
{
Q_OBJECT
public:
explicit KCupsPasswordDialog(QObject *parent = 0);
void setMainWindow(WId mainwindow);
public slots:
void exec(const QString &username, bool wrongPassword);
bool accepted() const;
QString username() const;
QString password() const;
private:
bool m_accepted;
WId m_mainwindow;
QString m_username;
QString m_password;
};
#endif // KCUPSPASSWORDDIALOG_H

View file

@ -1,197 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "KCupsPrinter.h"
#include <KDebug>
KCupsPrinter::KCupsPrinter() :
m_isClass(false)
{
}
KCupsPrinter::KCupsPrinter(const QString &printer, bool isClass) :
m_printer(printer),
m_isClass(isClass)
{
}
KCupsPrinter::KCupsPrinter(const QVariantHash &arguments) :
m_arguments(arguments)
{
m_printer = arguments[KCUPS_PRINTER_NAME].toString();
m_isClass = arguments[KCUPS_PRINTER_TYPE].toInt() & CUPS_PRINTER_CLASS;
}
QString KCupsPrinter::name() const
{
return m_printer;
}
bool KCupsPrinter::isClass() const
{
return m_isClass;
}
bool KCupsPrinter::isDefault() const
{
return m_arguments[KCUPS_PRINTER_TYPE].toUInt() & CUPS_PRINTER_DEFAULT;
}
bool KCupsPrinter::isShared() const
{
return m_arguments[KCUPS_PRINTER_IS_SHARED].toBool();
}
bool KCupsPrinter::isAcceptingJobs() const
{
return m_arguments[KCUPS_PRINTER_IS_ACCEPTING_JOBS].toBool();
}
cups_ptype_e KCupsPrinter::type() const
{
return static_cast<cups_ptype_e>(m_arguments[KCUPS_PRINTER_TYPE].toUInt());
}
QString KCupsPrinter::location() const
{
return m_arguments[KCUPS_PRINTER_LOCATION].toString();
}
QString KCupsPrinter::info() const
{
if (m_arguments[KCUPS_PRINTER_INFO].toString().isEmpty()) {
return name();
}
return m_arguments[KCUPS_PRINTER_INFO].toString();
}
QString KCupsPrinter::makeAndModel() const
{
return m_arguments[KCUPS_PRINTER_MAKE_AND_MODEL].toString();
}
QStringList KCupsPrinter::commands() const
{
return m_arguments[KCUPS_PRINTER_COMMANDS].toStringList();
}
QStringList KCupsPrinter::memberNames() const
{
return m_arguments[KCUPS_MEMBER_NAMES].toStringList();
}
QString KCupsPrinter::deviceUri() const
{
return m_arguments[KCUPS_DEVICE_URI].toString();
}
QStringList KCupsPrinter::errorPolicy() const
{
return m_arguments[KCUPS_PRINTER_ERROR_POLICY].toStringList();
}
QStringList KCupsPrinter::errorPolicySupported() const
{
return m_arguments[KCUPS_PRINTER_ERROR_POLICY_SUPPORTED].toStringList();
}
QStringList KCupsPrinter::opPolicy() const
{
return m_arguments[KCUPS_PRINTER_OP_POLICY].toStringList();
}
QStringList KCupsPrinter::opPolicySupported() const
{
return m_arguments[KCUPS_PRINTER_OP_POLICY_SUPPORTED].toStringList();
}
QStringList KCupsPrinter::jobSheetsDefault() const
{
return m_arguments[KCUPS_JOB_SHEETS_DEFAULT].toStringList();
}
QStringList KCupsPrinter::jobSheetsSupported() const
{
return m_arguments[KCUPS_JOB_SHEETS_SUPPORTED].toStringList();
}
QStringList KCupsPrinter::requestingUserNameAllowed() const
{
return m_arguments[KCUPS_REQUESTING_USER_NAME_ALLOWED].toStringList();
}
QStringList KCupsPrinter::requestingUserNameDenied() const
{
return m_arguments[KCUPS_REQUESTING_USER_NAME_DENIED].toStringList();
}
QString KCupsPrinter::uriSupported() const
{
return m_arguments[KCUPS_PRINTER_URI_SUPPORTED].toString();
}
KCupsPrinter::Status KCupsPrinter::state() const
{
return static_cast<Status>(m_arguments[KCUPS_PRINTER_STATE].toUInt());
}
QString KCupsPrinter::stateMsg() const
{
return m_arguments[KCUPS_PRINTER_STATE_MESSAGE].toString();
}
int KCupsPrinter::markerChangeTime() const
{
return m_arguments[KCUPS_MARKER_CHANGE_TIME].toInt();
}
QVariant KCupsPrinter::argument(const QString &name) const
{
return m_arguments.value(name);
}
KIcon KCupsPrinter::icon() const
{
return icon(type());
}
KIcon KCupsPrinter::icon(cups_ptype_e type)
{
return KIcon(iconName(type));
}
QString KCupsPrinter::iconName() const
{
return iconName(type());
}
QString KCupsPrinter::iconName(cups_ptype_e type)
{
// TODO get the ppd or something to get the real printer icon
if (!(type & CUPS_PRINTER_COLOR)) {
// If the printer is not color it is probably a laser one
return "printer-laser";
} else if (type & CUPS_PRINTER_SCANNER) {
return "scanner";
} else {
return "printer";
}
}

View file

@ -1,95 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef KCUPSPRINTER_H
#define KCUPSPRINTER_H
#include <QString>
#include <KIcon>
#include <KCupsConnection.h>
class KDE_EXPORT KCupsPrinter
{
Q_GADGET
Q_ENUMS(Status)
public:
typedef enum {
Idle = 3,
Printing,
Stopped
} Status;
KCupsPrinter();
explicit KCupsPrinter(const QString &printer, bool isClass = false);
QString name() const;
bool isClass() const;
bool isDefault() const;
bool isShared() const;
bool isAcceptingJobs() const;
cups_ptype_e type() const;
QString location() const;
QString info() const;
QString makeAndModel() const;
QStringList commands() const;
QStringList memberNames() const;
QString deviceUri() const;
QStringList errorPolicy() const;
QStringList errorPolicySupported() const;
QStringList opPolicy() const;
QStringList opPolicySupported() const;
QStringList jobSheetsDefault() const;
QStringList jobSheetsSupported() const;
QStringList requestingUserNameAllowed() const;
QStringList requestingUserNameDenied() const;
QString uriSupported() const;
Status state() const;
QString stateMsg() const;
int markerChangeTime() const;
QVariant argument(const QString &name) const;
/**
* Requires enum PrinterType to work properly
*
*/
KIcon icon() const;
static KIcon icon(cups_ptype_e type);
QString iconName() const;
static QString iconName(cups_ptype_e type);
protected:
KCupsPrinter(const QVariantHash &arguments);
private:
friend class KCupsRequest;
QString m_printer;
bool m_isClass;
QVariantHash m_arguments;
};
typedef QList<KCupsPrinter> KCupsPrinters;
Q_DECLARE_METATYPE(KCupsPrinters)
Q_DECLARE_METATYPE(KCupsPrinter)
Q_DECLARE_METATYPE(KCupsPrinter::Status)
#endif // KCUPSPRINTER_H

View file

@ -1,667 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "KCupsRequest.h"
#include "KIppRequest.h"
#include "KCupsJob.h"
#include "KCupsPrinter.h"
#include <KLocale>
#include <KDebug>
#include <cups/adminutil.h>
#include <cups/ppd.h>
#define CUPS_DATADIR "/usr/share/cups"
KCupsRequest::KCupsRequest(KCupsConnection *connection) :
m_connection(connection),
m_finished(true),
m_error(IPP_OK)
{
// If no connection was specified use default one
if (m_connection == 0) {
m_connection = KCupsConnection::global();
}
connect(this, SIGNAL(finished()), &m_loop, SLOT(quit()));
}
QString KCupsRequest::serverError() const
{
switch (error()) {
case IPP_SERVICE_UNAVAILABLE:
return i18n("Print service is unavailable");
case IPP_NOT_FOUND :
return i18n("Not found");
default : // In this case we don't want to map all enums
kWarning() << "status unrecognised: " << error();
return QString::fromUtf8(ippErrorString(error()));
}
}
void KCupsRequest::getPPDS(const QString &make)
{
if (m_connection->readyToStart()) {
KIppRequest request(CUPS_GET_PPDS, "/");
if (!make.isEmpty()) {
request.addString(IPP_TAG_PRINTER, IPP_TAG_TEXT, KCUPS_PPD_MAKE_AND_MODEL, make);
}
m_ppds = m_connection->request(request, IPP_TAG_PRINTER);
setError(httpGetStatus(CUPS_HTTP_DEFAULT), cupsLastError(), QString::fromUtf8(cupsLastErrorString()));
setFinished();
} else {
invokeMethod("getPPDS", make);
}
}
static void choose_device_cb(const char *device_class, /* I - Class */
const char *device_id, /* I - 1284 device ID */
const char *device_info, /* I - Description */
const char *device_make_and_model, /* I - Make and model */
const char *device_uri, /* I - Device URI */
const char *device_location, /* I - Location */
void *user_data) /* I - Result object */
{
/*
* Add the device to the array...
*/
KCupsRequest *request = static_cast<KCupsRequest*>(user_data);
QMetaObject::invokeMethod(request,
"device",
Qt::QueuedConnection,
Q_ARG(QString, QString::fromUtf8(device_class)),
Q_ARG(QString, QString::fromUtf8(device_id)),
Q_ARG(QString, QString::fromUtf8(device_info)),
Q_ARG(QString, QString::fromUtf8(device_make_and_model)),
Q_ARG(QString, QString::fromUtf8(device_uri)),
Q_ARG(QString, QString::fromUtf8(device_location)));
}
void KCupsRequest::getDevices(int timeout)
{
getDevices(timeout, QStringList(), QStringList());
}
void KCupsRequest::getDevices(int timeout, QStringList includeSchemes, QStringList excludeSchemes)
{
if (m_connection->readyToStart()) {
do {
const char *include;
if (includeSchemes.isEmpty()) {
include = CUPS_INCLUDE_ALL;
} else {
include = includeSchemes.join(QLatin1String(",")).toUtf8();
}
const char *exclude;
if (excludeSchemes.isEmpty()) {
exclude = CUPS_EXCLUDE_NONE;
} else {
exclude = excludeSchemes.join(QLatin1String(",")).toUtf8();
}
// Scan for devices for "timeout" seconds
cupsGetDevices(CUPS_HTTP_DEFAULT,
timeout,
include,
exclude,
(cups_device_cb_t) choose_device_cb,
this);
} while (m_connection->retry("/admin/", CUPS_GET_DEVICES));
setError(httpGetStatus(CUPS_HTTP_DEFAULT), cupsLastError(), QString::fromUtf8(cupsLastErrorString()));
setFinished(true);
} else {
invokeMethod("getDevices", timeout, includeSchemes, excludeSchemes);
}
}
// THIS function can get the default server dest through the
// "printer-is-default" attribute BUT it does not get user
// defined default printer, see cupsGetDefault() on www.cups.org for details
void KCupsRequest::getPrinters(QStringList attributes, int mask)
{
if (m_connection->readyToStart()) {
KIppRequest request(CUPS_GET_PRINTERS, "/");
request.addInteger(IPP_TAG_OPERATION, IPP_TAG_ENUM, KCUPS_PRINTER_TYPE, CUPS_PRINTER_LOCAL);
if (!attributes.isEmpty()) {
request.addStringList(IPP_TAG_OPERATION, IPP_TAG_KEYWORD, KCUPS_REQUESTED_ATTRIBUTES, attributes);
}
if (mask != -1) {
request.addInteger(IPP_TAG_OPERATION, IPP_TAG_ENUM, KCUPS_PRINTER_TYPE_MASK, mask);
}
ReturnArguments ret;
ret = m_connection->request(request, IPP_TAG_PRINTER);
foreach (const QVariantHash &arguments, ret) {
m_printers << KCupsPrinter(arguments);
}
setError(httpGetStatus(CUPS_HTTP_DEFAULT), cupsLastError(), QString::fromUtf8(cupsLastErrorString()));
setFinished();
} else {
invokeMethod("getPrinters", qVariantFromValue(attributes), mask);
}
}
void KCupsRequest::getPrinterAttributes(const QString &printerName, bool isClass, QStringList attributes)
{
if (m_connection->readyToStart()) {
KIppRequest request(IPP_GET_PRINTER_ATTRIBUTES, "/");
request.addPrinterUri(printerName, isClass);
request.addInteger(IPP_TAG_OPERATION, IPP_TAG_ENUM, KCUPS_PRINTER_TYPE, CUPS_PRINTER_LOCAL);
request.addStringList(IPP_TAG_OPERATION, IPP_TAG_KEYWORD, KCUPS_REQUESTED_ATTRIBUTES, attributes);
ReturnArguments ret;
ret = m_connection->request(request, IPP_TAG_PRINTER);
foreach (const QVariantHash &arguments, ret) {
// Inject the printer name back to the arguments hash
QVariantHash args = arguments;
args[KCUPS_PRINTER_NAME] = printerName;
m_printers << KCupsPrinter(args);
}
setError(httpGetStatus(CUPS_HTTP_DEFAULT), cupsLastError(), QString::fromUtf8(cupsLastErrorString()));
setFinished();
} else {
invokeMethod("getPrinterAttributes", printerName, isClass, qVariantFromValue(attributes));
}
}
void KCupsRequest::getJobs(const QString &printerName, bool myJobs, int whichJobs, QStringList attributes)
{
if (m_connection->readyToStart()) {
KIppRequest request(IPP_GET_JOBS, "/");
// printer-uri makes the Name of the Job and owner came blank lol
request.addPrinterUri(printerName, false);
request.addInteger(IPP_TAG_OPERATION, IPP_TAG_ENUM, KCUPS_PRINTER_TYPE, CUPS_PRINTER_LOCAL);
request.addStringList(IPP_TAG_OPERATION, IPP_TAG_KEYWORD, KCUPS_REQUESTED_ATTRIBUTES, attributes);
request.addInteger(IPP_TAG_OPERATION, IPP_TAG_ENUM, KCUPS_MY_JOBS, myJobs);
if (whichJobs == CUPS_WHICHJOBS_COMPLETED) {
request.addString(IPP_TAG_OPERATION, IPP_TAG_KEYWORD, KCUPS_WHICH_JOBS, "completed");
} else if (whichJobs == CUPS_WHICHJOBS_ALL) {
request.addString(IPP_TAG_OPERATION, IPP_TAG_KEYWORD, KCUPS_WHICH_JOBS, "all");
}
ReturnArguments ret;
ret = m_connection->request(request, IPP_TAG_JOB);
foreach (const QVariantHash &arguments, ret) {
m_jobs << KCupsJob(arguments);
}
setError(httpGetStatus(CUPS_HTTP_DEFAULT), cupsLastError(), QString::fromUtf8(cupsLastErrorString()));
setFinished();
} else {
invokeMethod("getJobs", printerName, myJobs, whichJobs, qVariantFromValue(attributes));
}
}
void KCupsRequest::getJobAttributes(int jobId, const QString &printerUri, QStringList attributes)
{
if (m_connection->readyToStart()) {
KIppRequest request(IPP_GET_JOB_ATTRIBUTES, "/");
request.addString(IPP_TAG_OPERATION, IPP_TAG_URI, KCUPS_PRINTER_URI, printerUri);
request.addInteger(IPP_TAG_OPERATION, IPP_TAG_ENUM, KCUPS_PRINTER_TYPE, CUPS_PRINTER_LOCAL);
request.addStringList(IPP_TAG_OPERATION, IPP_TAG_KEYWORD, KCUPS_REQUESTED_ATTRIBUTES, attributes);
request.addInteger(IPP_TAG_OPERATION, IPP_TAG_INTEGER, KCUPS_JOB_ID, jobId);
ReturnArguments ret;
ret = m_connection->request(request, IPP_TAG_PRINTER);
foreach (const QVariantHash &arguments, ret) {
m_jobs << KCupsJob(arguments);
}
setError(httpGetStatus(CUPS_HTTP_DEFAULT), cupsLastError(), QString::fromUtf8(cupsLastErrorString()));
setFinished();
} else {
invokeMethod("getJobAttributes", jobId, printerUri, qVariantFromValue(attributes));
}
}
void KCupsRequest::getServerSettings()
{
if (m_connection->readyToStart()) {
do {
int num_settings;
cups_option_t *settings;
QVariantHash arguments;
int ret = cupsAdminGetServerSettings(CUPS_HTTP_DEFAULT, &num_settings, &settings);
for (int i = 0; i < num_settings; ++i) {
QString name = QString::fromUtf8(settings[i].name);
QString value = QString::fromUtf8(settings[i].value);
arguments[name] = value;
}
cupsFreeOptions(num_settings, settings);
if (ret) {
setError(HTTP_OK, IPP_OK, QString());
} else {
setError(httpGetStatus(CUPS_HTTP_DEFAULT), cupsLastError(), QString::fromUtf8(cupsLastErrorString()));
}
m_server = KCupsServer(arguments);
} while (m_connection->retry("/admin/", -1));
setFinished();
} else {
invokeMethod("getServerSettings");
}
}
void KCupsRequest::getPrinterPPD(const QString &printerName)
{
if (m_connection->readyToStart()) {
do {
const char *filename;
filename = cupsGetPPD2(CUPS_HTTP_DEFAULT, printerName.toUtf8());
kDebug() << filename;
m_ppdFile = filename;
kDebug() << m_ppdFile;
} while (m_connection->retry("/", CUPS_GET_PPD));
setError(httpGetStatus(CUPS_HTTP_DEFAULT), cupsLastError(), QString::fromUtf8(cupsLastErrorString()));
setFinished();
} else {
invokeMethod("getPrinterPPD", printerName);
}
}
void KCupsRequest::setServerSettings(const KCupsServer &server)
{
if (m_connection->readyToStart()) {
do {
QVariantHash args = server.arguments();
int num_settings = 0;
cups_option_t *settings;
QVariantHash::const_iterator i = args.constBegin();
while (i != args.constEnd()) {
num_settings = cupsAddOption(i.key().toUtf8(),
i.value().toString().toUtf8(),
num_settings,
&settings);
++i;
}
cupsAdminSetServerSettings(CUPS_HTTP_DEFAULT, num_settings, settings);
cupsFreeOptions(num_settings, settings);
} while (m_connection->retry("/admin/", -1));
setError(httpGetStatus(CUPS_HTTP_DEFAULT), cupsLastError(), QString::fromUtf8(cupsLastErrorString()));
setFinished();
} else {
invokeMethod("setServerSettings", qVariantFromValue(server));
}
}
void KCupsRequest::addOrModifyPrinter(const QString &printerName, const QVariantHash &attributes, const QString &filename)
{
KIppRequest request(CUPS_ADD_MODIFY_PRINTER, "/admin/", filename);
request.addPrinterUri(printerName);
request.addVariantValues(attributes);
process(request);
}
void KCupsRequest::addOrModifyClass(const QString &printerName, const QVariantHash &attributes)
{
KIppRequest request(CUPS_ADD_MODIFY_CLASS, "/admin/");
request.addPrinterUri(printerName, true);
request.addVariantValues(attributes);
process(request);
}
void KCupsRequest::setShared(const QString &printerName, bool isClass, bool shared)
{
KIppRequest request(isClass ? CUPS_ADD_MODIFY_CLASS : CUPS_ADD_MODIFY_PRINTER, "/admin/");
request.addPrinterUri(printerName, isClass);
request.addBoolean(IPP_TAG_OPERATION, KCUPS_PRINTER_IS_SHARED, shared);
process(request);
}
void KCupsRequest::pausePrinter(const QString &printerName)
{
KIppRequest request(IPP_PAUSE_PRINTER, "/admin/");
request.addPrinterUri(printerName);
process(request);
}
void KCupsRequest::resumePrinter(const QString &printerName)
{
KIppRequest request(IPP_RESUME_PRINTER, "/admin/");
request.addPrinterUri(printerName);
process(request);
}
void KCupsRequest::rejectJobs(const QString &printerName)
{
KIppRequest request(CUPS_REJECT_JOBS, "/admin/");
request.addPrinterUri(printerName);
process(request);
}
void KCupsRequest::acceptJobs(const QString &printerName)
{
KIppRequest request(CUPS_ACCEPT_JOBS, "/admin/");
request.addPrinterUri(printerName);
process(request);
}
void KCupsRequest::setDefaultPrinter(const QString &printerName)
{
KIppRequest request(CUPS_SET_DEFAULT, "/admin/");
request.addPrinterUri(printerName);
process(request);
}
void KCupsRequest::deletePrinter(const QString &printerName)
{
KIppRequest request(CUPS_DELETE_PRINTER, "/admin/");
request.addPrinterUri(printerName);
process(request);
}
void KCupsRequest::printTestPage(const QString &printerName, bool isClass)
{
QString resource; /* POST resource path */
QString filename; /* Test page filename */
QString datadir; /* CUPS_DATADIR env var */
/*
* Locate the test page file...
*/
datadir = qgetenv("CUPS_DATADIR");
if (datadir.isEmpty()) {
datadir = CUPS_DATADIR;
}
filename = datadir + QLatin1String("/data/testprint");
/*
* Point to the printer/class...
*/
if (isClass) {
resource = QLatin1String("/classes/") + printerName;
} else {
resource = QLatin1String("/printers/") + printerName;
}
KIppRequest request(IPP_PRINT_JOB, resource.toUtf8(), filename);
request.addPrinterUri(printerName);
request.addString(IPP_TAG_OPERATION, IPP_TAG_NAME, KCUPS_JOB_NAME, i18n("Test Page"));
process(request);
}
void KCupsRequest::printCommand(const QString &printerName, const QString &command, const QString &title)
{
if (m_connection->readyToStart()) {
do {
int job_id; /* Command file job */
char command_file[1024]; /* Command "file" */
http_status_t status; /* Document status */
cups_option_t hold_option; /* job-hold-until option */
/*
* Create the CUPS command file...
*/
snprintf(command_file, sizeof(command_file), "#CUPS-COMMAND\n%s\n", command.toUtf8().data());
/*
* Send the command file job...
*/
hold_option.name = const_cast<char*>("job-hold-until");
hold_option.value = const_cast<char*>("no-hold");
if ((job_id = cupsCreateJob(CUPS_HTTP_DEFAULT,
printerName.toUtf8(),
title.toUtf8(),
1,
&hold_option)) < 1) {
qWarning() << "Unable to send command to printer driver!";
setError(HTTP_OK, IPP_NOT_POSSIBLE, i18n("Unable to send command to printer driver!"));
setFinished();
return;
}
status = cupsStartDocument(CUPS_HTTP_DEFAULT,
printerName.toUtf8(),
job_id,
NULL,
CUPS_FORMAT_COMMAND,
1);
if (status == HTTP_CONTINUE) {
status = cupsWriteRequestData(CUPS_HTTP_DEFAULT, command_file,
strlen(command_file));
}
if (status == HTTP_CONTINUE) {
cupsFinishDocument(CUPS_HTTP_DEFAULT, printerName.toUtf8());
}
setError(httpGetStatus(CUPS_HTTP_DEFAULT), cupsLastError(), QString::fromUtf8(cupsLastErrorString()));
if (httpGetStatus(CUPS_HTTP_DEFAULT), cupsLastError() >= IPP_REDIRECTION_OTHER_SITE) {
qWarning() << "Unable to send command to printer driver!";
cupsCancelJob(printerName.toUtf8(), job_id);
setFinished();
return; // Return to avoid a new try
}
} while (m_connection->retry("/", IPP_CREATE_JOB));
setError(httpGetStatus(CUPS_HTTP_DEFAULT), cupsLastError(), QString::fromUtf8(cupsLastErrorString()));
setFinished();
} else {
invokeMethod("printCommand", printerName, command, title);
}
}
void KCupsRequest::cancelJob(const QString &printerName, int jobId)
{
KIppRequest request(IPP_CANCEL_JOB, "/jobs/");
request.addPrinterUri(printerName);
request.addInteger(IPP_TAG_OPERATION, IPP_TAG_INTEGER, KCUPS_JOB_ID, jobId);
process(request);
}
void KCupsRequest::holdJob(const QString &printerName, int jobId)
{
KIppRequest request(IPP_HOLD_JOB, "/jobs/");
request.addPrinterUri(printerName);
request.addInteger(IPP_TAG_OPERATION, IPP_TAG_INTEGER, KCUPS_JOB_ID, jobId);
process(request);
}
void KCupsRequest::releaseJob(const QString &printerName, int jobId)
{
KIppRequest request(IPP_RELEASE_JOB, "/jobs/");
request.addPrinterUri(printerName);
request.addInteger(IPP_TAG_OPERATION, IPP_TAG_INTEGER, KCUPS_JOB_ID, jobId);
process(request);
}
void KCupsRequest::restartJob(const QString &printerName, int jobId)
{
KIppRequest request(IPP_RESTART_JOB, "/jobs/");
request.addPrinterUri(printerName);
request.addInteger(IPP_TAG_OPERATION, IPP_TAG_INTEGER, KCUPS_JOB_ID, jobId);
process(request);
}
void KCupsRequest::moveJob(const QString &fromPrinterName, int jobId, const QString &toPrinterName)
{
if (jobId < -1 || fromPrinterName.isEmpty() || toPrinterName.isEmpty() || jobId == 0) {
qWarning() << "Internal error, invalid input data" << jobId << fromPrinterName << toPrinterName;
setFinished();
return;
}
KIppRequest request(CUPS_MOVE_JOB, "/jobs/");
request.addPrinterUri(fromPrinterName);
request.addInteger(IPP_TAG_OPERATION, IPP_TAG_INTEGER, KCUPS_JOB_ID, jobId);
request.addString(IPP_TAG_OPERATION, IPP_TAG_URI, KCUPS_JOB_PRINTER_URI, toPrinterName);
process(request);
}
void KCupsRequest::invokeMethod(const char *method,
const QVariant &arg1,
const QVariant &arg2,
const QVariant &arg3,
const QVariant &arg4,
const QVariant &arg5,
const QVariant &arg6,
const QVariant &arg7,
const QVariant &arg8)
{
m_error = IPP_OK;
m_errorMsg.clear();
m_printers.clear();
m_jobs.clear();
m_ppds.clear();
m_ppdFile.clear();
// If this fails we get into a infinite loop
// Do not use global()->thread() which point
// to the KCupsConnection parent thread
moveToThread(m_connection);
m_finished = !QMetaObject::invokeMethod(this,
method,
Qt::QueuedConnection,
QGenericArgument(arg1.typeName(), arg1.data()),
QGenericArgument(arg2.typeName(), arg2.data()),
QGenericArgument(arg3.typeName(), arg3.data()),
QGenericArgument(arg4.typeName(), arg4.data()),
QGenericArgument(arg5.typeName(), arg5.data()),
QGenericArgument(arg6.typeName(), arg6.data()),
QGenericArgument(arg7.typeName(), arg7.data()),
QGenericArgument(arg8.typeName(), arg8.data()));
if (m_finished) {
setError(HTTP_ERROR, IPP_BAD_REQUEST, i18n("Failed to invoke method: %1", method));
setFinished();
}
}
void KCupsRequest::process(const KIppRequest &request)
{
if (m_connection->readyToStart()) {
m_connection->request(request);
setError(httpGetStatus(CUPS_HTTP_DEFAULT), cupsLastError(), QString::fromUtf8(cupsLastErrorString()));
setFinished();
} else {
invokeMethod("process", qVariantFromValue(request));
}
}
ReturnArguments KCupsRequest::ppds() const
{
return m_ppds;
}
KCupsServer KCupsRequest::serverSettings() const
{
return m_server;
}
QString KCupsRequest::printerPPD() const
{
return m_ppdFile;
}
KCupsPrinters KCupsRequest::printers() const
{
return m_printers;
}
KCupsJobs KCupsRequest::jobs() const
{
return m_jobs;
}
void KCupsRequest::waitTillFinished()
{
if (m_finished) {
return;
}
m_loop.exec();
}
bool KCupsRequest::hasError() const
{
return m_error;
}
ipp_status_t KCupsRequest::error() const
{
return m_error;
}
http_status_t KCupsRequest::httpStatus() const
{
return m_httpStatus;
}
QString KCupsRequest::errorMsg() const
{
return m_errorMsg;
}
KCupsConnection *KCupsRequest::connection() const
{
return m_connection;
}
void KCupsRequest::setError(http_status_t httpStatus, ipp_status_t error, const QString &errorMsg)
{
m_httpStatus = httpStatus;
m_error = error;
m_errorMsg = errorMsg;
}
void KCupsRequest::setFinished(bool delayed)
{
m_finished = true;
if (delayed) {
QTimer::singleShot(0, this, SIGNAL(finished()));
} else {
emit finished();
}
}

View file

@ -1,323 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef KCUPS_REQUEST_H
#define KCUPS_REQUEST_H
#include <QObject>
#include <QEventLoop>
#include "KCupsConnection.h"
#include "KCupsJob.h"
#include "KCupsPrinter.h"
#include "KCupsServer.h"
#include "KIppRequest.h"
class KDE_EXPORT KCupsRequest : public QObject
{
Q_OBJECT
public:
/**
* Default constructor, it takes no parent
* because it will move to KCupsConnection thread
*
* Before calling any method connect to finished() signal or
* use waitTillFinished().
* You must delete the object manually after finished
* using deleteLater().
*/
explicit KCupsRequest(KCupsConnection *connection = 0);
/**
* This method creates an event loop
* and quits after the request is finished
*/
void waitTillFinished();
/**
* This method returns true if there was an error with the request
*/
bool hasError() const;
ipp_status_t error() const;
http_status_t httpStatus() const;
QString serverError() const;
QString errorMsg() const;
KCupsConnection* connection() const;
/**
* Non empty when getPrinters is called and finish is emitted
*/
KCupsPrinters printers() const;
/**
* Non empty when getPPDs is called and finish is emitted
*/
ReturnArguments ppds() const;
/**
* Non empty when getServerSettings() is called and finish is emitted
*/
KCupsServer serverSettings() const;
/**
* Non empty when \sa getPrinterPPD() is called and finish is emitted
* \warning You must unlik the given file name
*/
QString printerPPD() const;
/**
* Non empty when getJobs is called and finish is emitted
*/
KCupsJobs jobs() const;
/**
* Get all available PPDs from the givem make
* @param make the maker of the printer
*/
Q_INVOKABLE void getPPDS(const QString &make = QString());
/**
* Get all devices that could be added as a printer
* This method emits device()
*/
Q_INVOKABLE void getDevices(int timeout = CUPS_TIMEOUT_DEFAULT);
/**
* Get all devices that could be added as a printer
* This method emits device()
*/
Q_INVOKABLE void getDevices(int timeout, QStringList includeSchemes, QStringList excludeSchemes);
/**
* Get all available printers
* @param mask filter the kind of printer that will be emitted (-1 to no filter)
* @param requestedAttr the attibutes to retrieve from cups
* This method emits printer()
*
* THIS function can get the default server dest through the
* "printer-is-default" attribute BUT it does not get user
* defined default printer, see cupsGetDefault() on www.cups.org for details
*/
Q_INVOKABLE void getPrinters(QStringList attributes, int mask = -1);
/**
* Get attributes from a given printer
* @param printer The printer to apply the change
* @param isClass True it is a printer class
* @param attributes The attributes you are requesting
*
* @return The return will be stored in \sa printers()
*/
Q_INVOKABLE void getPrinterAttributes(const QString &printerName, bool isClass, QStringList attributes);
/**
* Get all jobs
* This method emits job()
* TODO we need to see if we authenticate as root to do some taks
* the myJobs will return the user's jobs or the root's jobs
* @param printer which printer you are requiring jobs for (empty = all printers)
* @param myJobs true if you only want your jobs
* @param whichJobs which kind jobs should be sent
*/
Q_INVOKABLE void getJobs(const QString &printerName, bool myJobs, int whichJobs, QStringList attributes);
/**
* Get attributes from a given printer
* @param printer The printer to apply the change
* @param isClass True it is a printer class
* @param attributes The attributes you are requesting
*
* @return The return will be stored in \sa printers()
*/
Q_INVOKABLE void getJobAttributes(int jobId, const QString &printerUri, QStringList attributes);
/**
* Get the CUPS server settings
* This method emits server()
*/
Q_INVOKABLE void getServerSettings();
/**
* Get the PPD associated with @arg printerName
* the result is stored at \sa printerPPD()
*/
Q_INVOKABLE void getPrinterPPD(const QString &printerName);
/**
* Get the CUPS server settings
* @param userValues the new server settings
*/
Q_INVOKABLE void setServerSettings(const KCupsServer &server);
// ---- Printer Methods
/**
* Add or Modify a Printer
* @param printerName The printer to apply the change
* @param attributes The new attributes of the printer
* @param filename The file name in case of changing the PPD
*/
void addOrModifyPrinter(const QString &printerName,
const QVariantHash &attributes,
const QString &filename = QString());
/**
* Add or Modify a Class
* @param className The class to apply the change
* @param attributes The new attributes of the printer
*/
void addOrModifyClass(const QString &className,
const QVariantHash &attributes);
/**
* Set if a given printer should be shared among other cups
* @param printer The printer to apply the change
* @param isClass True it is a printer class
* @param shared True if it should be shared
*/
void setShared(const QString &printerName, bool isClass, bool shared);
/**
* Set if a given printer should be the default one among others
* @param printer The printer to apply the change
*/
void setDefaultPrinter(const QString &printerName);
/**
* Pause the given printer from receiving jobs
* @param printer The printer to apply the change
*/
void pausePrinter(const QString &printerName);
/**
* Resume the given printer from receiving jobs
* @param printer The printer to apply the change
*/
void resumePrinter(const QString &printerName);
/**
* Allows the given printer from receiving jobs
* @param printer The printer to apply the change
*/
void acceptJobs(const QString &printerName);
/**
* Prevents the given printer from receiving jobs
* @param printer The printer to apply the change
*/
void rejectJobs(const QString &printerName);
/**
* Delete the given printer, if it's not local it's not
* possible to delete it
* @param printer The printer to apply the change
*/
void deletePrinter(const QString &printerName);
/**
* Print a test page
* @param printerName The printer where the test should be done
* @param isClass True it is a printer class
*/
void printTestPage(const QString &printerName, bool isClass);
/**
* Print a command test
* @param printerName The printer where the test should be done
* @param command The command to print
* @param title The title of the command
*/
Q_INVOKABLE void printCommand(const QString &printerName, const QString &command, const QString &title);
// Jobs methods
/**
* Cancels tries to cancel a given job
* @param printerName the destination name (printer)
* @param jobId the job identification
*/
void cancelJob(const QString &printerName, int jobId);
/**
* Holds the printing of a given job
* @param printerName the destination name (printer)
* @param jobId the job identification
*/
void holdJob(const QString &printerName, int jobId);
/**
* Holds the printing of a given job
* @param printerName the destination name (printer)
* @param jobId the job identification
*/
void releaseJob(const QString &printerName, int jobId);
/**
* Restart the printing of a given job
* @param printerName the destination name (printer)
* @param jobId the job identification
*/
void restartJob(const QString &printerName, int jobId);
/**
* Holds the printing of a given job
* @param fromDestName the destination name which holds the job
* @param jobId the job identification
* @param toDestName the destination to hold the job
*/
void moveJob(const QString &fromPrinterName, int jobId, const QString &toPrinterName);
signals:
void device(const QString &device_class,
const QString &device_id,
const QString &device_info,
const QString &device_make_and_model,
const QString &device_uri,
const QString &device_location);
void finished();
private:
void invokeMethod(const char *method,
const QVariant &arg1 = QVariant(),
const QVariant &arg2 = QVariant(),
const QVariant &arg3 = QVariant(),
const QVariant &arg4 = QVariant(),
const QVariant &arg5 = QVariant(),
const QVariant &arg6 = QVariant(),
const QVariant &arg7 = QVariant(),
const QVariant &arg8 = QVariant());
Q_INVOKABLE void process(const KIppRequest &request);
void setError(http_status_t httpStatus, ipp_status_t error, const QString &errorMsg);
void setFinished(bool delayed = false);
KCupsConnection *m_connection;
QEventLoop m_loop;
bool m_finished;
ipp_status_t m_error;
http_status_t m_httpStatus;
QString m_errorMsg;
ReturnArguments m_ppds;
KCupsServer m_server;
QString m_ppdFile;
KCupsPrinters m_printers;
KCupsJobs m_jobs;
};
#endif // KCUPS_REQUEST_H

View file

@ -1,98 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "KCupsServer.h"
#include <cups/adminutil.h>
#include <cups/cups.h>
#include <config.h>
KCupsServer::KCupsServer()
{
}
KCupsServer::KCupsServer(const QVariantHash &arguments)
{
m_arguments = arguments;
}
bool KCupsServer::allowRemoteAdmin() const
{
return m_arguments.value(CUPS_SERVER_REMOTE_ADMIN).toBool();
}
void KCupsServer::setAllowRemoteAdmin(bool allow)
{
m_arguments[CUPS_SERVER_REMOTE_ADMIN] = allow ? QLatin1String("1") : QLatin1String("0");
}
bool KCupsServer::allowUserCancelAnyJobs() const
{
return m_arguments.value(CUPS_SERVER_USER_CANCEL_ANY).toBool();
}
void KCupsServer::setAllowUserCancelAnyJobs(bool allow)
{
m_arguments[CUPS_SERVER_USER_CANCEL_ANY] = allow ? QLatin1String("1") : QLatin1String("0");
}
bool KCupsServer::showSharedPrinters() const
{
#if CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR < 6
return m_arguments.value(CUPS_SERVER_REMOTE_PRINTERS).toBool();
#else
return false;
#endif
}
void KCupsServer::setShowSharedPrinters(bool show)
{
#if CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR < 6
m_arguments[CUPS_SERVER_REMOTE_PRINTERS] = show ? QLatin1String("1") : QLatin1String("0");
#else
Q_UNUSED(show)
#endif // CUPS_VERSION_MAJOR == 1 && CUPS_VERSION_MINOR < 6
}
bool KCupsServer::sharePrinters() const
{
return m_arguments.value(CUPS_SERVER_SHARE_PRINTERS).toBool();
}
void KCupsServer::setSharePrinters(bool share)
{
m_arguments[CUPS_SERVER_SHARE_PRINTERS] = share ? QLatin1String("1") : QLatin1String("0");
}
bool KCupsServer::allowPrintingFromInternet() const
{
return m_arguments.value(CUPS_SERVER_REMOTE_ANY).toBool();
}
void KCupsServer::setAllowPrintingFromInternet(bool allow)
{
m_arguments[CUPS_SERVER_REMOTE_ANY] = allow ? QLatin1String("1") : QLatin1String("0");
}
QVariantHash KCupsServer::arguments() const
{
return m_arguments;
}

View file

@ -1,60 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef KCUPSSERVER_H
#define KCUPSSERVER_H
#include <QString>
#include <KCupsConnection.h>
class KDE_EXPORT KCupsServer
{
public:
KCupsServer();
bool allowRemoteAdmin() const;
void setAllowRemoteAdmin(bool allow);
bool allowUserCancelAnyJobs() const;
void setAllowUserCancelAnyJobs(bool allow);
bool showSharedPrinters() const;
void setShowSharedPrinters(bool show);
bool sharePrinters() const;
void setSharePrinters(bool share);
bool allowPrintingFromInternet() const;
void setAllowPrintingFromInternet(bool allow);
QVariantHash arguments() const;
protected:
KCupsServer(const QVariantHash &arguments);
private:
friend class KCupsRequest;
QVariantHash m_arguments;
};
Q_DECLARE_METATYPE(KCupsServer)
#endif // KCUPSSERVER_H

View file

@ -1,272 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2013 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "KIppRequest.h"
#include "KIppRequest_p.h"
#include <KDebug>
KIppRequest::KIppRequest() :
d_ptr(new KIppRequestPrivate)
{
}
KIppRequest::KIppRequest(const KIppRequest &other) :
d_ptr(new KIppRequestPrivate)
{
*this = other;
}
KIppRequest::KIppRequest(ipp_op_t operation, const char *resource, const QString &filename) :
d_ptr(new KIppRequestPrivate)
{
Q_D(KIppRequest);
d->operation = operation;
d->resource = resource;
d->filename = filename;
// send our user name on the request too
addString(IPP_TAG_OPERATION, IPP_TAG_NAME, KCUPS_REQUESTING_USER_NAME, cupsUser());
}
KIppRequest::~KIppRequest()
{
Q_D(KIppRequest);
delete d;
}
ipp_op_t KIppRequest::operation() const
{
Q_D(const KIppRequest);
return d->operation;
}
QString KIppRequest::resource() const
{
Q_D(const KIppRequest);
return d->resource;
}
QString KIppRequest::filename() const
{
Q_D(const KIppRequest);
return d->filename;
}
ipp_t *KIppRequest::sendIppRequest() const
{
Q_D(const KIppRequest);
ipp_t *request = ippNewRequest(d->operation);
d->addRawRequestsToIpp(request);
if (d->filename.isNull()) {
return cupsDoRequest(CUPS_HTTP_DEFAULT, request, d->resource.toUtf8());
} else {
return cupsDoFileRequest(CUPS_HTTP_DEFAULT, request, d->resource.toUtf8(), d->filename.toUtf8());
}
}
void KIppRequest::addString(ipp_tag_t group, ipp_tag_t valueTag, const QString &name, const QString &value)
{
Q_D(KIppRequest);
d->addRequest(group, valueTag, name.toUtf8(), value);
}
void KIppRequest::addStringList(ipp_tag_t group, ipp_tag_t valueTag, const QString &name, const QStringList &value)
{
Q_D(KIppRequest);
d->addRequest(group, valueTag, name.toUtf8(), value);
}
void KIppRequest::addInteger(ipp_tag_t group, ipp_tag_t valueTag, const QString &name, int value)
{
Q_D(KIppRequest);
d->addRequest(group, valueTag, name.toUtf8(), value);
}
void KIppRequest::addBoolean(ipp_tag_t group, const QString &name, bool value)
{
Q_D(KIppRequest);
d->addRequest(group, IPP_TAG_ZERO, name.toUtf8(), value);
}
void KIppRequest::addVariantValues(const QVariantHash &values)
{
QVariantHash::ConstIterator i = values.constBegin();
while (i != values.constEnd()) {
QString key = i.key();
QVariant value = i.value();
switch (value.type()) {
case QVariant::Bool:
// Still in use at add-printer/PageAddPrinter.cpp
if (key == QLatin1String(KCUPS_PRINTER_IS_ACCEPTING_JOBS)) {
addBoolean(IPP_TAG_PRINTER, key, value.toBool());
} else {
addBoolean(IPP_TAG_OPERATION, key, value.toBool());
}
break;
case QVariant::Int:
// Still in use at add-printer/PageAddPrinter.cpp
if (key == QLatin1String(KCUPS_PRINTER_STATE)) {
addInteger(IPP_TAG_PRINTER, IPP_TAG_ENUM, key, value.toInt());
} else {
addInteger(IPP_TAG_OPERATION, IPP_TAG_ENUM, key, value.toInt());
}
break;
case QVariant::String:
// Still in use at add-printer/*
if (key == QLatin1String(KCUPS_DEVICE_URI)) {
// device uri has a different TAG
addString(IPP_TAG_PRINTER, IPP_TAG_URI, key, value.toString());
} else if (key == QLatin1String(KCUPS_PRINTER_OP_POLICY) ||
key == QLatin1String(KCUPS_PRINTER_ERROR_POLICY) ||
key == QLatin1String("ppd-name")) {
// printer-op-policy has a different TAG
addString(IPP_TAG_PRINTER, IPP_TAG_NAME, key, value.toString());
} else if (key == QLatin1String(KCUPS_JOB_NAME)) {
addString(IPP_TAG_OPERATION, IPP_TAG_NAME, key, value.toString());
} else if (key == QLatin1String(KCUPS_WHICH_JOBS)) {
addString(IPP_TAG_OPERATION, IPP_TAG_KEYWORD, key, value.toString());
} else {
addString(IPP_TAG_PRINTER, IPP_TAG_TEXT, key, value.toString());
}
break;
case QVariant::StringList:
if (key == QLatin1String(KCUPS_MEMBER_URIS)) {
addStringList(IPP_TAG_PRINTER, IPP_TAG_URI, key, value.toStringList());
} else {
addStringList(IPP_TAG_PRINTER, IPP_TAG_NAME, key, value.toStringList());
}
break;
case QVariant::UInt:
addInteger(IPP_TAG_OPERATION, IPP_TAG_ENUM, key, value.toInt());
break;
default:
kWarning() << "type NOT recognized! This will be ignored:" << key << "values" << i.value();
}
++i;
}
}
void KIppRequest::addPrinterUri(const QString &printerName, bool isClass)
{
QString uri = assembleUrif(printerName, isClass);
addString(IPP_TAG_OPERATION, IPP_TAG_URI, KCUPS_PRINTER_URI, uri);
}
QString KIppRequest::assembleUrif(const QString &name, bool isClass)
{
char uri[HTTP_MAX_URI]; // printer URI
QByteArray resourcef;
if (isClass) {
resourcef = "/classes/%s";
} else {
resourcef = "/printers/%s";
}
const QByteArray destination = name.toUtf8();
httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", cupsUser(), "localhost",
ippPort(), resourcef.constData(), destination.constData());
return uri;
}
KIppRequest &KIppRequest::operator =(const KIppRequest &other)
{
Q_D(KIppRequest);
if (this == &other)
return *this;
*d = *other.d_ptr;
return *this;
}
void KIppRequestPrivate::addRequest(ipp_tag_t group, ipp_tag_t valueTag, const QString &name, const QVariant &value)
{
KCupsRawRequest request;
request.group = group;
request.valueTag = valueTag;
request.name = name;
request.value = value;
rawRequests << request;
}
void KIppRequestPrivate::addRawRequestsToIpp(ipp_t *ipp) const
{
// sort the values as CUPS requires it
qSort(rawRequests.begin(), rawRequests.end(), rawRequestGroupLessThan);
foreach (const KCupsRawRequest &request, rawRequests) {
switch (request.value.type()) {
case QVariant::Bool:
ippAddBoolean(ipp,
request.group,
request.name.toUtf8(),
request.value.toBool());
break;
case QVariant::Int:
case QVariant::UInt:
ippAddInteger(ipp,
request.group,
request.valueTag,
request.name.toUtf8(),
request.value.toInt());
break;
case QVariant::String:
ippAddString(ipp,
request.group,
request.valueTag,
request.name.toUtf8(),
"utf-8",
request.value.toString().toUtf8());
break;
case QVariant::StringList:
{
QStringList list = request.value.toStringList();
QList<QByteArray> valuesQByteArrayList;
const char **values = qStringListToCharPtrPtr(list, valuesQByteArrayList);
ippAddStrings(ipp,
request.group,
request.valueTag,
request.name.toUtf8(),
list.size(),
"utf-8",
values);
// ippAddStrings deep copies everything so we can throw away the values.
// the QBAList and content is auto discarded when going out of scope.
delete [] values;
break;
}
default:
kWarning() << "type NOT recognized! This will be ignored:" << request.name << "values" << request.value;
}
}
}

View file

@ -1,63 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2013 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef KIPPREQUEST_H
#define KIPPREQUEST_H
#include <KCupsConnection.h>
class KIppRequestPrivate;
class KDE_EXPORT KIppRequest
{
Q_DECLARE_PRIVATE(KIppRequest)
public:
KIppRequest();
KIppRequest(const KIppRequest &other);
KIppRequest(ipp_op_t operation, const char *resource, const QString &filename = QString());
~KIppRequest();
ipp_op_t operation() const;
QString resource() const;
QString filename() const;
ipp_t *sendIppRequest() const;
void addString(ipp_tag_t group, ipp_tag_t valueTag, const QString &name, const QString &value);
void addStringList(ipp_tag_t group, ipp_tag_t valueTag, const QString &name, const QStringList &value);
void addInteger(ipp_tag_t group, ipp_tag_t valueTag, const QString &name, int value);
void addBoolean(ipp_tag_t group, const QString &name, bool value);
void addVariantValues(const QVariantHash &values);
void addPrinterUri(const QString &printerName, bool isClass = false);
static QString assembleUrif(const QString &name, bool isClass);
/**
* Makes a copy of the KIppRequest object other.
*/
KIppRequest &operator=(const KIppRequest &other);
private:
KIppRequestPrivate *d_ptr;
};
Q_DECLARE_METATYPE(KIppRequest)
#endif // KIPPREQUEST_H

View file

@ -1,66 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2013 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef KIPPREQUEST_P_H
#define KIPPREQUEST_P_H
#include <KCupsConnection.h>
class KCupsRawRequest
{
public:
ipp_tag_t group;
ipp_tag_t valueTag;
QString name;
QVariant value;
};
class KIppRequestPrivate
{
public:
void addRequest(ipp_tag_t group, ipp_tag_t valueTag, const QString &name, const QVariant &value);
void addRawRequestsToIpp(ipp_t *ipp) const;
ipp_op_t operation;
QString resource;
QString filename;
mutable QList<KCupsRawRequest> rawRequests;
};
static const char **qStringListToCharPtrPtr(const QStringList &list, QList<QByteArray> &qbaList)
{
const char **ptr = new const char *[list.size() + 1];
qbaList.reserve(qbaList.size() + list.size());
QByteArray qba;
for (int i = 0; i < list.size(); ++i) {
qba = list.at(i).toUtf8();
qbaList.append(qba);
ptr[i] = qba.constData();
}
ptr[list.size()] = 0;
return ptr;
}
bool rawRequestGroupLessThan(const KCupsRawRequest &a, const KCupsRawRequest &b)
{
return a.group < b.group;
}
#endif // KIPPREQUEST_P_H

View file

@ -1,38 +0,0 @@
/***************************************************************************
* Copyright (C) 2012 by Daniel Nicoletti <dantti12@gmail.com> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "NoSelectionRectDelegate.h"
NoSelectionRectDelegate::NoSelectionRectDelegate(QObject *parent) :
QStyledItemDelegate(parent)
{
}
void NoSelectionRectDelegate::paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
// For some reason some styles don't honor the views SelectionRectVisible
// and I just hate that selection rect thing...
QStyleOptionViewItemV4 opt(option);
if (opt.state & QStyle::State_HasFocus) {
opt.state ^= QStyle::State_HasFocus;
}
QStyledItemDelegate::paint(painter, opt, index);
}

View file

@ -1,35 +0,0 @@
/***************************************************************************
* Copyright (C) 2012 by Daniel Nicoletti <dantti12@gmail.com> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef NOSELECTIONRECTDELEGATEEGATE_H
#define NOSELECTIONRECTDELEGATEEGATE_H
#include <QStyledItemDelegate>
#include <kdemacros.h>
class KDE_EXPORT NoSelectionRectDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
explicit NoSelectionRectDelegate(QObject *parent = 0);
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
#endif // NOSELECTIONRECTDELEGATEEGATE_H

View file

@ -1,126 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "PPDModel.h"
#include <KLocale>
#include <KDebug>
PPDModel::PPDModel(QObject *parent) :
QStandardItemModel(parent)
{
}
void PPDModel::setPPDs(const QList<QVariantHash> &ppds, const DriverMatchList &driverMatch)
{
clear();
QStandardItem *recommended = 0;
foreach (const DriverMatch &driver, driverMatch) {
// Find the matched PPD on the PPDs list
foreach (const QVariantHash &ppd, ppds) {
if (ppd["ppd-name"].toString() == driver.ppd) {
// Create the PPD
QStandardItem *ppdItem = createPPDItem(ppd, true);
if (recommended == 0) {
recommended = new QStandardItem;
recommended->setText(i18n("Recommended Drivers"));
appendRow(recommended);
}
recommended->appendRow(ppdItem);
break;
}
}
}
foreach (const QVariantHash &ppd, ppds) {
// Find or create the PPD parent (printer Make)
QStandardItem *makeItem = findCreateMake(ppd["ppd-make"].toString());
// Create the PPD
QStandardItem *ppdItem = createPPDItem(ppd, false);
makeItem->appendRow(ppdItem);
}
}
QStandardItem* PPDModel::findCreateMake(const QString &make)
{
for (int i = 0; i < rowCount(); ++i) {
QStandardItem *makeItem = item(i);
if (makeItem->text() == make) {
return makeItem;
}
}
QStandardItem *makeItem = new QStandardItem(make);
appendRow(makeItem);
return makeItem;
}
Qt::ItemFlags PPDModel::flags(const QModelIndex &index) const
{
Q_UNUSED(index)
return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
}
void PPDModel::clear()
{
// Remove all rows from the model
removeRows(0, rowCount());
}
QStandardItem *PPDModel::createPPDItem(const QVariantHash &ppd, bool recommended)
{
QStandardItem *ret = new QStandardItem;
QString make = ppd["ppd-make"].toString();
QString makeAndModel = ppd["ppd-make-and-model"].toString();
QString naturalLanguage = ppd["ppd-natural-language"].toString();
QString ppdName = ppd["ppd-name"].toString();
// Set this data before we change the makeAndModel
ret->setData(ppdName, PPDName);
ret->setData(make, PPDMake);
ret->setData(makeAndModel, PPDMakeAndModel);
QString text;
if (recommended) {
text = makeAndModel +
QLatin1String(" (") +
naturalLanguage +
QLatin1Char(')');
} else {
// Removes the Make part of the string
if (makeAndModel.startsWith(make)) {
makeAndModel.remove(0, make.size() + 1);
}
// Create the PPD
text = makeAndModel.trimmed() +
QLatin1String(" (") +
naturalLanguage +
QLatin1Char(')');
}
ret->setText(text);
return ret;
}

View file

@ -1,60 +0,0 @@
/***************************************************************************
* Copyright (C) 2010-2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef PPD_MODEL_H
#define PPD_MODEL_H
#include <QStandardItemModel>
#include <QtCore/qvariant.h>
struct DriverMatch{
QString ppd;
QString match;
};
typedef QList<DriverMatch> DriverMatchList;
class PPDModel : public QStandardItemModel
{
Q_OBJECT
Q_ENUMS(Role)
public:
typedef enum {
PPDName = Qt::UserRole,
PPDMake,
PPDMakeAndModel
} Role;
explicit PPDModel(QObject *parent = 0);
void setPPDs(const QList<QVariantHash> &ppds, const DriverMatchList &driverMatch = DriverMatchList());
Qt::ItemFlags flags(const QModelIndex &index) const;
void clear();
private:
QStandardItem* createPPDItem(const QVariantHash &ppd, bool recommended);
QStandardItem* findCreateMake(const QString &make);
QList<QVariantHash> m_ppds;
};
Q_DECLARE_METATYPE(DriverMatchList)
Q_DECLARE_METATYPE(DriverMatch)
#endif

View file

@ -1,553 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "PrinterModel.h"
#include <QDateTime>
#include <QMimeData>
#include <QDBusConnection>
#include <QtDBus/QDBusInterface>
#include <QPointer>
#include <KUser>
#include <KDebug>
#include <KLocale>
#include <KMessageBox>
#include <KCupsRequest.h>
#include <cups/cups.h>
PrinterModel::PrinterModel(QObject *parent) :
QStandardItemModel(parent),
m_unavailable(true)
{
m_attributes << KCUPS_PRINTER_NAME;
m_attributes << KCUPS_PRINTER_STATE;
m_attributes << KCUPS_PRINTER_STATE_MESSAGE;
m_attributes << KCUPS_PRINTER_IS_SHARED;
m_attributes << KCUPS_PRINTER_IS_ACCEPTING_JOBS;
m_attributes << KCUPS_PRINTER_TYPE;
m_attributes << KCUPS_PRINTER_LOCATION;
m_attributes << KCUPS_PRINTER_INFO;
m_attributes << KCUPS_PRINTER_MAKE_AND_MODEL;
m_attributes << KCUPS_PRINTER_COMMANDS;
m_attributes << KCUPS_MARKER_CHANGE_TIME;
m_attributes << KCUPS_MARKER_COLORS;
m_attributes << KCUPS_MARKER_LEVELS;
m_attributes << KCUPS_MARKER_NAMES;
m_attributes << KCUPS_MARKER_TYPES;
QHash<int, QByteArray> roles = roleNames();
roles[DestStatus] = "stateMessage";
roles[DestName] = "printerName";
roles[DestState] = "printerState";
roles[DestIsDefault] = "isDefault";
roles[DestIsShared] = "isShared";
roles[DestIsAcceptingJobs] = "isAcceptingJobs";
roles[DestIsPaused] = "isPaused";
roles[DestIsClass] = "isClass";
roles[DestLocation] = "location";
roles[DestDescription] = "info";
roles[DestKind] = "kind";
roles[DestType] = "type";
roles[DestCommands] = "commands";
roles[DestMarkerChangeTime] = "markerChangeTime";
roles[DestMarkers] = "markers";
roles[DestIconName] = "iconName";
roles[DestRemote] = "remote";
setRoleNames(roles);
// This is emitted when a printer is added
connect(KCupsConnection::global(),
SIGNAL(printerAdded(QString,QString,QString,uint,QString,bool)),
this,
SLOT(insertUpdatePrinter(QString,QString,QString,uint,QString,bool)));
// This is emitted when a printer is modified
connect(KCupsConnection::global(),
SIGNAL(printerModified(QString,QString,QString,uint,QString,bool)),
this,
SLOT(insertUpdatePrinter(QString,QString,QString,uint,QString,bool)));
// This is emitted when a printer has it's state changed
connect(KCupsConnection::global(),
SIGNAL(printerStateChanged(QString,QString,QString,uint,QString,bool)),
this,
SLOT(insertUpdatePrinter(QString,QString,QString,uint,QString,bool)));
// This is emitted when a printer is stopped
connect(KCupsConnection::global(),
SIGNAL(printerStopped(QString,QString,QString,uint,QString,bool)),
this,
SLOT(insertUpdatePrinter(QString,QString,QString,uint,QString,bool)));
// This is emitted when a printer is restarted
connect(KCupsConnection::global(),
SIGNAL(printerRestarted(QString,QString,QString,uint,QString,bool)),
this,
SLOT(insertUpdatePrinter(QString,QString,QString,uint,QString,bool)));
// This is emitted when a printer is shutdown
connect(KCupsConnection::global(),
SIGNAL(printerShutdown(QString,QString,QString,uint,QString,bool)),
this,
SLOT(insertUpdatePrinter(QString,QString,QString,uint,QString,bool)));
// This is emitted when a printer is removed
connect(KCupsConnection::global(),
SIGNAL(printerDeleted(QString,QString,QString,uint,QString,bool)),
this,
SLOT(printerRemoved(QString,QString,QString,uint,QString,bool)));
connect(KCupsConnection::global(), SIGNAL(serverAudit(QString)),
SLOT(serverChanged(QString)));
connect(KCupsConnection::global(), SIGNAL(serverStarted(QString)),
SLOT(serverChanged(QString)));
connect(KCupsConnection::global(), SIGNAL(serverStopped(QString)),
SLOT(serverChanged(QString)));
connect(KCupsConnection::global(), SIGNAL(serverRestarted(QString)),
SLOT(serverChanged(QString)));
// Deprecated stuff that works better than the above
connect(KCupsConnection::global(), SIGNAL(rhPrinterAdded(QString)),
this, SLOT(insertUpdatePrinter(QString)));
connect(KCupsConnection::global(), SIGNAL(rhPrinterRemoved(QString)),
this, SLOT(printerRemoved(QString)));
connect(KCupsConnection::global(), SIGNAL(rhQueueChanged(QString)),
this, SLOT(insertUpdatePrinter(QString)));
connect(this, SIGNAL(rowsInserted(QModelIndex,int,int)),
this, SLOT(slotCountChanged()));
connect(this, SIGNAL(rowsRemoved(QModelIndex,int,int)),
this, SLOT(slotCountChanged()));
connect(this, SIGNAL(modelReset()),
this, SLOT(slotCountChanged()));
update();
}
void PrinterModel::getDestsFinished()
{
KCupsRequest *request = qobject_cast<KCupsRequest *>(sender());
// When there is no printer IPP_NOT_FOUND is returned
if (request->hasError() && request->error() != IPP_NOT_FOUND) {
// clear the model after so that the proper widget can be shown
clear();
emit error(request->error(), request->serverError(), request->errorMsg());
if (request->error() == IPP_SERVICE_UNAVAILABLE && !m_unavailable) {
m_unavailable = true;
emit serverUnavailableChanged(m_unavailable);
}
} else {
if (m_unavailable) {
m_unavailable = false;
emit serverUnavailableChanged(m_unavailable);
}
KCupsPrinters printers = request->printers();
for (int i = 0; i < printers.size(); ++i) {
// If there is a printer and it's not the current one add it
// as a new destination
int dest_row = destRow(printers.at(i).name());
if (dest_row == -1) {
// not found, insert new one
insertDest(i, printers.at(i));
} else if (dest_row == i) {
// update the printer
updateDest(item(i), printers.at(i));
} else {
// found at wrong position
// take it and insert on the right position
QList<QStandardItem *> row = takeRow(dest_row);
insertRow(i, row);
updateDest(item(i), printers.at(i));
}
}
// remove old printers
// The above code starts from 0 and make sure
// dest == modelIndex(x) and if it's not the
// case it either inserts or moves it.
// so any item > num_jobs can be safely deleted
while (rowCount() > printers.size()) {
removeRow(rowCount() - 1);
}
emit error(IPP_OK, QString(), QString());
}
request->deleteLater();
}
void PrinterModel::slotCountChanged()
{
emit countChanged(rowCount());
}
QVariant PrinterModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (section == 0 && orientation == Qt::Horizontal && role == Qt::DisplayRole) {
return i18n("Printers");
}
return QVariant();
}
int PrinterModel::count() const
{
return rowCount();
}
bool PrinterModel::serverUnavailable() const
{
return m_unavailable;
}
void PrinterModel::pausePrinter(const QString &printerName)
{
QPointer<KCupsRequest> request = new KCupsRequest;
request->pausePrinter(printerName);
request->waitTillFinished();
if (request) {
request->deleteLater();
}
}
void PrinterModel::resumePrinter(const QString &printerName)
{
QPointer<KCupsRequest> request = new KCupsRequest;
request->resumePrinter(printerName);
request->waitTillFinished();
if (request) {
request->deleteLater();
}
}
void PrinterModel::rejectJobs(const QString &printerName)
{
QPointer<KCupsRequest> request = new KCupsRequest;
request->rejectJobs(printerName);
request->waitTillFinished();
if (request) {
request->deleteLater();
}
}
void PrinterModel::acceptJobs(const QString &printerName)
{
QPointer<KCupsRequest> request = new KCupsRequest;
request->acceptJobs(printerName);
request->waitTillFinished();
if (request) {
request->deleteLater();
}
}
void PrinterModel::update()
{
// kcmshell(6331) PrinterModel::update: (QHash(("printer-type", QVariant(int, 75534348) ) ( "marker-names" , QVariant(QStringList, ("Cyan", "Yellow", "Magenta", "Black") ) ) ( "printer-name" , QVariant(QString, "EPSON_Stylus_TX105") ) ( "marker-colors" , QVariant(QStringList, ("#00ffff", "#ffff00", "#ff00ff", "#000000") ) ) ( "printer-location" , QVariant(QString, "Luiz Vitors MacBook Pro") ) ( "marker-levels" , QVariant(QList<int>, ) ) ( "marker-types" , QVariant(QStringList, ("inkCartridge", "inkCartridge", "inkCartridge", "inkCartridge") ) ) ( "printer-is-shared" , QVariant(bool, true) ) ( "printer-state-message" , QVariant(QString, "") ) ( "printer-commands" , QVariant(QStringList, ("Clean", "PrintSelfTestPage", "ReportLevels") ) ) ( "marker-change-time" , QVariant(int, 1267903160) ) ( "printer-state" , QVariant(int, 3) ) ( "printer-info" , QVariant(QString, "EPSON Stylus TX105") ) ( "printer-make-and-model" , QVariant(QString, "EPSON TX105 Series") ) ) )
// Get destinations with these attributes
KCupsRequest *request = new KCupsRequest;
connect(request, SIGNAL(finished()), this, SLOT(getDestsFinished()));
request->getPrinters(m_attributes);
}
void PrinterModel::insertDest(int pos, const KCupsPrinter &printer)
{
// Create the printer item
QStandardItem *stdItem = new QStandardItem(printer.name());
stdItem->setData(printer.name(), DestName);
stdItem->setIcon(printer.icon());
// update the item
updateDest(stdItem, printer);
// insert the printer Item
insertRow(pos, stdItem);
}
void PrinterModel::updateDest(QStandardItem *destItem, const KCupsPrinter &printer)
{
// store if the printer is the network default
bool isDefault = printer.isDefault();
if (isDefault != destItem->data(DestIsDefault).toBool()) {
destItem->setData(isDefault, DestIsDefault);
}
// store the printer state
KCupsPrinter::Status state = printer.state();
if (state != qvariant_cast<KCupsPrinter::Status>(destItem->data(DestState))) {
destItem->setData(state, DestState);
}
kDebug() << state << printer.name();
// store if the printer is accepting jobs
bool accepting = printer.isAcceptingJobs();
if (accepting != destItem->data(DestIsAcceptingJobs).toBool()) {
destItem->setData(accepting, DestIsAcceptingJobs);
}
// store the printer status message
QString status = destStatus(state, printer.stateMsg(), accepting);
if (status != destItem->data(DestStatus).toString()) {
destItem->setData(status, DestStatus);
}
bool paused = (state == KCupsPrinter::Stopped || !accepting);
if (paused != destItem->data(DestIsPaused).toBool()) {
destItem->setData(paused, DestIsPaused);
}
// store if the printer is shared
bool shared = printer.isShared();
if (shared != destItem->data(DestIsShared).toBool()) {
destItem->setData(shared, DestIsShared);
}
// store if the printer is a class
// the printer-type param is a flag
bool isClass = printer.isClass();
if (isClass != destItem->data(DestIsClass).toBool()) {
destItem->setData(isClass, DestIsClass);
}
// store if the printer type
// the printer-type param is a flag
uint printerType = printer.type();
if (printerType != destItem->data(DestType).toUInt()) {
destItem->setData(printerType, DestType);
destItem->setData(printerType & CUPS_PRINTER_REMOTE, DestRemote);
}
// store the printer location
QString location = printer.location();
if (location != destItem->data(DestLocation).toString()) {
destItem->setData(location, DestLocation);
}
// store the printer icon name
QString iconName = printer.iconName();
if (iconName != destItem->data(DestIconName).toString()) {
destItem->setData(iconName, DestIconName);
}
if (destItem->data(DestName).toString() != destItem->text()){
if (destItem->text() != destItem->data(DestName).toString()){
destItem->setText(destItem->data(DestName).toString());
}
}
// store the printer description
QString description = printer.info();
if (description != destItem->data(DestDescription).toString()){
destItem->setData(description, DestDescription);
}
// store the printer kind
QString kind = printer.makeAndModel();
if (kind != destItem->data(DestKind).toString()) {
destItem->setData(kind, DestKind);
}
// store the printer commands
QStringList commands = printer.commands();
if (commands != destItem->data(DestCommands).toStringList()) {
destItem->setData(commands, DestCommands);
}
int markerChangeTime = printer.markerChangeTime();
if (markerChangeTime != destItem->data(DestMarkerChangeTime).toInt()) {
destItem->setData(printer.markerChangeTime(), DestMarkerChangeTime);
QVariantHash markers;
markers["marker-change-time"] = printer.markerChangeTime();
markers["marker-colors"] = printer.argument("marker-colors");
markers["marker-levels"] = printer.argument("marker-levels");
markers["marker-names"] = printer.argument("marker-names");
markers["marker-types"] = printer.argument("marker-types");
destItem->setData(markers, DestMarkers);
}
}
int PrinterModel::destRow(const QString &destName)
{
// find the position of the jobId inside the model
for (int i = 0; i < rowCount(); i++) {
if (destName == item(i)->data(DestName).toString())
{
return i;
}
}
// -1 if not found
return -1;
}
QString PrinterModel::destStatus(KCupsPrinter::Status state, const QString &message, bool isAcceptingJobs) const
{
switch (state) {
case KCupsPrinter::Idle:
if (message.isEmpty()){
return isAcceptingJobs ? i18n("Idle") : i18n("Idle, rejecting jobs");
} else {
return isAcceptingJobs ? i18n("Idle - '%1'", message) : i18n("Idle, rejecting jobs - '%1'", message);
}
case KCupsPrinter::Printing:
if (message.isEmpty()){
return i18n("In use");
} else {
return i18n("In use - '%1'", message);
}
case KCupsPrinter::Stopped:
if (message.isEmpty()){
return isAcceptingJobs ? i18n("Paused") : i18n("Paused, rejecting jobs");
} else {
return isAcceptingJobs ? i18n("Paused - '%1'", message) : i18n("Paused, rejecting jobs - '%1'", message);
}
default :
if (message.isEmpty()){
return i18n("Unknown");
} else {
return i18n("Unknown - '%1'", message);
}
}
}
void PrinterModel::clear()
{
removeRows(0, rowCount());
}
Qt::ItemFlags PrinterModel::flags(const QModelIndex &index) const
{
Q_UNUSED(index)
return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
}
void PrinterModel::insertUpdatePrinter(const QString &printerName)
{
KCupsRequest *request = new KCupsRequest;
connect(request, SIGNAL(finished()), this, SLOT(insertUpdatePrinterFinished()));
// TODO how do we know if it's a class if this DBus signal
// does not tell us
request->getPrinterAttributes(printerName, false, m_attributes);
}
void PrinterModel::insertUpdatePrinter(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs)
{
Q_UNUSED(text)
Q_UNUSED(printerUri)
Q_UNUSED(printerState)
Q_UNUSED(printerStateReasons)
Q_UNUSED(printerIsAcceptingJobs)
kDebug() << text << printerUri << printerName << printerState << printerStateReasons << printerIsAcceptingJobs;
insertUpdatePrinter(printerName);
}
void PrinterModel::insertUpdatePrinterFinished()
{
KCupsRequest *request = qobject_cast<KCupsRequest *>(sender());
if (!request->hasError()) {
foreach (const KCupsPrinter &printer, request->printers()) {
// If there is a printer and it's not the current one add it
// as a new destination
int dest_row = destRow(printer.name());
if (dest_row == -1) {
// not found, insert new one
insertDest(0, printer);
} else {
// update the printer
updateDest(item(dest_row), printer);
}
}
}
request->deleteLater();
}
void PrinterModel::printerRemoved(const QString &printerName)
{
kDebug() << printerName;
// Look for the removed printer
int dest_row = destRow(printerName);
if (dest_row != -1) {
removeRows(dest_row, 1);
}
}
void PrinterModel::printerRemoved(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs)
{
// REALLY? all these parameters just to say foo was deleted??
Q_UNUSED(text)
Q_UNUSED(printerUri)
Q_UNUSED(printerState)
Q_UNUSED(printerStateReasons)
Q_UNUSED(printerIsAcceptingJobs)
kDebug() << text << printerUri << printerName << printerState << printerStateReasons << printerIsAcceptingJobs;
// Look for the removed printer
int dest_row = destRow(printerName);
if (dest_row != -1) {
removeRows(dest_row, 1);
}
}
void PrinterModel::printerStateChanged(const QString &text, const QString &printerUri, const QString &printerName, uint printerState, const QString &printerStateReasons, bool printerIsAcceptingJobs)
{
kDebug() << text << printerUri << printerName << printerState << printerStateReasons << printerIsAcceptingJobs;
}
void PrinterModel::printerStopped(const QString &text, const QString &printerUri, const QString &printerName, uint printerState, const QString &printerStateReasons, bool printerIsAcceptingJobs)
{
kDebug() << text << printerUri << printerName << printerState << printerStateReasons << printerIsAcceptingJobs;
}
void PrinterModel::printerRestarted(const QString &text, const QString &printerUri, const QString &printerName, uint printerState, const QString &printerStateReasons, bool printerIsAcceptingJobs)
{
kDebug() << text << printerUri << printerName << printerState << printerStateReasons << printerIsAcceptingJobs;
}
void PrinterModel::printerShutdown(const QString &text, const QString &printerUri, const QString &printerName, uint printerState, const QString &printerStateReasons, bool printerIsAcceptingJobs)
{
kDebug() << text << printerUri << printerName << printerState << printerStateReasons << printerIsAcceptingJobs;
}
void PrinterModel::printerModified(const QString &text, const QString &printerUri, const QString &printerName, uint printerState, const QString &printerStateReasons, bool printerIsAcceptingJobs)
{
kDebug() << text << printerUri << printerName << printerState << printerStateReasons << printerIsAcceptingJobs;
}
void PrinterModel::serverChanged(const QString &text)
{
kDebug() << text;
update();
}
#include "moc_PrinterModel.cpp"

View file

@ -1,117 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef PRINTER_MODEL_H
#define PRINTER_MODEL_H
#include <QStandardItemModel>
#include <QTimer>
#include <KCupsPrinter.h>
class KDE_EXPORT PrinterModel : public QStandardItemModel
{
Q_OBJECT
Q_ENUMS(JobAction)
Q_ENUMS(Role)
Q_PROPERTY(int count READ count NOTIFY countChanged)
Q_PROPERTY(bool serverUnavailable READ serverUnavailable NOTIFY serverUnavailableChanged)
public:
enum Role {
DestStatus = Qt::UserRole,
DestState,
DestName,
DestIsDefault,
DestIsShared,
DestIsAcceptingJobs,
DestIsPaused,
DestIsClass,
DestLocation,
DestDescription,
DestKind,
DestType,
DestCommands,
DestMarkerChangeTime,
DestMarkers,
DestIconName,
DestRemote
};
enum JobAction {
Cancel,
Hold,
Release,
Move
};
explicit PrinterModel(QObject *parent = 0);
Qt::ItemFlags flags(const QModelIndex &index) const;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
int count() const;
bool serverUnavailable() const;
Q_INVOKABLE void pausePrinter(const QString &printerName);
Q_INVOKABLE void resumePrinter(const QString &printerName);
Q_INVOKABLE void rejectJobs(const QString &printerName);
Q_INVOKABLE void acceptJobs(const QString &printerName);
public slots:
void update();
void getDestsFinished();
void slotCountChanged();
signals:
void countChanged(int count);
void serverUnavailableChanged(bool unavailable);
void error(int lastError, const QString &errorTitle, const QString &errorMsg);
private slots:
void insertUpdatePrinter(const QString &printerName);
void insertUpdatePrinter(const QString &text,
const QString &printerUri,
const QString &printerName,
uint printerState,
const QString &printerStateReasons,
bool printerIsAcceptingJobs);
void insertUpdatePrinterFinished();
void printerRemoved(const QString &printerName);
void printerRemoved(const QString &text, const QString &printerUri, const QString &printerName, uint printerState, const QString &printerStateReasons, bool printerIsAcceptingJobs);
void printerStateChanged(const QString &text, const QString &printerUri, const QString &printerName, uint printerState, const QString &printerStateReasons, bool printerIsAcceptingJobs);
void printerStopped(const QString &text, const QString &printerUri, const QString &printerName, uint printerState, const QString &printerStateReasons, bool printerIsAcceptingJobs);
void printerRestarted(const QString &text, const QString &printerUri, const QString &printerName, uint printerState, const QString &printerStateReasons, bool printerIsAcceptingJobs);
void printerShutdown(const QString &text, const QString &printerUri, const QString &printerName, uint printerState, const QString &printerStateReasons, bool printerIsAcceptingJobs);
void printerModified(const QString &text, const QString &printerUri, const QString &printerName, uint printerState, const QString &printerStateReasons, bool printerIsAcceptingJobs);
void serverChanged(const QString &text);
private:
WId m_parentId;
QStringList m_attributes;
bool m_unavailable;
int destRow(const QString &destName);
void insertDest(int pos, const KCupsPrinter &printer);
void updateDest(QStandardItem *item, const KCupsPrinter &printer);
QString destStatus(KCupsPrinter::Status state, const QString &message, bool isAcceptingJobs) const;
void clear();
};
#endif // PRINTER_MODEL_H

View file

@ -1,96 +0,0 @@
/***************************************************************************
* Copyright (C) 2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "PrinterSortFilterModel.h"
#include "PrinterModel.h"
#include <KDebug>
PrinterSortFilterModel::PrinterSortFilterModel(QObject *parent) :
QSortFilterProxyModel(parent)
{
setDynamicSortFilter(true);
setSortCaseSensitivity(Qt::CaseInsensitive);
sort(0);
connect(this, SIGNAL(rowsInserted(QModelIndex,int,int)),
this, SIGNAL(countChanged()));
connect(this, SIGNAL(rowsRemoved(QModelIndex,int,int)),
this, SIGNAL(countChanged()));
connect(this, SIGNAL(modelReset()),
this, SIGNAL(countChanged()));
}
void PrinterSortFilterModel::setModel(QAbstractItemModel *model)
{
if (model == sourceModel()) {
return;
}
QSortFilterProxyModel::setSourceModel(model);
emit sourceModelChanged(model);
}
void PrinterSortFilterModel::setFilteredPrinters(const QString &printers)
{
kDebug() << rowCount() << printers << printers.split(QLatin1Char('|'));
if (printers.isEmpty()) {
m_filteredPrinters.clear();
} else {
m_filteredPrinters = printers.split(QLatin1Char('|'));
}
invalidateFilter();
emit filteredPrintersChanged();
}
QString PrinterSortFilterModel::filteredPrinters() const
{
return m_filteredPrinters.join(QLatin1String("|"));
}
int PrinterSortFilterModel::count() const
{
return rowCount();
}
bool PrinterSortFilterModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
QModelIndex index = sourceModel()->index(source_row, 0, source_parent);
// check if the printer is on the blacklist
if (!m_filteredPrinters.isEmpty()) {
return m_filteredPrinters.contains(index.data(PrinterModel::DestName).toString());
}
return true;
}
bool PrinterSortFilterModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
bool leftIsRemote = sourceModel()->data(left, PrinterModel::DestRemote).toBool();
bool rightIsRemote = sourceModel()->data(right, PrinterModel::DestRemote).toBool();
if (leftIsRemote != rightIsRemote) {
// If the right item is a remote the left should move right
return rightIsRemote;
}
return QSortFilterProxyModel::lessThan(left, right);
}

View file

@ -1,55 +0,0 @@
/***************************************************************************
* Copyright (C) 2012 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifndef PRINTERSORTFILTERMODEL_H
#define PRINTERSORTFILTERMODEL_H
#include <QSortFilterProxyModel>
#include <QDeclarativeItem>
#include <kdemacros.h>
class KDE_EXPORT PrinterSortFilterModel : public QSortFilterProxyModel
{
Q_OBJECT
Q_PROPERTY(QString filteredPrinters READ filteredPrinters WRITE setFilteredPrinters NOTIFY filteredPrintersChanged)
Q_PROPERTY(QAbstractItemModel *sourceModel READ sourceModel WRITE setModel NOTIFY sourceModelChanged)
Q_PROPERTY(int count READ count NOTIFY countChanged)
public:
explicit PrinterSortFilterModel(QObject *parent = 0);
void setModel(QAbstractItemModel *model);
void setFilteredPrinters(const QString &printers);
QString filteredPrinters() const;
int count() const;
signals:
void countChanged();
void sourceModelChanged(QObject *);
void filteredPrintersChanged();
private:
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
bool lessThan(const QModelIndex &left, const QModelIndex &right) const;
QStringList m_filteredPrinters;
};
#endif // PRINTERSORTFILTERMODEL_H

View file

@ -1,319 +0,0 @@
/***************************************************************************
* Copyright (C) 2010 by Daniel Nicoletti *
* dantti12@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; see the file COPYING. If not, write to *
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *
* Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "SelectMakeModel.h"
#include "ui_SelectMakeModel.h"
#include "PPDModel.h"
#include "KCupsRequest.h"
#include "NoSelectionRectDelegate.h"
#include <QStandardItemModel>
#include <QLineEdit>
#include <QtGui/qitemselectionmodel.h>
#include <QtDBus/QDBusMessage>
#include <QtDBus/QDBusConnection>
#include <QtDBus/QDBusReply>
#include <QtDBus/QDBusMetaType>
#include <KMessageBox>
#include <KDebug>
#include <KLocale>
// Marshall the MyStructure data into a D-Bus argument
QDBusArgument &operator<<(QDBusArgument &argument, const DriverMatch &driverMatch)
{
argument.beginStructure();
argument << driverMatch.ppd << driverMatch.match;
argument.endStructure();
return argument;
}
// Retrieve the MyStructure data from the D-Bus argument
const QDBusArgument &operator>>(const QDBusArgument &argument, DriverMatch &driverMatch)
{
argument.beginStructure();
argument >> driverMatch.ppd >> driverMatch.match;
argument.endStructure();
return argument;
}
SelectMakeModel::SelectMakeModel(QWidget *parent) :
QWidget(parent),
ui(new Ui_SelectMakeModel),
m_ppdRequest(0),
m_gotBestDrivers(false),
m_hasRecommended(false)
{
ui->setupUi(this);
// Configure the erro message widget
ui->messageWidget->setMessageType(KMessageWidget::Error);
ui->messageWidget->hide();
m_sourceModel = new PPDModel(this);
ui->makeView->setModel(m_sourceModel);
ui->makeView->setItemDelegate(new NoSelectionRectDelegate(this));
// Updates the PPD view to the selected Make
connect(ui->makeView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
ui->ppdsLV, SLOT(setRootIndex(QModelIndex)));
ui->ppdsLV->setModel(m_sourceModel);
ui->ppdsLV->setItemDelegate(new NoSelectionRectDelegate(this));
connect(m_sourceModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
this, SLOT(checkChanged()));
// Clear the PPD view selection, so the Next/Finish button gets disabled
connect(ui->makeView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
ui->ppdsLV->selectionModel(), SLOT(clearSelection()));
// Make sure we update the Next/Finish button if a PPD is selected
connect(ui->ppdsLV->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
this, SLOT(checkChanged()));
// When the radio button changes the signal must be emitted
connect(ui->ppdFileRB, SIGNAL(toggled(bool)), this, SLOT(checkChanged()));
connect(ui->ppdFilePathUrl, SIGNAL(textChanged(QString)), this, SLOT(checkChanged()));
qDBusRegisterMetaType<DriverMatch>();
qDBusRegisterMetaType<DriverMatchList>();
}
SelectMakeModel::~SelectMakeModel()
{
delete ui;
}
void SelectMakeModel::setDeviceInfo(const QString &deviceId, const QString &make, const QString &makeAndModel, const QString &deviceUri)
{
kDebug() << "===================================" << deviceId << makeAndModel << deviceUri;
m_gotBestDrivers = false;
m_hasRecommended = false;
m_make = make;
m_makeAndModel = makeAndModel;
// Get the best drivers
QDBusMessage message;
message = QDBusMessage::createMethodCall(QLatin1String("org.fedoraproject.Config.Printing"),
QLatin1String("/org/fedoraproject/Config/Printing"),
QLatin1String("org.fedoraproject.Config.Printing"),
QLatin1String("GetBestDrivers"));
message << deviceId;
message << makeAndModel;
message << deviceUri;
QDBusConnection::sessionBus().callWithCallback(message,
this,
SLOT(getBestDriversFinished(QDBusMessage)),
SLOT(getBestDriversFailed(QDBusError,QDBusMessage)));
if (!m_ppdRequest) {
m_ppdRequest = new KCupsRequest;
connect(m_ppdRequest, SIGNAL(finished()), this, SLOT(ppdsLoaded()));
m_ppdRequest->getPPDS();
}
}
void SelectMakeModel::setMakeModel(const QString &make, const QString &makeAndModel)
{
if (!m_ppdRequest) {
// We won't try to get the best driver
// we should be we need more info and testing
// TODO
m_gotBestDrivers = true;
m_hasRecommended = false;
m_make = make;
m_makeAndModel = makeAndModel;
m_ppdRequest = new KCupsRequest;
connect(m_ppdRequest, SIGNAL(finished()), this, SLOT(ppdsLoaded()));
m_ppdRequest->getPPDS();
} else {
// TODO test this
setModelData();
}
}
void SelectMakeModel::ppdsLoaded()
{
if (m_ppdRequest->hasError()) {
kWarning() << "Failed to get PPDs" << m_ppdRequest->errorMsg();
ui->messageWidget->setText(i18n("Failed to get a list of drivers: '%1'", m_ppdRequest->errorMsg()));
ui->messageWidget->animatedShow();
// Force the changed signal to be sent
checkChanged();
m_ppdRequest = 0;
} else {
m_ppds = m_ppdRequest->ppds();
// Try to show the PPDs
setModelData();
}
sender()->deleteLater();
}
void SelectMakeModel::checkChanged()
{
kDebug();
if (isFileSelected()) {
emit changed(!selectedPPDFileName().isNull());
} else {
// enable or disable the job action buttons if something is selected
emit changed(!selectedPPDName().isNull());
selectFirstMake();
}
}
QString SelectMakeModel::selectedPPDName() const
{
QItemSelection ppdSelection = ui->ppdsLV->selectionModel()->selection();
if (!isFileSelected() && !ppdSelection.indexes().isEmpty()) {
QModelIndex index = ppdSelection.indexes().first();
return index.data(PPDModel::PPDName).toString();
}
return QString();
}
QString SelectMakeModel::selectedPPDMakeAndModel() const
{
QItemSelection ppdSelection = ui->ppdsLV->selectionModel()->selection();
if (!isFileSelected() && !ppdSelection.indexes().isEmpty()) {
QModelIndex index = ppdSelection.indexes().first();
return index.data(PPDModel::PPDMakeAndModel).toString();
}
return QString();
}
QString SelectMakeModel::selectedPPDFileName() const
{
if (isFileSelected()) {
QFileInfo file = ui->ppdFilePathUrl->url().toLocalFile();
kDebug() << ui->ppdFilePathUrl->url().toLocalFile() << file.isFile() << file.filePath();
if (file.isFile()) {
return file.filePath();
}
}
return QString();
}
bool SelectMakeModel::isFileSelected() const
{
kDebug() << ui->ppdFileRB->isChecked();
return ui->ppdFileRB->isChecked();
}
void SelectMakeModel::getBestDriversFinished(const QDBusMessage &message)
{
if (message.type() == QDBusMessage::ReplyMessage && message.arguments().size() == 1) {
QDBusArgument argument = message.arguments().first().value<QDBusArgument>();
m_driverMatchList = qdbus_cast<DriverMatchList>(argument);
m_hasRecommended = !m_driverMatchList.isEmpty();
foreach (const DriverMatch &driverMatch, m_driverMatchList) {
kDebug() << driverMatch.ppd << driverMatch.match;
}
} else {
kWarning() << "Unexpected message" << message;
}
m_gotBestDrivers = true;
setModelData();
}
void SelectMakeModel::getBestDriversFailed(const QDBusError &error, const QDBusMessage &message)
{
kWarning() << "Failed to get best drivers" << error << message;
// Show the PPDs anyway
m_gotBestDrivers = true;
ui->messageWidget->setText(i18n("Failed to search for a recommended driver: '%1'", error.message()));
ui->messageWidget->animatedShow();
setModelData();
}
void SelectMakeModel::setModelData()
{
if (!m_ppds.isEmpty() && m_gotBestDrivers) {
m_sourceModel->setPPDs(m_ppds, m_driverMatchList);
// Pre-select the first Recommended PPD
if (m_hasRecommended) {
selectRecommendedPPD();
} else if (!m_ppds.isEmpty() && !m_make.isEmpty()) {
selectMakeModelPPD();
}
// Force changed signal to be emitted
checkChanged();
}
}
void SelectMakeModel::selectFirstMake()
{
QItemSelection selection;
selection = ui->makeView->selectionModel()->selection();
// Make sure the first make is selected
if (selection.indexes().isEmpty() && m_sourceModel->rowCount() > 0) {
ui->makeView->selectionModel()->setCurrentIndex(m_sourceModel->index(0, 0),
QItemSelectionModel::SelectCurrent);
}
}
void SelectMakeModel::selectMakeModelPPD()
{
QList<QStandardItem*> makes = m_sourceModel->findItems(m_make);
foreach (QStandardItem *make, makes) {
// Check if the item is in this make
for (int i = 0; i < make->rowCount(); i++) {
if (make->child(i)->data(PPDModel::PPDMakeAndModel).toString() == m_makeAndModel) {
ui->makeView->selectionModel()->setCurrentIndex(make->index(),
QItemSelectionModel::SelectCurrent);
ui->ppdsLV->selectionModel()->setCurrentIndex(make->child(i)->index(),
QItemSelectionModel::SelectCurrent);
return;
}
}
}
// the exact PPD wasn't found try to select just the make
if (!makes.isEmpty()) {
ui->makeView->selectionModel()->setCurrentIndex(makes.first()->index(),
QItemSelectionModel::SelectCurrent);
}
}
void SelectMakeModel::selectRecommendedPPD()
{
// Force the first make to be selected
selectFirstMake();
QItemSelection ppdSelection = ui->ppdsLV->selectionModel()->selection();
if (ppdSelection.indexes().isEmpty()) {
QItemSelection makeSelection = ui->makeView->selectionModel()->selection();
QModelIndex parent = makeSelection.indexes().first();
if (parent.isValid()) {
ui->ppdsLV->selectionModel()->setCurrentIndex(m_sourceModel->index(0, 0, parent),
QItemSelectionModel::SelectCurrent);
}
}
}

Some files were not shown because too many files have changed in this diff Show more