--- /dev/null
+ 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>.
--- /dev/null
+#############################################################################
+# 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:
+
--- /dev/null
+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)
--- /dev/null
+/*
+ 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;
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+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.
+
--- /dev/null
+/*
+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
--- /dev/null
+/*
+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);
+}
+ /*}}}*/
--- /dev/null
+/*
+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
--- /dev/null
+// -*- 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
--- /dev/null
+// -*- 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
--- /dev/null
+/*
+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 ⤅
+
+ 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
--- /dev/null
+// -*- 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
--- /dev/null
+/*
+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;
+}
+ /*}}}*/
--- /dev/null
+/*
+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
--- /dev/null
+/*
+ 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();
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+<?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>
--- /dev/null
+/*
+ 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();
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+<?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>
--- /dev/null
+The Debian Package fapman
+----------------------------
+
+Comments regarding the Package
+
+ -- Heikki <heikki@unknown> Wed, 23 Jun 2010 17:56:53 +0300
--- /dev/null
+fapman for Debian
+-----------------
+
+<possible notes regarding this package - if none, delete this file>
+
+ -- Heikki <heikki@unknown> Wed, 23 Jun 2010 17:56:53 +0300
--- /dev/null
+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
--- /dev/null
+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=
--- /dev/null
+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/>.
+
--- /dev/null
+usr/bin
+usr/sbin
--- /dev/null
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
+dh_installdirs
+dh_link
+dh_fixperms
+dh_installdeb
+dh_shlibdeps
+dh_gencontrol
+dh_md5sums
+dh_builddeb
--- /dev/null
+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
+
+
--- /dev/null
+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)
--- /dev/null
+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 /
--- /dev/null
+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=
--- /dev/null
+0dabf4c19b4a8b23b6c5f72b84f4e959 usr/local/bin/fapman
--- /dev/null
+#!/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
+
+
--- /dev/null
+#!/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
+
+
--- /dev/null
+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
--- /dev/null
+#!/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
+
+
--- /dev/null
+#!/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
+
+
--- /dev/null
+#!/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
--- /dev/null
+#!/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
--- /dev/null
+/*
+ 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();
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+#include <QtCore>
+#include "dpkginterface.h"
+
+DpkgInterface::DpkgInterface(QObject *parent) :
+ QObject(parent)
+{
+}
+
+bool DpkgInterface::loadDebFiles(QStringList files_)
+{
+ qDebug() << files_;
+
+ return false;
+}
--- /dev/null
+#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
--- /dev/null
+#-------------------------------------------------
+#
+# 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
--- /dev/null
+<!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>
--- /dev/null
+/*
+ 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;
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+<?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>
--- /dev/null
+/*
+ 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;
+ }
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+<?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>
--- /dev/null
+/*
+ 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" );
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+<?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>
--- /dev/null
+/*
+ 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();
+}
+
--- /dev/null
+/*
+ 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¤cy_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);
+ }
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+<?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>
--- /dev/null
+[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;
+
--- /dev/null
+[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;
+
--- /dev/null
+#!/bin/sh
+exec sudo /usr/bin/run-standalone.sh /usr/bin/fapman
--- /dev/null
+[D-BUS Service]
+Name=org.maemo.faster_application_manager
+Exec=/usr/bin/fapman.launch
--- /dev/null
+user ALL = NOPASSWD: /usr/bin/run-standalone.sh /usr/bin/fapman
--- /dev/null
+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);
+}
--- /dev/null
+/*
+ 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('<',"<");
+ s.replace('>',">");
+ 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('<',"<");
+ s.replace('>',">");
+ 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('<',"<");
+ s.replace('>',">");
+ 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('<',"<");
+ s.replace('>',">");
+ 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('<',"<");
+ s.replace('>',">");
+ 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('<',"<");
+ s.replace('>',">");
+ 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('<',"<");
+ s.replace('>',">");
+ 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('<',"<");
+ s.replace('>',">");
+ list << s;
+ }
+
+ return list;
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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;
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+<?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>
--- /dev/null
+/*
+ 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();
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+<?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>
--- /dev/null
+/*
+ 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();
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+<?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>
--- /dev/null
+/*
+ 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);
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+/*
+ 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();
+ }
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+<?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>
--- /dev/null
+<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>
--- /dev/null
+/*
+ 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);
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+#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();
+}
--- /dev/null
+#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
--- /dev/null
+<?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>
--- /dev/null
+/*
+ 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() );
+ }
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+<?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>
--- /dev/null
+/*
+ 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;
+}
--- /dev/null
+/*
+ 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
--- /dev/null
+<?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>
--- /dev/null
+#!/bin/sh
+ver=`pwd | cut -d - -f 2-`; echo "const QString PROGRAM_VERSION=\"$ver\";" > version.h
--- /dev/null
+const QString PROGRAM_VERSION="0.6.4";