diff --git a/COPYING.LGPL-2 b/COPYING.LGPL-2 new file mode 100644 index 0000000..5bc8fb2 --- /dev/null +++ b/COPYING.LGPL-2 @@ -0,0 +1,481 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library 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 Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/COPYING.LGPL-3 b/COPYING.LGPL-3 new file mode 100644 index 0000000..65c5ca8 --- /dev/null +++ b/COPYING.LGPL-3 @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser 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 +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/src/services/kmimetypefactory.cpp b/src/services/kmimetypefactory.cpp index 541aacc..f0561a7 100644 --- a/src/services/kmimetypefactory.cpp +++ b/src/services/kmimetypefactory.cpp @@ -1,173 +1,174 @@ /* This file is part of the KDE libraries * Copyright (C) 1999 Waldo Bastian * Copyright (C) 2006-2009 David Faure * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public - * License version 2 as published by the Free Software Foundation; + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "kmimetypefactory_p.h" #include "servicesdebug.h" #include #include #include #include extern int servicesDebugArea(); KMimeTypeFactory::KMimeTypeFactory(KSycoca *db) : KSycocaFactory(KST_KMimeTypeFactory, db) { } KMimeTypeFactory::~KMimeTypeFactory() { } int KMimeTypeFactory::entryOffset(const QString &mimeTypeName) { if (!sycocaDict()) { return -1; // Error! } assert(!sycoca()->isBuilding()); const int offset = sycocaDict()->find_string(mimeTypeName.toLower()); return offset; } int KMimeTypeFactory::serviceOffersOffset(const QString &mimeTypeName) { const int offset = entryOffset(mimeTypeName.toLower()); if (!offset) { return -1; // Not found } MimeTypeEntry::Ptr newMimeType(createEntry(offset)); if (!newMimeType) { return -1; } // Check whether the dictionary was right. if (newMimeType->name() != mimeTypeName.toLower()) { // No it wasn't... return -1; } return newMimeType->serviceOffersOffset(); } KMimeTypeFactory::MimeTypeEntry *KMimeTypeFactory::createEntry(int offset) const { KSycocaType type; QDataStream *str = sycoca()->findEntry(offset, type); if (!str) { return nullptr; } if (type != KST_KMimeTypeEntry) { qCWarning(SERVICES) << "KMimeTypeFactory: unexpected object entry in KSycoca database (type=" << int(type) << ")"; return nullptr; } MimeTypeEntry *newEntry = new MimeTypeEntry(*str, offset); if (newEntry && !newEntry->isValid()) { qCWarning(SERVICES) << "KMimeTypeFactory: corrupt object in KSycoca database!\n"; delete newEntry; newEntry = nullptr; } return newEntry; } QStringList KMimeTypeFactory::allMimeTypes() { // TODO: reimplement in terms of "listing xdgdata-mime", to avoid ksycoca dependency, // then move to KMimeTypeRepository QStringList result; const KSycocaEntry::List list = allEntries(); for (KSycocaEntry::List::ConstIterator it = list.begin(); it != list.end(); ++it) { Q_ASSERT((*it)->isType(KST_KMimeTypeEntry)); MimeTypeEntry::Ptr mimeType(static_cast((*it).data())); result.append(mimeType->name()); } return result; } KMimeTypeFactory::MimeTypeEntry::Ptr KMimeTypeFactory::findMimeTypeEntryByName(const QString &name) { Q_ASSERT(sycoca()->isBuilding()); // We're building a database - the mimetype entry must be in memory KSycocaEntry::Ptr servType = m_entryDict->value(name.toLower()); return MimeTypeEntry::Ptr(static_cast(servType.data())); } QStringList KMimeTypeFactory::resourceDirs() { return KSycocaFactory::allDirectories(QStringLiteral("mime")); } //// class KMimeTypeFactory::MimeTypeEntryPrivate : public KSycocaEntryPrivate { public: K_SYCOCATYPE(KST_KMimeTypeEntry, KSycocaEntryPrivate) MimeTypeEntryPrivate(const QString &file, const QString &name) : KSycocaEntryPrivate(file), m_name(name), m_serviceOffersOffset(-1) { } MimeTypeEntryPrivate(QDataStream &s, int offset) : KSycocaEntryPrivate(s, offset), m_serviceOffersOffset(-1) { s >> m_name >> m_serviceOffersOffset; } QString name() const override { return m_name; } void save(QDataStream &s) override; QString m_name; int m_serviceOffersOffset; }; void KMimeTypeFactory::MimeTypeEntryPrivate::save(QDataStream &s) { KSycocaEntryPrivate::save(s); s << m_name << m_serviceOffersOffset; } //// KMimeTypeFactory::MimeTypeEntry::MimeTypeEntry(const QString &file, const QString &name) : KSycocaEntry(*new MimeTypeEntryPrivate(file, name.toLower())) { } KMimeTypeFactory::MimeTypeEntry::MimeTypeEntry(QDataStream &s, int offset) : KSycocaEntry(*new MimeTypeEntryPrivate(s, offset)) { } KMimeTypeFactory::MimeTypeEntry::~MimeTypeEntry() {} int KMimeTypeFactory::MimeTypeEntry::serviceOffersOffset() const { Q_D(const MimeTypeEntry); return d->m_serviceOffersOffset; } void KMimeTypeFactory::MimeTypeEntry::setServiceOffersOffset(int off) { Q_D(MimeTypeEntry); d->m_serviceOffersOffset = off; } diff --git a/src/services/kmimetypefactory_p.h b/src/services/kmimetypefactory_p.h index 748dffd..8a54a01 100644 --- a/src/services/kmimetypefactory_p.h +++ b/src/services/kmimetypefactory_p.h @@ -1,112 +1,113 @@ /* This file is part of the KDE libraries * Copyright (C) 1999 Waldo Bastian * Copyright (C) 2006-2007 David Faure * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public - * License version 2 as published by the Free Software Foundation; + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef KMIMETYPEFACTORY_H #define KMIMETYPEFACTORY_H #include #include #include "ksycocafactory_p.h" #include "ksycocaentry_p.h" class KSycoca; /** * @internal - this header is not installed * * A sycoca factory for mimetype entries * This is only used to point to the "service offers" in ksycoca for each mimetype. * @see KMimeType */ class KMimeTypeFactory : public KSycocaFactory { K_SYCOCAFACTORY(KST_KMimeTypeFactory) public: /** * Create factory */ explicit KMimeTypeFactory(KSycoca *db); ~KMimeTypeFactory() override; /** * Not meant to be called at this level */ KSycocaEntry *createEntry(const QString &) const override { assert(0); return nullptr; } /** * Returns the possible offset for a given mimetype entry. */ int entryOffset(const QString &mimeTypeName); /** * Returns the offset into the service offers for a given mimetype. */ int serviceOffersOffset(const QString &mimeTypeName); /** * Returns the directories to watch for this factory. */ static QStringList resourceDirs(); public: /** * @return all mimetypes * Slow and memory consuming, avoid using */ QStringList allMimeTypes(); /** * @return the unique mimetype factory, creating it if necessary */ static KMimeTypeFactory *self(); public: // public for KBuildServiceFactory // A small entry for each mimetype with name and offset into the services-offer-list. class MimeTypeEntryPrivate; class KSERVICE_EXPORT MimeTypeEntry : public KSycocaEntry { Q_DECLARE_PRIVATE(MimeTypeEntry) public: typedef QExplicitlySharedDataPointer Ptr; MimeTypeEntry(const QString &file, const QString &name); MimeTypeEntry(QDataStream &s, int offset); ~MimeTypeEntry(); int serviceOffersOffset() const; void setServiceOffersOffset(int off); }; MimeTypeEntry::Ptr findMimeTypeEntryByName(const QString &name); protected: MimeTypeEntry *createEntry(int offset) const override; private: // d pointer: useless since this header is not installed //class KMimeTypeFactoryPrivate* d; }; #endif diff --git a/src/services/kmimetypetrader.cpp b/src/services/kmimetypetrader.cpp index df95399..4722494 100644 --- a/src/services/kmimetypetrader.cpp +++ b/src/services/kmimetypetrader.cpp @@ -1,206 +1,207 @@ /* This file is part of the KDE libraries Copyright (C) 2000 Torben Weis Copyright (C) 2006 David Faure This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public - License version 2 as published by the Free Software Foundation. + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "kmimetypetrader.h" #include "ksycoca.h" #include "ksycoca_p.h" #include "kservicetypeprofile.h" #include "kservicetype.h" #include "kservicetypetrader.h" #include "kservicefactory_p.h" #include "kmimetypefactory_p.h" #include "servicesdebug.h" #include class KMimeTypeTraderPrivate { public: KMimeTypeTraderPrivate() {} }; class KMimeTypeTraderSingleton { public: KMimeTypeTrader instance; }; Q_GLOBAL_STATIC(KMimeTypeTraderSingleton, s_self) KMimeTypeTrader *KMimeTypeTrader::self() { return &s_self()->instance; } KMimeTypeTrader::KMimeTypeTrader() : d(new KMimeTypeTraderPrivate()) { } KMimeTypeTrader::~KMimeTypeTrader() { delete d; } static KServiceOfferList mimeTypeSycocaOffers(const QString &mimeType) { KServiceOfferList lst; QMimeDatabase db; QString mime = db.mimeTypeForName(mimeType).name(); if (mime.isEmpty()) { if (!mimeType.startsWith(QLatin1String("x-scheme-handler/"))) { // don't warn for unknown scheme handler mimetypes qCWarning(SERVICES) << "KMimeTypeTrader: mimeType" << mimeType << "not found"; return lst; // empty } mime = mimeType; } KSycoca::self()->ensureCacheValid(); KMimeTypeFactory *factory = KSycocaPrivate::self()->mimeTypeFactory(); const int offset = factory->entryOffset(mime); if (!offset) { // shouldn't happen, now that we know the mimetype exists if (!mimeType.startsWith(QLatin1String("x-scheme-handler/"))) { // don't warn for unknown scheme handler mimetypes qCDebug(SERVICES) << "KMimeTypeTrader: no entry offset for" << mimeType; } return lst; // empty } const int serviceOffersOffset = factory->serviceOffersOffset(mime); if (serviceOffersOffset > -1) { lst = KSycocaPrivate::self()->serviceFactory()->offers(offset, serviceOffersOffset); } return lst; } static KService::List mimeTypeSycocaServiceOffers(const QString &mimeType) { KService::List lst; QMimeDatabase db; QString mime = db.mimeTypeForName(mimeType).name(); if (mime.isEmpty()) { if (!mimeType.startsWith(QLatin1String("x-scheme-handler/"))) { // don't warn for unknown scheme handler mimetypes qCWarning(SERVICES) << "KMimeTypeTrader: mimeType" << mimeType << "not found"; return lst; // empty } mime = mimeType; } KSycoca::self()->ensureCacheValid(); KMimeTypeFactory *factory = KSycocaPrivate::self()->mimeTypeFactory(); const int offset = factory->entryOffset(mime); if (!offset) { qCWarning(SERVICES) << "KMimeTypeTrader: mimeType" << mimeType << "not found"; return lst; // empty } const int serviceOffersOffset = factory->serviceOffersOffset(mime); if (serviceOffersOffset > -1) { lst = KSycocaPrivate::self()->serviceFactory()->serviceOffers(offset, serviceOffersOffset); } return lst; } #define CHECK_SERVICETYPE(genericServiceTypePtr) \ if (!genericServiceTypePtr) { \ qCWarning(SERVICES) << "KMimeTypeTrader: couldn't find service type" << genericServiceType << \ "\nPlease ensure that the .desktop file for it is installed; then run kbuildsycoca5."; \ return; \ } /** * Filter the offers for the requested mime type for the genericServiceType. * * @param list list of offers (key=service, value=initialPreference) * @param genericServiceType the generic service type (e.g. "Application" or "KParts/ReadOnlyPart") */ void KMimeTypeTrader::filterMimeTypeOffers(KServiceOfferList &list, const QString &genericServiceType) // static, internal { KServiceType::Ptr genericServiceTypePtr = KServiceType::serviceType(genericServiceType); CHECK_SERVICETYPE(genericServiceTypePtr); KSycoca::self()->ensureCacheValid(); QMutableListIterator it(list); while (it.hasNext()) { const KService::Ptr servPtr = it.next().service(); // Expand servPtr->hasServiceType( genericServiceTypePtr ) to avoid lookup each time: if (!KSycocaPrivate::self()->serviceFactory()->hasOffer(genericServiceTypePtr->offset(), genericServiceTypePtr->serviceOffersOffset(), servPtr->offset()) || !servPtr->showInCurrentDesktop()) { it.remove(); } } } void KMimeTypeTrader::filterMimeTypeOffers(KService::List &list, const QString &genericServiceType) // static, internal { KServiceType::Ptr genericServiceTypePtr = KServiceType::serviceType(genericServiceType); CHECK_SERVICETYPE(genericServiceTypePtr); KSycoca::self()->ensureCacheValid(); QMutableListIterator it(list); while (it.hasNext()) { const KService::Ptr servPtr = it.next(); // Expand servPtr->hasServiceType( genericServiceTypePtr ) to avoid lookup each time: if (!KSycocaPrivate::self()->serviceFactory()->hasOffer(genericServiceTypePtr->offset(), genericServiceTypePtr->serviceOffersOffset(), servPtr->offset()) || !servPtr->showInCurrentDesktop()) { it.remove(); } } } #undef CHECK_SERVICETYPE KService::List KMimeTypeTrader::query(const QString &mimeType, const QString &genericServiceType, const QString &constraint) const { // Get all services of this mime type. KService::List lst = mimeTypeSycocaServiceOffers(mimeType); filterMimeTypeOffers(lst, genericServiceType); KServiceTypeTrader::applyConstraints(lst, constraint); //qCDebug(SERVICES) << "query for mimeType " << mimeType << ", " << genericServiceType // << " : returning " << lst.count() << " offers"; return lst; } KService::Ptr KMimeTypeTrader::preferredService(const QString &mimeType, const QString &genericServiceType) { // First, get all offers known to ksycoca. KServiceOfferList offers = mimeTypeSycocaOffers(mimeType); // Assign preferences from the profile to those offers - and filter for genericServiceType Q_ASSERT(!genericServiceType.isEmpty()); filterMimeTypeOffers(offers, genericServiceType); KServiceOfferList::const_iterator itOff = offers.constBegin(); // Look for the first one that is allowed as default. // Since the allowed-as-default are first anyway, we only have // to look at the first one to know. if (itOff != offers.constEnd() && (*itOff).allowAsDefault()) { return (*itOff).service(); } //qCDebug(SERVICES) << "No offers, or none allowed as default"; return KService::Ptr(); } diff --git a/src/services/kservicefactory.cpp b/src/services/kservicefactory.cpp index 4ba9ebe..9a06137 100644 --- a/src/services/kservicefactory.cpp +++ b/src/services/kservicefactory.cpp @@ -1,355 +1,357 @@ /* This file is part of the KDE libraries * Copyright (C) 1999-2006 David Faure * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License version 2 as published by the Free Software Foundation; + * This library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2 of the License or ( at + * your option ) version 3 or, at the discretion of KDE e.V. ( which shall + * act as a proxy as in section 14 of the GPLv3 ), any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. **/ #include "kservicefactory_p.h" #include "ksycoca.h" #include "ksycocatype.h" #include "ksycocadict_p.h" #include "kservice.h" #include "servicesdebug.h" #include #include extern int servicesDebugArea(); KServiceFactory::KServiceFactory(KSycoca *db) : KSycocaFactory(KST_KServiceFactory, db), m_nameDict(nullptr), m_relNameDict(nullptr), m_menuIdDict(nullptr) { m_offerListOffset = 0; m_nameDictOffset = 0; m_relNameDictOffset = 0; m_menuIdDictOffset = 0; if (!sycoca()->isBuilding()) { QDataStream *str = stream(); Q_ASSERT(str); if (!str) { return; } // Read Header qint32 i; (*str) >> i; m_nameDictOffset = i; (*str) >> i; m_relNameDictOffset = i; (*str) >> i; m_offerListOffset = i; (*str) >> i; m_menuIdDictOffset = i; const qint64 saveOffset = str->device()->pos(); // Init index tables m_nameDict = new KSycocaDict(str, m_nameDictOffset); // Init index tables m_relNameDict = new KSycocaDict(str, m_relNameDictOffset); // Init index tables m_menuIdDict = new KSycocaDict(str, m_menuIdDictOffset); str->device()->seek(saveOffset); } } KServiceFactory::~KServiceFactory() { delete m_nameDict; delete m_relNameDict; delete m_menuIdDict; } KService::Ptr KServiceFactory::findServiceByName(const QString &_name) { if (!sycocaDict()) { return KService::Ptr(); // Error! } // Warning : this assumes we're NOT building a database // But since findServiceByName isn't called in that case... // [ see KServiceTypeFactory for how to do it if needed ] int offset = sycocaDict()->find_string(_name); if (!offset) { return KService::Ptr(); // Not found } KService::Ptr newService(createEntry(offset)); // Check whether the dictionary was right. if (newService && (newService->name() != _name)) { // No it wasn't... return KService::Ptr(); } return newService; } KService::Ptr KServiceFactory::findServiceByDesktopName(const QString &_name) { if (!m_nameDict) { return KService::Ptr(); // Error! } // Warning : this assumes we're NOT building a database // KBuildServiceFactory reimplements it for the case where we are building one int offset = m_nameDict->find_string(_name); if (!offset) { return KService::Ptr(); // Not found } KService::Ptr newService(createEntry(offset)); // Check whether the dictionary was right. if (newService && (newService->desktopEntryName() != _name)) { // No it wasn't... return KService::Ptr(); } return newService; } KService::Ptr KServiceFactory::findServiceByDesktopPath(const QString &_name) { if (!m_relNameDict) { return KService::Ptr(); // Error! } // Warning : this assumes we're NOT building a database // KBuildServiceFactory reimplements it for the case where we are building one int offset = m_relNameDict->find_string(_name); if (!offset) { //qCDebug(SERVICES) << "findServiceByDesktopPath:" << _name << "not found"; return KService::Ptr(); // Not found } KService::Ptr newService(createEntry(offset)); if (!newService) { qCDebug(SERVICES) << "createEntry failed!"; } // Check whether the dictionary was right // It's ok that it's wrong, for the case where we're looking up an unknown service, // and the hash value gave us another one. if (newService && (newService->entryPath() != _name)) { // No it wasn't... return KService::Ptr(); } return newService; } KService::Ptr KServiceFactory::findServiceByMenuId(const QString &_menuId) { if (!m_menuIdDict) { return KService::Ptr(); // Error! } // Warning : this assumes we're NOT building a database // KBuildServiceFactory reimplements it for the case where we are building one int offset = m_menuIdDict->find_string(_menuId); if (!offset) { return KService::Ptr(); // Not found } KService::Ptr newService(createEntry(offset)); // Check whether the dictionary was right. if (newService && (newService->menuId() != _menuId)) { // No it wasn't... return KService::Ptr(); } return newService; } KService::Ptr KServiceFactory::findServiceByStorageId(const QString &_storageId) { KService::Ptr service = findServiceByMenuId(_storageId); if (service) { return service; } service = findServiceByDesktopPath(_storageId); if (service) { return service; } if (!QDir::isRelativePath(_storageId) && QFile::exists(_storageId)) { return KService::Ptr(new KService(_storageId)); } QString tmp = _storageId; tmp = tmp.mid(tmp.lastIndexOf(QLatin1Char('/')) + 1); // Strip dir if (tmp.endsWith(QLatin1String(".desktop"))) { tmp.chop(8); } if (tmp.endsWith(QLatin1String(".kdelnk"))) { tmp.chop(7); } service = findServiceByDesktopName(tmp); return service; } KService *KServiceFactory::createEntry(int offset) const { KSycocaType type; QDataStream *str = sycoca()->findEntry(offset, type); if (type != KST_KService) { qCWarning(SERVICES) << "KServiceFactory: unexpected object entry in KSycoca database (type=" << int(type) << ")"; return nullptr; } KService *newEntry = new KService(*str, offset); if (!newEntry->isValid()) { qCWarning(SERVICES) << "KServiceFactory: corrupt object in KSycoca database!"; delete newEntry; newEntry = nullptr; } return newEntry; } KService::List KServiceFactory::allServices() { KService::List result; const KSycocaEntry::List list = allEntries(); KSycocaEntry::List::const_iterator it = list.begin(); const KSycocaEntry::List::const_iterator end = list.end(); for (; it != end; ++it) { const KSycocaEntry::Ptr entry = *it; if (entry->isType(KST_KService)) { KService::Ptr service(static_cast(entry.data())); result.append(service); } } return result; } QStringList KServiceFactory::resourceDirs() { return KSycocaFactory::allDirectories(QStringLiteral("kservices5")) + KSycocaFactory::allDirectories(QStringLiteral("applications")); } QList KServiceFactory::offers(int serviceTypeOffset, int serviceOffersOffset) { QList list; // Jump to the offer list QDataStream *str = stream(); str->device()->seek(m_offerListOffset + serviceOffersOffset); qint32 aServiceTypeOffset, aServiceOffset, initialPreference, mimeTypeInheritanceLevel; while (true) { (*str) >> aServiceTypeOffset; if (aServiceTypeOffset) { (*str) >> aServiceOffset; (*str) >> initialPreference; (*str) >> mimeTypeInheritanceLevel; if (aServiceTypeOffset == serviceTypeOffset) { // Save stream position ! const qint64 savedPos = str->device()->pos(); // Create Service KService *serv = createEntry(aServiceOffset); if (serv) { KService::Ptr servPtr(serv); list.append(KServiceOffer(servPtr, initialPreference, mimeTypeInheritanceLevel, servPtr->allowAsDefault())); } // Restore position str->device()->seek(savedPos); } else { break; // too far } } else { break; // 0 => end of list } } return list; } KService::List KServiceFactory::serviceOffers(int serviceTypeOffset, int serviceOffersOffset) { KService::List list; // Jump to the offer list QDataStream *str = stream(); str->device()->seek(m_offerListOffset + serviceOffersOffset); qint32 aServiceTypeOffset, aServiceOffset, initialPreference, mimeTypeInheritanceLevel; while (true) { (*str) >> aServiceTypeOffset; if (aServiceTypeOffset) { (*str) >> aServiceOffset; (*str) >> initialPreference; (*str) >> mimeTypeInheritanceLevel; if (aServiceTypeOffset == serviceTypeOffset) { // Save stream position ! const qint64 savedPos = str->device()->pos(); // Create service KService *serv = createEntry(aServiceOffset); if (serv) { list.append(KService::Ptr(serv)); } // Restore position str->device()->seek(savedPos); } else { break; // too far } } else { break; // 0 => end of list } } return list; } bool KServiceFactory::hasOffer(int serviceTypeOffset, int serviceOffersOffset, int testedServiceOffset) { // Save stream position QDataStream *str = stream(); const qint64 savedPos = str->device()->pos(); // Jump to the offer list str->device()->seek(m_offerListOffset + serviceOffersOffset); bool found = false; qint32 aServiceTypeOffset, aServiceOffset, initialPreference, mimeTypeInheritanceLevel; while (!found) { (*str) >> aServiceTypeOffset; if (aServiceTypeOffset) { (*str) >> aServiceOffset; (*str) >> initialPreference; (*str) >> mimeTypeInheritanceLevel; if (aServiceTypeOffset == serviceTypeOffset) { if (aServiceOffset == testedServiceOffset) { found = true; } } else { break; // too far } } else { break; // 0 => end of list } } // Restore position str->device()->seek(savedPos); return found; } void KServiceFactory::virtual_hook(int id, void *data) { KSycocaFactory::virtual_hook(id, data); } diff --git a/src/services/kservicegroupfactory.cpp b/src/services/kservicegroupfactory.cpp index 0ee8788..188f3f8 100644 --- a/src/services/kservicegroupfactory.cpp +++ b/src/services/kservicegroupfactory.cpp @@ -1,126 +1,127 @@ /* This file is part of the KDE libraries * Copyright (C) 2000 Waldo Bastian * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public - * License version 2 as published by the Free Software Foundation; + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. **/ #include "kservicegroupfactory_p.h" #include "ksycoca.h" #include "ksycocatype.h" #include "ksycocadict_p.h" #include "kservice.h" #include "servicesdebug.h" KServiceGroupFactory::KServiceGroupFactory(KSycoca *db) : KSycocaFactory(KST_KServiceGroupFactory, db) , m_baseGroupDict(nullptr) , m_baseGroupDictOffset(0) { if (!sycoca()->isBuilding()) { QDataStream *str = stream(); if (!str) { return; } // Read Header qint32 i; (*str) >> i; m_baseGroupDictOffset = i; const qint64 saveOffset = str->device()->pos(); // Init index tables m_baseGroupDict = new KSycocaDict(str, m_baseGroupDictOffset); str->device()->seek(saveOffset); } } KServiceGroupFactory::~KServiceGroupFactory() { delete m_baseGroupDict; } KServiceGroup::Ptr KServiceGroupFactory::findGroupByDesktopPath(const QString &_name, bool deep) { if (!sycocaDict()) { return KServiceGroup::Ptr(); // Error! } int offset = sycocaDict()->find_string(_name); if (!offset) { return KServiceGroup::Ptr(); // Not found } KServiceGroup::Ptr newGroup(createGroup(offset, deep)); // Check whether the dictionary was right. if (newGroup && (newGroup->relPath() != _name)) { // No it wasn't... newGroup = nullptr; // Not found } return newGroup; } KServiceGroup::Ptr KServiceGroupFactory::findBaseGroup(const QString &_baseGroupName, bool deep) { if (!m_baseGroupDict) { return KServiceGroup::Ptr(); // Error! } // Warning : this assumes we're NOT building a database // But since findBaseGroup isn't called in that case... // [ see KServiceTypeFactory for how to do it if needed ] int offset = m_baseGroupDict->find_string(_baseGroupName); if (!offset) { return KServiceGroup::Ptr(); // Not found } KServiceGroup::Ptr newGroup(createGroup(offset, deep)); // Check whether the dictionary was right. if (newGroup && (newGroup->baseGroupName() != _baseGroupName)) { // No it wasn't... newGroup = nullptr; // Not found } return newGroup; } KServiceGroup *KServiceGroupFactory::createGroup(int offset, bool deep) const { KSycocaType type; QDataStream *str = sycoca()->findEntry(offset, type); if (type != KST_KServiceGroup) { qCWarning(SERVICES) << "KServiceGroupFactory: unexpected object entry in KSycoca database (type = " << int(type) << ")"; return nullptr; } KServiceGroup *newEntry = new KServiceGroup(*str, offset, deep); if (!newEntry->isValid()) { qCWarning(SERVICES) << "KServiceGroupFactory: corrupt object in KSycoca database!"; delete newEntry; newEntry = nullptr; } return newEntry; } KServiceGroup *KServiceGroupFactory::createEntry(int offset) const { return createGroup(offset, true); } void KServiceGroupFactory::virtual_hook(int id, void *data) { KSycocaFactory::virtual_hook(id, data); } diff --git a/src/services/kservicegroupfactory_p.h b/src/services/kservicegroupfactory_p.h index b10461e..df51246 100644 --- a/src/services/kservicegroupfactory_p.h +++ b/src/services/kservicegroupfactory_p.h @@ -1,82 +1,83 @@ /* This file is part of the KDE project Copyright (C) 2000 Waldo Bastian This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public - License version 2 as published by the Free Software Foundation. + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef KSERVICEGROUPFACTORY_P_H #define KSERVICEGROUPFACTORY_P_H #include "kservicegroup.h" #include "ksycocafactory_p.h" #include class KSycoca; class KSycocaDict; /** * @internal * A sycoca factory for service groups (e.g. list of applications) * It loads the services from parsing directories (e.g. share/applications/) * * Exported for kbuildsycoca, but not installed. */ class KServiceGroupFactory : public KSycocaFactory { K_SYCOCAFACTORY(KST_KServiceGroupFactory) public: /** * Create factory */ explicit KServiceGroupFactory(KSycoca *db); ~KServiceGroupFactory() override; /** * Construct a KServiceGroup from a config file. */ KSycocaEntry *createEntry(const QString &) const override { assert(0); return nullptr; } /** * Find a group ( by desktop path, e.g. "Applications/Editors") */ virtual KServiceGroup::Ptr findGroupByDesktopPath(const QString &_name, bool deep = true); /** * Find a base group by name, e.g. "settings" */ KServiceGroup::Ptr findBaseGroup(const QString &_baseGroupName, bool deep = true); /** * @return the unique service group factory, creating it if necessary */ static KServiceGroupFactory *self(); protected: KServiceGroup *createGroup(int offset, bool deep) const; KServiceGroup *createEntry(int offset) const override; KSycocaDict *m_baseGroupDict; int m_baseGroupDictOffset; protected: void virtual_hook(int id, void *data) override; private: class KServiceGroupFactoryPrivate *d; }; #endif diff --git a/src/services/kserviceoffer.cpp b/src/services/kserviceoffer.cpp index 745b7ec..eaeaa83 100644 --- a/src/services/kserviceoffer.cpp +++ b/src/services/kserviceoffer.cpp @@ -1,131 +1,132 @@ /* This file is part of the KDE libraries Copyright (C) 2000 Torben Weis Copyright (C) 2006 David Faure This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public - License version 2 as published by the Free Software Foundation. + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "kserviceoffer.h" class KServiceOfferPrivate { public: KServiceOfferPrivate() : preference(-1), mimeTypeInheritanceLevel(0), bAllowAsDefault(false), pService(nullptr) { } int preference; int mimeTypeInheritanceLevel; bool bAllowAsDefault; KService::Ptr pService; }; KServiceOffer::KServiceOffer() : d(new KServiceOfferPrivate) { } KServiceOffer::KServiceOffer(const KServiceOffer &_o) : d(new KServiceOfferPrivate) { *d = *_o.d; } KServiceOffer::KServiceOffer(const KService::Ptr &_service, int _pref, int mimeTypeInheritanceLevel, bool _default) : d(new KServiceOfferPrivate) { d->pService = _service; d->preference = _pref; d->mimeTypeInheritanceLevel = mimeTypeInheritanceLevel; d->bAllowAsDefault = _default; } KServiceOffer::~KServiceOffer() { delete d; } KServiceOffer &KServiceOffer::operator=(const KServiceOffer &rhs) { if (this == &rhs) { return *this; } *d = *rhs.d; return *this; } bool KServiceOffer::operator< (const KServiceOffer &_o) const { // First check mimetype inheritance level. // Direct mimetype association is preferred above association via parent mimetype // So, the smaller the better. if (d->mimeTypeInheritanceLevel != _o.d->mimeTypeInheritanceLevel) { return d->mimeTypeInheritanceLevel < _o.d->mimeTypeInheritanceLevel; } // Put offers allowed as default FIRST. if (_o.d->bAllowAsDefault && !d->bAllowAsDefault) { return false; // _o is default and not 'this'. } if (!_o.d->bAllowAsDefault && d->bAllowAsDefault) { return true; // 'this' is default but not _o. } // Both offers are allowed or not allowed as default // Finally, use preference to sort them // The bigger the better, but we want the better FIRST return _o.d->preference < d->preference; } bool KServiceOffer::allowAsDefault() const { return d->bAllowAsDefault; } int KServiceOffer::preference() const { return d->preference; } void KServiceOffer::setPreference(int p) { d->preference = p; } KService::Ptr KServiceOffer::service() const { return d->pService; } bool KServiceOffer::isValid() const { return d->preference >= 0; } void KServiceOffer::setMimeTypeInheritanceLevel(int level) { d->mimeTypeInheritanceLevel = level; } int KServiceOffer::mimeTypeInheritanceLevel() const { return d->mimeTypeInheritanceLevel; } diff --git a/src/services/kserviceoffer.h b/src/services/kserviceoffer.h index 0b9f900..6aab4db 100644 --- a/src/services/kserviceoffer.h +++ b/src/services/kserviceoffer.h @@ -1,136 +1,137 @@ /* This file is part of the KDE libraries Copyright (C) 2000 Torben Weis Copyright (C) 2006 David Faure This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public - License version 2 as published by the Free Software Foundation. + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef KSERVICEOFFER_H #define KSERVICEOFFER_H #include class KServiceOfferPrivate; /** * @internal * * This class holds the user-specific preferences of a service * (whether it can be a default offer or not, how big is the preference * for this offer, ...). Basically it is a reference to a * KService, a number that represents the user's preference (bigger * is better) and a flag whether the KService can be used as default. * * @see KService * @short Holds the user's preference of a service. */ class KSERVICE_EXPORT KServiceOffer // exported for kbuildsycoca { public: /** * Create an invalid service offer. */ KServiceOffer(); /** * Copy constructor. * Shallow copy (the KService will not be copied). */ KServiceOffer(const KServiceOffer &); /** * Creates a new KServiceOffer. * @param service a pointer to the KService * @param pref the user's preference value, must be positive, * bigger is better * @param mimeTypeInheritanceLevel level of mimetype inheritance * which allows this service to handling the mimetype. * 0 if no inheritance involved, 1 for parent mimetype, etc. * @param allowedAsDefault true if the service should be used as * default */ KServiceOffer(const KService::Ptr &service, int pref, int mimeTypeInheritanceLevel, bool allowedAsDefault); ~KServiceOffer(); /** * A service is bigger that the other when it can be default * (and the other is not) and its preference value it higher. */ bool operator< (const KServiceOffer &) const; /** * Assignment operator */ KServiceOffer &operator=(const KServiceOffer &other); /** * Is it allowed to use this service for default actions * (e.g. Left Click in a file manager, or KRun in general). * @return true if the service is a allowed as default */ bool allowAsDefault() const; /** * The bigger this number is, the better is this service. * @return the preference number (negative numbers will be * returned by invalid service offers) */ int preference() const; /** * The bigger this number is, the better is this service. * Set the preference number * @internal - only for KMimeTypeTrader */ void setPreference(int p); /** * The service which this offer is about. * @return the service this offer is about, can be @c nullptr * in valid offers or when not set */ KService::Ptr service() const; /** * Check whether the entry is valid. A service is valid if * its preference value is positive. * @return true if the service offer is valid */ bool isValid() const; /** * When copying an offer from a parent mimetype, remember that it's an inherited capability * (for sorting purposes; we prefer a handler for postscript over any text/plain handler) */ void setMimeTypeInheritanceLevel(int level); /** * Mimetype inheritance level * @internal */ int mimeTypeInheritanceLevel() const; private: KServiceOfferPrivate *const d; }; /** * A list of weighted offers. */ typedef QList KServiceOfferList; #endif /* KSERVICEOFFER_H */ diff --git a/src/services/kservicetypeprofile_p.h b/src/services/kservicetypeprofile_p.h index e23c364..106b4bc 100644 --- a/src/services/kservicetypeprofile_p.h +++ b/src/services/kservicetypeprofile_p.h @@ -1,55 +1,56 @@ /* This file is part of the KDE libraries * Copyright (C) 1999 Torben Weis * Copyright (C) 2006 David Faure * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public - * License version 2 as published by the Free Software Foundation; + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef KSERVICETYPEPROFILE_P_H #define KSERVICETYPEPROFILE_P_H #include /** * @internal */ class KServiceTypeProfileEntry { public: explicit KServiceTypeProfileEntry() {} /** * Add a service to this profile. * @param _service the name of the service * @param _preference the user's preference value, must be positive, * bigger is better * @param _allow_as_default true if the service should be used as * default */ void addService(const QString &service, int preference = 1) { m_mapServices.insert(service, preference); } /** * Map of all services for which we have assessments. * Key: service ID * Value: preference */ QMap m_mapServices; }; #endif /* KSERVICETYPEPROFILE_P_H */ diff --git a/src/services/kservicetypetrader.cpp b/src/services/kservicetypetrader.cpp index 6f946c3..15e941a 100644 --- a/src/services/kservicetypetrader.cpp +++ b/src/services/kservicetypetrader.cpp @@ -1,190 +1,191 @@ /* This file is part of the KDE libraries Copyright (C) 2000 Torben Weis Copyright (C) 2006 David Faure This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public - License version 2 as published by the Free Software Foundation. + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "kservicetypetrader.h" #include "ksycoca.h" #include "ksycoca_p.h" #include "ktraderparsetree_p.h" #include #include "kservicetype.h" #include "kservicetypefactory_p.h" #include "kservicefactory_p.h" #include "servicesdebug.h" using namespace KTraderParse; // -------------------------------------------------- namespace KServiceTypeProfile { KServiceOfferList sortServiceTypeOffers(const KServiceOfferList &list, const QString &servicetype); } class KServiceTypeTraderSingleton { public: KServiceTypeTrader instance; }; Q_GLOBAL_STATIC(KServiceTypeTraderSingleton, s_globalServiceTypeTrader) KServiceTypeTrader *KServiceTypeTrader::self() { return &s_globalServiceTypeTrader()->instance; } KServiceTypeTrader::KServiceTypeTrader() : d(nullptr) { } KServiceTypeTrader::~KServiceTypeTrader() { } // shared with KMimeTypeTrader void KServiceTypeTrader::applyConstraints(KService::List &lst, const QString &constraint) { if (lst.isEmpty() || constraint.isEmpty()) { return; } const ParseTreeBase::Ptr constr = parseConstraints(constraint); // for ownership const ParseTreeBase *pConstraintTree = constr.data(); // for speed if (!constr) { // parse error lst.clear(); } else { // Find all services matching the constraint // and remove the other ones KService::List::iterator it = lst.begin(); while (it != lst.end()) { if (matchConstraint(pConstraintTree, (*it), lst) != 1) { it = lst.erase(it); } else { ++it; } } } } #if 0 static void dumpOfferList(const KServiceOfferList &offers) { // qDebug() << "Sorted list:"; OfferList::Iterator itOff = offers.begin(); for (; itOff != offers.end(); ++itOff) // qDebug() << (*itOff).service()->name() << " allow-as-default=" << (*itOff).allowAsDefault() << " preference=" << (*itOff).preference(); } #endif KServiceOfferList KServiceTypeTrader::weightedOffers(const QString &serviceType) // static, internal { //qDebug() << "KServiceTypeTrader::weightedOffers( " << serviceType << " )"; KSycoca::self()->ensureCacheValid(); KServiceType::Ptr servTypePtr = KSycocaPrivate::self()->serviceTypeFactory()->findServiceTypeByName(serviceType); if (!servTypePtr) { qCWarning(SERVICES) << "KServiceTypeTrader: serviceType" << serviceType << "not found"; return KServiceOfferList(); } if (servTypePtr->serviceOffersOffset() == -1) { // no offers in ksycoca return KServiceOfferList(); } // First, get all offers known to ksycoca. const KServiceOfferList services = KSycocaPrivate::self()->serviceFactory()->offers(servTypePtr->offset(), servTypePtr->serviceOffersOffset()); const KServiceOfferList offers = KServiceTypeProfile::sortServiceTypeOffers(services, serviceType); //qDebug() << "Found profile: " << offers.count() << " offers"; #if 0 dumpOfferList(offers); #endif return offers; } KService::List KServiceTypeTrader::defaultOffers(const QString &serviceType, const QString &constraint) const { KSycoca::self()->ensureCacheValid(); KServiceType::Ptr servTypePtr = KSycocaPrivate::self()->serviceTypeFactory()->findServiceTypeByName(serviceType); if (!servTypePtr) { qCWarning(SERVICES) << "KServiceTypeTrader: serviceType" << serviceType << "not found"; return KService::List(); } if (servTypePtr->serviceOffersOffset() == -1) { return KService::List(); } KService::List lst = KSycocaPrivate::self()->serviceFactory()->serviceOffers(servTypePtr->offset(), servTypePtr->serviceOffersOffset()); applyConstraints(lst, constraint); //qDebug() << "query for serviceType " << serviceType << constraint // << " : returning " << lst.count() << " offers" << endl; return lst; } KService::List KServiceTypeTrader::query(const QString &serviceType, const QString &constraint) const { if (!KServiceTypeProfile::hasProfile(serviceType)) { // Fast path: skip the profile stuff if there's none (to avoid kservice->serviceoffer->kservice) // The ordering according to initial preferences is done by kbuildsycoca return defaultOffers(serviceType, constraint); } KService::List lst; // Get all services of this service type. const KServiceOfferList offers = weightedOffers(serviceType); // Now extract only the services; the weighting was only used for sorting. KServiceOfferList::const_iterator itOff = offers.begin(); for (; itOff != offers.end(); ++itOff) { lst.append((*itOff).service()); } applyConstraints(lst, constraint); //qDebug() << "query for serviceType " << serviceType << constraint // << " : returning " << lst.count() << " offers" << endl; return lst; } KService::Ptr KServiceTypeTrader::preferredService(const QString &serviceType) const { const KServiceOfferList offers = weightedOffers(serviceType); KServiceOfferList::const_iterator itOff = offers.begin(); // Look for the first one that is allowed as default. // Since the allowed-as-default are first anyway, we only have // to look at the first one to know. if (itOff != offers.end() && (*itOff).allowAsDefault()) { return (*itOff).service(); } //qDebug() << "No offers, or none allowed as default"; return KService::Ptr(); } diff --git a/src/services/kserviceutil_p.h b/src/services/kserviceutil_p.h index 3bc2ecd..80cdbec 100644 --- a/src/services/kserviceutil_p.h +++ b/src/services/kserviceutil_p.h @@ -1,50 +1,51 @@ /* This file is part of the KDE project Copyright (C) 2015 Gregor Mi This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public - License version 2 as published by the Free Software Foundation. + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef KSERVICEUTIL_P_H #define KSERVICEUTIL_P_H #include class KServiceUtilPrivate { public: /** * Lightweight implementation of QFileInfo::completeBaseName. * * Returns the complete base name of the file without the path. * The complete base name consists of all characters in the file up to (but not including) the last '.' character. * * Example: "/tmp/archive.tar.gz" --> "archive.tar" */ static QString completeBaseName(const QString& filepath) { QString name = filepath; int pos = name.lastIndexOf(QLatin1Char('/')); if (pos != -1) { name.remove(0, pos + 1); } pos = name.lastIndexOf(QLatin1Char('.')); if (pos != -1) { name.truncate(pos); } return name; } }; #endif