First SVN commit
authorhqh <heikki.holstila@gmail.com>
Wed, 11 Aug 2010 14:03:00 +0000 (14:03 +0000)
committerhqh <heikki.holstila@gmail.com>
Wed, 11 Aug 2010 14:03:00 +0000 (14:03 +0000)
git-svn-id: file:///svnroot/fapman@1 65462ec1-f20d-4271-9e51-eec879a7709d

121 files changed:
COPYING [new file with mode: 0644]
Makefile [new file with mode: 0644]
TODO.txt [new file with mode: 0644]
aaptinterface.cpp [new file with mode: 0644]
aaptinterface.h [new file with mode: 0644]
apt-src/COPYING [new file with mode: 0644]
apt-src/cacheiterators.h [new file with mode: 0644]
apt-src/debversion.cc [new file with mode: 0644]
apt-src/debversion.h [new file with mode: 0644]
apt-src/fileutl.h [new file with mode: 0644]
apt-src/mmap.h [new file with mode: 0644]
apt-src/pkgcache.h [new file with mode: 0644]
apt-src/strutl.h [new file with mode: 0644]
apt-src/version.cc [new file with mode: 0644]
apt-src/version.h [new file with mode: 0644]
blacklistselect.cpp [new file with mode: 0644]
blacklistselect.h [new file with mode: 0644]
blacklistselect.ui [new file with mode: 0644]
confirmdialog.cpp [new file with mode: 0644]
confirmdialog.h [new file with mode: 0644]
confirmdialog.ui [new file with mode: 0644]
debian/README [new file with mode: 0644]
debian/README.Debian [new file with mode: 0644]
debian/changelog [new file with mode: 0644]
debian/compat [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/dirs [new file with mode: 0644]
debian/docs [new file with mode: 0644]
debian/fapman.debhelper.log [new file with mode: 0644]
debian/fapman.doc-base.EX [new file with mode: 0644]
debian/fapman.substvars [new file with mode: 0644]
debian/fapman.tarlist [new file with mode: 0644]
debian/fapman/DEBIAN/control [new file with mode: 0644]
debian/fapman/DEBIAN/md5sums [new file with mode: 0644]
debian/fapman/DEBIAN/postinst [new file with mode: 0755]
debian/fapman/DEBIAN/postrm [new file with mode: 0755]
debian/fapman/usr/local/bin/fapman [new file with mode: 0755]
debian/files [new file with mode: 0644]
debian/optify [new file with mode: 0644]
debian/postinst [new file with mode: 0644]
debian/postrm [new file with mode: 0644]
debian/rules [new file with mode: 0755]
debian/rules.backup [new file with mode: 0644]
dimmer.cpp [new file with mode: 0644]
dimmer.h [new file with mode: 0644]
dpkginterface.cpp [new file with mode: 0644]
dpkginterface.h [new file with mode: 0644]
fapman [new file with mode: 0755]
fapman.pro [new file with mode: 0644]
fapman.pro.user [new file with mode: 0644]
filterselect.cpp [new file with mode: 0644]
filterselect.h [new file with mode: 0644]
filterselect.ui [new file with mode: 0644]
help.cpp [new file with mode: 0644]
help.h [new file with mode: 0644]
help.ui [new file with mode: 0644]
icons/appdefault.png [new file with mode: 0644]
icons/background.png [new file with mode: 0644]
icons/blacklist.png [new file with mode: 0644]
icons/close.png [new file with mode: 0644]
icons/commit.png [new file with mode: 0644]
icons/fapman.png [new file with mode: 0644]
icons/filter_cat.png [new file with mode: 0644]
icons/filter_stat.png [new file with mode: 0644]
icons/install.png [new file with mode: 0644]
icons/pkg_install.png [new file with mode: 0644]
icons/pkg_nop_installed.png [new file with mode: 0644]
icons/pkg_nop_instupgr.png [new file with mode: 0644]
icons/pkg_nop_notinstalled.png [new file with mode: 0644]
icons/pkg_remove.png [new file with mode: 0644]
icons/pkg_upgrade.png [new file with mode: 0644]
icons/remove.png [new file with mode: 0644]
icons/repos.png [new file with mode: 0644]
icons/searchoptions.png [new file with mode: 0644]
icons/sort.png [new file with mode: 0644]
icons/update.png [new file with mode: 0644]
icons/upgrade.png [new file with mode: 0644]
logview.cpp [new file with mode: 0644]
logview.h [new file with mode: 0644]
logview.ui [new file with mode: 0644]
main.cpp [new file with mode: 0644]
mainwindow.cpp [new file with mode: 0644]
mainwindow.h [new file with mode: 0644]
mainwindow.ui [new file with mode: 0644]
misc/fapman.desktop [new file with mode: 0644]
misc/fapman.desktop.backup [new file with mode: 0644]
misc/fapman.launch [new file with mode: 0644]
misc/fapman.service [new file with mode: 0644]
misc/fapman.sudoers [new file with mode: 0644]
misc/style.css [new file with mode: 0644]
package.cpp [new file with mode: 0644]
package.h [new file with mode: 0644]
packageselector.cpp [new file with mode: 0644]
packageselector.h [new file with mode: 0644]
packageselector.ui [new file with mode: 0644]
packageview.cpp [new file with mode: 0644]
packageview.h [new file with mode: 0644]
packageview.ui [new file with mode: 0644]
repoedit.cpp [new file with mode: 0644]
repoedit.h [new file with mode: 0644]
repoedit.ui [new file with mode: 0644]
repository.cpp [new file with mode: 0644]
repository.h [new file with mode: 0644]
repoview.cpp [new file with mode: 0644]
repoview.h [new file with mode: 0644]
repoview.ui [new file with mode: 0644]
resources.qrc [new file with mode: 0644]
rotatingbackground.cpp [new file with mode: 0644]
rotatingbackground.h [new file with mode: 0644]
searchoptions.cpp [new file with mode: 0644]
searchoptions.h [new file with mode: 0644]
searchoptions.ui [new file with mode: 0644]
settings.cpp [new file with mode: 0644]
settings.h [new file with mode: 0644]
settings.ui [new file with mode: 0644]
sortselector.cpp [new file with mode: 0644]
sortselector.h [new file with mode: 0644]
sortselector.ui [new file with mode: 0644]
updateversion.sh [new file with mode: 0755]
version.h [new file with mode: 0644]

diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..94a9ed0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  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
+them 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 prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  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.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey 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;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If 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 convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU 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 that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  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.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+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.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     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
+state 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 3 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, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program 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, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU 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.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..508ca48
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,643 @@
+#############################################################################
+# Makefile for building: fapman
+# Generated by qmake (2.01a) (Qt 4.6.2) on: Wed Aug 11 16:25:55 2010
+# Project:  fapman.pro
+# Template: app
+# Command: /usr/bin/qmake -unix -o Makefile fapman.pro
+#############################################################################
+
+####### Compiler, tools and options
+
+CC            = gcc
+CXX           = g++
+DEFINES       = -DQT_GL_NO_SCISSOR_TEST -DQT_DEFAULT_TEXTURE_GLYPH_CACHE_WIDTH=1024 -DQT_NO_DEBUG -DQT_MAEMO5_LIB -DQT_PHONON_LIB -DQT_DBUS_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED
+CFLAGS        = -pipe -O3 -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wall -W -D_REENTRANT $(DEFINES)
+CXXFLAGS      = -pipe -O3 -fno-omit-frame-pointer -fno-optimize-sibling-calls -Wall -W -D_REENTRANT $(DEFINES)
+INCPATH       = -I/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/linux-g++-maemo5 -I. -I/targets/FREMANTLE_ARMEL/usr/include/QtCore -I/targets/FREMANTLE_ARMEL/usr/include/QtNetwork -I/targets/FREMANTLE_ARMEL/usr/include/QtGui -I/targets/FREMANTLE_ARMEL/usr/include/QtDBus -I/targets/FREMANTLE_ARMEL/usr/include/phonon -I/targets/FREMANTLE_ARMEL/usr/include/QtMaemo5 -I/targets/FREMANTLE_ARMEL/usr/include -I/usr/include/phonon_compat -I. -I.
+LINK          = g++
+LFLAGS        = -Wl,-rpath-link,/usr/lib -Wl,-O1 -Wl,--hash-style=gnu -Wl,-rpath,/usr/lib
+LIBS          = $(SUBLIBS)  -L/usr/lib -lQtMaemo5 -L/usr/lib -L/usr/X11R6/lib -lphonon -lQtGui -lQtNetwork -lQtDBus -lQtXml -lQtCore -lpthread 
+AR            = ar cqs
+RANLIB        = 
+QMAKE         = /usr/bin/qmake
+TAR           = tar -cf
+COMPRESS      = gzip -9f
+COPY          = cp -f
+SED           = sed
+COPY_FILE     = $(COPY)
+COPY_DIR      = $(COPY) -r
+STRIP         = strip
+INSTALL_FILE  = install -m 644 -p
+INSTALL_DIR   = $(COPY_DIR)
+INSTALL_PROGRAM = install -m 755 -p
+DEL_FILE      = rm -f
+SYMLINK       = ln -f -s
+DEL_DIR       = rmdir
+MOVE          = mv -f
+CHK_DIR_EXISTS= test -d
+MKDIR         = mkdir -p
+
+####### Output directory
+
+OBJECTS_DIR   = ./
+
+####### Files
+
+SOURCES       = main.cpp \
+               mainwindow.cpp \
+               package.cpp \
+               packageview.cpp \
+               filterselect.cpp \
+               confirmdialog.cpp \
+               dimmer.cpp \
+               repoview.cpp \
+               packageselector.cpp \
+               help.cpp \
+               settings.cpp \
+               aaptinterface.cpp \
+               repository.cpp \
+               repoedit.cpp \
+               logview.cpp \
+               apt-src/debversion.cc \
+               apt-src/version.cc \
+               sortselector.cpp \
+               blacklistselect.cpp \
+               rotatingbackground.cpp \
+               searchoptions.cpp \
+               dpkginterface.cpp moc_mainwindow.cpp \
+               moc_packageview.cpp \
+               moc_filterselect.cpp \
+               moc_confirmdialog.cpp \
+               moc_dimmer.cpp \
+               moc_repoview.cpp \
+               moc_packageselector.cpp \
+               moc_help.cpp \
+               moc_settings.cpp \
+               moc_aaptinterface.cpp \
+               moc_repoedit.cpp \
+               moc_logview.cpp \
+               moc_sortselector.cpp \
+               moc_blacklistselect.cpp \
+               moc_rotatingbackground.cpp \
+               moc_searchoptions.cpp \
+               moc_dpkginterface.cpp \
+               qrc_resources.cpp
+OBJECTS       = main.o \
+               mainwindow.o \
+               package.o \
+               packageview.o \
+               filterselect.o \
+               confirmdialog.o \
+               dimmer.o \
+               repoview.o \
+               packageselector.o \
+               help.o \
+               settings.o \
+               aaptinterface.o \
+               repository.o \
+               repoedit.o \
+               logview.o \
+               debversion.o \
+               version.o \
+               sortselector.o \
+               blacklistselect.o \
+               rotatingbackground.o \
+               searchoptions.o \
+               dpkginterface.o \
+               moc_mainwindow.o \
+               moc_packageview.o \
+               moc_filterselect.o \
+               moc_confirmdialog.o \
+               moc_dimmer.o \
+               moc_repoview.o \
+               moc_packageselector.o \
+               moc_help.o \
+               moc_settings.o \
+               moc_aaptinterface.o \
+               moc_repoedit.o \
+               moc_logview.o \
+               moc_sortselector.o \
+               moc_blacklistselect.o \
+               moc_rotatingbackground.o \
+               moc_searchoptions.o \
+               moc_dpkginterface.o \
+               qrc_resources.o
+DIST          = /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/common/unix.conf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/common/linux.conf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/qconfig.pri \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/qt_functions.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/qt_config.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/exclusive_builds.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/default_pre.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/release.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/default_post.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/warn_on.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/qt.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/moc.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/dbusinterfaces.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/dbusadaptors.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/unix/thread.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/resources.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/uic.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/yacc.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/lex.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/include_source_dir.prf \
+               fapman.pro
+QMAKE_TARGET  = fapman
+DESTDIR       = 
+TARGET        = fapman
+
+first: all
+####### Implicit rules
+
+.SUFFIXES: .o .c .cpp .cc .cxx .C
+
+.cpp.o:
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+.cc.o:
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+.cxx.o:
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+.C.o:
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
+
+.c.o:
+       $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"
+
+####### Build rules
+
+all: Makefile $(TARGET)
+
+$(TARGET): ui_mainwindow.h ui_packageview.h ui_filterselect.h ui_confirmdialog.h ui_repoview.h ui_packageselector.h ui_help.h ui_settings.h ui_repoedit.h ui_logview.h ui_sortselector.h ui_blacklistselect.h ui_searchoptions.h $(OBJECTS)  
+       $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
+
+Makefile: fapman.pro  /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/linux-g++-maemo5/qmake.conf /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/common/unix.conf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/common/linux.conf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/qconfig.pri \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/qt_functions.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/qt_config.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/exclusive_builds.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/default_pre.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/release.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/default_post.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/warn_on.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/qt.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/moc.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/dbusinterfaces.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/dbusadaptors.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/unix/thread.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/resources.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/uic.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/yacc.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/lex.prf \
+               /targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/include_source_dir.prf \
+               /usr/lib/libQtMaemo5.prl \
+               /usr/lib/libQtDBus.prl \
+               /usr/lib/libQtXml.prl \
+               /usr/lib/libQtCore.prl \
+               /usr/lib/libQtGui.prl \
+               /usr/lib/libphonon.prl \
+               /usr/lib/libQtNetwork.prl
+       $(QMAKE) -unix -o Makefile fapman.pro
+/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/common/unix.conf:
+/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/common/linux.conf:
+/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/qconfig.pri:
+/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/qt_functions.prf:
+/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/qt_config.prf:
+/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/exclusive_builds.prf:
+/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/default_pre.prf:
+/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/release.prf:
+/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/default_post.prf:
+/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/warn_on.prf:
+/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/qt.prf:
+/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/moc.prf:
+/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/dbusinterfaces.prf:
+/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/dbusadaptors.prf:
+/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/unix/thread.prf:
+/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/resources.prf:
+/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/uic.prf:
+/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/yacc.prf:
+/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/lex.prf:
+/targets/FREMANTLE_ARMEL/usr/share/qt4/mkspecs/features/include_source_dir.prf:
+/usr/lib/libQtMaemo5.prl:
+/usr/lib/libQtDBus.prl:
+/usr/lib/libQtXml.prl:
+/usr/lib/libQtCore.prl:
+/usr/lib/libQtGui.prl:
+/usr/lib/libphonon.prl:
+/usr/lib/libQtNetwork.prl:
+qmake:  FORCE
+       @$(QMAKE) -unix -o Makefile fapman.pro
+
+dist: 
+       @$(CHK_DIR_EXISTS) .tmp/fapman1.0.0 || $(MKDIR) .tmp/fapman1.0.0 
+       $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/fapman1.0.0/ && $(COPY_FILE) --parents mainwindow.h package.h packageview.h filterselect.h confirmdialog.h dimmer.h repoview.h packageselector.h help.h settings.h aaptinterface.h repository.h repoedit.h logview.h apt-src/version.h apt-src/strutl.h apt-src/pkgcache.h apt-src/mmap.h apt-src/debversion.h apt-src/fileutl.h apt-src/cacheiterators.h sortselector.h blacklistselect.h rotatingbackground.h searchoptions.h dpkginterface.h .tmp/fapman1.0.0/ && $(COPY_FILE) --parents resources.qrc .tmp/fapman1.0.0/ && $(COPY_FILE) --parents main.cpp mainwindow.cpp package.cpp packageview.cpp filterselect.cpp confirmdialog.cpp dimmer.cpp repoview.cpp packageselector.cpp help.cpp settings.cpp aaptinterface.cpp repository.cpp repoedit.cpp logview.cpp apt-src/debversion.cc apt-src/version.cc sortselector.cpp blacklistselect.cpp rotatingbackground.cpp searchoptions.cpp dpkginterface.cpp .tmp/fapman1.0.0/ && $(COPY_FILE) --parents mainwindow.ui packageview.ui filterselect.ui confirmdialog.ui repoview.ui packageselector.ui help.ui settings.ui repoedit.ui logview.ui sortselector.ui blacklistselect.ui searchoptions.ui .tmp/fapman1.0.0/ && (cd `dirname .tmp/fapman1.0.0` && $(TAR) fapman1.0.0.tar fapman1.0.0 && $(COMPRESS) fapman1.0.0.tar) && $(MOVE) `dirname .tmp/fapman1.0.0`/fapman1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/fapman1.0.0
+
+
+clean:compiler_clean 
+       -$(DEL_FILE) $(OBJECTS)
+       -$(DEL_FILE) *~ core *.core
+
+
+####### Sub-libraries
+
+distclean: clean
+       -$(DEL_FILE) $(TARGET) 
+       -$(DEL_FILE) Makefile
+
+
+mocclean: compiler_moc_header_clean compiler_moc_source_clean
+
+mocables: compiler_moc_header_make_all compiler_moc_source_make_all
+
+compiler_moc_header_make_all: moc_mainwindow.cpp moc_packageview.cpp moc_filterselect.cpp moc_confirmdialog.cpp moc_dimmer.cpp moc_repoview.cpp moc_packageselector.cpp moc_help.cpp moc_settings.cpp moc_aaptinterface.cpp moc_repoedit.cpp moc_logview.cpp moc_sortselector.cpp moc_blacklistselect.cpp moc_rotatingbackground.cpp moc_searchoptions.cpp moc_dpkginterface.cpp
+compiler_moc_header_clean:
+       -$(DEL_FILE) moc_mainwindow.cpp moc_packageview.cpp moc_filterselect.cpp moc_confirmdialog.cpp moc_dimmer.cpp moc_repoview.cpp moc_packageselector.cpp moc_help.cpp moc_settings.cpp moc_aaptinterface.cpp moc_repoedit.cpp moc_logview.cpp moc_sortselector.cpp moc_blacklistselect.cpp moc_rotatingbackground.cpp moc_searchoptions.cpp moc_dpkginterface.cpp
+moc_mainwindow.cpp: aaptinterface.h \
+               blacklistselect.h \
+               mainwindow.h
+       /usr/bin/moc $(DEFINES) $(INCPATH) mainwindow.h -o moc_mainwindow.cpp
+
+moc_packageview.cpp: mainwindow.h \
+               aaptinterface.h \
+               blacklistselect.h \
+               package.h \
+               packageview.h
+       /usr/bin/moc $(DEFINES) $(INCPATH) packageview.h -o moc_packageview.cpp
+
+moc_filterselect.cpp: filterselect.h
+       /usr/bin/moc $(DEFINES) $(INCPATH) filterselect.h -o moc_filterselect.cpp
+
+moc_confirmdialog.cpp: confirmdialog.h
+       /usr/bin/moc $(DEFINES) $(INCPATH) confirmdialog.h -o moc_confirmdialog.cpp
+
+moc_dimmer.cpp: dimmer.h
+       /usr/bin/moc $(DEFINES) $(INCPATH) dimmer.h -o moc_dimmer.cpp
+
+moc_repoview.cpp: repoview.h
+       /usr/bin/moc $(DEFINES) $(INCPATH) repoview.h -o moc_repoview.cpp
+
+moc_packageselector.cpp: package.h \
+               blacklistselect.h \
+               packageselector.h
+       /usr/bin/moc $(DEFINES) $(INCPATH) packageselector.h -o moc_packageselector.cpp
+
+moc_help.cpp: help.h
+       /usr/bin/moc $(DEFINES) $(INCPATH) help.h -o moc_help.cpp
+
+moc_settings.cpp: settings.h
+       /usr/bin/moc $(DEFINES) $(INCPATH) settings.h -o moc_settings.cpp
+
+moc_aaptinterface.cpp: blacklistselect.h \
+               aaptinterface.h
+       /usr/bin/moc $(DEFINES) $(INCPATH) aaptinterface.h -o moc_aaptinterface.cpp
+
+moc_repoedit.cpp: repoedit.h
+       /usr/bin/moc $(DEFINES) $(INCPATH) repoedit.h -o moc_repoedit.cpp
+
+moc_logview.cpp: logview.h
+       /usr/bin/moc $(DEFINES) $(INCPATH) logview.h -o moc_logview.cpp
+
+moc_sortselector.cpp: packageview.h \
+               mainwindow.h \
+               aaptinterface.h \
+               blacklistselect.h \
+               package.h \
+               sortselector.h
+       /usr/bin/moc $(DEFINES) $(INCPATH) sortselector.h -o moc_sortselector.cpp
+
+moc_blacklistselect.cpp: blacklistselect.h
+       /usr/bin/moc $(DEFINES) $(INCPATH) blacklistselect.h -o moc_blacklistselect.cpp
+
+moc_rotatingbackground.cpp: rotatingbackground.h
+       /usr/bin/moc $(DEFINES) $(INCPATH) rotatingbackground.h -o moc_rotatingbackground.cpp
+
+moc_searchoptions.cpp: searchoptions.h
+       /usr/bin/moc $(DEFINES) $(INCPATH) searchoptions.h -o moc_searchoptions.cpp
+
+moc_dpkginterface.cpp: dpkginterface.h
+       /usr/bin/moc $(DEFINES) $(INCPATH) dpkginterface.h -o moc_dpkginterface.cpp
+
+compiler_dbus_interface_source_make_all:
+compiler_dbus_interface_source_clean:
+compiler_dbus_adaptor_source_make_all:
+compiler_dbus_adaptor_source_clean:
+compiler_rcc_make_all: qrc_resources.cpp
+compiler_rcc_clean:
+       -$(DEL_FILE) qrc_resources.cpp
+qrc_resources.cpp: resources.qrc \
+               icons/close.png \
+               icons/pkg_nop_notinstalled.png \
+               icons/blacklist.png \
+               icons/pkg_nop_installed.png \
+               icons/pkg_remove.png \
+               icons/fapman.png \
+               icons/filter_cat.png \
+               icons/update.png \
+               icons/appdefault.png \
+               icons/install.png \
+               icons/filter_stat.png \
+               icons/sort.png \
+               icons/pkg_nop_instupgr.png \
+               icons/pkg_install.png \
+               icons/repos.png \
+               icons/commit.png \
+               icons/searchoptions.png \
+               icons/upgrade.png \
+               icons/remove.png \
+               icons/pkg_upgrade.png
+       /usr/bin/rcc -name resources resources.qrc -o qrc_resources.cpp
+
+compiler_image_collection_make_all: qmake_image_collection.cpp
+compiler_image_collection_clean:
+       -$(DEL_FILE) qmake_image_collection.cpp
+compiler_moc_source_make_all:
+compiler_moc_source_clean:
+compiler_dbus_interface_header_make_all:
+compiler_dbus_interface_header_clean:
+compiler_dbus_interface_moc_make_all:
+compiler_dbus_interface_moc_clean:
+compiler_dbus_adaptor_header_make_all:
+compiler_dbus_adaptor_header_clean:
+compiler_dbus_adaptor_moc_make_all:
+compiler_dbus_adaptor_moc_clean:
+compiler_uic_make_all: ui_mainwindow.h ui_packageview.h ui_filterselect.h ui_confirmdialog.h ui_repoview.h ui_packageselector.h ui_help.h ui_settings.h ui_repoedit.h ui_logview.h ui_sortselector.h ui_blacklistselect.h ui_searchoptions.h
+compiler_uic_clean:
+       -$(DEL_FILE) ui_mainwindow.h ui_packageview.h ui_filterselect.h ui_confirmdialog.h ui_repoview.h ui_packageselector.h ui_help.h ui_settings.h ui_repoedit.h ui_logview.h ui_sortselector.h ui_blacklistselect.h ui_searchoptions.h
+ui_mainwindow.h: mainwindow.ui \
+               rotatingbackground.h
+       /usr/bin/uic mainwindow.ui -o ui_mainwindow.h
+
+ui_packageview.h: packageview.ui
+       /usr/bin/uic packageview.ui -o ui_packageview.h
+
+ui_filterselect.h: filterselect.ui
+       /usr/bin/uic filterselect.ui -o ui_filterselect.h
+
+ui_confirmdialog.h: confirmdialog.ui
+       /usr/bin/uic confirmdialog.ui -o ui_confirmdialog.h
+
+ui_repoview.h: repoview.ui
+       /usr/bin/uic repoview.ui -o ui_repoview.h
+
+ui_packageselector.h: packageselector.ui
+       /usr/bin/uic packageselector.ui -o ui_packageselector.h
+
+ui_help.h: help.ui
+       /usr/bin/uic help.ui -o ui_help.h
+
+ui_settings.h: settings.ui
+       /usr/bin/uic settings.ui -o ui_settings.h
+
+ui_repoedit.h: repoedit.ui
+       /usr/bin/uic repoedit.ui -o ui_repoedit.h
+
+ui_logview.h: logview.ui
+       /usr/bin/uic logview.ui -o ui_logview.h
+
+ui_sortselector.h: sortselector.ui
+       /usr/bin/uic sortselector.ui -o ui_sortselector.h
+
+ui_blacklistselect.h: blacklistselect.ui
+       /usr/bin/uic blacklistselect.ui -o ui_blacklistselect.h
+
+ui_searchoptions.h: searchoptions.ui
+       /usr/bin/uic searchoptions.ui -o ui_searchoptions.h
+
+compiler_yacc_decl_make_all:
+compiler_yacc_decl_clean:
+compiler_yacc_impl_make_all:
+compiler_yacc_impl_clean:
+compiler_lex_make_all:
+compiler_lex_clean:
+compiler_clean: compiler_moc_header_clean compiler_rcc_clean compiler_uic_clean 
+
+####### Compile
+
+main.o: main.cpp mainwindow.h \
+               aaptinterface.h \
+               blacklistselect.h \
+               confirmdialog.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp
+
+mainwindow.o: mainwindow.cpp mainwindow.h \
+               aaptinterface.h \
+               blacklistselect.h \
+               version.h \
+               ui_mainwindow.h \
+               rotatingbackground.h \
+               packageview.h \
+               package.h \
+               confirmdialog.h \
+               dimmer.h \
+               repoview.h \
+               help.h \
+               settings.h \
+               logview.h \
+               dpkginterface.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o mainwindow.o mainwindow.cpp
+
+package.o: package.cpp package.h \
+               blacklistselect.h \
+               repository.h \
+               aaptinterface.h \
+               apt-src/debversion.h \
+               version.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o package.o package.cpp
+
+packageview.o: packageview.cpp packageview.h \
+               mainwindow.h \
+               aaptinterface.h \
+               blacklistselect.h \
+               package.h \
+               ui_packageview.h \
+               filterselect.h \
+               confirmdialog.h \
+               dimmer.h \
+               packageselector.h \
+               help.h \
+               logview.h \
+               sortselector.h \
+               settings.h \
+               searchoptions.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o packageview.o packageview.cpp
+
+filterselect.o: filterselect.cpp filterselect.h \
+               ui_filterselect.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o filterselect.o filterselect.cpp
+
+confirmdialog.o: confirmdialog.cpp confirmdialog.h \
+               ui_confirmdialog.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o confirmdialog.o confirmdialog.cpp
+
+dimmer.o: dimmer.cpp dimmer.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o dimmer.o dimmer.cpp
+
+repoview.o: repoview.cpp repoview.h \
+               ui_repoview.h \
+               mainwindow.h \
+               aaptinterface.h \
+               blacklistselect.h \
+               confirmdialog.h \
+               repository.h \
+               repoedit.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o repoview.o repoview.cpp
+
+packageselector.o: packageselector.cpp packageselector.h \
+               package.h \
+               blacklistselect.h \
+               ui_packageselector.h \
+               packageview.h \
+               mainwindow.h \
+               aaptinterface.h \
+               repository.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o packageselector.o packageselector.cpp
+
+help.o: help.cpp help.h \
+               ui_help.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o help.o help.cpp
+
+settings.o: settings.cpp settings.h \
+               ui_settings.h \
+               mainwindow.h \
+               aaptinterface.h \
+               blacklistselect.h \
+               packageview.h \
+               package.h \
+               confirmdialog.h \
+               searchoptions.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o settings.o settings.cpp
+
+aaptinterface.o: aaptinterface.cpp aaptinterface.h \
+               blacklistselect.h \
+               package.h \
+               dimmer.h \
+               repository.h \
+               mainwindow.h \
+               settings.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o aaptinterface.o aaptinterface.cpp
+
+repository.o: repository.cpp repository.h \
+               package.h \
+               blacklistselect.h \
+               aaptinterface.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o repository.o repository.cpp
+
+repoedit.o: repoedit.cpp repoedit.h \
+               ui_repoedit.h \
+               repository.h \
+               confirmdialog.h \
+               aaptinterface.h \
+               blacklistselect.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o repoedit.o repoedit.cpp
+
+logview.o: logview.cpp logview.h \
+               ui_logview.h \
+               aaptinterface.h \
+               blacklistselect.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o logview.o logview.cpp
+
+debversion.o: apt-src/debversion.cc apt-src/debversion.h \
+               version.h \
+               apt-src/pkgcache.h \
+               apt-src/mmap.h \
+               apt-src/fileutl.h \
+               apt-src/cacheiterators.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o debversion.o apt-src/debversion.cc
+
+version.o: apt-src/version.cc version.h \
+               apt-src/pkgcache.h \
+               apt-src/mmap.h \
+               apt-src/fileutl.h \
+               apt-src/cacheiterators.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o version.o apt-src/version.cc
+
+sortselector.o: sortselector.cpp sortselector.h \
+               packageview.h \
+               mainwindow.h \
+               aaptinterface.h \
+               blacklistselect.h \
+               package.h \
+               ui_sortselector.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o sortselector.o sortselector.cpp
+
+blacklistselect.o: blacklistselect.cpp blacklistselect.h \
+               ui_blacklistselect.h \
+               package.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o blacklistselect.o blacklistselect.cpp
+
+rotatingbackground.o: rotatingbackground.cpp rotatingbackground.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o rotatingbackground.o rotatingbackground.cpp
+
+searchoptions.o: searchoptions.cpp searchoptions.h \
+               ui_searchoptions.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o searchoptions.o searchoptions.cpp
+
+dpkginterface.o: dpkginterface.cpp dpkginterface.h
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o dpkginterface.o dpkginterface.cpp
+
+moc_mainwindow.o: moc_mainwindow.cpp 
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_mainwindow.o moc_mainwindow.cpp
+
+moc_packageview.o: moc_packageview.cpp 
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_packageview.o moc_packageview.cpp
+
+moc_filterselect.o: moc_filterselect.cpp 
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_filterselect.o moc_filterselect.cpp
+
+moc_confirmdialog.o: moc_confirmdialog.cpp 
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_confirmdialog.o moc_confirmdialog.cpp
+
+moc_dimmer.o: moc_dimmer.cpp 
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_dimmer.o moc_dimmer.cpp
+
+moc_repoview.o: moc_repoview.cpp 
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_repoview.o moc_repoview.cpp
+
+moc_packageselector.o: moc_packageselector.cpp 
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_packageselector.o moc_packageselector.cpp
+
+moc_help.o: moc_help.cpp 
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_help.o moc_help.cpp
+
+moc_settings.o: moc_settings.cpp 
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_settings.o moc_settings.cpp
+
+moc_aaptinterface.o: moc_aaptinterface.cpp 
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_aaptinterface.o moc_aaptinterface.cpp
+
+moc_repoedit.o: moc_repoedit.cpp 
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_repoedit.o moc_repoedit.cpp
+
+moc_logview.o: moc_logview.cpp 
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_logview.o moc_logview.cpp
+
+moc_sortselector.o: moc_sortselector.cpp 
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_sortselector.o moc_sortselector.cpp
+
+moc_blacklistselect.o: moc_blacklistselect.cpp 
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_blacklistselect.o moc_blacklistselect.cpp
+
+moc_rotatingbackground.o: moc_rotatingbackground.cpp 
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_rotatingbackground.o moc_rotatingbackground.cpp
+
+moc_searchoptions.o: moc_searchoptions.cpp 
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_searchoptions.o moc_searchoptions.cpp
+
+moc_dpkginterface.o: moc_dpkginterface.cpp 
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_dpkginterface.o moc_dpkginterface.cpp
+
+qrc_resources.o: qrc_resources.cpp 
+       $(CXX) -c $(CXXFLAGS) $(INCPATH) -o qrc_resources.o qrc_resources.cpp
+
+####### Install
+
+install:   FORCE
+
+uninstall:   FORCE
+
+FORCE:
+
diff --git a/TODO.txt b/TODO.txt
new file mode 100644 (file)
index 0000000..fc3f7f1
--- /dev/null
+++ b/TODO.txt
@@ -0,0 +1,46 @@
+0.6.4:
+* show user/hidden category apps in the list of installed apps (remove only)
+* show "recommends" and "suggests" in package dependencies if there are any
+* check rootfs and opt free space on startup and warn if low
+- option to disable automatic catalog updates
+- add an option to start fetching changelogs immediately when package view is opened
+- read hildon app manager repository settings (get disabled repos, correct names)
+- use proxy settings for fetching package date information and changelogs
+- require lists refresh if more than 30 min from previous refresh when opening packageview
+  (currently only checks idling time in main menu)
+- check dependencies when selecting packages (at least warn about conflicts)
+- update install/remove changes directly to internal package db & don't require re-reading package lists afterwards
+- add an option to start fetching changelogs automatically for all upgradeable packages?
+
+
+0.7:
+- support loading .install files
+- support installing local .debs
+- mime type handling for .install and .deb
+- can ovi store .debs be installed?
+
+
+0.8:
+- "problem solver" window/feature (find broken packages, handle recovery from broken packages better)
+
+
+later/any:
+- don't lose package selections when returning to main menu
+  (autostore/load selections - to different file than normal store)
+- ability to easily add extras-devel and extras-testing to repos if they don't exist
+- load package lists in the background when the main menu is visible?
+- how to handle package names that end in '-'? (theoretically they are valid but nonexistent?)
+- filtering by repository?
+- load system proxy settings (libgq-gconf)?
+- connect to network (via dbus) on startup?
+- adjustable font sizes (in package view)
+- fetch dates for other than user categories?
+- can repository priority pinning be handled by this?
+- link to package rating (maemo.org)?
+- show download speed for apt-get update
+- a better blacklist editor
+
+
+known bugs:
+- possible to get stuck in portrait mode (wait for Qt autorotation fix)
+- updating menu icons after installation does not work or works only sometimes (currently disabled)
diff --git a/aaptinterface.cpp b/aaptinterface.cpp
new file mode 100644 (file)
index 0000000..b27304a
--- /dev/null
@@ -0,0 +1,1850 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#include <QtGui>
+#include <QtNetwork>
+
+#include "aaptinterface.h"
+#include "package.h"
+#include "dimmer.h"
+#include "repository.h"
+#include "mainwindow.h"
+#include "settings.h"
+
+AAptInterface::AAptInterface(QObject* parent = 0) : QObject(parent)
+{
+       iMode = ModeNone;
+       iMainWindow = dynamic_cast<MainWindow*>(parent);
+       iUiDimmer = 0;
+       iSettings = 0;
+       iTerminated = false;
+       iCanCancel = false;
+       iNumSelectedPackages = 0;
+       iErrorDone = false;
+       iNeedRepoRefresh = false;
+       iNeedListRefresh = true;
+       iNeedDateRefresh = true;
+       iNeedDpkgRefresh = true;
+       iSkipRefreshListAndDates = false;
+
+       iProcAptGetUpdate = new QProcess(this);
+       iProcAptGetSimulate = new QProcess(this);
+       iProcAptGetInstall = new QProcess(this);
+       iProcAptGetClean = new QProcess(this);
+
+       iProcAptGetUpdate->setProcessChannelMode(QProcess::MergedChannels);
+       iProcAptGetSimulate->setProcessChannelMode(QProcess::MergedChannels);
+       iProcAptGetInstall->setProcessChannelMode(QProcess::MergedChannels);
+       iProcAptGetClean->setProcessChannelMode(QProcess::MergedChannels);
+
+       connect(iProcAptGetUpdate,SIGNAL(error(QProcess::ProcessError)),this,SLOT(errorAptGetUpdate(QProcess::ProcessError)));
+       connect(iProcAptGetUpdate,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(finishedAptGetUpdate(int,QProcess::ExitStatus)));
+       connect(iProcAptGetUpdate,SIGNAL(readyRead()),this,SLOT(uiUpdaterAptGetUpdate()));
+
+       connect(iProcAptGetInstall,SIGNAL(error(QProcess::ProcessError)),this,SLOT(errorAptGetInstall(QProcess::ProcessError)));
+       connect(iProcAptGetInstall,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(finishedAptGetInstall(int,QProcess::ExitStatus)));
+       connect(iProcAptGetInstall,SIGNAL(readyRead()),this,SLOT(uiUpdaterAptGetInstall()));
+
+       connect(iProcAptGetSimulate,SIGNAL(error(QProcess::ProcessError)),this,SLOT(errorAptGetSimulate(QProcess::ProcessError)));
+       connect(iProcAptGetSimulate,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(finishedAptGetSimulate(int,QProcess::ExitStatus)));
+
+       connect(iProcAptGetClean,SIGNAL(error(QProcess::ProcessError)),this,SLOT(errorAptGetClean(QProcess::ProcessError)));
+       connect(iProcAptGetClean,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(finishedAptGetClean(int,QProcess::ExitStatus)));
+
+       iProcessPackages.clear();
+       iProcessPackagesOrig.clear();
+       iProcessPackageVersions.clear();
+
+       QDir logdir(KFapmanDir);
+       logdir.mkpath(KFapmanDir);
+
+       // create custom apt cache dirs if they don't exist
+       QDir d1(KAptListDir + "/partial");
+       d1.mkpath(KAptListDir + "/partial");
+
+       // clear log on startup
+       QFile logfile(KLogFile);
+       logfile.remove();
+
+       // clear files left from old versions
+       QFile f1("/root/.fapman/dates.cache");
+       f1.remove();
+       QFile f2("/root/.fapman/lastupdate");
+       f2.remove();
+
+       readRepositoryInfo();
+}
+
+AAptInterface::~AAptInterface()
+{
+       if( iProcAptGetUpdate->state() != QProcess::NotRunning )
+               iProcAptGetUpdate->kill();
+       if( iProcAptGetSimulate->state() != QProcess::NotRunning )
+               iProcAptGetSimulate->kill();
+       if( iProcAptGetInstall->state() != QProcess::NotRunning )
+               iProcAptGetInstall->kill();
+       if( iProcAptGetClean->state() != QProcess::NotRunning )
+               iProcAptGetClean->kill();
+}
+
+void AAptInterface::addQueuedOperation(interfaceMode mode_)
+{
+       iOperationsQueue.append( mode_ );
+}
+
+void AAptInterface::setNeedRefresh(int repos, int lists, int dpkg, int dates)
+{
+       if( repos==0 || repos==1 )
+               iNeedRepoRefresh = (bool)repos;
+       if( lists==0 || lists==1 )
+               iNeedListRefresh = (bool)lists;
+       if( dpkg==0 || dpkg==1 )
+               iNeedDpkgRefresh = (bool)dpkg;
+       if( dates==0 || dates==1 )
+               iNeedDateRefresh = (bool)dates;
+}
+
+bool AAptInterface::needListOrDateRefresh()
+{
+       if( iNeedListRefresh || iNeedDpkgRefresh || iNeedDateRefresh )
+               return true;
+
+       return false;
+}
+
+bool AAptInterface::run(dimmer* uiDimmer)
+{
+       if( iMode != ModeNone ) {
+               //qDebug() << "Can't run: not ModeNone";
+               return false;
+       }
+
+       if( iOperationsQueue.count() == 0 ) {
+               qDebug() << "Can't run: Queue empty";
+               return false;
+       }
+
+       iUiDimmer = uiDimmer;
+       iQueueMessages.clear();
+       iModeLog.clear();
+
+       runNext();
+
+       return true;
+}
+
+void AAptInterface::runNext()
+{
+       if( iOperationsQueue.count()==0 ) {
+               cleanAfterRunAll();
+               return;
+       }
+       if( iTerminated ) {
+               cleanAfterError();
+               return;
+       }
+
+       cleanAfterRunEach();
+
+       iMode = iOperationsQueue.takeAt(0);
+       iModeLog.append(iMode);
+
+       if( iMode == ModeAptGetUpdate ) {
+               if( !startAptGetUpdate() )
+                       errorAptGetUpdate( QProcess::FailedToStart );
+       }
+       if( iMode == ModeAptGetInstall ) {
+               if( !startAptGetInstall() )
+                       errorAptGetInstall( QProcess::FailedToStart );
+       }
+       if( iMode == ModeAptGetSimulate ) {
+               if( !startAptGetSimulate() )
+                       errorAptGetSimulate( QProcess::FailedToStart );
+       }
+       if( iMode == ModeAptGetClean ) {
+               if( !startAptGetClean() )
+                       errorAptGetClean( QProcess::FailedToStart );
+       }
+       if( iMode == ModeFetchDates )
+               startFetchDates();
+
+       if( iMode == ModeReadPackages )
+               startPkgListRead();
+}
+
+void AAptInterface::cleanAfterRunEach()
+{
+       iMode = ModeNone;
+       iTerminated = false;
+       iErrorDone = false;
+       iCanCancel = false;
+}
+
+void AAptInterface::cleanAfterRunAll()
+{
+       cleanAfterRunEach();
+       iUiDimmer = 0;
+       iSkipRefreshListAndDates = false;
+}
+
+void AAptInterface::cleanAfterError()
+{
+       cleanAfterRunAll();
+       iOperationsQueue.clear();
+       iProcessPackages.clear();
+       iProcessPackagesOrig.clear();
+       iProcessPackageVersions.clear();
+}
+
+bool AAptInterface::running()
+{
+       if( iMode == ModeNone )
+               return false;
+       return true;
+}
+
+bool AAptInterface::cancel()
+{
+       // should return false if can't cancel, or terminate the running process (and clear queue) otherwise
+       if( iMode == ModeNone )
+               return false;
+
+       if( !iCanCancel ) {
+               return false;
+       }
+
+       if( iMode == ModeAptGetUpdate ) {
+               if( iProcAptGetUpdate->state() == QProcess::Running )
+                       iProcAptGetUpdate->terminate();
+               else
+                       return false;
+               cleanAfterError();
+               iTerminated = true;
+               iNeedRepoRefresh = true;
+               return true;
+       }
+       if( iMode == ModeAptGetSimulate ) {
+               if( iProcAptGetSimulate->state() == QProcess::Running )
+                       iProcAptGetSimulate->terminate();
+               else
+                       return false;
+               cleanAfterError();
+               iTerminated = true;
+               return true;
+       }
+       if( iMode == ModeAptGetInstall ) {
+               if( iProcAptGetInstall->state() == QProcess::Running )
+                       iProcAptGetInstall->terminate();
+               else
+                       return false;
+               cleanAfterError();
+               iTerminated = true;
+               return true;
+       }
+       if( iMode == ModeReadPackages ) {
+               iTerminated = true;
+               return true;
+       }
+       if( iMode == ModeFetchDates ) {
+               iTerminated = true;
+               return true;
+       }
+       return false;
+}
+
+bool AAptInterface::startAptGetUpdate()
+{
+       iCanCancel = true;
+       iProcAptGetUpdateOutput.clear();
+
+       if( !this->writeRepositories() )
+               return false;
+       iNeedListRefresh = true;
+       iNeedDpkgRefresh = true;
+       iNeedDateRefresh = true;
+
+       if( iUiDimmer ) {
+               iUiDimmer->setProgress(0);
+               iUiDimmer->updateText("Updating catalogs");
+       }
+
+       iCatalogCounter = 0;
+       iCatalogsTotal = 0;
+       for( int i=0; i<iRepositories.count(); i++ ) {
+               if( iRepositories.at(i) && iRepositories.at(i)->enabled() ) {
+                       iCatalogsTotal += 2;
+                       QStringList comp = iRepositories.at(i)->components().split(' ');
+                       iCatalogsTotal += comp.count();
+               }
+       }
+
+       bool useproxy = iSettings->qsettings()->value("use_proxies",false).toBool();
+       QString http_proxy = iSettings->qsettings()->value("http_proxy","").toString();
+       QString https_proxy = iSettings->qsettings()->value("https_proxy","").toString();
+       QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
+       if( useproxy ) {
+               if( http_proxy != "" )
+                       env.insert("http_proxy", http_proxy);
+               if( https_proxy != "" )
+                       env.insert("https_proxy", https_proxy);
+       }
+       iProcAptGetUpdate->setProcessEnvironment(env);
+
+       QString runBinary = "/usr/bin/apt-get";
+       QStringList runParameters;
+       runParameters << "-q" << "update"
+                       << "-o" << "Dir::Etc::sourcelist=" + KAptSourceList
+                       << "-o" << "Dir::State::lists=" + KAptListDir
+                       << "-o" << "Dir::Etc::sourceparts=\"\"";
+       logToFile( runBinary + " " + runParameters.join(" ") );
+       iProcAptGetUpdate->start(runBinary,runParameters);
+
+       return true;
+}
+
+bool AAptInterface::startAptGetSimulate()
+{
+       if( iProcessPackages.count()==0 )
+               return false;
+       iCanCancel = true;
+
+       if( iUiDimmer ) {
+               iUiDimmer->updateText("Reading dependencies");
+       }
+
+       QString runBinary = "/usr/bin/apt-get";
+       QStringList runParameters;
+       runParameters << "-qsy" << "--allow-unauthenticated"
+                       << "-o" << "Dir::Etc::sourcelist=" + KAptSourceList
+                       << "-o" << "Dir::State::lists=" + KAptListDir
+                       << "-o" << "Dir::Etc::sourceparts=\"\"";
+       if( iSettings->qsettings()->value("enable_autoremove", true).toBool() )
+               runParameters << "--auto-remove";
+       runParameters << "install";
+       runParameters << iProcessPackages;
+
+       logToFile( runBinary + " " + runParameters.join(" ") );
+       iProcAptGetSimulate->start(runBinary,runParameters);
+
+       return true;
+}
+
+bool AAptInterface::startAptGetInstall()
+{
+       if( iProcessPackages.count()==0 )
+               return false;
+
+       iNeedListRefresh = true;
+       iNeedDpkgRefresh = true;
+
+       iProcAptGetInstallOutput.clear();
+
+       qDebug() << "running apt-get install";
+
+       QString runBinary = "/usr/bin/apt-get";
+       QStringList runParameters;
+       runParameters << "-qy" << "--allow-unauthenticated"
+                       << "-o" << "DPkg::options::=--force-confnew"
+                       << "-o" << "Dir::Etc::sourcelist=" + KAptSourceList
+                       << "-o" << "Dir::State::lists=" + KAptListDir
+                       << "-o" << "Dir::Etc::sourceparts=\"\"";
+       if( iSettings->qsettings()->value("enable_autoremove", true).toBool() )
+               runParameters << "--auto-remove";
+       runParameters << "install";
+       runParameters << iProcessPackagesOrig;
+
+       int inst_count = 0;
+       int remv_count = 0;
+       for( int i=0; i<iProcessPackages.count(); i++) {
+               if( iProcessPackages.at(i).endsWith('-') )
+                       remv_count++;
+               else
+                       inst_count++;
+       }
+
+       iAptGetDownloadCount = 0;
+       iAptGetInstallCount = 0;
+       iAptGetRemoveCount = 0;
+       iAptGetInstallTotal = inst_count;
+       iAptGetRemoveTotal = remv_count;
+       iAptGetCurrentFileDownloadSize = 0;
+       iAptGetCurrentFileTotalSize = 0;
+       iAptGetCurrentDownloadFileName = "";
+       iProgressCheckTimer = 0;
+       iSpeedKbps = 0;
+       iSpeedKbpsPrev = -1;
+       iUpdateSpeed = false;
+
+       bool useproxy = iSettings->qsettings()->value("use_proxies",false).toBool();
+       QString http_proxy = iSettings->qsettings()->value("http_proxy","").toString();
+       QString https_proxy = iSettings->qsettings()->value("https_proxy","").toString();
+       QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
+       if( useproxy ) {
+               if( http_proxy != "" )
+                       env.insert("http_proxy", http_proxy);
+               if( https_proxy != "" )
+                       env.insert("https_proxy", https_proxy);
+       }
+       env.insert("DEBIAN_FRONTEND", "noninteractive");
+       iProcAptGetUpdate->setProcessEnvironment(env);
+
+       logToFile( runBinary + " " + runParameters.join(" ") );
+       iProcAptGetInstall->start(runBinary,runParameters);
+
+       return true;
+}
+
+bool AAptInterface::startAptGetClean()
+{
+       QString runBinary = "/usr/bin/apt-get";
+       QStringList runParameters;
+       runParameters
+                       << "-o" << "Dir::Etc::sourcelist=" + KAptSourceList
+                       << "-o" << "Dir::State::lists=" + KAptListDir
+                       << "-o" << "Dir::Etc::sourceparts=\"\""
+                       << "clean";
+
+       if( iUiDimmer ) {
+               iUiDimmer->updateText("Cleaning package cache");
+       }
+
+       logToFile( runBinary + " " + runParameters.join(" ") );
+       iProcAptGetClean->start(runBinary,runParameters);
+
+       return true;
+}
+
+QString AAptInterface::setQProcessErrorMessage(QProcess::ProcessError error)
+{
+       if( iTerminated ) {
+               logToFile(QString("Cancelled by user - terminating process"));
+               return "Cancelled by user";
+       }
+       else if( error == QProcess::FailedToStart )
+               return "Process failed to start";
+       else if( error == QProcess::Crashed )
+               return "Process crashed";
+       else if( error == QProcess::ReadError )
+               return "QProcess read error";
+       else if( error == QProcess::WriteError )
+               return "QProcess write error";
+       else if( error == QProcess::Timedout )
+               return "QProcess timeout error";
+       else if( error == QProcess::UnknownError )
+               return "QProcess unknown error";
+
+       return "Unknown error";
+}
+
+void AAptInterface::errorAptGetUpdate(QProcess::ProcessError error)
+{
+       QString msg = setQProcessErrorMessage(error);
+
+       if( iUiDimmer )
+               iUiDimmer->setProgress(-1);
+
+       communicateStatusToUi(false, "Error", msg);
+       cleanAfterError();
+       iNeedRepoRefresh = true;
+       iErrorDone = true;
+}
+
+void AAptInterface::errorAptGetSimulate(QProcess::ProcessError error)
+{
+       QString msg = setQProcessErrorMessage(error);
+       iProcessPackages.clear();
+       iProcessPackagesOrig.clear();
+       iProcessPackageVersions.clear();
+
+       communicateStatusToUi(false, "Error", msg);
+       cleanAfterError();
+       iErrorDone = true;
+}
+
+void AAptInterface::errorAptGetInstall(QProcess::ProcessError error)
+{
+       QString msg = setQProcessErrorMessage(error);
+       iProcessPackages.clear();
+       iProcessPackagesOrig.clear();
+       iProcessPackageVersions.clear();
+
+       if( iProgressCheckTimer ) {
+               iProgressCheckTimer->stop();
+               delete iProgressCheckTimer;
+               iProgressCheckTimer = 0;
+       }
+       if( iUiDimmer ) {
+               iUiDimmer->setProgress(-1);
+       }
+
+       communicateStatusToUi(false, "Error", msg);
+       cleanAfterError();
+       iErrorDone = true;
+}
+
+void AAptInterface::errorAptGetClean(QProcess::ProcessError error)
+{
+       QString msg = setQProcessErrorMessage(error);
+
+       communicateStatusToUi(false, "Error", msg);
+       cleanAfterError();
+       iErrorDone = true;
+}
+
+QString AAptInterface::finishProcessCommonErrorMessages(QByteArray& output)
+{
+       QString msg = "Unknown error - see the log for details";
+
+       if( output.contains("Could not get lock") || output.contains("Could not open lock file") ) {
+               msg = "The package management system is locked by another process or permission was denied";
+       } else if( output.contains("E: Unable to fetch some archives") ) {
+               msg = "Failed to fetch packages - Your network connection might be down or your catalogs could be out of date";
+       } else if( output.contains("E: Couldn't find package") ) {
+               msg = "Missing package, see the log for details - Your catalogs might be out of date";
+       } else if( output.contains("E: Broken packages") ) {
+               msg = "Your system has broken packages or you are trying to install conflicting packages. See the log for details.";
+       } else if( output.contains("E: Handler silently failed") ) {
+               msg = "Handler silently failed - This can happen if you try to install from the forbidden user/hidden category";
+       } else if( iTerminated ) {
+               msg = "The operation was cancelled by user";
+       } else if( output.contains("Temporary failure resolving") || output.contains("Could not resolve host") ) {
+               msg = "DNS errors were reported, check your network connection and/or repository configuration";
+       } else if( output.contains("E: dpkg was interrupted") ) {
+               msg = "Your system has partially installed or broken packages. You'll have to fix this manually. Try dpkg --configure -a";
+       } else if( output.contains("dpkg: error processing") || output.contains("Errors were encountered while processing:") ) {
+               msg = "dpkg reported errors while processing a package - see the log for details";
+       } else if( output.contains("E: Unmet dependencies") ) {
+               msg = "Some of your packages have unmet dependencies which could not be fixed. See the log for details.";
+       } else if( output.contains("E: The method driver") ) {
+               msg = "Apt failed to find a suitable method driver. One or more of your repositories might have an invalid URL.";
+       }
+
+       return msg;
+}
+
+void AAptInterface::finishedAptGetUpdate(int exitCode, QProcess::ExitStatus exitStatus)
+{
+       //QByteArray output = iProcAptGetUpdate->readAllStandardOutput();
+       //logToFile( "Output from last process:\n---\n"+output );
+
+       if( iErrorDone ) {
+               iErrorDone = false;
+               iProcAptGetUpdate->close();
+               return;
+       }
+
+       bool success = true;
+       QString title = "Operation finished";
+       QString msg = "Catalogs updated";
+       if( exitCode != 0 || exitStatus == QProcess::CrashExit )
+       {
+               success = false;
+               title = "Error";
+               msg = finishProcessCommonErrorMessages(iProcAptGetUpdateOutput);
+       }
+
+       if( iUiDimmer )
+               iUiDimmer->setProgress(-1);
+
+       if( iProcAptGetUpdateOutput.contains("Could not resolve ") || iProcAptGetUpdateOutput.contains("W: Failed to fetch") ||
+               iProcAptGetUpdateOutput.contains("Temporary failure resolving") ) {
+               success = false;
+               title = "Error";
+               msg = "Failed to update some or all of the catalogs. Check your network connection and/or repository configuration";
+       }
+
+       if( success ) {
+               iNeedRepoRefresh = false;
+
+               QFile lastupdate(KLastUpdateFile);   // create an empty file and/or update the modification time
+               if( lastupdate.open(QIODevice::WriteOnly) )
+                       lastupdate.close();
+
+               int pos = iProcAptGetUpdateOutput.indexOf("\nFetched ");
+               if( pos!=-1 ) {
+                       msg += "<br>apt-get: ";
+                       msg += iProcAptGetUpdateOutput.mid(pos+1, iProcAptGetUpdateOutput.indexOf('\n', pos+1)-pos ).trimmed();
+               }
+
+       } else {
+               cleanAfterError();
+       }
+
+       iProcAptGetUpdate->close();
+       communicateStatusToUi(success, title, msg);
+       runNext();
+}
+
+void AAptInterface::finishedAptGetSimulate(int exitCode, QProcess::ExitStatus exitStatus)
+{
+       QByteArray output = iProcAptGetSimulate->readAllStandardOutput();
+       logToFile( "Output from last process:\n---\n"+output );
+
+       if( iErrorDone ) {
+               iErrorDone = false;
+               iProcAptGetSimulate->close();
+               return;
+       }
+
+       bool success = true;
+       QString title = "Operation finished";
+       QString msg = "";
+       if( exitCode != 0 || exitStatus == QProcess::CrashExit )
+       {
+               success = false;
+               title = "Error";
+               msg = finishProcessCommonErrorMessages(output);
+       }
+
+       iProcessPackages.clear();
+       iProcessPackageVersions.clear();
+       if( success )
+       {
+               QList<QByteArray> lines = output.split('\n');
+
+               for( int i=0; i<lines.count(); i++)
+               {
+                       QString s = lines.at(i);
+                       if( s.startsWith("Inst ") )
+                       {
+                               iProcessPackages <<  s.section(' ',1,1);
+
+                               QString vs="";
+                               /*
+                               int a1 = s.indexOf('[');
+                               int a2 = s.indexOf(']');
+                               if( a1!=-1 && a2!=-1 && a2>a1) {
+                                       vs = s.mid(a1+1, a2-a1-1) + " -> ";
+                               }*/
+                               int b1 = s.indexOf('(');
+                               int b2 = s.indexOf(' ',b1);
+                               if( b1!=-1 && b2!=-1 && b2>b1) {
+                                       vs += s.mid(b1+1, b2-b1-1);
+                               }
+                               //qDebug() << vs;
+                               iProcessPackageVersions << vs;
+                       }
+                       if( s.startsWith("Remv ") )
+                       {
+                               iProcessPackages << s.section(' ',1,1) + "-";
+
+                               QString vs="";
+                               int a1 = s.indexOf('[');
+                               int a2 = s.indexOf(']');
+                               if( a1!=-1 && a2!=-1 && a2>a1) {
+                                       vs = s.mid(a1+1, a2-a1-1);
+                               }
+                               //qDebug() << vs;
+                               iProcessPackageVersions << vs;
+                       }
+               }
+       }
+       if( !success )
+               cleanAfterError();
+
+       iProcAptGetSimulate->close();
+       communicateStatusToUi(success, title, msg);
+       runNext();
+}
+
+void AAptInterface::finishedAptGetInstall(int exitCode, QProcess::ExitStatus exitStatus)
+{
+       //QByteArray output = iProcAptGetInstall->readAllStandardOutput();
+       //logToFile( "Output from last process:\n---\n"+output );
+
+       if( iErrorDone ) {
+               iProcAptGetInstall->close();
+               iErrorDone = false;
+               return;
+       }
+
+       bool success = true;
+       QString title = "Operation finished";
+       QString msg = "Package operations finished successfully";
+       if( exitCode != 0 || exitStatus == QProcess::CrashExit || iTerminated )
+       {
+               success = false;
+               title = "Error";
+               msg = finishProcessCommonErrorMessages(iProcAptGetInstallOutput);
+       }
+
+       if( iProgressCheckTimer ) {
+               iProgressCheckTimer->stop();
+               delete iProgressCheckTimer;
+               iProgressCheckTimer = 0;
+       }
+       if( iUiDimmer ) {
+               iUiDimmer->setProgress(-1);
+       }
+       iProcessPackages.clear();
+       iProcessPackagesOrig.clear();
+       iProcessPackageVersions.clear();
+
+       if( !success )
+               cleanAfterError();
+
+       iProcAptGetInstall->close();
+       communicateStatusToUi(success, title, msg);
+       runNext();
+}
+
+void AAptInterface::finishedAptGetClean(int exitCode, QProcess::ExitStatus exitStatus)
+{
+       QByteArray output = iProcAptGetClean->readAllStandardOutput();
+       // this should produce no output
+       //logToFile( "Output from last process:\n---\n"+output );
+
+       if( iErrorDone ) {
+               iErrorDone = false;
+               iProcAptGetClean->close();
+               return;
+       }
+
+       bool success = true;
+       QString title = "Operation finished";
+       QString msg = "Package cache cleaned";
+       if( exitCode != 0 || exitStatus == QProcess::CrashExit )
+       {
+               success = false;
+               title = "Error";
+               msg = finishProcessCommonErrorMessages(output);
+       }
+       if( !success )
+               cleanAfterError();
+
+       iProcAptGetClean->close();
+       communicateStatusToUi(success, title, msg);
+       runNext();
+}
+
+
+void AAptInterface::uiUpdaterAptGetUpdate()
+{
+       QByteArray data = iProcAptGetUpdate->read( iProcAptGetUpdate->bytesAvailable() );
+       logToFile( data, false );
+       iProcAptGetUpdateOutput.append(data);
+
+       if( !iUiDimmer )
+               return;
+
+       QStringList lines = QString( data.trimmed() ).split('\n');
+
+       for( int i=0; i<lines.count(); i++ )
+       {
+               if( lines.at(i).startsWith("Get:") || lines.at(i).startsWith("Hit ") )
+                       iCatalogCounter++;
+       }
+       //iUiDimmer->updateText( QString("Updating catalogs (%1)").arg(iCatalogCounter) );
+       //qDebug() << iCatalogCounter << iCatalogsTotal;
+       iUiDimmer->setProgress( iCatalogCounter*100/iCatalogsTotal );
+}
+
+void AAptInterface::uiUpdaterAptGetInstall()
+{
+       QByteArray data = iProcAptGetInstall->read( iProcAptGetInstall->bytesAvailable() );
+       logToFile( data, false );
+       iProcAptGetInstallOutput.append(data);
+
+       if( !iUiDimmer )
+               return;
+
+       QStringList lines = QString( data.trimmed() ).split('\n');
+
+       bool update = false;
+       bool resetprogress = true;
+       QString oper = "";
+       QString pkgname = "";
+       iCanCancel = false;
+       for( int i=0; i<lines.count(); i++ )
+       {
+               QStringList l = lines.at(i).split(' ');
+
+               if( l.count()>=4 && l.at(0).startsWith("Get:") ) {
+                       oper = "Downloading";
+                       iCanCancel = true;
+                       pkgname = l.at(3);
+                       Package* pkg = iPackagesAvailable.value(pkgname,0);
+                       if( pkg!=0 ) {
+                               iAptGetCurrentDownloadFileName = pkg->fileName();
+                               iAptGetCurrentFileTotalSize = pkg->size()/1024;
+                               pkgname += QString(" (%1 kB)").arg(iAptGetCurrentFileTotalSize);
+                       }
+                       iAptGetDownloadCount++;
+                       oper += QString(" %1/%2").arg(iAptGetDownloadCount).arg(iAptGetInstallTotal);
+                       update = true;
+                       if( !iProgressCheckTimer ) {
+                               iProgressCheckTimer = new QTimer(this);
+                               connect(iProgressCheckTimer,SIGNAL(timeout()),this,SLOT(progressCheckTimerCallback()));
+                               iProgressCheckTimer->start(500);
+                       }
+                       resetprogress = false;
+               } else if( l.count()>=2 && l.at(0)=="Unpacking") {
+                       oper = "Installing";
+                       if( l.count()>=3 && l.at(1)=="replacement" )
+                               pkgname = l.at(2);
+                       else
+                               pkgname = l.at(1);
+                       iAptGetInstallCount++;
+                       oper += QString(" %1/%2").arg(iAptGetInstallCount).arg(iAptGetInstallTotal);
+                       update = true;
+               } else if( l.count()>=3 && l.at(0)=="Setting" && l.at(1)=="up") {
+                       oper = "Setting up";
+                       pkgname = l.at(2);
+               } else if( l.count()>=2 && l.at(0)=="Removing") {
+                       oper = "Removing";
+                       pkgname = l.at(1);
+                       iAptGetRemoveCount++;
+                       oper += QString(" %1/%2").arg(iAptGetRemoveCount).arg(iAptGetRemoveTotal);
+                       update = true;
+               } else if( l.count()>=1 && l.at(0)=="Done!") {
+                       oper = "Setting up...";
+                       pkgname = "";
+                       update = true;
+               }
+
+               /*      // this does not seem to work, dpkg always dies first
+               if( lines.at(i).startsWith("***") && lines.at(i).contains("(Y/I/N/O/D/Z)") ) {
+                       if( iMainWindow->confirmDialog("Overwrite configuration file?","la la la") )
+                       {
+                               iProcAptGetInstall->write("Y\n");
+                       } else {
+                               iProcAptGetInstall->write("N\n");
+                       }
+               }
+               */
+       }
+
+       if( update && iUiDimmer && iUiDimmer->busy() ) {
+               iUiDimmer->updateText( oper + "<br>" + pkgname );
+               if( resetprogress ) {
+                       iUiDimmer->setProgress(-1);
+                       if( iProgressCheckTimer ) {
+                               iProgressCheckTimer->stop();
+                               delete iProgressCheckTimer;
+                               iProgressCheckTimer = 0;
+                       }
+               }
+       }
+}
+
+void AAptInterface::progressCheckTimerCallback()
+{
+       if( iAptGetCurrentDownloadFileName=="" )
+               return;
+
+       qint64 prevsize = iAptGetCurrentFileDownloadSize;
+       QFile pkgfile(KAptArchivePartialDir + "/" + iAptGetCurrentDownloadFileName);
+       iAptGetCurrentFileDownloadSize = pkgfile.size()/1024;
+
+       if( iAptGetCurrentFileDownloadSize >= prevsize ) {
+               iSpeedKbpsPrev = iSpeedKbps;
+               iSpeedKbps = (iAptGetCurrentFileDownloadSize-prevsize)*2;
+       } else {
+               iSpeedKbpsPrev = -1;
+       }
+       if( iUpdateSpeed )
+               iUpdateSpeed = false;
+       else
+               iUpdateSpeed = true;
+
+       if( iUiDimmer && iUiDimmer->busy() ) {
+               int p = iAptGetCurrentFileDownloadSize*100/iAptGetCurrentFileTotalSize;
+               if( iAptGetDownloadCount > 0 && iAptGetCurrentFileDownloadSize==0 )
+                       p = 100;
+               iUiDimmer->setProgress( p );
+               if( iSpeedKbps>=0 && iSpeedKbpsPrev>=0 && iUpdateSpeed ) {
+                       iUiDimmer->setDownloadSpeed( (iSpeedKbps+iSpeedKbpsPrev)/2 );
+               }
+       }
+}
+
+
+void AAptInterface::communicateStatusToUi(bool success, QString title, QString msg)
+{
+       qDebug() << title << msg;
+       iQueueMessages.append(msg);
+
+       if( iMainWindow && iOperationsQueue.count()==0 )
+       {
+               // title comes from the last finished operation only
+               iMainWindow->operationQueueFinished(iModeLog, success, title, iQueueMessages);
+       }
+}
+
+QByteArray AAptInterface::readLogFile()
+{
+       QByteArray log = "";
+
+       QFile own(KLogFile);
+       if( own.open(QIODevice::ReadOnly | QIODevice::Text ) )
+       {
+               while(!own.atEnd())
+               {
+                       QByteArray line = own.readLine();
+                       log.append( line );
+               }
+               own.close();
+       }
+
+       if( log=="" )
+               log = "The log is empty";
+
+       return log;
+}
+
+void AAptInterface::logToFile( QString data, bool logtime )
+{
+       logToFile( data.toAscii(), logtime );
+}
+
+void AAptInterface::logToFile( QByteArray data, bool logtime )
+{
+       QFile f(KLogFile);
+
+       if( f.open( QIODevice::Append | QIODevice::WriteOnly | QIODevice::Text ) )
+       {
+               QTextStream out(&f);
+               if( logtime )
+                       out << "--- " << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss") << " ---\n";
+
+               out << data;
+
+               if( logtime )
+                       out << "\n";
+               f.close();
+       }
+}
+
+void AAptInterface::readRepositoryInfo()
+{
+       for(int i=0; i<iRepositories.count(); i++) {
+               if( iRepositories.at(i) )
+                       delete iRepositories.at(i);
+       }
+       iRepositories.clear();
+       bool ownFound = false;
+
+       QFile own( KOwnRepoFile );
+       if( own.open(QIODevice::ReadOnly | QIODevice::Text ) )
+       {
+               Repository* r = 0;
+               while(!own.atEnd())
+               {
+                       QString line = own.readLine().trimmed();
+                       if( line.startsWith("deb ") || line.startsWith("#deb ") )
+                       {
+                               r = new Repository();
+                               if( r->setFromString(line) ) {
+                                       iRepositories.append(r);
+                                       //qDebug() << r->toListFileNames();
+                               } else {
+                                       delete r;
+                               }
+                       }
+               }
+               own.close();
+               if( iRepositories.count() > 0 )
+                       ownFound = true;
+       }
+
+       QFile names( KOwnRepoNamesFile );
+       if( names.open(QIODevice::ReadOnly | QIODevice::Text ) )
+       {
+               int c=0;
+               while(!names.atEnd() && c<iRepositories.count())
+               {
+                       QString line = names.readLine().trimmed();
+                       if( line.trimmed()!="" )
+                       iRepositories.at(c)->setName( line.trimmed() );
+                       c++;
+               }
+               names.close();
+               return;
+       }
+
+       if( ownFound )
+               return;
+
+       QFile ham( KHamRepoListFile );
+       if( ham.open(QIODevice::ReadOnly | QIODevice::Text ) )
+       {
+               while(!ham.atEnd())
+               {
+                       QString line = ham.readLine();
+                       Repository* r = new Repository();
+                       if( r->setFromString(line) ) {
+                               iRepositories.append(r);
+                       } else {
+                               delete r;
+                       }
+               }
+               ham.close();
+       }
+}
+
+bool AAptInterface::writeRepositories()
+{
+#ifndef Q_WS_MAEMO_5   // for simulator
+       return true;
+#endif
+
+       iNeedListRefresh = true;
+
+       QFile own( KOwnRepoFile );
+       if( own.open(QIODevice::WriteOnly | QIODevice::Text ) )
+       {
+               QTextStream out(&own);
+               for( int i=0; i<iRepositories.count(); i++ )
+                       out << iRepositories.at(i)->toString() << "\n";
+               own.close();
+       }
+
+       QFile names( KOwnRepoNamesFile );
+       if( names.open(QIODevice::WriteOnly | QIODevice::Text ) )
+       {
+               QTextStream out(&names);
+               for( int i=0; i<iRepositories.count(); i++ )
+                       out << iRepositories.at(i)->name() << "\n";
+               names.close();
+       }
+
+       QFile ham( KAptSourceList );
+       if( ham.open(QIODevice::WriteOnly | QIODevice::Text ) )
+       {
+               QTextStream out(&ham);
+               for( int i=0; i<iRepositories.count(); i++ )
+                       out << iRepositories.at(i)->toString() << "\n";
+               ham.close();
+
+               return true;
+       } else {
+               qDebug() << "Failed to write repository list!";
+       }
+
+       return false;
+}
+
+bool AAptInterface::needRepoRefresh()
+{
+#ifndef Q_WS_MAEMO_5   // for simulator
+       return false;
+#endif
+
+       if( iNeedRepoRefresh || iSettings->qsettings()->value("need_repo_refresh", false).toBool() ) {
+               iNeedRepoRefresh = false;
+               iSettings->qsettings()->setValue("need_repo_refresh", false);
+               qDebug() << "repo update required, debug 1";
+               return true;
+       }
+
+       QFile own(KAptSourceList);
+
+       if( !own.exists() )
+       {
+               qDebug() << "repo update required, debug 2";
+               return true;
+       }
+
+       QFileInfo a(KLastUpdateFile);
+       QDateTime aDate;
+       aDate.setTime_t(0);
+       if( a.exists() ) {
+               aDate = a.lastModified();
+       } else {
+               qDebug() << "repo update required, debug 3";
+               return true;
+       }
+       aDate = aDate.addSecs(24*60*60); //24h
+
+       if( aDate < QDateTime::currentDateTime() ) {
+               qDebug() << "repo update required, debug 4";
+               return true;
+       }
+
+       qDebug() << "repo update not required";
+       return false;
+}
+
+
+
+void AAptInterface::startPkgListRead()
+{
+       logToFile( QString("Start reading package lists") );
+       qDebug() << "reading package list files";
+
+       if( !iNeedListRefresh && !iNeedDpkgRefresh ) {
+               qDebug() << "no need to refresh package lists";
+               logToFile( QString("No need to read package lists") );
+               communicateStatusToUi(true, "Operation finished", "Package data already up to date");
+               runNext();
+               return;
+       }
+
+       if( iUiDimmer ) {
+               iUiDimmer->updateText("Reading package lists<br>");
+               iUiDimmer->setProgress(0);
+       }
+
+// clear packages lists
+       if( iNeedListRefresh && !iSkipRefreshListAndDates )
+       {
+               QHashIterator<QString, Package*> a( iPackagesAvailable );
+               while (a.hasNext())
+               {
+                       a.next();
+                       delete a.value();
+               }
+               iPackagesAvailable.clear();
+       }
+
+       if( iNeedDpkgRefresh )
+       {
+               QHashIterator<QString, Package*> i( iPackagesInstalled );
+               while (i.hasNext())
+               {
+                       i.next();
+                       delete i.value();
+               }
+               iPackagesInstalled.clear();
+       }
+
+       // read apt database (available packages)
+       QTime time_aptread;
+       time_aptread.start();
+
+       int pkgcount_apt = 0;
+       QDir dir( KAptListDir );
+       QFileInfoList files = dir.entryInfoList();
+
+       quint64 totaldatasize = 0;
+       quint64 currentreaddata = 0;
+       quint64 lastupdatedata = 0;
+       quint64 updateinterval = 1000000;
+       if( iNeedListRefresh && !iSkipRefreshListAndDates ) {
+               for( int i=0; i<files.count(); i++ )
+               {
+                       if( files.at(i).fileName().endsWith("_Packages"))
+                               totaldatasize += files.at(i).size();
+               }
+       }
+       if( iNeedDpkgRefresh ) {
+               QFileInfo dbinfo( KDpkgStatusFile );
+               totaldatasize += dbinfo.size();
+       }
+       int filecount = 0;
+
+       if( iNeedListRefresh && !iSkipRefreshListAndDates )
+       {
+               iCanCancel = true;
+
+               for( int i=0; i<files.count(); i++ )
+               {
+                       Repository* currentRepo = 0;
+                       if( files.at(i).absoluteFilePath().endsWith("_Packages") )
+                       {
+                               filecount++;
+                               for(int x=0; x<iRepositories.count(); x++) {
+                                       if( iRepositories.at(x)->toListFileNames().contains( files.at(i).fileName() ) ) {
+                                               currentRepo = iRepositories.at(x);
+                                       }
+                               }
+
+                               if( iUiDimmer && currentRepo ) {
+                                       iUiDimmer->updateText("Reading package lists<br><font size=\"-1\">" + currentRepo->name() + "</font>");
+                               }
+
+                               //qDebug() << files.at(i).fileName();
+
+                               QFile db( files.at(i).absoluteFilePath() );
+                               if (!db.open(QIODevice::ReadOnly | QIODevice::Text)) {
+                                       qDebug() << "FAIL: Unable to read apt database";
+                                       communicateStatusToUi(false, "Error", "Unable to read package lists");
+                                       cleanAfterError();
+                                       return;
+                               }
+
+                               while (!db.atEnd() && !iTerminated) {
+                                       Package* newpkg = ReadNextPackage(db, currentreaddata);
+                                       //qDebug() << "read" << currentreaddata << "of" << totaldatasize;
+                                       if( iUiDimmer && currentreaddata >= lastupdatedata+updateinterval ) {
+                                               iUiDimmer->setProgress( currentreaddata*100/totaldatasize );
+                                               lastupdatedata = currentreaddata;
+                                               QApplication::processEvents();
+                                       }
+                                       pkgcount_apt++;
+                                       if( newpkg )
+                                       {
+                                               newpkg->addRepository( currentRepo );
+
+                                               Package* exists = iPackagesAvailable.value(newpkg->name(),0);
+                                               if( !exists ) {
+                                                       iPackagesAvailable.insert(newpkg->name(), newpkg);
+                                               } else {
+                                                       if( Package::versionCompare(newpkg->version(),exists->version()) )
+                                                       {
+                                                               iPackagesAvailable.remove(exists->name());
+                                                               delete exists;
+                                                               exists=0;
+                                                               iPackagesAvailable.insert(newpkg->name(), newpkg);
+                                                       } else {
+                                                               if( newpkg->version() == exists->version() ) {
+                                                                       exists->addRepository( currentRepo );
+                                                                       if( newpkg->fullFileNames().count()>0 )
+                                                                               exists->addFullFileName( newpkg->fullFileNames().at(0) );
+                                                                       else
+                                                                               exists->addFullFileName("unknown_dir/unknown_filename");
+                                                               }
+                                                               delete newpkg;
+                                                               newpkg=0;
+                                                       }
+                                               }
+                                       }
+                               }
+                               db.close();
+                       }
+               }
+
+               qDebug() << "apt database read took" << time_aptread.elapsed() << "ms";
+               qDebug() << "Processed" << filecount << "package list files";
+
+               if( iTerminated ) {
+                       if( iUiDimmer )
+                               iUiDimmer->setProgress(-1);
+                       cleanAfterError();
+                       communicateStatusToUi(false, "Operation cancelled", "The operation was cancelled by user");
+                       return;
+               }
+
+               iNeedListRefresh = false;
+               iNeedDateRefresh = true;
+       }
+
+// read dpkg database (installed packages)
+       if( iNeedDpkgRefresh )
+       {
+               iCanCancel = true;
+               QTime time_dpkgread;
+               time_dpkgread.start();
+
+               int pkgcount_dpkg = 0;
+               QFile db( KDpkgStatusFile );
+               if (!db.open(QIODevice::ReadOnly | QIODevice::Text)) {
+                       qDebug() << "FAIL: Unable to read dpkg database";
+                       communicateStatusToUi(false, "Error", "Unable to read package database");
+                       cleanAfterError();
+                       return;
+               }
+
+               if( iUiDimmer ) {
+                       iUiDimmer->updateText("Reading package lists<br><font size=\"-1\">dpkg database</font>");
+               }
+
+               while (!db.atEnd() && !iTerminated) {
+                       Package* newpkg = ReadNextPackage(db, currentreaddata);
+                       if( iUiDimmer && currentreaddata >= lastupdatedata+updateinterval ) {
+                               iUiDimmer->setProgress( currentreaddata*100/totaldatasize );
+                               lastupdatedata = currentreaddata;
+                               QApplication::processEvents();
+                       }
+                       pkgcount_dpkg++;
+                       if( newpkg ) {
+                               if( newpkg->isInstalled() ) {
+                                       iPackagesInstalled.insert(newpkg->name(), newpkg);
+                               } else {
+                                       delete newpkg;
+                                       newpkg=0;
+                               }
+                       }
+               }
+               db.close();
+
+               qDebug() << "dpkg database read took" << time_dpkgread.elapsed() << "ms";
+
+               qDebug() << "Processed" << pkgcount_apt << "(apt) and" << pkgcount_dpkg << "(dpkg) package entries";
+               qDebug() << "In DB:" << iPackagesAvailable.count() << "packages available,"
+                               << iPackagesInstalled.count() << "installed";
+
+               if( iTerminated ) {
+                       cleanAfterError();
+                       communicateStatusToUi(false, "Operation cancelled", "The operation was cancelled by user");
+                       return;
+               }
+               iNeedDpkgRefresh = false;
+       }
+
+       logToFile( QString("Finished reading package lists") );
+       if( iUiDimmer ) {
+               iUiDimmer->updateText("Reading package lists<br><font size=\"-1\">Creating package view</font>");
+               QApplication::processEvents();
+               iUiDimmer->setProgress(-1);
+       }
+
+       readBlacklist();
+
+       communicateStatusToUi(true, "Operation finished", "Package data read");
+       iCanCancel = false;
+       runNext();
+}
+
+Package* AAptInterface::ReadNextPackage(QFile& f, quint64& currentreaddata)
+{
+       iMultiLine=MultiLineNone;
+
+       Package* pkg = new Package("", this);
+
+       bool pkgready = false;
+       while( !pkgready && !f.atEnd() ) {
+               QByteArray line = f.readLine();
+               currentreaddata += line.size();
+               if( processPackageDataLine(pkg,line) ) {
+                       pkgready = true;
+               }
+       }
+
+       if( pkg->name() != "" && pkg->isInstalled() ) {
+               QFileInfo f( KDpkgInfoDir + "/" + pkg->name() + ".list" );
+               if( f.exists() )
+                       pkg->setDate( f.lastModified() );
+       }
+
+       pkg->updateStatus();
+
+       if( pkg->name() == "" ) {
+               delete pkg;
+               pkg = 0;
+       }
+       return pkg;
+}
+
+bool AAptInterface::processPackageDataLine(Package*& pkg, QByteArray& line)
+{
+       if( !line.startsWith(' ') && !line.startsWith('\t') )
+               line = line.trimmed();
+       if( line.trimmed()=="" )
+               return true;
+
+       if( line.startsWith("Package:") )
+       {
+               pkg->setName( line.mid(8).trimmed() );
+               iMultiLine=MultiLineNone;
+       }
+       else if( line.startsWith("Status:") )
+       {
+               if( line.mid(7).trimmed() == "install ok installed" )
+                       pkg->setInstalled(true);
+               else
+                       pkg->setInstalled(false);
+       }
+       else if( line.startsWith("Section:") )
+       {
+               pkg->setSection( line.mid(8).trimmed() );
+       }
+       else if( line.startsWith("Version:") )
+       {
+               pkg->setVersion( line.mid(8).trimmed() );
+       }
+       else if( line.startsWith("Filename:") )
+       {
+               pkg->addFullFileName( line.mid(9).trimmed() );
+       }
+       else if( line.startsWith("Size:") )
+       {
+               pkg->setSize( line.mid(5).trimmed().toInt() );
+       }
+       else if( line.startsWith("Installed-Size:") )
+       {
+               pkg->setInstalledSize( line.mid(15).trimmed().toInt() );
+       }
+       else if( line.startsWith("Maemo-Display-Name:") )
+       {
+               pkg->setMaemoDisplayName( line.mid(19).trimmed() );
+       }
+       else if( line.startsWith("Depends:") )
+       {
+               pkg->appendDepends( line.mid(8).trimmed() );
+       }
+       else if( line.startsWith("Conflicts:") )
+       {
+               pkg->appendConflicts( line.mid(10).trimmed() );
+       }
+       else if( line.startsWith("Pre-Depends:") )
+       {
+               pkg->appendPreDepends( line.mid(12).trimmed() );
+       }
+       else if( line.startsWith("Provides:") )
+       {
+               pkg->appendProvides( line.mid(9).trimmed() );
+       }
+       else if( line.startsWith("Replaces:") )
+       {
+               pkg->appendReplaces( line.mid(9).trimmed() );
+       }
+       else if( line.startsWith("Breaks:") )
+       {
+               pkg->appendBreaks( line.mid(7).trimmed() );
+       }
+       else if( line.startsWith("Recommends:") )
+       {
+               pkg->appendRecommends( line.mid(11).trimmed() );
+       }
+       else if( line.startsWith("Suggests:") )
+       {
+               pkg->appendSuggests( line.mid(9).trimmed() );
+       }
+
+       if( iMultiLine == MultiLineDesc ) {
+               if( (line.startsWith(' ') || line.startsWith('\t')) && line.trimmed()!="" ) {
+                       if( line.trimmed()!="." )
+                               pkg->appendDescLong( line.trimmed() + "\n" );
+                       else
+                               pkg->appendDescLong( "\n" );
+               } else {
+                       iMultiLine = MultiLineNone;
+               }
+       }
+       else if( iMultiLine == MultiLineIcon ) {
+               if( (line.startsWith(' ') || line.startsWith('\t')) && line.trimmed()!="" ) {
+                       pkg->appendIconData( line.trimmed() );
+               } else {
+                       iMultiLine = MultiLineNone;
+               }
+       }
+       else if( iMultiLine == MultiLineUpgradeDesc ) {
+               if( (line.startsWith(' ') || line.startsWith('\t')) && line.trimmed()!="" ) {
+                       pkg->appendUpgradeDescription( line.trimmed() + "\n" );
+               } else {
+                       iMultiLine = MultiLineNone;
+               }
+       }
+
+       if( line.startsWith("Description:") )
+       {
+               pkg->setDescShort( line.mid(12).trimmed() );
+               iMultiLine = MultiLineDesc;
+       }
+       else if( line.startsWith("Maemo-Icon-26:") )
+       {
+               if( line.mid(15).trimmed() != "" ) {
+                       pkg->appendIconData( line.mid(15).trimmed() );
+               }
+               iMultiLine = MultiLineIcon;
+       }
+       else if( line.startsWith("Maemo-Upgrade-Description:") )
+       {
+               pkg->appendUpgradeDescription( line.mid(26).trimmed() + "\n" );
+               iMultiLine = MultiLineUpgradeDesc;
+       }
+
+       return false;
+}
+
+
+
+void AAptInterface::writeBlacklist()
+{
+       QHashIterator<QString, Package*> i( iPackagesAvailable );
+       while (i.hasNext())
+       {
+               i.next();
+
+               if( i.value()->blacklisted() == BlacklistSelect::BlacklistAll ) {
+                       iBlacklist << i.value()->name();
+               }
+               else if( i.value()->blacklisted() == BlacklistSelect::BlacklistThis ) {
+                       iBlacklist << (i.value()->name() + " " + i.value()->version());
+               }
+       }
+
+       QHashIterator<QString, Package*> j( iPackagesInstalled );
+       while (j.hasNext())
+       {
+               j.next();
+
+               if( j.value()->blacklisted() == BlacklistSelect::BlacklistAll ) {
+                       iBlacklist << j.value()->name();
+               }
+               else if( j.value()->blacklisted() == BlacklistSelect::BlacklistThis ) {
+                       iBlacklist << (j.value()->name() + " " + j.value()->version());
+               }
+       }
+
+       iBlacklist.removeDuplicates();
+
+       QFile f( KBlacklistFile );
+       if( f.open(QIODevice::WriteOnly | QIODevice::Text ) )
+       {
+               QTextStream out(&f);
+               for( int i=0; i<iBlacklist.count(); i++ )
+                       out << iBlacklist.at(i) << "\n";
+               f.close();
+       }
+
+       qDebug() << "blacklist: wrote" << iBlacklist.count() << "entries";
+}
+
+void AAptInterface::readBlacklist()
+{
+       QFile f( KBlacklistFile );
+       if( f.open(QIODevice::ReadOnly | QIODevice::Text ) )
+       {
+               while( !f.atEnd() ) {
+                       QString line = f.readLine().trimmed();
+                       if( line != "" )
+                               iBlacklist.append(line);
+               }
+               f.close();
+       }
+
+       iBlacklist.removeDuplicates();
+
+       qDebug() << "blacklist: read" << iBlacklist.count() << "entries";
+
+       for( int i=0; i<iBlacklist.count(); i++ )
+       {
+               QStringList parts = iBlacklist.at(i).split(' ');
+               Package* pkg = iPackagesAvailable.value(parts.at(0).trimmed(), 0);
+               Package* pkg2 = iPackagesInstalled.value(parts.at(0).trimmed(), 0);
+               if( parts.count()==1 ) {
+                       if( pkg )
+                               pkg->setBlacklisted(BlacklistSelect::BlacklistAll);
+                       if( pkg2 )
+                               pkg2->setBlacklisted(BlacklistSelect::BlacklistAll);
+               } else if( parts.count()==2 ) {
+                       if( pkg && pkg->version()==parts.at(1) )
+                               pkg->setBlacklisted(BlacklistSelect::BlacklistThis);
+                       if( pkg2 && pkg2->version()==parts.at(1) )
+                               pkg2->setBlacklisted(BlacklistSelect::BlacklistThis);
+               } else {
+                       qDebug() << "Warning: invalid blacklist entry:" << iBlacklist.at(i);
+               }
+       }
+}
+
+void AAptInterface::removeFromBlacklist(Package *pkg, BlacklistSelect::blackList oldstate)
+{
+       if( !pkg ) {
+               qDebug() << "Warning: trying to remove null package from blacklist";
+               return;
+       }
+
+       QStringList newlist;
+       bool removed = false;
+
+       for( int i=0; i<iBlacklist.count(); i++ )
+       {
+               if( oldstate == BlacklistSelect::BlacklistAll )
+               {
+                       if( !(iBlacklist.at(i) == pkg->name()) ) {
+                               newlist << iBlacklist.at(i);
+                       } else removed = true;
+               } else if( oldstate == BlacklistSelect::BlacklistThis ) {
+                       if( !(iBlacklist.at(i) == (pkg->name()+" "+pkg->version())) ) {
+                               newlist << iBlacklist.at(i);
+                       } else removed = true;
+               }
+       }
+
+       if( removed )
+               qDebug() << "blacklist: removed" << pkg->name();
+       else
+               qDebug() << "blacklist:" << pkg->name() << "not in saved list";
+
+       iBlacklist = newlist;
+}
+
+
+void AAptInterface::startFetchDates()
+{
+       logToFile( QString("Start fetching package dates") );
+       qDebug() << "start fetching package dates";
+
+       if( !iNeedDateRefresh || iSkipRefreshListAndDates ) {
+               qDebug() << "no need to fetch dates";
+               logToFile( QString("No need to fetch dates") );
+               communicateStatusToUi(true, "Operation finished", "Date information already up to date");
+               runNext();
+               return;
+       }
+
+       if( iUiDimmer ) {
+               iUiDimmer->updateText("Reading date cache");
+               iUiDimmer->setProgress(0);
+               QApplication::processEvents();
+       }
+
+       readDateCache();
+
+       if( iUiDimmer ) {
+               iUiDimmer->updateText("Fetching package date information");
+               QApplication::processEvents();
+       }
+
+       QNetworkAccessManager* nam = new QNetworkAccessManager(this);
+       iCanCancel = true;
+
+       int count = 0;
+       int updProgress = 0;
+
+       QHash<QString, Package*> fetchable;
+       QHashIterator<QString, Package*> i( iPackagesAvailable );
+       while (i.hasNext() )
+       {
+               i.next();
+               if( !i.value()->date().isValid() && i.value()->section().startsWith("user/") && !i.value()->isBlacklisted() )
+               {
+                       Repository* repo = 0;
+                       for( int x=0; x<i.value()->repositories().count(); x++ ) {
+                               if( i.value()->repositories().at(x) && i.value()->repositories().at(x)->url().startsWith("http://repository.maemo.org") )
+                               {
+                                       repo = i.value()->repositories().at(x);
+                                       break;
+                               }
+                       }
+                       if( repo ) {
+                               fetchable.insert(i.value()->name(), i.value());
+                       }
+               }
+       }
+
+       connect(nam, SIGNAL(finished(QNetworkReply*)), this, SLOT(dateFetchNetworkReply(QNetworkReply*)));
+       iDateRequestsWaiting = 0;
+       iDateRequestsSent = 0;
+       iDateRequestsReceived = 0;
+       iNetworkError = QNetworkReply::NoError;
+
+       QString dbgcount = QString("need to fetch date for %1 packages").arg(fetchable.count());
+       qDebug() << dbgcount;
+       logToFile(dbgcount);
+
+       QHashIterator<QString, Package*> fe( fetchable );
+       while (fe.hasNext() && !iTerminated)
+       {
+               fe.next();
+
+               if( updProgress >=10 ) {
+                       iUiDimmer->setProgress( count*100/fetchable.count() );
+                       updProgress=0;
+               }
+
+               if( !fe.value()->date().isValid() && fe.value()->section().startsWith("user/") && !fe.value()->isBlacklisted() )
+               {
+                       QString url;
+                       Repository* repo = 0;
+                       QString fullFilename = "unknown_filename";
+                       for( int x=0; x<fe.value()->repositories().count(); x++ ) {
+                               if( fe.value()->repositories().at(x) && fe.value()->repositories().at(x)->url().startsWith("http://repository.maemo.org") )
+                               {
+                                       repo = fe.value()->repositories().at(x);
+                                       if( fe.value()->fullFileNames().count()>x )
+                                               fullFilename = fe.value()->fullFileNames().at(x);
+                                       break;
+                               }
+                       }
+
+                       if( repo )
+                       {
+                               url = repo->url() + repo->dir() + fullFilename + "#" + fe.value()->name();
+
+                               //qDebug() << "getting date for" << fe.value()->name();
+                               //qDebug() << url;
+
+                               QUrl u(url);
+                               QNetworkRequest r(u);
+
+                               if( iDateRequestsReceived == 0 ) {
+                                       while( iDateRequestsWaiting>0 ) {
+                                               QApplication::processEvents(QEventLoop::WaitForMoreEvents);
+                                       }
+                               } else {
+                                       while( iDateRequestsWaiting>50 ) {
+                                               QApplication::processEvents(QEventLoop::WaitForMoreEvents);
+                                       }
+                               }
+
+                               if( iDateRequestsReceived>0 && iNetworkError != QNetworkReply::NoError &&
+                                       iNetworkError != QNetworkReply::QNetworkReply::ContentAccessDenied && iNetworkError != QNetworkReply::QNetworkReply::ContentNotFoundError )
+                               {
+                                       qDebug() << "fatal network error, aborting fetch";
+                                       logToFile(QString("Fatal network error, date fetch aborted"));
+                                       break;
+                               } else {
+                                       nam->head(r);
+                                       iDateRequestsSent++;
+                                       iDateRequestsWaiting++;
+                               }
+                       }
+                       count = iDateRequestsReceived;
+                       updProgress++;
+               }
+       }
+       while( iDateRequestsWaiting>0 ) {
+               if( updProgress >=10 ) {
+                       iUiDimmer->setProgress( count*100/fetchable.count() );
+                       updProgress=0;
+               }
+               QApplication::processEvents(QEventLoop::WaitForMoreEvents);
+               count = iDateRequestsReceived;
+               updProgress++;
+       }
+       delete nam;
+
+       if( iDateRequestsReceived>0 && iNetworkError != QNetworkReply::NoError &&
+               iNetworkError != QNetworkReply::QNetworkReply::ContentAccessDenied && iNetworkError != QNetworkReply::QNetworkReply::ContentNotFoundError )
+       {
+               // don't stop on this error, only inform the user
+               iMainWindow->notifyDialog("Network error", "There was a network error while fetching date information, the fetch was aborted");
+       }
+
+       if( iTerminated ) {
+               if( iUiDimmer )
+                       iUiDimmer->setProgress(-1);
+               cleanAfterError();
+               communicateStatusToUi(false, "Operation cancelled", "The operation was cancelled by user");
+               return;
+       }
+       iCanCancel = false;
+
+       if( iUiDimmer ) {
+               iUiDimmer->setProgress(100);
+               QApplication::processEvents();
+       }
+
+       QString dbgstr = QString("sent %1 requests, received %2 replies with %3 errors").arg(iDateRequestsSent).arg(iDateRequestsReceived).arg(iDateRequestErrors);
+
+       qDebug() << dbgstr;
+       logToFile(dbgstr);
+
+       logToFile( QString("Finished fetching package dates") );
+
+       if( fetchable.count()>0 || !dateCacheExists() ) {
+               iUiDimmer->updateText("Writing date cache");
+               QApplication::processEvents();
+               writeDateCache();
+       }
+
+       if( iUiDimmer ) {
+               iUiDimmer->updateText("Creating package view");
+               QApplication::processEvents();
+               iUiDimmer->setProgress(-1);
+       }
+
+       communicateStatusToUi(true, "Operation finished", "Package dates fetched");
+       iNeedDateRefresh = false;
+       runNext();
+}
+
+void AAptInterface::dateFetchNetworkReply(QNetworkReply* reply)
+{
+       iDateRequestsWaiting--;
+       iDateRequestsReceived++;
+       //qDebug() << "reply" << reply->header(QNetworkRequest::LastModifiedHeader).toDateTime();
+       iNetworkError = reply->error();
+
+       if( reply->error() == QNetworkReply::NoError && reply->header(QNetworkRequest::LastModifiedHeader).toDateTime().isValid() )
+       {
+               QString pkgname = reply->url().fragment();
+               //qDebug() << pkgname;
+
+               if( pkgname.isEmpty() )
+                       qDebug() << "warning: empty packagename in reply";
+
+               Package* pkg = iPackagesAvailable.value(pkgname, 0);
+               if( pkg ) {
+                       pkg->setDate( reply->header(QNetworkRequest::LastModifiedHeader).toDateTime() );
+               } else {
+                       qDebug() << "warning: unknown packagename in reply:" << pkgname;
+               }
+       }
+
+       if( reply->error() != QNetworkReply::NoError ) {
+               QString dbg = reply->url().fragment() + QString(": error %1: ").arg(reply->error()) + reply->errorString();
+               qDebug() << dbg;
+               logToFile( dbg );
+               iDateRequestErrors++;
+       }
+       reply->deleteLater();
+}
+
+void AAptInterface::writeDateCache()
+{
+       qDebug() << "writing date cache";
+
+       QFile f(KDateCacheFile);
+       if( f.open(QIODevice::WriteOnly | QIODevice::Text ) )
+       {
+               QTextStream out(&f);
+               QHashIterator<QString, Package*> i( iPackagesAvailable );
+               while (i.hasNext() )
+               {
+                       i.next();
+                       if( i.value()->date().isValid() && i.value()->section().startsWith("user/") )
+                               out << i.value()->name() << " " << i.value()->version() << " " << i.value()->date().toString(Qt::ISODate) << "\n";
+               }
+               f.close();
+       } else {
+               qDebug() << "Warning: failed to write date cache";
+               logToFile(QString("Failed to write date cache"));
+       }
+}
+
+void AAptInterface::readDateCache()
+{
+       qDebug() << "reading date cache";
+
+       QFile f(KDateCacheFile);
+       if( f.open(QIODevice::ReadOnly | QIODevice::Text ) )
+       {
+               while( !f.atEnd() ) {
+                       QString line = f.readLine().trimmed();
+                       QStringList parts = line.split(' ');
+                       if( parts.count()==3 ) {
+                               Package* pkg = iPackagesAvailable.value(parts.at(0),0);
+                               if( pkg && pkg->section().startsWith("user/") && pkg->version()==parts.at(1) )
+                               {
+                                       QDateTime dt = QDateTime::fromString( parts.at(2), Qt::ISODate);
+                                       if( dt.isValid() ) {
+                                               pkg->setDate( dt );
+                                       } else {
+                                               qDebug() << "Warning: Invalid date in date cache";
+                                               logToFile(QString("Invalid date in date cache"));
+                                       }
+                               }
+                       } else {
+                               qDebug() << "Warning: error in date cache:" << line;
+                               logToFile(QString("Error in date cache"));
+                       }
+               }
+               f.close();
+       } else {
+               qDebug() << "date cache does not exist";
+       }
+}
+
+bool AAptInterface::dateCacheExists()
+{
+       QFileInfo f(KDateCacheFile);
+       return f.exists();
+}
+
+bool AAptInterface::loadInstallFiles(QStringList files_)
+{
+       qDebug() << files_;
+
+       return false;
+}
diff --git a/aaptinterface.h b/aaptinterface.h
new file mode 100644 (file)
index 0000000..ed270bc
--- /dev/null
@@ -0,0 +1,205 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#ifndef AAPTINTERFACE_H
+#define AAPTINTERFACE_H
+
+#include <QtGui>
+#include <QtNetwork>
+#include "blacklistselect.h"
+
+
+const QString KFapmanDir = "/root/.fapman";
+const QString KLogFile = "/root/.fapman/lastlog.txt";
+const QString KBlacklistFile = "/root/.fapman/black.list";
+const QString KOwnRepoFile = "/root/.fapman/repos.list";
+const QString KOwnRepoNamesFile = "/root/.fapman/repos.names";
+
+const QString KHamRepoListFile = "/etc/apt/sources.list.d/hildon-application-manager.list";
+
+const QString KLastUpdateFile = "/opt/fapman-cache/lastupdate";
+const QString KDateCacheFile = "/opt/fapman-cache/dates.cache";
+const QString KAptSourceList = "/opt/fapman-cache/sources.list";
+const QString KAptListDir = "/opt/fapman-cache/lists";
+const QString KAptArchivePartialDir = "/var/cache/apt/archives/partial";
+
+const QString KDpkgStatusFile = "/var/lib/dpkg/status";
+const QString KDpkgInfoDir = "/var/lib/dpkg/info";
+
+
+class MainWindow;
+class FileReadThread;
+class DateFetchThread;
+class dimmer;
+class Package;
+class Repository;
+class Settings;
+
+
+class AAptInterface : public QObject
+{
+       Q_OBJECT
+
+public:
+       enum interfaceMode { ModeNone, ModeReadPackages, ModeFetchDates, ModeAptGetUpdate,
+                                                ModeAptGetSimulate, ModeAptGetInstall, ModeAptGetClean };
+       enum multiLine { MultiLineNone, MultiLineDesc, MultiLineIcon, MultiLineUpgradeDesc };
+
+       AAptInterface(QObject* parent);
+       ~AAptInterface();
+       void setSettings(Settings* s_) { iSettings = s_; }
+
+       void addQueuedOperation(interfaceMode mode_);
+       bool run(dimmer* uiDimmer);
+       void setProcessPackages(QStringList pkgs) { iProcessPackages=pkgs; iProcessPackagesOrig=pkgs; }
+       QStringList processPackages() { return iProcessPackages; }
+       QStringList processPackageVersions() { return iProcessPackageVersions; }
+
+       bool running();
+       bool cancel();
+
+       int numSelectedPackages() { return iNumSelectedPackages; }
+       void setNumSelectedPackages(int p_) { iNumSelectedPackages=p_; }
+
+       QHash<QString, Package*>* packagesAvailable() { return &iPackagesAvailable; }
+       QHash<QString, Package*>* packagesInstalled() { return &iPackagesInstalled; }
+       QList<Repository*>* repositories() { return  &iRepositories; }
+
+       QByteArray readLogFile();
+       void readRepositoryInfo();
+       bool writeRepositories();
+       bool needRepoRefresh();
+       void removeFromBlacklist(Package* pkg, BlacklistSelect::blackList oldstate);
+       void writeBlacklist();
+
+       bool dateCacheExists();
+
+       void setNeedRefresh(int repos, int lists, int dpkg, int dates);
+       void setSkipListAndDates() { iSkipRefreshListAndDates=true; }
+       bool needListOrDateRefresh();
+
+       bool loadInstallFiles(QStringList files_);
+
+private:
+       void runNext();
+       void cleanAfterRunEach();
+       void cleanAfterRunAll();
+       void cleanAfterError();
+
+       bool startAptGetUpdate();
+       bool startAptGetSimulate();
+       bool startAptGetInstall();
+       bool startAptGetClean();
+
+       QString setQProcessErrorMessage(QProcess::ProcessError error);
+       QString finishProcessCommonErrorMessages(QByteArray& output);
+
+       void communicateStatusToUi(bool success, QString title="", QString msg="");
+       void logToFile( QString data, bool logtime=true );
+       void logToFile( QByteArray data, bool logtime=true );
+
+       void startPkgListRead();
+       void startFetchDates();
+
+       Package* ReadNextPackage(QFile& f, quint64& currentreaddata);
+       bool processPackageDataLine(Package*& pkg, QByteArray& line);
+
+       void readBlacklist();
+       void writeDateCache();
+       void readDateCache();
+
+private slots:
+       void errorAptGetUpdate(QProcess::ProcessError error);
+       void errorAptGetSimulate(QProcess::ProcessError error);
+       void errorAptGetInstall(QProcess::ProcessError error);
+       void errorAptGetClean(QProcess::ProcessError error);
+
+       void finishedAptGetUpdate(int exitCode, QProcess::ExitStatus exitStatus);
+       void finishedAptGetSimulate(int exitCode, QProcess::ExitStatus exitStatus);
+       void finishedAptGetInstall(int exitCode, QProcess::ExitStatus exitStatus);
+       void finishedAptGetClean(int exitCode, QProcess::ExitStatus exitStatus);
+
+       void uiUpdaterAptGetUpdate();
+       void uiUpdaterAptGetInstall();
+       void progressCheckTimerCallback();
+
+       void dateFetchNetworkReply(QNetworkReply* reply);
+
+private:
+       QHash<QString, Package*> iPackagesAvailable;
+       QHash<QString, Package*> iPackagesInstalled;
+       int iNumSelectedPackages;
+
+       QStringList iProcessPackages;
+       QStringList iProcessPackagesOrig;
+       QStringList iProcessPackageVersions;
+       QList<interfaceMode> iOperationsQueue;
+       QList<Repository*> iRepositories;
+       QStringList iQueueMessages;
+
+       MainWindow* iMainWindow;
+       Settings* iSettings;
+       interfaceMode iMode;
+       QList<interfaceMode> iModeLog;
+       dimmer* iUiDimmer;
+       bool iCanCancel;
+       bool iTerminated;
+       bool iErrorDone;
+       bool iNeedRepoRefresh;
+       bool iNeedListRefresh;
+       bool iNeedDpkgRefresh;
+       bool iNeedDateRefresh;
+       bool iSkipRefreshListAndDates;
+
+       QProcess* iProcAptGetUpdate;
+       QProcess* iProcAptGetSimulate;
+       QProcess* iProcAptGetInstall;
+       QProcess* iProcAptGetClean;
+       QByteArray iProcAptGetUpdateOutput;
+       QByteArray iProcAptGetInstallOutput;
+
+       int iAptGetDownloadCount;
+       int iAptGetInstallCount;
+       int iAptGetRemoveCount;
+       int iAptGetInstallTotal;
+       int iAptGetRemoveTotal;
+       qint64 iAptGetCurrentFileDownloadSize;
+       qint64 iAptGetCurrentFileTotalSize;
+       QString iAptGetCurrentDownloadFileName;
+       QTimer* iProgressCheckTimer;
+       int iSpeedKbps;
+       int iSpeedKbpsPrev;
+       bool iUpdateSpeed;
+
+       int iCatalogCounter;
+       int iCatalogsTotal;
+
+       QStringList iBlacklist;
+
+       multiLine iMultiLine;
+
+       int iDateRequestsWaiting;
+       int iDateRequestsSent;
+       int iDateRequestsReceived;
+       int iDateRequestErrors;
+       QNetworkReply::NetworkError iNetworkError;
+};
+
+
+#endif // AAPTINTERFACE_H
diff --git a/apt-src/COPYING b/apt-src/COPYING
new file mode 100644 (file)
index 0000000..bba1b75
--- /dev/null
@@ -0,0 +1,23 @@
+Apt is copyright 1997, 1998, 1999 Jason Gunthorpe and others.
+Apt is currently developed by APT Development Team <deity@lists.debian.org>.
+
+License: GPLv2+
+
+    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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+See /usr/share/common-licenses/GPL-2, or
+<http://www.gnu.org/copyleft/gpl.txt> for the terms of the latest version
+of the GNU General Public License.
+
diff --git a/apt-src/cacheiterators.h b/apt-src/cacheiterators.h
new file mode 100644 (file)
index 0000000..2504b42
--- /dev/null
@@ -0,0 +1,461 @@
+/*
+Apt is copyright 1997, 1998, 1999 Jason Gunthorpe and others.
+Apt is currently developed by APT Development Team <deity@lists.debian.org>.
+
+License: GPLv2+
+
+       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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+See /usr/share/common-licenses/GPL-2, or
+<http://www.gnu.org/copyleft/gpl.txt> for the terms of the latest version
+of the GNU General Public License.
+*/
+
+// -*- mode: cpp; mode: fold -*-
+// Description                                                         /*{{{*/
+// $Id: cacheiterators.h,v 1.18.2.1 2004/05/08 22:44:27 mdz Exp $
+/* ######################################################################
+   
+   Cache Iterators - Iterators for navigating the cache structure
+   
+   The iterators all provides ++,==,!=,->,* and end for their type.
+   The end function can be used to tell if the list has been fully
+   traversed.
+   
+   Unlike STL iterators these contain helper functions to access the data
+   that is being iterated over. This is because the data structures can't
+   be formed in a manner that is intuitive to use and also mmapable.
+   
+   For each variable in the target structure that would need a translation
+   to be accessed correctly a translating function of the same name is
+   present in the iterator. If applicable the translating function will
+   return an iterator.
+
+   The DepIterator can iterate over two lists, a list of 'version depends'
+   or a list of 'package reverse depends'. The type is determined by the
+   structure passed to the constructor, which should be the structure
+   that has the depends pointer as a member. The provide iterator has the
+   same system.
+   
+   This header is not user includable, please use apt-pkg/pkgcache.h
+   
+   ##################################################################### */
+                                                                       /*}}}*/
+#ifndef PKGLIB_CACHEITERATORS_H
+#define PKGLIB_CACHEITERATORS_H
+
+
+// Package Iterator
+class pkgCache::PkgIterator
+{
+   friend class pkgCache;
+   Package *Pkg;
+   pkgCache *Owner;
+   long HashIndex;
+
+   protected:
+   
+   // This constructor is the 'begin' constructor, never use it.
+   inline PkgIterator(pkgCache &Owner) : Owner(&Owner), HashIndex(-1)
+   {
+      Pkg = Owner.PkgP;
+      operator ++(0);
+   };
+   
+   public:
+
+   enum OkState {NeedsNothing,NeedsUnpack,NeedsConfigure};
+      
+   // Iteration
+   void operator ++(int);
+   inline void operator ++() {operator ++(0);};
+   inline bool end() const {return Owner == 0 || Pkg == Owner->PkgP?true:false;};
+
+   // Comparison
+   inline bool operator ==(const PkgIterator &B) const {return Pkg == B.Pkg;};
+   inline bool operator !=(const PkgIterator &B) const {return Pkg != B.Pkg;};
+                          
+   // Accessors
+   inline Package *operator ->() {return Pkg;};
+   inline Package const *operator ->() const {return Pkg;};
+   inline Package const &operator *() const {return *Pkg;};
+   inline operator Package *() {return Pkg == Owner->PkgP?0:Pkg;};
+   inline operator Package const *() const {return Pkg == Owner->PkgP?0:Pkg;};
+   inline pkgCache *Cache() {return Owner;};
+   
+   inline const char *Name() const {return Pkg->Name == 0?0:Owner->StrP + Pkg->Name;};
+   inline const char *Section() const {return Pkg->Section == 0?0:Owner->StrP + Pkg->Section;};
+   inline bool Purge() const {return Pkg->CurrentState == pkgCache::State::Purge ||
+        (Pkg->CurrentVer == 0 && Pkg->CurrentState == pkgCache::State::NotInstalled);};
+   inline VerIterator VersionList() const;
+   inline VerIterator CurrentVer() const;
+   inline DepIterator RevDependsList() const;
+   inline PrvIterator ProvidesList() const;
+   inline unsigned long Index() const {return Pkg - Owner->PkgP;};
+   OkState State() const;
+   
+   // Constructors
+   inline PkgIterator(pkgCache &Owner,Package *Trg) : Pkg(Trg), Owner(&Owner),
+          HashIndex(0) 
+   { 
+      if (Pkg == 0)
+        Pkg = Owner.PkgP;
+   };
+   inline PkgIterator() : Pkg(0), Owner(0), HashIndex(0) {};
+};
+
+// Version Iterator
+class pkgCache::VerIterator
+{
+   Version *Ver;
+   pkgCache *Owner;
+
+   void _dummy();
+   
+   public:
+
+   // Iteration
+   void operator ++(int) {if (Ver != Owner->VerP) Ver = Owner->VerP + Ver->NextVer;};
+   inline void operator ++() {operator ++(0);};
+   inline bool end() const {return Owner == NULL || (Ver == Owner->VerP?true:false);};
+   inline void operator =(const VerIterator &B) {Ver = B.Ver; Owner = B.Owner;};
+   
+   // Comparison
+   inline bool operator ==(const VerIterator &B) const {return Ver == B.Ver;};
+   inline bool operator !=(const VerIterator &B) const {return Ver != B.Ver;};
+   int CompareVer(const VerIterator &B) const;
+   
+   // Accessors
+   inline Version *operator ->() {return Ver;};
+   inline Version const *operator ->() const {return Ver;};
+   inline Version &operator *() {return *Ver;};
+   inline Version const &operator *() const {return *Ver;};
+   inline operator Version *() {return Ver == Owner->VerP?0:Ver;};
+   inline operator Version const *() const {return Ver == Owner->VerP?0:Ver;};
+   inline pkgCache *Cache() {return Owner;};
+      
+   inline const char *VerStr() const {return Ver->VerStr == 0?0:Owner->StrP + Ver->VerStr;};
+   inline const char *Section() const {return Ver->Section == 0?0:Owner->StrP + Ver->Section;};
+   inline const char *Arch() const {return Ver->Arch == 0?0:Owner->StrP + Ver->Arch;};
+   inline PkgIterator ParentPkg() const {return PkgIterator(*Owner,Owner->PkgP + Ver->ParentPkg);};
+   inline DescIterator DescriptionList() const;
+   DescIterator TranslatedDescription() const;
+   inline DepIterator DependsList() const;
+   inline PrvIterator ProvidesList() const;
+   inline VerFileIterator FileList() const;
+   inline unsigned long Index() const {return Ver - Owner->VerP;};
+   bool Downloadable() const;
+   inline const char *PriorityType() {return Owner->Priority(Ver->Priority);};
+   string RelStr();
+   
+   bool Automatic() const;
+   VerFileIterator NewestFile() const;
+
+   inline VerIterator() : Ver(0), Owner(0) {};   
+   inline VerIterator(pkgCache &Owner,Version *Trg = 0) : Ver(Trg), 
+              Owner(&Owner) 
+   { 
+      if (Ver == 0)
+        Ver = Owner.VerP;
+   };
+};
+
+// Description Iterator
+class pkgCache::DescIterator
+{
+   Description *Desc;
+   pkgCache *Owner;
+   
+   void _dummy();
+   
+   public:
+
+   // Iteration
+   void operator ++(int) {if (Desc != Owner->DescP) Desc = Owner->DescP + Desc->NextDesc;};
+   inline void operator ++() {operator ++(0);};
+   inline bool end() const {return Desc == Owner->DescP?true:false;};
+   inline void operator =(const DescIterator &B) {Desc = B.Desc; Owner = B.Owner;};
+   
+   // Comparison
+   inline bool operator ==(const DescIterator &B) const {return Desc == B.Desc;};
+   inline bool operator !=(const DescIterator &B) const {return Desc != B.Desc;};
+   int CompareDesc(const DescIterator &B) const;
+   
+   // Accessors
+   inline Description *operator ->() {return Desc;};
+   inline Description const *operator ->() const {return Desc;};
+   inline Description &operator *() {return *Desc;};
+   inline Description const &operator *() const {return *Desc;};
+   inline operator Description *() {return Desc == Owner->DescP?0:Desc;};
+   inline operator Description const *() const {return Desc == Owner->DescP?0:Desc;};
+   inline pkgCache *Cache() {return Owner;};
+      
+   inline const char *LanguageCode() const {return Owner->StrP + Desc->language_code;};
+   inline const char *md5() const {return Owner->StrP + Desc->md5sum;};
+   inline DescFileIterator FileList() const;
+   inline unsigned long Index() const {return Desc - Owner->DescP;};
+
+   inline DescIterator() : Desc(0), Owner(0) {};   
+   inline DescIterator(pkgCache &Owner,Description *Trg = 0) : Desc(Trg), 
+              Owner(&Owner) 
+   { 
+      if (Desc == 0)
+        Desc = Owner.DescP;
+   };
+};
+
+// Dependency iterator
+class pkgCache::DepIterator
+{
+   Dependency *Dep;
+   enum {DepVer, DepRev} Type;
+   pkgCache *Owner;
+   
+   void _dummy();
+   
+   public:
+
+   // Iteration
+   void operator ++(int) {if (Dep != Owner->DepP) Dep = Owner->DepP +
+       (Type == DepVer?Dep->NextDepends:Dep->NextRevDepends);};
+   inline void operator ++() {operator ++(0);};
+   inline bool end() const {return Owner == 0 || Dep == Owner->DepP?true:false;};
+   
+   // Comparison
+   inline bool operator ==(const DepIterator &B) const {return Dep == B.Dep;};
+   inline bool operator !=(const DepIterator &B) const {return Dep != B.Dep;};
+
+   // Accessors
+   inline Dependency *operator ->() {return Dep;};
+   inline Dependency const *operator ->() const {return Dep;};
+   inline Dependency &operator *() {return *Dep;};
+   inline Dependency const &operator *() const {return *Dep;};
+   inline operator Dependency *() {return Dep == Owner->DepP?0:Dep;};
+   inline operator Dependency const *() const {return Dep == Owner->DepP?0:Dep;};
+   inline pkgCache *Cache() {return Owner;};
+   
+   inline const char *TargetVer() const {return Dep->Version == 0?0:Owner->StrP + Dep->Version;};
+   inline PkgIterator TargetPkg() {return PkgIterator(*Owner,Owner->PkgP + Dep->Package);};
+   inline PkgIterator SmartTargetPkg() {PkgIterator R(*Owner,0);SmartTargetPkg(R);return R;};
+   inline VerIterator ParentVer() {return VerIterator(*Owner,Owner->VerP + Dep->ParentVer);};
+   inline PkgIterator ParentPkg() {return PkgIterator(*Owner,Owner->PkgP + Owner->VerP[Dep->ParentVer].ParentPkg);};
+   inline bool Reverse() {return Type == DepRev;};
+   inline unsigned long Index() const {return Dep - Owner->DepP;};
+   bool IsCritical();
+   void GlobOr(DepIterator &Start,DepIterator &End);
+   Version **AllTargets();   
+   bool SmartTargetPkg(PkgIterator &Result);
+   inline const char *CompType() {return Owner->CompType(Dep->CompareOp);};
+   inline const char *DepType() {return Owner->DepType(Dep->Type);};
+   
+   inline DepIterator(pkgCache &Owner,Dependency *Trg,Version * = 0) :
+          Dep(Trg), Type(DepVer), Owner(&Owner) 
+   {
+      if (Dep == 0)
+        Dep = Owner.DepP;
+   };
+   inline DepIterator(pkgCache &Owner,Dependency *Trg,Package *) :
+          Dep(Trg), Type(DepRev), Owner(&Owner)
+   {
+      if (Dep == 0)
+        Dep = Owner.DepP;
+   };
+   inline DepIterator() : Dep(0), Type(DepVer), Owner(0) {};
+};
+
+// Provides iterator
+class pkgCache::PrvIterator
+{
+   Provides *Prv;
+   enum {PrvVer, PrvPkg} Type;
+   pkgCache *Owner;
+   
+   void _dummy();
+   
+   public:
+
+   // Iteration
+   void operator ++(int) {if (Prv != Owner->ProvideP) Prv = Owner->ProvideP +
+       (Type == PrvVer?Prv->NextPkgProv:Prv->NextProvides);};
+   inline void operator ++() {operator ++(0);};
+   inline bool end() const {return Owner == 0 || Prv == Owner->ProvideP?true:false;};
+   
+   // Comparison
+   inline bool operator ==(const PrvIterator &B) const {return Prv == B.Prv;};
+   inline bool operator !=(const PrvIterator &B) const {return Prv != B.Prv;};
+
+   // Accessors
+   inline Provides *operator ->() {return Prv;};
+   inline Provides const *operator ->() const {return Prv;};
+   inline Provides &operator *() {return *Prv;};
+   inline Provides const &operator *() const {return *Prv;};
+   inline operator Provides *() {return Prv == Owner->ProvideP?0:Prv;};
+   inline operator Provides const *() const {return Prv == Owner->ProvideP?0:Prv;};
+   inline pkgCache *Cache() {return Owner;};
+
+   inline const char *Name() const {return Owner->StrP + Owner->PkgP[Prv->ParentPkg].Name;};
+   inline const char *ProvideVersion() const {return Prv->ProvideVersion == 0?0:Owner->StrP + Prv->ProvideVersion;};
+   inline PkgIterator ParentPkg() {return PkgIterator(*Owner,Owner->PkgP + Prv->ParentPkg);};
+   inline VerIterator OwnerVer() {return VerIterator(*Owner,Owner->VerP + Prv->Version);};
+   inline PkgIterator OwnerPkg() {return PkgIterator(*Owner,Owner->PkgP + Owner->VerP[Prv->Version].ParentPkg);};
+   inline unsigned long Index() const {return Prv - Owner->ProvideP;};
+
+   inline PrvIterator() : Prv(0), Type(PrvVer), Owner(0)  {};
+
+   inline PrvIterator(pkgCache &Owner,Provides *Trg,Version *) :
+          Prv(Trg), Type(PrvVer), Owner(&Owner) 
+   {
+      if (Prv == 0)
+        Prv = Owner.ProvideP;
+   };
+   inline PrvIterator(pkgCache &Owner,Provides *Trg,Package *) : 
+          Prv(Trg), Type(PrvPkg), Owner(&Owner)
+   {
+      if (Prv == 0)
+        Prv = Owner.ProvideP;
+   };
+};
+
+// Package file 
+class pkgCache::PkgFileIterator
+{
+   pkgCache *Owner;
+   PackageFile *File;
+
+   public:
+
+   // Iteration
+   void operator ++(int) {if (File!= Owner->PkgFileP) File = Owner->PkgFileP + File->NextFile;};
+   inline void operator ++() {operator ++(0);};
+   inline bool end() const {return File == Owner->PkgFileP?true:false;};
+
+   // Comparison
+   inline bool operator ==(const PkgFileIterator &B) const {return File == B.File;};
+   inline bool operator !=(const PkgFileIterator &B) const {return File != B.File;};
+                          
+   // Accessors
+   inline PackageFile *operator ->() {return File;};
+   inline PackageFile const *operator ->() const {return File;};
+   inline PackageFile const &operator *() const {return *File;};
+   inline operator PackageFile *() {return File == Owner->PkgFileP?0:File;};
+   inline operator PackageFile const *() const {return File == Owner->PkgFileP?0:File;};
+   inline pkgCache *Cache() {return Owner;};
+
+   inline const char *FileName() const {return File->FileName == 0?0:Owner->StrP + File->FileName;};
+   inline const char *Archive() const {return File->Archive == 0?0:Owner->StrP + File->Archive;};
+   inline const char *Component() const {return File->Component == 0?0:Owner->StrP + File->Component;};
+   inline const char *Version() const {return File->Version == 0?0:Owner->StrP + File->Version;};
+   inline const char *Origin() const {return File->Origin == 0?0:Owner->StrP + File->Origin;};
+   inline const char *Label() const {return File->Label == 0?0:Owner->StrP + File->Label;};
+   inline const char *Site() const {return File->Site == 0?0:Owner->StrP + File->Site;};
+   inline const char *Architecture() const {return File->Architecture == 0?0:Owner->StrP + File->Architecture;};
+   inline const char *IndexType() const {return File->IndexType == 0?0:Owner->StrP + File->IndexType;};
+
+   inline unsigned long Index() const {return File - Owner->PkgFileP;};
+
+   bool IsOk();
+   string RelStr();
+   
+   // Constructors
+   inline PkgFileIterator() : Owner(0), File(0) {};
+   inline PkgFileIterator(pkgCache &Owner) : Owner(&Owner), File(Owner.PkgFileP) {};
+   inline PkgFileIterator(pkgCache &Owner,PackageFile *Trg) : Owner(&Owner), File(Trg) {};
+};
+
+// Version File 
+class pkgCache::VerFileIterator
+{
+   pkgCache *Owner;
+   VerFile *FileP;
+
+   public:
+
+   // Iteration
+   void operator ++(int) {if (FileP != Owner->VerFileP) FileP = Owner->VerFileP + FileP->NextFile;};
+   inline void operator ++() {operator ++(0);};
+   inline bool end() const {return FileP == Owner->VerFileP?true:false;};
+
+   // Comparison
+   inline bool operator ==(const VerFileIterator &B) const {return FileP == B.FileP;};
+   inline bool operator !=(const VerFileIterator &B) const {return FileP != B.FileP;};
+                          
+   // Accessors
+   inline VerFile *operator ->() {return FileP;};
+   inline VerFile const *operator ->() const {return FileP;};
+   inline VerFile const &operator *() const {return *FileP;};
+   inline operator VerFile *() {return FileP == Owner->VerFileP?0:FileP;};
+   inline operator VerFile const *() const {return FileP == Owner->VerFileP?0:FileP;};
+   inline pkgCache *Cache() {return Owner;};
+  
+   inline PkgFileIterator File() const {return PkgFileIterator(*Owner,FileP->File + Owner->PkgFileP);};
+   inline unsigned long Index() const {return FileP - Owner->VerFileP;};
+      
+   inline VerFileIterator() : Owner(0), FileP(0) {};
+   inline VerFileIterator(pkgCache &Owner,VerFile *Trg) : Owner(&Owner), FileP(Trg) {};
+};
+
+// Description File 
+class pkgCache::DescFileIterator
+{
+   pkgCache *Owner;
+   DescFile *FileP;
+
+   public:
+
+   // Iteration
+   void operator ++(int) {if (FileP != Owner->DescFileP) FileP = Owner->DescFileP + FileP->NextFile;};
+   inline void operator ++() {operator ++(0);};
+   inline bool end() const {return FileP == Owner->DescFileP?true:false;};
+
+   // Comparison
+   inline bool operator ==(const DescFileIterator &B) const {return FileP == B.FileP;};
+   inline bool operator !=(const DescFileIterator &B) const {return FileP != B.FileP;};
+                          
+   // Accessors
+   inline DescFile *operator ->() {return FileP;};
+   inline DescFile const *operator ->() const {return FileP;};
+   inline DescFile const &operator *() const {return *FileP;};
+   inline operator DescFile *() {return FileP == Owner->DescFileP?0:FileP;};
+   inline operator DescFile const *() const {return FileP == Owner->DescFileP?0:FileP;};
+   inline pkgCache *Cache() {return Owner;};
+  
+   inline PkgFileIterator File() const {return PkgFileIterator(*Owner,FileP->File + Owner->PkgFileP);};
+   inline unsigned long Index() const {return FileP - Owner->DescFileP;};
+      
+   inline DescFileIterator() : Owner(0), FileP(0) {};
+   inline DescFileIterator(pkgCache &Owner,DescFile *Trg) : Owner(&Owner), FileP(Trg) {};
+};
+
+// Inlined Begin functions cant be in the class because of order problems
+inline pkgCache::VerIterator pkgCache::PkgIterator::VersionList() const
+       {return VerIterator(*Owner,Owner->VerP + Pkg->VersionList);};
+inline pkgCache::VerIterator pkgCache::PkgIterator::CurrentVer() const
+       {return VerIterator(*Owner,Owner->VerP + Pkg->CurrentVer);};
+inline pkgCache::DepIterator pkgCache::PkgIterator::RevDependsList() const
+       {return DepIterator(*Owner,Owner->DepP + Pkg->RevDepends,Pkg);};
+inline pkgCache::PrvIterator pkgCache::PkgIterator::ProvidesList() const
+       {return PrvIterator(*Owner,Owner->ProvideP + Pkg->ProvidesList,Pkg);};
+inline pkgCache::DescIterator pkgCache::VerIterator::DescriptionList() const
+       {return DescIterator(*Owner,Owner->DescP + Ver->DescriptionList);};
+inline pkgCache::PrvIterator pkgCache::VerIterator::ProvidesList() const
+       {return PrvIterator(*Owner,Owner->ProvideP + Ver->ProvidesList,Ver);};
+inline pkgCache::DepIterator pkgCache::VerIterator::DependsList() const
+       {return DepIterator(*Owner,Owner->DepP + Ver->DependsList,Ver);};
+inline pkgCache::VerFileIterator pkgCache::VerIterator::FileList() const
+       {return VerFileIterator(*Owner,Owner->VerFileP + Ver->FileList);};
+inline pkgCache::DescFileIterator pkgCache::DescIterator::FileList() const
+       {return DescFileIterator(*Owner,Owner->DescFileP + Desc->FileList);};
+
+#endif
diff --git a/apt-src/debversion.cc b/apt-src/debversion.cc
new file mode 100644 (file)
index 0000000..d358d0b
--- /dev/null
@@ -0,0 +1,294 @@
+/*
+Apt is copyright 1997, 1998, 1999 Jason Gunthorpe and others.
+Apt is currently developed by APT Development Team <deity@lists.debian.org>.
+
+License: GPLv2+
+
+       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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+See /usr/share/common-licenses/GPL-2, or
+<http://www.gnu.org/copyleft/gpl.txt> for the terms of the latest version
+of the GNU General Public License.
+*/
+
+
+// -*- mode: cpp; mode: fold -*-
+// Description                                                         /*{{{*/
+// $Id: debversion.cc,v 1.8 2003/09/10 23:39:49 mdz Exp $
+/* ######################################################################
+
+   Debian Version - Versioning system for Debian
+
+   This implements the standard Debian versioning system.
+   
+   ##################################################################### */
+                                                                       /*}}}*/
+// Include Files                                                       /*{{{*/
+#define APT_COMPATIBILITY 986
+
+#include "debversion.h"
+#include "pkgcache.h"
+
+#include <stdlib.h>
+#include <ctype.h>
+                                                                       /*}}}*/
+
+debVersioningSystem debVS;
+
+// debVS::debVersioningSystem - Constructor                            /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+debVersioningSystem::debVersioningSystem()
+{
+   Label = "Standard .deb";
+}
+                                                                       /*}}}*/
+
+// debVS::CmpFragment - Compare versions                               /*{{{*/
+// ---------------------------------------------------------------------
+/* This compares a fragment of the version. This is a slightly adapted 
+   version of what dpkg uses. */
+#define order(x) ((x) == '~' ? -1    \
+               : isdigit((x)) ? 0   \
+               : !(x) ? 0           \
+               : isalpha((x)) ? (x) \
+               : (x) + 256)
+int debVersioningSystem::CmpFragment(const char *A,const char *AEnd,
+                                    const char *B,const char *BEnd)
+{
+   if (A >= AEnd && B >= BEnd)
+      return 0;
+   if (A >= AEnd)
+   {
+      if (*B == '~') return 1;
+      return -1;
+   }
+   if (B >= BEnd)
+   {
+      if (*A == '~') return -1;
+      return 1;
+   }
+
+   /* Iterate over the whole string
+      What this does is to split the whole string into groups of
+      numeric and non numeric portions. For instance:
+         a67bhgs89
+      Has 4 portions 'a', '67', 'bhgs', '89'. A more normal:
+         2.7.2-linux-1
+      Has '2', '.', '7', '.' ,'-linux-','1' */
+   const char *lhs = A;
+   const char *rhs = B;
+   while (lhs != AEnd && rhs != BEnd)
+   {
+      int first_diff = 0;
+
+      while (lhs != AEnd && rhs != BEnd &&
+            (!isdigit(*lhs) || !isdigit(*rhs)))
+      {
+        int vc = order(*lhs);
+        int rc = order(*rhs);
+        if (vc != rc)
+           return vc - rc;
+        lhs++; rhs++;
+      }
+
+      while (*lhs == '0')
+        lhs++;
+      while (*rhs == '0')
+        rhs++;
+      while (isdigit(*lhs) && isdigit(*rhs))
+      {
+        if (!first_diff)
+           first_diff = *lhs - *rhs;
+        lhs++;
+        rhs++;
+      }
+
+      if (isdigit(*lhs))
+        return 1;
+      if (isdigit(*rhs))
+        return -1;
+      if (first_diff)
+        return first_diff;
+   }
+
+   // The strings must be equal
+   if (lhs == AEnd && rhs == BEnd)
+      return 0;
+
+   // lhs is shorter
+   if (lhs == AEnd)
+   {
+      if (*rhs == '~') return 1;
+      return -1;
+   }
+
+   // rhs is shorter
+   if (rhs == BEnd)
+   {
+      if (*lhs == '~') return -1;
+      return 1;
+   }
+
+   // Shouldnt happen
+   return 1;
+}
+                                                                       /*}}}*/
+// debVS::CmpVersion - Comparison for versions                         /*{{{*/
+// ---------------------------------------------------------------------
+/* This fragments the version into E:V-R triples and compares each 
+   portion separately. */
+int debVersioningSystem::DoCmpVersion(const char *A,const char *AEnd,
+                                     const char *B,const char *BEnd)
+{
+   // Strip off the epoch and compare it 
+   const char *lhs = A;
+   const char *rhs = B;
+   for (;lhs != AEnd && *lhs != ':'; lhs++);
+   for (;rhs != BEnd && *rhs != ':'; rhs++);
+   if (lhs == AEnd)
+      lhs = A;
+   if (rhs == BEnd)
+      rhs = B;
+   
+   // Special case: a zero epoch is the same as no epoch,
+   // so remove it.
+   if (lhs != A)
+   {
+      for (; *A == '0'; ++A);
+      if (A == lhs)
+      {
+        ++A;
+        ++lhs;
+      }
+   }
+   if (rhs != B)
+   {
+      for (; *B == '0'; ++B);
+      if (B == rhs)
+      {
+        ++B;
+        ++rhs;
+      }
+   }
+
+   // Compare the epoch
+   int Res = CmpFragment(A,lhs,B,rhs);
+   if (Res != 0)
+      return Res;
+
+   // Skip the :
+   if (lhs != A)
+      lhs++;
+   if (rhs != B)
+      rhs++;
+   
+   // Find the last - 
+   const char *dlhs = AEnd-1;
+   const char *drhs = BEnd-1;
+   for (;dlhs > lhs && *dlhs != '-'; dlhs--);
+   for (;drhs > rhs && *drhs != '-'; drhs--);
+
+   if (dlhs == lhs)
+      dlhs = AEnd;
+   if (drhs == rhs)
+      drhs = BEnd;
+   
+   // Compare the main version
+   Res = CmpFragment(lhs,dlhs,rhs,drhs);
+   if (Res != 0)
+      return Res;
+   
+   // Skip the -
+   if (dlhs != lhs)
+      dlhs++;
+   if (drhs != rhs)
+      drhs++;
+   
+   return CmpFragment(dlhs,AEnd,drhs,BEnd);
+}
+                                                                       /*}}}*/
+// debVS::CheckDep - Check a single dependency                         /*{{{*/
+// ---------------------------------------------------------------------
+/* This simply preforms the version comparison and switch based on 
+   operator. If DepVer is 0 then we are comparing against a provides
+   with no version. */
+bool debVersioningSystem::CheckDep(const char *PkgVer,
+                                  int Op,const char *DepVer)
+{
+   if (DepVer == 0 || DepVer[0] == 0)
+      return true;
+   if (PkgVer == 0 || PkgVer[0] == 0)
+      return false;
+   
+   // Perform the actual comparision.
+   int Res = CmpVersion(PkgVer,DepVer);
+   switch (Op & 0x0F)
+   {
+      case pkgCache::Dep::LessEq:
+      if (Res <= 0)
+        return true;
+      break;
+      
+      case pkgCache::Dep::GreaterEq:
+      if (Res >= 0)
+        return true;
+      break;
+      
+      case pkgCache::Dep::Less:
+      if (Res < 0)
+        return true;
+      break;
+      
+      case pkgCache::Dep::Greater:
+      if (Res > 0)
+        return true;
+      break;
+      
+      case pkgCache::Dep::Equals:
+      if (Res == 0)
+        return true;
+      break;
+      
+      case pkgCache::Dep::NotEquals:
+      if (Res != 0)
+        return true;
+      break;
+   }
+
+   return false;
+}
+                                                                       /*}}}*/
+// debVS::UpstreamVersion - Return the upstream version string         /*{{{*/
+// ---------------------------------------------------------------------
+/* This strips all the debian specific information from the version number */
+string debVersioningSystem::UpstreamVersion(const char *Ver)
+{
+   // Strip off the bit before the first colon
+   const char *I = Ver;
+   for (; *I != 0 && *I != ':'; I++);
+   if (*I == ':')
+      Ver = I + 1;
+   
+   // Chop off the trailing -
+   I = Ver;
+   unsigned Last = strlen(Ver);
+   for (; *I != 0; I++)
+      if (*I == '-')
+        Last = I - Ver;
+   
+   return string(Ver,Last);
+}
+                                                                       /*}}}*/
diff --git a/apt-src/debversion.h b/apt-src/debversion.h
new file mode 100644 (file)
index 0000000..4826ae3
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+Apt is copyright 1997, 1998, 1999 Jason Gunthorpe and others.
+Apt is currently developed by APT Development Team <deity@lists.debian.org>.
+
+License: GPLv2+
+
+       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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+See /usr/share/common-licenses/GPL-2, or
+<http://www.gnu.org/copyleft/gpl.txt> for the terms of the latest version
+of the GNU General Public License.
+*/
+
+// -*- mode: cpp; mode: fold -*-
+// Description                                                         /*{{{*/
+// $Id: debversion.h,v 1.3 2001/05/03 05:25:04 jgg Exp $
+/* ######################################################################
+
+   Debian Version - Versioning system for Debian
+
+   This implements the standard Debian versioning system.
+   
+   ##################################################################### */
+                                                                       /*}}}*/
+#ifndef PKGLIB_DEBVERSION_H
+#define PKGLIB_DEBVERSION_H
+
+
+
+#include "version.h"
+    
+class debVersioningSystem : public pkgVersioningSystem
+{     
+   public:
+   
+   static int CmpFragment(const char *A, const char *AEnd, const char *B,
+                         const char *BEnd);
+   
+   // Compare versions..
+   virtual int DoCmpVersion(const char *A,const char *Aend,
+                         const char *B,const char *Bend);
+   virtual bool CheckDep(const char *PkgVer,int Op,const char *DepVer);
+   virtual int DoCmpReleaseVer(const char *A,const char *Aend,
+                            const char *B,const char *Bend)
+   {
+      return DoCmpVersion(A,Aend,B,Bend);
+   }   
+   virtual string UpstreamVersion(const char *A);
+
+   debVersioningSystem();
+};
+
+extern debVersioningSystem debVS;
+
+#ifdef APT_COMPATIBILITY
+#if APT_COMPATIBILITY != 986
+#warning "Using APT_COMPATIBILITY"
+#endif
+
+inline int pkgVersionCompare(const char *A, const char *B)
+{
+   return debVS.CmpVersion(A,B);
+}
+inline int pkgVersionCompare(const char *A, const char *AEnd, 
+                            const char *B, const char *BEnd)
+{
+   return debVS.DoCmpVersion(A,AEnd,B,BEnd);
+}
+inline int pkgVersionCompare(string A,string B)
+{
+   return debVS.CmpVersion(A,B);
+}
+inline bool pkgCheckDep(const char *DepVer,const char *PkgVer,int Op)
+{
+   return debVS.CheckDep(PkgVer,Op,DepVer);
+}
+inline string pkgBaseVersion(const char *Ver)
+{
+   return debVS.UpstreamVersion(Ver);
+}
+#endif
+
+#endif
diff --git a/apt-src/fileutl.h b/apt-src/fileutl.h
new file mode 100644 (file)
index 0000000..73b5ea3
--- /dev/null
@@ -0,0 +1,98 @@
+// -*- mode: cpp; mode: fold -*-
+// Description                                                         /*{{{*/
+// $Id: fileutl.h,v 1.26 2001/05/07 05:06:52 jgg Exp $
+/* ######################################################################
+   
+   File Utilities
+   
+   CopyFile - Buffered copy of a single file
+   GetLock - dpkg compatible lock file manipulation (fcntl)
+   FileExists - Returns true if the file exists
+   SafeGetCWD - Returns the CWD in a string with overrun protection 
+   
+   The file class is a handy abstraction for various functions+classes
+   that need to accept filenames.
+   
+   This source is placed in the Public Domain, do with it what you will
+   It was originally written by Jason Gunthorpe.
+   
+   ##################################################################### */
+                                                                       /*}}}*/
+#ifndef PKGLIB_FILEUTL_H
+#define PKGLIB_FILEUTL_H
+
+
+#include <string>
+
+using std::string;
+
+class FileFd
+{
+   protected:
+   int iFd;
+   enum LocalFlags {AutoClose = (1<<0),Fail = (1<<1),DelOnFail = (1<<2),
+                    HitEof = (1<<3)};
+   unsigned long Flags;
+   string FileName;
+   
+   public:
+   enum OpenMode {ReadOnly,WriteEmpty,WriteExists,WriteAny,WriteTemp};
+   
+   inline bool Read(void *To,unsigned long Size,bool AllowEof)
+   {
+      unsigned long Jnk;
+      if (AllowEof)
+        return Read(To,Size,&Jnk);
+      return Read(To,Size);
+   }   
+   bool Read(void *To,unsigned long Size,unsigned long *Actual = 0);
+   bool Write(const void *From,unsigned long Size);
+   bool Seek(unsigned long To);
+   bool Skip(unsigned long To);
+   bool Truncate(unsigned long To);
+   unsigned long Tell();
+   unsigned long Size();
+   bool Open(string FileName,OpenMode Mode,unsigned long Perms = 0666);
+   bool Close();
+   bool Sync();
+   
+   // Simple manipulators
+   inline int Fd() {return iFd;};
+   inline void Fd(int fd) {iFd = fd;};
+   inline bool IsOpen() {return iFd >= 0;};
+   inline bool Failed() {return (Flags & Fail) == Fail;};
+   inline void EraseOnFailure() {Flags |= DelOnFail;};
+   inline void OpFail() {Flags |= Fail;};
+   inline bool Eof() {return (Flags & HitEof) == HitEof;};
+   inline string &Name() {return FileName;};
+   
+   FileFd(string FileName,OpenMode Mode,unsigned long Perms = 0666) : iFd(-1), 
+            Flags(0) 
+   {
+      Open(FileName,Mode,Perms);
+   };
+   FileFd(int Fd = -1) : iFd(Fd), Flags(AutoClose) {};
+   FileFd(int Fd,bool) : iFd(Fd), Flags(0) {};
+   virtual ~FileFd();
+};
+
+bool RunScripts(const char *Cnf);
+bool CopyFile(FileFd &From,FileFd &To);
+int GetLock(string File,bool Errors = true);
+bool FileExists(string File);
+string SafeGetCWD();
+void SetCloseExec(int Fd,bool Close);
+void SetNonBlock(int Fd,bool Block);
+bool WaitFd(int Fd,bool write = false,unsigned long timeout = 0);
+pid_t ExecFork();
+bool ExecWait(pid_t Pid,const char *Name,bool Reap = false);
+
+// File string manipulators
+string flNotDir(string File);
+string flNotFile(string File);
+string flNoLink(string File);
+string flExtension(string File);
+string flCombine(string Dir,string File);
+
+#endif
diff --git a/apt-src/mmap.h b/apt-src/mmap.h
new file mode 100644 (file)
index 0000000..3db7740
--- /dev/null
@@ -0,0 +1,102 @@
+// -*- mode: cpp; mode: fold -*-
+// Description                                                         /*{{{*/
+// $Id: mmap.h,v 1.12 2001/05/14 05:16:43 jgg Exp $
+/* ######################################################################
+   
+   MMap Class - Provides 'real' mmap or a faked mmap using read().
+
+   The purpose of this code is to provide a generic way for clients to
+   access the mmap function. In enviroments that do not support mmap
+   from file fd's this function will use read and normal allocated 
+   memory.
+   
+   Writing to a public mmap will always fully comit all changes when the 
+   class is deleted. Ie it will rewrite the file, unless it is readonly
+
+   The DynamicMMap class is used to help the on-disk data structure 
+   generators. It provides a large allocated workspace and members
+   to allocate space from the workspace in an effecient fashion.
+   
+   This source is placed in the Public Domain, do with it what you will
+   It was originally written by Jason Gunthorpe.
+   
+   ##################################################################### */
+                                                                       /*}}}*/
+#ifndef PKGLIB_MMAP_H
+#define PKGLIB_MMAP_H
+
+
+#include <string>
+#include "fileutl.h"
+
+using std::string;
+
+/* This should be a 32 bit type, larger tyes use too much ram and smaller
+   types are too small. Where ever possible 'unsigned long' should be used
+   instead of this internal type */
+typedef unsigned int map_ptrloc;
+
+class MMap
+{
+   protected:
+   
+   unsigned long Flags;
+   unsigned long iSize;
+   void *Base;
+
+   bool Map(FileFd &Fd);
+   bool Close(bool DoSync = true);
+   
+   public:
+
+   enum OpenFlags {NoImmMap = (1<<0),Public = (1<<1),ReadOnly = (1<<2),
+                   UnMapped = (1<<3)};
+      
+   // Simple accessors
+   inline operator void *() {return Base;};
+   inline void *Data() {return Base;}; 
+   inline unsigned long Size() {return iSize;};
+   
+   // File manipulators
+   bool Sync();
+   bool Sync(unsigned long Start,unsigned long Stop);
+   
+   MMap(FileFd &F,unsigned long Flags);
+   MMap(unsigned long Flags);
+   virtual ~MMap();
+};
+
+class DynamicMMap : public MMap
+{
+   public:
+   
+   // This is the allocation pool structure
+   struct Pool
+   {
+      unsigned long ItemSize;
+      unsigned long Start;
+      unsigned long Count;
+   };
+   
+   protected:
+   
+   FileFd *Fd;
+   unsigned long WorkSpace;
+   Pool *Pools;
+   unsigned int PoolCount;
+   
+   public:
+
+   // Allocation
+   unsigned long RawAllocate(unsigned long Size,unsigned long Aln = 0);
+   unsigned long Allocate(unsigned long ItemSize);
+   unsigned long WriteString(const char *String,unsigned long Len = (unsigned long)-1);
+   inline unsigned long WriteString(const string &S) {return WriteString(S.c_str(),S.length());};
+   void UsePools(Pool &P,unsigned int Count) {Pools = &P; PoolCount = Count;};
+   
+   DynamicMMap(FileFd &F,unsigned long Flags,unsigned long WorkSpace = 2*1024*1024);
+   DynamicMMap(unsigned long Flags,unsigned long WorkSpace = 2*1024*1024);
+   virtual ~DynamicMMap();
+};
+
+#endif
diff --git a/apt-src/pkgcache.h b/apt-src/pkgcache.h
new file mode 100644 (file)
index 0000000..c617951
--- /dev/null
@@ -0,0 +1,380 @@
+/*
+Apt is copyright 1997, 1998, 1999 Jason Gunthorpe and others.
+Apt is currently developed by APT Development Team <deity@lists.debian.org>.
+
+License: GPLv2+
+
+       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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+See /usr/share/common-licenses/GPL-2, or
+<http://www.gnu.org/copyleft/gpl.txt> for the terms of the latest version
+of the GNU General Public License.
+*/
+
+// -*- mode: cpp; mode: fold -*-
+// Description                                                         /*{{{*/
+// $Id: pkgcache.h,v 1.25 2001/07/01 22:28:24 jgg Exp $
+/* ######################################################################
+   
+   Cache - Structure definitions for the cache file
+   
+   Please see doc/apt-pkg/cache.sgml for a more detailed description of 
+   this format. Also be sure to keep that file up-to-date!!
+   
+   Clients should always use the CacheIterators classes for access to the
+   cache. They provide a simple STL-like method for traversing the links
+   of the datastructure.
+   
+   See pkgcachegen.h for information about generating cache structures.
+   
+   ##################################################################### */
+                                                                       /*}}}*/
+#ifndef PKGLIB_PKGCACHE_H
+#define PKGLIB_PKGCACHE_H
+
+
+#include <string>
+#include <time.h>
+#include "mmap.h"
+
+using std::string;
+    
+class pkgVersioningSystem;
+class pkgCache
+{
+   public:
+   // Cache element predeclarations
+   struct Header;
+   struct Package;
+   struct PackageFile;
+   struct Version;
+   struct Description;
+   struct Provides;
+   struct Dependency;
+   struct StringItem;
+   struct VerFile;
+   struct DescFile;
+   
+   // Iterators
+   class PkgIterator;
+   class VerIterator;
+   class DescIterator;
+   class DepIterator;
+   class PrvIterator;
+   class PkgFileIterator;
+   class VerFileIterator;
+   class DescFileIterator;
+   friend class PkgIterator;
+   friend class VerIterator;
+   friend class DescInterator;
+   friend class DepIterator;
+   friend class PrvIterator;
+   friend class PkgFileIterator;
+   friend class VerFileIterator;
+   friend class DescFileIterator;
+   
+   class Namespace;
+   
+   // These are all the constants used in the cache structures
+
+   // WARNING - if you change these lists you must also edit
+   // the stringification in pkgcache.cc and also consider whether
+   // the cache file will become incompatible.
+   struct Dep
+   {
+      enum DepType {Depends=1,PreDepends=2,Suggests=3,Recommends=4,
+        Conflicts=5,Replaces=6,Obsoletes=7,DpkgBreaks=8};
+      enum DepCompareOp {Or=0x10,NoOp=0,LessEq=0x1,GreaterEq=0x2,Less=0x3,
+        Greater=0x4,Equals=0x5,NotEquals=0x6};
+   };
+   
+   struct State
+   {
+      enum VerPriority {Important=1,Required=2,Standard=3,Optional=4,Extra=5};
+      enum PkgSelectedState {Unknown=0,Install=1,Hold=2,DeInstall=3,Purge=4};
+      enum PkgInstState {Ok=0,ReInstReq=1,HoldInst=2,HoldReInstReq=3};
+      enum PkgCurrentState {NotInstalled=0,UnPacked=1,HalfConfigured=2,
+          HalfInstalled=4,ConfigFiles=5,Installed=6,
+           TriggersAwaited=7,TriggersPending=8};
+   };
+   
+   struct Flag
+   {
+      enum PkgFlags {Auto=(1<<0),Essential=(1<<3),Important=(1<<4)};
+      enum PkgFFlags {NotSource=(1<<0),NotAutomatic=(1<<1)};
+   };
+   
+   protected:
+   
+   // Memory mapped cache file
+   string CacheFile;
+   MMap &Map;
+
+   unsigned long sHash(const string &S) const;
+   unsigned long sHash(const char *S) const;
+   
+   public:
+   
+   // Pointers to the arrays of items
+   Header *HeaderP;
+   Package *PkgP;
+   VerFile *VerFileP;
+   DescFile *DescFileP;
+   PackageFile *PkgFileP;
+   Version *VerP;
+   Description *DescP;
+   Provides *ProvideP;
+   Dependency *DepP;
+   StringItem *StringItemP;
+   char *StrP;
+
+   virtual bool ReMap();
+   inline bool Sync() {return Map.Sync();};
+   inline MMap &GetMap() {return Map;};
+   inline void *DataEnd() {return ((unsigned char *)Map.Data()) + Map.Size();};
+      
+   // String hashing function (512 range)
+   inline unsigned long Hash(const string &S) const {return sHash(S);};
+   inline unsigned long Hash(const char *S) const {return sHash(S);};
+
+   // Usefull transformation things
+   const char *Priority(unsigned char Priority);
+   
+   // Accessors
+   PkgIterator FindPkg(const string &Name);
+   Header &Head() {return *HeaderP;};
+   inline PkgIterator PkgBegin();
+   inline PkgIterator PkgEnd();
+   inline PkgFileIterator FileBegin();
+   inline PkgFileIterator FileEnd();
+
+   // Make me a function
+   pkgVersioningSystem *VS;
+   
+   // Converters
+   static const char *CompTypeDeb(unsigned char Comp);
+   static const char *CompType(unsigned char Comp);
+   static const char *DepType(unsigned char Dep);
+   
+   pkgCache(MMap *Map,bool DoMap = true);
+   virtual ~pkgCache() {};
+};
+
+// Header structure
+struct pkgCache::Header
+{
+   // Signature information
+   unsigned long Signature;
+   short MajorVersion;
+   short MinorVersion;
+   bool Dirty;
+   
+   // Size of structure values
+   unsigned short HeaderSz;
+   unsigned short PackageSz;
+   unsigned short PackageFileSz;
+   unsigned short VersionSz;
+   unsigned short DescriptionSz;
+   unsigned short DependencySz;
+   unsigned short ProvidesSz;
+   unsigned short VerFileSz;
+   unsigned short DescFileSz;
+   
+   // Structure counts
+   unsigned long PackageCount;
+   unsigned long VersionCount;
+   unsigned long DescriptionCount;
+   unsigned long DependsCount;
+   unsigned long PackageFileCount;
+   unsigned long VerFileCount;
+   unsigned long DescFileCount;
+   unsigned long ProvidesCount;
+   
+   // Offsets
+   map_ptrloc FileList;              // struct PackageFile
+   map_ptrloc StringList;            // struct StringItem
+   map_ptrloc VerSysName;            // StringTable
+   map_ptrloc Architecture;          // StringTable
+   unsigned long MaxVerFileSize;
+   unsigned long MaxDescFileSize;
+
+   /* Allocation pools, there should be one of these for each structure
+      excluding the header */
+   DynamicMMap::Pool Pools[8];
+   
+   // Rapid package name lookup
+   map_ptrloc HashTable[2*1048];
+
+   bool CheckSizes(Header &Against) const;
+   Header();
+};
+
+struct pkgCache::Package
+{
+   // Pointers
+   map_ptrloc Name;              // Stringtable
+   map_ptrloc VersionList;       // Version
+   map_ptrloc CurrentVer;        // Version
+   map_ptrloc Section;           // StringTable (StringItem)
+      
+   // Linked list 
+   map_ptrloc NextPackage;       // Package
+   map_ptrloc RevDepends;        // Dependency
+   map_ptrloc ProvidesList;      // Provides
+
+   // Install/Remove/Purge etc
+   unsigned char SelectedState;     // What
+   unsigned char InstState;         // Flags
+   unsigned char CurrentState;      // State
+   
+   unsigned short ID;
+   unsigned long Flags;
+};
+
+struct pkgCache::PackageFile
+{
+   // Names
+   map_ptrloc FileName;        // Stringtable
+   map_ptrloc Archive;         // Stringtable
+   map_ptrloc Component;       // Stringtable
+   map_ptrloc Version;         // Stringtable
+   map_ptrloc Origin;          // Stringtable
+   map_ptrloc Label;           // Stringtable
+   map_ptrloc Architecture;    // Stringtable
+   map_ptrloc Site;            // Stringtable
+   map_ptrloc IndexType;       // Stringtable
+   unsigned long Size;            
+   unsigned long Flags;
+   
+   // Linked list
+   map_ptrloc NextFile;        // PackageFile
+   unsigned short ID;
+   time_t mtime;                  // Modification time for the file
+};
+
+struct pkgCache::VerFile
+{
+   map_ptrloc File;           // PackageFile
+   map_ptrloc NextFile;       // PkgVerFile
+   map_ptrloc Offset;         // File offset
+   unsigned long Size;
+};
+
+struct pkgCache::DescFile
+{
+   map_ptrloc File;           // PackageFile
+   map_ptrloc NextFile;       // PkgVerFile
+   map_ptrloc Offset;         // File offset
+   unsigned long Size;
+};
+
+struct pkgCache::Version
+{
+   map_ptrloc VerStr;            // Stringtable
+   map_ptrloc Section;           // StringTable (StringItem)
+   map_ptrloc Arch;              // StringTable
+      
+   // Lists
+   map_ptrloc FileList;          // VerFile
+   map_ptrloc NextVer;           // Version
+   map_ptrloc DescriptionList;   // Description
+   map_ptrloc DependsList;       // Dependency
+   map_ptrloc ParentPkg;         // Package
+   map_ptrloc ProvidesList;      // Provides
+   
+   map_ptrloc Size;              // These are the .deb size
+   map_ptrloc InstalledSize;
+   unsigned short Hash;
+   unsigned short ID;
+   unsigned char Priority;
+};
+
+struct pkgCache::Description
+{
+   // Language Code store the description translation language code. If
+   // the value has a 0 lenght then this is readed using the Package
+   // file else the Translation-CODE are used.
+   map_ptrloc language_code;     // StringTable
+   map_ptrloc md5sum;            // StringTable
+
+   // Linked list 
+   map_ptrloc FileList;          // DescFile
+   map_ptrloc NextDesc;          // Description
+   map_ptrloc ParentPkg;         // Package
+
+   unsigned short ID;
+};
+
+struct pkgCache::Dependency
+{
+   map_ptrloc Version;         // Stringtable
+   map_ptrloc Package;         // Package
+   map_ptrloc NextDepends;     // Dependency
+   map_ptrloc NextRevDepends;  // Dependency
+   map_ptrloc ParentVer;       // Version
+   
+   // Specific types of depends
+   map_ptrloc ID;   
+   unsigned char Type;
+   unsigned char CompareOp;
+};
+
+struct pkgCache::Provides
+{
+   map_ptrloc ParentPkg;        // Pacakge
+   map_ptrloc Version;          // Version
+   map_ptrloc ProvideVersion;   // Stringtable
+   map_ptrloc NextProvides;     // Provides
+   map_ptrloc NextPkgProv;      // Provides
+};
+
+struct pkgCache::StringItem
+{
+   map_ptrloc String;        // Stringtable
+   map_ptrloc NextItem;      // StringItem
+};
+
+#include "cacheiterators.h"
+
+inline pkgCache::PkgIterator pkgCache::PkgBegin() 
+       {return PkgIterator(*this);};
+inline pkgCache::PkgIterator pkgCache::PkgEnd() 
+       {return PkgIterator(*this,PkgP);};
+inline pkgCache::PkgFileIterator pkgCache::FileBegin()
+       {return PkgFileIterator(*this,PkgFileP + HeaderP->FileList);};
+inline pkgCache::PkgFileIterator pkgCache::FileEnd()
+       {return PkgFileIterator(*this,PkgFileP);};
+
+// Oh I wish for Real Name Space Support
+class pkgCache::Namespace
+{   
+   public:
+
+   typedef pkgCache::PkgIterator PkgIterator;
+   typedef pkgCache::VerIterator VerIterator;
+   typedef pkgCache::DescIterator DescIterator;
+   typedef pkgCache::DepIterator DepIterator;
+   typedef pkgCache::PrvIterator PrvIterator;
+   typedef pkgCache::PkgFileIterator PkgFileIterator;
+   typedef pkgCache::VerFileIterator VerFileIterator;   
+   typedef pkgCache::Version Version;
+   typedef pkgCache::Description Description;
+   typedef pkgCache::Package Package;
+   typedef pkgCache::Header Header;
+   typedef pkgCache::Dep Dep;
+   typedef pkgCache::Flag Flag;
+};
+
+#endif
diff --git a/apt-src/strutl.h b/apt-src/strutl.h
new file mode 100644 (file)
index 0000000..53146ce
--- /dev/null
@@ -0,0 +1,143 @@
+// -*- mode: cpp; mode: fold -*-
+// Description                                                         /*{{{*/
+// $Id: strutl.h,v 1.22 2003/02/02 22:20:27 jgg Exp $
+/* ######################################################################
+
+   String Util - These are some useful string functions
+   
+   _strstrip is a function to remove whitespace from the front and end
+   of a string.
+   
+   This source is placed in the Public Domain, do with it what you will
+   It was originally written by Jason Gunthorpe <jgg@gpu.srv.ualberta.ca>   
+   
+   ##################################################################### */
+                                                                       /*}}}*/
+#ifndef STRUTL_H
+#define STRUTL_H
+
+
+
+#include <stdlib.h>
+#include <string>
+#include <cstring>
+#include <vector>
+#include <iostream>
+#include <time.h>
+
+using std::string;
+using std::vector;
+using std::ostream;
+
+#ifdef __GNUG__
+// Methods have a hidden this parameter that is visible to this attribute
+#define APT_FORMAT2 __attribute__ ((format (printf, 2, 3)))
+#define APT_FORMAT3 __attribute__ ((format (printf, 3, 4)))
+#else
+#define APT_FORMAT2
+#define APT_FORMAT3
+#endif    
+
+bool UTF8ToCodeset(const char *codeset, const string &orig, string *dest);
+char *_strstrip(char *String);
+char *_strtabexpand(char *String,size_t Len);
+bool ParseQuoteWord(const char *&String,string &Res);
+bool ParseCWord(const char *&String,string &Res);
+string QuoteString(const string &Str,const char *Bad);
+string DeQuoteString(const string &Str);
+string SizeToStr(double Bytes);
+string TimeToStr(unsigned long Sec);
+string Base64Encode(const string &Str);
+string URItoFileName(const string &URI);
+string TimeRFC1123(time_t Date);
+bool StrToTime(const string &Val,time_t &Result);
+string LookupTag(const string &Message,const char *Tag,const char *Default = 0);
+int StringToBool(const string &Text,int Default = -1);
+bool ReadMessages(int Fd, vector<string> &List);
+bool StrToNum(const char *Str,unsigned long &Res,unsigned Len,unsigned Base = 0);
+bool Hex2Num(const string &Str,unsigned char *Num,unsigned int Length);
+bool TokSplitString(char Tok,char *Input,char **List,
+                   unsigned long ListMax);
+void ioprintf(ostream &out,const char *format,...) APT_FORMAT2;
+char *safe_snprintf(char *Buffer,char *End,const char *Format,...) APT_FORMAT3;
+bool CheckDomainList(const string &Host, const string &List);
+
+#define APT_MKSTRCMP(name,func) \
+inline int name(const char *A,const char *AEnd,const char *B) {return func(A,AEnd,B,B+strlen(B));}; \
+inline int name(string A,const char *B) {return func(A.c_str(),A.c_str()+A.length(),B,B+strlen(B));}; \
+inline int name(string A,string B) {return func(A.c_str(),A.c_str()+A.length(),B.c_str(),B.c_str()+B.length());}; \
+inline int name(string A,const char *B,const char *BEnd) {return func(A.c_str(),A.c_str()+A.length(),B,BEnd);}; 
+
+#define APT_MKSTRCMP2(name,func) \
+inline int name(const char *A,const char *AEnd,const char *B) {return func(A,AEnd,B,B+strlen(B));}; \
+inline int name(string A,const char *B) {return func(A.begin(),A.end(),B,B+strlen(B));}; \
+inline int name(string A,string B) {return func(A.begin(),A.end(),B.begin(),B.end());}; \
+inline int name(string A,const char *B,const char *BEnd) {return func(A.begin(),A.end(),B,BEnd);}; 
+
+int stringcmp(const char *A,const char *AEnd,const char *B,const char *BEnd);
+int stringcasecmp(const char *A,const char *AEnd,const char *B,const char *BEnd);
+
+/* We assume that GCC 3 indicates that libstdc++3 is in use too. In that
+   case the definition of string::const_iterator is not the same as
+   const char * and we need these extra functions */
+#if __GNUC__ >= 3
+int stringcmp(string::const_iterator A,string::const_iterator AEnd,
+             const char *B,const char *BEnd);
+int stringcmp(string::const_iterator A,string::const_iterator AEnd,
+             string::const_iterator B,string::const_iterator BEnd);
+int stringcasecmp(string::const_iterator A,string::const_iterator AEnd,
+                 const char *B,const char *BEnd);
+int stringcasecmp(string::const_iterator A,string::const_iterator AEnd,
+                  string::const_iterator B,string::const_iterator BEnd);
+
+inline int stringcmp(string::const_iterator A,string::const_iterator Aend,const char *B) {return stringcmp(A,Aend,B,B+strlen(B));};
+inline int stringcasecmp(string::const_iterator A,string::const_iterator Aend,const char *B) {return stringcasecmp(A,Aend,B,B+strlen(B));};
+#endif
+
+APT_MKSTRCMP2(stringcmp,stringcmp);
+APT_MKSTRCMP2(stringcasecmp,stringcasecmp);
+
+inline const char *DeNull(const char *s) {return (s == 0?"(null)":s);};
+
+class URI
+{
+   void CopyFrom(const string &From);
+                
+   public:
+   
+   string Access;
+   string User;
+   string Password;
+   string Host;
+   string Path;
+   unsigned int Port;
+   
+   operator string();
+   inline void operator =(const string &From) {CopyFrom(From);};
+   inline bool empty() {return Access.empty();};
+   static string SiteOnly(const string &URI);
+   
+   URI(string Path) {CopyFrom(Path);};
+   URI() : Port(0) {};
+};
+
+struct SubstVar
+{
+   const char *Subst;
+   const string *Contents;
+};
+string SubstVar(string Str,const struct SubstVar *Vars);
+string SubstVar(const string &Str,const string &Subst,const string &Contents);
+
+struct RxChoiceList
+{
+   void *UserData;
+   const char *Str;
+   bool Hit;
+};
+unsigned long RegexChoice(RxChoiceList *Rxs,const char **ListBegin,
+                     const char **ListEnd);
+
+#undef APT_FORMAT2
+
+#endif
diff --git a/apt-src/version.cc b/apt-src/version.cc
new file mode 100644 (file)
index 0000000..330589e
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+Apt is copyright 1997, 1998, 1999 Jason Gunthorpe and others.
+Apt is currently developed by APT Development Team <deity@lists.debian.org>.
+
+License: GPLv2+
+
+       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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+See /usr/share/common-licenses/GPL-2, or
+<http://www.gnu.org/copyleft/gpl.txt> for the terms of the latest version
+of the GNU General Public License.
+*/
+
+
+// -*- mode: cpp; mode: fold -*-
+// Description                                                         /*{{{*/
+// $Id: version.cc,v 1.10 2001/02/20 07:03:17 jgg Exp $
+/* ######################################################################
+
+   Version - Versioning system..
+   
+   ##################################################################### */
+                                                                       /*}}}*/
+// Include Files                                                       /*{{{*/
+#include "version.h"
+#include "pkgcache.h"
+
+#include <stdlib.h>
+                                                                       /*}}}*/
+    
+static pkgVersioningSystem *VSList[10];
+pkgVersioningSystem **pkgVersioningSystem::GlobalList = VSList;
+unsigned long pkgVersioningSystem::GlobalListLen = 0;
+
+// pkgVS::pkgVersioningSystem - Constructor                            /*{{{*/
+// ---------------------------------------------------------------------
+/* Link to the global list of versioning systems supported */
+pkgVersioningSystem::pkgVersioningSystem()
+{
+   VSList[GlobalListLen] = this;
+   GlobalListLen++;
+}
+                                                                       /*}}}*/
+// pkgVS::GetVS - Find a VS by name                                    /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+pkgVersioningSystem *pkgVersioningSystem::GetVS(const char *Label)
+{
+   for (unsigned I = 0; I != GlobalListLen; I++)
+      if (strcmp(VSList[I]->Label,Label) == 0)
+        return VSList[I];
+   return 0;
+}
+                                                                       /*}}}*/
diff --git a/apt-src/version.h b/apt-src/version.h
new file mode 100644 (file)
index 0000000..646843a
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+Apt is copyright 1997, 1998, 1999 Jason Gunthorpe and others.
+Apt is currently developed by APT Development Team <deity@lists.debian.org>.
+
+License: GPLv2+
+
+       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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+See /usr/share/common-licenses/GPL-2, or
+<http://www.gnu.org/copyleft/gpl.txt> for the terms of the latest version
+of the GNU General Public License.
+*/
+
+
+
+// -*- mode: cpp; mode: fold -*-
+// Description                                                         /*{{{*/
+// $Id: version.h,v 1.8 2001/05/27 05:55:27 jgg Exp $
+/* ######################################################################
+
+   Version - Versioning system..
+
+   The versioning system represents how versions are compared, represented
+   and how dependencies are evaluated. As a general rule versioning
+   systems are not compatible unless specifically allowed by the 
+   TestCompatibility query.
+   
+   The versions are stored in a global list of versions, but that is just
+   so that they can be queried when someone does 'apt-get -v'. 
+   pkgSystem provides the proper means to access the VS for the active
+   system.
+   
+   ##################################################################### */
+                                                                       /*}}}*/
+#ifndef PKGLIB_VERSION_H
+#define PKGLIB_VERSION_H
+
+
+#include "strutl.h"
+#include <string>
+
+using std::string;
+
+class pkgVersioningSystem
+{
+   public:
+   // Global list of VS's
+   static pkgVersioningSystem **GlobalList;
+   static unsigned long GlobalListLen;
+   static pkgVersioningSystem *GetVS(const char *Label);
+   
+   const char *Label;
+   
+   // Compare versions..
+   virtual int DoCmpVersion(const char *A,const char *Aend,
+                         const char *B,const char *Bend) = 0;   
+
+   virtual bool CheckDep(const char *PkgVer,int Op,const char *DepVer) = 0;
+   virtual int DoCmpReleaseVer(const char *A,const char *Aend,
+                              const char *B,const char *Bend) = 0;
+   virtual string UpstreamVersion(const char *A) = 0;
+   
+   // See if the given VS is compatible with this one.. 
+   virtual bool TestCompatibility(pkgVersioningSystem const &Against) 
+                {return this == &Against;};
+
+   // Shortcuts
+   APT_MKSTRCMP(CmpVersion,DoCmpVersion);
+   APT_MKSTRCMP(CmpReleaseVer,DoCmpReleaseVer);
+   
+   pkgVersioningSystem();
+   virtual ~pkgVersioningSystem() {};
+};
+
+#ifdef APT_COMPATIBILITY
+#include "debversion.h"
+#endif
+
+#endif
diff --git a/blacklistselect.cpp b/blacklistselect.cpp
new file mode 100644 (file)
index 0000000..3dbd32d
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#include "blacklistselect.h"
+#include "ui_blacklistselect.h"
+#include "package.h"
+
+BlacklistSelect::BlacklistSelect(Package* pkg, QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::BlacklistSelect)
+{
+    ui->setupUi(this);
+       iPkg = pkg;
+
+       if( iPkg->blacklisted() == BlacklistNone ) {
+               ui->label->setText("This package has not been blacklisted");
+               ui->pushButton_Restore->setEnabled(false);
+       } else if( iPkg->blacklisted() == BlacklistThis ) {
+               ui->label->setText("This version of the package has been blacklisted");
+               ui->pushButton_This->setEnabled(false);
+       } else if( iPkg->blacklisted() == BlacklistAll ) {
+               ui->label->setText("All versions of this package have been blacklisted");
+               ui->pushButton_Forever->setEnabled(false);
+       }
+
+       if( iPkg->isInstalled() && !iPkg->isUpgradeable() )
+               ui->pushButton_This->setEnabled(false);
+}
+
+BlacklistSelect::~BlacklistSelect()
+{
+    delete ui;
+}
+
+void BlacklistSelect::changeEvent(QEvent *e)
+{
+    QDialog::changeEvent(e);
+    switch (e->type()) {
+    case QEvent::LanguageChange:
+        ui->retranslateUi(this);
+        break;
+    default:
+        break;
+    }
+}
+
+void BlacklistSelect::on_pushButton_Forever_clicked()
+{
+       iPkg->setBlacklisted( BlacklistAll );
+       accept();
+}
+
+void BlacklistSelect::on_pushButton_This_clicked()
+{
+       iPkg->setBlacklisted( BlacklistThis );
+       accept();
+}
+
+void BlacklistSelect::on_pushButton_Restore_clicked()
+{
+       iPkg->setBlacklisted( BlacklistNone );
+       accept();
+}
diff --git a/blacklistselect.h b/blacklistselect.h
new file mode 100644 (file)
index 0000000..5dcf492
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#ifndef BLACKLISTSELECT_H
+#define BLACKLISTSELECT_H
+
+#include <QDialog>
+
+class Package;
+
+namespace Ui {
+    class BlacklistSelect;
+}
+
+class BlacklistSelect : public QDialog
+{
+    Q_OBJECT
+
+public:
+
+       enum blackList { BlacklistNone, BlacklistThis, BlacklistAll };
+
+       explicit BlacklistSelect(Package* pkg, QWidget *parent = 0);
+    ~BlacklistSelect();
+
+protected:
+    void changeEvent(QEvent *e);
+
+private:
+    Ui::BlacklistSelect *ui;
+       Package* iPkg;
+
+private slots:
+       void on_pushButton_Restore_clicked();
+       void on_pushButton_This_clicked();
+       void on_pushButton_Forever_clicked();
+};
+
+#endif // BLACKLISTSELECT_H
diff --git a/blacklistselect.ui b/blacklistselect.ui
new file mode 100644 (file)
index 0000000..14a6487
--- /dev/null
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>BlacklistSelect</class>
+ <widget class="QDialog" name="BlacklistSelect">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>391</width>
+    <height>113</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Blacklist package</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QLabel" name="label">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string/>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QPushButton" name="pushButton_Forever">
+       <property name="text">
+        <string>All versions</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="pushButton_This">
+       <property name="text">
+        <string>This version</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="pushButton_Restore">
+       <property name="text">
+        <string>Restore</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/confirmdialog.cpp b/confirmdialog.cpp
new file mode 100644 (file)
index 0000000..4249c3d
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#include "confirmdialog.h"
+#include "ui_confirmdialog.h"
+
+ConfirmDialog::ConfirmDialog(bool button, QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::ConfirmDialog)
+{
+    ui->setupUi(this);
+       if( !button ) {
+               ui->btn_OK->hide();
+               ui->line->hide();
+       }
+}
+
+ConfirmDialog::~ConfirmDialog()
+{
+    delete ui;
+}
+
+void ConfirmDialog::changeEvent(QEvent *e)
+{
+    QDialog::changeEvent(e);
+    switch (e->type()) {
+    case QEvent::LanguageChange:
+        ui->retranslateUi(this);
+        break;
+    default:
+        break;
+    }
+}
+
+void ConfirmDialog::setText(QString title, QString text)
+{
+       this->setWindowTitle(title);
+       ui->label->setText(text);
+       this->adjustSize();
+}
diff --git a/confirmdialog.h b/confirmdialog.h
new file mode 100644 (file)
index 0000000..f24e823
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#ifndef CONFIRMDIALOG_H
+#define CONFIRMDIALOG_H
+
+#include <QDialog>
+
+namespace Ui {
+    class ConfirmDialog;
+}
+
+class ConfirmDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+       explicit ConfirmDialog(bool button, QWidget *parent);
+    ~ConfirmDialog();
+       void setText(QString title, QString text);
+#ifdef Q_WS_MAEMO_5            // workaround for buggy Qt autorotation
+       int exec() {
+               QRect r = dynamic_cast<QWidget*>(this->parent())->rect();
+               if(r.width() < r.height())
+                       this->setAttribute(Qt::WA_Maemo5PortraitOrientation);
+               int e = QDialog::exec();
+               this->setAttribute(Qt::WA_Maemo5AutoOrientation);
+               return e;
+       }
+#endif
+
+protected:
+    void changeEvent(QEvent *e);
+
+private:
+    Ui::ConfirmDialog *ui;
+};
+
+#endif // CONFIRMDIALOG_H
diff --git a/confirmdialog.ui b/confirmdialog.ui
new file mode 100644 (file)
index 0000000..4a00e3a
--- /dev/null
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ConfirmDialog</class>
+ <widget class="QDialog" name="ConfirmDialog">
+  <property name="windowModality">
+   <enum>Qt::ApplicationModal</enum>
+  </property>
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>489</width>
+    <height>151</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>Confirmation</string>
+  </property>
+  <property name="modal">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="margin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QScrollArea" name="scrollArea">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="widgetResizable">
+      <bool>true</bool>
+     </property>
+     <widget class="QWidget" name="scrollAreaWidgetContents">
+      <property name="geometry">
+       <rect>
+        <x>0</x>
+        <y>0</y>
+        <width>487</width>
+        <height>120</height>
+       </rect>
+      </property>
+      <property name="sizePolicy">
+       <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
+        <horstretch>0</horstretch>
+        <verstretch>0</verstretch>
+       </sizepolicy>
+      </property>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <property name="spacing">
+        <number>0</number>
+       </property>
+       <property name="margin">
+        <number>0</number>
+       </property>
+       <item>
+        <widget class="QLabel" name="label">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="maximumSize">
+          <size>
+           <width>800</width>
+           <height>800</height>
+          </size>
+         </property>
+         <property name="text">
+          <string/>
+         </property>
+         <property name="wordWrap">
+          <bool>true</bool>
+         </property>
+         <property name="openExternalLinks">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="Line" name="line">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <property name="spacing">
+      <number>2</number>
+     </property>
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="btn_OK">
+       <property name="text">
+        <string>OK</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>btn_OK</sender>
+   <signal>clicked()</signal>
+   <receiver>ConfirmDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>436</x>
+     <y>118</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>244</x>
+     <y>70</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/debian/README b/debian/README
new file mode 100644 (file)
index 0000000..e96ed2f
--- /dev/null
@@ -0,0 +1,6 @@
+The Debian Package fapman
+----------------------------
+
+Comments regarding the Package
+
+ -- Heikki <heikki@unknown>  Wed, 23 Jun 2010 17:56:53 +0300
diff --git a/debian/README.Debian b/debian/README.Debian
new file mode 100644 (file)
index 0000000..68f6f0f
--- /dev/null
@@ -0,0 +1,6 @@
+fapman for Debian
+-----------------
+
+<possible notes regarding this package - if none, delete this file>
+
+ -- Heikki <heikki@unknown>  Wed, 23 Jun 2010 17:56:53 +0300
diff --git a/debian/changelog b/debian/changelog
new file mode 100644 (file)
index 0000000..6fdd6f4
--- /dev/null
@@ -0,0 +1,212 @@
+fapman (0.6.4-1) unstable; urgency=low
+
+  *
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Tue, 10 Aug 2010 15:39:09 +0300
+
+fapman (0.6.3-1) unstable; urgency=low
+
+  * fixed: directory parameters are not always correctly given to apt-get
+  * don't auto-capitalize in text inputs
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Tue, 10 Aug 2010 15:34:16 +0300
+
+fapman (0.6.2-1) unstable; urgency=low
+
+  * try to fetch and show debian changelogs for packages from maemo.org
+  * show more package dependency information
+  * fixed: certain characters in depends/conflicts causes them to be cut in the UI
+  * warn about installing blacklisted packages as dependencies
+  * show download speed for package downloads
+  * enabled version-specific blacklisting for upgradeable packages
+  * some minor UI tweaks
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Sun,  8 Aug 2010 13:00:10 +0300
+
+fapman (0.6.1-1) unstable; urgency=low
+
+  * fixed: misbehaviour of package operation selector buttons
+  * fixed: changing search options during search does not return all the matching packages
+  * more detailed logging of date fetch
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Fri,  6 Aug 2010 02:58:03 +0300
+
+fapman (0.6-2) unstable; urgency=low
+
+  * Autobuilder fun
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Thu,  5 Aug 2010 20:41:31 +0300
+
+fapman (0.6-1) unstable; urgency=low
+
+  * use custom repository and package list directories
+  * "fast remove": don't read full package lists immediately
+  * search options: display name, package name, package description (short and long)
+  * ability to blacklist installed packages
+  * show maemo-upgrade-description for upgradeable packages if it exists
+  * show dependencies and conflicts in the package selector
+  * option to play a sound on completed operations
+  * use hildon notes instead of dialogs to inform user about finished operations
+  * load the default wallpaper from /user/home/.backgrounds/background-1.png
+  * fade the wallpaper if loaded from the default location
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Thu,  5 Aug 2010 20:00:56 +0300
+
+fapman (0.5.2-1) unstable; urgency=low
+
+  * Don't abort package date fetch on non-fatal network errors
+  * Fixed: some packages are looked up from wrong directories while fetching dates
+  * Assume yes on dpkg configuration file overwrite prompts instead of failing
+  * Re-read package lists only when necessary
+  * Prompt user about package date fetching on the first run
+  * Fixed: repository enabled checkbox can get cleared while editing the name or url
+  * Applied patch by qwerty12: Possible to launch the program using dbus
+  * Use system theme wallpaper on the main screen
+  * Improved usability of custom stylesheets, loads /root/.fapman/style.css if it exists
+  * Fixed: package list view gradient colors are wrong with some themes
+  * Some minor package sorting/UI tweaks
+  * Show total download size in the operations confirmation dialog
+  * Added option: default sort order
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Mon,  2 Aug 2010 15:16:17 +0300
+
+fapman (0.5.1-1) unstable; urgency=low
+
+  * Sort upgradeable packages by available date, not installed date
+  * Don't fetch dates for blacklisted packages
+  * Don't write date cache if it has not changed
+  * Fixed a bug in changing a package's blacklist status
+  * Slightly adjusted fingerscrolling parameters of the package list
+  * Fixed: Special characters in package descriptions
+  * Added a "donate" link to about dialog
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Wed, 21 Jul 2010 00:49:49 +0300
+
+fapman (0.5-1) unstable; urgency=low
+
+  * Package sorting (by name, date or size)
+  * Option to fetch package dates from repositories (for packages from maemo.org)
+  * Ability to store and load (a single set of) package selections
+  * User can blacklist packages
+  * Possible to set HTTP and HTTPS proxies for apt-get
+  * Possible to launch info page in web browser for packages from maemo.org
+  * Fixed: Incorrect behavior in certain error situations
+  * Fixed: Incorrect behavior of catalogs autoupdate
+  * Some minor UI bugfixes and tweaks
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Tue, 20 Jul 2010 13:21:18 +0300
+
+fapman (0.4.1-1) unstable; urgency=low
+
+  * Progress bars for loading package lists and updating catalogs
+  * New icons and more polished main menu
+  * Fixed a bug that prevented some error messages from showing
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Thu, 15 Jul 2010 23:11:21 +0300
+
+fapman (0.4-1) unstable; urgency=low
+
+  * Show more progress information for operations
+  * Added options menu (autoremove, autoclean, autorotation)
+  * Improved repository UI
+  * "Upgrade all" option shown in menu when upgrade filter is selected
+  * Don't call apt-cache binary, read the package lists directly instead
+  * Made it possible to cancel certain operations
+  * Show what repositories packages are in
+  * Improved logging/log viewer
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Wed, 14 Jul 2010 19:21:46 +0300
+
+fapman (0.3.2-1) unstable; urgency=low
+
+  * Possible to search from the beginning of the names by starting the search with ':'
+  * Fixed: The package list jumps away from the last marked package
+  * Improved rendering of package descriptions
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Tue,  6 Jul 2010 16:04:17 +0300
+
+fapman (0.3.1-1) unstable; urgency=low
+
+  * Added proper search functionality to package lists
+  * Removed redundant filter menu items from the package list view
+  * Improved error messages in certain situations
+  * Sends icon theme reload event to GTK apps (updates menu icons after installation)
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Tue,  6 Jul 2010 00:34:03 +0300
+
+fapman (0.3-1) unstable; urgency=low
+
+  * A completely new dialog system for selecting package operations
+  * A separate package status filter
+  * Show more information for packages (including application icons)
+  * A menu item to view the log
+  * Fixed: wait screen not following device orientation changes
+  * Added "Help" which explains the new package status icons
+  * Various smaller fixes and tweaks
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Mon,  5 Jul 2010 01:11:45 +0300
+
+fapman (0.2.3-1) unstable; urgency=low
+
+  * Remove the cpu-hogging QProgressBar from the "wait screen"
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Fri,  2 Jul 2010 16:49:19 +0300
+
+fapman (0.2.2-1) unstable; urgency=low
+
+  * Auto-update catalogs if they are older than 24h
+  * Various bugfixes and UI tweaks
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Thu,  1 Jul 2010 17:40:13 +0300
+
+fapman (0.2.1-1) unstable; urgency=low
+
+  * Restore repositories if overwritten by another application
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Thu,  1 Jul 2010 14:03:51 +0300
+
+fapman (0.2-1) unstable; urgency=low
+
+  * Added a simple, preliminary way of managing repositories
+  * Better error messages in many places
+  * Don't stop installation because of unsigned packages
+  * Bugtracker link
+  * Some smaller bugfixes
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Thu,  1 Jul 2010 14:02:57 +0300
+
+fapman (0.1.1-1) unstable; urgency=low
+
+  * Added logging feature for debugging
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Thu,  1 Jul 2010 02:35:06 +0300
+
+fapman (0.1-5) unstable; urgency=low
+
+  * Use sudo instead of rootsh
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Thu,  1 Jul 2010 02:23:16 +0300
+
+fapman (0.1-4) unstable; urgency=low
+
+  * Run as root from the .desktop file
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Thu,  1 Jul 2010 00:05:10 +0300
+
+fapman (0.1-3) unstable; urgency=low
+
+  * Packaging fixes for autobuilder
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Wed, 30 Jun 2010 23:58:21 +0300
+
+fapman (0.1-2) unstable; urgency=low
+
+  * Packaging fixes for autobuilder
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Wed, 30 Jun 2010 23:53:16 +0300
+
+fapman (0.1-1) unstable; urgency=low
+
+  * Initial Release.
+
+ -- Heikki Holstila <heikki.holstila@gmail.com>  Wed, 30 Jun 2010 22:59:56 +0300
diff --git a/debian/compat b/debian/compat
new file mode 100644 (file)
index 0000000..7ed6ff8
--- /dev/null
@@ -0,0 +1 @@
+5
diff --git a/debian/control b/debian/control
new file mode 100644 (file)
index 0000000..1b3c66c
--- /dev/null
@@ -0,0 +1,92 @@
+Source: fapman
+Section: user/system
+Priority: extra
+Maintainer: Heikki Holstila <heikki.holstila@gmail.com>
+Build-Depends: debhelper (>= 5), libqt4-dev, libgtk2.0-dev
+Standards-Version: 3.7.3
+
+Package: fapman
+Architecture: armel
+Depends: ${shlibs:Depends}, ${misc:Depends}
+XB-Maemo-Display-Name: Faster Application Manager
+XSBC-Bugtracker: http://talk.maemo.org/showthread.php?t=57503
+Description: An alternative application/package management UI
+ A fast-to-use GUI front-end for apt-get, written from scratch
+ and optimized for the N900
+XB-Maemo-Icon-26:
+ iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c
+ 6QAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0
+ SU1FB9oHDxMlFHl7QBwAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJ
+ TVBXgQ4XAAAMnklEQVRo3u2a25McVXLGf5nnVFX3zGguuoMQCMOKy4JZzCLj
+ yzo2NuzwAzj8l/AE/8M6eOVfweEIP9gQtjFrCRYFIGmFbggJjdBIM9PT16pz
+ Mv1QPaMBXdAA633wVkRPV810V+WX+eWX3zkx8Mfjj8f/70P+QM99NYTw1yLy
+ vKoicvcw3B0zw90/yTn/J/DPv+/AIrMckA4PAfFeHwoh/Brwoii8qqr7voqi
+ cMBV9dd3f+CPdShzMsejOifPAIVt+CkfcZlED7BvlF3k+aIoePPNNzl27BjD
+ 4ZBTp04xHA7vuO2FCxd45513MLPnf18ACpnnoM7LERd/kUJewr0jcERn5aPc
+ 8ytMuExmuAlkkzbHjh3jtdde47333uONN95gdXX1jpubGTlnVPUTd/9RAQgV
+ 87ooh3VWfkbB8wz876n9cQQR5zlKHtcFTpHkY+v5FzQsY0w2OS8iqCrD4ZC1
+ tTVijF+nlI5v7wF3J4Sw2QM/GoDILA8Xh/RJKnmeif/Skr+si7pXoigZbMIT
+ PrIDIC9R+mHdKye95+c9ccGzy7cb191JKR2fTCav7SyQnWa9y3zYL0fibn0a
+ 4c9syN9SylPlgpauAo2LZ7dQiHql8zaw52zEIzgvyC4+EJcP/ZbPy10EMITw
+ clVV7+xEgR4cQKDUfXKw2K9P6qL+qY/tlTzwv4n7wx7dJeINSEJQ3BPqCURB
+ YlDt+u7c91/YyJ+SwAsE9pFv33pubo6lpSVWV1f3A69u0ktESCm9qqr/ZGbf
+ G4DKHpkLsxytni1+QsOLqWe/lFKe6zwdI0Hw2kEQgkMjggIBSEAGRAgFEmbC
+ wdy3vwP/hiodPXqU119/nZWVlR0p0HcDKCnDQT1UPhaeCnv16dyzX/jYXykO
+ x71xScQTeONtvhQ8gYsjGUiCK5BcRMQloS7uodTgPam2V+Ds2bO8/fbbd6jQ
+ dynQvQEoMR7WLoGnOi8UPyXykq37X0olRztHy47EzcBdEEHUcRUIDkEgCxKm
+ gILg6kIQSAgJJHzzcf1+n7W1NUIMGyml3wITN0/ubvdToHsB6Mpueax6pni2
+ OKxPpZv2Fz7h5+XjYXdYCooDDZs6iOQ2eAmOJ8UD0DimjgSQLLgKlqbXAUzv
+ bhsar5u8kD6yMe8z4FMyXwDDnaiQSEeOVIfizz3bK/VF/1XxaDhUHAyVzqp4
+ Y3gScQxRgWB42uS7gFrLeW0DJ7VVQBwJAslbgHrPblu0Pv9IQZeCQGZ1xwC0
+ kNDZU+1rVtIrPu9Hit1RdVaEAhdRRRwRxbMjqrg6nsEVJCieHBQ8O67aViaA
+ p+l1drLc3UW6uuA8rB15DPVo43tCvTcAMq4xoDEvdJ/oBEUkjxK2bhL3BRcV
+ 8QCSWirIVG0k0NJEpc1wamlljUx/57dpJgk34fjxduieOHECM4MIYVaQKJ2c
+ vUCIOAL4gwOIgpogqHQWOl4cVhncGJAbIy1nCXsCUgJB0OC0ei94clQUl7YC
+ BIckqIIn2wJFAJnH6+VG3nrrLVQVM6NpGsrF6NkRr+lKoONKSd4S5AdrYg1i
+ 4uqqIRexYGZfhc8afnlEzpnJxURxMBB2CRKmUqmCKHiwVoWSQ26zzrQqriCF
+ 4yOHGbd4KOC1i5cO5pRz0WUek56ITXwGZYZAtVMALiqmrikWIclE6HS6nnIS
+ O+LUwwlYIt008qoRD0S02zaxKWhue6LtAVp1UsGzowXYAPLNTNyjhMfFdFbB
+ BKsVrx03sLEjGz7jyiyBzn1a/u4AcEyQFIpQS610y47Uwwk5ZGw2I08IcWDU
+ lxKT3zUURyKxEuKckoet2pg6Om1sguEozbVMWs4wIxR7A1oKPm4F4LYvcqQU
+ 3OmKyJyod73VuB2YuUxS10YKaZgoVdXxSseSyWRLZDHCfKDzjJAPR8ana9I4
+ UTwSiQ8FfAiq3hY9CG5CfSaRVjPFY5G4oO2UnhhI63lcDBFwAe0ImHcQmXGl
+ 811u4dvl8Vxnw8WDaiNJpBMrylBRavteSGglNAhxUZn7qw7Fo5Hcd/r/OkZn
+ 2iCk207o/r9N0AWh81xB+XCbTJlaJ+T2qtw3fxTgTokwJ0LFDivgnrEowVXU
+ AuolpVahJJMwyyRNZIzsGXFBElQ/KfDa0QqGJ2pEISwqkzOJ7ksF8UCABnzM
+ bU0Ub6MXtrLvgBbiIgScLi0A3RmFHFEVjSFooZHoBWWsyBjJMxUJS8Y4j9uW
+ UVrvE6H704r0aGbyWcPoZMOuf6ggC163VgGd9sVm5refy3STJDiuIuLSESFO
+ n/DAFEJUVCVEIcSiKCV6QakVhVZU01cZSgoptsovAuKCmxMXA5RgIydUCtvp
+ svnZ7ZNJbr+L4ChogQCli2tLqh1UQFVC0BgUCTFEL7ygDKWYZ8wSFjLZcqtK
+ OZG3rP02SgTB3ci1I7ptS2JKFdmkzbbvMKWQKCqR7I2XKPG79q7unMRCUJGg
+ EiRooJBCylCSPFF6RSJReSZjmGfGeYx7G6hM06plu5pi4lDot3i/rWlleiaC
+ tJ5BHIFCoPYu0KXth3vaiTvdqEgQlKDqSvBoBVWsSFvZL7FgJMvttRu1T3Df
+ lioFKWRKo9vU2U6b9lq2QGwBkul3xWcQ5hHKHQGgXT/loDEHCR4seFlW0miD
+ uZGnQeeQMc9kzVjOJEltJby1GFK0qtMC8q0mlalX2qSSbQvcN/ukANoZsECg
+ wgjf3hy7Xw9kRT2GkKMGix5CCIEmNGQyyQuyZ5Il8pRamZKcM4YhCF4AUcgT
+ J27Xed0WpAiO3aa4bKtSQETpOswT6NAQgeaBAIQYsop4CCEXRemREg1CExo3
+ TMza7FdeYWSyp7YyNqWSgca2AtS+rbVaosimY/FNE+jtOroNvl1gB0GkHWYo
+ 3ftNY73LdrW5SZrfO98b98aT8drYu1XXKi0ptaQMRSulWlBoSakVm38LEtue
+ LFoQvglgGqBsQZFv7khvk1gcs8bdMyKlJAlU9wNwxyTO2a0o48afvHDkxPKl
+ 6+H8/1x8MTVpYenJRXKdPVkjWbf1wlRSS59WA5ta7OmWyhY//BtUMfFt2tr2
+ iJuTVjKMWQuLeson3k9933W/WXCHz4hFyPse27vRjJp66ZHFtXKhvHHx4y+W
+ RuujmV17d4ViZsp3d8wNMNk8N/dW/8eZ+nJGZ5W4OyDe2musBeUZxxAyYO4i
+ Qu45zZe5sYlf0jl5H+e34nKSCVd9xCoweCAAqc718ufXB+VsuR47xc2NlQ1/
+ /M+PXL12btmunb6+VBShmts7Kybu5iaG4bi4tMG7QB5nJlcapNN6ItHbADw7
+ 0+BbO5qh+Sp782XuaVdPSMUJr/24Zz7KN+yS9fwCibV7yei9nF4uytg/+S+f
+ jB9+9qHVUW/U7yx1VjtL5caVT68t9Jb7s7v2z4bYjW5m6m7tQgLDxUj9THO9
+ xgsnLIZWcdpsQ3YwcQGsbzI52zR53b6M+/Rdb/xDDXI8XbOL6ap9jnGJIeN7
+ Sej9ANC/NQAYXfnkSm+wNtqYWewM0iTZ4ZcPnV8+e726eX513jPV7N4uqGBu
+ 4u4gTupl6pWmXdjMCVrI7Qrg7gbNlUR9tunpXPivsEt/w5iTtuEnm0vpcxtx
+ jg3WmWzfv9shgG0zP4/WhxvXz66M9z+598bGymBSLVS9zp5qfeXCzdnBjeFc
+ MRtD7BagbQ3SRkN9q50bMgPS0VZDHaxnTH6Xm3zDvogHwrs+8Y+0kA/q8/lS
+ s2ynbcA1Bozul/WdAaDdiq26cZiafOvSf1+ulx6d70vQQXd/d2W4Oij714Zd
+ S7mMnahaCamfGK+MydLA7HSV1TjNV9kmZ5o+cCIsyruCfNxczacn5/NpH/s5
+ v0WffO8F/PcGANCME+tfbVg9aHqrX/Y2ik7RQ3xY7a5WtWTQXx50x+t1V1TU
+ k0vdq72RhJWO10h9MdXNlXxVF/U94Dg1J+pz6fO04mds2W/4kMn99n9+MIDt
+ BWmGzViDrt48d2s8d2B2FWVDKlk3yzJaG3cm6005ujHWZFnSRvLmetqwoZ+W
+ Sv5dS/lNcz6faa7lz5prdtlv0ds+Mf4vAAD44MYwjW6OexJktX9tMCzmio1i
+ V7Fm2erJ2mRm9WQvjr4eZXf/mlKOa0f+w3p82HyZz6Rr+Wy+7DeoGX2frP8Y
+ ALa28DeuDiaT9Xo9DXM/VmEjzIQ1regPLo1S7fX16onwvgb9IF2zT9NXdqb+
+ LF32dVZ/SNZ/TADt0JjkZnRzPJCoa3Wv7ocqbDRrzdok1ZfDLv04Xc2nJ+fT
+ mXTRlkn3323+g/+rQZgJs7t/trBv9PXkyGg0KsMBvmjO2XXvsf5D6XK3438B
+ SuBSlfONn5YAAAAASUVORK5CYII=
diff --git a/debian/copyright b/debian/copyright
new file mode 100644 (file)
index 0000000..8106fc6
--- /dev/null
@@ -0,0 +1,19 @@
+Copyright:
+
+    Copyright (C) 2010 Heikki Holstila
+
+License:
+
+    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 3 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, see <http://www.gnu.org/licenses/>.
+
diff --git a/debian/dirs b/debian/dirs
new file mode 100644 (file)
index 0000000..ca882bb
--- /dev/null
@@ -0,0 +1,2 @@
+usr/bin
+usr/sbin
diff --git a/debian/docs b/debian/docs
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/debian/fapman.debhelper.log b/debian/fapman.debhelper.log
new file mode 100644 (file)
index 0000000..c562b37
--- /dev/null
@@ -0,0 +1,5784 @@
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
diff --git a/debian/fapman.doc-base.EX b/debian/fapman.doc-base.EX
new file mode 100644 (file)
index 0000000..9a3bece
--- /dev/null
@@ -0,0 +1,22 @@
+Document: fapman
+Title: Debian fapman Manual
+Author: <insert document author here>
+Abstract: This manual describes what fapman is
+ and how it can be used to
+ manage online manuals on Debian systems.
+Section: unknown
+
+Format: debiandoc-sgml
+Files: /usr/share/doc/fapman/fapman.sgml.gz
+
+Format: postscript
+Files: /usr/share/doc/fapman/fapman.ps.gz
+
+Format: text
+Files: /usr/share/doc/fapman/fapman.text.gz
+
+Format: HTML
+Index: /usr/share/doc/fapman/html/index.html
+Files: /usr/share/doc/fapman/html/*.html
+
+
diff --git a/debian/fapman.substvars b/debian/fapman.substvars
new file mode 100644 (file)
index 0000000..c0dd1fa
--- /dev/null
@@ -0,0 +1 @@
+shlibs:Depends=libc6 (>= 2.5.0-1), libgcc1 (>= 1:4.2.1), libqt4-core (>= 4.6.2~git20100401), libqt4-dbus (>= 4.6.2~git20100401), libqt4-gui (>= 4.6.2~git20100401), libqt4-maemo5 (>= 4.6.2~git20100401), libqt4-network (>= 4.6.2~git20100401), libqt4-phonon (>= 4.6.2~git20100401), libqt4-xml (>= 4.6.2~git20100401), libstdc++6 (>= 4.2.1)
diff --git a/debian/fapman.tarlist b/debian/fapman.tarlist
new file mode 100644 (file)
index 0000000..e127cc1
--- /dev/null
@@ -0,0 +1,6 @@
+755 root root . usr  /
+755 root root . usr/local  /
+755 root root . usr/local/bin  /
+755 root root . usr/local/bin/fapman  debian/fapman/usr/local/bin/fapman
+755 root root . usr/sbin  /
+755 root root . usr/bin  /
diff --git a/debian/fapman/DEBIAN/control b/debian/fapman/DEBIAN/control
new file mode 100644 (file)
index 0000000..d30f5b0
--- /dev/null
@@ -0,0 +1,90 @@
+Package: fapman
+Version: 0.6.4-1
+Architecture: armel
+Maintainer: Heikki Holstila <heikki.holstila@gmail.com>
+Installed-Size: 784
+Depends: libc6 (>= 2.5.0-1), libgcc1 (>= 1:4.2.1), libqt4-core (>= 4.6.2~git20100401), libqt4-dbus (>= 4.6.2~git20100401), libqt4-gui (>= 4.6.2~git20100401), libqt4-maemo5 (>= 4.6.2~git20100401), libqt4-network (>= 4.6.2~git20100401), libqt4-phonon (>= 4.6.2~git20100401), libqt4-xml (>= 4.6.2~git20100401), libstdc++6 (>= 4.2.1)
+Section: user/system
+Priority: extra
+Description: An alternative application/package management UI
+ A fast-to-use GUI front-end for apt-get, written from scratch
+ and optimized for the N900
+Bugtracker: http://talk.maemo.org/showthread.php?t=57503
+Maemo-Display-Name: Faster Application Manager
+Maemo-Icon-26: 
+ iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c
+ 6QAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0
+ SU1FB9oHDxMlFHl7QBwAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJ
+ TVBXgQ4XAAAMnklEQVRo3u2a25McVXLGf5nnVFX3zGguuoMQCMOKy4JZzCLj
+ yzo2NuzwAzj8l/AE/8M6eOVfweEIP9gQtjFrCRYFIGmFbggJjdBIM9PT16pz
+ Mv1QPaMBXdAA633wVkRPV810V+WX+eWX3zkx8Mfjj8f/70P+QM99NYTw1yLy
+ vKoicvcw3B0zw90/yTn/J/DPv+/AIrMckA4PAfFeHwoh/Brwoii8qqr7voqi
+ cMBV9dd3f+CPdShzMsejOifPAIVt+CkfcZlED7BvlF3k+aIoePPNNzl27BjD
+ 4ZBTp04xHA7vuO2FCxd45513MLPnf18ACpnnoM7LERd/kUJewr0jcERn5aPc
+ 8ytMuExmuAlkkzbHjh3jtdde47333uONN95gdXX1jpubGTlnVPUTd/9RAQgV
+ 87ooh3VWfkbB8wz876n9cQQR5zlKHtcFTpHkY+v5FzQsY0w2OS8iqCrD4ZC1
+ tTVijF+nlI5v7wF3J4Sw2QM/GoDILA8Xh/RJKnmeif/Skr+si7pXoigZbMIT
+ PrIDIC9R+mHdKye95+c9ccGzy7cb191JKR2fTCav7SyQnWa9y3zYL0fibn0a
+ 4c9syN9SylPlgpauAo2LZ7dQiHql8zaw52zEIzgvyC4+EJcP/ZbPy10EMITw
+ clVV7+xEgR4cQKDUfXKw2K9P6qL+qY/tlTzwv4n7wx7dJeINSEJQ3BPqCURB
+ YlDt+u7c91/YyJ+SwAsE9pFv33pubo6lpSVWV1f3A69u0ktESCm9qqr/ZGbf
+ G4DKHpkLsxytni1+QsOLqWe/lFKe6zwdI0Hw2kEQgkMjggIBSEAGRAgFEmbC
+ wdy3vwP/hiodPXqU119/nZWVlR0p0HcDKCnDQT1UPhaeCnv16dyzX/jYXykO
+ x71xScQTeONtvhQ8gYsjGUiCK5BcRMQloS7uodTgPam2V+Ds2bO8/fbbd6jQ
+ dynQvQEoMR7WLoGnOi8UPyXykq37X0olRztHy47EzcBdEEHUcRUIDkEgCxKm
+ gILg6kIQSAgJJHzzcf1+n7W1NUIMGyml3wITN0/ubvdToHsB6Mpueax6pni2
+ OKxPpZv2Fz7h5+XjYXdYCooDDZs6iOQ2eAmOJ8UD0DimjgSQLLgKlqbXAUzv
+ bhsar5u8kD6yMe8z4FMyXwDDnaiQSEeOVIfizz3bK/VF/1XxaDhUHAyVzqp4
+ Y3gScQxRgWB42uS7gFrLeW0DJ7VVQBwJAslbgHrPblu0Pv9IQZeCQGZ1xwC0
+ kNDZU+1rVtIrPu9Hit1RdVaEAhdRRRwRxbMjqrg6nsEVJCieHBQ8O67aViaA
+ p+l1drLc3UW6uuA8rB15DPVo43tCvTcAMq4xoDEvdJ/oBEUkjxK2bhL3BRcV
+ 8QCSWirIVG0k0NJEpc1wamlljUx/57dpJgk34fjxduieOHECM4MIYVaQKJ2c
+ vUCIOAL4gwOIgpogqHQWOl4cVhncGJAbIy1nCXsCUgJB0OC0ei94clQUl7YC
+ BIckqIIn2wJFAJnH6+VG3nrrLVQVM6NpGsrF6NkRr+lKoONKSd4S5AdrYg1i
+ 4uqqIRexYGZfhc8afnlEzpnJxURxMBB2CRKmUqmCKHiwVoWSQ26zzrQqriCF
+ 4yOHGbd4KOC1i5cO5pRz0WUek56ITXwGZYZAtVMALiqmrikWIclE6HS6nnIS
+ O+LUwwlYIt008qoRD0S02zaxKWhue6LtAVp1UsGzowXYAPLNTNyjhMfFdFbB
+ BKsVrx03sLEjGz7jyiyBzn1a/u4AcEyQFIpQS610y47Uwwk5ZGw2I08IcWDU
+ lxKT3zUURyKxEuKckoet2pg6Om1sguEozbVMWs4wIxR7A1oKPm4F4LYvcqQU
+ 3OmKyJyod73VuB2YuUxS10YKaZgoVdXxSseSyWRLZDHCfKDzjJAPR8ana9I4
+ UTwSiQ8FfAiq3hY9CG5CfSaRVjPFY5G4oO2UnhhI63lcDBFwAe0ImHcQmXGl
+ 811u4dvl8Vxnw8WDaiNJpBMrylBRavteSGglNAhxUZn7qw7Fo5Hcd/r/OkZn
+ 2iCk207o/r9N0AWh81xB+XCbTJlaJ+T2qtw3fxTgTokwJ0LFDivgnrEowVXU
+ AuolpVahJJMwyyRNZIzsGXFBElQ/KfDa0QqGJ2pEISwqkzOJ7ksF8UCABnzM
+ bU0Ub6MXtrLvgBbiIgScLi0A3RmFHFEVjSFooZHoBWWsyBjJMxUJS8Y4j9uW
+ UVrvE6H704r0aGbyWcPoZMOuf6ggC163VgGd9sVm5refy3STJDiuIuLSESFO
+ n/DAFEJUVCVEIcSiKCV6QakVhVZU01cZSgoptsovAuKCmxMXA5RgIydUCtvp
+ svnZ7ZNJbr+L4ChogQCli2tLqh1UQFVC0BgUCTFEL7ygDKWYZ8wSFjLZcqtK
+ OZG3rP02SgTB3ci1I7ptS2JKFdmkzbbvMKWQKCqR7I2XKPG79q7unMRCUJGg
+ EiRooJBCylCSPFF6RSJReSZjmGfGeYx7G6hM06plu5pi4lDot3i/rWlleiaC
+ tJ5BHIFCoPYu0KXth3vaiTvdqEgQlKDqSvBoBVWsSFvZL7FgJMvttRu1T3Df
+ lioFKWRKo9vU2U6b9lq2QGwBkul3xWcQ5hHKHQGgXT/loDEHCR4seFlW0miD
+ uZGnQeeQMc9kzVjOJEltJby1GFK0qtMC8q0mlalX2qSSbQvcN/ukANoZsECg
+ wgjf3hy7Xw9kRT2GkKMGix5CCIEmNGQyyQuyZ5Il8pRamZKcM4YhCF4AUcgT
+ J27Xed0WpAiO3aa4bKtSQETpOswT6NAQgeaBAIQYsop4CCEXRemREg1CExo3
+ TMza7FdeYWSyp7YyNqWSgca2AtS+rbVaosimY/FNE+jtOroNvl1gB0GkHWYo
+ 3ftNY73LdrW5SZrfO98b98aT8drYu1XXKi0ptaQMRSulWlBoSakVm38LEtue
+ LFoQvglgGqBsQZFv7khvk1gcs8bdMyKlJAlU9wNwxyTO2a0o48afvHDkxPKl
+ 6+H8/1x8MTVpYenJRXKdPVkjWbf1wlRSS59WA5ta7OmWyhY//BtUMfFt2tr2
+ iJuTVjKMWQuLeson3k9933W/WXCHz4hFyPse27vRjJp66ZHFtXKhvHHx4y+W
+ RuujmV17d4ViZsp3d8wNMNk8N/dW/8eZ+nJGZ5W4OyDe2musBeUZxxAyYO4i
+ Qu45zZe5sYlf0jl5H+e34nKSCVd9xCoweCAAqc718ufXB+VsuR47xc2NlQ1/
+ /M+PXL12btmunb6+VBShmts7Kybu5iaG4bi4tMG7QB5nJlcapNN6ItHbADw7
+ 0+BbO5qh+Sp782XuaVdPSMUJr/24Zz7KN+yS9fwCibV7yei9nF4uytg/+S+f
+ jB9+9qHVUW/U7yx1VjtL5caVT68t9Jb7s7v2z4bYjW5m6m7tQgLDxUj9THO9
+ xgsnLIZWcdpsQ3YwcQGsbzI52zR53b6M+/Rdb/xDDXI8XbOL6ap9jnGJIeN7
+ Sej9ANC/NQAYXfnkSm+wNtqYWewM0iTZ4ZcPnV8+e726eX513jPV7N4uqGBu
+ 4u4gTupl6pWmXdjMCVrI7Qrg7gbNlUR9tunpXPivsEt/w5iTtuEnm0vpcxtx
+ jg3WmWzfv9shgG0zP4/WhxvXz66M9z+598bGymBSLVS9zp5qfeXCzdnBjeFc
+ MRtD7BagbQ3SRkN9q50bMgPS0VZDHaxnTH6Xm3zDvogHwrs+8Y+0kA/q8/lS
+ s2ynbcA1Bozul/WdAaDdiq26cZiafOvSf1+ulx6d70vQQXd/d2W4Oij714Zd
+ S7mMnahaCamfGK+MydLA7HSV1TjNV9kmZ5o+cCIsyruCfNxczacn5/NpH/s5
+ v0WffO8F/PcGANCME+tfbVg9aHqrX/Y2ik7RQ3xY7a5WtWTQXx50x+t1V1TU
+ k0vdq72RhJWO10h9MdXNlXxVF/U94Dg1J+pz6fO04mds2W/4kMn99n9+MIDt
+ BWmGzViDrt48d2s8d2B2FWVDKlk3yzJaG3cm6005ujHWZFnSRvLmetqwoZ+W
+ Sv5dS/lNcz6faa7lz5prdtlv0ds+Mf4vAAD44MYwjW6OexJktX9tMCzmio1i
+ V7Fm2erJ2mRm9WQvjr4eZXf/mlKOa0f+w3p82HyZz6Rr+Wy+7DeoGX2frP8Y
+ ALa28DeuDiaT9Xo9DXM/VmEjzIQ1regPLo1S7fX16onwvgb9IF2zT9NXdqb+
+ LF32dVZ/SNZ/TADt0JjkZnRzPJCoa3Wv7ocqbDRrzdok1ZfDLv04Xc2nJ+fT
+ mXTRlkn3323+g/+rQZgJs7t/trBv9PXkyGg0KsMBvmjO2XXvsf5D6XK3438B
+ SuBSlfONn5YAAAAASUVORK5CYII=
diff --git a/debian/fapman/DEBIAN/md5sums b/debian/fapman/DEBIAN/md5sums
new file mode 100644 (file)
index 0000000..46d418b
--- /dev/null
@@ -0,0 +1 @@
+0dabf4c19b4a8b23b6c5f72b84f4e959  usr/local/bin/fapman
diff --git a/debian/fapman/DEBIAN/postinst b/debian/fapman/DEBIAN/postinst
new file mode 100755 (executable)
index 0000000..5ea5cdb
--- /dev/null
@@ -0,0 +1,42 @@
+#!/bin/sh
+# postinst script for fapman
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+#        * <postinst> `configure' <most-recently-configured-version>
+#        * <old-postinst> `abort-upgrade' <new version>
+#        * <conflictor's-postinst> `abort-remove' `in-favour' <package>
+#          <new-version>
+#        * <postinst> `abort-remove'
+#        * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
+#          <failed-install-package> <version> `removing'
+#          <conflicting-package> <version>
+# for details, see http://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+
+
+case "$1" in
+    configure)
+       /usr/sbin/update-sudoers
+    ;;
+
+    abort-upgrade|abort-remove|abort-deconfigure)
+    ;;
+
+    *)
+        echo "postinst called with unknown argument \`$1'" >&2
+        exit 1
+    ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+
+
+exit 0
+
+
diff --git a/debian/fapman/DEBIAN/postrm b/debian/fapman/DEBIAN/postrm
new file mode 100755 (executable)
index 0000000..9d55ced
--- /dev/null
@@ -0,0 +1,41 @@
+#!/bin/sh
+# postrm script for fapman
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+#        * <postrm> `remove'
+#        * <postrm> `purge'
+#        * <old-postrm> `upgrade' <new-version>
+#        * <new-postrm> `failed-upgrade' <old-version>
+#        * <new-postrm> `abort-install'
+#        * <new-postrm> `abort-install' <old-version>
+#        * <new-postrm> `abort-upgrade' <old-version>
+#        * <disappearer's-postrm> `disappear' <overwriter>
+#          <overwriter-version>
+# for details, see http://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+
+
+case "$1" in
+    purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
+       #rm -f /etc/sudoers.d/fapman.sudoers
+       /usr/sbin/update-sudoers
+    ;;
+
+    *)
+        echo "postrm called with unknown argument \`$1'" >&2
+        exit 1
+    ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+
+
+exit 0
+
+
diff --git a/debian/fapman/usr/local/bin/fapman b/debian/fapman/usr/local/bin/fapman
new file mode 100755 (executable)
index 0000000..c308f21
Binary files /dev/null and b/debian/fapman/usr/local/bin/fapman differ
diff --git a/debian/files b/debian/files
new file mode 100644 (file)
index 0000000..02bc764
--- /dev/null
@@ -0,0 +1,31 @@
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
+fapman_0.6.4-1_armel.deb user/system extra
diff --git a/debian/optify b/debian/optify
new file mode 100644 (file)
index 0000000..865faf1
--- /dev/null
@@ -0,0 +1 @@
+auto
diff --git a/debian/postinst b/debian/postinst
new file mode 100644 (file)
index 0000000..6d95781
--- /dev/null
@@ -0,0 +1,42 @@
+#!/bin/sh
+# postinst script for fapman
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+#        * <postinst> `configure' <most-recently-configured-version>
+#        * <old-postinst> `abort-upgrade' <new version>
+#        * <conflictor's-postinst> `abort-remove' `in-favour' <package>
+#          <new-version>
+#        * <postinst> `abort-remove'
+#        * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
+#          <failed-install-package> <version> `removing'
+#          <conflicting-package> <version>
+# for details, see http://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+
+
+case "$1" in
+    configure)
+       /usr/sbin/update-sudoers
+    ;;
+
+    abort-upgrade|abort-remove|abort-deconfigure)
+    ;;
+
+    *)
+        echo "postinst called with unknown argument \`$1'" >&2
+        exit 1
+    ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
+
+
diff --git a/debian/postrm b/debian/postrm
new file mode 100644 (file)
index 0000000..42008d1
--- /dev/null
@@ -0,0 +1,41 @@
+#!/bin/sh
+# postrm script for fapman
+#
+# see: dh_installdeb(1)
+
+set -e
+
+# summary of how this script can be called:
+#        * <postrm> `remove'
+#        * <postrm> `purge'
+#        * <old-postrm> `upgrade' <new-version>
+#        * <new-postrm> `failed-upgrade' <old-version>
+#        * <new-postrm> `abort-install'
+#        * <new-postrm> `abort-install' <old-version>
+#        * <new-postrm> `abort-upgrade' <old-version>
+#        * <disappearer's-postrm> `disappear' <overwriter>
+#          <overwriter-version>
+# for details, see http://www.debian.org/doc/debian-policy/ or
+# the debian-policy package
+
+
+case "$1" in
+    purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
+       #rm -f /etc/sudoers.d/fapman.sudoers
+       /usr/sbin/update-sudoers
+    ;;
+
+    *)
+        echo "postrm called with unknown argument \`$1'" >&2
+        exit 1
+    ;;
+esac
+
+# dh_installdeb will replace this with shell code automatically
+# generated by other debhelper scripts.
+
+#DEBHELPER#
+
+exit 0
+
+
diff --git a/debian/rules b/debian/rules
new file mode 100755 (executable)
index 0000000..5f8cc33
--- /dev/null
@@ -0,0 +1,98 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+
+
+
+
+configure: configure-stamp
+configure-stamp:
+       dh_testdir
+       # Add here commands to configure the package.
+
+       touch configure-stamp
+
+
+build: build-stamp
+
+build-stamp: configure-stamp  
+       dh_testdir
+
+       # Add here commands to compile the package.
+       /usr/bin/qmake
+       $(MAKE)
+       #docbook-to-man debian/fapman.sgml > fapman.1
+
+       touch $@
+
+clean: 
+       dh_testdir
+       dh_testroot
+       rm -f build-stamp configure-stamp
+
+       # Add here commands to clean up after the build process.
+       /usr/bin/qmake
+       $(MAKE) clean
+
+       dh_clean 
+
+install: build
+       dh_testdir
+       dh_testroot
+       dh_clean -k 
+       dh_installdirs
+
+       # Add here commands to install the package into debian/fapman.
+       $(MAKE) INSTALL_ROOT="$(CURDIR)"/debian/fapman install
+       install -D fapman $(CURDIR)/debian/fapman/usr/bin/fapman
+       install -D icons/fapman.png $(CURDIR)/debian/fapman/usr/share/icons/hicolor/48x48/apps/fapman.png
+       install -D misc/fapman.desktop $(CURDIR)/debian/fapman/usr/share/applications/hildon/fapman.desktop
+       install -D misc/fapman.sudoers $(CURDIR)/debian/fapman/etc/sudoers.d/fapman.sudoers
+       dh_install misc/fapman.launch /usr/bin/
+       dh_install misc/fapman.service /usr/share/dbus-1/services/
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+       dh_testdir
+       dh_testroot
+       dh_installchangelogs 
+       dh_installdocs
+       dh_installexamples
+#      dh_install
+#      dh_installmenu
+#      dh_installdebconf       
+#      dh_installlogrotate
+#      dh_installemacsen
+#      dh_installpam
+#      dh_installmime
+#      dh_python
+#      dh_installinit
+#      dh_installcron
+#      dh_installinfo
+       dh_installman
+       dh_link
+       dh_strip
+       dh_compress
+       dh_fixperms
+#      dh_perl
+#      dh_makeshlibs
+       dh_installdeb
+       dh_shlibdeps
+       dh_gencontrol
+       dh_md5sums
+       dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install configure
diff --git a/debian/rules.backup b/debian/rules.backup
new file mode 100644 (file)
index 0000000..bf3c9d9
--- /dev/null
@@ -0,0 +1,96 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+
+
+
+
+configure: configure-stamp
+configure-stamp:
+       dh_testdir
+       # Add here commands to configure the package.
+
+       touch configure-stamp
+
+
+build: build-stamp
+
+build-stamp: configure-stamp  
+       dh_testdir
+
+       # Add here commands to compile the package.
+       /usr/bin/qmake
+       $(MAKE)
+       #docbook-to-man debian/fapman.sgml > fapman.1
+
+       touch $@
+
+clean: 
+       dh_testdir
+       dh_testroot
+       rm -f build-stamp configure-stamp
+
+       # Add here commands to clean up after the build process.
+       /usr/bin/qmake
+       $(MAKE) clean
+
+       dh_clean 
+
+install: build
+       dh_testdir
+       dh_testroot
+       dh_clean -k 
+       dh_installdirs
+
+       # Add here commands to install the package into debian/fapman.
+       $(MAKE) INSTALL_ROOT="$(CURDIR)"/debian/fapman install
+       install -D fapman $(CURDIR)/debian/fapman/usr/bin/fapman
+       install -D icons/fapman.png $(CURDIR)/debian/fapman/usr/share/icons/hicolor/48x48/apps/fapman.png
+       install -D misc/fapman.desktop $(CURDIR)/debian/fapman/usr/share/applications/hildon/fapman.desktop
+       install -D misc/fapman.sudoers $(CURDIR)/debian/fapman/etc/sudoers.d/fapman.sudoers
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+       dh_testdir
+       dh_testroot
+       dh_installchangelogs 
+       dh_installdocs
+       dh_installexamples
+#      dh_install
+#      dh_installmenu
+#      dh_installdebconf       
+#      dh_installlogrotate
+#      dh_installemacsen
+#      dh_installpam
+#      dh_installmime
+#      dh_python
+#      dh_installinit
+#      dh_installcron
+#      dh_installinfo
+       dh_installman
+       dh_link
+       dh_strip
+       dh_compress
+       dh_fixperms
+#      dh_perl
+#      dh_makeshlibs
+       dh_installdeb
+       dh_shlibdeps
+       dh_gencontrol
+       dh_md5sums
+       dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install configure
diff --git a/dimmer.cpp b/dimmer.cpp
new file mode 100644 (file)
index 0000000..9c06508
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#include <QtGui>
+#include "dimmer.h"
+
+dimmer::dimmer(QWidget *parent) :
+    QWidget(parent)
+{
+       iParent = parent;
+       iAlpha = 205;
+       iLayout = new QVBoxLayout(this);
+       iLabel = new QLabel(this);
+       iLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+       iLabel->setAlignment(Qt::AlignCenter);
+       iLayout->addWidget(iLabel);
+       iBusy = false;
+       iAnim = 0;
+       iAnimDir = 1;
+       iAnimY = this->rect().height()-this->rect().height()/4;
+       iProgress = -1;
+       iUpdateAnim = false;
+       iDownloadSpeed = -1;
+
+       iTimer = new QTimer(this);
+       connect(iTimer,SIGNAL(timeout()),this,SLOT(timerEvent()));
+
+       connect(QApplication::desktop(), SIGNAL(resized(int)), this, SLOT(orientationChanged()));
+
+       hide();
+}
+
+void dimmer::paintEvent(QPaintEvent *)
+{
+       QPainter painter(this);
+       QColor dim("black");
+       dim.setAlpha(iAlpha);
+       painter.setPen(dim);
+       painter.setBrush(dim);
+       painter.drawRect(rect());
+
+       painter.setBrush( QApplication::palette().color(QPalette::Highlight) );
+
+       int step = 15;
+       int animMax = 10;
+
+       if( iProgress == -1 ) {
+               painter.drawEllipse(QPoint(rect().left()+(rect().width()/2-(animMax*step)/2)+iAnim*step,
+                                                       iAnimY), 10, 10);
+       }
+
+       if( iUpdateAnim ) {
+               iAnim += iAnimDir;
+               if( iAnim>animMax )
+                       iAnimDir=-1;
+               if( iAnim==-1 )
+                       iAnimDir=1;
+       }
+
+       if( iProgress >= 0 ) {
+               if( iProgress>100 )
+                       iProgress = 100;
+
+               painter.setBrush( QApplication::palette().color(QPalette::Window) );
+               painter.setPen( dim );
+               painter.drawRect(rect().left()+30, rect().bottom()-30, rect().right()-rect().left()-60, 10 );
+               painter.setBrush( QApplication::palette().color(QPalette::Highlight) );
+               painter.setPen( QApplication::palette().color(QPalette::Highlight) );
+               int pw = ( rect().right()-rect().left()-60 ) * iProgress / 100;
+               painter.drawRect(rect().left()+30, rect().bottom()-30, pw, 10 );
+
+               if( iDownloadSpeed >= 0 ) {
+                       painter.setBrush( QApplication::palette().color(QPalette::BrightText) );
+                       painter.setPen( QApplication::palette().color(QPalette::BrightText) );
+                       QRect textrect(rect().left(),rect().bottom()-70,rect().width(),30);
+                       painter.drawText(textrect,QString("%1 kB/s").arg(iDownloadSpeed),Qt::AlignHCenter|Qt::AlignVCenter);
+               }
+       }
+}
+
+void dimmer::timerEvent()
+{
+       iUpdateAnim = true;
+       repaint(0,iAnimY-10,rect().width(),22);
+       iUpdateAnim = false;
+}
+
+void dimmer::resizeEvent(QResizeEvent *)
+{
+       this->resize(iParent->size());
+       iLayout->setGeometry(iParent->rect());
+       iLayout->setSizeConstraint(QLayout::SetMaximumSize);
+       iAnimY = this->rect().height()-this->rect().height()/4;
+}
+
+void dimmer::orientationChanged()
+{
+       resizeEvent(0);
+}
+
+void dimmer::dim(QString title, QString message)
+{
+       QString colorname = QApplication::palette().color(QPalette::BrightText).name();
+       iTitle = title;
+       iBusy = true;
+       iLabel->setText("<font color=\"" + colorname + "\"><b><u>" + iTitle + "</u></b><br><br>" + message + "</font>");
+       iProgress = -1;
+       iDownloadSpeed = -1;
+       iAnim = 0;
+       iAnimDir = 1;
+
+       show();
+       iTimer->start(250);
+}
+
+void dimmer::updateText(QString message)
+{
+       QString colorname = QApplication::palette().color(QPalette::BrightText).name();
+       iLabel->setText("<font color=\"" + colorname + "\"><b><u>" + iTitle + "</u></b><br><br>" + message + "</font>");
+}
+
+void dimmer::setProgress(int p_)
+{
+       iProgress = p_;
+       if( p_==-1 )
+               iDownloadSpeed = -1;
+       repaint(0,rect().bottom()-30,rect().width(),20);
+}
+
+void dimmer::setDownloadSpeed(int kbps_)
+{
+       iDownloadSpeed = kbps_;
+       repaint(QRect(rect().left(),rect().bottom()-70,rect().width(),30));
+}
+
+void dimmer::undim()
+{
+       iBusy = false;
+       iTimer->stop();
+       hide();
+}
diff --git a/dimmer.h b/dimmer.h
new file mode 100644 (file)
index 0000000..ae61df3
--- /dev/null
+++ b/dimmer.h
@@ -0,0 +1,66 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#ifndef DIMMER_H
+#define DIMMER_H
+
+#include <QtGui>
+
+class dimmer : public QWidget
+{
+    Q_OBJECT
+public:
+    explicit dimmer(QWidget *parent = 0);
+       void paintEvent(QPaintEvent *);
+       void resizeEvent(QResizeEvent *);
+
+       void dim(QString title, QString message);
+       void undim();
+       bool busy() { return iBusy; }
+       void updateText(QString message);
+       void setProgress(int p_);
+       void setDownloadSpeed(int kbps_);
+       int progress() { return iProgress; }
+
+private:
+       int iAlpha;
+       QWidget* iParent;
+       QBoxLayout* iLayout;
+       QLabel* iLabel;
+       bool iBusy;
+       QTimer* iTimer;
+       QString iTitle;
+
+       int iAnim;
+       int iAnimDir;
+       int iAnimY;
+       bool iUpdateAnim;
+
+       int iProgress;
+       int iDownloadSpeed;
+
+public slots:
+       void orientationChanged();
+
+private slots:
+       void timerEvent();
+
+};
+
+#endif // DIMMER_H
diff --git a/dpkginterface.cpp b/dpkginterface.cpp
new file mode 100644 (file)
index 0000000..f4957eb
--- /dev/null
@@ -0,0 +1,14 @@
+#include <QtCore>
+#include "dpkginterface.h"
+
+DpkgInterface::DpkgInterface(QObject *parent) :
+    QObject(parent)
+{
+}
+
+bool DpkgInterface::loadDebFiles(QStringList files_)
+{
+       qDebug() << files_;
+
+       return false;
+}
diff --git a/dpkginterface.h b/dpkginterface.h
new file mode 100644 (file)
index 0000000..ac93cd6
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef DPKGINTERFACE_H
+#define DPKGINTERFACE_H
+
+#include <QObject>
+
+class DpkgInterface : public QObject
+{
+    Q_OBJECT
+public:
+    explicit DpkgInterface(QObject *parent = 0);
+       bool loadDebFiles(QStringList files_);
+
+signals:
+
+public slots:
+
+};
+
+#endif // DPKGINTERFACE_H
diff --git a/fapman b/fapman
new file mode 100755 (executable)
index 0000000..c308f21
Binary files /dev/null and b/fapman differ
diff --git a/fapman.pro b/fapman.pro
new file mode 100644 (file)
index 0000000..b641b80
--- /dev/null
@@ -0,0 +1,101 @@
+#-------------------------------------------------
+#
+# Project created by QtCreator 2010-06-23T17:48:44
+#
+#-------------------------------------------------
+
+QT       += core gui network dbus phonon
+
+TARGET = fapman
+TEMPLATE = app
+
+
+SOURCES += main.cpp\
+        mainwindow.cpp \
+    package.cpp \
+    packageview.cpp \
+    filterselect.cpp \
+    confirmdialog.cpp \
+    dimmer.cpp \
+    repoview.cpp \
+    packageselector.cpp \
+    help.cpp \
+    settings.cpp \
+    aaptinterface.cpp \
+    repository.cpp \
+    repoedit.cpp \
+    logview.cpp \
+    apt-src/debversion.cc \
+    apt-src/version.cc \
+    sortselector.cpp \
+    blacklistselect.cpp \
+    rotatingbackground.cpp \
+    searchoptions.cpp \
+    dpkginterface.cpp
+
+HEADERS  += mainwindow.h \
+    package.h \
+    packageview.h \
+    filterselect.h \
+    confirmdialog.h \
+    dimmer.h \
+    repoview.h \
+    packageselector.h \
+    help.h \
+    settings.h \
+    aaptinterface.h \
+    repository.h \
+    repoedit.h \
+    logview.h \
+    apt-src/version.h \
+    apt-src/strutl.h \
+    apt-src/pkgcache.h \
+    apt-src/mmap.h \
+    apt-src/debversion.h \
+    apt-src/fileutl.h \
+    apt-src/cacheiterators.h \
+    sortselector.h \
+    blacklistselect.h \
+    rotatingbackground.h \
+    searchoptions.h \
+    dpkginterface.h
+
+FORMS    += mainwindow.ui \
+    packageview.ui \
+    filterselect.ui \
+    confirmdialog.ui \
+    repoview.ui \
+    packageselector.ui \
+    help.ui \
+    settings.ui \
+    repoedit.ui \
+    logview.ui \
+    sortselector.ui \
+    blacklistselect.ui \
+    searchoptions.ui
+
+#CONFIG += mobility
+#MOBILITY =
+
+maemo5 {
+       QT += maemo5
+}
+
+#exists( /usr/include/gtk-2.0/gdk/gdk.h ) {
+#    LIBS += `pkg-config --libs gtk+-2.0`
+#    QMAKE_CXXFLAGS += `pkg-config --cflags gtk+-2.0`
+#    DEFINES += MYDEF_GTK_EXISTS
+#}
+
+symbian {
+    TARGET.UID3 = 0xe7c43133
+    # TARGET.CAPABILITY += 
+    TARGET.EPOCSTACKSIZE = 0x14000
+    TARGET.EPOCHEAPSIZE = 0x020000 0x800000
+}
+
+RESOURCES += \
+    resources.qrc
+
+OTHER_FILES += \
+    TODO.txt
diff --git a/fapman.pro.user b/fapman.pro.user
new file mode 100644 (file)
index 0000000..51aa091
--- /dev/null
@@ -0,0 +1,217 @@
+<!DOCTYPE QtCreatorProject>
+<qtcreator>
+ <data>
+  <variable>ProjectExplorer.Project.ActiveTarget</variable>
+  <value type="int">0</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.EditorSettings</variable>
+  <valuemap type="QVariantMap">
+   <value key="EditorConfiguration.Codec" type="QByteArray">System</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Target.0</variable>
+  <valuemap type="QVariantMap">
+   <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Maemo</value>
+   <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.Target.MaemoDeviceTarget</value>
+   <value key="ProjectExplorer.Target.ActiveBuildConfiguration" type="int">1</value>
+   <value key="ProjectExplorer.Target.ActiveRunConfiguration" type="int">0</value>
+   <valuemap key="ProjectExplorer.Target.BuildConfiguration.0" type="QVariantMap">
+    <valuemap key="ProjectExplorer.BuildConfiguration.BuildStep.0" type="QVariantMap">
+     <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">qmake</value>
+     <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">QtProjectManager.QMakeBuildStep</value>
+     <valuelist key="QtProjectManager.QMakeBuildStep.QMakeArguments" type="QVariantList"/>
+    </valuemap>
+    <valuemap key="ProjectExplorer.BuildConfiguration.BuildStep.1" type="QVariantMap">
+     <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Make</value>
+     <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MakeStep</value>
+     <value key="Qt4ProjectManager.MakeStep.Clean" type="bool">false</value>
+     <valuelist key="Qt4ProjectManager.MakeStep.MakeArguments" type="QVariantList"/>
+     <value key="Qt4ProjectManager.MakeStep.MakeCommand" type="QString"></value>
+    </valuemap>
+    <valuemap key="ProjectExplorer.BuildConfiguration.BuildStep.2" type="QVariantMap">
+     <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString"></value>
+     <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MaemoPackageCreationStep</value>
+     <valuelist key="Qt4ProjectManager.BuildStep.MaemoPackage.LocalFiles" type="QVariantList"/>
+     <value key="Qt4ProjectManager.BuildStep.MaemoPackage.Modified" type="bool">false</value>
+     <value key="Qt4ProjectManager.BuildStep.MaemoPackage.RemoteExe" type="QString">/usr/local/bin/fapman</value>
+     <valuelist key="Qt4ProjectManager.BuildStep.MaemoPackage.RemoteFiles" type="QVariantList"/>
+    </valuemap>
+    <value key="ProjectExplorer.BuildConfiguration.BuildStepsCount" type="int">3</value>
+    <valuemap key="ProjectExplorer.BuildConfiguration.CleanStep.0" type="QVariantMap">
+     <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Make</value>
+     <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MakeStep</value>
+     <value key="Qt4ProjectManager.MakeStep.Clean" type="bool">true</value>
+     <valuelist key="Qt4ProjectManager.MakeStep.MakeArguments" type="QVariantList">
+      <value type="QString">clean</value>
+     </valuelist>
+     <value key="Qt4ProjectManager.MakeStep.MakeCommand" type="QString"></value>
+    </valuemap>
+    <value key="ProjectExplorer.BuildConfiguration.CleanStepsCount" type="int">1</value>
+    <value key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment" type="bool">false</value>
+    <valuelist key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges" type="QVariantList"/>
+    <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Debug</value>
+    <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration" type="int">2</value>
+    <value key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory" type="QString">/home/heikki/Projects/fapman-build-maemo</value>
+    <value key="Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId" type="int">7</value>
+    <value key="Qt4ProjectManager.Qt4BuildConfiguration.ToolChain" type="int">9</value>
+    <value key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild" type="bool">false</value>
+   </valuemap>
+   <valuemap key="ProjectExplorer.Target.BuildConfiguration.1" type="QVariantMap">
+    <valuemap key="ProjectExplorer.BuildConfiguration.BuildStep.0" type="QVariantMap">
+     <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">qmake</value>
+     <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">QtProjectManager.QMakeBuildStep</value>
+     <valuelist key="QtProjectManager.QMakeBuildStep.QMakeArguments" type="QVariantList"/>
+    </valuemap>
+    <valuemap key="ProjectExplorer.BuildConfiguration.BuildStep.1" type="QVariantMap">
+     <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Make</value>
+     <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MakeStep</value>
+     <value key="Qt4ProjectManager.MakeStep.Clean" type="bool">false</value>
+     <valuelist key="Qt4ProjectManager.MakeStep.MakeArguments" type="QVariantList"/>
+     <value key="Qt4ProjectManager.MakeStep.MakeCommand" type="QString"></value>
+    </valuemap>
+    <valuemap key="ProjectExplorer.BuildConfiguration.BuildStep.2" type="QVariantMap">
+     <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString"></value>
+     <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MaemoPackageCreationStep</value>
+     <valuelist key="Qt4ProjectManager.BuildStep.MaemoPackage.LocalFiles" type="QVariantList"/>
+     <value key="Qt4ProjectManager.BuildStep.MaemoPackage.Modified" type="bool">false</value>
+     <value key="Qt4ProjectManager.BuildStep.MaemoPackage.RemoteExe" type="QString">/usr/local/bin/fapman</value>
+     <valuelist key="Qt4ProjectManager.BuildStep.MaemoPackage.RemoteFiles" type="QVariantList"/>
+    </valuemap>
+    <value key="ProjectExplorer.BuildConfiguration.BuildStepsCount" type="int">3</value>
+    <valuemap key="ProjectExplorer.BuildConfiguration.CleanStep.0" type="QVariantMap">
+     <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Make</value>
+     <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MakeStep</value>
+     <value key="Qt4ProjectManager.MakeStep.Clean" type="bool">true</value>
+     <valuelist key="Qt4ProjectManager.MakeStep.MakeArguments" type="QVariantList">
+      <value type="QString">clean</value>
+     </valuelist>
+     <value key="Qt4ProjectManager.MakeStep.MakeCommand" type="QString"></value>
+    </valuemap>
+    <value key="ProjectExplorer.BuildConfiguration.CleanStepsCount" type="int">1</value>
+    <value key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment" type="bool">false</value>
+    <valuelist key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges" type="QVariantList"/>
+    <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Release</value>
+    <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration" type="int">0</value>
+    <value key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory" type="QString">/home/heikki/Projects/fapman-build-maemo</value>
+    <value key="Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId" type="int">7</value>
+    <value key="Qt4ProjectManager.Qt4BuildConfiguration.ToolChain" type="int">9</value>
+    <value key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild" type="bool">false</value>
+   </valuemap>
+   <value key="ProjectExplorer.Target.BuildConfigurationCount" type="int">2</value>
+   <valuemap key="ProjectExplorer.Target.RunConfiguration.0" type="QVariantMap">
+    <value key=".ProFile" type="QString">fapman.pro</value>
+    <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">New Maemo Run Configuration</value>
+    <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MaemoRunConfiguration</value>
+    <valuelist key="Qt4ProjectManager.MaemoRunConfiguration.Arguments" type="QVariantList"/>
+    <valuemap key="Qt4ProjectManager.MaemoRunConfiguration.DebuggingHelpersLastDeployed" type="QVariantMap"/>
+    <value key="Qt4ProjectManager.MaemoRunConfiguration.DeviceId" type="qulonglong">0</value>
+    <valuemap key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployed" type="QVariantMap"/>
+   </valuemap>
+   <value key="ProjectExplorer.Target.RunConfigurationCount" type="int">1</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Target.1</variable>
+  <valuemap type="QVariantMap">
+   <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Qt Simulator</value>
+   <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.Target.QtSimulatorTarget</value>
+   <value key="ProjectExplorer.Target.ActiveBuildConfiguration" type="int">0</value>
+   <value key="ProjectExplorer.Target.ActiveRunConfiguration" type="int">0</value>
+   <valuemap key="ProjectExplorer.Target.BuildConfiguration.0" type="QVariantMap">
+    <valuemap key="ProjectExplorer.BuildConfiguration.BuildStep.0" type="QVariantMap">
+     <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">qmake</value>
+     <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">QtProjectManager.QMakeBuildStep</value>
+     <valuelist key="QtProjectManager.QMakeBuildStep.QMakeArguments" type="QVariantList"/>
+    </valuemap>
+    <valuemap key="ProjectExplorer.BuildConfiguration.BuildStep.1" type="QVariantMap">
+     <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Make</value>
+     <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MakeStep</value>
+     <value key="Qt4ProjectManager.MakeStep.Clean" type="bool">false</value>
+     <valuelist key="Qt4ProjectManager.MakeStep.MakeArguments" type="QVariantList"/>
+     <value key="Qt4ProjectManager.MakeStep.MakeCommand" type="QString"></value>
+    </valuemap>
+    <value key="ProjectExplorer.BuildConfiguration.BuildStepsCount" type="int">2</value>
+    <valuemap key="ProjectExplorer.BuildConfiguration.CleanStep.0" type="QVariantMap">
+     <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Make</value>
+     <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MakeStep</value>
+     <value key="Qt4ProjectManager.MakeStep.Clean" type="bool">true</value>
+     <valuelist key="Qt4ProjectManager.MakeStep.MakeArguments" type="QVariantList">
+      <value type="QString">clean</value>
+     </valuelist>
+     <value key="Qt4ProjectManager.MakeStep.MakeCommand" type="QString"></value>
+    </valuemap>
+    <value key="ProjectExplorer.BuildConfiguration.CleanStepsCount" type="int">1</value>
+    <value key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment" type="bool">false</value>
+    <valuelist key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges" type="QVariantList"/>
+    <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Debug</value>
+    <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration" type="int">0</value>
+    <value key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory" type="QString">/home/heikki/Projects/fapman-build-simulator</value>
+    <value key="Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId" type="int">6</value>
+    <value key="Qt4ProjectManager.Qt4BuildConfiguration.ToolChain" type="int">0</value>
+    <value key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild" type="bool">true</value>
+   </valuemap>
+   <valuemap key="ProjectExplorer.Target.BuildConfiguration.1" type="QVariantMap">
+    <valuemap key="ProjectExplorer.BuildConfiguration.BuildStep.0" type="QVariantMap">
+     <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">qmake</value>
+     <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">QtProjectManager.QMakeBuildStep</value>
+     <valuelist key="QtProjectManager.QMakeBuildStep.QMakeArguments" type="QVariantList"/>
+    </valuemap>
+    <valuemap key="ProjectExplorer.BuildConfiguration.BuildStep.1" type="QVariantMap">
+     <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Make</value>
+     <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MakeStep</value>
+     <value key="Qt4ProjectManager.MakeStep.Clean" type="bool">false</value>
+     <valuelist key="Qt4ProjectManager.MakeStep.MakeArguments" type="QVariantList"/>
+     <value key="Qt4ProjectManager.MakeStep.MakeCommand" type="QString"></value>
+    </valuemap>
+    <value key="ProjectExplorer.BuildConfiguration.BuildStepsCount" type="int">2</value>
+    <valuemap key="ProjectExplorer.BuildConfiguration.CleanStep.0" type="QVariantMap">
+     <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Make</value>
+     <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.MakeStep</value>
+     <value key="Qt4ProjectManager.MakeStep.Clean" type="bool">true</value>
+     <valuelist key="Qt4ProjectManager.MakeStep.MakeArguments" type="QVariantList">
+      <value type="QString">clean</value>
+     </valuelist>
+     <value key="Qt4ProjectManager.MakeStep.MakeCommand" type="QString"></value>
+    </valuemap>
+    <value key="ProjectExplorer.BuildConfiguration.CleanStepsCount" type="int">1</value>
+    <value key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment" type="bool">false</value>
+    <valuelist key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges" type="QVariantList"/>
+    <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">Release</value>
+    <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration" type="int">0</value>
+    <value key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory" type="QString">/home/heikki/Projects/fapman-build-simulator</value>
+    <value key="Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId" type="int">6</value>
+    <value key="Qt4ProjectManager.Qt4BuildConfiguration.ToolChain" type="int">0</value>
+    <value key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild" type="bool">true</value>
+   </valuemap>
+   <value key="ProjectExplorer.Target.BuildConfigurationCount" type="int">2</value>
+   <valuemap key="ProjectExplorer.Target.RunConfiguration.0" type="QVariantMap">
+    <value key="ProjectExplorer.ProjectConfiguration.DisplayName" type="QString">fapman</value>
+    <value key="ProjectExplorer.ProjectConfiguration.Id" type="QString">Qt4ProjectManager.Qt4RunConfiguration</value>
+    <value key="Qt4ProjectManager.Qt4RunConfiguration.BaseEnvironmentBase" type="int">2</value>
+    <valuelist key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments" type="QVariantList"/>
+    <value key="Qt4ProjectManager.Qt4RunConfiguration.ProFile" type="QString">fapman.pro</value>
+    <value key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix" type="bool">false</value>
+    <value key="Qt4ProjectManager.Qt4RunConfiguration.UseTerminal" type="bool">false</value>
+    <valuelist key="Qt4ProjectManager.Qt4RunConfiguration.UserEnvironmentChanges" type="QVariantList"/>
+    <value key="Qt4ProjectManager.Qt4RunConfiguration.UserSetName" type="bool">false</value>
+    <value key="Qt4ProjectManager.Qt4RunConfiguration.UserSetWorkingDirectory" type="bool">false</value>
+    <value key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory" type="QString"></value>
+   </valuemap>
+   <value key="ProjectExplorer.Target.RunConfigurationCount" type="int">1</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.TargetCount</variable>
+  <value type="int">2</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
+  <value type="int">4</value>
+ </data>
+</qtcreator>
diff --git a/filterselect.cpp b/filterselect.cpp
new file mode 100644 (file)
index 0000000..f0b5bb3
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#include "filterselect.h"
+#include "ui_filterselect.h"
+
+FilterSelect::FilterSelect(QString title, QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::FilterSelect)
+{
+    ui->setupUi(this);
+       connect(ui->listWidget,SIGNAL(itemActivated(QListWidgetItem*)),this,SLOT(accept()));
+       this->setWindowTitle(title);
+}
+
+FilterSelect::~FilterSelect()
+{
+    delete ui;
+}
+
+void FilterSelect::changeEvent(QEvent *e)
+{
+    QDialog::changeEvent(e);
+    switch (e->type()) {
+    case QEvent::LanguageChange:
+        ui->retranslateUi(this);
+        break;
+    default:
+        break;
+    }
+}
+
+void FilterSelect::setList(QStringList labels, int selected)
+{
+       ui->listWidget->addItems(labels);
+       ui->listWidget->item(selected)->setSelected(true);
+}
+
+int FilterSelect::selection()
+{
+       for( int i=0; i<ui->listWidget->count(); i++)
+       {
+               if( ui->listWidget->item(i)->isSelected() )
+                       return i;
+       }
+
+       return 0;
+}
diff --git a/filterselect.h b/filterselect.h
new file mode 100644 (file)
index 0000000..4789b97
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#ifndef FILTERSELECT_H
+#define FILTERSELECT_H
+
+#include <QDialog>
+
+namespace Ui {
+    class FilterSelect;
+}
+
+class FilterSelect : public QDialog
+{
+    Q_OBJECT
+
+public:
+       explicit FilterSelect(QString title, QWidget *parent = 0);
+    ~FilterSelect();
+       void setList(QStringList labels, int selected);
+       int selection();
+#ifdef Q_WS_MAEMO_5            // workaround for buggy Qt autorotation
+       int exec() {
+               QRect r = dynamic_cast<QWidget*>(this->parent())->rect();
+               if(r.width() < r.height())
+                       this->setAttribute(Qt::WA_Maemo5PortraitOrientation);
+               int e = QDialog::exec();
+               this->setAttribute(Qt::WA_Maemo5AutoOrientation);
+               return e;
+       }
+#endif
+
+protected:
+    void changeEvent(QEvent *e);
+
+private:
+    Ui::FilterSelect *ui;
+
+};
+
+#endif // FILTERSELECT_H
diff --git a/filterselect.ui b/filterselect.ui
new file mode 100644 (file)
index 0000000..c366baa
--- /dev/null
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>FilterSelect</class>
+ <widget class="QDialog" name="FilterSelect">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>700</width>
+    <height>700</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Select filter</string>
+  </property>
+  <layout class="QHBoxLayout" name="horizontalLayout">
+   <property name="spacing">
+    <number>2</number>
+   </property>
+   <property name="margin">
+    <number>2</number>
+   </property>
+   <item>
+    <widget class="QListWidget" name="listWidget">
+     <property name="editTriggers">
+      <set>QAbstractItemView::NoEditTriggers</set>
+     </property>
+     <property name="showDropIndicator" stdset="0">
+      <bool>false</bool>
+     </property>
+     <property name="resizeMode">
+      <enum>QListView::Adjust</enum>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/help.cpp b/help.cpp
new file mode 100644 (file)
index 0000000..25167f7
--- /dev/null
+++ b/help.cpp
@@ -0,0 +1,45 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#include "help.h"
+#include "ui_help.h"
+
+Help::Help(QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::Help)
+{
+    ui->setupUi(this);
+}
+
+Help::~Help()
+{
+    delete ui;
+}
+
+void Help::changeEvent(QEvent *e)
+{
+    QDialog::changeEvent(e);
+    switch (e->type()) {
+    case QEvent::LanguageChange:
+        ui->retranslateUi(this);
+        break;
+    default:
+        break;
+    }
+}
diff --git a/help.h b/help.h
new file mode 100644 (file)
index 0000000..883b874
--- /dev/null
+++ b/help.h
@@ -0,0 +1,54 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#ifndef HELP_H
+#define HELP_H
+
+#include <QDialog>
+
+namespace Ui {
+    class Help;
+}
+
+class Help : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit Help(QWidget *parent = 0);
+    ~Help();
+#ifdef Q_WS_MAEMO_5            // workaround for buggy Qt autorotation
+       int exec() {
+               QRect r = dynamic_cast<QWidget*>(this->parent())->rect();
+               if(r.width() < r.height())
+                       this->setAttribute(Qt::WA_Maemo5PortraitOrientation);
+               int e = QDialog::exec();
+               this->setAttribute(Qt::WA_Maemo5AutoOrientation);
+               return e;
+       }
+#endif
+
+protected:
+    void changeEvent(QEvent *e);
+
+private:
+    Ui::Help *ui;
+};
+
+#endif // HELP_H
diff --git a/help.ui b/help.ui
new file mode 100644 (file)
index 0000000..8abd85a
--- /dev/null
+++ b/help.ui
@@ -0,0 +1,286 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Help</class>
+ <widget class="QDialog" name="Help">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>700</width>
+    <height>700</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Help</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>2</number>
+   </property>
+   <property name="margin">
+    <number>2</number>
+   </property>
+   <item>
+    <widget class="QScrollArea" name="scrollArea">
+     <property name="widgetResizable">
+      <bool>true</bool>
+     </property>
+     <widget class="QWidget" name="scrollAreaWidgetContents">
+      <property name="geometry">
+       <rect>
+        <x>0</x>
+        <y>0</y>
+        <width>694</width>
+        <height>694</height>
+       </rect>
+      </property>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <property name="spacing">
+        <number>6</number>
+       </property>
+       <property name="margin">
+        <number>0</number>
+       </property>
+       <item>
+        <widget class="QLabel" name="label_13">
+         <property name="text">
+          <string>The following icons are used to indicate package status in the package view:</string>
+         </property>
+         <property name="wordWrap">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <layout class="QGridLayout" name="gridLayout">
+         <item row="0" column="0">
+          <widget class="QLabel" name="label">
+           <property name="text">
+            <string/>
+           </property>
+           <property name="pixmap">
+            <pixmap resource="resources.qrc">:/icons/icons/pkg_nop_installed.png</pixmap>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+           </property>
+          </widget>
+         </item>
+         <item row="0" column="1">
+          <widget class="QLabel" name="label_10">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string>Package is installed</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+           </property>
+           <property name="wordWrap">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item row="1" column="0">
+          <widget class="QLabel" name="label_2">
+           <property name="text">
+            <string/>
+           </property>
+           <property name="pixmap">
+            <pixmap resource="resources.qrc">:/icons/icons/pkg_nop_instupgr.png</pixmap>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+           </property>
+          </widget>
+         </item>
+         <item row="2" column="0">
+          <widget class="QLabel" name="label_3">
+           <property name="text">
+            <string/>
+           </property>
+           <property name="pixmap">
+            <pixmap resource="resources.qrc">:/icons/icons/pkg_nop_notinstalled.png</pixmap>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+           </property>
+          </widget>
+         </item>
+         <item row="2" column="1">
+          <widget class="QLabel" name="label_9">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string>Package is not installed</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+           </property>
+           <property name="wordWrap">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item row="3" column="0">
+          <widget class="QLabel" name="label_4">
+           <property name="text">
+            <string/>
+           </property>
+           <property name="pixmap">
+            <pixmap resource="resources.qrc">:/icons/icons/pkg_install.png</pixmap>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+           </property>
+          </widget>
+         </item>
+         <item row="3" column="1">
+          <widget class="QLabel" name="label_12">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string>Package has been marked for installation</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+           </property>
+           <property name="wordWrap">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item row="4" column="0">
+          <widget class="QLabel" name="label_5">
+           <property name="text">
+            <string/>
+           </property>
+           <property name="pixmap">
+            <pixmap resource="resources.qrc">:/icons/icons/pkg_upgrade.png</pixmap>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+           </property>
+          </widget>
+         </item>
+         <item row="4" column="1">
+          <widget class="QLabel" name="label_8">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string>Package has been marked for upgrade</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+           </property>
+           <property name="wordWrap">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item row="5" column="0">
+          <widget class="QLabel" name="label_6">
+           <property name="text">
+            <string/>
+           </property>
+           <property name="pixmap">
+            <pixmap resource="resources.qrc">:/icons/icons/pkg_remove.png</pixmap>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+           </property>
+          </widget>
+         </item>
+         <item row="5" column="1">
+          <widget class="QLabel" name="label_11">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string>Package has been marked for removal</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+           </property>
+           <property name="wordWrap">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item row="1" column="1">
+          <widget class="QLabel" name="label_7">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string>Package is installed and a newer version is available</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+           </property>
+           <property name="wordWrap">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <widget class="Line" name="line">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLabel" name="label_14">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="text">
+          <string>Search looks for the search string anywhere in the package name by default. To search for names beginning with a string, start your search with a ':' (colon).</string>
+         </property>
+         <property name="alignment">
+          <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+         </property>
+         <property name="wordWrap">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="resources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/icons/appdefault.png b/icons/appdefault.png
new file mode 100644 (file)
index 0000000..ee8ad69
Binary files /dev/null and b/icons/appdefault.png differ
diff --git a/icons/background.png b/icons/background.png
new file mode 100644 (file)
index 0000000..55586cb
Binary files /dev/null and b/icons/background.png differ
diff --git a/icons/blacklist.png b/icons/blacklist.png
new file mode 100644 (file)
index 0000000..19f43ef
Binary files /dev/null and b/icons/blacklist.png differ
diff --git a/icons/close.png b/icons/close.png
new file mode 100644 (file)
index 0000000..6640ebb
Binary files /dev/null and b/icons/close.png differ
diff --git a/icons/commit.png b/icons/commit.png
new file mode 100644 (file)
index 0000000..7c5e21f
Binary files /dev/null and b/icons/commit.png differ
diff --git a/icons/fapman.png b/icons/fapman.png
new file mode 100644 (file)
index 0000000..90fdd8c
Binary files /dev/null and b/icons/fapman.png differ
diff --git a/icons/filter_cat.png b/icons/filter_cat.png
new file mode 100644 (file)
index 0000000..2fd7832
Binary files /dev/null and b/icons/filter_cat.png differ
diff --git a/icons/filter_stat.png b/icons/filter_stat.png
new file mode 100644 (file)
index 0000000..9459072
Binary files /dev/null and b/icons/filter_stat.png differ
diff --git a/icons/install.png b/icons/install.png
new file mode 100644 (file)
index 0000000..2bdc5b9
Binary files /dev/null and b/icons/install.png differ
diff --git a/icons/pkg_install.png b/icons/pkg_install.png
new file mode 100644 (file)
index 0000000..eee461e
Binary files /dev/null and b/icons/pkg_install.png differ
diff --git a/icons/pkg_nop_installed.png b/icons/pkg_nop_installed.png
new file mode 100644 (file)
index 0000000..389dba5
Binary files /dev/null and b/icons/pkg_nop_installed.png differ
diff --git a/icons/pkg_nop_instupgr.png b/icons/pkg_nop_instupgr.png
new file mode 100644 (file)
index 0000000..d3a6d47
Binary files /dev/null and b/icons/pkg_nop_instupgr.png differ
diff --git a/icons/pkg_nop_notinstalled.png b/icons/pkg_nop_notinstalled.png
new file mode 100644 (file)
index 0000000..58a3861
Binary files /dev/null and b/icons/pkg_nop_notinstalled.png differ
diff --git a/icons/pkg_remove.png b/icons/pkg_remove.png
new file mode 100644 (file)
index 0000000..39aee21
Binary files /dev/null and b/icons/pkg_remove.png differ
diff --git a/icons/pkg_upgrade.png b/icons/pkg_upgrade.png
new file mode 100644 (file)
index 0000000..27dfdac
Binary files /dev/null and b/icons/pkg_upgrade.png differ
diff --git a/icons/remove.png b/icons/remove.png
new file mode 100644 (file)
index 0000000..10b22bc
Binary files /dev/null and b/icons/remove.png differ
diff --git a/icons/repos.png b/icons/repos.png
new file mode 100644 (file)
index 0000000..84204b3
Binary files /dev/null and b/icons/repos.png differ
diff --git a/icons/searchoptions.png b/icons/searchoptions.png
new file mode 100644 (file)
index 0000000..8d2badf
Binary files /dev/null and b/icons/searchoptions.png differ
diff --git a/icons/sort.png b/icons/sort.png
new file mode 100644 (file)
index 0000000..79a039c
Binary files /dev/null and b/icons/sort.png differ
diff --git a/icons/update.png b/icons/update.png
new file mode 100644 (file)
index 0000000..2192267
Binary files /dev/null and b/icons/update.png differ
diff --git a/icons/upgrade.png b/icons/upgrade.png
new file mode 100644 (file)
index 0000000..3ed8c82
Binary files /dev/null and b/icons/upgrade.png differ
diff --git a/logview.cpp b/logview.cpp
new file mode 100644 (file)
index 0000000..3a548cc
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#include <QtGui>
+
+#ifdef Q_WS_MAEMO_5
+#include <QtMaemo5>
+#endif
+
+#include "logview.h"
+#include "ui_logview.h"
+#include "aaptinterface.h"
+
+LogView::LogView(QByteArray text, QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::LogView)
+{
+    ui->setupUi(this);
+
+       QFont f = ui->plainTextEdit->font();
+       f.setPointSize( f.pointSize()-2 );
+
+       ui->plainTextEdit->setFont(f);
+
+       QString t = text;
+       QStringList lines = t.split('\n');
+
+       if( lines.count()>100 )
+               ui->label->setText("Showing last 100 lines");
+
+       while( lines.count()>100 )
+               lines.removeFirst();
+       lines << "" << "" << "" << "" << "";
+
+       ui->plainTextEdit->setPlainText("");
+       ui->plainTextEdit->appendPlainText(lines.join("\n"));
+}
+
+LogView::~LogView()
+{
+    delete ui;
+}
+
+int LogView::exec()
+{
+#ifdef Q_WS_MAEMO_5            // workaround for buggy Qt autorotation
+       QRect r = dynamic_cast<QWidget*>(this->parent())->rect();
+       if(r.width() < r.height())
+               this->setAttribute(Qt::WA_Maemo5PortraitOrientation);
+#endif
+       show();
+
+       //ui->plainTextEdit->setMinimumHeight( ui->plainTextEdit->contentsRect().height() );
+       //ui->scrollAreaWidgetContents->setMinimumHeight( ui->scrollAreaWidgetContents->contentsRect().height() );
+       //ui->plainTextEdit->setMinimumHeight( 800 );
+       //ui->plainTextEdit->adjustSize();
+       //ui->scrollAreaWidgetContents->adjustSize();
+
+       // taken from a Qt example, should auto-resize the textedit
+       QTextDocument *doc = ui->plainTextEdit->document();
+       QSize s = doc->size().toSize();
+       if (ui->plainTextEdit)
+               s.setHeight((s.height() + 1) * ui->plainTextEdit->fontMetrics().lineSpacing());
+       const QRect fr = ui->plainTextEdit->frameRect();
+       const QRect cr = ui->plainTextEdit->contentsRect();
+       ui->plainTextEdit->setMinimumHeight(qMax(70, s.height() + (fr.height() - cr.height() - 1)));
+
+       int e = QDialog::exec();
+
+#ifdef Q_WS_MAEMO_5            // workaround for buggy Qt autorotation
+       this->setAttribute(Qt::WA_Maemo5AutoOrientation);
+#endif
+       return e;
+}
+
+void LogView::changeEvent(QEvent *e)
+{
+    QDialog::changeEvent(e);
+    switch (e->type()) {
+    case QEvent::LanguageChange:
+        ui->retranslateUi(this);
+        break;
+    default:
+        break;
+    }
+}
+
+void LogView::on_btnClear_clicked()
+{
+       QFile logfile(KLogFile);
+       logfile.remove();
+
+       accept();
+}
+
+void LogView::on_btnCopy_clicked()
+{
+       ui->plainTextEdit->selectAll();
+       ui->plainTextEdit->copy();
+
+       QMaemo5InformationBox::information ( this, "Copied" );
+}
diff --git a/logview.h b/logview.h
new file mode 100644 (file)
index 0000000..68ed3b1
--- /dev/null
+++ b/logview.h
@@ -0,0 +1,49 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#ifndef LOGVIEW_H
+#define LOGVIEW_H
+
+#include <QDialog>
+
+namespace Ui {
+    class LogView;
+}
+
+class LogView : public QDialog
+{
+    Q_OBJECT
+
+public:
+       explicit LogView(QByteArray text, QWidget *parent = 0);
+    ~LogView();
+       int exec();
+
+protected:
+    void changeEvent(QEvent *e);
+
+private:
+    Ui::LogView *ui;
+
+private slots:
+       void on_btnCopy_clicked();
+       void on_btnClear_clicked();
+};
+
+#endif // LOGVIEW_H
diff --git a/logview.ui b/logview.ui
new file mode 100644 (file)
index 0000000..e4a5911
--- /dev/null
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>LogView</class>
+ <widget class="QDialog" name="LogView">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>700</width>
+    <height>700</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Log</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="margin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QScrollArea" name="scrollArea">
+     <property name="widgetResizable">
+      <bool>true</bool>
+     </property>
+     <widget class="QWidget" name="scrollAreaWidgetContents">
+      <property name="geometry">
+       <rect>
+        <x>0</x>
+        <y>0</y>
+        <width>698</width>
+        <height>669</height>
+       </rect>
+      </property>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <property name="spacing">
+        <number>0</number>
+       </property>
+       <property name="margin">
+        <number>0</number>
+       </property>
+       <item>
+        <widget class="QPlainTextEdit" name="plainTextEdit">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+           <horstretch>0</horstretch>
+           <verstretch>1</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="minimumSize">
+          <size>
+           <width>0</width>
+           <height>0</height>
+          </size>
+         </property>
+         <property name="focusPolicy">
+          <enum>Qt::NoFocus</enum>
+         </property>
+         <property name="undoRedoEnabled">
+          <bool>false</bool>
+         </property>
+         <property name="readOnly">
+          <bool>true</bool>
+         </property>
+         <property name="textInteractionFlags">
+          <set>Qt::NoTextInteraction</set>
+         </property>
+         <property name="centerOnScroll">
+          <bool>false</bool>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QLabel" name="label">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="btnCopy">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string>Copy to clipboard</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="btnClear">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string>Clear</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/main.cpp b/main.cpp
new file mode 100644 (file)
index 0000000..e81f3ab
--- /dev/null
+++ b/main.cpp
@@ -0,0 +1,108 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#include <QtGui/QApplication>
+#include <QtDBus>
+#include <iostream>
+#include "mainwindow.h"
+#include "confirmdialog.h"
+
+#include <unistd.h>
+#include <sys/vfs.h>
+
+bool EnableDebugOutput = false;
+
+void myMessageOutput( QtMsgType, const char *msg )
+{
+       if( EnableDebugOutput )
+               std::cerr << msg << std::endl;
+}
+
+int main(int argc, char *argv[])
+{
+       qInstallMsgHandler( myMessageOutput );
+    QApplication a(argc, argv);
+
+       a.setApplicationName("faster_application_manager");
+       QDir::setCurrent("/root/.fapman/");
+
+       EnableDebugOutput = false;
+       if( a.arguments().contains("-d") ) {
+               EnableDebugOutput = true;
+               qDebug() << "Enabled debug output";
+       }
+
+       MainWindow w;
+
+#if defined(Q_WS_S60)
+    w.showMaximized();
+#else
+    w.show();
+#endif
+
+#ifdef Q_WS_MAEMO_5
+       uid_t userUID = getuid();
+       if( userUID != 0 ) {
+               ConfirmDialog d(false, &w);
+               d.setText("Warning", "You are not running the application as root. It won't work as intended.");
+               d.exec();
+       }
+
+       quint64 warn_limit_root = 5120;
+       quint64 warn_limit_opt = 51200;
+       struct statfs root_stat;
+       struct statfs opt_stat;
+       statfs("/",&root_stat);
+       statfs("/opt",&opt_stat);
+       quint64 free_root = root_stat.f_bavail * root_stat.f_bsize / 1024;
+       quint64 free_opt = opt_stat.f_bavail * opt_stat.f_bsize / 1024;
+       qDebug() << "rootfs" << free_root << "kB free";
+       qDebug() << "opt fs" << free_opt << "kB free";
+       if( free_root < warn_limit_root || free_opt < warn_limit_opt )
+       {
+               ConfirmDialog d(false, &w);
+               QString t;
+               if( free_root < warn_limit_root )
+                       t += QString("Root filesystem has %L1 kB available<br>").arg(free_root);
+               if( free_opt < warn_limit_opt )
+                       t += QString("Opt (home) filesystem has %L1 kB available<br>").arg(free_opt);
+               t += "<br>You may proceed, but consider freeing up space to prevent problems in the future";
+               d.setText("Warning: Low disk space",t);
+               d.exec();
+       }
+
+       // *** from patch by qwerty12 ***
+       if (!QDBusConnection::sessionBus().isConnected()) {
+               qWarning("Cannot connect to the D-Bus session bus.");
+       }
+
+       if (!QDBusConnection::sessionBus().registerService("org.maemo.faster_application_manager")) {
+               qWarning("%s", qPrintable(QDBusConnection::sessionBus().lastError().message()));
+       }
+       
+       if (!QDBusConnection::sessionBus().registerObject("/org/maemo/faster_application_manager", &w, QDBusConnection::ExportScriptableSlots)) {
+               qWarning("%s", qPrintable(QDBusConnection::sessionBus().lastError().message()));
+       }
+       // ***
+
+#endif
+
+    return a.exec();
+}
+
diff --git a/mainwindow.cpp b/mainwindow.cpp
new file mode 100644 (file)
index 0000000..8fa98fd
--- /dev/null
@@ -0,0 +1,578 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#ifdef MYDEF_GTK_EXISTS
+#include <gdk/gdk.h>
+#include <gtk/gtk.h>
+#endif
+
+#include <QtCore>
+#include <QtGui>
+#include <QDBusConnection>
+#include <QDBusInterface>
+#include <phonon/AudioOutput>
+#include <phonon/MediaObject>
+
+#ifdef Q_WS_MAEMO_5
+#include <QtMaemo5>
+#endif
+
+#include "mainwindow.h"
+#include "version.h"
+#include "ui_mainwindow.h"
+#include "aaptinterface.h"
+#include "packageview.h"
+#include "confirmdialog.h"
+#include "dimmer.h"
+#include "repoview.h"
+#include "help.h"
+#include "settings.h"
+#include "logview.h"
+#include "rotatingbackground.h"
+#include "dpkginterface.h"
+
+
+MainWindow::MainWindow(QWidget *parent) :
+    QMainWindow(parent),
+    ui(new Ui::MainWindow)
+{
+    ui->setupUi(this);
+
+       iAptInterface = new AAptInterface(this);
+       iWinPackageView = new PackageView(this);
+       iWinPackageView->setAptInterface(iAptInterface);
+       iWinRepoView = new RepoView(this);
+       iWinRepoView->setAptInterface(iAptInterface);
+       iSettings = new Settings(this);
+       iSettings->setAptInterface(iAptInterface);
+       iSettings->setPackageView(iWinPackageView);
+       iWinPackageView->setSettings(iSettings);
+       iAptInterface->setSettings(iSettings);
+       iDpkgInterface = new DpkgInterface(this);
+
+       iWinPackageView->setSortOrder( (PackageView::sortOrder)iSettings->qsettings()->value("default_sort_order",0).toInt() );
+
+       iWinPackageView->setSearchOptions( iSettings->qsettings()->value("search_pkgnames",true).toBool(),
+                                                                          iSettings->qsettings()->value("search_displaynames",true).toBool(),
+                                                                          iSettings->qsettings()->value("search_descshort",true).toBool(),
+                                                                          iSettings->qsettings()->value("search_desclong",false).toBool() );
+
+#ifdef Q_WS_MAEMO_5
+       this->setAttribute(Qt::WA_Maemo5StackedWindow);
+       if( !iSettings->qsettings()->value("disable_autorotation",false).toBool() ) {
+               this->setAttribute(Qt::WA_Maemo5AutoOrientation);
+       } else {
+               this->setAttribute(Qt::WA_Maemo5LandscapeOrientation);
+       }
+#endif
+
+       iDimmer = new dimmer(this);
+
+       iReposAutoUpdating = false;
+       iUpgradeAutoUpdate = true;
+       iNextOperation = OpNone;
+
+       ui->centralWidget->loadWallpaper();
+
+       QString stylesheet_mainscreen =
+                       "QPushButton {"
+                       "border-radius: 16px;"
+                       "border-width: 1px;"
+                       "border-color: palette(light);"
+                       "border-style: outset;"
+                       "padding-right: 10px;"
+                       "padding-left: 10px;"
+                       "color: palette(buttontext);"
+                       "background: rgba(255,255,255,80);"
+                       "}"
+                       "QPushButton:pressed {"
+                       "border-style: inset;"
+                       "background-color: rgba(255,255,255,150);"
+                       "}";
+
+       if( ((QApplication*)QApplication::instance())->styleSheet().isEmpty() )
+       {
+               QString stylesheet_file;
+               QFile f("/root/.fapman/style.css");
+               if( f.open(QIODevice::ReadOnly | QIODevice::Text ) )
+               {
+                       while(!f.atEnd()) {
+                               stylesheet_file += f.readLine().trimmed();
+                       }
+                       f.close();
+               }
+
+               if( stylesheet_file.isEmpty() ) {
+                       ui->centralWidget->setStyleSheet(stylesheet_mainscreen);
+               } else {
+                       ((QApplication*)QApplication::instance())->setStyleSheet(stylesheet_file);
+               }
+       }
+
+
+       /*
+       // does not work
+
+       QDBusConnection conn = QDBusConnection::connectToBus(QDBusConnection::SystemBus, "faster_application_manager");
+
+       QString service = "com.nokia.icd";
+       QString path = "/com/nokia/icd";
+       QString method = "connect";
+
+       QDBusInterface net(service, path, service, conn, this);
+       net.call(method,"[ANY]",0);
+       */
+
+       iMediaObject = new Phonon::MediaObject(this);
+       Phonon::AudioOutput* aout = new Phonon::AudioOutput(Phonon::NotificationCategory, this);
+       Phonon::createPath(iMediaObject, aout);
+
+       resetIdlingTime();
+}
+
+MainWindow::~MainWindow()
+{
+       // save "need repo refresh" status
+       iSettings->qsettings()->setValue("need_repo_refresh", iAptInterface->needRepoRefresh());
+
+       delete iWinPackageView;
+       delete iWinRepoView;
+       delete iAptInterface;
+       delete iDpkgInterface;
+       delete iDimmer;
+       delete iSettings;
+    delete ui;
+}
+
+void MainWindow::changeEvent(QEvent *e)
+{
+    QMainWindow::changeEvent(e);
+    switch (e->type()) {
+    case QEvent::LanguageChange:
+        ui->retranslateUi(this);
+        break;
+    default:
+        break;
+    }
+}
+
+void MainWindow::on_btnRepos_clicked()
+{
+       iWinRepoView->openWin();
+}
+
+void MainWindow::on_btnUpdate_clicked()
+{      
+       // update catalogs
+
+       busyDialog(true, tr("Operation in progress"), tr("Updating catalogs"));
+
+       iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetUpdate);
+       iAptInterface->run(iDimmer);
+}
+
+#ifdef Q_WS_MAEMO_5
+int MainWindow::top_application()
+{
+       show();
+       activateWindow();
+       raise();
+       return 0;
+}
+#endif
+
+void MainWindow::dateFetchAsk()
+{
+       if( !iSettings->qsettings()->value("firstrun_asked_fetch_dates",false).toBool() &&
+               !iSettings->qsettings()->value("fetch_dates",false).toBool() )
+       {
+               iSettings->qsettings()->setValue("firstrun_asked_fetch_dates", true);
+               ConfirmDialog d(true, this);
+               d.setText("Fetch date information?","Enable date information fetching for packages? You have to enable it in order to be "
+                                 "able to sort packages by date. The first fetch can be slow but the dates are cached for later use. You can later "
+                                 "change this selection from the options menu.");
+               if( d.exec() )
+                       iSettings->qsettings()->setValue("fetch_dates", true);
+       }
+       if( iSettings->qsettings()->value("fetch_dates",false).toBool() )
+       {
+               iSettings->qsettings()->setValue("firstrun_asked_fetch_dates", true);   // don't ask if the option has already been enabled
+               if( !iAptInterface->dateCacheExists() )
+               {
+                       ConfirmDialog d(false, this);
+                       d.setText("Notice","Date information will be fetched only for packages from maemo.org and only for user categories.");
+                       d.exec();
+               }
+               iAptInterface->addQueuedOperation(AAptInterface::ModeFetchDates);
+       }
+}
+
+void MainWindow::on_btnListInstallable_clicked()
+{
+       //install
+
+       if( iIdlingSince < QDateTime::currentDateTime().addSecs(-30*60) )
+               iAptInterface->setNeedRefresh(-1,1,1,1);
+
+       iWinPackageView->setStatFilter( Package::PkgStatNotInstalled );
+
+       if( iAptInterface->needRepoRefresh() )
+               iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetUpdate);
+
+       busyDialog(true, tr("Operation in progress"), tr("Reading package lists"));
+
+       iNextOperation = OpOpenPkgView;
+       iAptInterface->addQueuedOperation(AAptInterface::ModeReadPackages);
+
+       dateFetchAsk();
+
+       iAptInterface->run(iDimmer);
+}
+
+void MainWindow::on_btnUpgrade_clicked()
+{
+       // upgrade
+
+       if( iIdlingSince < QDateTime::currentDateTime().addSecs(-30*60) )
+               iAptInterface->setNeedRefresh(-1,1,1,1);
+
+       iWinPackageView->setStatFilter( Package::PkgStatUpgradeable );
+
+       if( iAptInterface->needRepoRefresh() )
+               iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetUpdate);
+
+       busyDialog(true, tr("Operation in progress"), tr("Reading package lists"));
+
+       iNextOperation = OpOpenPkgView;
+       iAptInterface->addQueuedOperation(AAptInterface::ModeReadPackages);
+
+       dateFetchAsk();
+
+       iAptInterface->run(iDimmer);
+}
+
+void MainWindow::on_btnListInstalled_clicked()
+{
+       //remove
+
+       if( !iSettings->qsettings()->value("remove_readfull",false).toBool() )
+               iAptInterface->setSkipListAndDates();
+
+       if( iIdlingSince < QDateTime::currentDateTime().addSecs(-30*60) )
+               iAptInterface->setNeedRefresh(-1,-1,1,-1);
+
+       iWinPackageView->setStatFilter( Package::PkgStatInstalled );
+
+       busyDialog(true, tr("Operation in progress"), tr("Reading package lists"));
+
+       iNextOperation = OpOpenPkgView;
+       iAptInterface->addQueuedOperation(AAptInterface::ModeReadPackages);
+
+       dateFetchAsk();
+
+       iAptInterface->run(iDimmer);
+}
+
+void MainWindow::operationQueueFinished(QList<AAptInterface::interfaceMode> lastModes, bool success, QString title, QStringList msgs)
+{
+       if( lastModes.contains(AAptInterface::ModeAptGetSimulate) && success ) {
+               iNextOperation = OpPromptSimulated;
+       }
+       if( lastModes.contains(AAptInterface::ModeAptGetInstall) && success ) {
+               iWinPackageView->clearSelections();
+               busyDialog(false);
+               iWinPackageView->close();
+               iNextOperation = OpNone;
+
+               GdkEventIconThemeReload();
+       }
+
+       if( iNextOperation == OpOpenPkgView && success )
+       {
+               iWinPackageView->openWin();
+               busyDialog(false);
+               iNextOperation = OpNone;
+       } else if( iNextOperation == OpPromptSimulated && success )
+       {
+               QStringList inst,remv,instver,remvver;
+               QStringList all = iAptInterface->processPackages();
+               QStringList vers = iAptInterface->processPackageVersions();
+               for(int zyx=0; zyx<all.count(); zyx++)
+               {
+                       if( all.at(zyx).endsWith('-') )
+                       {
+                               remv.append( all.at(zyx).left( all.at(zyx).size()-1 ) );
+                               if( vers.count()>zyx )
+                                       remvver.append( vers.at(zyx) );
+                       } else {
+                               inst.append( all.at(zyx) );
+                               if( vers.count()>zyx )
+                                       instver.append( vers.at(zyx) );
+                       }
+               }
+
+               int total_dl_size = 0;
+               for( int i=0; i<inst.count(); i++ ) {
+                       Package* pkg = iAptInterface->packagesAvailable()->value(inst.at(i),0);
+                       if( pkg ) {
+                               total_dl_size += pkg->size()/1024;
+                       }
+               }
+
+               QString pkglist;
+               pkglist = QString("<b>The following operations will be performed:</b><br>"
+                                 "%1 to install/upgrade, %2 to remove<br>").arg(inst.count()).arg(remv.count());
+               if( inst.count()>0 )
+                       pkglist += QString("Total download size: %L1 kB<br>").arg(total_dl_size);
+               bool mismatch = false;
+
+               if( remv.count()>0 ) {
+                       pkglist += "<br><b><u>REMOVE:</u></b><br><font size=\"-1\">";
+                       for( int i=0; i<remv.count(); i++ ) {
+                               pkglist += "<b>" + remv.at(i) + "</b>";
+                               Package* pkg = iAptInterface->packagesInstalled()->value(remv.at(i),0);
+                               if( !pkg ) {
+                                       qDebug() << "Warning: unknown package" << remv.at(i);
+                                       pkglist += "<font color=\"red\">***UNKNOWN***</font>";
+                                       mismatch = true;
+                               }
+                               if( remvver.count()>i ) {
+                                       pkglist += " " + remvver.at(i);
+                                       if( pkg && remvver.at(i) != pkg->version() ) {
+                                               qDebug() << "Version mismatch, database version is" << pkg->version() << "but removing" << remvver.at(i);
+                                               mismatch = true;
+                                               pkglist += " <font color=\"red\">***TRYING TO REMOVE " + pkg->version() + "***</font> ";
+                                       }
+                               }
+                               if( pkg && pkg->installedSize()>0 )
+                                       pkglist += QString(" (%L1 kB)").arg(pkg->installedSize());
+                               pkglist += "<br>";
+                       }
+               }
+               pkglist += "</font>";
+
+               bool installing_blacklisted = false;
+               if( inst.count()>0 ) {
+                       pkglist += "<br><b><u>INSTALL/UPGRADE:</u></b><br><font size=\"-1\">";
+                       for( int i=0; i<inst.count(); i++ ) {
+                               pkglist += "<b>" + inst.at(i) + "</b>";
+                               Package* pkg = iAptInterface->packagesAvailable()->value(inst.at(i),0);
+                               if( !pkg ) {
+                                       qDebug() << "Warning: unknown package" << inst.at(i);
+                                       pkglist += "<font color=\"red\">***NEW/UNKNOWN***</font>";
+                                       mismatch = true;
+                               }
+                               if( pkg && pkg->isBlacklisted() ) {
+                                       qDebug() << "Warning: installing blacklisted package" << inst.at(i);
+                                       pkglist += "<font color=\"red\">***BLACKLISTED***</font>";
+                                       installing_blacklisted = true;
+                               }
+                               if( instver.count()>i ) {
+                                       pkglist += " " + instver.at(i);
+                                       if( pkg && instver.at(i) != pkg->version() ) {
+                                               qDebug() << "Version mismatch, database version is" << pkg->version() << "but installing" << instver.at(i);
+                                               mismatch = true;
+                                               pkglist += " <font color=\"red\">***TRYING TO INSTALL " + pkg->version() + "***</font> ";
+                                       }
+                               }
+                               if( pkg && pkg->size()>0 ) {
+                                       pkglist += QString(" (%L1 kB)").arg(pkg->size()/1024);
+                               }
+                               pkglist += "<br>";
+                       }
+               }
+               pkglist += "</font>";
+
+               if( mismatch ) {
+                       ConfirmDialog m(false, this);
+                       m.setText("Warning", "There is a version mismatch between your original package selections and some of the packages being installed " \
+                                         "from the repositories. This could be due to your application catalogs being out of date.");
+                       m.exec();
+               }
+               if( installing_blacklisted ) {
+                       ConfirmDialog b(false, this);
+                       b.setText("Warning","Blacklisted package(s) will be installed");
+                       b.exec();
+               }
+
+               busyDialog(false);
+               ConfirmDialog d(true, this);
+               d.setText("Confirmation",pkglist);
+               if( d.exec() ) {
+                       iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetInstall);
+
+                       if( iSettings->qsettings()->value("enable_autoclean",true).toBool() && inst.count()>0 )
+                               iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetClean);
+
+                       QString busytext;
+                       if( remv.count() > 0 )
+                               busytext += QString("Remove %1 package(s)<br>").arg(remv.count());
+                       if( inst.count() > 0 )
+                               busytext += QString("Install %1 package(s)<br>").arg(inst.count());
+                       busytext += "Preparing...";
+                       busyDialog(true, "Operation in progress", busytext);
+
+                       // "run" really does nothing here since the previous item should still be running
+                       if( iWinPackageView->isVisible() ) {
+                               iAptInterface->run(iWinPackageView->mydimmer());
+                       } else {
+                               iAptInterface->run(iDimmer);
+                       }
+               }
+               iNextOperation = OpNone;
+               return;
+       } else {
+               busyDialog(false);
+               iNextOperation = OpNone;
+
+               if( iSettings->qsettings()->value("sound_notify",false).toBool() )
+               {
+                       qDebug() << "playing sound";
+                       iMediaObject->setCurrentSource( Phonon::MediaSource(iSettings->qsettings()->value("sound_file","/usr/share/sounds/ui-operation_ready.wav").toString()) );
+                       iMediaObject->play();
+               }
+
+               QString text = "<br><b><u>Faster Application Manager</u></b><br>"
+                               "<b>"+title+"</b><br>" + msgs.join("<br>") + "<br>";
+
+#ifdef Q_WS_MAEMO_5
+               QMaemo5InformationBox::information(0, text, QMaemo5InformationBox::NoTimeout);
+#endif
+       }
+
+}
+
+void MainWindow::busyDialog(bool show_, QString title, QString text)
+{
+       if( show_ ) {
+               iDimmer->setProgress(-1);
+               ui->menuMenu->setEnabled(false);
+               ui->centralWidget->setEnabled(false);
+               iWinPackageView->disableMenu();
+               iDimmer->resizeEvent(0);
+               iDimmer->dim(title, text);
+               iWinPackageView->mydimmer()->resizeEvent(0);
+               iWinPackageView->mydimmer()->dim(title, text);
+       } else {
+               iDimmer->undim();
+               iWinPackageView->mydimmer()->undim();
+               ui->menuMenu->setEnabled(true);
+               ui->centralWidget->setEnabled(true);
+               iWinPackageView->enableMenu();
+       }
+}
+
+void MainWindow::on_actionAbout_triggered()
+{
+       ConfirmDialog d(false, this);
+       d.setText("About","Faster Application Manager<br>"
+                         "<font size=\"-1\">Version " + PROGRAM_VERSION + "</font><br><br>"
+                         "(C) Heikki Holstila 2010<br>Donate using "
+                         "<a href=\"https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=6ZKRY5QFHL42A&lc=FI&item_name=Faster%20Application%20Manager"
+                         "%20for%20Maemo5&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donate_SM%2egif%3aNonHosted\">PayPal</a>");
+       d.exec();
+}
+
+void MainWindow::on_actionClean_triggered()
+{
+       //if( iOperation != OpNone ) return;
+       //iOperation = OpClean;
+       iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetClean);
+       iAptInterface->run(iDimmer);
+}
+
+void MainWindow::closeEvent(QCloseEvent *event)
+{
+       if( iDimmer->busy() ) {
+               iAptInterface->cancel();
+               event->ignore();
+       } else {
+               event->accept();
+       }
+}
+
+void MainWindow::on_actionView_log_triggered()
+{
+       QByteArray log = iAptInterface->readLogFile();
+       LogView l(log, this);
+       l.exec();
+}
+
+void MainWindow::on_actionOptions_triggered()
+{
+       iSettings->openWin();
+}
+
+void MainWindow::notifyDialog(QString title, QString msg)
+{
+       ConfirmDialog d(false, this);
+       d.setText(title, msg);
+       d.exec();
+}
+
+bool MainWindow::confirmDialog(QString title, QString msg)
+{
+       ConfirmDialog d(true, this);
+       d.setText(title, msg);
+       return d.exec();
+}
+
+void MainWindow::GdkEventIconThemeReload()
+{
+       // DOES NOT EVEN WORK (at least not reliably) - disabled from the project file
+
+#ifdef MYDEF_GTK_EXISTS
+       qDebug() << "Sending GDK icon theme reload event";
+
+       gdk_init((int*)QApplication::argc(),(gchar***)QApplication::argv());
+
+       // taken from hildon application manager
+       GdkEventClient ev;
+       ev.type = GDK_CLIENT_EVENT;
+       ev.window = NULL;
+       ev.send_event = TRUE;
+       ev.message_type = gdk_atom_intern_static_string("_GTK_LOAD_ICONTHEMES");
+       ev.data_format = 32;
+       gdk_event_send_clientmessage_toall((GdkEvent*)&ev);
+
+       while(gdk_events_pending()) {
+               g_main_context_iteration(NULL, true);
+       }
+
+#endif
+}
+
+void MainWindow::on_actionLoad_file_triggered()
+{
+       QStringList files = QFileDialog::getOpenFileNames(this, "Open files", "/", "Files (*.deb *.install)");
+       if( files.count() > 0 ) {
+               QStringList debs = files.filter(QRegExp(".*\\.deb$"));
+               QStringList installs = files.filter(QRegExp(".*\\.install$"));
+               if( debs.count()>0 && installs.count()>0 ) {
+                       ConfirmDialog d(false, this);
+                       d.setText("Error", "You can't mix different file types in your selection");
+                       d.exec();
+                       return;
+               }
+               if( debs.count()>0 )
+                       iDpkgInterface->loadDebFiles(debs);
+               else if( installs.count()>0 )
+                       iAptInterface->loadInstallFiles(installs);
+       }
+}
diff --git a/mainwindow.h b/mainwindow.h
new file mode 100644 (file)
index 0000000..b7dfcb7
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QtCore>
+#include <QMainWindow>
+#include <phonon/MediaObject>
+#include "aaptinterface.h"
+
+class PackageView;
+class Uninstall;
+class Dialog;
+class dimmer;
+class RepoView;
+class Settings;
+class DpkgInterface;
+
+namespace Ui {
+    class MainWindow;
+}
+
+class MainWindow : public QMainWindow
+{
+    Q_OBJECT
+#ifdef Q_WS_MAEMO_5
+       Q_CLASSINFO("D-Bus Interface", "org.maemo.faster_application_manager")
+#endif
+
+public:
+       enum nextOperation { OpNone, OpPromptSimulated, OpOpenPkgView };
+
+    explicit MainWindow(QWidget *parent = 0);
+    ~MainWindow();
+       void operationQueueFinished(QList<AAptInterface::interfaceMode> lastModes, bool success, QString title, QStringList msgs);
+       void busyDialog(bool show_, QString title="", QString text="");
+       void closeEvent(QCloseEvent *event);
+       void GdkEventIconThemeReload();
+       void notifyDialog(QString title, QString msg);
+       bool confirmDialog(QString title, QString msg);
+       void resetIdlingTime() { iIdlingSince = QDateTime::currentDateTime(); }
+       void setNextOperation(nextOperation op_) { iNextOperation=op_; }
+
+public slots:
+       void on_btnUpdate_clicked();
+#ifdef Q_WS_MAEMO_5
+       Q_SCRIPTABLE int top_application();
+#endif
+
+protected:
+    void changeEvent(QEvent *e);
+
+private:
+       void dateFetchAsk();
+
+    Ui::MainWindow *ui;
+       AAptInterface* iAptInterface;
+       DpkgInterface* iDpkgInterface;
+       PackageView* iWinPackageView;
+       RepoView* iWinRepoView;
+       Dialog* iDlgBusy;
+       Settings* iSettings;
+       //operation iOperation;
+       dimmer* iDimmer;
+       bool iReposAutoUpdating;
+       bool iUpgradeAutoUpdate;
+       nextOperation iNextOperation;
+       Phonon::MediaObject* iMediaObject;
+
+       QDateTime iIdlingSince;
+
+private slots:
+       void on_actionLoad_file_triggered();
+       void on_actionOptions_triggered();
+       void on_actionView_log_triggered();
+       void on_btnRepos_clicked();
+       void on_actionClean_triggered();
+       void on_actionAbout_triggered();
+       void on_btnUpgrade_clicked();
+       void on_btnListInstallable_clicked();
+       void on_btnListInstalled_clicked();
+};
+
+#endif // MAINWINDOW_H
diff --git a/mainwindow.ui b/mainwindow.ui
new file mode 100644 (file)
index 0000000..2b3f31a
--- /dev/null
@@ -0,0 +1,293 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>800</width>
+    <height>480</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Faster Application Manager</string>
+  </property>
+  <widget class="RotatingBackground" name="centralWidget">
+   <layout class="QHBoxLayout" name="horizontalLayout">
+    <property name="spacing">
+     <number>0</number>
+    </property>
+    <property name="margin">
+     <number>0</number>
+    </property>
+    <item>
+     <spacer name="horizontalSpacer">
+      <property name="orientation">
+       <enum>Qt::Horizontal</enum>
+      </property>
+      <property name="sizeHint" stdset="0">
+       <size>
+        <width>291</width>
+        <height>20</height>
+       </size>
+      </property>
+     </spacer>
+    </item>
+    <item>
+     <layout class="QVBoxLayout" name="verticalLayout">
+      <property name="spacing">
+       <number>0</number>
+      </property>
+      <item>
+       <spacer name="verticalSpacer_2">
+        <property name="orientation">
+         <enum>Qt::Vertical</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>245</width>
+          <height>58</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+      <item>
+       <layout class="QGridLayout" name="gridLayout">
+        <property name="spacing">
+         <number>4</number>
+        </property>
+        <item row="0" column="0">
+         <widget class="QPushButton" name="btnRepos">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>Manage
+repos</string>
+          </property>
+          <property name="icon">
+           <iconset resource="resources.qrc">
+            <normaloff>:/icons/icons/repos.png</normaloff>:/icons/icons/repos.png</iconset>
+          </property>
+          <property name="iconSize">
+           <size>
+            <width>96</width>
+            <height>96</height>
+           </size>
+          </property>
+          <property name="flat">
+           <bool>true</bool>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="1">
+         <widget class="QPushButton" name="btnUpdate">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>Update
+catalogs</string>
+          </property>
+          <property name="icon">
+           <iconset resource="resources.qrc">
+            <normaloff>:/icons/icons/update.png</normaloff>:/icons/icons/update.png</iconset>
+          </property>
+          <property name="iconSize">
+           <size>
+            <width>96</width>
+            <height>96</height>
+           </size>
+          </property>
+          <property name="flat">
+           <bool>true</bool>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="0" colspan="2">
+         <widget class="QPushButton" name="btnListInstallable">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>Install
+applications</string>
+          </property>
+          <property name="icon">
+           <iconset resource="resources.qrc">
+            <normaloff>:/icons/icons/install.png</normaloff>:/icons/icons/install.png</iconset>
+          </property>
+          <property name="iconSize">
+           <size>
+            <width>96</width>
+            <height>96</height>
+           </size>
+          </property>
+          <property name="flat">
+           <bool>true</bool>
+          </property>
+         </widget>
+        </item>
+        <item row="2" column="0" colspan="2">
+         <widget class="QPushButton" name="btnUpgrade">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>Upgrade
+applications</string>
+          </property>
+          <property name="icon">
+           <iconset resource="resources.qrc">
+            <normaloff>:/icons/icons/upgrade.png</normaloff>:/icons/icons/upgrade.png</iconset>
+          </property>
+          <property name="iconSize">
+           <size>
+            <width>96</width>
+            <height>96</height>
+           </size>
+          </property>
+          <property name="flat">
+           <bool>true</bool>
+          </property>
+         </widget>
+        </item>
+        <item row="3" column="0" colspan="2">
+         <widget class="QPushButton" name="btnListInstalled">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>Remove
+applications</string>
+          </property>
+          <property name="icon">
+           <iconset resource="resources.qrc">
+            <normaloff>:/icons/icons/remove.png</normaloff>:/icons/icons/remove.png</iconset>
+          </property>
+          <property name="iconSize">
+           <size>
+            <width>96</width>
+            <height>96</height>
+           </size>
+          </property>
+          <property name="flat">
+           <bool>true</bool>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
+      <item>
+       <spacer name="verticalSpacer">
+        <property name="orientation">
+         <enum>Qt::Vertical</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>245</width>
+          <height>57</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+     </layout>
+    </item>
+    <item>
+     <spacer name="horizontalSpacer_2">
+      <property name="orientation">
+       <enum>Qt::Horizontal</enum>
+      </property>
+      <property name="sizeHint" stdset="0">
+       <size>
+        <width>290</width>
+        <height>20</height>
+       </size>
+      </property>
+     </spacer>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QMenuBar" name="menuBar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>800</width>
+     <height>23</height>
+    </rect>
+   </property>
+   <widget class="QMenu" name="menuMenu">
+    <property name="title">
+     <string>Menu</string>
+    </property>
+    <addaction name="actionClean"/>
+    <addaction name="actionView_log"/>
+    <addaction name="actionOptions"/>
+    <addaction name="actionAbout"/>
+    <addaction name="actionLoad_file"/>
+   </widget>
+   <addaction name="menuMenu"/>
+  </widget>
+  <action name="actionAbout">
+   <property name="text">
+    <string>About</string>
+   </property>
+  </action>
+  <action name="actionClean">
+   <property name="text">
+    <string>Clean package cache</string>
+   </property>
+  </action>
+  <action name="actionView_log">
+   <property name="text">
+    <string>View log</string>
+   </property>
+  </action>
+  <action name="actionOptions">
+   <property name="enabled">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Options</string>
+   </property>
+  </action>
+  <action name="actionLoad_file">
+   <property name="enabled">
+    <bool>false</bool>
+   </property>
+   <property name="text">
+    <string>Install local files</string>
+   </property>
+  </action>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <customwidgets>
+  <customwidget>
+   <class>RotatingBackground</class>
+   <extends>QWidget</extends>
+   <header>rotatingbackground.h</header>
+   <container>1</container>
+  </customwidget>
+ </customwidgets>
+ <resources>
+  <include location="resources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/misc/fapman.desktop b/misc/fapman.desktop
new file mode 100644 (file)
index 0000000..cf5b91c
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Encoding=UTF-8
+Version=1.0
+Type=Application
+Name=Faster Application Manager
+Exec=fapman.launch
+Icon=fapman
+X-Osso-Type=application/x-executable
+X-Osso-Service=org.maemo.faster_application_manager
+Categories=System;
+
diff --git a/misc/fapman.desktop.backup b/misc/fapman.desktop.backup
new file mode 100644 (file)
index 0000000..7064e7b
--- /dev/null
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Encoding=UTF-8
+Version=1.0
+Type=Application
+Name=Faster Application Manager
+Exec=sudo /usr/bin/run-standalone.sh /usr/bin/fapman
+Icon=fapman
+X-Osso-Type=application/x-executable
+Categories=System;
+
diff --git a/misc/fapman.launch b/misc/fapman.launch
new file mode 100644 (file)
index 0000000..39d0991
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec sudo /usr/bin/run-standalone.sh /usr/bin/fapman
diff --git a/misc/fapman.service b/misc/fapman.service
new file mode 100644 (file)
index 0000000..e50a2cd
--- /dev/null
@@ -0,0 +1,3 @@
+[D-BUS Service]
+Name=org.maemo.faster_application_manager
+Exec=/usr/bin/fapman.launch
diff --git a/misc/fapman.sudoers b/misc/fapman.sudoers
new file mode 100644 (file)
index 0000000..cea4614
--- /dev/null
@@ -0,0 +1 @@
+user ALL = NOPASSWD: /usr/bin/run-standalone.sh /usr/bin/fapman
diff --git a/misc/style.css b/misc/style.css
new file mode 100644 (file)
index 0000000..496a43c
--- /dev/null
@@ -0,0 +1,14 @@
+QWidget#centralWidget > QPushButton {
+       border-radius: 16px;
+       border-width: 1px;
+       border-color: rgb(210, 210, 210);
+       border-style: outset;
+       padding-right: 5px;
+       padding-left: 5px;
+       background-color: rgba(255, 255, 255, 50);
+}
+
+QWidget#centralWidget > QPushButton:pressed {
+       border-style: inset;
+       background-color: rgba(255, 255, 255, 120);
+}
diff --git a/package.cpp b/package.cpp
new file mode 100644 (file)
index 0000000..233cb3a
--- /dev/null
@@ -0,0 +1,334 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#include <QtGui>
+#include "package.h"
+#include "repository.h"
+#include "aaptinterface.h"
+#include "apt-src/debversion.h"
+#include "blacklistselect.h"
+
+Package::Package(QByteArray name_, AAptInterface *apt_)
+{
+       iAptInterface = apt_;
+       iName = name_;
+       iIsInstalled = false;
+       iMarkedForOperation = false;
+       iSize = 0;
+       iInstalledSize = 0;
+       iMarkedOperation = PkgOpNone;
+       iPkgStatus = PkgStatUnknown;
+       iIcon = 0;
+       iBlacklist = BlacklistSelect::BlacklistNone;
+}
+
+Package::~Package()
+{
+       if( iIcon != 0 )
+               delete iIcon;
+}
+
+QString Package::displayName()
+{
+       QString pkgname = name();
+       if( iMaemoDisplayName!="" )
+               pkgname = maemoDisplayName();
+       QString n( pkgname.at(0) );
+       n = n.toUpper();
+       pkgname.replace(0,1,n);
+       return pkgname;
+}
+
+QString Package::fileName()
+{
+       if( iFullFileNames.count()>0 ) {
+               return iFullFileNames.at(0).mid( iFullFileNames.at(0).lastIndexOf('/')+1 );
+       } else {
+               qDebug() << "Warning: package has no file name information";
+               return "unknown_filename";
+       }
+}
+
+void Package::setMarkedForOperation(operation op_)
+{
+       if( iMarkedOperation != op_ ) {
+               if( op_==PkgOpNone ) {
+                       if( iAptInterface )
+                               iAptInterface->setNumSelectedPackages( iAptInterface->numSelectedPackages()-1 );
+               } else if( iMarkedOperation==PkgOpNone ) {
+                       if( iAptInterface )
+                               iAptInterface->setNumSelectedPackages( iAptInterface->numSelectedPackages()+1 );
+               }
+       }
+
+       iMarkedOperation = op_;
+
+       if( op_ == PkgOpNone )
+               iMarkedForOperation = false;
+       else
+               iMarkedForOperation = true;
+}
+
+void Package::convertIcon()
+{
+       if( iIconData.length() > 0 && iIcon == 0 ) {
+               iIcon = new QPixmap();
+               iIconData = QByteArray::fromBase64( iIconData );
+               if( !iIcon->loadFromData( iIconData ) ) {
+                       qDebug() << "Warning: Package" << iName << "has invalid icon data";
+               }
+       }
+
+}
+
+bool Package::isUpgradeable()
+{
+       if( iSection=="user/hidden" )
+               return false;
+
+       if( iIsInstalled )
+       {
+               QString newer = upgradeableVersion();
+               //qDebug() << newer << iVersion << versionCompare(newer,iVersion);
+               return versionCompare(newer,iVersion);
+       }
+
+       return false;
+}
+
+QString Package::upgradeableVersion()
+{
+       QString ver="";
+       if( isInstalled() ) {
+               Package* newer = iAptInterface->packagesAvailable()->value(iName,0);
+               if( newer )
+                       ver = newer->version();
+       }
+       return ver;
+}
+
+Package* Package::availablePackage()
+{
+       if( !isInstalled() )
+               return 0;
+
+       Package* newer = iAptInterface->packagesAvailable()->value(iName,0);
+
+       return newer;
+}
+
+void Package::updateStatus()
+{
+       if( iIsInstalled ) {
+               iPkgStatus = PkgStatInstalled;
+               if( isUpgradeable() )
+                       iPkgStatus = PkgStatUpgradeable;
+       } else {
+               iPkgStatus = PkgStatNotInstalled;
+       }
+}
+
+Package::packageStatus Package::status()
+{
+       updateStatus(); // not optimal, but it's here just in case
+       return iPkgStatus;
+}
+
+bool Package::hasIconData()
+{
+       if( iIconData.length()>0 )
+               return true;
+       else
+               return false;
+}
+
+bool Package::versionCompare(QString isNewer, QString compare)
+{
+       //int res=0;
+       int res = debVS.CmpVersion(isNewer.toStdString(), compare.toStdString());
+       //qDebug() << isNewer << compare << res;
+
+       if( res > 0 )
+               return true;
+
+       return false;
+}
+
+void Package::appendDepends(QByteArray line_)
+{
+       iDepends << line_.split(',');
+}
+
+void Package::appendConflicts(QByteArray line_)
+{
+       iConflicts << line_.split(',');
+}
+
+void Package::appendPreDepends(QByteArray line_)
+{
+       iPreDepends << line_.split(',');
+}
+
+void Package::appendProvides(QByteArray line_)
+{
+       iProvides << line_.split(',');
+}
+
+void Package::appendReplaces(QByteArray line_)
+{
+       iReplaces << line_.split(',');
+}
+
+void Package::appendBreaks(QByteArray line_)
+{
+       iBreaks << line_.split(',');
+}
+
+void Package::appendRecommends(QByteArray line_)
+{
+       iRecommends << line_.split(',');
+}
+
+void Package::appendSuggests(QByteArray line_)
+{
+       iSuggests << line_.split(',');
+}
+
+QStringList Package::dependsRichText()
+{
+       //qDebug() << iName;
+       //qDebug() << iDepends;
+
+       QStringList list;
+
+       for(int i=0; i<iDepends.count(); i++)
+       {
+               QString s = iDepends.at(i).trimmed();
+               s.replace('<',"&lt;");
+               s.replace('>',"&gt;");
+               list << s;
+       }
+
+       return list;
+}
+
+QStringList Package::conflictsRichText()
+{
+       QStringList list;
+
+       for(int i=0; i<iConflicts.count(); i++)
+       {
+               QString s = iConflicts.at(i).trimmed();
+               s.replace('<',"&lt;");
+               s.replace('>',"&gt;");
+               list << s;
+       }
+
+       return list;
+}
+
+QStringList Package::preDependsRichText()
+{
+       QStringList list;
+
+       for(int i=0; i<iPreDepends.count(); i++)
+       {
+               QString s = iPreDepends.at(i).trimmed();
+               s.replace('<',"&lt;");
+               s.replace('>',"&gt;");
+               list << s;
+       }
+
+       return list;
+}
+
+QStringList Package::providesRichText()
+{
+       QStringList list;
+
+       for(int i=0; i<iProvides.count(); i++)
+       {
+               QString s = iProvides.at(i).trimmed();
+               s.replace('<',"&lt;");
+               s.replace('>',"&gt;");
+               list << s;
+       }
+
+       return list;
+}
+
+QStringList Package::replacesRichText()
+{
+       QStringList list;
+
+       for(int i=0; i<iReplaces.count(); i++)
+       {
+               QString s = iReplaces.at(i).trimmed();
+               s.replace('<',"&lt;");
+               s.replace('>',"&gt;");
+               list << s;
+       }
+
+       return list;
+}
+
+QStringList Package::breaksRichText()
+{
+       QStringList list;
+
+       for(int i=0; i<iBreaks.count(); i++)
+       {
+               QString s = iBreaks.at(i).trimmed();
+               s.replace('<',"&lt;");
+               s.replace('>',"&gt;");
+               list << s;
+       }
+
+       return list;
+}
+
+QStringList Package::recommendsRichText()
+{
+       QStringList list;
+
+       for(int i=0; i<iRecommends.count(); i++)
+       {
+               QString s = iRecommends.at(i).trimmed();
+               s.replace('<',"&lt;");
+               s.replace('>',"&gt;");
+               list << s;
+       }
+
+       return list;
+}
+
+QStringList Package::suggestsRichText()
+{
+       QStringList list;
+
+       for(int i=0; i<iSuggests.count(); i++)
+       {
+               QString s = iSuggests.at(i).trimmed();
+               s.replace('<',"&lt;");
+               s.replace('>',"&gt;");
+               list << s;
+       }
+
+       return list;
+}
diff --git a/package.h b/package.h
new file mode 100644 (file)
index 0000000..cc721fb
--- /dev/null
+++ b/package.h
@@ -0,0 +1,137 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#ifndef PACKAGE_H
+#define PACKAGE_H
+
+#include <QtCore>
+#include "blacklistselect.h"
+
+class AAptInterface;
+class Repository;
+
+class Package
+{
+public:
+       enum operation { PkgOpNone, PkgOpInstallUpgrade, PkgOpRemove };
+
+       // the order must match status filter strings
+       enum packageStatus { PkgStatUnknown, PkgStatNotInstalled, PkgStatUpgradeable, PkgStatInstalled };
+
+       Package(QByteArray name_, AAptInterface* apt_);
+       ~Package();
+       void setName(QByteArray n_) { iName=n_; }
+       void setMaemoDisplayName(QByteArray n_) { iMaemoDisplayName=n_; }
+       void setInstalled(bool i_) { iIsInstalled=i_; }
+       void setMarkedForOperation(operation op_);
+       void setVersion(QByteArray v_) { iVersion=v_; }
+       void setDescShort(QByteArray d_) { iDescriptionShort=d_; }
+       void appendDescLong(QByteArray d_) { iDescriptionLong.append(d_); }
+       void setSection(QByteArray s_) { iSection=s_; }
+       void setSize(int i_) { iSize=i_; }
+       void setInstalledSize(int i_) { iInstalledSize=i_; }
+       void appendIconData(QByteArray d_) { iIconData.append(d_); }
+       void addFullFileName(QString f_) { iFullFileNames.append(f_); }
+       void updateStatus();
+       void addRepository(Repository* r_) { iRepositories.append(r_); }
+       void setDate(QDateTime d_) { iDate=d_; }
+       void setBlacklisted(BlacklistSelect::blackList bl_) { iBlacklist=bl_; }
+       void appendDepends(QByteArray line_);
+       void appendConflicts(QByteArray line_);
+       void appendPreDepends(QByteArray line_);
+       void appendProvides(QByteArray line_);
+       void appendReplaces(QByteArray line_);
+       void appendBreaks(QByteArray line_);
+       void appendRecommends(QByteArray line_);
+       void appendSuggests(QByteArray line_);
+       void appendUpgradeDescription(QByteArray d_) { iUpgradeDescription.append(d_); }
+
+       void convertIcon();
+
+       QString name() { return iName; }
+       QString maemoDisplayName() { return QString::fromUtf8(iMaemoDisplayName); }
+       QString displayName();
+       bool isInstalled() { return iIsInstalled; }
+       bool isMarkedForOperation() { return iMarkedForOperation; }
+       operation markedOperation() { return iMarkedOperation; }
+       QString version() { return iVersion; }
+       QString descShort() { return QString::fromUtf8(iDescriptionShort); }
+       QString descLong() { return QString::fromUtf8(iDescriptionLong); }
+       QString section() { return iSection; }
+       int size() { return iSize; }
+       int installedSize() { return iInstalledSize; }
+       QPixmap* icon() { return iIcon; }
+       bool hasIconData();
+       bool isUpgradeable();
+       QString upgradeableVersion();
+       Package* availablePackage();
+       packageStatus status();
+       QString fileName();
+       QStringList fullFileNames() { return iFullFileNames; }
+       QDateTime date() { return iDate; }
+       QList<Repository*> repositories() { return iRepositories; }
+       BlacklistSelect::blackList blacklisted() { return iBlacklist; }
+       bool isBlacklisted() { if(iBlacklist==BlacklistSelect::BlacklistNone) return false; else return true; }
+       QStringList dependsRichText();
+       QStringList conflictsRichText();
+       QStringList preDependsRichText();
+       QStringList providesRichText();
+       QStringList replacesRichText();
+       QStringList breaksRichText();
+       QStringList recommendsRichText();
+       QStringList suggestsRichText();
+       QString upgradeDescription() { return QString::fromUtf8(iUpgradeDescription); }
+
+       static bool versionCompare(QString isNewer, QString compare);
+
+private:
+       AAptInterface* iAptInterface;
+
+       QByteArray iName;
+       QByteArray iMaemoDisplayName;
+       bool iIsInstalled;
+       bool iMarkedForOperation;
+       packageStatus iPkgStatus;
+       QByteArray iVersion;
+       QByteArray iDescriptionShort;
+       QByteArray iDescriptionLong;
+       QByteArray iSection;
+       int iSize;
+       int iInstalledSize;
+       operation iMarkedOperation;
+       QStringList iFullFileNames;
+       QDateTime iDate;
+       QList<Repository*> iRepositories;
+       BlacklistSelect::blackList iBlacklist;
+       QByteArray iUpgradeDescription;
+
+       QByteArray iIconData;
+       QPixmap* iIcon;
+
+       QList<QByteArray> iDepends;
+       QList<QByteArray> iConflicts;
+       QList<QByteArray> iPreDepends;
+       QList<QByteArray> iProvides;
+       QList<QByteArray> iReplaces;
+       QList<QByteArray> iBreaks;
+       QList<QByteArray> iRecommends;
+       QList<QByteArray> iSuggests;
+};
+
+#endif // PACKAGE_H
diff --git a/packageselector.cpp b/packageselector.cpp
new file mode 100644 (file)
index 0000000..a8561ed
--- /dev/null
@@ -0,0 +1,588 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#include <QtNetwork>
+#include <QDBusConnection>
+#include <QDBusInterface>
+
+#include "packageselector.h"
+#include "ui_packageselector.h"
+#include "package.h"
+#include "packageview.h"
+#include "repository.h"
+#include "blacklistselect.h"
+#include "aaptinterface.h"
+
+PackageSelector::PackageSelector(Package* pkg, AAptInterface* apt, QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::PackageSelector)
+{
+    ui->setupUi(this); 
+       iPkg = pkg;
+       iAptInterface = apt;
+       iNetworkAccessManager = 0;
+       iChangelogFetched = false;
+       iChangelog = "";
+
+       ui->pushButton_website->setIcon(QPixmap("/usr/share/icons/hicolor/48x48/hildon/general_web.png"));
+       if( getMaemoOrgUrl(pkg)=="" && getMaemoOrgUrl(pkg->availablePackage())=="" ) {
+               ui->pushButton_website->setEnabled(false);
+       }
+       if( pkg->isMarkedForOperation() )
+               ui->pushButton_blacklist->setEnabled(false);
+
+       if( pkg->icon() && !pkg->icon()->isNull() ) {
+               ui->label_appicon->setPixmap( *pkg->icon() );
+       } else {
+               ui->label_appicon->setPixmap( QPixmap(":/icons/icons/appdefault.png") );
+       }
+       this->setWindowTitle( pkg->name() );
+
+       if( pkg->maemoDisplayName() != "" )
+               ui->label_header->setText("<b>" + pkg->maemoDisplayName() + "</b>");
+       else
+               ui->label_header->setText("<b>" + pkg->name() + "</b>");
+
+       ui->radioTabBasic->setChecked(true);
+       updateInfo();
+
+       // switch to shorter button labels for portait mode
+       if( QApplication::desktop()->width() < QApplication::desktop()->height() )
+       {
+               ui->radioTabBasic->setText("Info");
+               ui->radioTabChanges->setText("Chgs");
+               ui->radioTabDepends->setText("Deps");
+       }
+
+       Package* upg_pkg = iPkg->availablePackage();
+       if( !upg_pkg )
+               upg_pkg = iPkg;
+       if( (!pkg->isUpgradeable() || (upg_pkg && upg_pkg->upgradeDescription()=="")) && (getMaemoOrgUrl(upg_pkg)=="") )
+               ui->radioTabChanges->hide();
+
+       if( pkg->isUpgradeable() )
+               ui->radioInstall->setText("Upgrade");
+       else
+               ui->radioInstall->setText("Install");
+
+       if( pkg->markedOperation() == Package::PkgOpNone )
+       {
+               if( pkg->isInstalled() && pkg->isUpgradeable() )
+                       ui->label_statusicon->setPixmap(QPixmap(":/icons/icons/pkg_nop_instupgr.png"));
+               else if( pkg->isInstalled() )
+                       ui->label_statusicon->setPixmap(QPixmap(":/icons/icons/pkg_nop_installed.png"));
+               else if( !pkg->isInstalled() )
+                       ui->label_statusicon->setPixmap(QPixmap(":/icons/icons/pkg_nop_notinstalled.png"));
+
+               ui->radioNothing->setChecked(true);
+       } else if( pkg->markedOperation() == Package::PkgOpInstallUpgrade ) {
+               if( pkg->isUpgradeable() )
+                       ui->label_statusicon->setPixmap(QPixmap(":/icons/icons/pkg_upgrade.png"));
+               else
+                       ui->label_statusicon->setPixmap(QPixmap(":/icons/icons/pkg_install.png"));
+               ui->radioInstall->setChecked(true);
+       } else if( pkg->markedOperation() == Package::PkgOpRemove ) {
+               ui->label_statusicon->setPixmap(QPixmap(":/icons/icons/pkg_remove.png"));
+               ui->radioRemove->setChecked(true);
+       }
+}
+
+PackageSelector::~PackageSelector()
+{
+       delete iNetworkAccessManager;
+       iNetworkAccessManager = 0;
+    delete ui;
+}
+
+void PackageSelector::changeEvent(QEvent *e)
+{
+    QDialog::changeEvent(e);
+    switch (e->type()) {
+    case QEvent::LanguageChange:
+        ui->retranslateUi(this);
+        break;
+    default:
+        break;
+    }
+}
+
+Package::operation PackageSelector::selectedOperation()
+{
+       if( ui->radioInstall->isChecked() )
+               return Package::PkgOpInstallUpgrade;
+       if( ui->radioRemove->isChecked() )
+               return Package::PkgOpRemove;
+
+       return Package::PkgOpNone;
+}
+
+void PackageSelector::on_pushButton_blacklist_clicked()
+{
+       Package* pkg = iPkg;
+       /*if( iPkg->isUpgradeable() && iPkg->availablePackage() )
+               pkg = iPkg->availablePackage();*/
+
+       if( pkg->isInstalled() && pkg->isUpgradeable() )
+       {
+               Package* upg = pkg->availablePackage();
+               if( upg )
+                       pkg = upg;
+       }
+
+       BlacklistSelect s(pkg, this);
+       BlacklistSelect::blackList old = pkg->blacklisted();
+       if( s.exec() ) {                
+               if( old != pkg->blacklisted() ) {
+                       Package* p1 = iAptInterface->packagesInstalled()->value(pkg->name(),0);
+                       Package* p2 = iAptInterface->packagesAvailable()->value(pkg->name(),0);
+                       if( p1 ) {
+                               iAptInterface->removeFromBlacklist(p1,old);
+                               if( pkg->blacklisted()==BlacklistSelect::BlacklistAll || pkg->blacklisted()==BlacklistSelect::BlacklistNone )
+                                       p1->setBlacklisted( pkg->blacklisted() );
+                               else if( pkg->blacklisted()==BlacklistSelect::BlacklistThis && pkg->version()==p1->version() )
+                                       p1->setBlacklisted( pkg->blacklisted() );
+                               else
+                                       p1->setBlacklisted( BlacklistSelect::BlacklistNone );
+                       }
+                       if( p2 ) {
+                               iAptInterface->removeFromBlacklist(p2,old);
+                               if( pkg->blacklisted()==BlacklistSelect::BlacklistAll || pkg->blacklisted()==BlacklistSelect::BlacklistNone )
+                                       p2->setBlacklisted( pkg->blacklisted() );
+                               else if( pkg->blacklisted()==BlacklistSelect::BlacklistThis && pkg->version()==p2->version() )
+                                       p2->setBlacklisted( pkg->blacklisted() );
+                               else
+                                       p2->setBlacklisted( BlacklistSelect::BlacklistNone );
+                       }
+                       iAptInterface->writeBlacklist();
+               }
+               updateInfo();
+       }
+}
+
+QString PackageSelector::getMaemoOrgUrl(Package* pkg)
+{
+       QString url = "";
+
+       if( !pkg )
+               return url;
+
+       if( pkg->repositories().count() == 0 )
+               return url;
+
+       for( int i=0; i<pkg->repositories().count(); i++ )
+       {
+               if( pkg->repositories().at(i) && pkg->repositories().at(i)->url().startsWith("http://repository.maemo.org") )
+                       url = "http://maemo.org/packages/view/" + pkg->name() + "/";
+       }
+       return url;
+}
+
+void PackageSelector::updateInfo()
+{
+       if( ui->radioTabBasic->isChecked() )
+               on_radioTabBasic_clicked();
+       else if( ui->radioTabChanges->isChecked() )
+               on_radioTabChanges_clicked();
+       else if( ui->radioTabDepends->isChecked() )
+               on_radioTabDepends_clicked();
+
+       ui->radioInstall->setEnabled(true);
+       ui->radioRemove->setEnabled(true);
+       ui->radioInstall->show();
+       ui->radioRemove->show();
+
+       Package* upg_pkg = iPkg->availablePackage();
+
+       if( iPkg->isInstalled() && !iPkg->isUpgradeable() )
+       {
+               ui->radioInstall->setEnabled(false);
+               ui->radioInstall->hide();
+       } else if( !iPkg->isInstalled() ) {
+               ui->radioRemove->setEnabled(false);
+               ui->radioRemove->hide();
+       }
+
+       if( iPkg->isBlacklisted() ) {
+               ui->radioInstall->setEnabled(false);
+               //ui->radioRemove->setEnabled(false);
+       }
+       if( iPkg->isInstalled() && upg_pkg && upg_pkg->isBlacklisted() ) {
+               ui->radioInstall->setEnabled(false);
+       }
+}
+
+void PackageSelector::on_pushButton_website_clicked()
+{
+       QString url = getMaemoOrgUrl(iPkg);
+       if( url == "" ) {
+               url = getMaemoOrgUrl(iPkg->availablePackage());
+               if( url == "")
+                       return;
+       }
+
+       QDBusConnection conn = QDBusConnection::connectToBus(QDBusConnection::SessionBus, "faster_application_manager");
+
+       QString service = "com.nokia.osso_browser";
+       QString path = "/com/nokia/osso_browser/request";
+       QString method = "open_new_window";
+
+       QDBusInterface browser(service, path, service, conn, this);
+       browser.call(method, url);
+}
+
+void PackageSelector::on_radioTabBasic_clicked()
+{
+       ui->label_header2->show();
+       QString header2;
+
+       Package* upg_pkg = iPkg->availablePackage();
+
+       if( iPkg->isInstalled() ) {
+               header2 += "Installed, version <b>" + iPkg->version() + "</b>";
+       } else {
+               header2 += "Not installed";
+       }
+       header2 += "<br>";
+
+       if( iPkg->markedOperation() == Package::PkgOpInstallUpgrade )
+       {
+               if( iPkg->isUpgradeable() )
+                       header2 += "Marked for <b>upgrade</b><br>";
+               else
+                       header2 += "Marked for <b>installation</b><br>";
+       } else if(iPkg->markedOperation() == Package::PkgOpRemove)
+       {
+               header2 += "Marked for <b>removal</b><br>";
+       }
+
+       if( iPkg->isBlacklisted() && !iPkg->isUpgradeable() ) {
+               header2 += "BLACKLISTED";
+               if( iPkg->blacklisted() == BlacklistSelect::BlacklistAll )
+                       header2 += " (all)";
+               else if( iPkg->blacklisted() == BlacklistSelect::BlacklistThis )
+                       header2 += " (this)";
+               iPkg->setMarkedForOperation(Package::PkgOpNone);
+               header2 += "<br>";
+       } else if( upg_pkg && upg_pkg->isBlacklisted() ) {
+               header2 += "BLACKLISTED";
+               if( upg_pkg->blacklisted() == BlacklistSelect::BlacklistAll )
+                       header2 += " (all)";
+               else if( upg_pkg->blacklisted() == BlacklistSelect::BlacklistThis )
+                       header2 += " (" + upg_pkg->version() + ")";
+               iPkg->setMarkedForOperation(Package::PkgOpNone);
+               upg_pkg->setMarkedForOperation(Package::PkgOpNone);
+               header2 += "<br>";
+       }
+
+       ui->label_header2->setText(header2);
+
+
+       QString longtext;
+       longtext += "Category: " + iPkg->section() + "<br>";
+
+       if( iPkg->isInstalled() ) {
+               longtext += "Installation date: ";
+               if( iPkg->date().isValid() )
+                       longtext += iPkg->date().toString("yyyy-MM-dd hh:mm");
+               else
+                       longtext += "Unknown";
+               longtext += "<br>";
+       }
+
+       if( iPkg->isInstalled() && iPkg->installedSize() > 0 )
+               longtext += QString("Size: %L1 kB<br>").arg(iPkg->installedSize() );
+
+
+       if( !iPkg->isInstalled() ){
+               longtext += "Available version <b>" + iPkg->version() + "</b>";
+               if( iPkg->size() > 0 )
+                       longtext += QString(" (%L1 kB)").arg(iPkg->size()/1024 );
+               longtext += "<br>";
+       }
+       else if( iPkg->isUpgradeable() ){
+               longtext += "Available version <b>" + iPkg->upgradeableVersion() + "</b>";
+               if( iPkg->size() > 0 )
+                       longtext += QString(" (%L1 kB)").arg(iPkg->size()/1024 );
+               longtext += "<br>";
+       }
+
+       if( !iPkg->isInstalled() ) {
+               longtext += "Available package date: ";
+               if( iPkg->date().isValid() )
+                       longtext += iPkg->date().toString("yyyy-MM-dd hh:mm");
+               else
+                       longtext += "Unknown";
+               longtext += "<br>";
+       } else if( iPkg->isUpgradeable() ) {
+               longtext += "Available package date: ";
+               if( iPkg->availablePackage() && iPkg->availablePackage()->date().isValid() )
+                       longtext += iPkg->availablePackage()->date().toString("yyyy-MM-dd hh:mm");
+               else
+                       longtext += "Unknown";
+               longtext += "<br>";
+       }
+
+       if( !iPkg->isInstalled() )
+       {
+               longtext += "Repositories: ";
+               if( iPkg->repositories().count()>0 ) {
+                       for(int i=0; i<iPkg->repositories().count(); i++ ) {
+                               if( iPkg->repositories().at(i) )
+                                       longtext += iPkg->repositories().at(i)->name();
+                               else
+                                       longtext += "unknown";
+                               if( i<iPkg->repositories().count()-1 )
+                                       longtext += ", ";
+                       }
+                       longtext += "<br>";
+               } else {
+                       longtext += "unknown<br>";
+               }
+       }
+
+       if( iPkg->isUpgradeable() )
+       {
+               longtext += "Repositories: ";
+               if( upg_pkg && upg_pkg->repositories().count()>0 ) {
+                       for(int i=0; i<upg_pkg->repositories().count(); i++ ) {
+                               if( upg_pkg->repositories().at(i) )
+                                       longtext += upg_pkg->repositories().at(i)->name();
+                               else
+                                       longtext += "unknown";
+                               if( i<upg_pkg->repositories().count()-1 )
+                                       longtext += ", ";
+                       }
+                       longtext += "<br>";
+               } else {
+                       longtext += "unknown<br>";
+               }
+       }
+
+       longtext += "<br>" + iPkg->descShort();
+       QString descLong = iPkg->descLong();
+       if( descLong.length()>0 ) {
+               descLong.replace('\n',"<br>");
+               longtext += "<font size=\"-1\"><br><br>" + descLong + "</font>";
+       }
+
+       ui->label_text->setText( longtext );
+}
+
+void PackageSelector::on_radioTabChanges_clicked()
+{
+       ui->label_header2->hide();
+       ui->label_header2->setText("");
+
+       QString text;
+
+       Package* upg_pkg = iPkg->availablePackage();
+       if( !upg_pkg )
+               upg_pkg = iPkg;
+
+       if( iPkg->isUpgradeable() && upg_pkg && upg_pkg->upgradeDescription()!="" )
+       {
+               text += "<u><b>Upgrade description:</b></u>";
+               text += "<font size=\"-1\"><br>";
+               text += upg_pkg->upgradeDescription();
+               text += "</font><br>";
+               text.replace('\n',"<br>");
+       }
+
+       QString changelog;
+       if( getMaemoOrgUrl(upg_pkg)!="" && !iChangelogFetched ) {
+               queryChangelog();
+               changelog = "Fetching changelog...";
+       } else {
+               changelog = iChangelog;
+               if( changelog == "" )
+                       changelog = "Not available";
+       }
+
+       text += "<u><b>Debian changelog:</b></u><font size=\"-1\"><br>";
+       text += changelog;
+       text += "</font>";
+
+       ui->label_text->setText(text);
+}
+
+void PackageSelector::on_radioTabDepends_clicked()
+{
+       ui->label_header2->hide();
+       ui->label_header2->setText("");
+       ui->label_text->setText("");
+
+       QStringList deps = iPkg->dependsRichText();
+       QStringList confl = iPkg->conflictsRichText();
+       QStringList predeps = iPkg->preDependsRichText();
+       QStringList repl = iPkg->replacesRichText();
+       QStringList prov = iPkg->providesRichText();
+       QStringList brks = iPkg->breaksRichText();
+       QStringList recs = iPkg->recommendsRichText();
+       QStringList sugs = iPkg->suggestsRichText();
+
+       QString text;
+
+       if( deps.count()>0 )
+       {
+               text += "<b><u>Depends:</u></b><br><font size=\"-1\">";
+               text += deps.join(", ");
+               text += "</font><br>";
+       }
+
+       if( predeps.count()>0 )
+       {
+               text += "<b><u>Pre-Depends:</u></b><br><font size=\"-1\">";
+               text += predeps.join(", ");
+               text += "</font><br>";
+       }
+
+       if( confl.count()>0 )
+       {
+               text += "<b><u>Conflicts:</u></b><br><font size=\"-1\">";
+               text += confl.join(", ");
+               text += "</font><br>";
+       }
+
+       if( prov.count()>0 )
+       {
+               text += "<b><u>Provides:</u></b><br><font size=\"-1\">";
+               text += prov.join(", ");
+               text += "</font><br>";
+       }
+
+       if( repl.count()>0 )
+       {
+               text += "<b><u>Replaces:</u></b><br><font size=\"-1\">";
+               text += repl.join(", ");
+               text += "</font><br>";
+       }
+
+       if( brks.count()>0 )
+       {
+               text += "<b><u>Breaks:</u></b><br><font size=\"-1\">";
+               text += brks.join(", ");
+               text += "</font><br>";
+       }
+
+       if( recs.count()>0 )
+       {
+               text += "<b><u>Recommends:</u></b><br><font size=\"-1\">";
+               text += recs.join(", ");
+               text += "</font><br>";
+       }
+
+       if( sugs.count()>0 )
+       {
+               text += "<b><u>Suggests:</u></b><br><font size=\"-1\">";
+               text += sugs.join(", ");
+               text += "</font><br>";
+       }
+
+       if( deps.count()==0 && predeps.count()==0 && confl.count()==0 && prov.count()==0 &&
+               repl.count()==0 && brks.count()==0 && recs.count()==0 && sugs.count()==0 )
+       {
+               text = "Package has no dependencies listed";
+       }
+
+       ui->label_text->setText(text);
+}
+
+void PackageSelector::queryChangelog()
+{
+       if( iChangelogFetched )
+               return;
+
+       iChangelogFetched = false;
+       iChangelog = "";
+
+       Package* pkg = iPkg->availablePackage();
+       if( !pkg )
+               pkg = iPkg;
+
+       if( getMaemoOrgUrl(pkg) == "" ) {
+               iChangelogFetched = true;
+               return;
+       }
+
+       if( !iNetworkAccessManager ) {
+               iNetworkAccessManager = new QNetworkAccessManager(this);
+               connect(iNetworkAccessManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(changelogFetchNetworkReply(QNetworkReply*)));
+       }
+
+       QUrl url( getMaemoOrgUrl(pkg) );
+       QNetworkRequest req(url);
+
+       qDebug() << "fetching changelog";
+
+       iNetworkAccessManager->get(req);
+}
+
+void PackageSelector::changelogFetchNetworkReply(QNetworkReply* reply)
+{
+       if( reply->error() == QNetworkReply::NoError ) {
+               QByteArray data = reply->readAll();
+
+               int pos = data.indexOf("<div class=\"changelog\">");
+               int pos2 = data.indexOf("</div>", pos);
+
+               if( pos!=-1 && pos2!=-1 ) {
+                       iChangelog = parseChangeTable( data.mid(pos,pos2-pos+6) );
+               } else {
+                       iChangelog = "";
+               }
+
+               iChangelogFetched = true;
+               qDebug() << "changelog fetched";
+       } else {
+               qDebug() << "changelog fetch error:" << reply->error() << reply->errorString();
+       }
+
+       reply->deleteLater();
+
+       if( this->isVisible() && ui->radioTabChanges->isChecked() )
+               on_radioTabChanges_clicked();
+}
+
+QString PackageSelector::parseChangeTable(QString tabledata)
+{
+       tabledata.remove("<strong>");
+       tabledata.remove("</strong>");
+       tabledata.remove('\n');
+
+       //qDebug() << tabledata;
+
+       QString newdata = "<table><tbody>";
+
+       int pos = tabledata.indexOf("<tr>", tabledata.indexOf("<tbody>") );
+       while( pos != -1 ) {
+               int pos2 = tabledata.indexOf("</td>",pos);
+               pos2 = tabledata.indexOf("</td>",pos2+5);
+
+               if( pos2 != -1 )
+                       newdata += tabledata.mid(pos, pos2-pos+5) + "</tr>";
+
+               pos = tabledata.indexOf("<tr>",pos+4);
+       }
+
+       newdata += "</tbody></table>";
+
+       //qDebug() << newdata;
+
+       return newdata;
+}
diff --git a/packageselector.h b/packageselector.h
new file mode 100644 (file)
index 0000000..775b327
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#ifndef PACKAGESELECTOR_H
+#define PACKAGESELECTOR_H
+
+#include <QDialog>
+#include <QtNetwork>
+#include "package.h"
+
+namespace Ui {
+    class PackageSelector;
+}
+
+class AAptInterface;
+
+class PackageSelector : public QDialog
+{
+    Q_OBJECT
+
+public:
+       explicit PackageSelector(Package* pkg, AAptInterface* apt, QWidget *parent);
+    ~PackageSelector();
+
+#ifdef Q_WS_MAEMO_5            // workaround for buggy Qt autorotation
+       int exec() {
+               QRect r = dynamic_cast<QWidget*>(this->parent())->rect();
+               if(r.width() < r.height())
+                       this->setAttribute(Qt::WA_Maemo5PortraitOrientation);
+               int e = QDialog::exec();
+               this->setAttribute(Qt::WA_Maemo5AutoOrientation);
+               return e;
+       }
+#endif
+
+       Package::operation selectedOperation();
+
+protected:
+    void changeEvent(QEvent *e);
+
+private:
+       QString getMaemoOrgUrl(Package* pkg);
+       void updateInfo();
+       void queryChangelog();
+       QString parseChangeTable(QString tabledata);
+
+    Ui::PackageSelector *ui;
+       Package* iPkg;
+       AAptInterface* iAptInterface;
+       QNetworkAccessManager* iNetworkAccessManager;
+       bool iChangelogFetched;
+       QString iChangelog;
+
+private slots:
+       void on_radioTabDepends_clicked();
+       void on_radioTabChanges_clicked();
+       void on_radioTabBasic_clicked();
+       void on_pushButton_website_clicked();
+       void on_pushButton_blacklist_clicked();
+
+       void changelogFetchNetworkReply(QNetworkReply* reply);
+};
+
+#endif // PACKAGESELECTOR_H
diff --git a/packageselector.ui b/packageselector.ui
new file mode 100644 (file)
index 0000000..17c7dcd
--- /dev/null
@@ -0,0 +1,331 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PackageSelector</class>
+ <widget class="QDialog" name="PackageSelector">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>700</width>
+    <height>700</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Package</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>2</number>
+   </property>
+   <property name="margin">
+    <number>2</number>
+   </property>
+   <item>
+    <widget class="QScrollArea" name="scrollArea">
+     <property name="widgetResizable">
+      <bool>true</bool>
+     </property>
+     <widget class="QWidget" name="scrollAreaWidgetContents">
+      <property name="geometry">
+       <rect>
+        <x>0</x>
+        <y>0</y>
+        <width>694</width>
+        <height>670</height>
+       </rect>
+      </property>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <property name="spacing">
+        <number>0</number>
+       </property>
+       <property name="margin">
+        <number>2</number>
+       </property>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <property name="spacing">
+          <number>2</number>
+         </property>
+         <item>
+          <widget class="QLabel" name="label_appicon">
+           <property name="text">
+            <string/>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignCenter</set>
+           </property>
+           <property name="margin">
+            <number>2</number>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLabel" name="label_header">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string/>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLabel" name="label_statusicon">
+           <property name="text">
+            <string/>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignCenter</set>
+           </property>
+           <property name="margin">
+            <number>4</number>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_3">
+         <property name="spacing">
+          <number>1</number>
+         </property>
+         <item>
+          <widget class="QRadioButton" name="radioTabBasic">
+           <property name="text">
+            <string>Basic info</string>
+           </property>
+           <attribute name="buttonGroup">
+            <string>buttonGroup_2</string>
+           </attribute>
+          </widget>
+         </item>
+         <item>
+          <widget class="QRadioButton" name="radioTabChanges">
+           <property name="text">
+            <string>Changes</string>
+           </property>
+           <attribute name="buttonGroup">
+            <string>buttonGroup_2</string>
+           </attribute>
+          </widget>
+         </item>
+         <item>
+          <widget class="QRadioButton" name="radioTabDepends">
+           <property name="text">
+            <string>Dependencies</string>
+           </property>
+           <attribute name="buttonGroup">
+            <string>buttonGroup_2</string>
+           </attribute>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_3">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QPushButton" name="pushButton_website">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string/>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="pushButton_blacklist">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string/>
+           </property>
+           <property name="icon">
+            <iconset resource="resources.qrc">
+             <normaloff>:/icons/icons/blacklist.png</normaloff>:/icons/icons/blacklist.png</iconset>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <widget class="QLabel" name="label_header2">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="text">
+          <string/>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLabel" name="label_text">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="text">
+          <string/>
+         </property>
+         <property name="alignment">
+          <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+         </property>
+         <property name="wordWrap">
+          <bool>true</bool>
+         </property>
+         <property name="openExternalLinks">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <property name="spacing">
+      <number>0</number>
+     </property>
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QRadioButton" name="radioNothing">
+       <property name="text">
+        <string>No operation</string>
+       </property>
+       <attribute name="buttonGroup">
+        <string>buttonGroup</string>
+       </attribute>
+      </widget>
+     </item>
+     <item>
+      <widget class="QRadioButton" name="radioRemove">
+       <property name="text">
+        <string>Remove</string>
+       </property>
+       <attribute name="buttonGroup">
+        <string>buttonGroup</string>
+       </attribute>
+      </widget>
+     </item>
+     <item>
+      <widget class="QRadioButton" name="radioInstall">
+       <property name="text">
+        <string>Install/upgrade</string>
+       </property>
+       <attribute name="buttonGroup">
+        <string>buttonGroup</string>
+       </attribute>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer_2">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="resources.qrc"/>
+ </resources>
+ <connections>
+  <connection>
+   <sender>radioInstall</sender>
+   <signal>clicked()</signal>
+   <receiver>PackageSelector</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>208</x>
+     <y>354</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>300</x>
+     <y>187</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>radioRemove</sender>
+   <signal>clicked()</signal>
+   <receiver>PackageSelector</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>313</x>
+     <y>354</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>300</x>
+     <y>187</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>radioNothing</sender>
+   <signal>clicked()</signal>
+   <receiver>PackageSelector</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>406</x>
+     <y>354</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>300</x>
+     <y>187</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+ <buttongroups>
+  <buttongroup name="buttonGroup_2"/>
+  <buttongroup name="buttonGroup"/>
+ </buttongroups>
+</ui>
diff --git a/packageview.cpp b/packageview.cpp
new file mode 100644 (file)
index 0000000..c0fe01b
--- /dev/null
@@ -0,0 +1,1155 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#include "packageview.h"
+#include "ui_packageview.h"
+#include "package.h"
+#include "filterselect.h"
+#include "confirmdialog.h"
+#include "dimmer.h"
+#include "packageselector.h"
+#include "help.h"
+#include "aaptinterface.h"
+#include "logview.h"
+#include "sortselector.h"
+#include "settings.h"
+#include "searchoptions.h"
+#include "blacklistselect.h"
+
+PackageListWidgetItem::PackageListWidgetItem(Package* p_, QString name_) : QListWidgetItem(name_)
+{
+       iPackage = p_;
+}
+
+
+void ListItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
+{
+       //QTime t;
+       //t.start();
+
+       QString name = index.data(UserRoleName).toString();
+       QString version = index.data(UserRoleVersion).toString();
+       QString desc = index.data(UserRoleDescShort).toString();
+       Package::operation marked = (Package::operation) index.data(UserRoleMarked).toInt();
+       bool installed = index.data(UserRoleInstalled).toBool();
+       bool upgradeable = index.data(UserRoleUpgradeable).toBool();
+       int statfilter = index.data(UserRoleCurrentStatFilter).toInt();
+       int catfilter = index.data(UserRoleCurrentCatFilter).toInt();
+       QString upg_version = index.data(UserRoleAvailVersion).toString();
+       BlacklistSelect::blackList blacklisted = (BlacklistSelect::blackList) index.data(UserRoleBlacklisted).toInt();
+
+       painter->save();
+       QRect r = option.rect;
+
+       QLinearGradient gradientBase(r.topLeft(), r.bottomLeft());
+       QColor base = option.palette.color(QPalette::Window);
+       QColor base2 = base;
+       int r1=base.red()+15;
+       int g1=base.green()+15;
+       int b1=base.blue()+15;
+       if( r1>255 ) r1=255;
+       if( g1>255 ) g1=255;
+       if( b1>255 ) b1=255;
+       int r2=base2.red()-20;
+       int g2=base2.green()-20;
+       int b2=base2.blue()-20;
+       if( r2<0 ) r2=0;
+       if( g2<0 ) g2=0;
+       if( b2<0 ) b2=0;
+       base.setRgb( r1, g1, b1 );
+       base2.setRgb( r2, g2, b2 );
+       gradientBase.setColorAt(0, base);
+       gradientBase.setColorAt(1, base2);
+
+       painter->fillRect(r, gradientBase);
+       painter->drawLine(QPoint(r.left(),r.bottom()), QPoint(r.right(),r.bottom()));
+
+       QPixmap icon = index.data(Qt::DecorationRole).value<QPixmap>();
+       if( icon.isNull() ) {
+               // use default icon
+               painter->drawPixmap( r.left(), r.top()+4, 48, 48, iDefaultIcon );
+       } else {
+               painter->drawPixmap( r.left(), r.top()+4, 48, 48, icon );
+       }
+
+       QPixmap statusicon;
+       if( marked == Package::PkgOpNone )
+       {
+               if( installed && upgradeable )
+                       statusicon = iIconPkgNoOpInstalledUpgradeable;
+               else if( installed )
+                       statusicon = iIconPkgNoOpInstalled;
+               else if( !installed )
+                       statusicon = iIconPkgNoOpNotInstalled;
+       } else if( marked == Package::PkgOpInstallUpgrade ) {
+               if( upgradeable )
+                       statusicon = iIconPkgUpgrade;
+               else
+                       statusicon = iIconPkgInstall;
+       } else if( marked == Package::PkgOpRemove ) {
+               statusicon = iIconPkgRemove;
+       }
+
+       QString showVer = "";
+       if( upgradeable && (statfilter==Package::PkgStatUpgradeable ||
+                                               (statfilter==Package::PkgStatUnknown && marked==Package::PkgOpInstallUpgrade) ||
+                                               (catfilter==PackageView::CatFilterAllMarked && marked==Package::PkgOpInstallUpgrade) ))
+       {
+               showVer = upg_version;
+       } else {
+               showVer = version;
+       }
+
+       int ver_w = 0;
+       if( QApplication::desktop()->width() > QApplication::desktop()->height() )
+       {
+               r = option.rect;
+               r.setRight( r.right()-statusicon.width()-4 );
+
+               if( catfilter != PackageView::CatFilterBlacklisted ) {
+                       painter->drawText(r, Qt::AlignTop|Qt::AlignRight, showVer, &r);
+                       ver_w = r.width();
+               } else if( blacklisted==BlacklistSelect::BlacklistThis ) {
+                       if( upgradeable && upg_version!="" ) {
+                               showVer = upg_version;
+                       } else {
+                               showVer = version;
+                       }
+                       painter->drawText(r, Qt::AlignTop|Qt::AlignRight, showVer, &r);
+                       ver_w = r.width();
+               }
+       }
+
+       r = option.rect;
+       r.setRight( r.right()-statusicon.width()-4-ver_w );  //does not work as it should?
+       QFont f = painter->font();
+       f.setBold(true);
+       painter->setFont(f);
+       painter->drawText(r.left()+iDefaultIcon.width()+2, r.top(), r.width(), r.height(), Qt::AlignTop|Qt::AlignLeft, name, &r);
+       f.setBold(false);
+       painter->setFont(f);
+
+       f.setPointSize( f.pointSize()-4 );
+       painter->setFont(f);
+       r = option.rect;
+       painter->drawText(r.left()+iDefaultIcon.width()+2, r.top(), r.width(), r.height(), Qt::AlignBottom|Qt::AlignLeft, desc, &r);
+
+       r = option.rect;
+       painter->drawPixmap(r.right()-statusicon.width()-2, r.top()+4, 24, 24, statusicon);
+
+       painter->restore();
+
+       //if( t.elapsed()>=100 )
+       //qDebug() << name << t.elapsed();
+}
+
+void ListItemDelegate::loadIcons()
+{
+       iDefaultIcon = QPixmap(":/icons/icons/appdefault.png");
+       iIconPkgInstall = QPixmap(":/icons/icons/pkg_install.png");
+       iIconPkgUpgrade = QPixmap(":/icons/icons/pkg_upgrade.png");
+       iIconPkgRemove = QPixmap(":/icons/icons/pkg_remove.png");
+       iIconPkgNoOpInstalled = QPixmap(":/icons/icons/pkg_nop_installed.png");
+       iIconPkgNoOpNotInstalled = QPixmap(":/icons/icons/pkg_nop_notinstalled.png");
+       iIconPkgNoOpInstalledUpgradeable = QPixmap(":/icons/icons/pkg_nop_instupgr.png");
+}
+
+
+QSize ListItemDelegate::sizeHint(const QStyleOptionViewItem&, const QModelIndex&) const
+{
+       return QSize(400, 58);
+}
+
+
+PackageView::PackageView(QWidget *parent) : QMainWindow(parent), ui(new Ui::PackageView)
+{
+       iMainWindow = dynamic_cast<MainWindow*>(parent);
+       ui->setupUi(this);
+#ifdef Q_WS_MAEMO_5
+       this->setAttribute(Qt::WA_Maemo5StackedWindow);
+       this->setWindowFlags(Qt::Window);
+       this->setAttribute(Qt::WA_Maemo5AutoOrientation);
+#endif
+       iSettings = 0;
+       iAptInterface = 0;
+
+       connect(QApplication::desktop(), SIGNAL(resized(int)), this, SLOT(orientationChanged()));
+
+       iCatFilterLabels
+                       << tr("All marked packages")    // a special case
+                       << tr("All user categories")
+                       << tr("\tDesktop")
+                       << tr("\tEducation")
+                       << tr("\tGames")
+                       << tr("\tGraphics")
+                       << tr("\tInternet & Networking")
+                       << tr("\tLocation & Navigation")
+                       << tr("\tMultimedia")
+                       << tr("\tOffice")
+                       << tr("\tOther")
+                       << tr("\tProgramming")
+                       << tr("\tScience")
+                       << tr("\tSystem")
+                       << tr("\tUtilities")
+                       << tr("All packages (ADVANCED)")
+                       << tr("Blacklisted packages");  // a special case
+
+       iCatFilterStrings
+                       << ""
+                       << "user/"
+                       << "user/desktop"
+                       << "user/education"
+                       << "user/games"
+                       << "user/graphics"
+                       << "user/network"
+                       << "user/navigation"
+                       << "user/multimedia"
+                       << "user/office"
+                       << "user/other"
+                       << "user/development"
+                       << "user/science"
+                       << "user/system"
+                       << "user/utilities"
+                       << ""
+                       << "";
+
+       iDefaultCatFilter = CatFilterAllUser;
+       iSelectedCatFilter = iDefaultCatFilter;
+
+       iStatFilterLabels
+                       << tr("All")
+                       << tr("Not installed")
+                       << tr("Upgradeable")
+                       << tr("Installed");
+
+       iSelectedStatFilter = Package::PkgStatUnknown;
+       iSortOrder = SortAlpha;
+
+       iDimmer = new dimmer(this);
+
+       ui->searchBar->hide();
+
+       iListCoverLabel = new QLabel(ui->listWidget);
+       iListCoverLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+       iListCoverLabel->setAlignment(Qt::AlignCenter);
+
+       iKeyFilter = new KeyEventGrabber(this);
+       ui->listWidget->installEventFilter(iKeyFilter);
+
+       iSortNoticeShown = false;
+
+       iSearchPkgName = true;
+       iSearchDisplayName = true;
+       iSearchDescShort = true;
+       iSearchDescLong = false;
+
+       // fine-tune kinetic scrolling parameters
+       QAbstractKineticScroller* listscroller = ui->listWidget->property("kineticScroller").value<QAbstractKineticScroller*>();
+       if( listscroller )
+       {
+               //qDebug() << listscroller->dragInertia() << listscroller->decelerationFactor()
+               //              << listscroller->minimumVelocity() << listscroller->maximumVelocity();
+               listscroller->setDecelerationFactor(0.75); // default is 0.85
+               listscroller->setDragInertia(0.60);     // default is 0.85
+               listscroller->setMaximumVelocity(1800); // default is 3500
+
+               // not good because it alse sets horizontal overshoot:
+               //listscroller->setOvershootPolicy( QAbstractKineticScroller::OvershootAlwaysOn );
+       }
+}
+
+PackageView::~PackageView()
+{
+       delete iListCoverLabel;
+       delete iKeyFilter;
+       delete iDimmer;
+    delete ui;
+}
+
+void PackageView::orientationChanged()
+{
+       ui->listWidget->scroll(1,1);    // this causes all items to be repainted
+       iListCoverLabel->setGeometry( ui->listWidget->rect() );
+}
+
+void PackageView::resizeEvent(QResizeEvent* event)
+{
+       iListCoverLabel->setGeometry( ui->listWidget->rect() );
+       QWidget::resizeEvent(event);
+}
+
+bool PackageView::doFilterCategory(Package* pkg)
+{
+       if( pkg->section()=="user/hidden" && iSelectedStatFilter!=Package::PkgStatInstalled && iSelectedStatFilter!=Package::PkgStatUnknown )
+               return false;
+       if( pkg->section()=="user/hidden" && !pkg->isInstalled() )
+               return false;
+
+       Package* upg_pkg = pkg->availablePackage();
+
+       if( iSelectedStatFilter==Package::PkgStatUpgradeable && iSelectedCatFilter!=CatFilterBlacklisted &&
+               pkg->isUpgradeable() && upg_pkg && upg_pkg->isBlacklisted() )
+               return false;
+
+       if( pkg->isBlacklisted() || (upg_pkg && upg_pkg->isBlacklisted()) )
+       {
+               if( iSelectedCatFilter == CatFilterBlacklisted )
+                       return true;
+               if( pkg->isInstalled() && (iSelectedStatFilter==Package::PkgStatInstalled || iSelectedStatFilter==Package::PkgStatUnknown) )
+                       return true;
+               if( pkg->isBlacklisted() && iSelectedCatFilter != CatFilterBlacklisted )
+                       return false;
+       } else if( !pkg->isBlacklisted() && iSelectedCatFilter == CatFilterBlacklisted )
+               return false;
+
+       if( iSelectedCatFilter==CatFilterAllMarked ) {
+               if( pkg->isMarkedForOperation() )
+                       return true;
+               else
+                       return false;
+       }
+       if( pkg->section().startsWith( iCatFilterStrings.at(iSelectedCatFilter) ) )
+               return true;
+
+       return false;
+}
+
+QString PackageView::generateSortString(Package* pkg)
+{
+       QString sortstr;
+
+       if( iSortOrder==SortAlpha ) {
+               sortstr = pkg->displayName();
+       }
+       else if( iSortOrder==SortDateDesc ) {
+               Package* upg = 0;
+               if( pkg->isUpgradeable() )
+                       upg = pkg->availablePackage();
+
+               if( (!upg && pkg->date().isValid()) || iSelectedStatFilter==Package::PkgStatInstalled )
+                       sortstr = pkg->date().toString("yyyy-MM-dd hh:mm:ss");
+               else if( upg && upg->date().isValid() ) {
+                       sortstr = upg->date().toString("yyyy-MM-dd hh:mm:ss");
+               } else {
+                       sortstr = "";
+                       iPackagesEmptySort++;
+               }
+       }
+       else if( iSortOrder==SortSizeDesc ) {
+               if( pkg->isInstalled() )
+                       sortstr = QString("%1").arg(pkg->installedSize()*1024, 12 );
+               else
+                       sortstr = QString("%1").arg(pkg->size(), 12 );
+       }
+
+       //qDebug() << sortstr;
+
+       return sortstr;
+}
+
+void PackageView::openWin()
+{
+       ui->listWidget->clear();
+       ui->listWidget->setSortingEnabled(true);
+       iPackagesEmptySort = 0;
+
+       if( !isVisible() ) {
+               iMainWindow->busyDialog(false);
+               iListCoverLabel->setText("Loading...");
+               iListCoverLabel->setAutoFillBackground(true);
+               iListCoverLabel->show();
+               show();
+               QApplication::processEvents();
+       }
+
+       if( iSortOrder==SortDateDesc || iSortOrder==SortSizeDesc )
+               ui->listWidget->sortItems(Qt::DescendingOrder);
+       else
+               ui->listWidget->sortItems(Qt::AscendingOrder);
+
+       delete ui->listWidget->itemDelegate();
+       ListItemDelegate* delegate = new ListItemDelegate(ui->listWidget);
+       delegate->loadIcons();
+       ui->listWidget->setItemDelegate( delegate );
+
+       if( !ui->searchBar->isVisible() )
+       {
+               if( iSelectedStatFilter == Package::PkgStatNotInstalled || iSelectedStatFilter == Package::PkgStatUnknown ||
+                       iSelectedCatFilter == CatFilterAllMarked || iSelectedCatFilter == CatFilterBlacklisted )
+               {
+                       QHashIterator<QString, Package*> i( *iAptInterface->packagesAvailable() );
+                       while (i.hasNext())
+                       {
+                               i.next();
+                               Package* inst = iAptInterface->packagesInstalled()->value(i.value()->name(),0);
+                               if( doFilterCategory(i.value()) && !inst )
+                                       addListItem(i.value(), generateSortString(i.value()));
+                       }
+               }
+               if( iSelectedStatFilter == Package::PkgStatInstalled || iSelectedStatFilter == Package::PkgStatUpgradeable ||
+                       iSelectedStatFilter == Package::PkgStatUnknown || iSelectedCatFilter == CatFilterAllMarked ||
+                       iSelectedCatFilter == CatFilterBlacklisted )
+               {
+                       QHashIterator<QString, Package*> i( *iAptInterface->packagesInstalled() );
+                       while (i.hasNext())
+                       {
+                               i.next();
+                               if( iSelectedStatFilter == Package::PkgStatUpgradeable && iSelectedCatFilter != CatFilterBlacklisted ) {
+                                       if( i.value()->isUpgradeable() && doFilterCategory(i.value()) )
+                                               addListItem(i.value(), generateSortString(i.value()));
+                               } else {
+                                       if( doFilterCategory(i.value()) )
+                                               addListItem(i.value(), generateSortString(i.value()));
+                               }
+                       }
+               }
+       } else {
+               for( int j=0; j<iSearchResults.count(); j++ )
+               {
+                       addListItem(iSearchResults.at(j), generateSortString( iSearchResults.at(j) ));
+               }
+       }
+
+       iListCoverLabel->hide();
+       iListCoverLabel->setAutoFillBackground(false);
+
+       updateLabel();
+
+       if( iSelectedStatFilter==Package::PkgStatUpgradeable && ui->listWidget->count()>0 &&
+               iSelectedCatFilter != CatFilterAllMarked && iSelectedCatFilter != CatFilterBlacklisted )
+       {
+               ui->actionUpgrade_all->setVisible(true);
+       } else {
+               ui->actionUpgrade_all->setVisible(false);
+       }
+
+       if( iSelectedCatFilter == CatFilterBlacklisted && ui->listWidget->count()>0 ) {
+               ui->actionRestore_all->setVisible(true);
+       } else {
+               ui->actionRestore_all->setVisible(false);
+       }
+
+       show();
+
+       if( !ui->searchBar->isVisible() ) {
+               ui->listWidget->setFocusPolicy(Qt::StrongFocus);
+               ui->listWidget->setFocus();
+       } else {
+               ui->listWidget->setFocusPolicy(Qt::NoFocus);
+               ui->lineEdit->setFocus();
+       }
+
+       if( ui->listWidget->count() == 0 )
+       {
+               iListCoverLabel->setGeometry( ui->listWidget->rect() );
+               iListCoverLabel->setText("No packages");
+               iListCoverLabel->show();
+       }
+
+       if( ui->listWidget->count()>1 && iPackagesEmptySort == ui->listWidget->count() && !iSortNoticeShown ) {
+               ConfirmDialog d(false, this);
+               QString msg = "No shown packages currently have the required information for sorting by this criterion. The list is unsorted.";
+               if( iSortOrder == SortDateDesc && !iSettings->qsettings()->value("fetch_dates",false).toBool() )
+                       msg += " You can enable date fetching in the options menu.";
+               d.setText("Notice", msg);
+               d.exec();
+               iSortNoticeShown = true;
+       }
+}
+
+void PackageView::enableMenu()
+{
+       ui->menuMenu->setEnabled(true);
+}
+
+void PackageView::disableMenu()
+{
+       ui->menuMenu->setEnabled(false);
+}
+
+void PackageView::addListItem(Package* pkg_, QString listname_)
+{
+       PackageListWidgetItem* p = new PackageListWidgetItem( pkg_, listname_ );
+
+       if( pkg_ != 0 )
+       {
+               QString name = pkg_->name();
+               if( pkg_->maemoDisplayName()!="" )
+                       name = pkg_->maemoDisplayName();
+               p->setData(UserRoleName, name);
+       } else {
+               p->setData(UserRoleName, listname_);
+       }
+
+       if( pkg_ != 0 )
+       {
+               p->setData(UserRoleDescShort, pkg_->descShort());
+               p->setData(UserRoleVersion, pkg_->version());
+               p->setData(UserRoleMarked, (int)pkg_->markedOperation());
+               p->setData(UserRoleInstalled, pkg_->isInstalled());
+               p->setData(UserRoleUpgradeable, pkg_->isUpgradeable());
+               p->setData(UserRoleAvailVersion, pkg_->upgradeableVersion());
+               p->setData(UserRoleCurrentStatFilter, iSelectedStatFilter);
+               p->setData(UserRoleCurrentCatFilter, iSelectedCatFilter);
+
+               if( pkg_->availablePackage() )
+                       p->setData(UserRoleBlacklisted, (int)pkg_->availablePackage()->blacklisted());
+               else
+                       p->setData(UserRoleBlacklisted, (int)pkg_->blacklisted());
+
+               //qDebug()<<pkg_->name();
+
+               pkg_->convertIcon();
+               p->setData(Qt::DecorationRole, *pkg_->icon());
+       }
+       ui->listWidget->addItem( p );
+}
+
+void PackageView::closeEvent(QCloseEvent *event)
+{
+       if( !iAptInterface ) {
+               resetWindow();
+               event->accept();
+       }
+
+       if( iDimmer->busy() )
+       {
+               iAptInterface->cancel();
+               event->ignore();
+               return;
+       }
+
+#ifdef Q_WS_MAEMO_5
+       if( iAptInterface->numSelectedPackages() == 0 )
+       {               
+               resetWindow();
+               event->accept();
+       } else {
+               QString c;
+               c.setNum( iAptInterface->numSelectedPackages() );
+               ConfirmDialog d(true, this);
+               d.setText("Returning to main menu", QString("Clear %1 package selection(s) and lose all the pending changes?").arg(iAptInterface->numSelectedPackages()));
+               if( d.exec() ) {
+                       resetWindow();
+                       event->accept();
+               } else {
+                       event->ignore();
+               }
+       }
+#else  // for simulator
+       resetWindow();
+       event->accept();
+#endif
+}
+
+void PackageView::changeEvent(QEvent *e)
+{
+    QMainWindow::changeEvent(e);
+    switch (e->type()) {
+    case QEvent::LanguageChange:
+        ui->retranslateUi(this);
+        break;
+    default:
+        break;
+    }
+}
+
+void PackageView::on_btn_Commit_clicked()
+{
+       QStringList pkgnames;
+
+       QHashIterator<QString, Package*> i( *iAptInterface->packagesAvailable() );
+       while (i.hasNext())
+       {
+               i.next();
+
+               if( i.value()->markedOperation() == Package::PkgOpInstallUpgrade )
+                       pkgnames << i.value()->name();
+               if( i.value()->markedOperation() == Package::PkgOpRemove ) {
+                       qDebug() << "warning: trying to add package marked from the wrong list";
+                       //pkgnames << i.value()->name() + "-";
+               }
+       }
+
+       QHashIterator<QString, Package*> r( *iAptInterface->packagesInstalled() );
+       while (r.hasNext())
+       {
+               r.next();
+
+               if( r.value()->markedOperation() == Package::PkgOpInstallUpgrade )
+                       pkgnames << r.value()->name();
+               if( r.value()->markedOperation() == Package::PkgOpRemove )
+                       pkgnames << r.value()->name() + "-";
+       }
+
+       iMainWindow->busyDialog(true, "Operation in progress", "Reading dependencies");
+
+       iAptInterface->setProcessPackages(pkgnames);
+       iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetSimulate);
+       iAptInterface->run(iDimmer);
+}
+
+void PackageView::on_actionClear_selections_triggered()
+{
+       QString c;
+       c.setNum( iAptInterface->numSelectedPackages() );
+       ConfirmDialog d(true, this);
+       d.setText(tr("Confirmation"), tr("Clear ") + c + tr(" package selection(s) and lose all the pending changes?"));
+       if( d.exec() )
+       {
+               clearSelections();
+               openWin();
+       }
+}
+
+void PackageView::clearSelections()
+{
+       QHashIterator<QString, Package*> i( *iAptInterface->packagesInstalled() );
+       while (i.hasNext())
+       {
+               i.next();
+               i.value()->setMarkedForOperation(Package::PkgOpNone);
+       }
+       QHashIterator<QString, Package*> a( *iAptInterface->packagesAvailable() );
+       while (a.hasNext())
+       {
+               a.next();
+               a.value()->setMarkedForOperation(Package::PkgOpNone);
+       }
+       iAptInterface->setNumSelectedPackages(0);
+}
+
+void PackageView::on_listWidget_itemClicked(QListWidgetItem* item)
+{
+       Package* pkg = dynamic_cast<PackageListWidgetItem*>(item)->package();
+       if( !pkg )
+               return;
+
+       bool bl = pkg->isBlacklisted();
+       bool bl_u = false;
+
+       Package* upg_pkg = pkg->availablePackage();
+       if( upg_pkg )
+               bl_u = upg_pkg->isBlacklisted();
+
+       PackageSelector s(pkg, iAptInterface, this);
+       s.exec();
+
+       pkg->setMarkedForOperation( s.selectedOperation() );
+       item->setData(UserRoleMarked, (int)s.selectedOperation());
+       updateLabel();
+
+       if( pkg->isBlacklisted() != bl ) {
+               openWin();
+       }
+       else if( upg_pkg && upg_pkg->isBlacklisted() != bl_u ) {
+               openWin();
+       }
+}
+
+void PackageView::updateLabel()
+{
+       QString s;
+       s.setNum( iAptInterface->numSelectedPackages() );
+       QString s2;
+       s2.setNum( ui->listWidget->count() );
+       QString statlabel = iStatFilterLabels.at(iSelectedStatFilter);
+       if( iSelectedCatFilter == CatFilterAllMarked || iSelectedCatFilter == CatFilterBlacklisted )
+               statlabel = "All";
+       ui->label->setText("<font size=\"-2\"><b>" + s + "</b> package(s) marked<br>"
+                                          + "Showing: <b>" + statlabel + "</b><br>"
+                                          + "Filter: " + iCatFilterLabels.at(iSelectedCatFilter) + " - " + s2 + " package(s)</font>");
+
+       if( iAptInterface->numSelectedPackages()==0 ) {
+               ui->btn_Commit->setEnabled(false);
+               ui->actionClear_selections->setVisible(false);
+               ui->actionSave_selections->setVisible(false);
+       } else {
+               ui->btn_Commit->setEnabled(true);
+               ui->actionClear_selections->setVisible(true);
+               ui->actionSave_selections->setVisible(true);
+       }
+}
+
+void PackageView::on_btn_CategoryFilter_clicked()
+{
+       FilterSelect f("Category filter", this);
+       f.setList( iCatFilterLabels, iSelectedCatFilter );
+
+       bool s = f.exec();
+
+       if( s )
+               iSelectedCatFilter = f.selection();
+
+       if( iSelectedCatFilter == CatFilterAllMarked || iSelectedCatFilter == CatFilterBlacklisted ) {
+               ui->btn_StatusFilter->setEnabled(false);
+       } else {
+               ui->btn_StatusFilter->setEnabled(true);
+       }
+
+       if( s ) {
+               iListCoverLabel->setText("Loading...");
+               iListCoverLabel->setAutoFillBackground(true);
+               iListCoverLabel->show();
+               QApplication::processEvents();
+               iSortNoticeShown = false;
+
+               openWin();
+       }
+}
+
+void PackageView::setStatFilter(Package::packageStatus f_)
+{
+       iSelectedStatFilter = f_;
+}
+
+void PackageView::on_btn_StatusFilter_clicked()
+{
+       FilterSelect f("Status filter", this);
+       f.setList( iStatFilterLabels, iSelectedStatFilter );
+
+       int oldfilter = iSelectedStatFilter;
+
+       bool s = f.exec();
+
+       if( s ) {
+               iSelectedStatFilter = (Package::packageStatus)f.selection();
+
+               iListCoverLabel->setText("Loading...");
+               iListCoverLabel->setAutoFillBackground(true);
+               iListCoverLabel->show();
+               QApplication::processEvents();
+               iSortNoticeShown = false;
+
+               openWin();
+
+               if( oldfilter==Package::PkgStatInstalled && iSelectedStatFilter!=Package::PkgStatInstalled &&
+                       iAptInterface->needListOrDateRefresh() )
+               {
+                       iMainWindow->setNextOperation(MainWindow::OpOpenPkgView);
+                       iMainWindow->busyDialog(true,"Operation in progress","Reading the rest of the package lists");
+
+                       if( iAptInterface->needRepoRefresh() )
+                               iAptInterface->addQueuedOperation(AAptInterface::ModeAptGetUpdate);
+
+                       iAptInterface->addQueuedOperation(AAptInterface::ModeReadPackages);
+                       iAptInterface->addQueuedOperation(AAptInterface::ModeFetchDates);
+                       iAptInterface->run(iDimmer);
+               }
+       }
+}
+
+void PackageView::resetWindow()
+{
+       iMainWindow->resetIdlingTime();
+
+       iAptInterface->writeBlacklist();
+
+       ui->btn_StatusFilter->setEnabled(true);
+       //iSelectedCatFilter = iDefaultCatFilter;
+       //iSortOrder = SortAlpha;
+       iSortNoticeShown = false;
+
+       clearSelections();
+       clearSearch();
+}
+
+void PackageView::on_actionHelp_triggered()
+{
+       Help h(this);
+       h.exec();
+}
+
+void PackageView::on_btn_searchClose_clicked()
+{
+       clearSearch();
+
+       iListCoverLabel->setText("Loading...");
+       iListCoverLabel->setAutoFillBackground(true);
+       iListCoverLabel->show();
+       QApplication::processEvents();
+
+       openWin();
+}
+
+void PackageView::clearSearch()
+{
+       ui->lineEdit->clear();
+       ui->searchBar->hide();
+       ui->toolBar->show();
+       ui->listWidget->setFocusPolicy(Qt::StrongFocus);
+
+       iSearchResults.clear();
+}
+
+void PackageView::on_actionSearch_triggered()
+{
+       if( ui->searchBar->isVisible() )
+               return;
+
+       ui->listWidget->setFocusPolicy(Qt::NoFocus);
+       ui->searchLabel->setText( QString("%1 results").arg(ui->listWidget->count()) );
+       ui->toolBar->hide();
+       ui->searchBar->show();
+       ui->lineEdit->setFocus();
+       iPrevSearchText = "";
+}
+
+void PackageView::on_lineEdit_textEdited(QString text)
+{
+       if( !ui->searchBar->isVisible() )
+               return;
+
+       if( text=="" ) {
+               on_btn_searchClose_clicked();
+               return;
+       }
+
+       if( iPrevSearchText.length() > text.length() )
+       {
+               iListCoverLabel->setText("Loading...");
+               iListCoverLabel->setAutoFillBackground(true);
+               iListCoverLabel->show();
+               QApplication::processEvents();
+
+               ui->searchBar->hide();
+               openWin();
+               ui->searchBar->show();
+               ui->toolBar->hide(); // ensure it stays hidden
+               ui->lineEdit->setFocus();
+       }
+
+       iPrevSearchText = text;
+
+       QList<Package*> packages;
+       iSearchResults.clear();
+
+       for( int i=0; i<(ui->listWidget->count()); i++ ) {
+               packages.append( dynamic_cast<PackageListWidgetItem*>( ui->listWidget->item(i) )->package() );
+       }
+
+       if( text.startsWith(":") ) {
+               for( int i=0; i<packages.count(); i++ ) {
+                       if( packages.at(i) ) {
+                               if( (iSearchPkgName && packages.at(i)->name().startsWith(text.mid(1), Qt::CaseInsensitive)) ||
+                                       (iSearchDisplayName && packages.at(i)->displayName().startsWith(text.mid(1), Qt::CaseInsensitive)) ||
+                                       (iSearchDescShort && packages.at(i)->descShort().startsWith(text.mid(1), Qt::CaseInsensitive)) ||
+                                       (iSearchDescLong && packages.at(i)->descLong().startsWith(text.mid(1), Qt::CaseInsensitive)) )
+                               {
+                                       iSearchResults.append( packages.at(i) );
+                               }
+                       }
+               }
+       } else {
+               for( int i=0; i<packages.count(); i++ ) {
+                       if( packages.at(i) ) {
+                               if( (iSearchPkgName && packages.at(i)->name().contains(text, Qt::CaseInsensitive)) ||
+                                       (iSearchDisplayName && packages.at(i)->displayName().contains(text, Qt::CaseInsensitive)) ||
+                                       (iSearchDescShort && packages.at(i)->descShort().contains(text, Qt::CaseInsensitive)) ||
+                                       (iSearchDescLong && packages.at(i)->descLong().contains(text, Qt::CaseInsensitive)) )
+                               {
+                                       iSearchResults.append( packages.at(i) );
+                               }
+                       }
+               }
+       }
+
+       ui->searchLabel->setText( QString("%1 results").arg( iSearchResults.count()) );
+
+       openWin();
+}
+
+void PackageView::setSearchText(QString text)
+{
+       ui->lineEdit->setText(text);
+       on_lineEdit_textEdited(text);
+}
+
+KeyEventGrabber::KeyEventGrabber(QObject* parent) : QObject(parent)
+{
+}
+
+bool KeyEventGrabber::eventFilter(QObject *obj, QEvent *event)
+{
+       if( event->type() == QEvent::KeyPress ) {
+               QString text = dynamic_cast<QKeyEvent*>(event)->text();
+               int key = dynamic_cast<QKeyEvent*>(event)->key();
+               if( (text.trimmed() != "" || text==" ") && key!=Qt::Key_Backspace ) {
+                       dynamic_cast<PackageView*>(this->parent())->on_actionSearch_triggered();
+                       dynamic_cast<PackageView*>(this->parent())->setSearchText( text );
+                       return true;
+               }
+       }
+       return QObject::eventFilter(obj, event);
+}
+
+void PackageView::on_pushButton_searchOptions_clicked()
+{
+       SearchOptions s(this);
+       s.setSelections(iSearchPkgName, iSearchDisplayName, iSearchDescShort, iSearchDescLong);
+       if( s.exec() )
+       {
+               iSearchPkgName = s.searchPkgName();
+               iSearchDisplayName = s.searchDisplayName();
+               iSearchDescShort = s.searchDescShort();
+               iSearchDescLong = s.searchDescLong();
+
+               iPrevSearchText += " ";
+               on_lineEdit_textEdited( ui->lineEdit->text() );
+       }
+}
+
+void PackageView::setSearchOptions(bool pkgname, bool dispname, bool dshort, bool dlong)
+{
+       iSearchPkgName = pkgname;
+       iSearchDisplayName = dispname;
+       iSearchDescShort = dshort;
+       iSearchDescLong = dlong;
+}
+
+void PackageView::on_actionUpgrade_all_triggered()
+{
+       for( int i=0; i<ui->listWidget->count(); i++ )
+       {
+               Package* pkg = dynamic_cast<PackageListWidgetItem*>(ui->listWidget->item(i))->package();
+               if( pkg && pkg->isUpgradeable() ) {
+                       pkg->setMarkedForOperation( Package::PkgOpInstallUpgrade );
+                       ui->listWidget->item(i)->setData(UserRoleMarked, (int)Package::PkgOpInstallUpgrade);
+               }
+       }
+       updateLabel();
+}
+
+void PackageView::on_actionView_log_triggered()
+{
+       QByteArray log = iAptInterface->readLogFile();
+       LogView l(log, this);
+       l.exec();
+}
+
+void PackageView::on_btn_Sort_clicked()
+{
+       SortSelector s(iSortOrder, this);
+       if( s.exec() ) {
+               iSortOrder = s.selectedOperation();
+               iSortNoticeShown = false;
+               openWin();
+       }
+}
+
+void PackageView::on_actionLoad_selections_triggered()
+{
+       if( iAptInterface->numSelectedPackages() > 0 ) {
+               ConfirmDialog d(true, this);
+               d.setText("Confirmation", "Proceed loading selections? All current selections will be cleared.");
+               if( !d.exec() )
+                       return;
+       }
+
+       clearSelections();
+
+       QStringList unknownList;
+       QStringList wrongverList;
+       int success=0;
+       int errors=0;
+
+       QFile f("/root/.fapman/selections.list");
+       if( f.open(QIODevice::ReadOnly | QIODevice::Text ) )
+       {
+               while(!f.atEnd()) {
+                       QString line = f.readLine().trimmed();
+                       QStringList parts = line.split(' ');
+                       if( parts.count()==3 ) {
+                               Package* pkgAv = iAptInterface->packagesAvailable()->value(parts.at(0),0);
+                               Package* pkgIn = iAptInterface->packagesInstalled()->value(parts.at(0),0);
+                               if( parts.at(2)=="install" ) {
+                                       if( !pkgAv && !pkgIn ) {
+                                               unknownList << parts.at(0);
+                                       }
+                                       else if( pkgIn ) {
+                                               wrongverList << parts.at(0);
+                                       }
+                                       else if( pkgAv ) {
+                                               if( pkgAv->version() == parts.at(1) && !pkgAv->isInstalled() ) {
+                                                       pkgAv->setMarkedForOperation(Package::PkgOpInstallUpgrade);
+                                                       success++;
+                                               } else {
+                                                       wrongverList << parts.at(0);
+                                               }
+                                       }
+
+                               } else if( parts.at(2)=="upgrade" ) {
+                                       if( !pkgAv && !pkgIn ) {
+                                               unknownList << parts.at(0);
+                                       }
+                                       else if( (pkgAv && !pkgIn) || (pkgIn && !pkgAv) ) {
+                                               wrongverList << parts.at(0);
+                                       }
+                                       else if( pkgIn && pkgAv ) {
+                                               if( pkgIn->version() == parts.at(1) && pkgIn->isInstalled() && pkgIn->isUpgradeable() ) {
+                                                       pkgIn->setMarkedForOperation(Package::PkgOpInstallUpgrade);
+                                                       success++;
+                                               } else {
+                                                       wrongverList << parts.at(0);
+                                               }
+                                       }
+
+                               } else if( parts.at(2)=="remove" ) {
+                                       if( !pkgAv && !pkgIn ) {
+                                               unknownList << parts.at(0);
+                                       }
+                                       else if( pkgAv && !pkgIn ) {
+                                               wrongverList << parts.at(0);
+                                       }
+                                       else if( pkgIn ) {
+                                               if( pkgIn->version() == parts.at(1) && pkgIn->isInstalled() ) {
+                                                       pkgIn->setMarkedForOperation(Package::PkgOpRemove);
+                                                       success++;
+                                               } else {
+                                                       wrongverList << parts.at(0);
+                                               }
+                                       }
+                               } else {
+                                       errors++;
+                               }
+                       } else if( line!="" ){
+                               errors++;
+                       }
+               }
+               f.close();
+       }
+
+       ConfirmDialog d(false, this);
+       QString msg;
+       msg += QString("<b>%1 successful</b><br>").arg(success);
+       if( wrongverList.count() > 0 ) {
+               msg += QString("%1 wrong versions/changed statuses (not selected):<br>").arg(wrongverList.count());
+               msg += "<font size=\"-1\">";
+               for( int i=0; i<wrongverList.count(); i++ ) {
+                       msg += wrongverList.at(i) + " ";
+               }
+               msg += "</font><br>";
+       }
+       if( unknownList.count() > 0 ) {
+               msg += QString("%1 unknown packages:<br>").arg(unknownList.count());
+               msg += "<font size=\"-1\">";
+               for( int i=0; i<unknownList.count(); i++ ) {
+                       msg += unknownList.at(i) + " ";
+               }
+               msg += "</font><br>";
+       }
+       if( errors>0 || (wrongverList.count()==0 && unknownList.count()==0) ) {
+               msg += QString("%1 errors<br>").arg(errors);
+       }
+       if( success==0 && wrongverList.count()==0 && unknownList.count()==0 )
+               msg = "No stored selections";
+       QString title;
+       if( success > 0 )
+               title = "Selections loaded";
+       else
+               title = "No selections loaded";
+       d.setText(title, msg);
+       d.exec();
+
+       if( success > 0 ) {
+               ui->btn_StatusFilter->setEnabled(false);
+               iSelectedCatFilter = CatFilterAllMarked;
+       }
+       openWin();
+}
+
+void PackageView::on_actionSave_selections_triggered()
+{
+       if( iAptInterface->numSelectedPackages() == 0 )
+               return;
+
+       QFile f("/root/.fapman/selections.list");
+       bool fail = false;
+       int count = 0;
+       if( f.open(QIODevice::WriteOnly | QIODevice::Text) )
+       {
+               QTextStream out(&f);
+
+               QHashIterator<QString, Package*> i( *iAptInterface->packagesAvailable() );
+               while (i.hasNext())
+               {
+                       i.next();
+
+                       if( i.value()->markedOperation() == Package::PkgOpInstallUpgrade ) {
+                               out << i.value()->name() << " " << i.value()->version() << " install\n";
+                               count++;
+                       }
+                       if( i.value()->markedOperation() == Package::PkgOpRemove )
+                               qDebug() << "Warning: package is marked for removal in the wrong list";
+               }
+
+               QHashIterator<QString, Package*> r( *iAptInterface->packagesInstalled() );
+               while (r.hasNext())
+               {
+                       r.next();
+
+                       if( r.value()->markedOperation() == Package::PkgOpInstallUpgrade ) {
+                               out << r.value()->name() << " " << r.value()->version() << " upgrade\n";
+                               count++;
+                       }
+                       if( r.value()->markedOperation() == Package::PkgOpRemove ) {
+                               out << r.value()->name() << " " << r.value()->version() << " remove\n";
+                               count++;
+                       }
+               }
+
+               f.close();
+       } else {
+               fail = true;
+       }
+
+       ConfirmDialog d(false, this);
+       if( fail )
+               d.setText( "Error", "Failed to write package selections" );
+       else
+               d.setText( "Selections stored", QString("Stored %1 selections").arg(count) );
+       d.exec();
+}
+
+void PackageView::on_actionRestore_all_triggered()
+{
+       ConfirmDialog d(true, this);
+       d.setText("Confirmation","Restore all shown blacklisted packages?");
+       if( !d.exec() )
+               return;
+
+       for( int i=0; i<ui->listWidget->count(); i++ )
+       {
+               Package* pkg = dynamic_cast<PackageListWidgetItem*>(ui->listWidget->item(i))->package();
+               Package* p1 = iAptInterface->packagesInstalled()->value(pkg->name(),0);
+               Package* p2 = iAptInterface->packagesAvailable()->value(pkg->name(),0);
+               if( p1 && p1->isBlacklisted() ) {
+                       BlacklistSelect::blackList old = p1->blacklisted();
+                       p1->setBlacklisted(BlacklistSelect::BlacklistNone);
+                       iAptInterface->removeFromBlacklist(p1, old);
+               }
+               if( p2 && p2->isBlacklisted() ) {
+                       BlacklistSelect::blackList old = p2->blacklisted();
+                       p2->setBlacklisted(BlacklistSelect::BlacklistNone);
+                       iAptInterface->removeFromBlacklist(p2, old);
+               }
+       }
+       iAptInterface->writeBlacklist();
+       openWin();
+}
diff --git a/packageview.h b/packageview.h
new file mode 100644 (file)
index 0000000..ef9ac7c
--- /dev/null
@@ -0,0 +1,201 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#ifndef PACKAGEVIEW_H
+#define PACKAGEVIEW_H
+
+#include <QtGui>
+#include <QMainWindow>
+#include "mainwindow.h"
+#include "package.h"
+
+namespace Ui {
+    class PackageView;
+}
+
+class MainWindow;
+class AptInterface;
+class Package;
+class dimmer;
+class KeyEventGrabber;
+class Settings;
+
+enum UserRoles { UserRoleName=Qt::UserRole, UserRoleVersion, UserRoleDescShort,
+                                UserRoleMarked, UserRoleInstalled, UserRoleUpgradeable, UserRoleAvailVersion,
+                                UserRoleCurrentStatFilter, UserRoleCurrentCatFilter, UserRoleBlacklisted };
+
+
+class PackageListWidgetItem : public QListWidgetItem
+{
+public:
+       PackageListWidgetItem(Package* p_, QString name_);
+
+       Package* package() { return iPackage; }
+
+private:
+       Package* iPackage;
+};
+
+
+class ListItemDelegate : public QStyledItemDelegate
+{
+public:
+       ListItemDelegate(QObject *parent=0) : QStyledItemDelegate (parent) { }
+
+       void paint (QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
+       QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const;
+       void loadIcons();
+
+private:
+       QPixmap iDefaultIcon;
+       QPixmap iIconPkgInstall;
+       QPixmap iIconPkgUpgrade;
+       QPixmap iIconPkgRemove;
+       QPixmap iIconPkgNoOpInstalled;
+       QPixmap iIconPkgNoOpNotInstalled;
+       QPixmap iIconPkgNoOpInstalledUpgradeable;
+};
+
+
+class PackageView : public QMainWindow
+{
+    Q_OBJECT
+
+public:
+
+       enum sortOrder { SortAlpha, SortDateDesc, SortSizeDesc };
+
+    explicit PackageView(QWidget *parent = 0);
+    ~PackageView();
+       void openWin();
+       void resizeEvent(QResizeEvent* event);
+       void setAptInterface(AAptInterface* a_) { iAptInterface=a_; }
+       void setSettings(Settings* s_) { iSettings=s_; }
+       dimmer* mydimmer() { return iDimmer; }
+       void disableMenu();
+       void enableMenu();
+       void setStatFilter(Package::packageStatus f_);
+       void setSortOrder(sortOrder s_) { iSortOrder = s_; }
+       void clearSelections();
+       void setSearchText(QString text);
+       void setSearchOptions(bool pkgname, bool dispname, bool dshort, bool dlong);
+
+#ifdef Q_WS_MAEMO_5            // workaround for buggy Qt autorotation
+       void show() {
+               if( !isVisible() ) {
+                       QRect r = dynamic_cast<QMainWindow*>(this->parent())->rect();
+                       if(r.width() < r.height()) {
+                               this->setAttribute(Qt::WA_Maemo5PortraitOrientation);
+                       }
+                       else {
+                               if( dynamic_cast<QMainWindow*>(this->parent())->testAttribute( Qt::WA_Maemo5AutoOrientation ) ) {
+                                       this->setAttribute( Qt::WA_Maemo5AutoOrientation );
+                               } else {
+                                       this->setAttribute( Qt::WA_Maemo5LandscapeOrientation );
+                               }
+                               this->setAttribute(Qt::WA_Maemo5StackedWindow);
+                               this->setWindowFlags(Qt::Window);
+                       }
+               }
+               QMainWindow::show();
+       }
+#endif
+
+       static const int CatFilterAllMarked = 0;
+       static const int CatFilterAllUser = 1;
+       static const int CatFilterBlacklisted = 16;
+
+public slots:
+       void orientationChanged();
+       void on_actionSearch_triggered();
+
+protected:
+    void changeEvent(QEvent *e);
+       AAptInterface* iAptInterface;
+       //MainWindow::operation iOperation;
+       void closeEvent(QCloseEvent *event);
+
+private:
+       bool doFilterCategory(Package* pkg);
+       QString generateSortString(Package* pkg);
+       void addListItem(Package* pkg_, QString listname_);
+       void updateLabel(void);
+       void resetWindow();
+       void clearSearch();
+
+    Ui::PackageView *ui;
+       MainWindow* iMainWindow;
+       QBoxLayout* iPkgLayout;
+       dimmer* iDimmer;
+       QLabel* iListCoverLabel;
+       Settings* iSettings;
+
+       QStringList iCatFilterLabels;
+       QStringList iCatFilterStrings;
+       int iSelectedCatFilter;
+       int iDefaultCatFilter;
+
+       QStringList iStatFilterLabels;
+       int iSelectedStatFilter;
+       sortOrder iSortOrder;
+       bool iSortNoticeShown;
+
+       QList<Package*> iSearchResults;
+       QString iPrevSearchText;
+       KeyEventGrabber* iKeyFilter;
+
+       bool iSearchPkgName;
+       bool iSearchDisplayName;
+       bool iSearchDescShort;
+       bool iSearchDescLong;
+
+       int iPackagesEmptySort;
+
+private slots:
+       void on_pushButton_searchOptions_clicked();
+ void on_actionRestore_all_triggered();
+ void on_actionSave_selections_triggered();
+       void on_actionLoad_selections_triggered();
+       void on_btn_Sort_clicked();
+       void on_actionView_log_triggered();
+       void on_actionUpgrade_all_triggered();
+       void on_lineEdit_textEdited(QString );
+       void on_btn_searchClose_clicked();
+       void on_actionHelp_triggered();
+       void on_btn_StatusFilter_clicked();
+       void on_btn_CategoryFilter_clicked();
+       void on_listWidget_itemClicked(QListWidgetItem* item);
+       void on_actionClear_selections_triggered();
+       void on_btn_Commit_clicked();
+};
+
+
+class KeyEventGrabber : public QObject
+{
+       Q_OBJECT
+public:
+       KeyEventGrabber(QObject* parent = 0);
+
+protected:
+       bool eventFilter(QObject *obj, QEvent *event);
+
+};
+
+
+#endif // PACKAGEVIEW_H
diff --git a/packageview.ui b/packageview.ui
new file mode 100644 (file)
index 0000000..5b650f9
--- /dev/null
@@ -0,0 +1,319 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PackageView</class>
+ <widget class="QMainWindow" name="PackageView">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>800</width>
+    <height>480</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Select packages</string>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <layout class="QVBoxLayout" name="verticalLayout">
+    <property name="spacing">
+     <number>0</number>
+    </property>
+    <property name="margin">
+     <number>0</number>
+    </property>
+    <item>
+     <widget class="QListWidget" name="listWidget">
+      <property name="focusPolicy">
+       <enum>Qt::StrongFocus</enum>
+      </property>
+      <property name="contextMenuPolicy">
+       <enum>Qt::CustomContextMenu</enum>
+      </property>
+      <property name="editTriggers">
+       <set>QAbstractItemView::NoEditTriggers</set>
+      </property>
+      <property name="showDropIndicator" stdset="0">
+       <bool>false</bool>
+      </property>
+      <property name="alternatingRowColors">
+       <bool>true</bool>
+      </property>
+      <property name="selectionMode">
+       <enum>QAbstractItemView::NoSelection</enum>
+      </property>
+      <property name="resizeMode">
+       <enum>QListView::Adjust</enum>
+      </property>
+      <property name="layoutMode">
+       <enum>QListView::SinglePass</enum>
+      </property>
+      <property name="sortingEnabled">
+       <bool>true</bool>
+      </property>
+     </widget>
+    </item>
+    <item>
+     <widget class="Line" name="line">
+      <property name="orientation">
+       <enum>Qt::Horizontal</enum>
+      </property>
+     </widget>
+    </item>
+    <item>
+     <widget class="QWidget" name="searchBar" native="true">
+      <layout class="QHBoxLayout" name="searchLayout">
+       <property name="spacing">
+        <number>5</number>
+       </property>
+       <property name="margin">
+        <number>0</number>
+       </property>
+       <item>
+        <widget class="QLineEdit" name="lineEdit">
+         <property name="inputMethodHints">
+          <set>Qt::ImhNoAutoUppercase|Qt::ImhPreferLowercase</set>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLabel" name="searchLabel">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="text">
+          <string>? results</string>
+         </property>
+         <property name="alignment">
+          <set>Qt::AlignCenter</set>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QPushButton" name="pushButton_searchOptions">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="focusPolicy">
+          <enum>Qt::NoFocus</enum>
+         </property>
+         <property name="text">
+          <string/>
+         </property>
+         <property name="icon">
+          <iconset resource="resources.qrc">
+           <normaloff>:/icons/icons/searchoptions.png</normaloff>:/icons/icons/searchoptions.png</iconset>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QPushButton" name="btn_searchClose">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="focusPolicy">
+          <enum>Qt::NoFocus</enum>
+         </property>
+         <property name="text">
+          <string/>
+         </property>
+         <property name="icon">
+          <iconset resource="resources.qrc">
+           <normaloff>:/icons/icons/close.png</normaloff>:/icons/icons/close.png</iconset>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+    </item>
+    <item>
+     <widget class="QWidget" name="toolBar" native="true">
+      <layout class="QHBoxLayout" name="horizontalLayout">
+       <property name="spacing">
+        <number>2</number>
+       </property>
+       <property name="margin">
+        <number>0</number>
+       </property>
+       <item>
+        <widget class="QLabel" name="label">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="text">
+          <string/>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QPushButton" name="btn_StatusFilter">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="focusPolicy">
+          <enum>Qt::NoFocus</enum>
+         </property>
+         <property name="text">
+          <string/>
+         </property>
+         <property name="icon">
+          <iconset resource="resources.qrc">
+           <normaloff>:/icons/icons/filter_stat.png</normaloff>:/icons/icons/filter_stat.png</iconset>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QPushButton" name="btn_CategoryFilter">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="focusPolicy">
+          <enum>Qt::NoFocus</enum>
+         </property>
+         <property name="text">
+          <string/>
+         </property>
+         <property name="icon">
+          <iconset resource="resources.qrc">
+           <normaloff>:/icons/icons/filter_cat.png</normaloff>:/icons/icons/filter_cat.png</iconset>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QPushButton" name="btn_Sort">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="focusPolicy">
+          <enum>Qt::NoFocus</enum>
+         </property>
+         <property name="text">
+          <string/>
+         </property>
+         <property name="icon">
+          <iconset resource="resources.qrc">
+           <normaloff>:/icons/icons/sort.png</normaloff>:/icons/icons/sort.png</iconset>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QPushButton" name="btn_Commit">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="focusPolicy">
+          <enum>Qt::NoFocus</enum>
+         </property>
+         <property name="text">
+          <string/>
+         </property>
+         <property name="icon">
+          <iconset resource="resources.qrc">
+           <normaloff>:/icons/icons/commit.png</normaloff>:/icons/icons/commit.png</iconset>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QMenuBar" name="menubar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>800</width>
+     <height>23</height>
+    </rect>
+   </property>
+   <widget class="QMenu" name="menuMenu">
+    <property name="title">
+     <string>Menu</string>
+    </property>
+    <addaction name="actionHelp"/>
+    <addaction name="actionView_log"/>
+    <addaction name="actionSearch"/>
+    <addaction name="actionUpgrade_all"/>
+    <addaction name="actionRestore_all"/>
+    <addaction name="actionClear_selections"/>
+    <addaction name="actionLoad_selections"/>
+    <addaction name="actionSave_selections"/>
+   </widget>
+   <addaction name="menuMenu"/>
+  </widget>
+  <action name="actionClear_selections">
+   <property name="text">
+    <string>Clear selections</string>
+   </property>
+  </action>
+  <action name="actionHelp">
+   <property name="text">
+    <string>Help</string>
+   </property>
+  </action>
+  <action name="actionSearch">
+   <property name="text">
+    <string>Search</string>
+   </property>
+  </action>
+  <action name="actionUpgrade_all">
+   <property name="text">
+    <string>Upgrade all</string>
+   </property>
+  </action>
+  <action name="actionView_log">
+   <property name="text">
+    <string>View log</string>
+   </property>
+  </action>
+  <action name="actionLoad_selections">
+   <property name="enabled">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Load selections</string>
+   </property>
+  </action>
+  <action name="actionSave_selections">
+   <property name="enabled">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Store selections</string>
+   </property>
+  </action>
+  <action name="actionRestore_all">
+   <property name="text">
+    <string>Restore all</string>
+   </property>
+  </action>
+ </widget>
+ <resources>
+  <include location="resources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/repoedit.cpp b/repoedit.cpp
new file mode 100644 (file)
index 0000000..78f1742
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#include "repoedit.h"
+#include "ui_repoedit.h"
+#include "repository.h"
+#include "confirmdialog.h"
+#include "aaptinterface.h"
+
+RepoEdit::RepoEdit(AAptInterface* apt, Repository* repo, int pos, QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::RepoEdit)
+{
+    ui->setupUi(this);
+       iRepo = repo;
+       iPos = pos;
+       iAptInterface = apt;
+
+       ui->lineEdit_name->setText( iRepo->name() );
+       ui->lineEdit_url->setText( iRepo->url()+iRepo->dir() );
+       ui->lineEdit_components->setText( iRepo->components() );
+       ui->lineEdit_dist->setText( iRepo->dist() );
+       ui->checkBox_Enabled->setChecked( iRepo->enabled() );
+       iRevertEnabledTo = iRepo->enabled();
+
+       on_lineEdit_name_textEdited("");
+}
+
+RepoEdit::~RepoEdit()
+{
+    delete ui;
+}
+
+void RepoEdit::changeEvent(QEvent *e)
+{
+    QDialog::changeEvent(e);
+    switch (e->type()) {
+    case QEvent::LanguageChange:
+        ui->retranslateUi(this);
+        break;
+    default:
+        break;
+    }
+}
+
+void RepoEdit::on_btn_OK_clicked()
+{
+               iRepo->set( ui->lineEdit_name->text(), ui->lineEdit_url->text(),
+                                       ui->lineEdit_dist->text(), ui->lineEdit_components->text(),
+                                       ui->checkBox_Enabled->isChecked() );
+
+               accept();
+}
+
+void RepoEdit::on_btn_Delete_clicked()
+{
+       ConfirmDialog d(true, this);
+       d.setText("Confirmation","Really delete this repository?");
+       if( d.exec() ) {
+
+               if( iRepo ) {
+                       delete iRepo;
+                       iAptInterface->repositories()->removeAt(iPos);
+                       iRepo = 0;
+               }
+
+               accept();
+       }
+}
+
+void RepoEdit::on_lineEdit_name_textEdited(QString )
+{
+       QString n = ui->lineEdit_name->text();
+       QString u = ui->lineEdit_url->text();
+
+       if( n == "" || u == "" ) {
+               ui->btn_OK->setEnabled(false);
+               ui->checkBox_Enabled->setEnabled(false);
+               ui->checkBox_Enabled->setChecked(false);
+               return;
+       }
+
+       if( !u.contains("://") ) {
+               ui->btn_OK->setEnabled(false);
+               ui->checkBox_Enabled->setEnabled(false);
+               ui->checkBox_Enabled->setChecked(false);
+               return;
+       }
+
+       ui->btn_OK->setEnabled(true);
+       ui->checkBox_Enabled->setEnabled(true);
+       ui->checkBox_Enabled->setChecked(iRevertEnabledTo);
+}
+
+void RepoEdit::on_lineEdit_url_textEdited(QString )
+{
+       on_lineEdit_name_textEdited("");
+}
+
+void RepoEdit::on_checkBox_Enabled_clicked()
+{
+       iRevertEnabledTo = ui->checkBox_Enabled->isChecked();
+}
diff --git a/repoedit.h b/repoedit.h
new file mode 100644 (file)
index 0000000..2a14c31
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#ifndef REPOEDIT_H
+#define REPOEDIT_H
+
+#include <QDialog>
+
+class Repository;
+class AAptInterface;
+
+namespace Ui {
+    class RepoEdit;
+}
+
+class RepoEdit : public QDialog
+{
+    Q_OBJECT
+
+public:
+       explicit RepoEdit(AAptInterface* apt, Repository* repo, int pos, QWidget *parent = 0);
+    ~RepoEdit();
+#ifdef Q_WS_MAEMO_5            // workaround for buggy Qt autorotation
+       int exec() {
+               QRect r = dynamic_cast<QWidget*>(this->parent())->rect();
+               if(r.width() < r.height())
+                       this->setAttribute(Qt::WA_Maemo5PortraitOrientation);
+               int e = QDialog::exec();
+               this->setAttribute(Qt::WA_Maemo5AutoOrientation);
+               return e;
+       }
+#endif
+
+
+protected:
+    void changeEvent(QEvent *e);
+
+private:
+    Ui::RepoEdit *ui;
+       Repository* iRepo;
+       int iPos;
+       AAptInterface* iAptInterface;
+       bool iRevertEnabledTo;
+
+
+private slots:
+       void on_checkBox_Enabled_clicked();
+       void on_lineEdit_url_textEdited(QString );
+       void on_lineEdit_name_textEdited(QString );
+       void on_btn_Delete_clicked();
+       void on_btn_OK_clicked();
+};
+
+#endif // REPOEDIT_H
diff --git a/repoedit.ui b/repoedit.ui
new file mode 100644 (file)
index 0000000..ca076f0
--- /dev/null
@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>RepoEdit</class>
+ <widget class="QDialog" name="RepoEdit">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>626</width>
+    <height>390</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Edit repository</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>2</number>
+   </property>
+   <property name="leftMargin">
+    <number>6</number>
+   </property>
+   <property name="topMargin">
+    <number>4</number>
+   </property>
+   <property name="rightMargin">
+    <number>6</number>
+   </property>
+   <property name="bottomMargin">
+    <number>4</number>
+   </property>
+   <item>
+    <widget class="QScrollArea" name="scrollArea">
+     <property name="widgetResizable">
+      <bool>true</bool>
+     </property>
+     <widget class="QWidget" name="scrollAreaWidgetContents">
+      <property name="geometry">
+       <rect>
+        <x>0</x>
+        <y>0</y>
+        <width>612</width>
+        <height>349</height>
+       </rect>
+      </property>
+      <layout class="QGridLayout" name="gridLayout">
+       <property name="margin">
+        <number>2</number>
+       </property>
+       <property name="spacing">
+        <number>4</number>
+       </property>
+       <item row="0" column="0">
+        <widget class="QLabel" name="label_name">
+         <property name="text">
+          <string>Name</string>
+         </property>
+        </widget>
+       </item>
+       <item row="0" column="1">
+        <widget class="QLineEdit" name="lineEdit_name">
+         <property name="inputMethodHints">
+          <set>Qt::ImhNoAutoUppercase|Qt::ImhPreferLowercase</set>
+         </property>
+        </widget>
+       </item>
+       <item row="1" column="0">
+        <widget class="QLabel" name="label_url">
+         <property name="text">
+          <string>URL</string>
+         </property>
+        </widget>
+       </item>
+       <item row="1" column="1">
+        <widget class="QLineEdit" name="lineEdit_url">
+         <property name="inputMethodHints">
+          <set>Qt::ImhNoAutoUppercase|Qt::ImhPreferLowercase|Qt::ImhUrlCharactersOnly</set>
+         </property>
+        </widget>
+       </item>
+       <item row="2" column="0">
+        <widget class="QLabel" name="label_dist">
+         <property name="text">
+          <string>Distribution</string>
+         </property>
+        </widget>
+       </item>
+       <item row="2" column="1">
+        <widget class="QLineEdit" name="lineEdit_dist">
+         <property name="inputMethodHints">
+          <set>Qt::ImhNoAutoUppercase|Qt::ImhPreferLowercase</set>
+         </property>
+        </widget>
+       </item>
+       <item row="3" column="0">
+        <widget class="QLabel" name="label_components">
+         <property name="text">
+          <string>Components</string>
+         </property>
+        </widget>
+       </item>
+       <item row="3" column="1">
+        <widget class="QLineEdit" name="lineEdit_components">
+         <property name="inputMethodHints">
+          <set>Qt::ImhNoAutoUppercase|Qt::ImhPreferLowercase</set>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QPushButton" name="btn_Delete">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="focusPolicy">
+        <enum>Qt::NoFocus</enum>
+       </property>
+       <property name="text">
+        <string>Delete</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QCheckBox" name="checkBox_Enabled">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="focusPolicy">
+        <enum>Qt::NoFocus</enum>
+       </property>
+       <property name="text">
+        <string>Enabled</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="btn_OK">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="focusPolicy">
+        <enum>Qt::NoFocus</enum>
+       </property>
+       <property name="text">
+        <string>OK</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/repository.cpp b/repository.cpp
new file mode 100644 (file)
index 0000000..b2b2cf1
--- /dev/null
@@ -0,0 +1,171 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#include <QtGui>
+#include "repository.h"
+#include "package.h"
+#include "aaptinterface.h"
+
+Repository::Repository()
+{
+       iEnabled = false;
+}
+
+QString Repository::toString()
+{
+       QString str;
+       if( iEnabled )
+               str = "deb ";
+       else
+               str = "#deb ";
+
+       str += iUrl + iDir + " " + iDist + " " + iComponents;
+
+       return( str.trimmed() );
+}
+
+QStringList Repository::toListFileNames()
+{
+       QStringList names;
+
+       QStringList com = iComponents.split(' ');
+       QString disttext;
+       if( com.count()==0 )
+               com << "";
+       for( int i=0; i<com.count(); i++ ) {
+               QString chopUrl = iUrl.mid( iUrl.indexOf("://")+3 );
+               if( com.at(i)!="" )
+                       disttext = "dists_";
+               else
+                       disttext = "_";
+               QString str = chopUrl + iDir + disttext + iDist + "_" + com.at(i);
+               if( com.at(i)!="" )
+                       str += "_binary-armel_Packages";
+               else
+                       str += "_Packages";
+               str.replace('/','_');
+               str.replace("___","_");
+               str.replace("__","_");
+               names << str;
+       }
+
+       return names;
+}
+
+bool Repository::setFromString(QString repo)
+{
+       QStringList parts = repo.trimmed().split(' ');
+       if( parts.count() < 3 )
+               return false;
+
+       if( parts.at(0) == "deb" ) {
+               iEnabled=true;
+       } else if( parts.at(0) == "#deb" ) {
+               iEnabled=false;
+       } else {
+               return false;
+       }
+
+       if( parts.at(1).indexOf("://") == -1 )
+               return false;
+       int d = parts.at(1).indexOf('/', parts.at(1).indexOf("://")+3 );
+       if( d==-1 ) {
+               iUrl = parts.at(1);
+               iDir = "";
+       } else {
+               iUrl = parts.at(1).left(d+1);
+               iDir = parts.at(1).right( parts.at(1).length()-d-1 );
+       }
+
+       if( parts.at(2)!="" )
+               iDist = parts.at(2);
+       else
+               return false;
+
+       iComponents="";
+       if( parts.count()>3 ) {
+               for(int i=3; i<parts.count(); i++)
+                       iComponents += parts.at(i) + " ";
+               iComponents = iComponents.trimmed();
+       }
+
+       if( iDir != "" ) {
+               iName = iDir;
+               iName = iName.replace('/',' ').trimmed();
+       } else if( iDist != "" ) {
+               iName = iDist;
+               iName = iName.replace('/',' ').trimmed();
+       } else {
+               iName = "Unknown";
+       }
+
+       /*
+       qDebug() << repo << "\n"
+                       << iName << "\n"
+                       << iUrl << "\n"
+                       << iDir << "\n"
+                       << iDist << "\n"
+                       << iComponents << "\n"
+                       << iEnabled << "\n"
+                       << toString() << "\n"; */
+
+       set( iName, iUrl, iDir, iDist, iComponents, iEnabled );  // performs further sanity checks
+
+       return true;
+}
+
+void Repository::set(QString name, QString url_dir, QString dist, QString components, bool enabled)
+{
+       QString url;
+       QString dir;
+
+       if( url_dir.indexOf("://") == -1 )
+               return;
+       int d = url_dir.indexOf('/', url_dir.indexOf("://")+3 );
+       if( d==-1 ) {
+               url = url_dir;
+               dir = "";
+       } else {
+               url = url_dir.left(d+1);
+               dir = url_dir.right( url_dir.length()-d-1 );
+       }
+
+       set( name, url, dir, dist, components, enabled );
+}
+
+void Repository::set(QString name, QString url, QString dir, QString dist, QString components, bool enabled)
+{
+       iName = name.trimmed();
+       iUrl = url.trimmed();
+       if( !iUrl.contains("://") )
+               iUrl.prepend("http://");
+       if( !iUrl.endsWith('/') )
+               iUrl.append('/');
+       iDir = dir.trimmed();
+       if( !iDir.endsWith('/') && iDir!="" )
+               iDir.append('/');
+       iDist = dist.trimmed();
+       iComponents = components.trimmed();
+       iEnabled = enabled;
+
+       // ensure that the protocol part of the URL is lowercase
+       int pos = iUrl.indexOf("://");
+       QString proto = iUrl.left(pos);
+       iUrl = proto.toLower() + iUrl.mid(pos);
+}
diff --git a/repository.h b/repository.h
new file mode 100644 (file)
index 0000000..ec48f1b
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#ifndef REPOSITORY_H
+#define REPOSITORY_H
+
+#include <QtCore>
+class Package;
+class AAptInterface;
+
+class Repository
+{
+public:
+       Repository();
+
+       void setName(QString n_) { iName=n_; }
+       void setEnabled(bool e_) { iEnabled=e_; }
+
+       QString name() { return iName; }
+       QString url() { return iUrl; }
+       QString dir() { return iDir; }
+       QString dist() { return iDist; }
+       QString components() { return iComponents; }
+       bool enabled() { return iEnabled; }
+       QString toString();
+       QStringList toListFileNames();
+       bool setFromString(QString repo);
+       void set(QString name, QString url, QString dir_dist, QString components, bool enabled);
+       void set(QString name, QString url, QString dir, QString dist, QString components, bool enabled);
+
+private:
+       QString iName;
+       QString iUrl;
+       QString iDir;
+       QString iDist;
+       QString iComponents;
+       bool iEnabled;
+};
+
+#endif // REPOSITORY_H
diff --git a/repoview.cpp b/repoview.cpp
new file mode 100644 (file)
index 0000000..b848b00
--- /dev/null
@@ -0,0 +1,127 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#include <QtGui>
+#include "repoview.h"
+#include "ui_repoview.h"
+#include "mainwindow.h"
+#include "aaptinterface.h"
+#include "confirmdialog.h"
+#include "repository.h"
+#include "repoedit.h"
+
+RepoView::RepoView(QWidget *parent) :
+    QMainWindow(parent),
+    ui(new Ui::RepoView)
+{
+       iMainWindow = dynamic_cast<MainWindow*>(parent);
+       ui->setupUi(this);
+#ifdef Q_WS_MAEMO_5
+       this->setAttribute(Qt::WA_Maemo5StackedWindow);
+       this->setWindowFlags(Qt::Window);
+       this->setAttribute(Qt::WA_Maemo5AutoOrientation);
+#endif
+
+       iModified = false;
+}
+
+RepoView::~RepoView()
+{
+    delete ui;
+}
+
+void RepoView::changeEvent(QEvent *e)
+{
+    QMainWindow::changeEvent(e);
+    switch (e->type()) {
+    case QEvent::LanguageChange:
+        ui->retranslateUi(this);
+        break;
+    default:
+        break;
+    }
+}
+
+void RepoView::openWin()
+{
+       if( !isVisible() ) {
+               iModified = false;
+       }
+
+       ui->listWidget->clear();
+
+       for( int i=0; i<iAptInterface->repositories()->count(); i++ )
+       {
+               QListWidgetItem* l = new QListWidgetItem( ui->listWidget );
+               if( iAptInterface->repositories()->at(i)->enabled() )
+                       l->setIcon(QPixmap(":/icons/icons/pkg_install.png"));
+               else
+                       l->setIcon(QPixmap(":/icons/icons/pkg_remove.png"));
+               l->setText( iAptInterface->repositories()->at(i)->name() );
+               l->setData(Qt::UserRole, i);
+               ui->listWidget->addItem( l );
+       }
+
+       show();
+}
+
+void RepoView::closeEvent(QCloseEvent *event)
+{
+       event->accept();
+
+       if( iModified )
+       {
+               iAptInterface->writeRepositories();
+               iMainWindow->on_btnUpdate_clicked();
+       }
+}
+
+void RepoView::on_btnNew_clicked()
+{
+       Repository* n = new Repository();
+       iAptInterface->repositories()->append(n);
+
+       // add an option to set these directly
+       //"deb http://repository.maemo.org/extras-testing/ fremantle free non-free"
+       //"deb http://repository.maemo.org/extras-devel/ fremantle free non-free";
+
+       RepoEdit e(iAptInterface, n, iAptInterface->repositories()->count()-1, this);
+       if( !e.exec() ) {
+               if( n ) {
+                       delete n;
+                       iAptInterface->repositories()->removeAt( iAptInterface->repositories()->count()-1 );
+                       n=0;
+               }
+       } else {
+               iModified = true;
+       }
+
+       openWin();
+}
+
+void RepoView::on_listWidget_itemClicked(QListWidgetItem* item)
+{
+       Repository* r = iAptInterface->repositories()->at( item->data(Qt::UserRole).toInt() );
+       if( r!=0 ) {
+               RepoEdit e(iAptInterface, r, item->data(Qt::UserRole).toInt(), this);
+               if( e.exec() )
+                       iModified = true;
+               openWin();
+       }
+}
diff --git a/repoview.h b/repoview.h
new file mode 100644 (file)
index 0000000..15811d8
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#ifndef REPOVIEW_H
+#define REPOVIEW_H
+
+#include <QtGui>
+
+class MainWindow;
+class AAptInterface;
+
+namespace Ui {
+    class RepoView;
+}
+
+class RepoView : public QMainWindow
+{
+    Q_OBJECT
+
+public:
+    explicit RepoView(QWidget *parent = 0);
+    ~RepoView();
+       void setAptInterface(AAptInterface* a_) { iAptInterface = a_; }
+       void openWin();
+       void closeEvent(QCloseEvent *event);
+
+#ifdef Q_WS_MAEMO_5            // workaround for buggy Qt autorotation
+       void show() {
+               if( !isVisible() ) {
+                       QRect r = dynamic_cast<QMainWindow*>(this->parent())->rect();
+                       if(r.width() < r.height())
+                               this->setAttribute(Qt::WA_Maemo5PortraitOrientation);
+                       else {
+                               if( dynamic_cast<QMainWindow*>(this->parent())->testAttribute( Qt::WA_Maemo5AutoOrientation ) )
+                                       this->setAttribute( Qt::WA_Maemo5AutoOrientation );
+                               else
+                                       this->setAttribute( Qt::WA_Maemo5LandscapeOrientation );
+                       }
+                       this->setAttribute(Qt::WA_Maemo5StackedWindow);
+                       this->setWindowFlags(Qt::Window);
+               }
+               QMainWindow::show();
+       }
+#endif
+
+
+protected:
+    void changeEvent(QEvent *e);
+
+private:
+    Ui::RepoView *ui;
+       bool iModified;
+
+       MainWindow* iMainWindow;
+       AAptInterface* iAptInterface;
+
+private slots:
+       void on_listWidget_itemClicked(QListWidgetItem* item);
+       void on_btnNew_clicked();
+};
+
+#endif // REPOVIEW_H
diff --git a/repoview.ui b/repoview.ui
new file mode 100644 (file)
index 0000000..5b692dc
--- /dev/null
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>RepoView</class>
+ <widget class="QMainWindow" name="RepoView">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>800</width>
+    <height>480</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Repositories</string>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <layout class="QVBoxLayout" name="verticalLayout">
+    <property name="spacing">
+     <number>4</number>
+    </property>
+    <property name="margin">
+     <number>4</number>
+    </property>
+    <item>
+     <widget class="QListWidget" name="listWidget">
+      <property name="editTriggers">
+       <set>QAbstractItemView::NoEditTriggers</set>
+      </property>
+      <property name="showDropIndicator" stdset="0">
+       <bool>false</bool>
+      </property>
+      <property name="selectionMode">
+       <enum>QAbstractItemView::NoSelection</enum>
+      </property>
+      <property name="textElideMode">
+       <enum>Qt::ElideRight</enum>
+      </property>
+      <property name="resizeMode">
+       <enum>QListView::Adjust</enum>
+      </property>
+      <property name="sortingEnabled">
+       <bool>false</bool>
+      </property>
+     </widget>
+    </item>
+    <item>
+     <layout class="QHBoxLayout" name="horizontalLayout">
+      <item>
+       <widget class="QPushButton" name="btnNew">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="text">
+         <string>New</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <spacer name="horizontalSpacer">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>40</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+     </layout>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QMenuBar" name="menubar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>800</width>
+     <height>23</height>
+    </rect>
+   </property>
+  </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/resources.qrc b/resources.qrc
new file mode 100644 (file)
index 0000000..ce28cb0
--- /dev/null
@@ -0,0 +1,24 @@
+<RCC>
+    <qresource prefix="/icons">
+        <file>icons/commit.png</file>
+        <file>icons/install.png</file>
+        <file>icons/remove.png</file>
+        <file>icons/update.png</file>
+        <file>icons/upgrade.png</file>
+        <file>icons/appdefault.png</file>
+        <file>icons/filter_cat.png</file>
+        <file>icons/filter_stat.png</file>
+        <file>icons/fapman.png</file>
+        <file>icons/pkg_install.png</file>
+        <file>icons/pkg_remove.png</file>
+        <file>icons/pkg_upgrade.png</file>
+        <file>icons/pkg_nop_installed.png</file>
+        <file>icons/pkg_nop_instupgr.png</file>
+        <file>icons/pkg_nop_notinstalled.png</file>
+        <file>icons/close.png</file>
+        <file>icons/sort.png</file>
+        <file>icons/blacklist.png</file>
+        <file>icons/repos.png</file>
+        <file>icons/searchoptions.png</file>
+    </qresource>
+</RCC>
diff --git a/rotatingbackground.cpp b/rotatingbackground.cpp
new file mode 100644 (file)
index 0000000..13da33b
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#include <QtGui>
+#include "rotatingbackground.h"
+
+RotatingBackground::RotatingBackground(QWidget *parent) :
+    QWidget(parent)
+{
+       connect(QApplication::desktop(), SIGNAL(resized(int)), this, SLOT(orientationChanged()));
+}
+
+void RotatingBackground::loadWallpaper()
+{
+       QString loadfile = "/home/user/.backgrounds/background-1.png";
+       QFileInfo custombg("/root/.fapman/wallpaper.png");
+       bool custom = false;
+       if( custombg.exists() ) {
+               loadfile = "/root/.fapman/wallpaper.png";
+               custom = true;
+       }
+
+       iWallpaperLandscape.load(loadfile);
+       if( !iWallpaperLandscape.isNull() ) {
+               QTransform t;
+               t.rotate(90);
+               iWallpaperPortrait = iWallpaperLandscape.transformed(t);
+       }
+
+       if( !custom && !iWallpaperLandscape.isNull() && !iWallpaperPortrait.isNull() )
+       {
+               QPainter l( &iWallpaperLandscape );
+               QPainter p( &iWallpaperPortrait );
+
+               QColor dim("black");
+               dim.setAlpha(170);
+               l.setBrush(dim);
+               l.setPen(dim);
+               p.setBrush(dim);
+               p.setPen(dim);
+
+               l.drawRect( 0, 0, iWallpaperLandscape.rect().width(), iWallpaperLandscape.rect().height() );
+               p.drawRect( 0, 0, iWallpaperPortrait.rect().width(), iWallpaperPortrait.rect().height() );
+       }
+}
+
+void RotatingBackground::paintEvent(QPaintEvent *)
+{
+       QPainter painter(this);
+
+       painter.setPen( QApplication::palette().color(QPalette::Window) );
+       painter.setBrush( QApplication::palette().color(QPalette::Window) );
+       painter.drawRect(rect());
+
+       if( rect().width() > rect().height() ) {
+               if( !iWallpaperLandscape.isNull() )
+                       painter.drawPixmap(0,0,rect().width(), rect().height(),iWallpaperLandscape);
+       } else {
+               if( !iWallpaperPortrait.isNull() )
+                       painter.drawPixmap(0,0,rect().width(), rect().height(),iWallpaperPortrait);
+       }
+}
+
+void RotatingBackground::resizeEvent(QResizeEvent *)
+{
+       this->resize( dynamic_cast<QWidget*>(parent())->size() );
+}
+
+void RotatingBackground::orientationChanged()
+{
+       resizeEvent(0);
+}
diff --git a/rotatingbackground.h b/rotatingbackground.h
new file mode 100644 (file)
index 0000000..9d6a05a
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#ifndef ROTATINGBACKGROUND_H
+#define ROTATINGBACKGROUND_H
+
+#include <QWidget>
+
+class RotatingBackground : public QWidget
+{
+    Q_OBJECT
+public:
+    explicit RotatingBackground(QWidget *parent = 0);
+       void loadWallpaper();
+       void paintEvent(QPaintEvent *);
+       void resizeEvent(QResizeEvent *);
+
+public slots:
+       void orientationChanged();
+
+private:
+       QPixmap iWallpaperLandscape;
+       QPixmap iWallpaperPortrait;
+};
+
+#endif // ROTATINGBACKGROUND_H
diff --git a/searchoptions.cpp b/searchoptions.cpp
new file mode 100644 (file)
index 0000000..f906245
--- /dev/null
@@ -0,0 +1,61 @@
+#include "searchoptions.h"
+#include "ui_searchoptions.h"
+
+SearchOptions::SearchOptions(QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::SearchOptions)
+{
+    ui->setupUi(this);
+}
+
+SearchOptions::~SearchOptions()
+{
+    delete ui;
+}
+
+void SearchOptions::changeEvent(QEvent *e)
+{
+    QDialog::changeEvent(e);
+    switch (e->type()) {
+    case QEvent::LanguageChange:
+        ui->retranslateUi(this);
+        break;
+    default:
+        break;
+    }
+}
+
+void SearchOptions::setSelections(bool pkgname, bool dispname, bool dshort, bool dlong)
+{
+       ui->checkBox_pkgname->setChecked(pkgname);
+       ui->checkBox_displayname->setChecked(dispname);
+       ui->checkBox_descshort->setChecked(dshort);
+       ui->checkBox_desclong->setChecked(dlong);
+}
+
+bool SearchOptions::searchPkgName()
+{
+       return ui->checkBox_pkgname->isChecked();
+}
+
+bool SearchOptions::searchDisplayName()
+{
+       if( !ui->checkBox_pkgname->isChecked() &&
+               !ui->checkBox_descshort->isChecked() &&
+               !ui->checkBox_desclong->isChecked() )
+       {
+               return true;
+       }
+
+       return ui->checkBox_displayname->isChecked();
+}
+
+bool SearchOptions::searchDescShort()
+{
+       return ui->checkBox_descshort->isChecked();
+}
+
+bool SearchOptions::searchDescLong()
+{
+       return ui->checkBox_desclong->isChecked();
+}
diff --git a/searchoptions.h b/searchoptions.h
new file mode 100644 (file)
index 0000000..99ea6ed
--- /dev/null
@@ -0,0 +1,31 @@
+#ifndef SEARCHOPTIONS_H
+#define SEARCHOPTIONS_H
+
+#include <QDialog>
+
+namespace Ui {
+    class SearchOptions;
+}
+
+class SearchOptions : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit SearchOptions(QWidget *parent = 0);
+    ~SearchOptions();
+
+       void setSelections(bool pkgname, bool dispname, bool dshort, bool dlong);
+       bool searchPkgName();
+       bool searchDisplayName();
+       bool searchDescShort();
+       bool searchDescLong();
+
+protected:
+    void changeEvent(QEvent *e);
+
+private:
+    Ui::SearchOptions *ui;
+};
+
+#endif // SEARCHOPTIONS_H
diff --git a/searchoptions.ui b/searchoptions.ui
new file mode 100644 (file)
index 0000000..3ac1583
--- /dev/null
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SearchOptions</class>
+ <widget class="QDialog" name="SearchOptions">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>475</width>
+    <height>124</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Search from...</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <property name="margin">
+    <number>3</number>
+   </property>
+   <item row="0" column="0">
+    <widget class="QCheckBox" name="checkBox_pkgname">
+     <property name="text">
+      <string>Package name</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="1">
+    <widget class="QCheckBox" name="checkBox_displayname">
+     <property name="text">
+      <string>Display name</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="0">
+    <widget class="QCheckBox" name="checkBox_descshort">
+     <property name="text">
+      <string>Short description</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="1">
+    <widget class="QCheckBox" name="checkBox_desclong">
+     <property name="text">
+      <string>Long description</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="0" colspan="2">
+    <widget class="QPushButton" name="pushButton_ok">
+     <property name="text">
+      <string>Ok</string>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>pushButton_ok</sender>
+   <signal>clicked()</signal>
+   <receiver>SearchOptions</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>237</x>
+     <y>92</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>237</x>
+     <y>61</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/settings.cpp b/settings.cpp
new file mode 100644 (file)
index 0000000..c26a96c
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#include "settings.h"
+#include "ui_settings.h"
+#include "mainwindow.h"
+#include "aaptinterface.h"
+#include "packageview.h"
+#include "confirmdialog.h"
+#include "searchoptions.h"
+
+Settings::Settings(QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::Settings)
+{
+    ui->setupUi(this);
+
+       iAptInterface = 0;
+       iQSettings = new QSettings("/root/.fapman/settings.ini",QSettings::IniFormat);
+}
+
+Settings::~Settings()
+{
+       iQSettings->sync();
+       delete iQSettings;
+    delete ui;
+}
+
+void Settings::changeEvent(QEvent *e)
+{
+    QDialog::changeEvent(e);
+    switch (e->type()) {
+    case QEvent::LanguageChange:
+        ui->retranslateUi(this);
+        break;
+    default:
+        break;
+    }
+}
+
+void Settings::openWin()
+{
+       ui->checkBox_fetchdates->setChecked( iQSettings->value("fetch_dates", false).toBool() );
+       ui->checkBox_autorotation->setChecked( iQSettings->value("disable_autorotation", false).toBool() );
+       ui->checkBox_autoremove->setChecked( iQSettings->value("enable_autoremove", true).toBool() );
+       ui->checkBox_autoclean->setChecked( iQSettings->value("enable_autoclean", true).toBool() );
+       ui->checkBox_remove_readfull->setChecked( iQSettings->value("remove_readfull", false).toBool() );
+
+       ui->checkBox_proxies->setChecked( iQSettings->value("use_proxies", false).toBool() );
+       ui->lineEdit_http_proxy->setText( iQSettings->value("http_proxy","").toString() );
+       ui->lineEdit_https_proxy->setText( iQSettings->value("https_proxy","").toString() );
+
+       ui->comboBox_sortorder->setCurrentIndex( iQSettings->value("default_sort_order",0).toInt() );
+
+       ui->checkBox_playsound->setChecked( iQSettings->value("sound_notify", false).toBool() );
+       ui->lineEdit_soundfile->setText( iQSettings->value("sound_file","/usr/share/sounds/ui-operation_ready.wav").toString() );
+
+       open();
+}
+
+void Settings::on_btn_OK_clicked()
+{
+       if( ui->checkBox_fetchdates->isChecked() != iQSettings->value("fetch_dates",false).toBool() && iAptInterface ) {
+               iAptInterface->setNeedRefresh(-1,-1,-1,1);
+       }
+       if( ui->comboBox_sortorder->currentIndex() != iQSettings->value("default_sort_order",0).toInt() ) {
+               iPackageView->setSortOrder( (PackageView::sortOrder)ui->comboBox_sortorder->currentIndex() );
+       }
+
+       iQSettings->setValue("fetch_dates", ui->checkBox_fetchdates->isChecked() );
+       iQSettings->setValue("disable_autorotation", ui->checkBox_autorotation->isChecked() );
+       iQSettings->setValue("enable_autoremove", ui->checkBox_autoremove->isChecked() );
+       iQSettings->setValue("enable_autoclean", ui->checkBox_autoclean->isChecked() );
+       iQSettings->setValue("remove_readfull", ui->checkBox_remove_readfull->isChecked() );
+
+       iQSettings->setValue("use_proxies", ui->checkBox_proxies->isChecked() );
+       iQSettings->setValue("http_proxy", ui->lineEdit_http_proxy->text() );
+       iQSettings->setValue("https_proxy", ui->lineEdit_https_proxy->text() );
+
+       iQSettings->setValue("default_sort_order", ui->comboBox_sortorder->currentIndex() );
+
+       iQSettings->setValue("sound_notify", ui->checkBox_playsound->isChecked() );
+       iQSettings->setValue("sound_file", ui->lineEdit_soundfile->text() );
+
+       if( ui->comboBox_sortorder->currentIndex() == (int)PackageView::SortDateDesc && !ui->checkBox_fetchdates->isChecked() ) {
+               iQSettings->setValue("fetch_dates", true );
+               iAptInterface->setNeedRefresh(-1,-1,-1,1);
+
+               ConfirmDialog d(false, this);
+               d.setText("Notice","You have selected date as the default sorting criterion. Fetching dates has been automatically enabled.");
+               d.exec();
+       }
+
+#ifdef Q_WS_MAEMO_5
+       if( !iQSettings->value("disable_autorotation",false).toBool() ) {
+               dynamic_cast<MainWindow*>(this->parent())->setAttribute(Qt::WA_Maemo5AutoOrientation);
+       } else {
+               dynamic_cast<MainWindow*>(this->parent())->setAttribute(Qt::WA_Maemo5LandscapeOrientation);
+       }
+#endif
+
+       accept();
+}
+
+void Settings::on_pushButton_picksound_clicked()
+{
+       //QFileInfo i( ui->lineEdit_soundfile->text() );
+       QString f = QFileDialog::getOpenFileName(this, "Select sound file", "/", "Audio (*.wav *.mp3 *.ogg)");
+       if( !f.isNull() ) {
+               ui->lineEdit_soundfile->setText(f);
+       }
+}
+
+void Settings::on_pushButton_searchOptions_clicked()
+{
+       SearchOptions s(this);
+       s.setSelections( iQSettings->value("search_pkgnames",true).toBool(),
+                                        iQSettings->value("search_displaynames",true).toBool(),
+                                        iQSettings->value("search_descshort",true).toBool(),
+                                        iQSettings->value("search_desclong",false).toBool() );
+       if( s.exec() )
+       {
+               iQSettings->setValue("search_pkgnames", s.searchPkgName() );
+               iQSettings->setValue("search_displaynames", s.searchDisplayName() );
+               iQSettings->setValue("search_descshort", s.searchDescShort() );
+               iQSettings->setValue("search_desclong", s.searchDescLong() );
+
+               iPackageView->setSearchOptions(s.searchPkgName(), s.searchDisplayName(),
+                                                                          s.searchDescShort(), s.searchDescLong() );
+       }
+}
diff --git a/settings.h b/settings.h
new file mode 100644 (file)
index 0000000..3a696fa
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#ifndef SETTINGS_H
+#define SETTINGS_H
+
+#include <QtGui>
+
+class AAptInterface;
+class PackageView;
+
+namespace Ui {
+    class Settings;
+}
+
+class Settings : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit Settings(QWidget *parent = 0);
+    ~Settings();
+       void openWin();
+       void setAptInterface(AAptInterface* apt) { iAptInterface=apt; }
+       void setPackageView(PackageView* v_) { iPackageView=v_; }
+
+#ifdef Q_WS_MAEMO_5            // workaround for buggy Qt autorotation
+       void open() {
+               QRect r = dynamic_cast<QWidget*>(this->parent())->rect();
+               if(r.width() < r.height())
+                       this->setAttribute(Qt::WA_Maemo5PortraitOrientation);
+               else {
+                       if( dynamic_cast<QWidget*>(this->parent())->testAttribute( Qt::WA_Maemo5AutoOrientation ) )
+                               this->setAttribute( Qt::WA_Maemo5AutoOrientation );
+                       else
+                               this->setAttribute( Qt::WA_Maemo5LandscapeOrientation );
+               }
+               QDialog::open();
+       }
+#endif
+
+       QSettings* qsettings() { return iQSettings; }
+
+protected:
+    void changeEvent(QEvent *e);
+
+private:
+    Ui::Settings *ui;
+       QSettings* iQSettings;
+       AAptInterface* iAptInterface;
+       PackageView* iPackageView;
+
+private slots:
+       void on_pushButton_searchOptions_clicked();
+ void on_pushButton_picksound_clicked();
+ void on_btn_OK_clicked();
+};
+
+#endif // SETTINGS_H
diff --git a/settings.ui b/settings.ui
new file mode 100644 (file)
index 0000000..b612d3c
--- /dev/null
@@ -0,0 +1,310 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Settings</class>
+ <widget class="QDialog" name="Settings">
+  <property name="windowModality">
+   <enum>Qt::ApplicationModal</enum>
+  </property>
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>700</width>
+    <height>700</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Options</string>
+  </property>
+  <property name="modal">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="leftMargin">
+    <number>6</number>
+   </property>
+   <property name="topMargin">
+    <number>2</number>
+   </property>
+   <property name="rightMargin">
+    <number>6</number>
+   </property>
+   <property name="bottomMargin">
+    <number>2</number>
+   </property>
+   <item>
+    <layout class="QVBoxLayout" name="verticalLayout_2">
+     <property name="spacing">
+      <number>0</number>
+     </property>
+     <item>
+      <widget class="QScrollArea" name="scrollArea">
+       <property name="widgetResizable">
+        <bool>true</bool>
+       </property>
+       <widget class="QWidget" name="scrollAreaWidgetContents">
+        <property name="geometry">
+         <rect>
+          <x>0</x>
+          <y>0</y>
+          <width>684</width>
+          <height>663</height>
+         </rect>
+        </property>
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <layout class="QVBoxLayout" name="verticalLayout_3">
+         <property name="spacing">
+          <number>6</number>
+         </property>
+         <property name="margin">
+          <number>0</number>
+         </property>
+         <item>
+          <widget class="QCheckBox" name="checkBox_fetchdates">
+           <property name="text">
+            <string>Fetch package dates</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QCheckBox" name="checkBox_autorotation">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string>Disable autorotation (lock to landscape)</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QCheckBox" name="checkBox_autoremove">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string>Autoremove unneeded (automatically
+installed) packages</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QCheckBox" name="checkBox_autoclean">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string>Automatically clean package cache
+after successful installation</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QCheckBox" name="checkBox_remove_readfull">
+           <property name="text">
+            <string>Read full package lists even when removing</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="Line" name="line">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLabel" name="label_4">
+           <property name="text">
+            <string>Default package sort order</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QComboBox" name="comboBox_sortorder">
+           <property name="editable">
+            <bool>false</bool>
+           </property>
+           <item>
+            <property name="text">
+             <string>Name (alphabetical)</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>Date (newest first)</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>Size (largest first)</string>
+            </property>
+           </item>
+          </widget>
+         </item>
+         <item>
+          <widget class="Line" name="line_3">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="pushButton_searchOptions">
+           <property name="text">
+            <string>Select default search options</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="Line" name="line_4">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLabel" name="label_3">
+           <property name="text">
+            <string>Proxies (example: http://username:password@host:port/)</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QCheckBox" name="checkBox_proxies">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string>Use proxies</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_2">
+           <item>
+            <widget class="QLabel" name="label">
+             <property name="text">
+              <string>HTTP proxy</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QLineEdit" name="lineEdit_http_proxy">
+             <property name="inputMethodHints">
+              <set>Qt::ImhNoAutoUppercase|Qt::ImhPreferLowercase|Qt::ImhUrlCharactersOnly</set>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </item>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_3">
+           <item>
+            <widget class="QLabel" name="label_2">
+             <property name="text">
+              <string>HTTPS proxy</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QLineEdit" name="lineEdit_https_proxy">
+             <property name="inputMethodHints">
+              <set>Qt::ImhNoAutoUppercase|Qt::ImhPreferLowercase|Qt::ImhUrlCharactersOnly</set>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </item>
+         <item>
+          <widget class="Line" name="line_2">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QCheckBox" name="checkBox_playsound">
+           <property name="text">
+            <string>Play sound when operations complete</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_4">
+           <item>
+            <widget class="QLineEdit" name="lineEdit_soundfile">
+             <property name="inputMethodHints">
+              <set>Qt::ImhNoAutoUppercase|Qt::ImhPreferLowercase</set>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QPushButton" name="pushButton_picksound">
+             <property name="text">
+              <string>Pick</string>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </item>
+        </layout>
+       </widget>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="btn_OK">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string>OK</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/sortselector.cpp b/sortselector.cpp
new file mode 100644 (file)
index 0000000..2c266ad
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#include "sortselector.h"
+#include "ui_sortselector.h"
+#include "packageview.h"
+
+SortSelector::SortSelector(PackageView::sortOrder currOrder, QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::SortSelector)
+{
+    ui->setupUi(this);
+
+       if( currOrder == PackageView::SortAlpha )
+               ui->radioButton_name->setChecked(true);
+       else if( currOrder == PackageView::SortDateDesc )
+               ui->radioButton_date->setChecked(true);
+       else if( currOrder == PackageView::SortSizeDesc )
+               ui->radioButton_size->setChecked(true);
+}
+
+SortSelector::~SortSelector()
+{
+    delete ui;
+}
+
+void SortSelector::changeEvent(QEvent *e)
+{
+    QDialog::changeEvent(e);
+    switch (e->type()) {
+    case QEvent::LanguageChange:
+        ui->retranslateUi(this);
+        break;
+    default:
+        break;
+    }
+}
+
+PackageView::sortOrder SortSelector::selectedOperation()
+{
+       if( ui->radioButton_name->isChecked() )
+               return PackageView::SortAlpha;
+       else if( ui->radioButton_date->isChecked() )
+               return PackageView::SortDateDesc;
+       else if( ui->radioButton_size->isChecked() )
+               return PackageView::SortSizeDesc;
+
+       return PackageView::SortAlpha;
+}
diff --git a/sortselector.h b/sortselector.h
new file mode 100644 (file)
index 0000000..adb1941
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+       This file is part of Faster Application Manager.
+
+       Faster Application Manager 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 3 of the License, or
+       (at your option) any later version.
+
+       Faster Application Manager 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 Faster Application Manager.  If not, see <http://www.gnu.org/licenses/>.
+
+       (C) Heikki Holstila 2010
+*/
+
+#ifndef SORTSELECTOR_H
+#define SORTSELECTOR_H
+
+#include <QDialog>
+#include "packageview.h"
+
+namespace Ui {
+    class SortSelector;
+}
+
+class SortSelector : public QDialog
+{
+    Q_OBJECT
+
+public:
+       explicit SortSelector(PackageView::sortOrder currOrder, QWidget *parent = 0);
+    ~SortSelector();
+#ifdef Q_WS_MAEMO_5            // workaround for buggy Qt autorotation
+       int exec() {
+               QRect r = dynamic_cast<QWidget*>(this->parent())->rect();
+               if(r.width() < r.height())
+                       this->setAttribute(Qt::WA_Maemo5PortraitOrientation);
+               int e = QDialog::exec();
+               this->setAttribute(Qt::WA_Maemo5AutoOrientation);
+               return e;
+       }
+#endif
+       PackageView::sortOrder selectedOperation();
+
+protected:
+    void changeEvent(QEvent *e);
+
+private:
+    Ui::SortSelector *ui;
+};
+
+#endif // SORTSELECTOR_H
diff --git a/sortselector.ui b/sortselector.ui
new file mode 100644 (file)
index 0000000..0f1f630
--- /dev/null
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SortSelector</class>
+ <widget class="QDialog" name="SortSelector">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>278</width>
+    <height>71</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Sort by</string>
+  </property>
+  <layout class="QHBoxLayout" name="horizontalLayout">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="margin">
+    <number>2</number>
+   </property>
+   <item>
+    <widget class="QRadioButton" name="radioButton_name">
+     <property name="text">
+      <string>Name</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QRadioButton" name="radioButton_date">
+     <property name="text">
+      <string>Date</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QRadioButton" name="radioButton_size">
+     <property name="text">
+      <string>Size</string>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>radioButton_date</sender>
+   <signal>clicked()</signal>
+   <receiver>SortSelector</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>138</x>
+     <y>34</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>138</x>
+     <y>35</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>radioButton_name</sender>
+   <signal>clicked()</signal>
+   <receiver>SortSelector</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>47</x>
+     <y>34</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>138</x>
+     <y>35</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>radioButton_size</sender>
+   <signal>clicked()</signal>
+   <receiver>SortSelector</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>230</x>
+     <y>34</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>138</x>
+     <y>35</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/updateversion.sh b/updateversion.sh
new file mode 100755 (executable)
index 0000000..add306b
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+ver=`pwd | cut -d - -f 2-`; echo "const QString PROGRAM_VERSION=\"$ver\";" > version.h
diff --git a/version.h b/version.h
new file mode 100644 (file)
index 0000000..40de00c
--- /dev/null
+++ b/version.h
@@ -0,0 +1 @@
+const QString PROGRAM_VERSION="0.6.4";