diff --git a/kfilemetadata/CMakeLists.txt b/kfilemetadata/CMakeLists.txt new file mode 100644 index 00000000..923bfe64 --- /dev/null +++ b/kfilemetadata/CMakeLists.txt @@ -0,0 +1,71 @@ +project(kfilemetadata) + +if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}) + find_package(KDE4 4.19.0 REQUIRED) + include(KDE4Defaults) + include_directories(${KDE4_INCLUDES}) + add_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS}) +endif() + +macro_optional_find_package(PopplerQt4 0.12.1) +set_package_properties(PopplerQt4 PROPERTIES + DESCRIPTION "A PDF rendering library" + URL "http://poppler.freedesktop.org" + PURPOSE "Support for PDF files" +) + +macro_optional_find_package(Taglib 1.4) +set_package_properties(Taglib PROPERTIES + DESCRIPTION "Id3 tag reader" + URL "https://taglib.org/" + PURPOSE "Support for music metadata" +) + +macro_optional_find_package(Exiv2 0.21) +set_package_properties(Exiv2 PROPERTIES + DESCRIPTION "Image Tag reader" + URL "http://www.exiv2.org" + PURPOSE "Support for image metadata" +) + +macro_optional_find_package(FFmpeg 1.0) +set_package_properties(FFmpeg PROPERTIES + DESCRIPTION "Video Tag reader" + URL "http://ffmpeg.org" + PURPOSE "Support for video metadata" +) + +macro_optional_find_package(EPub) +set_package_properties(EPub PROPERTIES + DESCRIPTION "A library for reading EPub documents" + URL "http://sourceforge.net/projects/ebook-tools" + PURPOSE "Support for epub metadata" +) + +macro_optional_find_package(QMobipocket) +set_package_properties(QMobipocket PROPERTIES + DESCRIPTION "A library for reading Mobipocket documents" + URL "https://projects.kde.org/projects/kde/kdegraphics/kdegraphics-mobipocket" + PURPOSE "Support for Mobipocket documents metadata in KFileMetaData" +) + +include_directories( + ${PROJECT_SOURCE_DIR} + ${PROJECT_SOURCE_DIR}/src +) + +add_subdirectory(src) +if(ENABLE_TESTING) + add_subdirectory(autotests) +endif() + +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/KFileMetaDataConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/KFileMetaDataConfig.cmake + @ONLY +) + +install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/KFileMetaDataConfig.cmake + DESTINATION ${KDE4_LIB_INSTALL_DIR}/cmake/KFileMetaData +) diff --git a/kfilemetadata/COPYING-CMAKE-SCRIPTS b/kfilemetadata/COPYING-CMAKE-SCRIPTS new file mode 100644 index 00000000..4b417765 --- /dev/null +++ b/kfilemetadata/COPYING-CMAKE-SCRIPTS @@ -0,0 +1,22 @@ +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/kfilemetadata/COPYING.LGPL-2 b/kfilemetadata/COPYING.LGPL-2 new file mode 100644 index 00000000..5bc8fb2c --- /dev/null +++ b/kfilemetadata/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/kfilemetadata/COPYING.LGPL-2.1 b/kfilemetadata/COPYING.LGPL-2.1 new file mode 100644 index 00000000..4362b491 --- /dev/null +++ b/kfilemetadata/COPYING.LGPL-2.1 @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 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 Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + 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 Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +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 other code 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. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + 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, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser 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 combine 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) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) 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. + + d) 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. + + e) 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 materials to be 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 with +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 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 +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 Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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/kfilemetadata/COPYING.LGPL-3 b/kfilemetadata/COPYING.LGPL-3 new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/kfilemetadata/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/kfilemetadata/KFileMetaDataConfig.cmake.in b/kfilemetadata/KFileMetaDataConfig.cmake.in new file mode 100644 index 00000000..cccbaf3e --- /dev/null +++ b/kfilemetadata/KFileMetaDataConfig.cmake.in @@ -0,0 +1,18 @@ +# Do not modify this file. Any change will be overwritten by CMake. + +# Config file for KFileMetaData. This file will define: +# KFILEMETADATA_INCLUDE_DIR - The KFileMetaData include directory +# KFILEMETADATA_LIBRARY - The library needed to use KFileMetaData + +get_filename_component(_currentDir ${CMAKE_CURRENT_LIST_FILE} PATH) # The current directory +get_filename_component(rootDir ${_currentDir}/@relInstallDir@ ABSOLUTE) # The install prefix + +# Include directory +set(KFILEMETADATA_INSTALL_PREFIX "${rootDir}") +set(KFILEMETADATA_INCLUDE_DIR "@KDE4_INCLUDE_INSTALL_DIR@") + +include(${_currentDir}/KFileMetaDataTargetsWithPrefix.cmake) + +# Set the library variable +set(KFILEMETADATA_LIBRARY kfilemetadata) + diff --git a/kfilemetadata/Messages.sh b/kfilemetadata/Messages.sh new file mode 100644 index 00000000..5300ca82 --- /dev/null +++ b/kfilemetadata/Messages.sh @@ -0,0 +1,5 @@ +#!bin/sh + +$EXTRACTRC `find . -name \*.rc -o -name \*.ui -o -name \*.kcfg` >> rc.cpp +$XGETTEXT `find . -name \*.cc -o -name \*.cpp -o -name \*.h -name \*.qml` -o $podir/kfilemetadata.pot +rm -f rc.cpp diff --git a/kfilemetadata/autotests/CMakeLists.txt b/kfilemetadata/autotests/CMakeLists.txt new file mode 100644 index 00000000..c95a9398 --- /dev/null +++ b/kfilemetadata/autotests/CMakeLists.txt @@ -0,0 +1,30 @@ +configure_file( + indexerextractortestsconfig.h.in + ${CMAKE_CURRENT_BINARY_DIR}/indexerextractortestsconfig.h @ONLY +) + +kde4_add_test(kfilemetadata-extractortests + indexerextractortests.cpp + simpleresult.cpp + ../src/extractors/plaintextextractor.cpp +) + +target_link_libraries(kfilemetadata-extractortests + ${QT_QTTEST_LIBRARY} + ${KDE4_KDECORE_LIBS} + kfilemetadata +) + +# +# Property Info +# +kde4_add_test(kfilemetadata-propertyinfotest + propertyinfotest.cpp +) + +target_link_libraries(kfilemetadata-propertyinfotest + ${QT_QTTEST_LIBRARY} + ${KDE4_KDECORE_LIBS} + kfilemetadata +) + diff --git a/kfilemetadata/autotests/indexerextractortests.cpp b/kfilemetadata/autotests/indexerextractortests.cpp new file mode 100644 index 00000000..87f81a80 --- /dev/null +++ b/kfilemetadata/autotests/indexerextractortests.cpp @@ -0,0 +1,118 @@ +/* + This file is part of the Nepomuk KDE project. + Copyright (C) 2013 David Edmundson + Copyright (C) 2014 Vishesh Handa + + 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.1 of the License, or (at your option) version 3, or any + later version accepted by the membership of KDE e.V. (or its + successor approved by the membership of KDE e.V.), which shall + act as a proxy defined in Section 6 of version 3 of the license. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . +*/ + +#include "indexerextractortests.h" + +#include +#include + +#include "qtest_kde.h" +#include "simpleresult.h" +#include "indexerextractortestsconfig.h" +#include "extractors/plaintextextractor.h" +#include "extractorpluginmanager.h" + +using namespace KFileMetaData; + +IndexerExtractorTests::IndexerExtractorTests(QObject* parent) : + QObject(parent) +{ +} + +QString IndexerExtractorTests::testFilePath(const QString& fileName) const +{ + return QLatin1String(INDEXER_TESTS_SAMPLE_FILES_PATH) + QDir::separator() + fileName; +} + +void IndexerExtractorTests::benchMarkPlainTextExtractor() +{ + PlainTextExtractor plugin(this, QVariantList()); + + // generate a test file with varying number of words per line + QTemporaryFile file("XXXXXX.txt"); + QVERIFY(file.open()); + QByteArray chunk("foo bar "); + for (int line = 0; line < 10000; ++line) { + for (int i = 0; i < line % 100; ++i) { + file.write(chunk); + } + file.write("\n"); + } + + SimpleResult result(file.fileName(), "text/plain"); + + QBENCHMARK { + plugin.extract(&result); + } +} + +void IndexerExtractorTests::benchMarkManager() +{ + QBENCHMARK { + testImageExtractor(); + } +} + +void IndexerExtractorTests::testPlainTextExtractor() +{ + QScopedPointer plugin(new PlainTextExtractor(this, QVariantList())); + + SimpleResult result(testFilePath("plain_text_file.txt"), "text/plain"); + plugin->extract(&result); + + QString content; + QTextStream(&content) << "This is a text file\n" + << "it is four lines long\n" + << "it has 77 characters\n" + << "and 17 words.\n"; + + QCOMPARE(result.types().size(), 1); + QCOMPARE(result.types().first(), Type::Text); + + QCOMPARE(result.properties().size(), 1); + QCOMPARE(result.properties().value(Property::LineCount), QVariant(4)); + + content.replace(QLatin1Char('\n'), QLatin1Char(' ')); + QCOMPARE(result.text(), content); +} + +void IndexerExtractorTests::testImageExtractor() +{ + QScopedPointer manager(new ExtractorPluginManager(this)); + QList extractors = manager->fetchExtractors("image/png"); + if (extractors.isEmpty()) { + QSKIP("No extractors for image/png", SkipAll); + } + + SimpleResult result(testFilePath("tux.png"), "image/png"); + extractors.first()->extract(&result); + + QCOMPARE(result.types().size(), 1); + QCOMPARE(result.types().first(), Type::Image); + + QCOMPARE(result.properties().size(), 2); + QCOMPARE(result.properties().value(Property::Width), QVariant("386")); + QCOMPARE(result.properties().value(Property::Height), QVariant("395")); +} + +QTEST_KDEMAIN_CORE(IndexerExtractorTests) + diff --git a/kfilemetadata/autotests/indexerextractortests.h b/kfilemetadata/autotests/indexerextractortests.h new file mode 100644 index 00000000..bb3b1963 --- /dev/null +++ b/kfilemetadata/autotests/indexerextractortests.h @@ -0,0 +1,44 @@ +/* + This file is part of the Nepomuk KDE project. + Copyright (C) 2013 David Edmundson + + 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.1 of the License, or (at your option) version 3, or any + later version accepted by the membership of KDE e.V. (or its + successor approved by the membership of KDE e.V.), which shall + act as a proxy defined in Section 6 of version 3 of the license. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . +*/ + +#ifndef INDEXEREXTRACTORTESTS_H +#define INDEXEREXTRACTORTESTS_H + +#include +#include + +class IndexerExtractorTests : public QObject +{ + Q_OBJECT +public: + explicit IndexerExtractorTests(QObject* parent = 0); + +private: + QString testFilePath(const QString& fileName) const; + +private slots: + void benchMarkPlainTextExtractor(); + void benchMarkManager(); + void testPlainTextExtractor(); + void testImageExtractor(); +}; + +#endif // INDEXERTESTS_H diff --git a/kfilemetadata/autotests/indexerextractortestsconfig.h.in b/kfilemetadata/autotests/indexerextractortestsconfig.h.in new file mode 100644 index 00000000..0ef657de --- /dev/null +++ b/kfilemetadata/autotests/indexerextractortestsconfig.h.in @@ -0,0 +1,27 @@ +/* + This file is part of the Nepomuk KDE project. + Copyright (C) 2013 David Edmundson + + 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.1 of the License, or (at your option) version 3, or any + later version accepted by the membership of KDE e.V. (or its + successor approved by the membership of KDE e.V.), which shall + act as a proxy defined in Section 6 of version 3 of the license. + + 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library. If not, see . +*/ + +#ifndef INDEXEREXTRACTORTESTSCONFIG_H +#define INDEXEREXTRACTORTESTSCONFIG_H + +#define INDEXER_TESTS_SAMPLE_FILES_PATH "@CMAKE_CURRENT_SOURCE_DIR@/samplefiles" + +#endif diff --git a/kfilemetadata/autotests/propertyinfotest.cpp b/kfilemetadata/autotests/propertyinfotest.cpp new file mode 100644 index 00000000..509cd54e --- /dev/null +++ b/kfilemetadata/autotests/propertyinfotest.cpp @@ -0,0 +1,49 @@ +/* + * This file is part of the KDE KFileMetaData project + * Copyright (C) 2014 Vishesh Handa + * + * 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.1 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 + * + */ + +#include "propertyinfotest.h" +#include "propertyinfo.h" + +#include +#include + +using namespace KFileMetaData; + +void PropertyInfoTest::testNameIdMapping() +{ + // The +1 is to avoid the Empty Property + int i = static_cast(Property::FirstProperty) + 1; + int e = static_cast(Property::LastProperty); + + for (; i <= e; i++) { + Property::Property p = static_cast(i); + PropertyInfo pi(p); + + // qDebug() << pi.name(); + QCOMPARE(pi.property(), p); + QVERIFY(!pi.name().isEmpty()); + QVERIFY(!pi.displayName().isEmpty()); + + PropertyInfo pi2 = PropertyInfo::fromName(pi.name()); + QCOMPARE(pi2.property(), p); + } +} + +QTEST_KDEMAIN_CORE(PropertyInfoTest) diff --git a/kfilemetadata/autotests/propertyinfotest.h b/kfilemetadata/autotests/propertyinfotest.h new file mode 100644 index 00000000..677ade1a --- /dev/null +++ b/kfilemetadata/autotests/propertyinfotest.h @@ -0,0 +1,37 @@ +/* + * This file is part of the KDE KFileMetaData project + * Copyright (C) 2014 Vishesh Handa + * + * 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.1 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 + * + */ + +#ifndef PROPERTYINFOTEST_H +#define PROPERTYINFOTEST_H + +#include + +namespace KFileMetaData { + +class PropertyInfoTest : public QObject +{ + Q_OBJECT +private Q_SLOTS: + void testNameIdMapping(); +}; + +} + +#endif // PROPERTYINFOTEST_H diff --git a/kfilemetadata/autotests/samplefiles/README b/kfilemetadata/autotests/samplefiles/README new file mode 100644 index 00000000..6e50bdeb --- /dev/null +++ b/kfilemetadata/autotests/samplefiles/README @@ -0,0 +1,4 @@ +This folder contains various small files to be indexed by indexerextractortests. + +plain_text_file.txt + - extract metadata with "cat" and "wc" diff --git a/kfilemetadata/autotests/samplefiles/plain_text_file.txt b/kfilemetadata/autotests/samplefiles/plain_text_file.txt new file mode 100644 index 00000000..c84b8631 --- /dev/null +++ b/kfilemetadata/autotests/samplefiles/plain_text_file.txt @@ -0,0 +1,4 @@ +This is a text file +it is four lines long +it has 77 characters +and 17 words. diff --git a/kfilemetadata/autotests/samplefiles/tux.png b/kfilemetadata/autotests/samplefiles/tux.png new file mode 100644 index 00000000..2567fe7c Binary files /dev/null and b/kfilemetadata/autotests/samplefiles/tux.png differ diff --git a/kfilemetadata/autotests/simpleresult.cpp b/kfilemetadata/autotests/simpleresult.cpp new file mode 100644 index 00000000..8283e1ac --- /dev/null +++ b/kfilemetadata/autotests/simpleresult.cpp @@ -0,0 +1,59 @@ +/* + * + * Copyright (C) 2014 Vishesh Handa + * + * 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.1 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 + * + */ + +#include "simpleresult.h" + +using namespace KFileMetaData; + +SimpleResult::SimpleResult(const QString& url, const QString& mimetype) + : ExtractionResult(url, mimetype) +{ +} + +void SimpleResult::add(Property::Property property, const QVariant& value) +{ + m_properties.insertMulti(property, value); +} + +void SimpleResult::addType(Type::Type type) +{ + m_types << type; +} + +void SimpleResult::append(const QString& text) +{ + m_text.append(text); + m_text.append(QLatin1Char(' ')); +} + +PropertyMap SimpleResult::properties() const +{ + return m_properties; +} + +QString SimpleResult::text() const +{ + return m_text; +} + +QVector SimpleResult::types() const +{ + return m_types; +} diff --git a/kfilemetadata/autotests/simpleresult.h b/kfilemetadata/autotests/simpleresult.h new file mode 100644 index 00000000..f3793b5e --- /dev/null +++ b/kfilemetadata/autotests/simpleresult.h @@ -0,0 +1,51 @@ +/* + * + * Copyright (C) 2014 Vishesh Handa + * + * 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.1 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 + * + */ + +#ifndef KFILEMETADATA_SIMPLERESULT_H +#define KFILEMETADATA_SIMPLERESULT_H + +#include "extractionresult.h" +#include +#include + +namespace KFileMetaData { + +class SimpleResult : public ExtractionResult +{ +public: + SimpleResult(const QString& url, const QString& mimetype); + + virtual void add(Property::Property property, const QVariant& value); + virtual void addType(Type::Type type); + virtual void append(const QString& text); + + PropertyMap properties() const; + QString text() const; + QVector types() const; + +private: + PropertyMap m_properties; + QString m_text; + QVector m_types; +}; + +} + +#endif // KFILEMETADATA_SIMPLERESULT_H diff --git a/kfilemetadata/src/CMakeLists.txt b/kfilemetadata/src/CMakeLists.txt new file mode 100644 index 00000000..7f6500ed --- /dev/null +++ b/kfilemetadata/src/CMakeLists.txt @@ -0,0 +1,41 @@ +add_library(kfilemetadata SHARED + extractionresult.cpp + extractorplugin.cpp + extractorpluginmanager.cpp + propertyinfo.cpp + typeinfo.cpp +) + +target_link_libraries(kfilemetadata + ${QT_QTCORE_LIBRARY} + ${KDE4_KDECORE_LIBS} +) + +set_target_properties(kfilemetadata PROPERTIES + VERSION ${GENERIC_LIB_VERSION} + SOVERSION ${GENERIC_LIB_SOVERSION} +) + +install(TARGETS kfilemetadata ${INSTALL_TARGETS_DEFAULT_ARGS}) + +install(TARGETS kfilemetadata EXPORT KdeLibsLibraryTargets ${INSTALL_TARGETS_DEFAULT_ARGS}) +install(FILES kfilemetadataextractor.desktop DESTINATION ${KDE4_SERVICETYPES_INSTALL_DIR}) + +install(EXPORT KdeLibsLibraryTargets + DESTINATION ${KDE4_LIB_INSTALL_DIR}/cmake/KFileMetaData + FILE KFileMetaDataTargetsWithPrefix.cmake) + +install(FILES + extractionresult.h + extractorplugin.h + extractorpluginmanager.h + properties.h + propertyinfo.h + types.h + typeinfo.h + kfilemetadata_export.h + DESTINATION ${KDE4_INCLUDE_INSTALL_DIR}/kfilemetadata + COMPONENT Devel +) + +add_subdirectory(extractors) diff --git a/kfilemetadata/src/extractionresult.cpp b/kfilemetadata/src/extractionresult.cpp new file mode 100644 index 00000000..9bc7946f --- /dev/null +++ b/kfilemetadata/src/extractionresult.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2013 Vishesh Handa + * + * 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.1 of the License, or (at your option) version 3, or any + * later version accepted by the membership of KDE e.V. (or its + * successor approved by the membership of KDE e.V.), which shall + * act as a proxy defined in Section 6 of version 3 of the license. + * + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + */ + +#include "extractionresult.h" + +using namespace KFileMetaData; + +class ExtractionResult::Private { +public: + QString url; + QString mimetype; +}; + +ExtractionResult::ExtractionResult(const QString& url, const QString& mimetype) + : d(new Private) +{ + d->url = url; + d->mimetype = mimetype; +} + +ExtractionResult::ExtractionResult(const ExtractionResult& rhs) + : d(new Private(*rhs.d)) +{ +} + +ExtractionResult::~ExtractionResult() +{ + delete d; +} + +QString ExtractionResult::inputUrl() const +{ + return d->url; +} + +QString ExtractionResult::inputMimetype() const +{ + return d->mimetype; +} diff --git a/kfilemetadata/src/extractionresult.h b/kfilemetadata/src/extractionresult.h new file mode 100644 index 00000000..76dfe590 --- /dev/null +++ b/kfilemetadata/src/extractionresult.h @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2013 Vishesh Handa + * + * 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.1 of the License, or (at your option) version 3, or any + * later version accepted by the membership of KDE e.V. (or its + * successor approved by the membership of KDE e.V.), which shall + * act as a proxy defined in Section 6 of version 3 of the license. + * + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + */ + +#ifndef _KFILEMETADATA_EXTRACTIONRESULT_H +#define _KFILEMETADATA_EXTRACTIONRESULT_H + +#include +#include + +#include "kfilemetadata_export.h" +#include "properties.h" +#include "types.h" + +namespace KFileMetaData { + +/** + * \class ExtractionResult extractionresult.h + * + * \brief The ExtractionResult class is where all the data extracted by + * the indexer is saved. This class acts as a base class which should be + * dervied from and then passed to the relevant plugins. + * + * The dervied class needs to implement 3 pure virtual functions through + * which it receives the extracted data. + * + * \author Vishesh Handa + */ +class KFILEMETADATA_EXPORT ExtractionResult +{ +public: + ExtractionResult(const QString& url, const QString& mimetype); + ExtractionResult(const ExtractionResult& rhs); + virtual ~ExtractionResult(); + + /** + * The input url which the plugins will use to locate the file + */ + QString inputUrl() const; + + /* + * The input mimetype. This mimetype should correspond with the + * mimetypes supported with the relevant plugin when it is being + * passed to the Extractor + */ + QString inputMimetype() const; + + /** + * This function is called by plugins when they wish for some plain + * text to be indexed without any property. This generally corresponds + * to the text content in a file + */ + virtual void append(const QString& text) = 0; + + /** + * This function is called by the plugins when they wish to + * add a key value pair which should be indexed. This function may be + * called multiple times for the same key. + * + * \p property This specifies a property name. It should be one of the + * properties from the global list of properties. + * + * \p value The value of the property + */ + virtual void add(Property::Property property, const QVariant& value) = 0; + + /** + * This function is caleld by the plugins. + * A type is a higher level classification of the file. Any file can + * have multiple types. Eg - "Audio", "Video" or "Document" + * + * Please choose one type from the list of available types + */ + virtual void addType(Type::Type type) = 0; + +private: + class Private; + Private* d; +}; + +} + +#endif // _KFILEMETADATA_EXTRACTIONRESULT_H diff --git a/kfilemetadata/src/extractorplugin.cpp b/kfilemetadata/src/extractorplugin.cpp new file mode 100644 index 00000000..7980abf6 --- /dev/null +++ b/kfilemetadata/src/extractorplugin.cpp @@ -0,0 +1,144 @@ +/* + + Copyright (C) 2012 Vishesh Handa + Copyright (C) 2012 Jörg Ehrichs + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#include "extractorplugin.h" + +#include + +using namespace KFileMetaData; + +ExtractorPlugin::ExtractorPlugin(QObject* parent): QObject(parent) +{ +} + +ExtractorPlugin::~ExtractorPlugin() +{ +} + +// +// Helper functions +// + +QDateTime ExtractorPlugin::dateTimeFromString(const QString& dateString) +{ + QDateTime dateTime; + + if (!dateTime.isValid()) { + dateTime = QDateTime::fromString(dateString, QLatin1String("yyyy-MM-dd")); + dateTime.setTimeSpec(Qt::UTC); + } + if (!dateTime.isValid()) { + dateTime = QDateTime::fromString(dateString, QLatin1String("dd-MM-yyyy")); + dateTime.setTimeSpec(Qt::UTC); + } + if (!dateTime.isValid()) { + dateTime = QDateTime::fromString(dateString, QLatin1String("yyyy-MM")); + dateTime.setTimeSpec(Qt::UTC); + } + if (!dateTime.isValid()) { + dateTime = QDateTime::fromString(dateString, QLatin1String("MM-yyyy")); + dateTime.setTimeSpec(Qt::UTC); + } + if (!dateTime.isValid()) { + dateTime = QDateTime::fromString(dateString, QLatin1String("yyyy.MM.dd")); + dateTime.setTimeSpec(Qt::UTC); + } + if (!dateTime.isValid()) { + dateTime = QDateTime::fromString(dateString, QLatin1String("dd.MM.yyyy")); + dateTime.setTimeSpec(Qt::UTC); + } + if (!dateTime.isValid()) { + dateTime = QDateTime::fromString(dateString, QLatin1String("dd MMMM yyyy")); + dateTime.setTimeSpec(Qt::UTC); + } + if (!dateTime.isValid()) { + dateTime = QDateTime::fromString(dateString, QLatin1String("MM.yyyy")); + dateTime.setTimeSpec(Qt::UTC); + } + if (!dateTime.isValid()) { + dateTime = QDateTime::fromString(dateString, QLatin1String("yyyy.MM")); + dateTime.setTimeSpec(Qt::UTC); + } + if (!dateTime.isValid()) { + dateTime = QDateTime::fromString(dateString, QLatin1String("yyyy")); + dateTime.setTimeSpec(Qt::UTC); + } + if (!dateTime.isValid()) { + dateTime = QDateTime::fromString(dateString, QLatin1String("yy")); + dateTime.setTimeSpec(Qt::UTC); + } + if (!dateTime.isValid()) { + dateTime = QDateTime::fromString(dateString, Qt::ISODate); + } + if (!dateTime.isValid()) { + dateTime = QDateTime::fromString(dateString, QLatin1String("dddd d MMM yyyy h':'mm':'ss AP")); + dateTime.setTimeSpec(Qt::LocalTime); + } + if (!dateTime.isValid()) { + dateTime = QDateTime::fromString(dateString, QLatin1String("yyyy:MM:dd hh:mm:ss")); + dateTime.setTimeSpec(Qt::LocalTime); + } + if (!dateTime.isValid()) { + dateTime = QDateTime::fromString(dateString, Qt::SystemLocaleShortDate); + dateTime.setTimeSpec(Qt::UTC); + } + if (!dateTime.isValid()) { + dateTime = QDateTime::fromString(dateString, Qt::SystemLocaleShortDate); + dateTime.setTimeSpec(Qt::UTC); + } + if (!dateTime.isValid()) { + dateTime = QDateTime::fromString(dateString, Qt::SystemLocaleLongDate); + dateTime.setTimeSpec(Qt::UTC); + } + if (!dateTime.isValid()) { + kWarning() << "Could not determine correct datetime format from:" << dateString; + return QDateTime(); + } + + return dateTime; +} + +QStringList ExtractorPlugin::contactsFromString(const QString& string) +{ + QString cleanedString = string; + cleanedString = cleanedString.remove('{'); + cleanedString = cleanedString.remove('}'); + + QStringList contactStrings = string.split(',', QString::SkipEmptyParts); + if (contactStrings.size() == 1) + contactStrings = string.split(';', QString::SkipEmptyParts); + + if (contactStrings.size() == 1) + contactStrings = string.split(" ft ", QString::SkipEmptyParts); + + if (contactStrings.size() == 1) + contactStrings = string.split(" feat. ", QString::SkipEmptyParts); + + if (contactStrings.size() == 1) + contactStrings = string.split(" feat ", QString::SkipEmptyParts); + + QStringList list; + foreach(const QString& contactName, contactStrings) { + list << contactName.trimmed(); + } + + return list; +} diff --git a/kfilemetadata/src/extractorplugin.h b/kfilemetadata/src/extractorplugin.h new file mode 100644 index 00000000..d1cddd52 --- /dev/null +++ b/kfilemetadata/src/extractorplugin.h @@ -0,0 +1,112 @@ +/* + + Copyright (C) 2012 Vishesh Handa + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#ifndef _KFILEMETADATA_EXTRACTOR_H +#define _KFILEMETADATA_EXTRACTOR_H + +#include +#include + +#include "kfilemetadata_export.h" +#include "extractionresult.h" + +#include +#include + +namespace KFileMetaData +{ + +/** + * \class ExtractorPlugin extractorplugin.h + * + * \brief The ExtractorPlugin is the base class for all file metadata + * extractors. It is responsible for extracting the metadata in a file. + * + * Plugins should derive from this class and implement the mimetypes + * and extract method. + * + * All Plugins should be synchronous and blocking. + * + * \author Vishesh Handa + */ +class KFILEMETADATA_EXPORT ExtractorPlugin : public QObject +{ + Q_OBJECT +public: + ExtractorPlugin(QObject* parent); + virtual ~ExtractorPlugin(); + + /** + * Provide a list of mimetypes which are supported by this plugin. + * Only files with those mimetypes will be provided to the plugin via + * the extract function. + * + * This can also contains partial mimetypes like "text/", in that case + * this plugin will be chosen only if a better plugin does not exist. + * + * \return A StringList containing the mimetypes. + * \sa extract + */ + virtual QStringList mimetypes() const = 0; + + /** + * The main function of the plugin that is responsible for extracting + * the data and filling up the ExtractionResult + * + * The \p result provides the input url and mimetype which + * can be used to identify the file. + * + * This function is synchronous and should be reentrant as it + * can be called by multiple threads. + */ + virtual void extract(ExtractionResult* result) = 0; + + // + // Helper functions + // + + /** + * Tries to extract a valid date time from the string provided. + */ + static QDateTime dateTimeFromString(const QString& dateString); + + /** + * Tries to split the string into names. It cleans up any superflous words + * and removes extra junk such as curly braces + */ + static QStringList contactsFromString(const QString& string); + +private: + class Private; + Private* d; +}; +} + +/** + * Export a file extractor. + * + * \param classname The name of the subclass to export + * \param libname The name of the library which should export the extractor + */ +#define KFILEMETADATA_EXPORT_EXTRACTOR( classname, libname ) \ + K_PLUGIN_FACTORY(factory, registerPlugin();) \ + K_EXPORT_PLUGIN(factory(#libname)) + +#endif // _KFILEMETADATA_EXTRACTOR_H diff --git a/kfilemetadata/src/extractorpluginmanager.cpp b/kfilemetadata/src/extractorpluginmanager.cpp new file mode 100644 index 00000000..27859654 --- /dev/null +++ b/kfilemetadata/src/extractorpluginmanager.cpp @@ -0,0 +1,94 @@ +/* + * + * Copyright (C) 2012 Vishesh Handa + * + * 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.1 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 + * + */ + +#include "extractorplugin.h" +#include "extractorpluginmanager.h" + +#include +#include +#include +#include + +using namespace KFileMetaData; + +class ExtractorPluginManager::Private { +public: + QHash m_extractors; + + QList allExtractors() const; +}; + +ExtractorPluginManager::ExtractorPluginManager(QObject* parent) + : QObject(parent) + , d(new Private) +{ + QList all = d->allExtractors(); + + foreach (ExtractorPlugin* ex, all) { + foreach (const QString& type, ex->mimetypes()) { + d->m_extractors.insertMulti(type, ex); + } + } +} + +ExtractorPluginManager::~ExtractorPluginManager() +{ + qDeleteAll(d->m_extractors.values().toSet()); + delete d; +} + + +QList ExtractorPluginManager::Private::allExtractors() const +{ + // Get all the plugins + KService::List plugins = KServiceTypeTrader::self()->query("KFileMetaDataExtractor"); + + QList extractors; + KService::List::const_iterator it; + for (it = plugins.constBegin(); it != plugins.constEnd(); it++) { + KService::Ptr service = *it; + + QString error; + ExtractorPlugin* ex = service->createInstance(0, QVariantList(), &error); + if (!ex) { + kError() << "Could not create Extractor: " << service->library(); + kError() << error; + continue; + } + + extractors << ex; + } + + return extractors; +} + +QList ExtractorPluginManager::fetchExtractors(const QString& mimetype) const +{ + QList plugins = d->m_extractors.values(mimetype); + if (plugins.isEmpty()) { + QHash::const_iterator it = d->m_extractors.constBegin(); + for (; it != d->m_extractors.constEnd(); it++) { + if (mimetype.startsWith(it.key())) + plugins << it.value(); + } + } + + return plugins; +} diff --git a/kfilemetadata/src/extractorpluginmanager.h b/kfilemetadata/src/extractorpluginmanager.h new file mode 100644 index 00000000..d4a871e7 --- /dev/null +++ b/kfilemetadata/src/extractorpluginmanager.h @@ -0,0 +1,65 @@ +/* + * + * Copyright (C) 2012 Vishesh Handa + * + * 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.1 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 + * + */ + +#ifndef _KFILEMETADATA_EXTRACTORPLUGINMANAGER_H +#define _KFILEMETADATA_EXTRACTORPLUGINMANAGER_H + +#include +#include "kfilemetadata_export.h" + +namespace KFileMetaData +{ + +class ExtractorPlugin; + +/** + * \class ExtractorPluginManager extractorpluginmanager.h + * + * \brief The ExtractorPluginManager is a helper class which internally + * loads all the extractor plugins. It can be used to fetch a certain + * subset of thse pulgins based on a given mimetype. + * + * Once the appropriate plugins have been fetched, an ExtractionResult + * should be created and passed to the plugin's extract function. + * + * \author Vishesh Handa + */ +class KFILEMETADATA_EXPORT ExtractorPluginManager : public QObject +{ +public: + explicit ExtractorPluginManager(QObject* parent = 0); + virtual ~ExtractorPluginManager(); + + /** + * Fetch the extractors which can be used to extract + * data for the respective file with the given mimetype. + * + * If no match is found then all the plugins whose mimetype list + * starts with \p mimetype are returned. + */ + QList fetchExtractors(const QString& mimetype) const; + +private: + class Private; + Private* d; +}; +} + +#endif // _KFILEMETADATA_EXTRACTORPLUGINMANAGER_H diff --git a/kfilemetadata/src/extractors/CMakeLists.txt b/kfilemetadata/src/extractors/CMakeLists.txt new file mode 100644 index 00000000..ca274046 --- /dev/null +++ b/kfilemetadata/src/extractors/CMakeLists.txt @@ -0,0 +1,207 @@ +if(POPPLER_QT4_FOUND) + include_directories(${POPPLER_QT4_INCLUDE_DIR}) + + kde4_add_plugin(kfilemetadata_popplerextractor popplerextractor.cpp) + + target_link_libraries(kfilemetadata_popplerextractor + kfilemetadata + ${KDE4_KIO_LIBS} + ${POPPLER_QT4_LIBRARIES} + ) + + install( + FILES kfilemetadata_popplerextractor.desktop + DESTINATION ${KDE4_SERVICES_INSTALL_DIR}) + + install( + TARGETS kfilemetadata_popplerextractor + DESTINATION ${KDE4_PLUGIN_INSTALL_DIR}) + +endif(POPPLER_QT4_FOUND) + +if(TAGLIB_FOUND) + include_directories( ${TAGLIB_INCLUDES} ) + + kde4_add_plugin( kfilemetadata_taglibextractor taglibextractor.cpp ) + + target_link_libraries( kfilemetadata_taglibextractor + kfilemetadata + ${KDE4_KIO_LIBS} + ${TAGLIB_LIBRARIES} + ) + + install( + FILES kfilemetadata_taglibextractor.desktop + DESTINATION ${KDE4_SERVICES_INSTALL_DIR}) + + install( + TARGETS kfilemetadata_taglibextractor + DESTINATION ${KDE4_PLUGIN_INSTALL_DIR}) + +endif(TAGLIB_FOUND) + +if(EXIV2_FOUND) + include_directories( ${EXIV2_INCLUDE_DIR} ) + + set_source_files_properties( exiv2extractor.cpp PROPERTIES + COMPILE_FLAGS "${KDE4_ENABLE_EXCEPTIONS}" + ) + + kde4_add_plugin(kfilemetadata_exiv2extractor exiv2extractor.cpp) + + target_link_libraries(kfilemetadata_exiv2extractor + kfilemetadata + ${KDE4_KIO_LIBS} + ${EXIV2_LIBRARIES} + ) + + install( + FILES kfilemetadata_exiv2extractor.desktop + DESTINATION ${KDE4_SERVICES_INSTALL_DIR}) + + install( + TARGETS kfilemetadata_exiv2extractor + DESTINATION ${KDE4_PLUGIN_INSTALL_DIR}) + +endif(EXIV2_FOUND) + +if(FFMPEG_FOUND) + include_directories( ${FFMPEG_INCLUDE_DIRS} ) + + kde4_add_plugin(kfilemetadata_ffmpegextractor ffmpegextractor.cpp) + + target_link_libraries(kfilemetadata_ffmpegextractor + kfilemetadata + ${KDE4_KIO_LIBS} + ${FFMPEG_LIBRARIES} + ${AVUTIL_LIBRARIES} + ) + + install( + FILES kfilemetadata_ffmpegextractor.desktop + DESTINATION ${KDE4_SERVICES_INSTALL_DIR}) + + install( + TARGETS kfilemetadata_ffmpegextractor + DESTINATION ${KDE4_PLUGIN_INSTALL_DIR}) + +endif(FFMPEG_FOUND) + + +if(EPUB_FOUND) + include_directories( ${EPUB_INCLUDE_DIR} ) + + kde4_add_plugin(kfilemetadata_epubextractor epubextractor.cpp) + + target_link_libraries(kfilemetadata_epubextractor + kfilemetadata + ${KDE4_KIO_LIBS} + ${EPUB_LIBRARIES} + ) + + install( + FILES kfilemetadata_epubextractor.desktop + DESTINATION ${KDE4_SERVICES_INSTALL_DIR}) + + install( + TARGETS kfilemetadata_epubextractor + DESTINATION ${KDE4_PLUGIN_INSTALL_DIR}) + +endif(EPUB_FOUND) + +# +# Plain Text +# +kde4_add_plugin( kfilemetadata_plaintextextractor plaintextextractor.cpp ) + +target_link_libraries( kfilemetadata_plaintextextractor + kfilemetadata + ${KDE4_KIO_LIBS} +) + +install( +FILES kfilemetadata_plaintextextractor.desktop +DESTINATION ${KDE4_SERVICES_INSTALL_DIR}) + +install( +TARGETS kfilemetadata_plaintextextractor +DESTINATION ${KDE4_PLUGIN_INSTALL_DIR}) + +# +# ODF +# + +kde4_add_plugin(kfilemetadata_odfextractor odfextractor.cpp) + +target_link_libraries(kfilemetadata_odfextractor + kfilemetadata + ${KDE4_KIO_LIBS} +) + +install( +FILES kfilemetadata_odfextractor.desktop +DESTINATION ${KDE4_SERVICES_INSTALL_DIR}) + +install( +TARGETS kfilemetadata_odfextractor +DESTINATION ${KDE4_PLUGIN_INSTALL_DIR}) + +# +# Office 2007 +# + +kde4_add_plugin(kfilemetadata_office2007extractor office2007extractor.cpp) + +target_link_libraries(kfilemetadata_office2007extractor + kfilemetadata + ${KDE4_KIO_LIBS} +) + +install( +FILES kfilemetadata_office2007extractor.desktop +DESTINATION ${KDE4_SERVICES_INSTALL_DIR}) + +install( +TARGETS kfilemetadata_office2007extractor +DESTINATION ${KDE4_PLUGIN_INSTALL_DIR}) + +# +# Office (binary formats) +# + +kde4_add_plugin(kfilemetadata_officeextractor officeextractor.cpp) + +target_link_libraries(kfilemetadata_officeextractor + kfilemetadata + ${KDE4_KIO_LIBS} +) + +install( +FILES kfilemetadata_officeextractor.desktop +DESTINATION ${KDE4_SERVICES_INSTALL_DIR}) + +install( +TARGETS kfilemetadata_officeextractor +DESTINATION ${KDE4_PLUGIN_INSTALL_DIR}) + +# +# Mobipocket +# +if (QMOBIPOCKET_FOUND) + kde4_add_plugin(kfilemetadata_mobiextractor mobiextractor.cpp) + + include_directories(${QMOBIPOCKET_INCLUDE_DIR}) + target_link_libraries(kfilemetadata_mobiextractor + kfilemetadata + ${KDE4_KIO_LIBS} + ${QMOBIPOCKET_LIBRARIES} + ) + + install( + FILES kfilemetadata_mobiextractor.desktop + DESTINATION ${KDE4_SERVICES_INSTALL_DIR}) + + install( + TARGETS kfilemetadata_mobiextractor + DESTINATION ${KDE4_PLUGIN_INSTALL_DIR}) +endif(QMOBIPOCKET_FOUND) diff --git a/kfilemetadata/src/extractors/epubextractor.cpp b/kfilemetadata/src/extractors/epubextractor.cpp new file mode 100644 index 00000000..0f83cfdb --- /dev/null +++ b/kfilemetadata/src/extractors/epubextractor.cpp @@ -0,0 +1,184 @@ +/* + Copyright (C) 2013 Vishesh Handa + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#include "epubextractor.h" + +#include + +#include +#include +#include + +using namespace KFileMetaData; + +EPubExtractor::EPubExtractor(QObject* parent, const QVariantList&) + : ExtractorPlugin(parent) +{ + +} + +QStringList EPubExtractor::mimetypes() const +{ + QStringList types; + types << QLatin1String("application/epub+zip"); + + return types; +} + +namespace +{ +QString fetchMetadata(struct epub* e, const epub_metadata& type) +{ + int size = 0; + + unsigned char** data = epub_get_metadata(e, type, &size); + if (data) { + QStringList strList; + for (int i = 0; i < size; i++) { + strList << QString::fromUtf8((char*)data[i]); + free(data[i]); + } + free(data); + + return strList.join(";"); + } + return QString(); +} +} + + +void EPubExtractor::extract(ExtractionResult* result) +{ + struct epub* ePubDoc = epub_open(result->inputUrl().toUtf8().constData(), 1); + if (!ePubDoc) { + kError() << "Invalid document"; + return; + } + + result->addType(Type::Document); + + QString value = fetchMetadata(ePubDoc, EPUB_TITLE); + if (!value.isEmpty()) { + result->add(Property::Title, value); + } + + value = fetchMetadata(ePubDoc, EPUB_SUBJECT); + if (!value.isEmpty()) { + result->add(Property::Subject, value); + } + + value = fetchMetadata(ePubDoc, EPUB_CREATOR); + if (!value.isEmpty()) { + if (value.startsWith(QLatin1String("aut:"), Qt::CaseInsensitive)) { + value = value.mid(4).simplified(); + } else if (value.startsWith(QLatin1String("author:"), Qt::CaseInsensitive)) { + value = value.mid(7).simplified(); + } + + // A lot of authors have their name written in () again. We discard that part + int index = value.indexOf('('); + if (index) + value = value.mid(0, index); + + result->add(Property::Creator, value); + } + + // The Contributor just seems to be mostly Calibre aka the Generator + /* + value = fetchMetadata(ePubDoc, EPUB_CONTRIB); + if( !value.isEmpty() ) { + SimpleResource con; + con.addType( NCO::Contact() ); + con.addProperty( NCO::fullname(), value ); + + fileRes.addProperty( NCO::contributor(), con ); + graph << con; + }*/ + + value = fetchMetadata(ePubDoc, EPUB_PUBLISHER); + if (!value.isEmpty()) { + result->add(Property::Publisher, value); + } + + value = fetchMetadata(ePubDoc, EPUB_DESCRIPTION); + if (!value.isEmpty()) { + result->add(Property::Description, value); + } + + value = fetchMetadata(ePubDoc, EPUB_DATE); + if (!value.isEmpty()) { + if (value.startsWith("Unspecified:", Qt::CaseInsensitive)) { + value = value.mid(QString("Unspecified:").size()).simplified(); + } + int ind = value.indexOf("publication:", Qt::CaseInsensitive); + if (ind != -1) { + value = value.mid(ind + QString("publication:").size()).simplified(); + } + QDateTime dt = ExtractorPlugin::dateTimeFromString(value); + if (!dt.isNull()) + result->add(Property::CreationDate, value); + } + + // + // Plain Text + // + struct eiterator* iter = epub_get_iterator(ePubDoc, EITERATOR_SPINE, 0); + do { + char* curr = epub_it_get_curr(iter); + if (!curr) + continue; + QString html = QString::fromUtf8(curr); + + QTextDocument doc; + doc.setHtml(html); + result->append(doc.toPlainText()); + } while (epub_it_get_next(iter)); + + epub_free_iterator(iter); + + struct titerator* tit; + + tit = epub_get_titerator(ePubDoc, TITERATOR_NAVMAP, 0); + if (!tit) { + tit = epub_get_titerator(ePubDoc, TITERATOR_GUIDE, 0); + } + + if (epub_tit_curr_valid(tit)) { + do { + char* clink = epub_tit_get_curr_link(tit); + + char* data; + int size = epub_get_data(ePubDoc, clink, &data); + free(clink); + + // epub_get_data returns -1 on failure + if (size > 0 && data) { + QString html = QString::fromUtf8(data, size); + + QTextDocument doc; + doc.setHtml(html); + result->append(doc.toPlainText()); + free(data); + } + } while (epub_tit_next(tit)); + } + epub_free_titerator(tit); +} + +KFILEMETADATA_EXPORT_EXTRACTOR(KFileMetaData::EPubExtractor, "kfilemetadata_epubextractor") diff --git a/kfilemetadata/src/extractors/epubextractor.h b/kfilemetadata/src/extractors/epubextractor.h new file mode 100644 index 00000000..486a0496 --- /dev/null +++ b/kfilemetadata/src/extractors/epubextractor.h @@ -0,0 +1,39 @@ +/* + + Copyright (C) 2013 Vishesh Handa + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#ifndef EPUBEXTRACTOR_H +#define EPUBEXTRACTOR_H + +#include "extractorplugin.h" + +namespace KFileMetaData +{ + +class EPubExtractor : public ExtractorPlugin +{ +public: + EPubExtractor(QObject* parent, const QVariantList&); + + virtual void extract(ExtractionResult* result); + virtual QStringList mimetypes() const; +}; +} + +#endif // EPUBEXTRACTOR_H diff --git a/kfilemetadata/src/extractors/exiv2extractor.cpp b/kfilemetadata/src/extractors/exiv2extractor.cpp new file mode 100644 index 00000000..49b39fb6 --- /dev/null +++ b/kfilemetadata/src/extractors/exiv2extractor.cpp @@ -0,0 +1,209 @@ +/* + + Copyright (C) 2012 Vishesh Handa + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#include "exiv2extractor.h" + +#include + +using namespace KFileMetaData; + + +Exiv2Extractor::Exiv2Extractor(QObject* parent, const QVariantList&) + : ExtractorPlugin(parent) +{ + +} + +QStringList Exiv2Extractor::mimetypes() const +{ + QStringList types; + + types << QLatin1String("image/jp2") + << QLatin1String("image/jpeg") + << QLatin1String("image/pgf") + << QLatin1String("image/png") + << QLatin1String("image/tiff") + << QLatin1String("image/x-exv") + << QLatin1String("image/x-canon-cr2") + << QLatin1String("image/x-canon-crw") + << QLatin1String("image/x-fuji-raf") + << QLatin1String("image/x-minolta-mrw") + << QLatin1String("image/x-nikon-nef") + << QLatin1String("image/x-olympus-orf") + << QLatin1String("image/x-panasonic-rw2") + << QLatin1String("image/x-pentax-pef") + << QLatin1String("image/x-photoshop") + << QLatin1String("image/x-samsung-srw"); + + return types; +} + +namespace +{ +QString toString(const Exiv2::Value& value) +{ + std::string str = value.toString(); + return QString::fromUtf8(str.c_str(), str.length()); +} + +QVariant toVariantDateTime(const Exiv2::Value& value) +{ + if (value.typeId() == Exiv2::asciiString) { + QDateTime val = ExtractorPlugin::dateTimeFromString(value.toString().c_str()); + if (val.isValid()) { + // Datetime is stored in exif as local time. + val.setUtcOffset(0); + return QVariant(val); + } + } + + return QVariant(); +} + +QVariant toVariantLong(const Exiv2::Value& value) +{ + if (value.typeId() == Exiv2::unsignedLong || value.typeId() == Exiv2::signedLong) { + qlonglong val = value.toLong(); + return QVariant(val); + } + + QString str(toString(value)); + bool ok = false; + int val = str.toInt(&ok); + if (ok) + return QVariant(val); + + return QVariant(); +} + +QVariant toVariantDouble(const Exiv2::Value& value) +{ + if (value.typeId() == Exiv2::tiffFloat || value.typeId() == Exiv2::tiffDouble + || value.typeId() == Exiv2::unsignedRational || value.typeId() == Exiv2::signedRational) { + return QVariant(static_cast(value.toFloat())); + } + + QString str(toString(value)); + bool ok = false; + double val = str.toDouble(&ok); + if (ok) + return QVariant(val); + + return QVariant(); +} + +QVariant toVariantString(const Exiv2::Value& value) +{ + QString str = toString(value); + if (!str.isEmpty()) + return QVariant(str); + + return QVariant(); +} + +QVariant toVariant(const Exiv2::Value& value, QVariant::Type type) { + switch (type) { + case QVariant::Int: + return toVariantLong(value); + + case QVariant::DateTime: + return toVariantDateTime(value); + + case QVariant::Double: + return toVariantDouble(value); + + case QVariant::String: + default: + return toVariantString(value); + } +} +} + +void Exiv2Extractor::extract(ExtractionResult* result) +{ + QByteArray arr = result->inputUrl().toUtf8(); + std::string fileString(arr.data(), arr.length()); + + Exiv2::Image::AutoPtr image; + try { + image = Exiv2::ImageFactory::open(fileString); + } catch (const std::exception&) { + return; + } + if (!image.get()) { + return; + } + + try { + image->readMetadata(); + } catch (const std::exception&) { + return; + } + result->addType(Type::Image); + + if (image->pixelHeight()) { + result->add(Property::Height, image->pixelHeight()); + } + + if (image->pixelWidth()) { + result->add(Property::Width, image->pixelWidth()); + } + + std::string comment = image->comment(); + if (!comment.empty()) { + result->add(Property::Comment, QString::fromUtf8(comment.c_str(), comment.length())); + } + + const Exiv2::ExifData& data = image->exifData(); + + add(result, data, Property::ImageMake, "Exif.Image.Make", QVariant::String); + add(result, data, Property::ImageModel, "Exif.Image.Model", QVariant::String); + add(result, data, Property::ImageDateTime, "Exif.Image.DateTime", QVariant::DateTime); + add(result, data, Property::ImageOrientation, "Exif.Image.Orientation", QVariant::Int); + add(result, data, Property::PhotoFlash, "Exif.Photo.Flash", QVariant::Int); + add(result, data, Property::PhotoPixelXDimension, "Exif.Photo.PixelXDimension", QVariant::Int); + add(result, data, Property::PhotoPixelYDimension, "Exif.Photo.PixelYDimension", QVariant::Int); + add(result, data, Property::PhotoDateTimeOriginal, "Exif.Photo.DateTimeOriginal", QVariant::DateTime); + add(result, data, Property::PhotoFocalLength, "Exif.Photo.FocalLength", QVariant::Double); + add(result, data, Property::PhotoFocalLengthIn35mmFilm, "Exif.Photo.FocalLengthIn35mmFilm", QVariant::Double); + add(result, data, Property::PhotoExposureTime, "Exif.Photo.ExposureTime", QVariant::Double); + add(result, data, Property::PhotoExposureBiasValue, "Exif.Photo.ExposureBiasValue", QVariant::Double); + add(result, data, Property::PhotoFNumber, "Exif.Photo.FNumber", QVariant::Double); + add(result, data, Property::PhotoApertureValue, "Exif.Photo.ApertureValue", QVariant::Double); + add(result, data, Property::PhotoWhiteBalance, "Exif.Photo.WhiteBalance", QVariant::Int); + add(result, data, Property::PhotoMeteringMode, "Exif.Photo.MeteringMode", QVariant::Int); + add(result, data, Property::PhotoISOSpeedRatings, "Exif.Photo.ISOSpeedRatings", QVariant::Int); + add(result, data, Property::PhotoSaturation, "Exif.Photo.Saturation", QVariant::Int); + add(result, data, Property::PhotoSharpness, "Exif.Photo.Sharpness", QVariant::Int); +} + +void Exiv2Extractor::add(ExtractionResult* result, const Exiv2::ExifData& data, + Property::Property prop, const char* name, + QVariant::Type type) +{ + Exiv2::ExifData::const_iterator it = data.findKey(Exiv2::ExifKey(name)); + if (it != data.end()) { + QVariant value = toVariant(it->value(), type); + if (!value.isNull()) + result->add(prop, value); + } +} + +KFILEMETADATA_EXPORT_EXTRACTOR(KFileMetaData::Exiv2Extractor, "kmetaddata_exivextractor") diff --git a/kfilemetadata/src/extractors/exiv2extractor.h b/kfilemetadata/src/extractors/exiv2extractor.h new file mode 100644 index 00000000..9c2480b9 --- /dev/null +++ b/kfilemetadata/src/extractors/exiv2extractor.h @@ -0,0 +1,45 @@ +/* + + Copyright (C) 2012 Vishesh Handa + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#ifndef EXIV2EXTRACTOR_H +#define EXIV2EXTRACTOR_H + +#include "extractorplugin.h" +#include + +namespace KFileMetaData +{ + +class Exiv2Extractor : public ExtractorPlugin +{ +public: + Exiv2Extractor(QObject* parent, const QVariantList&); + + virtual void extract(ExtractionResult* result); + virtual QStringList mimetypes() const; + +private: + void add(ExtractionResult* result, const Exiv2::ExifData& data, + Property::Property prop, + const char* name, QVariant::Type type); +}; +} + +#endif // EXIV2EXTRACTOR_H diff --git a/kfilemetadata/src/extractors/ffmpegextractor.cpp b/kfilemetadata/src/extractors/ffmpegextractor.cpp new file mode 100644 index 00000000..c835bcdd --- /dev/null +++ b/kfilemetadata/src/extractors/ffmpegextractor.cpp @@ -0,0 +1,182 @@ +/* + + Copyright (C) 2012 Vishesh Handa + + Code adapted from Strigi FFmpeg Analyzer - + Copyright (C) 2010 Evgeny Egorochkin + Copyright (C) 2011 Tirtha Chatterjee + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#include "ffmpegextractor.h" + +#ifdef __cplusplus +#define __STDC_CONSTANT_MACROS +#ifdef _STDINT_H +#undef _STDINT_H +#endif +# include +#endif + +extern "C" { +#include +#include +#include +} + +#include +#include + +using namespace KFileMetaData; + +FFmpegExtractor::FFmpegExtractor(QObject* parent, const QVariantList&) +: ExtractorPlugin(parent) +{ +} + +QStringList FFmpegExtractor::mimetypes() const +{ + QStringList types; + + types << QLatin1String("video/x-ms-asf"); + types << QLatin1String("video/x-msvideo"); + types << QLatin1String("video/x-flv"); + types << QLatin1String("video/quicktime"); + types << QLatin1String("video/mpeg"); + types << QLatin1String("video/x-ms-wmv"); + types << QLatin1String("video/mp4"); + types << QLatin1String("video/x-matroska"); + types << QLatin1String("video/webm"); + + return types; +} + +void FFmpegExtractor::extract(ExtractionResult* result) +{ + AVFormatContext* fmt_ctx = NULL; + + av_register_all(); + + QByteArray arr = result->inputUrl().toUtf8(); + + fmt_ctx = avformat_alloc_context(); + if (int ret = avformat_open_input(&fmt_ctx, arr.data(), NULL, NULL)) { + kError() << "avformat_open_input error: " << ret; + return; + } + + int ret = avformat_find_stream_info(fmt_ctx, NULL); + if (ret < 0) { + kError() << "avform_find_stream_info error: " << ret; + return; + } + + result->addType(Type::Video); + + int totalSecs = fmt_ctx->duration / AV_TIME_BASE; + int bitrate = fmt_ctx->bit_rate; + + result->add(Property::Duration, totalSecs); + result->add(Property::BitRate, bitrate); + + for (uint i = 0; i < fmt_ctx->nb_streams; i++) { + const AVStream* stream = fmt_ctx->streams[i]; + const AVCodecContext* codec = stream->codec; + + if (codec->codec_type == AVMEDIA_TYPE_AUDIO || codec->codec_type == AVMEDIA_TYPE_VIDEO) { + /* + if( codec->codec_type == AVMEDIA_TYPE_AUDIO ) { + subRes.addType( NFO::Audio() ); + subRes.addProperty( NFO::sampleRate(), codec->sample_rate ); + subRes.addProperty( NFO::channels(), codec->channels ); + + //TODO: Fetch Sample Format + }*/ + + if (codec->codec_type == AVMEDIA_TYPE_VIDEO) { + int aspectRatio = codec->sample_aspect_ratio.num; + int frameRate = stream->avg_frame_rate.num; + + if (codec->sample_aspect_ratio.den) + aspectRatio /= codec->sample_aspect_ratio.den; + if (stream->avg_frame_rate.den) + frameRate /= stream->avg_frame_rate.den; + + result->add(Property::Width, codec->width); + result->add(Property::Height, codec->height); + if (aspectRatio) + result->add(Property::AspectRatio, aspectRatio); + if (frameRate) + result->add(Property::FrameRate, frameRate); + } + } + } + + AVDictionary* dict = fmt_ctx->metadata; + AVDictionaryEntry* entry; + + entry = av_dict_get(dict, "title", NULL, 0); + if (entry) { + result->add(Property::Title, QString::fromUtf8(entry->value)); + } + + + entry = av_dict_get(dict, "author", NULL, 0); + if (entry) { + result->add(Property::Author, QString::fromUtf8(entry->value)); + } + + entry = av_dict_get(dict, "copyright", NULL, 0); + if (entry) { + result->add(Property::Copyright, QString::fromUtf8(entry->value)); + } + + entry = av_dict_get(dict, "comment", NULL, 0); + if (entry) { + result->add(Property::Comment, QString::fromUtf8(entry->value)); + } + + entry = av_dict_get(dict, "album", NULL, 0); + if (entry) { + result->add(Property::Album, QString::fromUtf8(entry->value)); + } + + entry = av_dict_get(dict, "genre", NULL, 0); + if (entry) { + result->add(Property::Genre, QString::fromUtf8(entry->value)); + } + + entry = av_dict_get(dict, "track", NULL, 0); + if (entry) { + QString value = QString::fromUtf8(entry->value); + + bool ok = false; + int track = value.toInt(&ok); + if (ok && track) + result->add(Property::TrackNumber, track); + } + + entry = av_dict_get(dict, "year", NULL, 0); + if (entry) { + int year = QString::fromUtf8(entry->value).toInt(); + result->add(Property::ReleaseYear, year); + } + + avformat_close_input(&fmt_ctx); +} + +KFILEMETADATA_EXPORT_EXTRACTOR(KFileMetaData::FFmpegExtractor, "kfilemetadata_ffmpegextractor") diff --git a/kfilemetadata/src/extractors/ffmpegextractor.h b/kfilemetadata/src/extractors/ffmpegextractor.h new file mode 100644 index 00000000..5165c801 --- /dev/null +++ b/kfilemetadata/src/extractors/ffmpegextractor.h @@ -0,0 +1,39 @@ +/* + + Copyright (C) 2012 Vishesh Handa + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#ifndef FFMPEGEXTRACTOR_H +#define FFMPEGEXTRACTOR_H + +#include "extractorplugin.h" + +namespace KFileMetaData +{ + +class FFmpegExtractor : public ExtractorPlugin +{ +public: + FFmpegExtractor(QObject* parent, const QVariantList&); + + virtual void extract(ExtractionResult* result); + virtual QStringList mimetypes() const; +}; +} + +#endif // FFMPEGEXTRACTOR_H diff --git a/kfilemetadata/src/extractors/kfilemetadata_epubextractor.desktop b/kfilemetadata/src/extractors/kfilemetadata_epubextractor.desktop new file mode 100644 index 00000000..544e8140 --- /dev/null +++ b/kfilemetadata/src/extractors/kfilemetadata_epubextractor.desktop @@ -0,0 +1,42 @@ +[Desktop Entry] +Type=Service +X-KDE-ServiceTypes=KFileMetaDataExtractor +X-KDE-Library=kfilemetadata_epubextractor +Name=KFileMetaData EPub Extractor +Name[bs]=KFileMetaData EPub ekstraktor +Name[ca]=Extractor EPub del KFileMetaData +Name[ca@valencia]=Extractor EPub del KFileMetaData +Name[cs]=Extraktor EPub KFileMetaData +Name[da]=KFileMetaData EPub-udtrækker +Name[de]=EPub-Extraktion für KFileMetaData +Name[el]=Εξαγωγέας EPub KFileMetaData +Name[en_GB]=KFileMetaData EPub Extractor +Name[es]=Extractor de EPub para KFileMetaData +Name[et]=KFileMetaData EPubi ekstraktimine +Name[fi]=KFileMetaDatan EPub-lukuohjelma +Name[fr]=Extracteur EPub de KFileMetaData +Name[gl]=Extractor de EPub de KFileMetaData +Name[hu]=KFileMetaData EPub kibontó +Name[ia]=KFileMetadata Extractor de EPub +Name[it]=Estrattore EPub di KFileMetaData +Name[ko]=KFileMetaData EPub 추출기 +Name[lt]=KFileMetaData EPub ekstraktorius +Name[nb]=KFileMetaData EPub-uttrekker +Name[nds]=KFile-Metadaten-EPub-Leser +Name[nl]=Extractieprogramma voor KFileMetaData EPub +Name[pl]=Wydobywanie z EPub dla KFileMetaData +Name[pt]=Extracção de EPub do KFileMetaData +Name[pt_BR]=Extrator de EPub do KFileMetaData +Name[ru]=Модуль извлечения метаданных из файлов EPub +Name[sk]=Extraktor KFileMetaData EPub +Name[sl]=Program za izvleko EPub za KFileMetaData +Name[sr]=Издвајач ЕПУБ‑а (KFileMetaData) +Name[sr@ijekavian]=Издвајач ЕПУБ‑а (KFileMetaData) +Name[sr@ijekavianlatin]=Izdvajač EPUB‑a (KFileMetaData) +Name[sr@latin]=Izdvajač EPUB‑a (KFileMetaData) +Name[sv]=Kfilmetadata EPub-extrahering +Name[tr]=KFileMetaData EPub Çıkarıcı +Name[uk]=Засіб видобування метаданих EPub +Name[x-test]=xxKFileMetaData EPub Extractorxx +Name[zh_CN]=KFileMetaData EPub 提取工具 +Name[zh_TW]=KFileMetaData EPub 展開器 diff --git a/kfilemetadata/src/extractors/kfilemetadata_exiv2extractor.desktop b/kfilemetadata/src/extractors/kfilemetadata_exiv2extractor.desktop new file mode 100644 index 00000000..0ac14574 --- /dev/null +++ b/kfilemetadata/src/extractors/kfilemetadata_exiv2extractor.desktop @@ -0,0 +1,42 @@ +[Desktop Entry] +Type=Service +X-KDE-ServiceTypes=KFileMetaDataExtractor +X-KDE-Library=kfilemetadata_exiv2extractor +Name=KFileMetaData Exiv2 Extractor +Name[bs]=KFileMetaData Exiv2 ekstraktor +Name[ca]=Extractor Exiv2 del KFileMetaData +Name[ca@valencia]=Extractor Exiv2 del KFileMetaData +Name[cs]=Extraktor Exiv2 KFileMetaData +Name[da]=KFileMetaData Exiv2-udtrækker +Name[de]=Exiv2-Extraktion für KFileMetaData +Name[el]=Εξαγωγέας Exiv2 KFileMetaData +Name[en_GB]=KFileMetaData Exiv2 Extractor +Name[es]=Extractor de Exiv2 para KFileMetaData +Name[et]=KFileMetaData Exiv2 ekstraktimine +Name[fi]=KFileMetaDatan Exiv2-lukuohjelma +Name[fr]=Extracteur Exiv2 de KFileMetaData +Name[gl]=Extractor de Exiv2 de KFileMetaData +Name[hu]=KFileMetaData Exiv2 kibontó +Name[ia]=Extractor de KFileMetaData Exiv2 +Name[it]=Estrattore Exiv2 di KFileMetaData +Name[ko]=KFileMetaData Exiv2 추출기 +Name[lt]=KFileMetaData Exiv2 ekstraktorius +Name[nb]=KFileMetaData Eviv2-uttrekker +Name[nds]=KFile-Metadaten-Exiv2-Leser +Name[nl]=Extractieprogramma voor KFileMetaData Exiv2 +Name[pl]=Wydobywanie z Exiv2 dla KFileMetaData +Name[pt]=Extracção de Exiv2 do KFileMetaData +Name[pt_BR]=Extrator de Exiv2 do KFileMetaData +Name[ru]=Модуль извлечения метаданных изображений с помощью Exiv2 +Name[sk]=Extraktor KFileMetaData Exiv2 +Name[sl]=Program za izvleko Exiv2 za KFileMetaData +Name[sr]=Издвајач Ексивом 2 (KFileMetaData) +Name[sr@ijekavian]=Издвајач Ексивом 2 (KFileMetaData) +Name[sr@ijekavianlatin]=Izdvajač Exivom 2 (KFileMetaData) +Name[sr@latin]=Izdvajač Exivom 2 (KFileMetaData) +Name[sv]=Kfilmetadata Exiv2-extrahering +Name[tr]=KFileMetaData Exiv2 Çıkarıcı +Name[uk]=Засіб видобування метаданих Exiv2 +Name[x-test]=xxKFileMetaData Exiv2 Extractorxx +Name[zh_CN]=KFileMetaData Exiv2 提取工具 +Name[zh_TW]=KFileMetaData Exiv2 展開器 diff --git a/kfilemetadata/src/extractors/kfilemetadata_ffmpegextractor.desktop b/kfilemetadata/src/extractors/kfilemetadata_ffmpegextractor.desktop new file mode 100644 index 00000000..296f0f00 --- /dev/null +++ b/kfilemetadata/src/extractors/kfilemetadata_ffmpegextractor.desktop @@ -0,0 +1,42 @@ +[Desktop Entry] +Type=Service +X-KDE-ServiceTypes=KFileMetaDataExtractor +X-KDE-Library=kfilemetadata_ffmpegextractor +Name=KFileMetaData FFmpeg Extractor +Name[bs]=KFileMetaData FFmpeg ekstraktor +Name[ca]=Extractor FFmpeg del KFileMetaData +Name[ca@valencia]=Extractor FFmpeg del KFileMetaData +Name[cs]=Extraktor FFmpeg KFileMetaData +Name[da]=KFileMetaData FFmpeg-udtrækker +Name[de]=FFmpeg-Extraktion für KFileMetaData +Name[el]=Εξαγωγέας FFmpeg KFileMetaData +Name[en_GB]=KFileMetaData FFmpeg Extractor +Name[es]=Extractor de FFmpeg para KFileMetaData +Name[et]=KFileMetaData FFmpegi ekstraktimine +Name[fi]=KFileMetaDatan FFmpeg-lukuohjelma +Name[fr]=Extracteur FFmpeg de KFileMetaData +Name[gl]=Extractor de FFmpeg de KFileMetaData +Name[hu]=KFileMetaData FFmpeg kibontó +Name[ia]=Extractor de KFileMetaData FFmpeg +Name[it]=Estrattore FFmpeg di KFileMetaData +Name[ko]=KFileMetaData FFmpeg 추출기 +Name[lt]=KFileMetaData FFmpeg ekstraktorius +Name[nb]=KFileMetaData FFmpeg-uttrekker +Name[nds]=KFile-Metadaten-FFmpeg-Leser +Name[nl]=Extractieprogramma voor KFileMetaData FFmpeg +Name[pl]=Wydobywanie z FFmpeg dla KFileMetaData +Name[pt]=Extracção de FFmpeg do KFileMetaData +Name[pt_BR]=Extrator de FFmpeg do KFileMetaData +Name[ru]=Модуль извлечения метаданных видеофайлов с помощью FFmpeg +Name[sk]=Extraktor KFileMetaData FFmpeg +Name[sl]=Program za izvleko FFmpeg za KFileMetaData +Name[sr]=Издвајач ФФмпегом (KFileMetaData) +Name[sr@ijekavian]=Издвајач ФФмпегом (KFileMetaData) +Name[sr@ijekavianlatin]=Izdvajač FFmpegom (KFileMetaData) +Name[sr@latin]=Izdvajač FFmpegom (KFileMetaData) +Name[sv]=Kfilmetadata FFmpeg-extrahering +Name[tr]=KFileMetaData FFmpeg Çıkarıcı +Name[uk]=Засіб видобування метаданих FFmpeg +Name[x-test]=xxKFileMetaData FFmpeg Extractorxx +Name[zh_CN]=KFileMetaData FFmpeg 提取工具 +Name[zh_TW]=KFileMetaData FFmpeg 展開器 diff --git a/kfilemetadata/src/extractors/kfilemetadata_mobiextractor.desktop b/kfilemetadata/src/extractors/kfilemetadata_mobiextractor.desktop new file mode 100644 index 00000000..50fb6e28 --- /dev/null +++ b/kfilemetadata/src/extractors/kfilemetadata_mobiextractor.desktop @@ -0,0 +1,42 @@ +[Desktop Entry] +Type=Service +X-KDE-ServiceTypes=KFileMetaDataExtractor +X-KDE-Library=kfilemetadata_mobiextractor +Name=KFileMetaData Mobi Extractor +Name[bs]=KFileMetaData Mobi ekstraktor +Name[ca]=Extractor Mobi del KFileMetaData +Name[ca@valencia]=Extractor Mobi del KFileMetaData +Name[cs]=Extraktor Mobi KFileMetaData +Name[da]=KFileMetaData Mobi-udtrækker +Name[de]=Mobi-Extraktion für KFileMetaData +Name[el]=Εξαγωγέας Mobi KFileMetaData +Name[en_GB]=KFileMetaData Mobi Extractor +Name[es]=Extractor de Mobi para KFileMetaData +Name[et]=KFileMetaData Mobi ekstraktimine +Name[fi]=KFileMetaDatan Mobi-lukuohjelma +Name[fr]=Extracteur Mobi de KFileMetaData +Name[gl]=Extractor de Mobi de KFileMetaData +Name[hu]=KFileMetaData Mobi kibontó +Name[ia]=Extractor de KFileMetaData Mobi +Name[it]=Estrattore Mobi di KFileMetaData +Name[ko]=KFileMetaData Mobi 추출기 +Name[lt]=KFileMetaData Mobi ekstraktorius +Name[nb]=KFileMetaData Mobi-uttrekker +Name[nds]=KFile-Metadaten-Mobi-Leser +Name[nl]=Extractieprogramma voor KFileMetaData Mobi +Name[pl]=Wydobywanie z Mobi dla KFileMetaData +Name[pt]=Extracção de Mobi do KFileMetaData +Name[pt_BR]=Extrator de Mobi do KFileMetaData +Name[ru]=Модуль извлечения метаданных из файлов Mobi +Name[sk]=Extraktor KFileMetaData Mobi +Name[sl]=Program za izvleko Mobi za KFileMetaData +Name[sr]=Издвајач Мобипокета (KFileMetaData) +Name[sr@ijekavian]=Издвајач Мобипокета (KFileMetaData) +Name[sr@ijekavianlatin]=Izdvajač Mobipocketa (KFileMetaData) +Name[sr@latin]=Izdvajač Mobipocketa (KFileMetaData) +Name[sv]=Kfilmetadata Mobi-extrahering +Name[tr]=KFileMetaData Mobi Çıkarıcı +Name[uk]=Засіб видобування метаданих Mobi +Name[x-test]=xxKFileMetaData Mobi Extractorxx +Name[zh_CN]=KFileMetaData Mobi 提取工具 +Name[zh_TW]=KFileMetaData Mobi 展開器 diff --git a/kfilemetadata/src/extractors/kfilemetadata_odfextractor.desktop b/kfilemetadata/src/extractors/kfilemetadata_odfextractor.desktop new file mode 100644 index 00000000..69220f0b --- /dev/null +++ b/kfilemetadata/src/extractors/kfilemetadata_odfextractor.desktop @@ -0,0 +1,42 @@ +[Desktop Entry] +Type=Service +X-KDE-ServiceTypes=KFileMetaDataExtractor +X-KDE-Library=kfilemetadata_odfextractor +Name=KFileMetaData Odf Extractor +Name[bs]=KFileMetaData Odf ekstraktor +Name[ca]=Extractor Odf del KFileMetaData +Name[ca@valencia]=Extractor Odf del KFileMetaData +Name[cs]=Extraktor Odf KFileMetaData +Name[da]=KFileMetaData Odf-udtrækker +Name[de]=ODF-Extraktion für KFileMetaData +Name[el]=Εξαγωγέας Odf KFileMetaData +Name[en_GB]=KFileMetaData ODF Extractor +Name[es]=Extractor de Odf para KFileMetaData +Name[et]=KFileMetaData Odfi ekstraktimine +Name[fi]=KFileMetaDatan Odf-lukuohjelma +Name[fr]=Extracteur Odf de KFileMetaData +Name[gl]=Extractor de Odf de KFileMetaData +Name[hu]=KFileMetaData Odf kibontó +Name[ia]=Extractor de KFileMetaData Odf +Name[it]=Estrattore Odf di KFileMetaData +Name[ko]=KFileMetaData Odf 추출기 +Name[lt]=KFileMetaData Odf ekstraktorius +Name[nb]=KFileMetaData Odf-uttrekker +Name[nds]=KFile-Metadaten-ODF-Leser +Name[nl]=Extractieprogramma voor KFileMetaData Odf +Name[pl]=Wydobywanie z Odf dla KFileMetaData +Name[pt]=Extracção de ODF do KFileMetaData +Name[pt_BR]=Extrator de ODF do KFileMetaData +Name[ru]=Модуль извлечения метаданных из файлов OpenDocument Format +Name[sk]=Extraktor KFileMetaData Odf +Name[sl]=Program za izvleko Odf za KFileMetaData +Name[sr]=Издвајач ОДФ‑а (KFileMetaData) +Name[sr@ijekavian]=Издвајач ОДФ‑а (KFileMetaData) +Name[sr@ijekavianlatin]=Izdvajač ODF‑a (KFileMetaData) +Name[sr@latin]=Izdvajač ODF‑a (KFileMetaData) +Name[sv]=Kfilmetadata ODF-extrahering +Name[tr]=KFileMetaData Odf Çıkarıcı +Name[uk]=Засіб видобування метаданих ODF +Name[x-test]=xxKFileMetaData Odf Extractorxx +Name[zh_CN]=KFileMetaData Odf 提取工具 +Name[zh_TW]=KFileMetaData Odf 展開器 diff --git a/kfilemetadata/src/extractors/kfilemetadata_office2007extractor.desktop b/kfilemetadata/src/extractors/kfilemetadata_office2007extractor.desktop new file mode 100644 index 00000000..4a41aa96 --- /dev/null +++ b/kfilemetadata/src/extractors/kfilemetadata_office2007extractor.desktop @@ -0,0 +1,42 @@ +[Desktop Entry] +Type=Service +X-KDE-ServiceTypes=KFileMetaDataExtractor +X-KDE-Library=kfilemetadata_office2007extractor +Name=KFileMetaData Office2007 Extractor +Name[bs]=KFileMetaData Office2007 ekstraktor +Name[ca]=Extractor Office2007 del KFileMetaData +Name[ca@valencia]=Extractor Office2007 del KFileMetaData +Name[cs]=Extraktor Office2007 KFileMetaData +Name[da]=KFileMetaData Office2007-udtrækker +Name[de]=Office 2007-Extraktion für KFileMetaData +Name[el]=Εξαγωγέας Office2007 KFileMetaData +Name[en_GB]=KFileMetaData Office2007 Extractor +Name[es]=Extractor de Office2007 para KFileMetaData +Name[et]=KFileMetaData Office2007 ekstraktimine +Name[fi]=KFileMetaDatan Office2007-lukuohjelma +Name[fr]=Extracteur Office2007 de KFileMetaData +Name[gl]=Extractor de Office2007 de KFileMetaData +Name[hu]=KFileMetaData Office2007 kibontó +Name[ia]=Extractor de KFileMetaData Office2007 +Name[it]=Estrattore Office2007 di KFileMetaData +Name[ko]=KFileMetaData Office2007 추출기 +Name[lt]=KFileMetaData Office2007 ekstraktorius +Name[nb]=KFileMetaData Office2007-uttrekker +Name[nds]=KFile-Metadaten-Office2007-Leser +Name[nl]=Extractieprogramma voor KFileMetaData Office2007 +Name[pl]=Wydobywanie z Office2007 dla KFileMetaData +Name[pt]=Extracção de Office2007 do KFileMetaData +Name[pt_BR]=Extrator de Office 2007 do KFileMetaData +Name[ru]=Модуль извлечения метаданных из файлов Office2007 +Name[sk]=Extraktor KFileMetaData Office2007 +Name[sl]=Program za izvleko Office2007 za KFileMetaData +Name[sr]=Издвајач МС Офиса 2007 (KFileMetaData) +Name[sr@ijekavian]=Издвајач МС Офиса 2007 (KFileMetaData) +Name[sr@ijekavianlatin]=Izdvajač MS Officea 2007 (KFileMetaData) +Name[sr@latin]=Izdvajač MS Officea 2007 (KFileMetaData) +Name[sv]=Kfilmetadata Office 2007-extrahering +Name[tr]=KFileMetaData Office2007 Çıkarıcı +Name[uk]=Засіб видобування метаданих Office2007 +Name[x-test]=xxKFileMetaData Office2007 Extractorxx +Name[zh_CN]=KFileMetaData Office2007 提取工具 +Name[zh_TW]=KFileMetaData Office2007 展開器 diff --git a/kfilemetadata/src/extractors/kfilemetadata_officeextractor.desktop b/kfilemetadata/src/extractors/kfilemetadata_officeextractor.desktop new file mode 100644 index 00000000..c38843f3 --- /dev/null +++ b/kfilemetadata/src/extractors/kfilemetadata_officeextractor.desktop @@ -0,0 +1,42 @@ +[Desktop Entry] +Type=Service +X-KDE-ServiceTypes=KFileMetaDataExtractor +X-KDE-Library=kfilemetadata_officeextractor +Name=KFileMetaData Office Extractor +Name[bs]=KFileMetaData Office ekstraktor +Name[ca]=Extractor Office del KFileMetaData +Name[ca@valencia]=Extractor Office del KFileMetaData +Name[cs]=Extraktor Office KFileMetaData +Name[da]=KFileMetaData Office-udtrækker +Name[de]=Office-Extraktion für KFileMetaData +Name[el]=Εξαγωγέας Office KFileMetaData +Name[en_GB]=KFileMetaData Office Extractor +Name[es]=Extractor de Office para KFileMetaData +Name[et]=KFileMetaData Office'i ekstraktimine +Name[fi]=KFileMetaDatan Office-lukuohjelma +Name[fr]=Extracteur Office de KFileMetaData +Name[gl]=Extractor de Office de KFileMetaData +Name[hu]=KFileMetaData Office kibontó +Name[ia]=Extractor de KFileMetaData Office +Name[it]=Estrattore Office di KFileMetaData +Name[ko]=KFileMetaData Office 추출기 +Name[lt]=KFileMetaData Office ekstraktorius +Name[nb]=KFileMetaData Office-uttrekker +Name[nds]=KFile-Metadaten-Office-Leser +Name[nl]=Extractieprogramma voor KFileMetaData Office +Name[pl]=Wydobywanie z Office dla KFileMetaData +Name[pt]=Extracção de Office do KFileMetaData +Name[pt_BR]=Extrator de Office do KFileMetaData +Name[ru]=Модуль извлечения метаданных из файлов Office +Name[sk]=Extraktor KFileMetaData Office +Name[sl]=Program za izvleko Office za KFileMetaData +Name[sr]=Издвајач МС Офиса (KFileMetaData) +Name[sr@ijekavian]=Издвајач МС Офиса (KFileMetaData) +Name[sr@ijekavianlatin]=Izdvajač MS Officea (KFileMetaData) +Name[sr@latin]=Izdvajač MS Officea (KFileMetaData) +Name[sv]=Kfilmetadata Office-extrahering +Name[tr]=KFileMetaData Office Çıkarıcı +Name[uk]=Засіб видобування метаданих Office +Name[x-test]=xxKFileMetaData Office Extractorxx +Name[zh_CN]=KFileMetaData Office 提取工具 +Name[zh_TW]=KFileMetaData Office 展開器 diff --git a/kfilemetadata/src/extractors/kfilemetadata_plaintextextractor.desktop b/kfilemetadata/src/extractors/kfilemetadata_plaintextextractor.desktop new file mode 100644 index 00000000..35e6abd2 --- /dev/null +++ b/kfilemetadata/src/extractors/kfilemetadata_plaintextextractor.desktop @@ -0,0 +1,42 @@ +[Desktop Entry] +Type=Service +X-KDE-ServiceTypes=KFileMetaDataExtractor +X-KDE-Library=kfilemetadata_plaintextextractor +Name=KFileMetaData Plain Text Extractor +Name[bs]=KFileMetaData ekstraktor običnog teksta +Name[ca]=Extractor de text del KFileMetaData +Name[ca@valencia]=Extractor de text del KFileMetaData +Name[cs]=Extraktor čistého textu KFileMetaData +Name[da]=KFileMetaData Klartekst-udtrækker +Name[de]=Extraktion von einfachen Text für KFileMetaData +Name[el]=Εξαγωγέας απλού κειμένου KFileMetaData +Name[en_GB]=KFileMetaData Plain Text Extractor +Name[es]=Extractor de texto sin formato para KFileMetaData +Name[et]=KFileMetaData lihtteksti ekstraktimine +Name[fi]=KFileMetaDatan muotoilemattoman tekstin lukuohjelma +Name[fr]=Extracteur texte brut de KFileMetaData +Name[gl]=Extractor de texto simple de KFileMetaData +Name[hu]=KFileMetaData egyszerű szöveg kibontó +Name[ia]=Extractor de KFileMetaData Texto Plan +Name[it]=Estrattore per testo semplice di KFileMetaData +Name[ko]=KFileMetaData 일반 텍스트 추출기 +Name[lt]=KFileMetaData Paprastojo teksti ekstraktorius +Name[nb]=KFileMetaData uttrekker for ren tekst +Name[nds]=KFile-Metadaten-Eenfachtext-Leser +Name[nl]=Extractieprogramma voor KFileMetaData Plain Text +Name[pl]=Wydobywanie zwykłego tekstu dla KFileMetaData +Name[pt]=Extracção de Texto Simples do KFileMetaData +Name[pt_BR]=Extrator de Texto Simples do KFileMetaData +Name[ru]=Модуль извлечения метаданных из простых текстовых файлов +Name[sk]=Extraktor KFileMetaData Plain Text +Name[sl]=Program za izvleko golega besedila za KFileMetaData +Name[sr]=Издвајач обичног текста (KFileMetaData) +Name[sr@ijekavian]=Издвајач обичног текста (KFileMetaData) +Name[sr@ijekavianlatin]=Izdvajač običnog teksta (KFileMetaData) +Name[sr@latin]=Izdvajač običnog teksta (KFileMetaData) +Name[sv]=Kfilmetadata vanlig textextrahering +Name[tr]=KFileMetaData Düz Metin Çıkarıcı +Name[uk]=Засіб видобування метаданих з неформатованого тексту +Name[x-test]=xxKFileMetaData Plain Text Extractorxx +Name[zh_CN]=KFileMetaData 纯文本提取工具 +Name[zh_TW]=KFileMetaData 純文字檔展開器 diff --git a/kfilemetadata/src/extractors/kfilemetadata_popplerextractor.desktop b/kfilemetadata/src/extractors/kfilemetadata_popplerextractor.desktop new file mode 100644 index 00000000..5cf7e8ad --- /dev/null +++ b/kfilemetadata/src/extractors/kfilemetadata_popplerextractor.desktop @@ -0,0 +1,42 @@ +[Desktop Entry] +Type=Service +X-KDE-ServiceTypes=KFileMetaDataExtractor +X-KDE-Library=kfilemetadata_popplerextractor +Name=KFileMetaData Poppler Extractor +Name[bs]=KFileMetaData Poppler ekstraktor +Name[ca]=Extractor Poppler del KFileMetaData +Name[ca@valencia]=Extractor Poppler del KFileMetaData +Name[cs]=Extraktor Poppler KFileMetaData +Name[da]=KFileMetaData Poppler-udtrækker +Name[de]=Poppler-Extraktion für KFileMetaData +Name[el]=Εξαγωγέας Poppler KFileMetaData +Name[en_GB]=KFileMetaData Poppler Extractor +Name[es]=Extractor de Poppler para KFileMetaData +Name[et]=KFileMetaData Poppleri ekstraktimine +Name[fi]=KFileMetaDatan Poppler-lukuohjelma +Name[fr]=Extracteur Poppler de KFileMetaData +Name[gl]=Extractor de Poppler de KFileMetaData +Name[hu]=KFileMetaData Poppler kibontó +Name[ia]=Extractor de KFileMetaData Poppler +Name[it]=Estrattore Poppler di KFileMetaData +Name[ko]=KFileMetaData Poppler 추출기 +Name[lt]=KFileMetaData Poppler ekstraktorius +Name[nb]=KFileMetaData Poppler-uttrekker +Name[nds]=KFile-Metadaten-Poppler-Leser +Name[nl]=Extractieprogramma voor KFileMetaData Poppler +Name[pl]=Wydobywanie z Poppler dla KFileMetaData +Name[pt]=Extracção de Poppler do KFileMetaData +Name[pt_BR]=Extrator de Poppler do KFileMetaData +Name[ru]=Модуль извлечения метаданных из файлов PDF с помощью Poppler +Name[sk]=Extraktor KFileMetaData Poppler +Name[sl]=Program za izvleko Poppler za KFileMetaData +Name[sr]=Издвајач Поплером (KFileMetaData) +Name[sr@ijekavian]=Издвајач Поплером (KFileMetaData) +Name[sr@ijekavianlatin]=Izdvajač Popplerom (KFileMetaData) +Name[sr@latin]=Izdvajač Popplerom (KFileMetaData) +Name[sv]=Kfilmetadata Poppler-extrahering +Name[tr]=KFileMetaData Poppler Çıkarıcı +Name[uk]=Засіб видобування метаданих Poppler +Name[x-test]=xxKFileMetaData Poppler Extractorxx +Name[zh_CN]=KFileMetaData Poppler 提取工具 +Name[zh_TW]=KFileMetaData Poppler 展開器 diff --git a/kfilemetadata/src/extractors/kfilemetadata_taglibextractor.desktop b/kfilemetadata/src/extractors/kfilemetadata_taglibextractor.desktop new file mode 100644 index 00000000..066c617d --- /dev/null +++ b/kfilemetadata/src/extractors/kfilemetadata_taglibextractor.desktop @@ -0,0 +1,42 @@ +[Desktop Entry] +Type=Service +X-KDE-ServiceTypes=KFileMetaDataExtractor +X-KDE-Library=kfilemetadata_taglibextractor +Name=KFileMetaData TagLib Extractor +Name[bs]=KFileMetaData TagLib ekstraktor +Name[ca]=Extractor TagLib del KFileMetaData +Name[ca@valencia]=Extractor TagLib del KFileMetaData +Name[cs]=Extraktor TagLib KFileMetaData +Name[da]=KFileMetaData TagLib-udtrækker +Name[de]=TagLib-Extraktion für KFileMetaData +Name[el]=Εξαγωγέας TagLib KFileMetaData +Name[en_GB]=KFileMetaData TagLib Extractor +Name[es]=Extractor de TagLib para KFileMetaData +Name[et]=KFileMetaData TagLibi ekstraktimine +Name[fi]=KFileMetaDatan TagLib-lukuohjelma +Name[fr]=Extracteur TagLib de KFileMetaData +Name[gl]=Extractor de TagLib de KFileMetaData +Name[hu]=KFileMetaData TagLib kibontó +Name[ia]=Extractor de KFileMetaData TagLib +Name[it]=Estrattore TagLib di KFileMetaData +Name[ko]=KFileMetaData TagLib 추출기 +Name[lt]=KFileMetaData TagLib ekstraktorius +Name[nb]=KFileMetaData TagLib-uttrekker +Name[nds]=KFile-Metadaten-TagLib-Leser +Name[nl]=Extractieprogramma voor KFileMetaData TagLib +Name[pl]=Wydobywanie z TagLib dla KFileMetaData +Name[pt]=Extracção de TagLib do KFileMetaData +Name[pt_BR]=Extrator de TagLib do KFileMetaData +Name[ru]=Модуль извлечения метаданных из аудиофайлов с помощью TagLib +Name[sk]=Extraktor KFileMetaData TagLib +Name[sl]=Program za izvleko TagLib za KFileMetaData +Name[sr]=Издвајач Таглибом (KFileMetaData) +Name[sr@ijekavian]=Издвајач Таглибом (KFileMetaData) +Name[sr@ijekavianlatin]=Izdvajač TagLibom (KFileMetaData) +Name[sr@latin]=Izdvajač TagLibom (KFileMetaData) +Name[sv]=Kfilmetadata Taglib-extrahering +Name[tr]=KFileMetaData TagLib Çıkarıcı +Name[uk]=Засіб видобування метаданих TagLib +Name[x-test]=xxKFileMetaData TagLib Extractorxx +Name[zh_CN]=KFileMetaData TagLib 提取工具 +Name[zh_TW]=KFileMetaData TagLib 展開器 diff --git a/kfilemetadata/src/extractors/mobiextractor.cpp b/kfilemetadata/src/extractors/mobiextractor.cpp new file mode 100644 index 00000000..38db683c --- /dev/null +++ b/kfilemetadata/src/extractors/mobiextractor.cpp @@ -0,0 +1,112 @@ +/* + Copyright (C) 2013 Vishesh Handa + + Code adapted from kdegraphics-mobipocket/strigi/ + Copyright (C) 2008 by Jakub Stachowski + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#include "mobiextractor.h" + +#include + +#include +#include +#include +#include + +using namespace KFileMetaData; + +class QFileStream : public Mobipocket::Stream +{ +public: + QFileStream(const QString& name) : d(name) { + d.open(QIODevice::ReadOnly); + } + int read(char* buf, int size) { + return d.read(buf, size); + } + bool seek(int pos) { + return d.seek(pos); + } +private: + QFile d; +}; + +MobiExtractor::MobiExtractor(QObject* parent, const QVariantList&) + : ExtractorPlugin(parent) +{ + +} + +QStringList MobiExtractor::mimetypes() const +{ + QStringList types; + types << QLatin1String("application/x-mobipocket-ebook"); + + return types; +} + +void MobiExtractor::extract(ExtractionResult* result) +{ + QFileStream stream(result->inputUrl()); + Mobipocket::Document doc(&stream); + if (!doc.isValid()) + return; + + QMapIterator it(doc.metadata()); + while (it.hasNext()) { + it.next(); + switch (it.key()) { + case Mobipocket::Document::Title: + result->add(Property::Title, it.value()); + break; + case Mobipocket::Document::Author: { + result->add(Property::Author, it.value()); + break; + } + case Mobipocket::Document::Description: { + QTextDocument document; + document.setHtml(it.value()); + + QString plain = document.toPlainText(); + if (!plain.isEmpty()) + result->add(Property::Description, it.value()); + break; + } + case Mobipocket::Document::Subject: + result->add(Property::Subject, it.value()); + break; + case Mobipocket::Document::Copyright: + result->add(Property::Copyright, it.value()); + break; + } + } + + if (!doc.hasDRM()) { + QString html = doc.text(); + + QTextDocument document; + document.setHtml(html); + + result->append(document.toPlainText()); + } + + result->addType(Type::Document); +} + +KFILEMETADATA_EXPORT_EXTRACTOR(KFileMetaData::MobiExtractor, "kfilemetadata_mobiextractor") diff --git a/kfilemetadata/src/extractors/mobiextractor.h b/kfilemetadata/src/extractors/mobiextractor.h new file mode 100644 index 00000000..90adb9fc --- /dev/null +++ b/kfilemetadata/src/extractors/mobiextractor.h @@ -0,0 +1,39 @@ +/* + + Copyright (C) 2013 Vishesh Handa + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#ifndef MOBIEXTRACTOR_H +#define MOBIEXTRACTOR_H + +#include "extractorplugin.h" + +namespace KFileMetaData +{ + +class MobiExtractor : public ExtractorPlugin +{ +public: + MobiExtractor(QObject* parent, const QVariantList&); + + virtual void extract(ExtractionResult* result); + virtual QStringList mimetypes() const; +}; +} + +#endif // MOBIEXTRACTOR_H diff --git a/kfilemetadata/src/extractors/odfextractor.cpp b/kfilemetadata/src/extractors/odfextractor.cpp new file mode 100644 index 00000000..e338440b --- /dev/null +++ b/kfilemetadata/src/extractors/odfextractor.cpp @@ -0,0 +1,138 @@ +/* + + Copyright (C) 2013 Vishesh Handa + Copyright (C) 2012 Jörg Ehrichs + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#include "odfextractor.h" + +#include +#include + +#include +#include + +using namespace KFileMetaData; + +OdfExtractor::OdfExtractor(QObject* parent, const QVariantList&): ExtractorPlugin(parent) +{ + +} + +QStringList OdfExtractor::mimetypes() const +{ + QStringList list; + list << QLatin1String("application/vnd.oasis.opendocument.text") + << QLatin1String("application/vnd.oasis.opendocument.presentation") + << QLatin1String("application/vnd.oasis.opendocument.spreadsheet"); + + return list; +} + +void OdfExtractor::extract(ExtractionResult* result) +{ + KZip zip(result->inputUrl()); + if (!zip.open(QIODevice::ReadOnly)) { + qWarning() << "Document is not a valid ZIP archive"; + return; + } + + const KArchiveDirectory* directory = zip.directory(); + if (!directory) { + qWarning() << "Invalid document structure (main directory is missing)"; + return; + } + + const QStringList entries = directory->entries(); + if (!entries.contains("meta.xml")) { + qWarning() << "Invalid document structure (meta.xml is missing)"; + return; + } + + QDomDocument metaData("metaData"); + const KArchiveFile* file = static_cast(directory->entry("meta.xml")); + metaData.setContent(file->data()); + + // parse metadata ... + QDomElement docElem = metaData.documentElement(); + + QDomNode n = docElem.firstChild().firstChild(); // ... ... content + while (!n.isNull()) { + QDomElement e = n.toElement(); + if (!e.isNull()) { + const QString tagName = e.tagName(); + + // Dublin Core + if (tagName == QLatin1String("dc:description")) { + result->add(Property::Description, e.text()); + } else if (tagName == QLatin1String("dc:subject")) { + result->add(Property::Subject, e.text()); + } else if (tagName == QLatin1String("dc:title")) { + result->add(Property::Title, e.text()); + } else if (tagName == QLatin1String("dc:creator")) { + result->add(Property::Creator, e.text()); + } else if (tagName == QLatin1String("dc:langauge")) { + result->add(Property::Langauge, e.text()); + } + + // Meta Properties + else if (tagName == QLatin1String("meta:document-statistic")) { + bool ok = false; + int pageCount = e.attribute("meta:page-count").toInt(&ok); + if (ok) { + result->add(Property::PageCount, pageCount); + } + + int wordCount = e.attribute("meta:word-count").toInt(&ok); + if (ok) { + result->add(Property::WordCount, wordCount); + } + } else if (tagName == QLatin1String("meta:keyword")) { + QString keywords = e.text(); + result->add(Property::Keywords, keywords); + } else if (tagName == QLatin1String("meta:generator")) { + result->add(Property::Creator, e.text()); + } else if (tagName == QLatin1String("meta:creation-date")) { + QDateTime dt = ExtractorPlugin::dateTimeFromString(e.text()); + if (!dt.isNull()) + result->add(Property::CreationDate, dt); + } + } + n = n.nextSibling(); + } + + const KArchiveFile* contentsFile = static_cast(directory->entry("content.xml")); + QXmlStreamReader xml(contentsFile->createDevice()); + + while (!xml.atEnd()) { + xml.readNext(); + if (xml.isCharacters()) { + QString str = xml.text().toString(); + result->append(str); + } + + if (xml.hasError() || xml.isEndDocument()) + break; + } + + result->addType(Type::Document); + + return; +} + +KFILEMETADATA_EXPORT_EXTRACTOR(KFileMetaData::OdfExtractor, "kfilemetadata_odfextractor") diff --git a/kfilemetadata/src/extractors/odfextractor.h b/kfilemetadata/src/extractors/odfextractor.h new file mode 100644 index 00000000..d7127807 --- /dev/null +++ b/kfilemetadata/src/extractors/odfextractor.h @@ -0,0 +1,41 @@ +/* + + Copyright (C) 2013 Vishesh Handa + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#ifndef ODF_EXTRACTOR_H +#define ODF_EXTRACTOR_H + +#include "extractorplugin.h" + +namespace KFileMetaData +{ + +class OdfExtractor : public ExtractorPlugin +{ +public: + OdfExtractor(QObject* parent, const QVariantList&); + + virtual QStringList mimetypes() const; + virtual void extract(ExtractionResult* result); + +private: +}; +} + +#endif // ODF_EXTRACTOR_H diff --git a/kfilemetadata/src/extractors/office2007extractor.cpp b/kfilemetadata/src/extractors/office2007extractor.cpp new file mode 100644 index 00000000..01447411 --- /dev/null +++ b/kfilemetadata/src/extractors/office2007extractor.cpp @@ -0,0 +1,268 @@ +/* + + Copyright (C) 2013 Vishesh Handa + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#include "office2007extractor.h" + +#include +#include + +#include +#include + +using namespace KFileMetaData; + +Office2007Extractor::Office2007Extractor(QObject* parent, const QVariantList&): ExtractorPlugin(parent) +{ + +} + + +QStringList Office2007Extractor::mimetypes() const +{ + QStringList list; + list << QLatin1String("application/vnd.openxmlformats-officedocument.wordprocessingml.document") + << QLatin1String("application/vnd.openxmlformats-officedocument.presentationml.presentation") + << QLatin1String("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + + return list; +} + +void Office2007Extractor::extract(ExtractionResult* result) +{ + KZip zip(result->inputUrl()); + if (!zip.open(QIODevice::ReadOnly)) { + qWarning() << "Document is not a valid ZIP archive"; + return; + } + + const KArchiveDirectory* rootDir = zip.directory(); + if (!rootDir) { + qWarning() << "Invalid document structure (main directory is missing)"; + return; + } + + const QStringList rootEntries = rootDir->entries(); + if (!rootEntries.contains("docProps")) { + qWarning() << "Invalid document structure (docProps is missing)"; + return; + } + + const KArchiveEntry* docPropEntry = rootDir->entry("docProps"); + if (!docPropEntry->isDirectory()) { + qWarning() << "Invalid document structure (docProps is not a directory)"; + return; + } + + const KArchiveDirectory* docPropDirectory = dynamic_cast(docPropEntry); + const QStringList docPropsEntries = docPropDirectory->entries(); + + if (docPropsEntries.contains("core.xml")) { + QDomDocument coreDoc("core"); + const KArchiveFile* file = static_cast(docPropDirectory->entry("core.xml")); + coreDoc.setContent(file->data()); + + QDomElement docElem = coreDoc.documentElement(); + + QDomElement elem = docElem.firstChildElement("dc:description"); + if (!elem.isNull()) { + QString str = elem.text(); + if (!str.isEmpty()) { + result->add(Property::Description, str); + } + } + + elem = docElem.firstChildElement("dc:subject"); + if (!elem.isNull()) { + QString str = elem.text(); + if (!str.isEmpty()) { + result->add(Property::Subject, str); + } + } + + elem = docElem.firstChildElement("dc:title"); + if (!elem.isNull()) { + QString str = elem.text(); + if (!str.isEmpty()) { + result->add(Property::Title, str); + } + } + + elem = docElem.firstChildElement("dc:creator"); + if (!elem.isNull()) { + QString str = elem.text(); + if (!str.isEmpty()) { + result->add(Property::Creator, str); + } + } + + elem = docElem.firstChildElement("dc:langauge"); + if (!elem.isNull()) { + QString str = elem.text(); + if (!str.isEmpty()) { + result->add(Property::Langauge, str); + } + } + } + + if (docPropsEntries.contains("app.xml")) { + QDomDocument appDoc("app"); + const KArchiveFile* file = static_cast(docPropDirectory->entry("app.xml")); + appDoc.setContent(file->data()); + + QDomElement docElem = appDoc.documentElement(); + + // According to the ontologies only Documents can have a wordCount and pageCount + const QString mimeType = result->inputMimetype(); + if (mimeType == QLatin1String("application/vnd.openxmlformats-officedocument.wordprocessingml.document")) { + QDomElement elem = docElem.firstChildElement("Pages"); + if (!elem.isNull()) { + bool ok = false; + int pageCount = elem.text().toInt(&ok); + if (ok) { + result->add(Property::PageCount, pageCount); + } + } + + elem = docElem.firstChildElement("Words"); + if (!elem.isNull()) { + bool ok = false; + int wordCount = elem.text().toInt(&ok); + if (ok) { + result->add(Property::WordCount, wordCount); + } + } + } + + QDomElement elem = docElem.firstChildElement("Application"); + if (!elem.isNull()) { + QString app = elem.text(); + if (!app.isEmpty()) { + result->add(Property::Generator, app); + } + } + } + + + if (rootEntries.contains("word")) { + const KArchiveEntry* wordEntry = rootDir->entry("word"); + if (!wordEntry->isDirectory()) { + qWarning() << "Invalid document structure (word is not a directory)"; + return; + } + + const KArchiveDirectory* wordDirectory = dynamic_cast(wordEntry); + const QStringList wordEntries = wordDirectory->entries(); + + if (wordEntries.contains("document.xml")) { + QDomDocument appDoc("document"); + const KArchiveFile* file = static_cast(wordDirectory->entry("document.xml")); + + extractTextWithTag(file->createDevice(), QLatin1String("w:t"), result); + } + + result->addType(Type::Document); + } + + else if (rootEntries.contains("xl")) { + const KArchiveEntry* xlEntry = rootDir->entry("xl"); + if (!xlEntry->isDirectory()) { + qWarning() << "Invalid document structure (xl is not a directory)"; + return; + } + + const KArchiveDirectory* xlDirectory = dynamic_cast(xlEntry); + extractTextFromFiles(xlDirectory, result); + + result->addType(Type::Document); + result->addType(Type::Spreadsheet); + } + + else if (rootEntries.contains("ppt")) { + const KArchiveEntry* pptEntry = rootDir->entry("ppt"); + if (!pptEntry->isDirectory()) { + qWarning() << "Invalid document structure (ppt is not a directory)"; + return; + } + + const KArchiveDirectory* pptDirectory = dynamic_cast(pptEntry); + extractTextFromFiles(pptDirectory, result); + + result->addType(Type::Document); + result->addType(Type::Presentation); + } + + return; +} + +void Office2007Extractor::extractAllText(QIODevice* device, ExtractionResult* result) +{ + QXmlStreamReader xml(device); + + while (!xml.atEnd()) { + xml.readNext(); + if (xml.isCharacters()) { + QString str = xml.text().toString(); + result->append(str); + } + + if (xml.isEndDocument() || xml.hasError()) + break; + } +} + +void Office2007Extractor::extractTextFromFiles(const KArchiveDirectory* archiveDir, ExtractionResult* result) +{ + const QStringList entries = archiveDir->entries(); + foreach(const QString & entryName, entries) { + const KArchiveEntry* entry = archiveDir->entry(entryName); + if (entry->isDirectory()) { + const KArchiveDirectory* subDir = dynamic_cast(entry); + extractTextFromFiles(subDir, result); + continue; + } + + if (!entryName.endsWith(".xml")) + continue; + + const KArchiveFile* file = static_cast(entry); + extractAllText(file->createDevice(), result); + } +} + +void Office2007Extractor::extractTextWithTag(QIODevice* device, const QString& tag, ExtractionResult* result) +{ + QXmlStreamReader xml(device); + + while (!xml.atEnd()) { + xml.readNext(); + if (xml.qualifiedName().startsWith(tag) && xml.isStartElement()) { + QString str = xml.readElementText(QXmlStreamReader::IncludeChildElements); + + if (!str.isEmpty()) { + result->append(str); + } + } + + if (xml.isEndDocument() || xml.hasError()) + break; + } +} + +KFILEMETADATA_EXPORT_EXTRACTOR(KFileMetaData::Office2007Extractor, "kfilemetadata_office2007extractor") diff --git a/kfilemetadata/src/extractors/office2007extractor.h b/kfilemetadata/src/extractors/office2007extractor.h new file mode 100644 index 00000000..d65bdd94 --- /dev/null +++ b/kfilemetadata/src/extractors/office2007extractor.h @@ -0,0 +1,46 @@ +/* + + Copyright (C) 2013 Vishesh Handa + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#ifndef OFFICE_2007_EXTRACTOR_H +#define OFFICE_2007_EXTRACTOR_H + +#include "extractorplugin.h" + +class KArchiveDirectory; + +namespace KFileMetaData +{ + +class Office2007Extractor : public ExtractorPlugin +{ +public: + Office2007Extractor(QObject* parent, const QVariantList&); + + virtual QStringList mimetypes() const; + virtual void extract(ExtractionResult* result); + +private: + void extractTextWithTag(QIODevice* device, const QString& tag, ExtractionResult* result); + void extractAllText(QIODevice* device, ExtractionResult* result); + void extractTextFromFiles(const KArchiveDirectory* archiveDir, ExtractionResult* result); +}; +} + +#endif // OFFICE_2007_EXTRACTOR_H diff --git a/kfilemetadata/src/extractors/officeextractor.cpp b/kfilemetadata/src/extractors/officeextractor.cpp new file mode 100644 index 00000000..21bf9745 --- /dev/null +++ b/kfilemetadata/src/extractors/officeextractor.cpp @@ -0,0 +1,118 @@ +/* + This file is part of a KMetaData File Extractor + Copyright (C) 2013 Denis Steckelmacher + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + +#include "officeextractor.h" + +#include + +#include +#include + +using namespace KFileMetaData; + +OfficeExtractor::OfficeExtractor(QObject* parent, const QVariantList&) + : ExtractorPlugin(parent) +{ + // Find the executables of catdoc, catppt and xls2csv. If an executable cannot + // be found, indexing its corresponding MIME type will be disabled + findExe("application/msword", "catdoc", m_catdoc); + findExe("application/vnd.ms-excel", "xls2csv", m_xls2csv); + findExe("application/vnd.ms-powerpoint", "catppt", m_catppt); +} + +void OfficeExtractor::findExe(const QString& mimeType, const QString& name, QString& fullPath) +{ + fullPath = KStandardDirs::findExe(name); + + if (!fullPath.isEmpty()) { + m_available_mime_types << mimeType; + } +} + +QStringList OfficeExtractor::mimetypes() const +{ + return m_available_mime_types; +} + + +void OfficeExtractor::extract(ExtractionResult* result) +{ + QVariantMap metadata; + QStringList args; + QString contents; + + args << QLatin1String("-s") << QLatin1String("cp1252"); // FIXME: Store somewhere a map between the user's language and the encoding of the Windows files it may use ? + args << QLatin1String("-d") << QLatin1String("utf8"); + + const QString fileUrl = result->inputUrl(); + const QString mimeType = result->inputMimetype(); + if (mimeType == QLatin1String("application/msword")) { + result->addType(Type::Document); + + args << QLatin1String("-w"); + contents = textFromFile(fileUrl, m_catdoc, args); + + // Now that we have the plain text content, count words, lines and characters + // (original code from plaintextextractor.cpp, authored by Vishesh Handa) + int lines = contents.count(QLatin1Char('\n')); + int words = contents.count(QRegExp("\\b\\w+\\b")); + + result->add(Property::WordCount, words); + result->add(Property::LineCount, lines); + } else if (mimeType == QLatin1String("application/vnd.ms-excel")) { + result->addType(Type::Document); + result->addType(Type::Spreadsheet); + + args << QLatin1String("-c") << QLatin1String(" "); + args << QLatin1String("-b") << QLatin1String(" "); + args << QLatin1String("-q") << QLatin1String("0"); + contents = textFromFile(fileUrl, m_xls2csv, args); + } else if (mimeType == QLatin1String("application/vnd.ms-powerpoint")) { + result->addType(Type::Document); + result->addType(Type::Presentation); + + contents = textFromFile(fileUrl, m_catppt, args); + } + + if (contents.isEmpty()) + return; + + result->append(contents); + + return; +} + +QString OfficeExtractor::textFromFile(const QString& fileUrl, const QString& command, QStringList& arguments) +{ + arguments << fileUrl; + + // Start a process and read its standard output + QProcess process; + + process.setReadChannel(QProcess::StandardOutput); + process.start(command, arguments, QIODevice::ReadOnly); + process.waitForFinished(); + + if (process.exitStatus() != QProcess::NormalExit || process.exitCode() != 0) + return QString(); + else + return QString::fromUtf8(process.readAll()); +} + +KFILEMETADATA_EXPORT_EXTRACTOR(KFileMetaData::OfficeExtractor, "kfilemetadata_officeextractor") diff --git a/kfilemetadata/src/extractors/officeextractor.h b/kfilemetadata/src/extractors/officeextractor.h new file mode 100644 index 00000000..f8e48b11 --- /dev/null +++ b/kfilemetadata/src/extractors/officeextractor.h @@ -0,0 +1,50 @@ +/* + This file is part of a KMetaData File Extractor + Copyright (C) 2013 Denis Steckelmacher + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#ifndef OFFICE_EXTRACTOR_H +#define OFFICE_EXTRACTOR_H + +#include "extractorplugin.h" + +namespace KFileMetaData +{ + +class OfficeExtractor : public ExtractorPlugin +{ +public: + OfficeExtractor(QObject* parent, const QVariantList&); + + virtual QStringList mimetypes() const; + virtual void extract(ExtractionResult* result); + +private: + void findExe(const QString& mimeType, const QString& name, QString& fullPath); + QString textFromFile(const QString& fileUrl, const QString& command, QStringList& arguments); + +private: + QStringList m_available_mime_types; + + QString m_catdoc; + QString m_catppt; + QString m_xls2csv; +}; +} + +#endif diff --git a/kfilemetadata/src/extractors/plaintextextractor.cpp b/kfilemetadata/src/extractors/plaintextextractor.cpp new file mode 100644 index 00000000..baac928a --- /dev/null +++ b/kfilemetadata/src/extractors/plaintextextractor.cpp @@ -0,0 +1,59 @@ +/* + + Copyright (C) 2012 Vishesh Handa + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#include "plaintextextractor.h" +#include + +#include + +using namespace KFileMetaData; + +PlainTextExtractor::PlainTextExtractor(QObject* parent, const QVariantList&) + : ExtractorPlugin(parent) +{ + +} + +QStringList PlainTextExtractor::mimetypes() const +{ + return QStringList() << QLatin1String("text/"); +} + +void PlainTextExtractor::extract(ExtractionResult* result) +{ + std::string line; + int lines = 0; + + std::ifstream fstream(QFile::encodeName(result->inputUrl())); + if (!fstream.is_open()) { + return; + } + + while (std::getline(fstream, line)) { + result->append(QString::fromUtf8(line.c_str(), line.size())); + + lines += 1; + } + + result->add(Property::LineCount, lines); + result->addType(Type::Text); +} + +KFILEMETADATA_EXPORT_EXTRACTOR(KFileMetaData::PlainTextExtractor, "kfilemetadata_plaintextextractor") diff --git a/kfilemetadata/src/extractors/plaintextextractor.h b/kfilemetadata/src/extractors/plaintextextractor.h new file mode 100644 index 00000000..71248a55 --- /dev/null +++ b/kfilemetadata/src/extractors/plaintextextractor.h @@ -0,0 +1,40 @@ +/* + + Copyright (C) 2012 Vishesh Handa + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#ifndef PLAINTEXTEXTRACTOR_H +#define PLAINTEXTEXTRACTOR_H + +#include "extractorplugin.h" + +namespace KFileMetaData +{ + +class PlainTextExtractor : public ExtractorPlugin +{ +public: + PlainTextExtractor(QObject* parent, const QVariantList&); + + virtual QStringList mimetypes() const; + virtual void extract(ExtractionResult* result); +}; + +} + +#endif // PLAINTEXTEXTRACTOR_H diff --git a/kfilemetadata/src/extractors/popplerextractor.cpp b/kfilemetadata/src/extractors/popplerextractor.cpp new file mode 100644 index 00000000..4612317a --- /dev/null +++ b/kfilemetadata/src/extractors/popplerextractor.cpp @@ -0,0 +1,174 @@ +/* + + Copyright (C) 2012 Vishesh Handa + Copyright (C) 2012 Jörg Ehrichs + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#include "popplerextractor.h" + +#include +#include + +using namespace KFileMetaData; + +PopplerExtractor::PopplerExtractor(QObject* parent, const QVariantList&) + : ExtractorPlugin(parent) +{ + +} + +QStringList PopplerExtractor::mimetypes() const +{ + QStringList list; + list << QLatin1String("application/pdf"); + + return list; +} + + +void PopplerExtractor::extract(ExtractionResult* result) +{ + const QString fileUrl = result->inputUrl(); + QScopedPointer pdfDoc(Poppler::Document::load(fileUrl, 0, 0)); + + if (!pdfDoc || pdfDoc->isLocked()) { + return; + } + + result->addType(Type::Document); + + QString title = pdfDoc->info(QLatin1String("Title")).trimmed(); + + // The title extracted from the pdf metadata is in many cases not the real title + // of the document. Especially for research papers that are exported to pdf. + // As mostly the title of a pdf document is written on the first page in the biggest font + // we use this if the pdfDoc title is considered junk + if (title.isEmpty() || + !title.contains(' ') || // very unlikely the title of a document does only contain one word. + title.contains(QLatin1String("Microsoft"), Qt::CaseInsensitive)) { // most research papers i found written with microsoft word + // have a garbage title of the pdf creator rather than the real document title + title = parseFirstPage(pdfDoc.data(), fileUrl); + } + + if (!title.isEmpty()) { + result->add(Property::Title, title); + } + + QString subject = pdfDoc->info(QLatin1String("Subject")); + if (!subject.isEmpty()) { + result->add(Property::Subject, title); + } + + QString author = pdfDoc->info(QLatin1String("Author")); + if (!author.isEmpty()) { + result->add(Property::Author, author); + } + + QString creator = pdfDoc->info(QLatin1String("Creator")); + if (!author.isEmpty()) { + result->add(Property::Creator, creator); + } + + for (int i = 0; i < pdfDoc->numPages(); i++) { + QScopedPointer page(pdfDoc->page(i)); + if (!page) { // broken pdf files do not return a valid page + kWarning() << "Could not read page content from" << fileUrl; + break; + } + result->append(page->text(QRectF())); + } +} + +QString PopplerExtractor::parseFirstPage(Poppler::Document* pdfDoc, const QString& fileUrl) +{ + QScopedPointer p(pdfDoc->page(0)); + + if (!p) { + kWarning() << "Could not read page content from" << fileUrl; + return QString(); + } + + QList tbList = p->textList(); + QMap possibleTitleMap; + + int currentLargestChar = 0; + int skipTextboxes = 0; + + // Iterate over all textboxes. Each textbox can be a single character/word or textblock + // Here we combine the etxtboxes back together based on the textsize + // Important are the words with the biggest font size + foreach(Poppler::TextBox * tb, tbList) { + + // if we added followup words, skip the textboxes here now + if (skipTextboxes > 0) { + skipTextboxes--; + continue; + } + + int height = tb->charBoundingBox(0).height(); + + // if the following text is smaller than the biggest we found up to now, ignore it + if (height >= currentLargestChar) { + QString possibleTitle; + possibleTitle.append(tb->text()); + currentLargestChar = height; + + // if the text has follow up words add them to to create the full title + Poppler::TextBox* next = tb->nextWord(); + while (next) { + possibleTitle.append(QLatin1Char(' ')); + possibleTitle.append(next->text()); + next = next->nextWord(); + skipTextboxes++; + } + + // now combine text for each font size together, very likeley it must be connected + QString existingTitlePart = possibleTitleMap.value(currentLargestChar, QString()); + existingTitlePart.append(QLatin1Char(' ')); + existingTitlePart.append(possibleTitle); + possibleTitleMap.insert(currentLargestChar, existingTitlePart); + } + } + + qDeleteAll(tbList); + + QList titleSizes = possibleTitleMap.keys(); + qSort(titleSizes.begin(), titleSizes.end(), qGreater()); + + QString newPossibleTitle; + + // find the text with the largest font that is not just 1 character + foreach(int i, titleSizes) { + QString title = possibleTitleMap.value(i); + + // sometime the biggest part is a single letter + // as a starting paragraph letter + if (title.size() < 5) { + continue; + } else { + newPossibleTitle = title.trimmed(); + break; + } + } + + // Sometimes the titles that are extracted are too large. This is a way of trimming them. + newPossibleTitle.truncate(50); + return newPossibleTitle; +} + +KFILEMETADATA_EXPORT_EXTRACTOR(KFileMetaData::PopplerExtractor, "kfilemetadata_popplerextractor") diff --git a/kfilemetadata/src/extractors/popplerextractor.h b/kfilemetadata/src/extractors/popplerextractor.h new file mode 100644 index 00000000..7e7554e8 --- /dev/null +++ b/kfilemetadata/src/extractors/popplerextractor.h @@ -0,0 +1,43 @@ +/* + + Copyright (C) 2012 Vishesh Handa + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#ifndef POPPLEREXTRACTOR_H +#define POPPLEREXTRACTOR_H + +#include "extractorplugin.h" +#include + +namespace KFileMetaData +{ + +class PopplerExtractor : public ExtractorPlugin +{ +public: + PopplerExtractor(QObject* parent, const QVariantList&); + + virtual QStringList mimetypes() const; + virtual void extract(ExtractionResult* result); + +private: + QString parseFirstPage(Poppler::Document* pdfDoc, const QString& fileUrl); +}; +} + +#endif // POPPLEREXTRACTOR_H diff --git a/kfilemetadata/src/extractors/taglibextractor.cpp b/kfilemetadata/src/extractors/taglibextractor.cpp new file mode 100644 index 00000000..fb8d5942 --- /dev/null +++ b/kfilemetadata/src/extractors/taglibextractor.cpp @@ -0,0 +1,432 @@ +/* + + Copyright (C) 2012 Vishesh Handa + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#include "taglibextractor.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace KFileMetaData; + +TagLibExtractor::TagLibExtractor(QObject* parent, const QVariantList&) + : ExtractorPlugin(parent) +{ +} + +QStringList TagLibExtractor::mimetypes() const +{ + QStringList types; + // MP3 FLAC, MPC, Speex, WavPack TrueAudio, WAV, AIFF, MP4 and ASF files. + // MP3 + types << QLatin1String("audio/mpeg"); + types << QLatin1String("audio/mpeg3"); types << QLatin1String("audio/x-mpeg"); + + // FLAC + types << QLatin1String("audio/flac"); + + // MPC + types << QLatin1String("audio/x-musepack"); + + //OGG + types << QLatin1String("audio/ogg"); types << QLatin1String("audio/x-vorbis+ogg"); + + // WAV + types << QLatin1String("audio/wav"); + + // AIFF + types << QLatin1String("audio/x-aiff"); + + // APE + types << QLatin1String("audio/x-ape"); + + // WV + types << QLatin1String("audio/x-wavpack"); + + return types; +} + +void TagLibExtractor::extract(ExtractionResult* result) +{ + const QString fileUrl = result->inputUrl(); + const QString mimeType = result->inputMimetype(); + + TagLib::FileRef file(fileUrl.toUtf8().data(), true); + if (file.isNull()) { + return; + } + + TagLib::Tag* tags = file.tag(); + result->addType(Type::Audio); + + TagLib::String artists; + TagLib::String albumArtists; + TagLib::String composers; + TagLib::String lyricists; + TagLib::StringList genres; + + // Handling multiple tags in mpeg files. + if ((mimeType == "audio/mpeg") || (mimeType == "audio/mpeg3") || (mimeType == "audio/x-mpeg")) { + TagLib::MPEG::File mpegFile(fileUrl.toUtf8().data(), true); + if (mpegFile.ID3v2Tag() && !mpegFile.ID3v2Tag()->isEmpty()) { + TagLib::ID3v2::FrameList lstID3v2; + + // Artist. + lstID3v2 = mpegFile.ID3v2Tag()->frameListMap()["TPE1"]; + if (!lstID3v2.isEmpty()) { + for (TagLib::ID3v2::FrameList::ConstIterator it = lstID3v2.begin(); it != lstID3v2.end(); ++it) { + if (!artists.isEmpty()) { + artists += ", "; + } + artists += (*it)->toString(); + } + } + + // Album Artist. + lstID3v2 = mpegFile.ID3v2Tag()->frameListMap()["TPE2"]; + if (!lstID3v2.isEmpty()) { + for (TagLib::ID3v2::FrameList::ConstIterator it = lstID3v2.begin(); it != lstID3v2.end(); ++it) { + if (!albumArtists.isEmpty()) { + albumArtists += ", "; + } + albumArtists += (*it)->toString(); + } + } + + // Composer. + lstID3v2 = mpegFile.ID3v2Tag()->frameListMap()["TCOM"]; + if (!lstID3v2.isEmpty()) { + for (TagLib::ID3v2::FrameList::ConstIterator it = lstID3v2.begin(); it != lstID3v2.end(); ++it) { + if (!composers.isEmpty()) { + composers += ", "; + } + composers += (*it)->toString(); + } + } + + // Lyricist. + lstID3v2 = mpegFile.ID3v2Tag()->frameListMap()["TEXT"]; + if (!lstID3v2.isEmpty()) { + for (TagLib::ID3v2::FrameList::ConstIterator it = lstID3v2.begin(); it != lstID3v2.end(); ++it) { + if (!lyricists.isEmpty()) { + lyricists += ", "; + } + lyricists += (*it)->toString(); + } + } + + // Genre. + lstID3v2 = mpegFile.ID3v2Tag()->frameListMap()["TCON"]; + if (!lstID3v2.isEmpty()) { + for (TagLib::ID3v2::FrameList::ConstIterator it = lstID3v2.begin(); it != lstID3v2.end(); ++it) { + genres.append((*it)->toString()); + } + } + + } + } + + // Handling multiple tags in FLAC files. + if (mimeType == "audio/flac") { + TagLib::FLAC::File flacFile(fileUrl.toUtf8().data(), true); + if (flacFile.xiphComment() && !flacFile.xiphComment()->isEmpty()) { + TagLib::Ogg::FieldListMap lstFLAC = flacFile.xiphComment()->fieldListMap(); + TagLib::Ogg::FieldListMap::ConstIterator itFLAC; + + // Artist. + itFLAC = lstFLAC.find("ARTIST"); + if (itFLAC != lstFLAC.end()) { + if (!artists.isEmpty()) { + artists += ", "; + } + artists += (*itFLAC).second.toString(", "); + } + + // Album Artist. + itFLAC = lstFLAC.find("ALBUMARTIST"); + if (itFLAC != lstFLAC.end()) { + if (!albumArtists.isEmpty()) { + albumArtists += ", "; + } + albumArtists += (*itFLAC).second.toString(", "); + } + + // Composer. + itFLAC = lstFLAC.find("COMPOSER"); + if (itFLAC != lstFLAC.end()) { + if (!composers.isEmpty()) { + composers += ", "; + } + composers += (*itFLAC).second.toString(", "); + } + + // Lyricist. + itFLAC = lstFLAC.find("LYRICIST"); + if (itFLAC != lstFLAC.end()) { + if (!lyricists.isEmpty()) { + lyricists += ", "; + } + lyricists += (*itFLAC).second.toString(", "); + } + + // Genre. + itFLAC = lstFLAC.find("GENRE"); + if (itFLAC != lstFLAC.end()) { + genres.append((*itFLAC).second); + } + } + } + + // Handling multiple tags in Musepack files. + if (mimeType == ("audio/x-musepack")) { + TagLib::MPC::File mpcFile(fileUrl.toUtf8().data(), true); + if (mpcFile.tag() && !mpcFile.tag()->isEmpty()) { + TagLib::APE::ItemListMap lstMusepack = mpcFile.APETag()->itemListMap(); + TagLib::APE::ItemListMap::ConstIterator itMPC; + + // Artist. + itMPC = lstMusepack.find("ARTIST"); + if (itMPC != lstMusepack.end()) { + if (!artists.isEmpty()) { + artists += ", "; + } + artists += (*itMPC).second.toString(); + } + + // Album Artist. + itMPC = lstMusepack.find("ALBUMARTIST"); + if (itMPC != lstMusepack.end()) { + if(!albumArtists.isEmpty()) { + albumArtists += ", "; + } + albumArtists += (*itMPC).second.toString(); + } + + // Composer. + itMPC = lstMusepack.find("COMPOSER"); + if (itMPC != lstMusepack.end()) { + if (!composers.isEmpty()) { + composers += ", "; + } + composers += (*itMPC).second.toString(); + } + + // Lyricist. + itMPC = lstMusepack.find("LYRICIST"); + if (itMPC != lstMusepack.end()) { + if (!lyricists.isEmpty()) { + lyricists += ", "; + } + lyricists += (*itMPC).second.toString(); + } + + // Genre. + itMPC = lstMusepack.find("GENRE"); + if (itMPC != lstMusepack.end()) { + genres.append((*itMPC).second.toString()); + } + } + } + + // Handling multiple tags in OGG files. + if (mimeType == "audio/ogg" || mimeType == "audio/x-vorbis+ogg") { + TagLib::Ogg::Vorbis::File oggFile(fileUrl.toUtf8().data(), true); + if (oggFile.tag() && !oggFile.tag()->isEmpty()) { + TagLib::Ogg::FieldListMap lstOGG = oggFile.tag()->fieldListMap(); + TagLib::Ogg::FieldListMap::ConstIterator itOGG; + + // Artist. + itOGG = lstOGG.find("ARTIST"); + if (itOGG != lstOGG.end()) { + if (!artists.isEmpty()) { + artists += ", "; + } + artists += (*itOGG).second.toString(", "); + } + + // Album Artist. + itOGG = lstOGG.find("ALBUMARTIST"); + if (itOGG != lstOGG.end()) { + if (!albumArtists.isEmpty()) { + albumArtists += ", "; + } + albumArtists += (*itOGG).second.toString(", "); + } + + // Composer. + itOGG = lstOGG.find("COMPOSER"); + if (itOGG != lstOGG.end()) { + if (!composers.isEmpty()) { + composers += ", "; + } + composers += (*itOGG).second.toString(", "); + } + + // Lyricist. + itOGG = lstOGG.find("LYRICIST"); + if (itOGG != lstOGG.end()) { + if (!lyricists.isEmpty()) { + lyricists += ", "; + } + lyricists += (*itOGG).second.toString(", "); + } + + // Genre. + itOGG = lstOGG.find("GENRE"); + if (itOGG != lstOGG.end()) { + genres.append((*itOGG).second); + } + } + } + + if (!tags->isEmpty()) { + QString title = QString::fromUtf8(tags->title().toCString(true)); + if (!title.isEmpty()) { + result->add(Property::Title, title); + } + + QString comment = QString::fromUtf8(tags->comment().toCString(true)); + if (!comment.isEmpty()) { + result->add(Property::Comment, comment); + } + + if (genres.isEmpty()) { + genres.append(tags->genre()); + } + + for (uint i = 0; i < genres.size(); i++) { + QString genre = QString::fromUtf8(genres[i].toCString(true)).trimmed(); + + // Convert from int + bool ok = false; + int genreNum = genre.toInt(&ok); + if (ok) { + genre = QString::fromUtf8(TagLib::ID3v1::genre(genreNum).toCString(true)); + } + + result->add(Property::Genre, genre); + } + + QString artistString; + if (artists.isEmpty()) { + artistString = QString::fromUtf8(tags->artist().toCString(true)); + } else { + artistString = QString::fromUtf8(artists.toCString(true)).trimmed(); + } + + QStringList artists = contactsFromString(artistString); + foreach(const QString& artist, artists) { + result->add(Property::Artist, artist); + } + + QString composersString = QString::fromUtf8(composers.toCString(true)).trimmed(); + QStringList composers = contactsFromString(composersString); + foreach(const QString& comp, composers) { + result->add(Property::Composer, comp); + } + + QString lyricistsString = QString::fromUtf8(lyricists.toCString(true)).trimmed(); + QStringList lyricists = contactsFromString(lyricistsString); + foreach(const QString& lyr, lyricists) { + result->add(Property::Lyricist, lyr); + } + + QString album = QString::fromUtf8(tags->album().toCString(true)); + if (!album.isEmpty()) { + result->add(Property::Album, album); + + QString albumArtistsString = QString::fromUtf8(albumArtists.toCString(true)).trimmed(); + QStringList albumArtists = contactsFromString(albumArtistsString); + foreach(const QString& res, albumArtists) { + result->add(Property::AlbumArtist, res); + } + } + + if (tags->track()) { + result->add(Property::TrackNumber, tags->track()); + } + + if (tags->year()) { + result->add(Property::ReleaseYear, tags->year()); + } + } + + TagLib::AudioProperties* audioProp = file.audioProperties(); + if (audioProp) { + if (audioProp->length()) { + // What about the xml duration? + result->add(Property::Duration, audioProp->length()); + } + + if (audioProp->bitrate()) { + result->add(Property::BitRate, audioProp->bitrate() * 1000); + } + + if (audioProp->channels()) { + result->add(Property::Channels, audioProp->channels()); + } + + if (audioProp->sampleRate()) { + result->add(Property::SampleRate, audioProp->sampleRate()); + } + } + + // TODO: Get more properties based on the file type + // - Codec + // - Album Artist + // - Publisher + + // TAG information (incomplete). + // A good reference: http://qoobar.sourceforge.net/en/documentation.htm + // -- FLAC/OGG -- + // Artist: ARTIST, PERFORMER + // Album artist: ALBUMARTIST + // Composer: COMPOSER + // Lyricist: LYRICIST + // Conductor: CONDUCTOR + // Disc number: DISCNUMBER + // Total discs: TOTALDISCS, DISCTOTAL + // Track number: TRACKNUMBER + // Total tracks: TOTALTRACKS, TRACKTOTAL + // Genre: GENRE + // -- ID3v2 -- + // Artist: TPE1 + // Album artist: TPE2 + // Composer: TCOM + // Lyricist: TEXT + // Conductor: TPE3 + // Disc number[/total dics]: TPOS + // Track number[/total tracks]: TRCK + // Genre: TCON +} + +KFILEMETADATA_EXPORT_EXTRACTOR(KFileMetaData::TagLibExtractor, "kfilemetadata_taglibextextractor") diff --git a/kfilemetadata/src/extractors/taglibextractor.h b/kfilemetadata/src/extractors/taglibextractor.h new file mode 100644 index 00000000..71a7fdce --- /dev/null +++ b/kfilemetadata/src/extractors/taglibextractor.h @@ -0,0 +1,41 @@ +/* + + Copyright (C) 2012 Vishesh Handa + + 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.1 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + + +#ifndef TAGLIBEXTRACTOR_H +#define TAGLIBEXTRACTOR_H + +#include "extractorplugin.h" + +namespace KFileMetaData +{ + +class TagLibExtractor : public ExtractorPlugin +{ + +public: + TagLibExtractor(QObject* parent, const QVariantList&); + + virtual void extract(ExtractionResult* result); + virtual QStringList mimetypes() const; +}; + +} + +#endif // TAGLIBEXTRACTOR_H diff --git a/kfilemetadata/src/kfilemetadata_export.h b/kfilemetadata/src/kfilemetadata_export.h new file mode 100644 index 00000000..c7d1ee15 --- /dev/null +++ b/kfilemetadata/src/kfilemetadata_export.h @@ -0,0 +1,39 @@ +/* This file is part of the KDE project + Copyright (C) 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 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 _KFILEMETADATA_EXPORT_H +#define _KFILEMETADATA_EXPORT_H + +/* needed for KDE_EXPORT and KDE_IMPORT macros */ +#include + +#ifndef KFILEMETADATA_EXPORT +# if defined(KDELIBS_STATIC_LIBS) + /* No export/import for static libraries */ +# define KFILEMETADATA_EXPORT +# elif defined(MAKE_KFILEMETADATA_LIB) + /* We are building this library */ +# define KFILEMETADATA_EXPORT KDE_EXPORT +# else + /* We are using this library */ +# define KFILEMETADATA_EXPORT KDE_IMPORT +# endif +#endif + +#endif diff --git a/kfilemetadata/src/kfilemetadataextractor.desktop b/kfilemetadata/src/kfilemetadataextractor.desktop new file mode 100644 index 00000000..246777f9 --- /dev/null +++ b/kfilemetadata/src/kfilemetadataextractor.desktop @@ -0,0 +1,42 @@ +[Desktop Entry] +Type=ServiceType +X-KDE-ServiceType=KFileMetaDataExtractor +Comment=KFileMetaData Extractor +Comment[bs]=KFileMetaData ekstraktor +Comment[ca]=Extractor del KFileMetaData +Comment[ca@valencia]=Extractor del KFileMetaData +Comment[cs]=Extraktor KFileMetaData +Comment[da]=KFileMetaData-udtrækker +Comment[de]=KFileMetaData-Extraktion +Comment[el]=Εξαγωγέας KFileMetaData +Comment[en_GB]=KFileMetaData Extractor +Comment[es]=Extractor para KFileMetaData +Comment[et]=KFileMetaData ekstraktimine +Comment[fi]=KFileMetaDatan lukuohjelma +Comment[fr]=Extracteur de KFileMetaData +Comment[gl]=Extractor de KFileMetaData +Comment[hu]=KFileMetaData kibontó +Comment[ia]=Extractor de KFileMetaData +Comment[it]=Estrattore di KFileMetaData +Comment[ko]=KFileMetaData 추출기 +Comment[lt]=KFileMetaData ekstraktorius +Comment[nb]=KFileMetaData uttrekker +Comment[nds]=KFile-Metadaten-Leser +Comment[nl]=Extractieprogramma voor KFileMetaData +Comment[pa]=KFileMetaData ਐਕਸਟਰੈਕਟਰ +Comment[pl]=Wydobywanie KFileMetaData +Comment[pt]=Extracção do KFileMetaData +Comment[pt_BR]=Extrator do KFileMetaData +Comment[ru]=Модуль извлечения метаданных из файлов +Comment[sk]=Extraktor KFileMetaData +Comment[sl]=Program za izvleko za KFileMetaData +Comment[sr]=Издвајач на основу KFileMetaData +Comment[sr@ijekavian]=Издвајач на основу KFileMetaData +Comment[sr@ijekavianlatin]=Izdvajač na osnovu KFileMetaData +Comment[sr@latin]=Izdvajač na osnovu KFileMetaData +Comment[sv]=Kfilmetadata extrahering +Comment[tr]=KFileMetaData Çıkarıcı +Comment[uk]=Засіб видобування метаданих +Comment[x-test]=xxKFileMetaData Extractorxx +Comment[zh_CN]=KFileMetaData 提取工具 +Comment[zh_TW]=KFileMetaData 展開器 diff --git a/kfilemetadata/src/properties.h b/kfilemetadata/src/properties.h new file mode 100644 index 00000000..a96048eb --- /dev/null +++ b/kfilemetadata/src/properties.h @@ -0,0 +1,126 @@ +/* + * This file is part of KFileMetaData + * Copyright (C) 2014 Vishesh Handa + * + * 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.1 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 + * + */ + +#ifndef KFILEMETADATA_PROPERTIES +#define KFILEMETADATA_PROPERTIES + +#include +#include + +namespace KFileMetaData { +namespace Property { + +enum Property { + FirstProperty = 0, + Empty = 0, + + // Audio + BitRate, + Channels, + Duration, + Genre, + SampleRate, + TrackNumber, + ReleaseYear, + + // Maybe merge this with the description? + Comment, + + // Music + Artist, + Album, + AlbumArtist, + Composer, + Lyricist, + + // Documents + Author, + Title, + Subject, + Creator, + Generator, // What's the difference? + PageCount, + WordCount, + LineCount, + Langauge, + Copyright, + Publisher, + Description, + CreationDate, + Keywords, + + Width, + Height, + AspectRatio, + FrameRate, + + // Images + ImageMake, + ImageModel, + ImageDateTime, + ImageOrientation, + PhotoFlash, + PhotoPixelXDimension, + PhotoPixelYDimension, + PhotoDateTimeOriginal, + PhotoFocalLength, + PhotoFocalLengthIn35mmFilm, + PhotoExposureTime, + PhotoFNumber, + PhotoApertureValue, + PhotoExposureBiasValue, + PhotoWhiteBalance, + PhotoMeteringMode, + PhotoISOSpeedRatings, + PhotoSaturation, + PhotoSharpness, + + LastProperty = PhotoSharpness +}; + +} // namespace Property + +typedef QMap PropertyMap; + +inline QVariantMap toVariantMap(const PropertyMap& propMap) { + QVariantMap varMap; + PropertyMap::const_iterator it = propMap.constBegin(); + for (; it != propMap.constEnd(); ++it) { + int p = static_cast(it.key()); + varMap.insertMulti(QString::number(p), it.value()); + } + + return varMap; +} + +inline PropertyMap toPropertyMap(const QVariantMap& varMap) { + PropertyMap propMap; + QVariantMap::const_iterator it = varMap.constBegin(); + for (; it != varMap.constEnd(); ++it) { + int p = it.key().toInt(); + propMap.insertMulti(static_cast(p), it.value()); + } + + return propMap; +} + +} // namespace KFileMetaData + +#endif diff --git a/kfilemetadata/src/propertyinfo.cpp b/kfilemetadata/src/propertyinfo.cpp new file mode 100644 index 00000000..3dde0a48 --- /dev/null +++ b/kfilemetadata/src/propertyinfo.cpp @@ -0,0 +1,472 @@ +/* + * This file is part of the KFileMetaData project + * Copyright (C) 2014 Vishesh Handa + * + * 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.1 of the License, or (at your option) version 3, or any + * later version accepted by the membership of KDE e.V. (or its + * successor approved by the membership of KDE e.V.), which shall + * act as a proxy defined in Section 6 of version 3 of the license. + * + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + */ + +#include "propertyinfo.h" + +#include +#include + +static const KCatalogLoader loader("kfilemetadata"); + +using namespace KFileMetaData; + +class PropertyInfo::Private { +public: + Property::Property prop; + QString name; + QString displayName; + QVariant::Type valueType; + bool shouldBeIndexed; +}; + +PropertyInfo::PropertyInfo(Property::Property property) + : d(new Private) +{ + d->prop = property; + d->shouldBeIndexed = true; + + switch (property) { + case Property::Album: + d->name = QLatin1String("album"); + d->displayName = i18nc("@label music album", "Album"); + d->valueType = QVariant::String; + break; + + case Property::AlbumArtist: + d->name = QLatin1String("albumArtist"); + d->displayName = i18nc("@label", "Album Artist"); + d->valueType = QVariant::StringList; + break; + + case Property::Artist: + d->name = QLatin1String("artist"); + d->displayName = i18nc("@label", "Artist"); + d->valueType = QVariant::StringList; + break; + + case Property::AspectRatio: + d->name = QLatin1String("aspectRatio"); + d->displayName = i18nc("@label", "Aspect Ratio"); + d->valueType = QVariant::Int; + break; + + case Property::Author: + d->name = QLatin1String("author"); + d->displayName = i18nc("@label", "Author"); + d->valueType = QVariant::StringList; + break; + + case Property::BitRate: + d->name = QLatin1String("bitRate"); + d->displayName = i18nc("@label", "Bitrate"); + d->valueType = QVariant::Int; + break; + + case Property::Channels: + d->name = QLatin1String("channels"); + d->displayName = i18nc("@label", "Channels"); + d->valueType = QVariant::Int; + break; + + case Property::Comment: + d->name = QLatin1String("comment"); + d->displayName = i18nc("@label", "Comment"); + d->valueType = QVariant::String; + d->shouldBeIndexed = false; + break; + + case Property::Composer: + d->name = QLatin1String("composer"); + d->displayName = i18nc("@label", "Composer"); + d->valueType = QVariant::String; + d->shouldBeIndexed = false; + break; + + case Property::Copyright: + d->name = QLatin1String("copyright"); + d->displayName = i18nc("@label", "Copyright"); + d->valueType = QVariant::String; + d->shouldBeIndexed = false; + break; + + case Property::CreationDate: + d->name = QLatin1String("creationDate"); + d->displayName = i18nc("@label", "Creation Date"); + d->valueType = QVariant::String; + break; + + case Property::Creator: + d->name = QLatin1String("creator"); + d->displayName = i18nc("@label", "Creator"); + d->valueType = QVariant::String; + d->shouldBeIndexed = false; + break; + + case Property::Description: + d->name = QLatin1String("description"); + d->displayName = i18nc("@label", "Description"); + d->valueType = QVariant::String; + d->shouldBeIndexed = false; + break; + + case Property::Duration: + d->name = QLatin1String("duration"); + d->displayName = i18nc("@label", "Duration"); + d->valueType = QVariant::Int; + break; + + case Property::Empty: + d->name = QLatin1String("empty"); + d->valueType = QVariant::Invalid; + break; + + case Property::FrameRate: + d->name = QLatin1String("frameRate"); + d->displayName = i18nc("@label", "Frame Rate"); + d->valueType = QVariant::Int; + break; + + // FIXME: This doesn't tell the user much + case Property::Generator: + d->name = QLatin1String("generator"); + d->displayName = i18nc("@label", "Generator"); + d->valueType = QVariant::String; + d->shouldBeIndexed = false; + break; + + case Property::Genre: + d->name = QLatin1String("genre"); + d->displayName = i18nc("@label music genre", "Genre"); + d->valueType = QVariant::StringList; + d->shouldBeIndexed = false; + break; + + case Property::Height: + d->name = QLatin1String("height"); + d->displayName = i18nc("@label", "Height"); + d->valueType = QVariant::Int; + break; + + case Property::ImageDateTime: + d->name = QLatin1String("imageDateTime"); + d->displayName = i18nc("@label EXIF", "Image Date Time"); + d->valueType = QVariant::DateTime; + break; + + case Property::ImageMake: + d->name = QLatin1String("imageMake"); + d->displayName = i18nc("@label EXIF", "Image Make"); + d->valueType = QVariant::String; + d->shouldBeIndexed = false; + break; + + case Property::ImageModel: + d->name = QLatin1String("imageModel"); + d->displayName = i18nc("@label EXIF", "Image Model"); + d->valueType = QVariant::String; + d->shouldBeIndexed = false; + break; + + case Property::ImageOrientation: + d->name = QLatin1String("imageOrientation"); + d->displayName = i18nc("@label EXIF", "Image Orientation"); + d->valueType = QVariant::Int; + break; + + case Property::Keywords: + d->name = QLatin1String("keywords"); + d->displayName = i18nc("@label", "Keywords"); + d->valueType = QVariant::StringList; + d->shouldBeIndexed = false; + break; + + case Property::Langauge: + d->name = QLatin1String("language"); + d->displayName = i18nc("@label", "Language"); + d->valueType = QVariant::String; + d->shouldBeIndexed = false; + break; + + case Property::LineCount: + d->name = QLatin1String("lineCount"); + d->displayName = i18nc("@label number of lines", "Line Count"); + d->valueType = QVariant::Int; + break; + + case Property::Lyricist: + d->name = QLatin1String("lyricist"); + d->displayName = i18nc("@label", "Lyricist"); + d->valueType = QVariant::StringList; + d->shouldBeIndexed = false; + break; + + case Property::PageCount: + d->name = QLatin1String("pageCount"); + d->displayName = i18nc("@label", "Page Count"); + d->valueType = QVariant::Int; + break; + + case Property::PhotoApertureValue: + d->name = QLatin1String("photoApertureValue"); + d->displayName = i18nc("@label EXIF", "Photo Aperture Value"); + d->valueType = QVariant::Double; + break; + + case Property::PhotoDateTimeOriginal: + d->name = QLatin1String("photoDateTimeOriginal"); + d->displayName = i18nc("@label EXIF", "Photo Original Date Time"); + d->valueType = QVariant::DateTime; + break; + + case Property::PhotoExposureBiasValue: + d->name = QLatin1String("photoExposureBiasValue"); + d->displayName = i18nc("@label EXIF", "Photo Exposure Bias"); + d->valueType = QVariant::Double; + break; + + case Property::PhotoExposureTime: + d->name = QLatin1String("photoExposureTime"); + d->displayName = i18nc("@label EXIF", "Photo Exposure Time"); + d->valueType = QVariant::Double; + break; + + case Property::PhotoFlash: + d->name = QLatin1String("photoFlash"); + d->displayName = i18nc("@label EXIF", "Photo Flash"); + d->valueType = QVariant::Int; + break; + + case Property::PhotoFNumber: + d->name = QLatin1String("photoFNumber"); + d->displayName = i18nc("@label EXIF", "Photo F Number"); + d->valueType = QVariant::Int; + break; + + case Property::PhotoFocalLength: + d->name = QLatin1String("photoFocalLength"); + d->displayName = i18nc("@label EXIF", "Photo Focal Length"); + d->valueType = QVariant::Double; + break; + + case Property::PhotoFocalLengthIn35mmFilm: + d->name = QLatin1String("photoFocalLengthIn35mmFilm"); + d->displayName = i18nc("@label EXIF", "Photo Focal Length 35mm"); + d->valueType = QVariant::Double; + break; + + case Property::PhotoISOSpeedRatings: + d->name = QLatin1String("photoISOSpeedRatings"); + d->displayName = i18nc("@label EXIF", "Photo ISO Speed Rating"); + d->valueType = QVariant::Int; + break; + + case Property::PhotoMeteringMode: + d->name = QLatin1String("photoMeteringMode"); + d->displayName = i18nc("@label EXIF", "Photo Metering Mode"); + d->valueType = QVariant::Int; + break; + + case Property::PhotoPixelXDimension: + d->name = QLatin1String("photoPixelXDimension"); + d->displayName = i18nc("@label EXIF", "Photo X Dimension"); + d->valueType = QVariant::Int; + break; + + case Property::PhotoPixelYDimension: + d->name = QLatin1String("photoPixelYDimension"); + d->displayName = i18nc("@label EXIF", "Photo Y Dimension"); + d->valueType = QVariant::Int; + break; + + case Property::PhotoSaturation: + d->name = QLatin1String("photoSaturation"); + d->displayName = i18nc("@label EXIF", "Photo Saturation"); + d->valueType = QVariant::Int; + break; + + case Property::PhotoSharpness: + d->name = QLatin1String("photoSharpness"); + d->displayName = i18nc("@label EXIF", "Photo Sharpness"); + d->valueType = QVariant::Int; + break; + + case Property::PhotoWhiteBalance: + d->name = QLatin1String("photoWhiteBalance"); + d->displayName = i18nc("@label EXIF", "Photo White Balance"); + d->valueType = QVariant::Int; + break; + + case Property::Publisher: + d->name = QLatin1String("publisher"); + d->displayName = i18nc("@label", "Publisher"); + d->valueType = QVariant::String; + break; + + case Property::ReleaseYear: + d->name = QLatin1String("releaseYear"); + d->displayName = i18nc("@label", "Release Year"); + d->valueType = QVariant::Int; + break; + + case Property::SampleRate: + d->name = QLatin1String("sampleRate"); + d->displayName = i18nc("@label", "Sample Rate"); + d->valueType = QVariant::Int; + break; + + case Property::Subject: + d->name = QLatin1String("subject"); + d->displayName = i18nc("@label", "Subject"); + d->valueType = QVariant::String; + d->shouldBeIndexed = false; + break; + + case Property::Title: + d->name = QLatin1String("title"); + d->displayName = i18nc("@label", "Title"); + d->valueType = QVariant::String; + break; + + case Property::TrackNumber: + d->name = QLatin1String("trackNumber"); + d->displayName = i18nc("@label music track number", "Track Number"); + d->valueType = QVariant::Int; + break; + + case Property::Width: + d->name = QLatin1String("width"); + d->displayName = i18nc("@label", "Width"); + d->valueType = QVariant::Int; + break; + + case Property::WordCount: + d->name = QLatin1String("wordCount"); + d->displayName = i18nc("@label number of words", "Word Count"); + d->valueType = QVariant::Int; + break; + + default: + break; + } + + if (d->valueType == QVariant::Int || d->valueType == QVariant::DateTime || + d->valueType == QVariant::Double) + { + d->shouldBeIndexed = false; + } +} + +PropertyInfo::PropertyInfo(const PropertyInfo& pi) + : d(new Private(*pi.d)) +{ +} + +PropertyInfo::~PropertyInfo() +{ + delete d; +} + +QString PropertyInfo::displayName() const +{ + return d->displayName; +} + +QString PropertyInfo::name() const +{ + return d->name; +} + +Property::Property PropertyInfo::property() const +{ + return d->prop; +} + +QVariant::Type PropertyInfo::valueType() const +{ + return d->valueType; +} + +bool PropertyInfo::shouldBeIndexed() const +{ + return d->shouldBeIndexed; +} + +PropertyInfo PropertyInfo::fromName(const QString& name) +{ + static QHash propertyHash; + + // FIXME: Multi-threading? + if (propertyHash.isEmpty()) { + propertyHash.insert(QLatin1String("bitrate"), Property::BitRate); + propertyHash.insert(QLatin1String("channels"), Property::Channels); + propertyHash.insert(QLatin1String("duration"), Property::Duration); + propertyHash.insert(QLatin1String("genre"), Property::Genre); + propertyHash.insert(QLatin1String("samplerate"), Property::SampleRate); + propertyHash.insert(QLatin1String("tracknumber"), Property::TrackNumber); + propertyHash.insert(QLatin1String("releaseyear"), Property::ReleaseYear); + propertyHash.insert(QLatin1String("comment"), Property::Comment); + propertyHash.insert(QLatin1String("artist"), Property::Artist); + propertyHash.insert(QLatin1String("album"), Property::Album); + propertyHash.insert(QLatin1String("albumartist"), Property::AlbumArtist); + propertyHash.insert(QLatin1String("composer"), Property::Composer); + propertyHash.insert(QLatin1String("lyricist"), Property::Lyricist); + propertyHash.insert(QLatin1String("author"), Property::Author); + propertyHash.insert(QLatin1String("title"), Property::Title); + propertyHash.insert(QLatin1String("subject"), Property::Subject); + propertyHash.insert(QLatin1String("creator"), Property::Creator); + propertyHash.insert(QLatin1String("generator"), Property::Generator); + propertyHash.insert(QLatin1String("pagecount"), Property::PageCount); + propertyHash.insert(QLatin1String("wordcount"), Property::WordCount); + propertyHash.insert(QLatin1String("linecount"), Property::LineCount); + propertyHash.insert(QLatin1String("language"), Property::Langauge); + propertyHash.insert(QLatin1String("copyright"), Property::Copyright); + propertyHash.insert(QLatin1String("publisher"), Property::Publisher); + propertyHash.insert(QLatin1String("description"), Property::Description); + propertyHash.insert(QLatin1String("creationdate"), Property::CreationDate); + propertyHash.insert(QLatin1String("keywords"), Property::Keywords); + propertyHash.insert(QLatin1String("width"), Property::Width); + propertyHash.insert(QLatin1String("height"), Property::Height); + propertyHash.insert(QLatin1String("aspectratio"), Property::AspectRatio); + propertyHash.insert(QLatin1String("framerate"), Property::FrameRate); + propertyHash.insert(QLatin1String("imagemake"), Property::ImageMake); + propertyHash.insert(QLatin1String("imagemodel"), Property::ImageModel); + propertyHash.insert(QLatin1String("imagedatetime"), Property::ImageDateTime); + propertyHash.insert(QLatin1String("imageorientation"), Property::ImageOrientation); + propertyHash.insert(QLatin1String("photoflash"), Property::PhotoFlash); + propertyHash.insert(QLatin1String("photopixelxdimension"), Property::PhotoPixelXDimension); + propertyHash.insert(QLatin1String("photopixelydimension"), Property::PhotoPixelYDimension); + propertyHash.insert(QLatin1String("photodatetimeoriginal"), Property::PhotoDateTimeOriginal); + propertyHash.insert(QLatin1String("photofocallength"), Property::PhotoFocalLength); + propertyHash.insert(QLatin1String("photofocallengthin35mmfilm"), Property::PhotoFocalLengthIn35mmFilm); + propertyHash.insert(QLatin1String("photoexposuretime"), Property::PhotoExposureTime); + propertyHash.insert(QLatin1String("photofnumber"), Property::PhotoFNumber); + propertyHash.insert(QLatin1String("photoaperturevalue"), Property::PhotoApertureValue); + propertyHash.insert(QLatin1String("photoexposurebiasvalue"), Property::PhotoExposureBiasValue); + propertyHash.insert(QLatin1String("photowhitebalance"), Property::PhotoWhiteBalance); + propertyHash.insert(QLatin1String("photometeringmode"), Property::PhotoMeteringMode); + propertyHash.insert(QLatin1String("photoisospeedratings"), Property::PhotoISOSpeedRatings); + propertyHash.insert(QLatin1String("photosaturation"), Property::PhotoSaturation); + propertyHash.insert(QLatin1String("photosharpness"), Property::PhotoSharpness); + } + + return PropertyInfo(propertyHash.value(name.toLower())); +} diff --git a/kfilemetadata/src/propertyinfo.h b/kfilemetadata/src/propertyinfo.h new file mode 100644 index 00000000..bb54f58c --- /dev/null +++ b/kfilemetadata/src/propertyinfo.h @@ -0,0 +1,81 @@ +/* + * This file is part of the KFileMetaData project + * Copyright (C) 2014 Vishesh Handa + * + * 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.1 of the License, or (at your option) version 3, or any + * later version accepted by the membership of KDE e.V. (or its + * successor approved by the membership of KDE e.V.), which shall + * act as a proxy defined in Section 6 of version 3 of the license. + * + * 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + */ + +#ifndef _KFILEMETADATA_PROPERTYINFO_H +#define _KFILEMETADATA_PROPERTYINFO_H + +#include +#include +#include "properties.h" +#include "kfilemetadata_export.h" + +namespace KFileMetaData { + +class KFILEMETADATA_EXPORT PropertyInfo +{ +public: + PropertyInfo(Property::Property property); + PropertyInfo(const PropertyInfo& pi); + ~PropertyInfo(); + + /** + * The enumeration which represents this property + */ + Property::Property property() const; + + /** + * The internal developer named used to refer to the property + */ + QString name() const; + + /** + * A user visible name of the property + */ + QString displayName() const; + + /** + * The type the value of this property should be. + * Eg - Property::Height should be an integer + */ + QVariant::Type valueType() const; + + /** + * Indicates if this property requires indexing or should just be stored. + * Eg - Property::Height does not need to be part of the global index. + * When a user searches for 600, they should not get images with + * that height + */ + bool shouldBeIndexed() const; + + /** + * Construct a PropertyInfo from the internal property name. + * The internal property name is case insensitive + */ + static PropertyInfo fromName(const QString& name); + +private: + class Private; + Private* d; +}; + +} +#endif // _KFILEMETADATA_PROPERTYINFO_H diff --git a/kfilemetadata/src/typeinfo.cpp b/kfilemetadata/src/typeinfo.cpp new file mode 100644 index 00000000..4ae1a65b --- /dev/null +++ b/kfilemetadata/src/typeinfo.cpp @@ -0,0 +1,101 @@ +/* + * + * Copyright (C) 2014 Vishesh Handa + * + * 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.1 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 + * + */ + +#include "typeinfo.h" + +#include + +using namespace KFileMetaData; + +class TypeInfo::Private { +public: + Type::Type type; + QString name; + QString displayName; +}; + +TypeInfo::TypeInfo(Type::Type type) + : d(new Private) +{ + d->type = type; + + switch (type) { + case Type::Archive: + d->name = QLatin1String("Archive"); + d->displayName = i18nc("@label", "Archive"); + break; + + case Type::Audio: + d->name = QLatin1String("Audio"); + d->displayName = i18nc("@label", "Audio"); + break; + + case Type::Document: + d->name = QLatin1String("Document"); + d->displayName = i18nc("@label", "Document"); + break; + + case Type::Image: + d->name = QLatin1String("Image"); + d->displayName = i18nc("@label", "Image"); + break; + + case Type::Presentation: + d->name = QLatin1String("Presentation"); + d->displayName = i18nc("@label", "Presentation"); + break; + + case Type::Spreadsheet: + d->name = QLatin1String("Spreadsheet"); + d->displayName = i18nc("@label", "Spreadsheet"); + break; + + case Type::Text: + d->name = QLatin1String("Text"); + d->displayName = i18nc("@label", "Text"); + break; + + case Type::Video: + d->name = QLatin1String("Video"); + d->displayName = i18nc("@label", "Video"); + break; + } +} + +TypeInfo::TypeInfo(const TypeInfo& ti) + : d(new Private(*ti.d)) +{ +} + +TypeInfo::~TypeInfo() +{ + delete d; +} + +QString TypeInfo::displayName() const +{ + return d->displayName; +} + +QString TypeInfo::name() const +{ + return d->name; +} + diff --git a/kfilemetadata/src/typeinfo.h b/kfilemetadata/src/typeinfo.h new file mode 100644 index 00000000..2675cbbd --- /dev/null +++ b/kfilemetadata/src/typeinfo.h @@ -0,0 +1,58 @@ +/* + * + * Copyright (C) 2014 Vishesh Handa + * + * 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.1 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 + * + */ + +#ifndef KFILEMETADATA_TYPEINFO_H +#define KFILEMETADATA_TYPEINFO_H + +#include "types.h" +#include "kfilemetadata_export.h" +#include + +namespace KFileMetaData { + +class KFILEMETADATA_EXPORT TypeInfo +{ +public: + TypeInfo(Type::Type type); + TypeInfo(const TypeInfo& ti); + ~TypeInfo(); + + /** + * The type identifier + */ + Type::Type type() const; + + /** + * An internal name for the type + */ + QString name() const; + + /** + * A user visible translated name for this type + */ + QString displayName() const; + +private: + class Private; + Private* d; +}; +} + +#endif // KFILEMETADATA_TYPEINFO_H diff --git a/kfilemetadata/src/types.h b/kfilemetadata/src/types.h new file mode 100644 index 00000000..77b63db8 --- /dev/null +++ b/kfilemetadata/src/types.h @@ -0,0 +1,82 @@ +/* + * This file is part of KFileMetaData + * Copyright (C) 2014 Vishesh Handa + * + * 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.1 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser 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 + * + */ + +#ifndef KFILEMETADATA_TYPES +#define KFILEMETADATA_TYPES + +namespace KFileMetaData { +namespace Type { + +enum Type { + FirstType = 0, + + /** + * Any file which contains a compressed collection of other files + * eg - tar, zip, rar, gz + */ + Archive = 0, + + /** + * Used to mark any file which just contains audio. Do not use this + * type if the file also contains Video + */ + Audio, + + /** + * Any file which contains Video. It may also contain Audio + */ + Video, + + /** + * Any Image file. This includes both raster and vector formats. + */ + Image, + + /** + * Any file which counts as a document. Documents are generally + * files which contain rich text, formatting and maybe images + */ + Document, + + /** + * A SpreadSheet file. This is a specialization of the Document type + * Any file which has this type should also have the Document type + */ + Spreadsheet, + + /** + * A Presentation file. This is a specialization of the Document type. + * Any file which has this type should also have the Document type + */ + Presentation, + + /** + * Any file which just contains plain text data counts + * as a Text file + */ + Text, + + LastType = Text +}; + +} +} + +#endif diff --git a/svgpart/CMakeLists.txt b/svgpart/CMakeLists.txt new file mode 100644 index 00000000..2d6800a2 --- /dev/null +++ b/svgpart/CMakeLists.txt @@ -0,0 +1,22 @@ +project(svgpart) + +if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR}) + find_package(KDE4 4.19.0 REQUIRED) + include(KDE4Defaults) + include_directories(${KDE4_INCLUDES}) + add_definitions(${QT_DEFINITIONS} ${KDE4_DEFINITIONS}) +endif() + +include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR}) + +set(svgpart_SRCS + svgpart.cpp +) + +kde4_add_plugin(svgpart ${svgpart_SRCS}) + +target_link_libraries(svgpart ${KDE4_KPARTS_LIBS}) + +install(TARGETS svgpart DESTINATION ${KDE4_PLUGIN_INSTALL_DIR}) +install(FILES svgpart.desktop DESTINATION ${KDE4_SERVICES_INSTALL_DIR}) +install(FILES svgpart.rc DESTINATION ${KDE4_DATA_INSTALL_DIR}/svgpart) diff --git a/svgpart/COPYING b/svgpart/COPYING new file mode 100644 index 00000000..d511905c --- /dev/null +++ b/svgpart/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/svgpart/Messages.sh b/svgpart/Messages.sh new file mode 100755 index 00000000..afee0945 --- /dev/null +++ b/svgpart/Messages.sh @@ -0,0 +1,3 @@ +#! /bin/sh +$EXTRACTRC *.rc >> rc.cpp +$XGETTEXT *.cpp -o $podir/svgpart.pot diff --git a/svgpart/svgpart.cpp b/svgpart/svgpart.cpp new file mode 100644 index 00000000..7a14b154 --- /dev/null +++ b/svgpart/svgpart.cpp @@ -0,0 +1,109 @@ +/* +Copyright 2007 Aurélien Gâteau + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ +#include "moc_svgpart.cpp" + +// Qt +#include +#include +#include +#include + +// KDE +#include +#include +#include +#include + +// Local + +static KAboutData createAboutData() +{ + KAboutData aboutData( "svgpart", 0, ki18n("SVG Part"), + "1.0", ki18n("A KPart to display SVG images"), + KAboutData::License_GPL, + ki18n("Copyright 2007, Aurélien Gâteau ")); + return aboutData; +} + +//Factory Code +K_PLUGIN_FACTORY( SvgPartFactory, registerPlugin< SvgPart >(); ) +K_EXPORT_PLUGIN( SvgPartFactory( createAboutData() ) ) + + +SvgPart::SvgPart(QWidget* parentWidget, QObject* parent, const QVariantList&) +: KParts::ReadOnlyPart(parent) +{ + mRenderer = new QSvgRenderer(this); + mScene = new QGraphicsScene(this); + mView = new QGraphicsView(mScene, parentWidget); + mView->setFrameStyle(QFrame::NoFrame); + mView->setDragMode(QGraphicsView::ScrollHandDrag); + mItem = 0; + setWidget(mView); + + KStandardAction::actualSize(this, SLOT(zoomActualSize()), actionCollection()); + KStandardAction::zoomIn(this, SLOT(zoomIn()), actionCollection()); + KStandardAction::zoomOut(this, SLOT(zoomOut()), actionCollection()); + setXMLFile("svgpart/svgpart.rc"); +} + + +bool SvgPart::openFile() { + if (!mRenderer->load(localFilePath())) { + return false; + } + mItem = new QGraphicsSvgItem(); + mItem->setSharedRenderer(mRenderer); + mScene->addItem(mItem); + return true; +} + + +bool SvgPart::closeUrl() { + delete mItem; + mItem = 0; + return KParts::ReadOnlyPart::closeUrl(); +} + + +void SvgPart::zoomIn() { + setZoom(zoom() * 2); +} + + +void SvgPart::zoomOut() { + setZoom(zoom() / 2); +} + + +void SvgPart::zoomActualSize() { + setZoom(1.0); +} + + +qreal SvgPart::zoom() const { + return mView->matrix().m11(); +} + + +void SvgPart::setZoom(qreal value) { + QMatrix matrix; + matrix.scale(value, value); + mView->setMatrix(matrix); +} diff --git a/svgpart/svgpart.desktop b/svgpart/svgpart.desktop new file mode 100644 index 00000000..249387ca --- /dev/null +++ b/svgpart/svgpart.desktop @@ -0,0 +1,67 @@ +[Desktop Entry] +Type=Service +Name=Svg Part +Name[ar]=جزء Svg +Name[ast]=Parte SVG +Name[bg]=Модул за Svg +Name[bs]=SVG dio +Name[ca]=Svg Part +Name[ca@valencia]=Svg Part +Name[cs]=SVG komponenta +Name[da]=Svg Part +Name[de]=SVG-Komponente +Name[el]=Τμήμα Svg +Name[en_GB]=Svg Part +Name[eo]=Svg komponanto +Name[es]=Parte SVG +Name[et]=Svg komponent +Name[eu]=SVGren zatia +Name[fi]=SVG-osa +Name[fr]=Composant SVG +Name[ga]=Comhpháirt Svg +Name[gl]=Compoñente de SVG +Name[hne]=एसवीजी पार्ट +Name[hr]=Svg Part +Name[hu]=SVG objektum +Name[ia]=Parte de SVG +Name[is]=Svg hlutur +Name[it]=Componente SVG +Name[ja]=SVG コンポーネント +Name[kk]=Svg компоненті +Name[km]=ផ្នែក Svg +Name[ko]=Svg 부분 +Name[ku]=Beşa Svg +Name[lt]=Svg Part +Name[lv]=Svg daļa +Name[mr]=Svg भाग +Name[nb]=Svg-del +Name[nds]=SVG-Komponent +Name[nl]=SVG-component +Name[nn]=SVG-del +Name[pa]=Svg ਭਾਗ +Name[pl]=Moduł SVG +Name[pt]=Componente de SVG +Name[pt_BR]=Componente SVG +Name[ro]=Componentă SVG +Name[ru]=Компонент просмотра Svg +Name[si]=Svg Part +Name[sk]=Svg komponent +Name[sl]=Sestavni del SVG +Name[sr]=СВГ део +Name[sr@ijekavian]=СВГ део +Name[sr@ijekavianlatin]=SVG deo +Name[sr@latin]=SVG deo +Name[sv]=SVG-delprogram +Name[th]=ส่วนจัดการ Svg +Name[tr]=Svg Parçacığı +Name[ug]=Svg Part +Name[uk]=Компонент Svg +Name[vi]=Phần nhúng đọc SVG +Name[x-test]=xxSvg Partxx +Name[zh_CN]=Svg 组件 +Name[zh_TW]=Svg 部件 +MimeType=image/svg+xml;image/svg+xml-compressed; +ServiceTypes=KParts/ReadOnlyPart +X-KDE-Library=svgpart +InitialPreference=12 +Icon=image-svg+xml diff --git a/svgpart/svgpart.h b/svgpart/svgpart.h new file mode 100644 index 00000000..a447a738 --- /dev/null +++ b/svgpart/svgpart.h @@ -0,0 +1,56 @@ +/* +Copyright 2007 Aurélien Gâteau + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ +#ifndef SVGPART_H +#define SVGPART_H + +// KDE +#include + + +#include +#include +#include +#include + +class SvgPart : public KParts::ReadOnlyPart { + Q_OBJECT +public: + SvgPart(QWidget* parentWidget, QObject* parent, const QVariantList&); + + virtual bool closeUrl(); + +protected: + virtual bool openFile(); + +private Q_SLOTS: + void zoomActualSize(); + void zoomIn(); + void zoomOut(); + +private: + QGraphicsScene* mScene; + QGraphicsView* mView; + QGraphicsSvgItem* mItem; + QSvgRenderer* mRenderer; + + qreal zoom() const; + void setZoom(qreal); +}; + +#endif /* SVGPART_H */ diff --git a/svgpart/svgpart.rc b/svgpart/svgpart.rc new file mode 100644 index 00000000..bd858c45 --- /dev/null +++ b/svgpart/svgpart.rc @@ -0,0 +1,22 @@ + + + + &View + + + + + + +Main Toolbar + + + + + + +