From 6752b5f475b266997ec9f1b65920665f466e8d5d Mon Sep 17 00:00:00 2001 From: Juergen Ryannel Date: Wed, 15 May 2019 15:47:56 +0200 Subject: qt analytics initial import Change-Id: I2a0274b00f848d7eaf698ce3b68cf4f5dfd0a516 Reviewed-by: Vladimir Minenko Reviewed-by: Bramastyo Harimukti Santoso --- .gitignore | 1 + .qmake.conf | 5 + LICENSE.GPL2 | 339 +++++++++++++ LICENSE.GPL3 | 674 ++++++++++++++++++++++++ LICENSE.GPL3-EXCEPT | 704 ++++++++++++++++++++++++++ LICENSE.LGPL3 | 165 ++++++ README.md | 11 + doc/doc.pri | 14 + doc/doc.pro | 19 + doc/examples/analytics_demo.qdoc | 38 ++ doc/index.qdoc | 59 +++ doc/qtanalytics-concepts.qdoc | 133 +++++ doc/qtanalytics-examples.qdoc | 42 ++ doc/qtanalytics-group.qdoc | 46 ++ doc/qtanalytics-installation.qdoc | 56 ++ doc/qtanalytics-online.qdocconf | 23 + doc/qtanalytics-project.qdocconf | 42 ++ doc/qtanalytics-usage.qdoc | 69 +++ doc/qtanalytics.qdocconf | 21 + doc/style/qt5-sidebar.html | 13 + examples/analytics_demo/HomePage.qml | 74 +++ examples/analytics_demo/InfoPage.qml | 70 +++ examples/analytics_demo/Main.qml | 125 +++++ examples/analytics_demo/SubscriptionsPage.qml | 165 ++++++ examples/analytics_demo/analytics.json | 7 + examples/analytics_demo/analytics_demo.pro | 32 ++ examples/analytics_demo/main.cpp | 71 +++ examples/analytics_demo/qml.qrc | 10 + examples/analytics_demo/qtquickcontrols2.conf | 5 + examples/examples.pro | 8 + qmake-features/config-output.prf | 54 ++ qtanalytics.pri | 35 ++ qtanalytics.pro | 17 + server/README.md | 51 ++ server/docker-compose.yml | 21 + src/plugin/abstractquerybuilder.cpp.autosave | 15 + src/plugin/analytics.cpp | 250 +++++++++ src/plugin/analytics.h | 116 +++++ src/plugin/configutil.cpp | 133 +++++ src/plugin/configutil.h | 55 ++ src/plugin/context.cpp | 151 ++++++ src/plugin/context.h | 74 +++ src/plugin/googlebuilder.cpp | 104 ++++ src/plugin/googlebuilder.h | 72 +++ src/plugin/hitbuilder.cpp | 141 ++++++ src/plugin/hitbuilder.h | 71 +++ src/plugin/matomobuilder.cpp | 96 ++++ src/plugin/matomobuilder.h | 68 +++ src/plugin/plugin.cpp | 63 +++ src/plugin/plugin.h | 51 ++ src/plugin/plugin.pri | 20 + src/plugin/plugin.pro | 42 ++ src/plugin/qmldir | 2 + src/src.pro | 9 + tests/auto/auto.pro | 7 + tests/auto/tst_analytics/tst_analytics.cpp | 118 +++++ tests/auto/tst_analytics/tst_analytics.pro | 10 + tests/auto/tst_config/analytics.json | 3 + tests/auto/tst_config/tst_config.cpp | 85 ++++ tests/auto/tst_config/tst_config.pro | 13 + tests/auto/tst_config/tst_config.qrc | 5 + tests/auto/tst_google/tst_google.cpp | 111 ++++ tests/auto/tst_google/tst_google.pro | 10 + tests/auto/tst_matomo/tst_matomo.cpp | 102 ++++ tests/auto/tst_matomo/tst_matomo.pro | 10 + tests/auto/tst_urlbuilder/tst_urlbuilder.cpp | 96 ++++ tests/auto/tst_urlbuilder/tst_urlbuilder.pro | 10 + tests/tests.pro | 6 + tools/simple_http_server.sh | 48 ++ 69 files changed, 5386 insertions(+) create mode 100644 .gitignore create mode 100644 .qmake.conf create mode 100644 LICENSE.GPL2 create mode 100644 LICENSE.GPL3 create mode 100644 LICENSE.GPL3-EXCEPT create mode 100644 LICENSE.LGPL3 create mode 100644 README.md create mode 100644 doc/doc.pri create mode 100644 doc/doc.pro create mode 100644 doc/examples/analytics_demo.qdoc create mode 100644 doc/index.qdoc create mode 100644 doc/qtanalytics-concepts.qdoc create mode 100644 doc/qtanalytics-examples.qdoc create mode 100644 doc/qtanalytics-group.qdoc create mode 100644 doc/qtanalytics-installation.qdoc create mode 100644 doc/qtanalytics-online.qdocconf create mode 100644 doc/qtanalytics-project.qdocconf create mode 100644 doc/qtanalytics-usage.qdoc create mode 100644 doc/qtanalytics.qdocconf create mode 100644 doc/style/qt5-sidebar.html create mode 100644 examples/analytics_demo/HomePage.qml create mode 100644 examples/analytics_demo/InfoPage.qml create mode 100644 examples/analytics_demo/Main.qml create mode 100644 examples/analytics_demo/SubscriptionsPage.qml create mode 100644 examples/analytics_demo/analytics.json create mode 100644 examples/analytics_demo/analytics_demo.pro create mode 100644 examples/analytics_demo/main.cpp create mode 100644 examples/analytics_demo/qml.qrc create mode 100644 examples/analytics_demo/qtquickcontrols2.conf create mode 100644 examples/examples.pro create mode 100644 qmake-features/config-output.prf create mode 100644 qtanalytics.pri create mode 100644 qtanalytics.pro create mode 100644 server/README.md create mode 100644 server/docker-compose.yml create mode 100644 src/plugin/abstractquerybuilder.cpp.autosave create mode 100644 src/plugin/analytics.cpp create mode 100644 src/plugin/analytics.h create mode 100644 src/plugin/configutil.cpp create mode 100644 src/plugin/configutil.h create mode 100644 src/plugin/context.cpp create mode 100644 src/plugin/context.h create mode 100644 src/plugin/googlebuilder.cpp create mode 100644 src/plugin/googlebuilder.h create mode 100644 src/plugin/hitbuilder.cpp create mode 100644 src/plugin/hitbuilder.h create mode 100644 src/plugin/matomobuilder.cpp create mode 100644 src/plugin/matomobuilder.h create mode 100644 src/plugin/plugin.cpp create mode 100644 src/plugin/plugin.h create mode 100644 src/plugin/plugin.pri create mode 100644 src/plugin/plugin.pro create mode 100644 src/plugin/qmldir create mode 100644 src/src.pro create mode 100644 tests/auto/auto.pro create mode 100644 tests/auto/tst_analytics/tst_analytics.cpp create mode 100644 tests/auto/tst_analytics/tst_analytics.pro create mode 100644 tests/auto/tst_config/analytics.json create mode 100644 tests/auto/tst_config/tst_config.cpp create mode 100644 tests/auto/tst_config/tst_config.pro create mode 100644 tests/auto/tst_config/tst_config.qrc create mode 100644 tests/auto/tst_google/tst_google.cpp create mode 100644 tests/auto/tst_google/tst_google.pro create mode 100644 tests/auto/tst_matomo/tst_matomo.cpp create mode 100644 tests/auto/tst_matomo/tst_matomo.pro create mode 100644 tests/auto/tst_urlbuilder/tst_urlbuilder.cpp create mode 100644 tests/auto/tst_urlbuilder/tst_urlbuilder.pro create mode 100644 tests/tests.pro create mode 100755 tools/simple_http_server.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..722d5e7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.vscode diff --git a/.qmake.conf b/.qmake.conf new file mode 100644 index 0000000..95173a2 --- /dev/null +++ b/.qmake.conf @@ -0,0 +1,5 @@ +SOURCE_DIR=$$PWD +BUILD_DIR=$$shadowed($$PWD) +QMAKEFEATURES=$$SOURCE_DIR/qmake-features + +VERSION = 5.13.0 diff --git a/LICENSE.GPL2 b/LICENSE.GPL2 new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/LICENSE.GPL2 @@ -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/LICENSE.GPL3 b/LICENSE.GPL3 new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/LICENSE.GPL3 @@ -0,0 +1,674 @@ + GNU 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. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/LICENSE.GPL3-EXCEPT b/LICENSE.GPL3-EXCEPT new file mode 100644 index 0000000..b1cb1be --- /dev/null +++ b/LICENSE.GPL3-EXCEPT @@ -0,0 +1,704 @@ +This is the GNU General Public License version 3, annotated with The +Qt Company GPL Exception 1.0: + +------------------------------------------------------------------------- + +The Qt Company GPL Exception 1.0 + +Exception 1: + +As a special exception you may create a larger work which contains the +output of this application and distribute that work under terms of your +choice, so long as the work is not otherwise derived from or based on +this application and so long as the work does not in itself generate +output that contains the output from this application in its original +or modified form. + +Exception 2: + +As a special exception, you have permission to combine this application +with Plugins licensed under the terms of your choice, to produce an +executable, and to copy and distribute the resulting executable under +the terms of your choice. However, the executable must be accompanied +by a prominent notice offering all users of the executable the entire +source code to this application, excluding the source code of the +independent modules, but including any changes you have made to this +application, under the terms of this license. + + +------------------------------------------------------------------------- + + GNU 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. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/LICENSE.LGPL3 b/LICENSE.LGPL3 new file mode 100644 index 0000000..65c5ca8 --- /dev/null +++ b/LICENSE.LGPL3 @@ -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/README.md b/README.md new file mode 100644 index 0000000..9664e2c --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# QtAnalytics + +A generic analytics module which can work with Google Analytics and Matomo Analytics server. + +# Build + + qmake && make && make install + +# Usage + +Please see the documentation or the example code. diff --git a/doc/doc.pri b/doc/doc.pri new file mode 100644 index 0000000..eb311b0 --- /dev/null +++ b/doc/doc.pri @@ -0,0 +1,14 @@ +build_online_docs: { + QMAKE_DOCS_TARGETDIR = qtanalytics + QMAKE_DOCS = $$PWD/qtanalytics-online.qdocconf +} else { + QMAKE_DOCS = $$PWD/qtanalytics.qdocconf +} + +load(qt_docs_targets) + +OTHER_FILES += \ + $$PWD/*.qdocconf \ + $$PWD/*.qdoc \ + $$PWD/examples/*.qdoc \ + $$PWD/images/*.png diff --git a/doc/doc.pro b/doc/doc.pro new file mode 100644 index 0000000..46b9f9b --- /dev/null +++ b/doc/doc.pro @@ -0,0 +1,19 @@ +TEMPLATE = aux + +CONFIG += force_qt +QT *= quick network + +build_online_docs: { + QMAKE_DOCS_TARGETDIR = qtanalytics + QMAKE_DOCS = $$PWD/qtanalytics-online.qdocconf +} else { + QMAKE_DOCS = $$PWD/qtanalytics.qdocconf +} + +include(doc.pri) + +OTHER_FILES += \ + $$PWD/*.qdocconf \ + $$PWD/*.qdoc \ + $$PWD/examples/*.qdoc \ + $$PWD/images/*.png diff --git a/doc/examples/analytics_demo.qdoc b/doc/examples/analytics_demo.qdoc new file mode 100644 index 0000000..9afedb6 --- /dev/null +++ b/doc/examples/analytics_demo.qdoc @@ -0,0 +1,38 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB +** +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtAnalytics plugin. +** +** $QT_BEGIN_LICENSE:GPL-QTAS$ +** Commercial License Usage +** Licensees holding valid commercial Qt Automotive Suite licenses may use +** this file in accordance with the commercial license agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and The Qt Company. For +** licensing terms and conditions see https://www.qt.io/terms-conditions. +** For further information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +** SPDX-License-Identifier: GPL-3.0 +** +****************************************************************************/ +/*! + \example analytics_demo + \title Analytics Demo + + \brief Demonstrates how to use the analytics plugin. + +*/ diff --git a/doc/index.qdoc b/doc/index.qdoc new file mode 100644 index 0000000..d31b74e --- /dev/null +++ b/doc/index.qdoc @@ -0,0 +1,59 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB +** +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt analytics plugin. +** +** $QT_BEGIN_LICENSE:GPL-QTAS$ +** Commercial License Usage +** Licensees holding valid commercial Qt Automotive Suite licenses may use +** this file in accordance with the commercial license agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and The Qt Company. For +** licensing terms and conditions see https://www.qt.io/terms-conditions. +** For further information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +** SPDX-License-Identifier: GPL-3.0 +** +****************************************************************************/ + +/*! + +\page qtanalytics-index.html +\keyword QtAnalytics Reference Documentation +\title Qt Analytics + +\section1 Overview + +Qt analytics is a module to send user interface traces to a cloud server. + + \list + \li \l{qtanalytics}{Qt Analytics} + \li \l{Concepts} + \li \l{Installation} + \li \l{Usage} + \endlist +*/ + +/*! + * \page qtanalytics-reference + * \title API Reference + * + * + * \list + * \li \l{qtanalytics}{Qt Analytics} + * \endlist + */ diff --git a/doc/qtanalytics-concepts.qdoc b/doc/qtanalytics-concepts.qdoc new file mode 100644 index 0000000..cf9c2a3 --- /dev/null +++ b/doc/qtanalytics-concepts.qdoc @@ -0,0 +1,133 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB +** +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtAnalytics plugin. +** +** $QT_BEGIN_LICENSE:GPL-QTAS$ +** Commercial License Usage +** Licensees holding valid commercial Qt Automotive Suite licenses may use +** this file in accordance with the commercial license agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and The Qt Company. For +** licensing terms and conditions see https://www.qt.io/terms-conditions. +** For further information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +** SPDX-License-Identifier: GPL-3.0 +** +****************************************************************************/ + +/*! + +\page qtanalytics-concepts.html +\title Concepts + +\section1 Tracking + +What do we want to track? + +We want mostly track page views and actions, as also general device +information. + +\section1 ConfigUtil + +\l ConfigUtil provides utility function to load and parse JSON based +configuration files. The file lookup is based on a given name (e.g. +\c {analytics}) and the lookup looks first for an environment variable +called \c {ANALYTICS_CONFIG}, and if exists will take that path. If not +then a file will be looked in the resource file named \c {:/analytics.json}. +If this also not exists a warning is printed and the configuration is +not successful. + +\section1 \l {Context} {Context} + +The \l Context object provides the methods available to the builders. It is +reused across all hits. It provides a configuration value access as also network +HTTP GET/POST methods. + +In general it should be possible to have a Context interface which could +then be used inside the hit builders and by this making them more +testable. + +The configuration is stored into a JSON file (e.g. analytics.json) which +is looked up using the ConfigUtil functions. + +\sa {Context}, {IContext} + +\section1 \l {HitBuilder} {Hit Builder} + +The hit builder is an interface used to collect the various tracking +information and then send the information away using a network. + +The hit builder has a common high level API to be shared across specific +builders. + +\list +\li send build trackVisit trackEvent +\endlist + +\sa {HitBuilder}, {MatomoBuilder}, {GoogleBuilder} + +\section1 \l {MatomoBuilder} {Matomo Hit Builder} + +\list +\li \l {https://developer.matomo.org/api-reference/tracking-api} +\endlist + +The Matomo hit builder is enabled by setting tracker to "matomo" in the +configuration file. The builder support visit and event tracking. It +uses a GET request to the server URL to send the tracking information. + +\section1 \l {GoogleBuilder} {Google Analytics Tracking} + +\list +\li \l {https://developers.google.com/analytics/devguides/collection/protocol/v1/} +\li \l {https://ga-dev-tools.appspot.com/hit-builder/} +\endlist + +The Google hit builder is enabled by setting the tracker to "google". It +uses the Google measurements protocol. + +\section1 Configuration Format + +The configuration is stored in JSON documents. The document keys change with the chosen \c tracker (e.g. \c matomo, \c google). + +\note It is not possible currently to support several trackers. + +\section2 Google Configuration + +\code +{ + "tracker": "google" + "tid": "UA-555555555-5", + "cid": "555", + "deviceResolution": "1280x800", + "domain": "http://example.org", +} +\endcode + +\section2 Matomo Configuration + +\code +{ + "tracker": "matomo", + "server": "http://localhost:8000/piwik.php", + "idsite": "1" +} +\endcode + + +*/ diff --git a/doc/qtanalytics-examples.qdoc b/doc/qtanalytics-examples.qdoc new file mode 100644 index 0000000..0b8f0e7 --- /dev/null +++ b/doc/qtanalytics-examples.qdoc @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB +** +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtAnalytics plugin. +** +** $QT_BEGIN_LICENSE:GPL-QTAS$ +** Commercial License Usage +** Licensees holding valid commercial Qt Automotive Suite licenses may use +** this file in accordance with the commercial license agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and The Qt Company. For +** licensing terms and conditions see https://www.qt.io/terms-conditions. +** For further information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +** SPDX-License-Identifier: GPL-3.0 +** +****************************************************************************/ + +/*! + \group qtanalytics-examples + \title Analytics Examples + \brief Examples showing how to extend the functionality of Qt Analytics. + + \list + \li \l{qtanalytics_demo}{Analytics Demo} + \endlist + +*/ diff --git a/doc/qtanalytics-group.qdoc b/doc/qtanalytics-group.qdoc new file mode 100644 index 0000000..a67c558 --- /dev/null +++ b/doc/qtanalytics-group.qdoc @@ -0,0 +1,46 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB +** +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtAnalytics plugin. +** +** $QT_BEGIN_LICENSE:GPL-QTAS$ +** Commercial License Usage +** Licensees holding valid commercial Qt Automotive Suite licenses may use +** this file in accordance with the commercial license agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and The Qt Company. For +** licensing terms and conditions see https://www.qt.io/terms-conditions. +** For further information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +** SPDX-License-Identifier: GPL-3.0 +** +****************************************************************************/ + + +/*! + \module qtanalytics + + \title Qt Analytics Module + \brief Classes for interacting with a Matomo server to track user + interface metrics. + + The QtAnalytics module allows a developer to provide traces inside a user interface to send those ui traces to a Matamo server. + + Tracing is limited currently to tracing page views, events and custom variables. + Traces are send to the server directly using a HTTP GET or POST request. There is support currently for the Matamo server and the Google Analytics platform. + + */ diff --git a/doc/qtanalytics-installation.qdoc b/doc/qtanalytics-installation.qdoc new file mode 100644 index 0000000..82e9f31 --- /dev/null +++ b/doc/qtanalytics-installation.qdoc @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB +** +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtAnalytics plugin. +** +** $QT_BEGIN_LICENSE:GPL-QTAS$ +** Commercial License Usage +** Licensees holding valid commercial Qt Automotive Suite licenses may use +** this file in accordance with the commercial license agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and The Qt Company. For +** licensing terms and conditions see https://www.qt.io/terms-conditions. +** For further information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +** SPDX-License-Identifier: GPL-3.0 +** +****************************************************************************/ + +/*! + +\page qtanalytics-installation.html +\title Installation + +\section1 Dependencies + +\list + \li Windows, Linux or macOS + \li Qt5.4 or higher +\endlist + +\section1 Building for desktop + +\code + $ qmake + $ make + $ make install +\endcode + +Qt Analytics plugin is installed into the Qt SDK as a QtQuick plugin. See \l {Usage} for more information how to use the plugin. + + +*/ diff --git a/doc/qtanalytics-online.qdocconf b/doc/qtanalytics-online.qdocconf new file mode 100644 index 0000000..a8a4108 --- /dev/null +++ b/doc/qtanalytics-online.qdocconf @@ -0,0 +1,23 @@ + +HTML.footer = \ + " \n" \ + "

\n" \ + " © 2019 Luxoft Sweden AB.\n" \ + " Documentation contributions included herein are the copyrights of\n" \ + " their respective owners. " \ + " The documentation provided herein is licensed under the terms of the" \ + " GNU Free Documentation" \ + " License version 1.3 as published by the Free Software Foundation. " \ + " Qt and respective logos are trademarks of The Qt Company Ltd. " \ + " in Finland and/or other countries worldwide. All other trademarks are property\n" \ + " of their respective owners.

\n" + +include($QT_INSTALL_DOCS/global/qt-html-templates-online.qdocconf) + +# Add an .html file with sidebar content, used in the online style +HTML.stylesheets += style/qt5-sidebar.html + +HTML.nosubdirs = "false" +HTML.outputsubdir = "qtanalytics" + +include(qtanalytics-project.qdocconf) diff --git a/doc/qtanalytics-project.qdocconf b/doc/qtanalytics-project.qdocconf new file mode 100644 index 0000000..6e8f7fe --- /dev/null +++ b/doc/qtanalytics-project.qdocconf @@ -0,0 +1,42 @@ +project = QtAnalytics +description = QtAnalytics Reference Documentation +url = https://doc.qt.io/QtAnalytics +version = $QT_VERSION + +sources.fileextensions = "*.cpp *.qdoc *.mm *.qml" +headers.fileextensions = "*.h *.ch *.h++ *.hh *.hpp *.hxx" + +examples.fileextensions = "*.cpp *.h *.js *.xq *.svg *.xml *.ui *.qhp *.qhcp *.qml" +examples.imageextensions = "*.png *.jpeg *.jpg *.gif *.mng" + +exampledirs = ../examples ../src + +headerdirs = \ + ../src + +sourcedirs += \ + . \ + ../src \ + ../examples + +imagedirs = images + +qhp.projects = QtAnalytics +qhp.QtAnalytics.file = qtanalytics.qhp +qhp.QtAnalytics.namespace = io.qt.qtanalytics.$QT_VERSION_TAG +qhp.QtAnalytics.virtualFolder = qtanalytics +qhp.QtAnalytics.indexTitle = Qt Analytics +qhp.QtAnalytics.indexRoot = + +qhp.QtAnalytics.filterAttributes = QtAnalytics $QT_VERSION +qhp.QtAnalytics.customFilters.QtAnalytics.name = QtAnalytics $QT_VERSION +qhp.QtAnalytics.customFilters.QtAnalytics.filterAttributes = QtAnalytics $QT_VERSION + +qhp.QtAnalytics.subprojects = manual +qhp.QtAnalytics.subprojects.manual.title = Qt Analytics +qhp.QtAnalytics.subprojects.manual.indexTitle = Qt Analytics +qhp.QtAnalytics.subprojects.manual.type = manual + +navigation.homepage = "Qt Automotive Suite" +navigation.landingpage = "Qt Analytics" +buildversion = "Qt Analytics $QT_VERSION" diff --git a/doc/qtanalytics-usage.qdoc b/doc/qtanalytics-usage.qdoc new file mode 100644 index 0000000..8b6eb1b --- /dev/null +++ b/doc/qtanalytics-usage.qdoc @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB +** +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtAnalytics plugin. +** +** $QT_BEGIN_LICENSE:GPL-QTAS$ +** Commercial License Usage +** Licensees holding valid commercial Qt Automotive Suite licenses may use +** this file in accordance with the commercial license agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and The Qt Company. For +** licensing terms and conditions see https://www.qt.io/terms-conditions. +** For further information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +** SPDX-License-Identifier: GPL-3.0 +** +****************************************************************************/ + +/*! + +\page qtanalytics-usage.html +\title Usage + +\section1 Introduction + +The analytics plugin works with either a recent Matamo Server or Google Analytics. For both setup it is assumed the credentials and logins are available. + +To avoid having configuration information inside the UI code the plugin looks up a configuration file. The configuration is stored by default into a \c {:/analytics.json} document. This location can be overridden using the \c {ANALYTICS_CONFIG} environment variable. + +The config file must have at least a \c {tracker} key and the corresponding builder configuration. + +For example for a google tracker you specify + +\code +{ + "tracker": "google" + "tid": "UA-555555555-5", + "cid": "555", + "deviceResolution": "1280x800", + "domain": "http://example.org", +} +\endcode + +\list +\li \c tracker - the tracker backend to be used +\li \c tid - the tracker id +\li \c cid - the client id +\li \c deviceResolution - a custom variable to be send with the tracker +\li \c domain - the URI the application will identify +\endlist + + +See \l {Concepts} for more information. + +*/ diff --git a/doc/qtanalytics.qdocconf b/doc/qtanalytics.qdocconf new file mode 100644 index 0000000..b094803 --- /dev/null +++ b/doc/qtanalytics.qdocconf @@ -0,0 +1,21 @@ +include($QT_INSTALL_DOCS/global/qt-html-templates-offline.qdocconf) +include(qtanalytics-project.qdocconf) + +HTML.footer = \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + "\n" \ + "
\n" \ + "

\n" \ + " © 2019 Luxoft Sweden AB.\n" \ + " Documentation contributions included herein are the copyrights of\n" \ + " their respective owners.
" \ + " The documentation provided herein is licensed under the terms of the" \ + " GNU Free Documentation" \ + " License version 1.3 as published by the Free Software Foundation.
" \ + " Qt and respective logos are trademarks of The Qt Company Ltd. " \ + " in Finland and/or other countries worldwide. All other trademarks are property\n" \ + " of their respective owners.

\n" \ + "
\n" diff --git a/doc/style/qt5-sidebar.html b/doc/style/qt5-sidebar.html new file mode 100644 index 0000000..bb4f6b0 --- /dev/null +++ b/doc/style/qt5-sidebar.html @@ -0,0 +1,13 @@ +
+
+

Qt Analytics

+
+ +
diff --git a/examples/analytics_demo/HomePage.qml b/examples/analytics_demo/HomePage.qml new file mode 100644 index 0000000..84a2947 --- /dev/null +++ b/examples/analytics_demo/HomePage.qml @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2018, 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "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 COPYRIGHT +** OWNER OR CONTRIBUTORS 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." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.11 +import QtQuick.Controls 2.4 + +import analytics 1.0 + +Page { + id: root + objectName: "home" + title: qsTr("Home") + + Analytics.variables: { + "DeviceType": "Embedded", + "DeviceBrand": "Luxoft", + "DeviceModel": "Vehicle01" + } + + Label { + text: qsTr("The home page") + font.pixelSize: 36 + anchors.centerIn: parent + } + + Component.onCompleted: Analytics.sendVisit(root.objectName, "Home", {"1": 66} ) +} diff --git a/examples/analytics_demo/InfoPage.qml b/examples/analytics_demo/InfoPage.qml new file mode 100644 index 0000000..f37bd06 --- /dev/null +++ b/examples/analytics_demo/InfoPage.qml @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2018, 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "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 COPYRIGHT +** OWNER OR CONTRIBUTORS 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." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.11 +import QtQuick.Controls 2.4 + +import analytics 1.0 + +Page { + id: root + objectName: "info" + title: qsTr("Info Page") + + contentItem: Item { + Label { + anchors.centerIn: parent + font.pixelSize: 36 + text: "Information" + } + } + + Component.onCompleted: Analytics.sendVisit(root.objectName, "Info") +} diff --git a/examples/analytics_demo/Main.qml b/examples/analytics_demo/Main.qml new file mode 100644 index 0000000..ebb3b19 --- /dev/null +++ b/examples/analytics_demo/Main.qml @@ -0,0 +1,125 @@ +/**************************************************************************** +** +** Copyright (C) 2018, 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "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 COPYRIGHT +** OWNER OR CONTRIBUTORS 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." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.11 +import QtQuick.Controls 2.4 + +import analytics 1.0 + +ApplicationWindow { + id: window + visible: true + width: 480 + height: 800 + title: qsTr("Analytics Demo") + + header: ToolBar { + contentHeight: toolButton.implicitHeight + + ToolButton { + id: toolButton + text: stackView.depth > 1 ? "\u25C0" : "\u2630" + font.pixelSize: Qt.application.font.pixelSize * 1.6 + onClicked: { + if (stackView.depth > 1) { + var url = stackView.currentItem.currentUrl + stackView.pop() + Analytics.sendEvent(url, "UserAction", "BackButton", "clicked", 0) + } else { + drawer.open() + } + } + } + + Label { + anchors.centerIn: parent + font.pixelSize: 20 + text: stackView.currentItem.title + } + } + + Drawer { + id: drawer + width: window.width * 0.5 + height: window.height + + Column { + anchors.fill: parent + + ItemDelegate { + text: qsTr("Subscriptions") + width: parent.width + font.pixelSize: 20 + onClicked: { + stackView.push("SubscriptionsPage.qml") + drawer.close() + } + } + ItemDelegate { + text: qsTr("Info") + width: parent.width + font.pixelSize: 20 + onClicked: { + stackView.push("InfoPage.qml") + drawer.close() + } + } + } + } + + Pane { + anchors.fill: parent + anchors.margins: 7 + contentItem: StackView { + id: stackView + initialItem: "HomePage.qml" + } + } +} diff --git a/examples/analytics_demo/SubscriptionsPage.qml b/examples/analytics_demo/SubscriptionsPage.qml new file mode 100644 index 0000000..2fb5687 --- /dev/null +++ b/examples/analytics_demo/SubscriptionsPage.qml @@ -0,0 +1,165 @@ +/**************************************************************************** +** +** Copyright (C) 2018, 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "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 COPYRIGHT +** OWNER OR CONTRIBUTORS 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." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.11 +import QtQuick.Controls 2.4 + +import analytics 1.0 + +Page { + id: root + objectName: "subscriptions" + title: qsTr("Subscriptions Page") + + property int activationIndex: -1 + + + ListModel { + id: listModel + ListElement { + name: "Special offers" + service: "offers" + active: false + } + ListElement { + name: "Company news" + service: "news.company" + active: false + } + ListElement { + name: "Sales" + service: "sales" + active: false + } + ListElement { + name: "Password expiration" + service: "account.changes" + active: false + } + ListElement { + name: "Private messages" + service: "account.message" + active: false + } + ListElement { + name: "New features" + service: "news.features" + active: false + } + } + + contentItem: ListView { + model: listModel + delegate: ItemDelegate { + width: ListView.view.width + height: 80 + contentItem: Item { + Label { + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + font.pixelSize: 26 + text: model.name + } + Button { + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + width: 100 + checked: model.active + text: model.active ? qsTr("Deactivate") : qsTr("Activate") + enabled: activationIndex == -1 + onClicked: { + Analytics.sendEvent(root.objectName, "UserAction", "Subscription Activation", model.service, (!model.active)) + activationIndex = index + fakeActivation.start() + labelError.visible = false + } + BusyIndicator { + anchors.centerIn: parent + visible: activationIndex == index + } + } + } + } + } + + Label { + id: labelError + anchors.bottom: parent.bottom + anchors.bottomMargin: 50 + anchors.horizontalCenter: parent.horizontalCenter + visible: false + text: "Error. Please, try again." + } + + Timer { + id: fakeActivation + interval: 1500 + repeat: false + triggeredOnStart: false + onTriggered: { + var success = Math.random() + console.log(success) + if (success > 0.4) { + var active = listModel.get(activationIndex).active + var service = listModel.get(activationIndex).service + listModel.setProperty(activationIndex, "active", !active) + Analytics.sendEvent(root.objectName, "ServerResponse", "Subscription Activation", service, 1) + } else { + labelError.visible = true + Analytics.sendEvent(root.objectName, "ServerResponse", "Subscription Activation", service, 0) + } + + activationIndex = -1 + } + } + + + Component.onCompleted: Analytics.sendVisit(objectName, "created") +} diff --git a/examples/analytics_demo/analytics.json b/examples/analytics_demo/analytics.json new file mode 100644 index 0000000..2aa6d27 --- /dev/null +++ b/examples/analytics_demo/analytics.json @@ -0,0 +1,7 @@ +{ + "tid": "UA-141497781-2", + "cid": "555", + "deviceResolution": "1280x800", + "domain": "http://example.org", + "tracker": "google" +} diff --git a/examples/analytics_demo/analytics_demo.pro b/examples/analytics_demo/analytics_demo.pro new file mode 100644 index 0000000..905fdb2 --- /dev/null +++ b/examples/analytics_demo/analytics_demo.pro @@ -0,0 +1,32 @@ +QT += quick +CONFIG += c++11 + +OBJECTS_DIR = .obj +MOC_DIR = .moc + +# The following define makes your compiler emit warnings if you use +# any feature of Qt which as been marked deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + main.cpp + +RESOURCES += qml.qrc + +include ( ../../qtanalytics.pri ) +include ( ../../doc/doc.pri ) + + +# Additional import path used to resolve QML modules in Qt Creator's code model +QML_IMPORT_PATH = + +# Additional import path used to resolve QML modules just for Qt Quick Designer +QML_DESIGNER_IMPORT_PATH = + diff --git a/examples/analytics_demo/main.cpp b/examples/analytics_demo/main.cpp new file mode 100644 index 0000000..9f5096a --- /dev/null +++ b/examples/analytics_demo/main.cpp @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 2018, 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "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 COPYRIGHT +** OWNER OR CONTRIBUTORS 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." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +#include + +int main(int argc, char *argv[]) +{ + QCoreApplication::setApplicationName("Analytics Demo"); + QCoreApplication::setApplicationVersion("1.0"); + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + + QGuiApplication app(argc, argv); + + QQmlApplicationEngine engine; + + engine.load(QUrl(QStringLiteral("qrc:/Main.qml"))); + if (engine.rootObjects().isEmpty()) + return -1; + + return app.exec(); +} diff --git a/examples/analytics_demo/qml.qrc b/examples/analytics_demo/qml.qrc new file mode 100644 index 0000000..f328245 --- /dev/null +++ b/examples/analytics_demo/qml.qrc @@ -0,0 +1,10 @@ + + + Main.qml + HomePage.qml + SubscriptionsPage.qml + qtquickcontrols2.conf + InfoPage.qml + analytics.json + + diff --git a/examples/analytics_demo/qtquickcontrols2.conf b/examples/analytics_demo/qtquickcontrols2.conf new file mode 100644 index 0000000..e1c0add --- /dev/null +++ b/examples/analytics_demo/qtquickcontrols2.conf @@ -0,0 +1,5 @@ +[Controls] +Style=Material + +[Material] +Theme=Dark diff --git a/examples/examples.pro b/examples/examples.pro new file mode 100644 index 0000000..efced85 --- /dev/null +++ b/examples/examples.pro @@ -0,0 +1,8 @@ +TEMPLATE = subdirs + +include ( ../qtanalytics.pri ) +include ( ../doc/doc.pri ) + + +SUBDIRS += \ + analytics_demo diff --git a/qmake-features/config-output.prf b/qmake-features/config-output.prf new file mode 100644 index 0000000..e52b4c9 --- /dev/null +++ b/qmake-features/config-output.prf @@ -0,0 +1,54 @@ +defineReplace(yesNo) { + if ($$1):return("yes") + else:return("no") +} + +defineTest(printConfigLine) { + !build_pass:return + + msg="$$1" + val=$$2 + color=$$3 + width=$$4 + + isEmpty(width):width = 30 + + unix:system("tty -s") { # check if we are on unix and stdout is a tty + equals(color, "auto") { + yesmatch = $$find(val, "^yes") + nomatch = $$find(val, "^no") + automatch = $$find(val, "^auto") + + !isEmpty(yesmatch):color = "green" + else:!isEmpty(nomatch):color = "red" + else:!isEmpty(automatch):color = "yellow" + } + equals(color, "red"): prolog=$$system(echo "\\\\033")[31;1m + else:equals(color, "green"): prolog=$$system(echo "\\\\033")[32;1m + else:equals(color, "yellow"): prolog=$$system(echo "\\\\033")[33;1m + else:equals(color, "orange"): prolog=$$system(echo "\\\\033")[33m + else:equals(color, "white"): prolog=$$system(echo "\\\\033")[37;1m + epilog = $$system(echo "\\\\033")[0m + } + + isEmpty(msg)|contains(msg, "^-- .*") { + log($$prolog$$section(msg, "-- ", 1, -1)$$epilog$$escape_expand(\\n)) + return() + } + + # The tricky part: there are no arithmetic functions in qmake! + # Start by createing an array of strings, where the string at [i] consists of i dots + # We need it the other way around though, hence the reverse at the end (sadly you + # cannot run a $$width..1 loop, although 30..1 does work). + for(i, 1..$$width) { + spacingEntry="" + for (j, 1..$$i) { spacingEntry += "." } + spacing += $$join(spacingEntry) + } + spacing = $$reverse(spacing) + + # convert a string into an array of characters, so we can get the length via size() + msgArray = $$split(msg,) + + log(" $$msg $$member(spacing, $$size(msgArray)) $$prolog$$val$$epilog$$escape_expand(\\n)") +} diff --git a/qtanalytics.pri b/qtanalytics.pri new file mode 100644 index 0000000..faad53a --- /dev/null +++ b/qtanalytics.pri @@ -0,0 +1,35 @@ +isEmpty(PREFIX): PREFIX = $$[QT_INSTALL_PREFIX] +isEmpty(EXAMPLES_PREFIX): EXAMPLES_PREFIX = $$[QT_INSTALL_EXAMPLES]/qtanalytics + +VERSIONS = $$split(VERSION, ".") +VERSION_MAJOR = $$member(VERSIONS, 0) +unset(VERSIONS) + +DEFINES += QTANALYTICS_VERSION=$$VERSION +!isEmpty(QTANALYTICS_VERSION_EXTRA): DEFINES += QTANALYTICS_VERSION_EXTRA="\"$$QTANALYTICS_VERSION_EXTRA\"" +!isEmpty(QTANALYTICS_REVISION): DEFINES += QTANALYTICS_REVISION=$$QTANALYTICS_REVISION +!isEmpty(QTANALYTICS_SETTINGS_VARIANT): DEFINES += QTANALYTICS_SETTINGS_VARIANT=$$QTANALYTICS_SETTINGS_VARIANT + +# from qtcreator.pri +defineTest(minQtVersion) { + maj = $$1 + min = $$2 + patch = $$3 + isEqual(QT_MAJOR_VERSION, $$maj) { + isEqual(QT_MINOR_VERSION, $$min) { + isEqual(QT_PATCH_VERSION, $$patch) { + return(true) + } + greaterThan(QT_PATCH_VERSION, $$patch) { + return(true) + } + } + greaterThan(QT_MINOR_VERSION, $$min) { + return(true) + } + } + greaterThan(QT_MAJOR_VERSION, $$maj) { + return(true) + } + return(false) +} diff --git a/qtanalytics.pro b/qtanalytics.pro new file mode 100644 index 0000000..4034e93 --- /dev/null +++ b/qtanalytics.pro @@ -0,0 +1,17 @@ +TEMPLATE = subdirs + +SUBDIRS += \ + src \ + examples \ + tests \ + doc + +examples.depends += src +tests.depends = src + +OTHER_FILES += \ + README.md \ + .qmake.conf + + +include(doc/doc.pri) diff --git a/server/README.md b/server/README.md new file mode 100644 index 0000000..f2cbb1e --- /dev/null +++ b/server/README.md @@ -0,0 +1,51 @@ +# Piwik Demo + +## Install Docker + +* https://docs.docker.com/install/ +* https://docs.docker.com/compose/install/ + +## Start Server + + docker-compose up + + +## Login + + http://127.0.01:8080 + +Follow the instructions + +* Database Server: db +* Login: root +* Password: securepassword +* Database name: matomo + +Create superuser + +User: root +Password: securepassword +Email: mail@example.org + +## Create First App to Track + +Name: QtExampleApp +Website: http://example.org +Time Zone: UTC +Ecommerce: No + +## Add Tracker Code + +Browse down to MobileApps and SDKs, in the list search for Qt. + +Finish installation and login again + +## Shutdown Server + +Just press Ctrl-C or in a another shell, same directory + + docker-compose down + + + + diff --git a/server/docker-compose.yml b/server/docker-compose.yml new file mode 100644 index 0000000..d5c07ee --- /dev/null +++ b/server/docker-compose.yml @@ -0,0 +1,21 @@ +version: '3' +services: + db: + image: mariadb + environment: + - MYSQL_ROOT_PASSWORD=securepassword + volumes: + - 'db_data:/var/lib/mysql' + app: + image: matomo + ports: + - '8080:80' + volumes: + - 'app_data:/var/www/html/config:rw' + depends_on: + - db +volumes: + db_data: + driver: local + app_data: + driver: local diff --git a/src/plugin/abstractquerybuilder.cpp.autosave b/src/plugin/abstractquerybuilder.cpp.autosave new file mode 100644 index 0000000..5cf8e21 --- /dev/null +++ b/src/plugin/abstractquerybuilder.cpp.autosave @@ -0,0 +1,15 @@ +#include "abstractquerybuilder.h" + +HitBuilder::HitBuilder() +{ + +} + +HitBuilder::~HitBuilder() +{ +} + +void HitBuilder::addQueryItem(const QString &key, const QString &value) +{ + m_query.addQueryItem(key, value); +} diff --git a/src/plugin/analytics.cpp b/src/plugin/analytics.cpp new file mode 100644 index 0000000..229258c --- /dev/null +++ b/src/plugin/analytics.cpp @@ -0,0 +1,250 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "analytics.h" +#include "hitbuilder.h" +#include "matomobuilder.h" +#include "googlebuilder.h" +#include "configutil.h" +#include "context.h" + +/*! + * \qmlmodule Analytics + */ + +/*! + * \qmltype Analytics + * \inqmlmodule Analytics + * \brief Provides tracking operations for visits and events. + + * To use this API you need to have an analytics.json configuration file located + * either as resource file or in your home folder. The configuration file needs to provide the + * server url, tracker id, client id as a minimum. + + * The API will send request to the Matomo server to track certain user interface statistics. You need to + * place tracking code inside your user interface to track this behavior. + */ + +/*! + * \class AnalyticsAttached + * \inmodule QtAnalytics + * \brief The attached object to the Analytics. + */ + +/*! + * \class Analytics + * \inmodule QtAnalytics + * \brief Proxy class to access the selected tracker platform. + */ + +/*! + * \brief Construct a new attached object. + * \param parent Parent object + */ +AnalyticsAttached::AnalyticsAttached(QObject *parent) + : QObject(parent) +{ +} + +AnalyticsAttached::~AnalyticsAttached() +{ +} + +/*! + * \qmlmethod void Analytics::sendPing() + * Sends a heartbeat request to the tracking server + * + * A ping will only update the visit's total time. + * It is used to provide accurate "visit duration" metrics. + */ +void AnalyticsAttached::sendPing() +{ + Analytics::instance(this)->sendPing(); +} + +/*! + * \qmlmethod void Analytics::sendVisit(path, action, dimensions) + * + * Sends a visit request to the tracking server + * + * The visit location will be identified by the \a path. The optional \a action identifies what is happening. The optional \a dimensions allows you + * to send further information as defined by the servers custom dimensions. Additional to this information also the + * custom variables defined will be send to the server. + * + */ +void AnalyticsAttached::sendVisit(const QString &path, const QString &action) +{ + Analytics::instance(this)->sendVisit(path, action); +} + +/*! + * \qmlmethod void Analytics::sendEvent(path, category, action, name, int value, dimensions) + * + * Sends an event request to the tracking server. The path provides the location inside the user interface. + * The action what is happening. The event category where somethign is heppening (e.g. videos, music. games). The + * name the event name to track. A value can be an additional information to track. Additional you can provide + * a set of key/value pairs as defined on the Matamo server. + */ +void AnalyticsAttached::sendEvent(const QString &category, const QString &action, + const QString &name, const QString &value) +{ + Analytics::instance(this)->sendEvent(category, action, name, value); +} + +void AnalyticsAttached::setVariables(QVariantMap customVariables) +{ + if (m_variables == customVariables) { + return; + } + m_variables = customVariables; + emit variablesChanged(); +} + + +// Analytics + +Analytics* Analytics::s_instance = nullptr; + +Analytics::Analytics(QObject *parent) + : QObject(parent) + , m_context(new Context(this)) + , m_builder(nullptr) +{ + const QJsonObject& data = ConfigUtil::loadJSON("analytics"); + const QVariantMap& o = ConfigUtil::toVariantMap(data); + m_context->setConfig(o); +} + +Analytics::~Analytics() +{ +} + +Analytics *Analytics::instance(QObject *attached) +{ + qDebug() << Q_FUNC_INFO; + if (!Analytics::s_instance) { + Analytics::s_instance = new Analytics(QCoreApplication::instance()); + } + if (attached && !Analytics::s_instance->context()->hasNetwork()) { + Analytics::s_instance->context()->discoverNetwork(attached->parent()); + } + return Analytics::s_instance; +} + +AnalyticsAttached *Analytics::qmlAttachedProperties(QObject* object) +{ + return new AnalyticsAttached(object); +} + +void Analytics::sendPing() +{ + qDebug() << Q_FUNC_INFO; +} + + +void Analytics::sendVisit(const QString &path, const QString &action) +{ + qDebug() << Q_FUNC_INFO << path << action; + HitBuilder* builder = getBuilder(); + if (builder) { + builder->initQuery(); + builder->trackPage(path, action); + builder->sendQuery(); + builder->reset(); + } +} + + +void Analytics::sendEvent( const QString &category, + const QString &action, const QString &name, + const QString &value) { + + qDebug() << Q_FUNC_INFO << category << action; + HitBuilder* builder = getBuilder(); + if (builder) { + builder->initQuery(); + builder->trackEvent(category, action, name, value); + builder->sendQuery(); + builder->reset(); + } +} + + +HitBuilder* Analytics::getBuilder() +{ + if (!m_builder) { + QString tracker = context()->configString("tracker"); + qDebug() << "found tracker " << tracker; + if (tracker == "matomo") { + m_builder = new MatomoBuilder(context(), this); + } else if (tracker == "google") { + m_builder = new GoogleBuilder(context(), this); + } else { + qWarning() << "not supported builder" << tracker; + } + } + return m_builder; +} + +void Analytics::onReplyFinished(QNetworkReply *reply) +{ + emit replyFinished(reply); + qDebug() << "network reply finished: " << reply->url(); + reply->deleteLater(); +} + +Context *Analytics::context() const +{ + return m_context; +} + +//QString Analytics::userAgent() const +//{ +// const QString& name = settings()->value("applicationName").toString(); +// const QString& version = settings()->value("applicationVersion").toString(); +// const QString& lang = userLanguage(); +// const QString& os = settings()->value("os").toString(); +// return QString("%1/%2 (%3;%4) Analytics/1.0 (Qt/%5)").arg(name).arg(version).arg(os).arg(lang).arg(QT_VERSION_STR); +//} + +//QString Analytics::userLanguage() const +//{ +// return QLocale::system().name().toLower().replace("_", "-"); +//} + diff --git a/src/plugin/analytics.h b/src/plugin/analytics.h new file mode 100644 index 0000000..56d17c8 --- /dev/null +++ b/src/plugin/analytics.h @@ -0,0 +1,116 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#pragma once + +#include +#include +#include + +class Context; +class HitBuilder; +class Analytics; + +class AnalyticsAttached : public QObject +{ + Q_OBJECT + + /** + * In QML it shall look like + * Analytics.customVariables: { + * "myVariable1": "myValue1", + * "myVariable2": "myValue2" + * } + */ + Q_PROPERTY(QVariantMap variables READ variables WRITE setVariables NOTIFY variablesChanged) +public: + AnalyticsAttached(QObject *parent = nullptr); + virtual ~AnalyticsAttached(); + + Q_INVOKABLE void sendPing(); + Q_INVOKABLE void sendVisit(const QString &path, const QString &name); + Q_INVOKABLE void sendEvent(const QString &category, const QString &action, const QString &name, const QString &value); + + QVariantMap variables() const { return m_variables; } + +public slots: + void setVariables(QVariantMap variables); + +signals: + void variablesChanged(); + +private: + QVariantMap m_variables; +}; + + +class Analytics : public QObject +{ + Q_OBJECT + Q_DISABLE_COPY(Analytics) +public: + explicit Analytics(QObject *parent = nullptr); + virtual ~Analytics(); + + static Analytics *instance(QObject *attached); + static AnalyticsAttached* qmlAttachedProperties(QObject* ); + HitBuilder *getBuilder(); + void sendPing(); + void sendVisit(const QString &path, const QString &name); + void sendEvent(const QString &category, const QString &action, + const QString &name, const QString &value); + Context *context() const; + +private: + // QString userAgent() const; + // QString userLanguage() const; + void dispatch(HitBuilder *builder); + void processQueue(); + void onReplyFinished(QNetworkReply* reply); +signals: + void sendHitRequest(const QUrl& url); + void replyFinished(QNetworkReply* reply); +private: + static Analytics *s_instance; + Context *m_context; + HitBuilder *m_builder; +}; + + + +QML_DECLARE_TYPEINFO(Analytics, QML_HAS_ATTACHED_PROPERTIES) diff --git a/src/plugin/configutil.cpp b/src/plugin/configutil.cpp new file mode 100644 index 0000000..a547c30 --- /dev/null +++ b/src/plugin/configutil.cpp @@ -0,0 +1,133 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "configutil.h" + +/*! + * \class ConfigUtil + * \inmodule QtAnalytics + * \brief A configuration utility. + */ + +ConfigUtil::ConfigUtil() +{ + +} + + +QString ConfigUtil::resolvePath(const QString &name) +{ + QString upper = name.toUpper(); + QString lower = name.toLower(); + QString path = qEnvironmentVariable(name.toUpper().toLatin1() + "_CONFIG", QString(":/%1.json").arg(name.toLower().data())); + if (!QFile(path).exists()) { + qWarning() << "No analytics configuration"; + return QString(); + } + return path; +} + +QByteArray ConfigUtil::readJSON(const QString &path) +{ + if (path.isEmpty()) { + qWarning() << "invalid config path"; + return QByteArray(); + } + QFile device(path); + if (!device.open(QIODevice::ReadOnly)) { + qWarning() << "Can not open analytics config"; + return QByteArray(); + } + return device.readAll(); +} + +QJsonObject ConfigUtil::parseJSON(const QByteArray &data) +{ + if (data.isNull()) { + qWarning() << "invalid config data"; + return QJsonObject(); + } + QJsonParseError error; + QJsonDocument doc = QJsonDocument::fromJson(data, &error); + if (error.error != QJsonParseError::NoError) { + qWarning() << "Error parsing analytics settings"; + qWarning() << error.errorString(); + return QJsonObject(); + } + if (!doc.isObject()) { + qWarning() << "settings must be a valid JSON object"; + return QJsonObject(); + } + return doc.object(); +} + +QJsonObject ConfigUtil::loadJSON(const QString &name) +{ + QString path = resolvePath(name); + if (path.isEmpty()) { + return QJsonObject(); + } + QByteArray data = readJSON(path); + return parseJSON(data); +} + +QJsonObject ConfigUtil::mergeJSON(const QJsonObject &a, const QJsonObject &b) +{ + QJsonObject result(a); + for (auto key : b.keys()) { + result.insert(key, b.value(key)); + } + return result; +} + +QVariantMap ConfigUtil::toVariantMap(const QJsonObject &o) +{ + return o.toVariantMap(); +} + +QVariantMap ConfigUtil::mergeMap(const QVariantMap &a, const QVariantMap &b) +{ + QVariantMap result(a); + QMapIterator i(b); + while (i.hasNext()) { + i.next(); + result.insert(i.key(), i.value()); + } + return result; +} + diff --git a/src/plugin/configutil.h b/src/plugin/configutil.h new file mode 100644 index 0000000..9294f89 --- /dev/null +++ b/src/plugin/configutil.h @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#pragma once + +#include + +class ConfigUtil +{ +private: + ConfigUtil(); +public: + static QString resolvePath(const QString &name); + static QByteArray readJSON(const QString &path); + static QJsonObject parseJSON(const QByteArray &data); + static QJsonObject loadJSON(const QString &name); + static QJsonObject mergeJSON(const QJsonObject &a, const QJsonObject &b); + static QVariantMap toVariantMap(const QJsonObject &o); + static QVariantMap mergeMap(const QVariantMap &a, const QVariantMap &b); +}; diff --git a/src/plugin/context.cpp b/src/plugin/context.cpp new file mode 100644 index 0000000..c38f558 --- /dev/null +++ b/src/plugin/context.cpp @@ -0,0 +1,151 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "context.h" +#include "configutil.h" + + +/*! + * \class IContext + * \inmodule QtAnalytics + * \brief An interface to allow independent testing for builders. + */ + +/*! + * \class Context + * \inmodule QtAnalytics + * \brief A set of operations exposed to builders. + */ + +IContext::~IContext() +{ + +} + + +Context::Context(QObject *parent) + : QObject (parent) + , m_network(nullptr) +{ +} + +Context::~Context() +{ +} + +QVariantMap Context::config() const +{ + return m_config; +} + +// network provides access to the network manager +// to send requests. +QNetworkAccessManager *Context::network() const +{ + qDebug() << Q_FUNC_INFO; + return m_network; +} + +bool Context::hasNetwork() const +{ + return m_network != nullptr; +} + +QVariant Context::configValue(const QString &key, const QVariant &defaultValue) const +{ + return m_config.value(key, defaultValue); +} + +QString Context::configString(const QString &key, const QString &defaultValue) const +{ + return configValue(key, defaultValue).toString(); +} + +QNetworkReply *Context::httpGet(const QNetworkRequest &request) const +{ + qDebug() << Q_FUNC_INFO << request.url(); + return network()->get(request); +} + +QNetworkReply *Context::httpPost(const QNetworkRequest &request, const QByteArray &data) const +{ + qDebug() << Q_FUNC_INFO << request.url() << data; + return network()->post(request, data); +} + +void Context::discoverNetwork(QObject *object) +{ + qDebug() << Q_FUNC_INFO; + if (m_network) { + return; + } + if (object) { + // try network via qmlengine + QQmlEngine *engine = qmlEngine(object); + if (engine) { + m_network = engine->networkAccessManager(); + connect(m_network, &QNetworkAccessManager::finished, this, &Context::onReplyFinished); + } + } + // create a custome network manager + if (!m_network) { + m_network = new QNetworkAccessManager(this); + connect(m_network, &QNetworkAccessManager::finished, this, &Context::onReplyFinished); + } +} + +void Context::onReplyFinished(QNetworkReply *reply) +{ + qDebug() << "reply finished: " << reply->url().toString(); +} + +void Context::setConfig(const QVariantMap &config) +{ + m_config = config; +} + +void Context::updateConfig(const QVariantMap &o) +{ + setConfig(ConfigUtil::mergeMap(m_config, o)); +} + +void Context::setNetwork(QNetworkAccessManager *network) +{ + m_network = network; +} + diff --git a/src/plugin/context.h b/src/plugin/context.h new file mode 100644 index 0000000..6326a03 --- /dev/null +++ b/src/plugin/context.h @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#pragma once + +#include +#include +#include + +class IContext { +public: + virtual ~IContext(); + virtual QVariant configValue(const QString &key, const QVariant &defaultValue) const = 0; + virtual QNetworkReply* httpGet(const QNetworkRequest& request) const = 0; + virtual QNetworkReply* httpPost(const QNetworkRequest& request, const QByteArray &data) const = 0; +}; + +class Context : public QObject, public IContext +{ + Q_OBJECT +public: + Context(QObject *parent=nullptr); + ~Context(); + void setConfig(const QVariantMap &config); + void updateConfig(const QVariantMap &o); + QVariantMap config() const; + void setNetwork(QNetworkAccessManager *network); + QNetworkAccessManager *network() const; + bool hasNetwork() const; + QVariant configValue(const QString &key, const QVariant &defaultValue=QVariant()) const; + QString configString(const QString &key, const QString &defaultValue=QString()) const; + QNetworkReply* httpGet(const QNetworkRequest& request) const; + QNetworkReply* httpPost(const QNetworkRequest& request, const QByteArray &data) const; + void discoverNetwork(QObject *object); + void onReplyFinished(QNetworkReply *reply); +private: + QVariantMap m_config; + QNetworkAccessManager *m_network; +}; diff --git a/src/plugin/googlebuilder.cpp b/src/plugin/googlebuilder.cpp new file mode 100644 index 0000000..394ea3a --- /dev/null +++ b/src/plugin/googlebuilder.cpp @@ -0,0 +1,104 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "googlebuilder.h" + +#include "context.h" + + +/*! + * \class GoogleBuilder + * \inmodule QtAnalytics + * \brief Plugin for the google tracking platform. + */ + +// See https://developers.google.com/analytics/devguides/collection/protocol/v1/ + +const QString GoogleBuilder::TRACKER_ID("tid"); +const QString GoogleBuilder::VERSION("v"); +const QString GoogleBuilder::DATA_SOURCE("ds"); +const QString GoogleBuilder::DOCUMENT_PATH("dp"); +const QString GoogleBuilder::DOCUMENT_TITLE("dt"); +const QString GoogleBuilder::EVENT_CATEGORY("ec"); +const QString GoogleBuilder::EVENT_ACTION("ea"); +const QString GoogleBuilder::EVENT_LABEL("el"); +const QString GoogleBuilder::EVENT_VALUE("ev"); +const QString GoogleBuilder::HIT_TYPE("t"); +const QString GoogleBuilder::CLIENT_ID("cid"); + +GoogleBuilder::GoogleBuilder(Context *context, QObject *parent) + : HitBuilder(context, parent) +{ +} + +GoogleBuilder::~GoogleBuilder() +{ +} + +void GoogleBuilder::initQuery() +{ + const QString& server = configString("server", "https://www.google-analytics.com/collect"); + m_url = QUrl(server); + addQueryItem(VERSION, "1"); + configQueryItem(TRACKER_ID); + configQueryItem(CLIENT_ID); +} + +void GoogleBuilder::trackPage(const QString &path, const QString &title) +{ + addQueryItem(HIT_TYPE, "pageview"); + addQueryItem(DOCUMENT_PATH, path); + addQueryItem(DOCUMENT_TITLE, title); +} + +void GoogleBuilder::trackEvent(const QString &category, const QString &action, const QString &label, const QString &value) +{ + addQueryItem(EVENT_CATEGORY, category); + addQueryItem(EVENT_ACTION, action); + if (!label.isNull()) { + addQueryItem(EVENT_LABEL, label); + } + if (!value.isNull()) { + addQueryItem(EVENT_VALUE, value); + } +} + +QNetworkReply *GoogleBuilder::sendQuery() +{ + return HitBuilder::sendQuery(); +} diff --git a/src/plugin/googlebuilder.h b/src/plugin/googlebuilder.h new file mode 100644 index 0000000..c974431 --- /dev/null +++ b/src/plugin/googlebuilder.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#pragma once + +#include + +#include "hitbuilder.h" + +class Context; + +class GoogleBuilder : public HitBuilder +{ + Q_OBJECT +public: + static const QString TRACKER_ID; + static const QString VERSION; + static const QString DATA_SOURCE; + static const QString DOCUMENT_PATH; + static const QString DOCUMENT_TITLE; + static const QString EVENT_CATEGORY; + static const QString EVENT_ACTION; + static const QString EVENT_LABEL; + static const QString EVENT_VALUE; + static const QString HIT_TYPE; + static const QString CLIENT_ID; + + explicit GoogleBuilder(Context *context, QObject *parent=nullptr); + ~GoogleBuilder(); + + // HitBuilder interface +public: + void initQuery(); + void trackPage(const QString &path, const QString &title); + void trackEvent(const QString &category, const QString &action, const QString &label, const QString &value); + QNetworkReply *sendQuery(); +}; diff --git a/src/plugin/hitbuilder.cpp b/src/plugin/hitbuilder.cpp new file mode 100644 index 0000000..3453b25 --- /dev/null +++ b/src/plugin/hitbuilder.cpp @@ -0,0 +1,141 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "hitbuilder.h" +#include "context.h" + +/*! + * \class HitBuilder + * \inmodule QtAnalytics + * \brief An abstract interface for tracking platforms. + */ + +HitBuilder::HitBuilder(Context *context, QObject *parent) + : QObject(parent) + , m_context(context) +{ +} + +HitBuilder::~HitBuilder() +{ +} + +void HitBuilder::initQuery() +{ + m_url = QUrl(configString("server")); +} + +void HitBuilder::trackPage(const QString &/*path*/, const QString &/*title*/) +{ +} + +void HitBuilder::trackEvent(const QString &/*category*/, const QString &/*action*/, const QString &/*label*/, const QString &/*value*/) +{ +} + +QNetworkReply *HitBuilder::sendQuery() +{ + QUrl url(m_url); + qDebug() << "url to request: " << url; + url.setQuery(query()); + qDebug() << "url to request: " << url; + QNetworkRequest request(url); + // by default use http get requests + return httpGet(request); +} + +void HitBuilder::reset() +{ + m_query.clear(); + m_url.clear(); +} + + +void HitBuilder::addQueryItem(const QString &key, const QString &value) +{ + if (value.isEmpty()) { + return; + } + m_query.addQueryItem(key, value); +} + +void HitBuilder::configQueryItem(const QString &key, const QString &defaultValue) +{ + QString value = configString(key, defaultValue); + if (value.isEmpty()) { + return; + } + m_query.addQueryItem(key, value); +} + +QVariant HitBuilder::configValue(const QString &key, const QVariant &defaultValue) const +{ + return context()->configValue(key, defaultValue); +} + +QString HitBuilder::configString(const QString &key, const QString &defaultValue) const +{ + return context()->configString(key, defaultValue); +} + +QNetworkReply *HitBuilder::httpGet(const QNetworkRequest &request) +{ + return context()->httpGet(request); +} + +QNetworkReply *HitBuilder::httpPost(const QNetworkRequest &request, const QByteArray &data) +{ + return context()->httpPost(request, data); +} + +Context *HitBuilder::context() const +{ + return m_context; +} + +QUrlQuery HitBuilder::query() const +{ + return m_query; +} + +QUrl HitBuilder::url() const +{ + return m_url; +} + diff --git a/src/plugin/hitbuilder.h b/src/plugin/hitbuilder.h new file mode 100644 index 0000000..1c64571 --- /dev/null +++ b/src/plugin/hitbuilder.h @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#pragma once + +#include +#include + +class Context; + +class HitBuilder : public QObject +{ + Q_OBJECT +public: + explicit HitBuilder(Context *context, QObject *parent=nullptr); + virtual ~HitBuilder(); + virtual void initQuery(); + virtual void trackPage(const QString &path, const QString &title); + virtual void trackEvent(const QString &category, const QString &action, const QString &label, const QString &value); + virtual QNetworkReply *sendQuery(); + virtual void reset(); + void addQueryItem(const QString &key, const QString& value); + void configQueryItem(const QString &key, const QString &defaultValue=QString()); + QVariant configValue(const QString& key, const QVariant &defaultValue=QVariant()) const; + QString configString(const QString &key, const QString &defaultValue=QString()) const; + QNetworkReply *httpGet(const QNetworkRequest& request); + QNetworkReply *httpPost(const QNetworkRequest& request, const QByteArray &data); + Context *context() const; + QUrlQuery query() const; + QUrl url() const; + +protected: + Context *m_context; + QUrlQuery m_query; + QUrl m_url; + }; diff --git a/src/plugin/matomobuilder.cpp b/src/plugin/matomobuilder.cpp new file mode 100644 index 0000000..c1e0206 --- /dev/null +++ b/src/plugin/matomobuilder.cpp @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "matomobuilder.h" + +#include "context.h" + +/*! + * \class MatomoBuilder + * \inmodule QtAnalytics + * \brief Plugin for the matomo tracking platform. + */ + +// See https://developer.matomo.org/api-reference/tracking-api +const QString MatomoBuilder::SITE_ID("idsite"); +const QString MatomoBuilder::ACTION_NAME("action_name"); +const QString MatomoBuilder::ACTION_URL("url"); +const QString MatomoBuilder::API_VERSION("apiv"); +const QString MatomoBuilder::EVENT_CATEGORY("e_c"); +const QString MatomoBuilder::EVENT_ACTION("e_a"); +const QString MatomoBuilder::EVENT_NAME("e_n"); +const QString MatomoBuilder::EVENT_VALUE("e_v"); +const QString MatomoBuilder::RECORDING("rec"); + + +MatomoBuilder::MatomoBuilder(Context *context, QObject *parent) + : HitBuilder(context, parent) +{ +} + +MatomoBuilder::~MatomoBuilder() +{ +} + +void MatomoBuilder::initQuery() +{ + HitBuilder::initQuery(); + addQueryItem(API_VERSION, "1"); + configQueryItem(SITE_ID); + addQueryItem(RECORDING, "1"); +} + +void MatomoBuilder::trackPage(const QString &path, const QString &title) +{ + QString domain = configString("domain"); + QString url = QString("%1/%2").arg(domain).arg(path); + addQueryItem(ACTION_URL, url); + addQueryItem(ACTION_NAME, title); +} + +void MatomoBuilder::trackEvent(const QString &category, const QString &action, const QString &label, const QString &value) +{ + addQueryItem(EVENT_CATEGORY, category); + addQueryItem(EVENT_ACTION, action); + if (!label.isNull()) { + addQueryItem(EVENT_NAME, label); + } + if (!value.isNull()) { + addQueryItem(EVENT_VALUE, value); + } +} diff --git a/src/plugin/matomobuilder.h b/src/plugin/matomobuilder.h new file mode 100644 index 0000000..14034ad --- /dev/null +++ b/src/plugin/matomobuilder.h @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#pragma once + +#include + +#include "hitbuilder.h" + +class Context; + + +class MatomoBuilder : public HitBuilder +{ + Q_OBJECT +public: + static const QString SITE_ID; + static const QString ACTION_NAME; + static const QString ACTION_URL; + static const QString API_VERSION; + static const QString EVENT_CATEGORY; + static const QString EVENT_ACTION; + static const QString EVENT_NAME; + static const QString EVENT_VALUE; + static const QString RECORDING; +public: + MatomoBuilder(Context *context, QObject *parent=nullptr); + ~MatomoBuilder() override; + void initQuery() override; + void trackPage(const QString &path, const QString &title) override; + void trackEvent(const QString &category, const QString &action, const QString &label, const QString &value) override; +}; + diff --git a/src/plugin/plugin.cpp b/src/plugin/plugin.cpp new file mode 100644 index 0000000..af08a4c --- /dev/null +++ b/src/plugin/plugin.cpp @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "plugin.h" +#include "analytics.h" + +#include + +/*! + * \class Plugin + * \inmodule QtAnalytics + * \brief The Plugin class + */ + +/*! + * \brief register QtQuick types. + * \param uri the uri for the type registry + */ + +void Plugin::registerTypes(const char *uri) +{ + Q_UNUSED(uri) + // @uri analytics + qmlRegisterType(); + qmlRegisterUncreatableType(uri, 1, 0, "Analytics", "No creatable"); +} + diff --git a/src/plugin/plugin.h b/src/plugin/plugin.h new file mode 100644 index 0000000..078556c --- /dev/null +++ b/src/plugin/plugin.h @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#pragma once + +#include + +class Plugin : public QQmlExtensionPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid) + +public: + void registerTypes(const char *uri); +}; diff --git a/src/plugin/plugin.pri b/src/plugin/plugin.pri new file mode 100644 index 0000000..4938727 --- /dev/null +++ b/src/plugin/plugin.pri @@ -0,0 +1,20 @@ +QT += qml quick +CONFIG += c++11 + +SOURCES += \ + $$PWD/analytics.cpp \ + $$PWD/configutil.cpp \ + $$PWD/context.cpp \ + $$PWD/googlebuilder.cpp \ + $$PWD/hitbuilder.cpp \ + $$PWD/matomobuilder.cpp + +HEADERS += \ + $$PWD/analytics.h \ + $$PWD/configutil.h \ + $$PWD/context.h \ + $$PWD/googlebuilder.h \ + $$PWD/hitbuilder.h \ + $$PWD/matomobuilder.h + +INCLUDEPATH = $$PWD diff --git a/src/plugin/plugin.pro b/src/plugin/plugin.pro new file mode 100644 index 0000000..ecdc836 --- /dev/null +++ b/src/plugin/plugin.pro @@ -0,0 +1,42 @@ +TEMPLATE = lib +TARGET = analytics +CONFIG += plugin + +TARGET = $$qtLibraryTarget($$TARGET) +uri = analytics + +include ( ../../qtanalytics.pri ) +include ( ../../doc/doc.pri ) +include ( plugin.pri ) +# Input +SOURCES += \ + plugin.cpp + +HEADERS += \ + plugin.h + +DISTFILES = qmldir + +!equals(_PRO_FILE_PWD_, $$OUT_PWD) { + copy_qmldir.target = $$OUT_PWD/qmldir + copy_qmldir.depends = $$_PRO_FILE_PWD_/qmldir + copy_qmldir.commands = $(COPY_FILE) \"$$replace(copy_qmldir.depends, /, $$QMAKE_DIR_SEP)\" \"$$replace(copy_qmldir.target, /, $$QMAKE_DIR_SEP)\" + QMAKE_EXTRA_TARGETS += copy_qmldir + PRE_TARGETDEPS += $$copy_qmldir.target +} + +qmldir.files = qmldir + +installPath = $$[QT_INSTALL_QML]/$$replace(uri, \\., /) +defined(ANALYTICS_DIR, var) { + installPath = $${ANALYTICS_DIR}/analytics + message( "The plugin will be installed in "$${ANALYTICS_DIR}/analytics ) +} + +qmldir.path = $$installPath +target.path = $$installPath +INSTALLS += target qmldir + +OBJECTS_DIR = .obj +MOC_DIR = .moc + diff --git a/src/plugin/qmldir b/src/plugin/qmldir new file mode 100644 index 0000000..28af2b9 --- /dev/null +++ b/src/plugin/qmldir @@ -0,0 +1,2 @@ +module analytics +plugin analytics diff --git a/src/src.pro b/src/src.pro new file mode 100644 index 0000000..c42c58a --- /dev/null +++ b/src/src.pro @@ -0,0 +1,9 @@ +TEMPLATE = subdirs + +include ( ../qtanalytics.pri ) +include ( ../doc/doc.pri ) + +SUBDIRS += \ + plugin + + diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro new file mode 100644 index 0000000..9797882 --- /dev/null +++ b/tests/auto/auto.pro @@ -0,0 +1,7 @@ +TEMPLATE = subdirs + +SUBDIRS += \ + tst_google \ + tst_config \ + tst_analytics \ + tst_matomo diff --git a/tests/auto/tst_analytics/tst_analytics.cpp b/tests/auto/tst_analytics/tst_analytics.cpp new file mode 100644 index 0000000..6b1f7f9 --- /dev/null +++ b/tests/auto/tst_analytics/tst_analytics.cpp @@ -0,0 +1,118 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +#include "analytics.h" +#include "hitbuilder.h" +#include "googlebuilder.h" +#include "matomobuilder.h" +#include "context.h" + +class AnalyticsTestCase: public QObject { + Q_OBJECT +private slots: + void testEmptyTracker(); + void testGoogleTracker(); + void testMatomoTracker(); + void testWrongTracker(); + void testServerConfig(); +}; + +void AnalyticsTestCase::testEmptyTracker() +{ + QScopedPointer a(new Analytics()); + HitBuilder * builder = a->getBuilder(); + QCOMPARE(nullptr, builder); +} + +void AnalyticsTestCase::testGoogleTracker() +{ + QScopedPointer a(new Analytics()); + QVariantMap o{ + {"tracker", "google"}, + }; + a->context()->updateConfig(o); + HitBuilder * builder = a->getBuilder(); + QVERIFY(qobject_cast(builder)); +} + +void AnalyticsTestCase::testMatomoTracker() +{ + QScopedPointer a(new Analytics()); + QVariantMap o{ + {"tracker", "matomo"}, + }; + a->context()->updateConfig(o); + HitBuilder * builder = a->getBuilder(); + QVERIFY(qobject_cast(builder)); + +} + +void AnalyticsTestCase::testWrongTracker() +{ + QScopedPointer a(new Analytics()); + QVariantMap o{ + {"tracker", "unknown"}, + }; + a->context()->updateConfig(o); + HitBuilder * builder = a->getBuilder(); + QCOMPARE(nullptr, builder); + +} + +void AnalyticsTestCase::testServerConfig() +{ + QScopedPointer a(new Analytics()); + QVariantMap o{ + {"tracker", "matomo"}, + {"server", "http://localhost:8000"}, + }; + a->context()->updateConfig(o); + HitBuilder *builder = a->getBuilder(); + QVERIFY(qobject_cast(builder)); + qDebug() << "003"; + QCOMPARE(builder->context()->configString("server"), "http://localhost:8000"); +} + + +QTEST_MAIN(AnalyticsTestCase) + +#include "tst_analytics.moc" diff --git a/tests/auto/tst_analytics/tst_analytics.pro b/tests/auto/tst_analytics/tst_analytics.pro new file mode 100644 index 0000000..fd3a7eb --- /dev/null +++ b/tests/auto/tst_analytics/tst_analytics.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = tst_analytics + +QT += testlib +CONFIG += testcase + +include( ../../../src/plugin/plugin.pri ) + +SOURCES += \ + tst_analytics.cpp diff --git a/tests/auto/tst_config/analytics.json b/tests/auto/tst_config/analytics.json new file mode 100644 index 0000000..90a9804 --- /dev/null +++ b/tests/auto/tst_config/analytics.json @@ -0,0 +1,3 @@ +{ + "service": "matomo" +} diff --git a/tests/auto/tst_config/tst_config.cpp b/tests/auto/tst_config/tst_config.cpp new file mode 100644 index 0000000..09c5c93 --- /dev/null +++ b/tests/auto/tst_config/tst_config.cpp @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +#include "configutil.h" + +class ConfigTestCase: public QObject { + Q_OBJECT +private Q_SLOTS: + void testResolveConfig(); + void testReadConfig(); + void testParseConfig(); + void testLoadConfig(); +}; + +void ConfigTestCase::testResolveConfig() +{ + + QString path = ConfigUtil::resolvePath("analytics"); + QCOMPARE(path, ":/analytics.json"); +} + +void ConfigTestCase::testReadConfig() +{ + QByteArray data = ConfigUtil::readJSON(":/analytics.json"); + QJsonDocument doc = QJsonDocument::fromJson(data); + QVERIFY(doc.isObject()); + QCOMPARE(doc.object().value("service"), "matomo"); +} + +void ConfigTestCase::testParseConfig() +{ + QString path = ConfigUtil::resolvePath("analytics"); + QByteArray data = ConfigUtil::readJSON(path); + QJsonObject o = ConfigUtil::parseJSON(data); + QCOMPARE(o.value("service"), "matomo"); +} + +void ConfigTestCase::testLoadConfig() +{ + QJsonObject o = ConfigUtil::loadJSON("analytics"); + QCOMPARE(o.value("service"), "matomo"); +} + +QTEST_MAIN(ConfigTestCase) + +#include "tst_config.moc" diff --git a/tests/auto/tst_config/tst_config.pro b/tests/auto/tst_config/tst_config.pro new file mode 100644 index 0000000..464a79b --- /dev/null +++ b/tests/auto/tst_config/tst_config.pro @@ -0,0 +1,13 @@ +TEMPLATE = app +TARGET = tst_config + +QT += testlib +CONFIG += testcase + +include( ../../../src/plugin/plugin.pri ) + +SOURCES += \ + tst_config.cpp + +RESOURCES += \ + tst_config.qrc diff --git a/tests/auto/tst_config/tst_config.qrc b/tests/auto/tst_config/tst_config.qrc new file mode 100644 index 0000000..9a59655 --- /dev/null +++ b/tests/auto/tst_config/tst_config.qrc @@ -0,0 +1,5 @@ + + + analytics.json + + diff --git a/tests/auto/tst_google/tst_google.cpp b/tests/auto/tst_google/tst_google.cpp new file mode 100644 index 0000000..63414e2 --- /dev/null +++ b/tests/auto/tst_google/tst_google.cpp @@ -0,0 +1,111 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +#include "googlebuilder.h" +#include "context.h" + +class GoogleTestCase: public QObject { + Q_OBJECT +private slots: + void testEmpty(); + void testTrackPage(); + void testTrackEvent(); +}; + + +void GoogleTestCase::testEmpty() +{ + QVariantMap o{ + {"tid", "12345"}, + }; + QScopedPointer ctx(new Context(this)); + ctx->setConfig(o); + QScopedPointer b(new GoogleBuilder(ctx.data())); + b->initQuery(); + QUrlQuery query = b->query(); + QCOMPARE("1", query.queryItemValue(GoogleBuilder::VERSION)); + QCOMPARE("12345", query.queryItemValue(GoogleBuilder::TRACKER_ID)); + ctx->deleteLater(); +} + +void GoogleTestCase::testTrackPage() +{ + QScopedPointer ctx(new Context(this)); + QScopedPointer b(new GoogleBuilder(ctx.data())); + QVariantMap o{ + {"tid", "12345"}, + {"cid", "44144"}, + }; + ctx->updateConfig(o); + b->initQuery(); + b->trackPage("/home", "click"); + QUrlQuery query = b->query(); + QCOMPARE("12345", query.queryItemValue("tid")); + QCOMPARE("44144", query.queryItemValue("cid")); + QCOMPARE("1", query.queryItemValue("v")); + QCOMPARE("pageview", query.queryItemValue("t")); + QCOMPARE("/home", query.queryItemValue("dp")); + QCOMPARE(b->url().toString(), "https://www.google-analytics.com/collect"); +} + +void GoogleTestCase::testTrackEvent() +{ + QScopedPointer ctx(new Context(this)); + QVariantMap o{ + {"tid", "12345"}, + {"cid", "44144"}, + }; + ctx->updateConfig(o); + QScopedPointer b(new GoogleBuilder(ctx.data())); + b->trackEvent("cat", "click", QString(), QString()); + b->initQuery(); + QUrlQuery query = b->query(); + QCOMPARE("12345", query.queryItemValue("tid")); + QCOMPARE("44144", query.queryItemValue("cid")); + QCOMPARE("cat", query.queryItemValue("ec")); + QCOMPARE("click", query.queryItemValue("ea")); + QCOMPARE(b->url().toString(), "https://www.google-analytics.com/collect"); +} + +QTEST_MAIN(GoogleTestCase) + +#include "tst_google.moc" diff --git a/tests/auto/tst_google/tst_google.pro b/tests/auto/tst_google/tst_google.pro new file mode 100644 index 0000000..96608b0 --- /dev/null +++ b/tests/auto/tst_google/tst_google.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = tst_google + +QT += testlib +CONFIG += testcase + +include( ../../../src/plugin/plugin.pri ) + +SOURCES += \ + tst_google.cpp diff --git a/tests/auto/tst_matomo/tst_matomo.cpp b/tests/auto/tst_matomo/tst_matomo.cpp new file mode 100644 index 0000000..caf5613 --- /dev/null +++ b/tests/auto/tst_matomo/tst_matomo.cpp @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +#include "matomobuilder.h" +#include "context.h" + +class MatomoTestCase: public QObject { + Q_OBJECT +private slots: + void init(); + void testRequired(); + void testTrackPage(); + void testTrackEvent(); + +}; + +void MatomoTestCase::init() +{ + qDebug() << "init"; +} + +void MatomoTestCase::testRequired() +{ + QVariantMap o{ + {"idsite", "123"}, + {"rec", "1"}, + }; + QScopedPointer ctx(new Context(this)); + ctx->setConfig(o); + QScopedPointer b(new MatomoBuilder(ctx.data())); + b->initQuery(); + QUrlQuery query = b->query(); + QCOMPARE("123", query.queryItemValue(MatomoBuilder::SITE_ID)); + QCOMPARE("1", query.queryItemValue(MatomoBuilder::RECORDING)); +} + +void MatomoTestCase::testTrackPage() +{ + QScopedPointer ctx(new Context(this)); + QScopedPointer b(new MatomoBuilder(ctx.data())); + b->initQuery(); + b->trackPage("/home", "click"); + QUrlQuery query = b->query(); + qDebug() << query.toString(); + QCOMPARE("/home", query.queryItemValue(MatomoBuilder::ACTION_URL)); + QCOMPARE("click", query.queryItemValue(MatomoBuilder::ACTION_NAME)); +} + +void MatomoTestCase::testTrackEvent() +{ + QScopedPointer ctx(new Context(this)); + QScopedPointer b(new MatomoBuilder(ctx.data())); + b->initQuery(); + b->trackEvent("category", "action", QString(), QString()); + QUrlQuery query = b->query(); + qDebug() << query.toString(); + QCOMPARE("category", query.queryItemValue(MatomoBuilder::EVENT_CATEGORY)); + QCOMPARE("action", query.queryItemValue(MatomoBuilder::EVENT_ACTION)); +} + +QTEST_MAIN(MatomoTestCase) + +#include "tst_matomo.moc" diff --git a/tests/auto/tst_matomo/tst_matomo.pro b/tests/auto/tst_matomo/tst_matomo.pro new file mode 100644 index 0000000..de20ff0 --- /dev/null +++ b/tests/auto/tst_matomo/tst_matomo.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = tst_matomo + +QT += testlib +CONFIG += testcase + +include( ../../../src/plugin/plugin.pri ) + +SOURCES += \ + tst_matomo.cpp diff --git a/tests/auto/tst_urlbuilder/tst_urlbuilder.cpp b/tests/auto/tst_urlbuilder/tst_urlbuilder.cpp new file mode 100644 index 0000000..72f12ed --- /dev/null +++ b/tests/auto/tst_urlbuilder/tst_urlbuilder.cpp @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Luxoft Sweden AB. All rights reserved. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the analytics module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +#include "matomotracker.h" + +/* + * The tracking API is documented at: + * https://developer.matomo.org/api-reference/tracking-api + */ + +class UrlBuilderTestCase: public QObject { + Q_OBJECT +public: + explicit UrlBuilderTestCase(); +private Q_SLOTS: + void init(); + void cleanup(); + void testDefault(); + void testPing(); + void testVisit(); + void testEvent(); +private: +}; + + +UrlBuilderTestCase::UrlBuilderTestCase() + : QObject () +{ +} + +void UrlBuilderTestCase::init() +{ +} + +void UrlBuilderTestCase::cleanup() +{ +} + + +void UrlBuilderTestCase::testDefault() +{ +} +void UrlBuilderTestCase::testPing() +{ +} + +void UrlBuilderTestCase::testVisit() +{ +} + +void UrlBuilderTestCase::testEvent() +{ +} + +QTEST_MAIN(UrlBuilderTestCase) + +#include "tst_urlbuilder.moc" diff --git a/tests/auto/tst_urlbuilder/tst_urlbuilder.pro b/tests/auto/tst_urlbuilder/tst_urlbuilder.pro new file mode 100644 index 0000000..dab5008 --- /dev/null +++ b/tests/auto/tst_urlbuilder/tst_urlbuilder.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +TARGET = tst_urlbuilder + +QT += testlib +CONFIG += testcase + +include( ../../../src/plugin/plugin.pri ) + +SOURCES += \ + tst_urlbuilder.cpp diff --git a/tests/tests.pro b/tests/tests.pro new file mode 100644 index 0000000..2d7fc24 --- /dev/null +++ b/tests/tests.pro @@ -0,0 +1,6 @@ +TEMPLATE = subdirs + +include ( ../qtanalytics.pri ) +include ( ../doc/doc.pri ) + +SUBDIRS = auto diff --git a/tools/simple_http_server.sh b/tools/simple_http_server.sh new file mode 100755 index 0000000..82bd2a1 --- /dev/null +++ b/tools/simple_http_server.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +## +## Copyright (C) 2019 Luxoft Sweden AB. All rights reserved. +## Contact: https://www.qt.io/licensing/ +## +## This file is part of the analytics module of the Qt Toolkit. +## +## $QT_BEGIN_LICENSE:LGPL$ +## Commercial License Usage +## Licensees holding valid commercial Qt licenses may use this file in +## accordance with the commercial license agreement provided with the +## Software or, alternatively, in accordance with the terms contained in +## a written agreement between you and The Qt Company. For licensing terms +## and conditions see https://www.qt.io/terms-conditions. For further +## information use the contact form at https://www.qt.io/contact-us. +## +## GNU Lesser General Public License Usage +## Alternatively, this file may be used under the terms of the GNU Lesser +## General Public License version 3 as published by the Free Software +## Foundation and appearing in the file LICENSE.LGPL3 included in the +## packaging of this file. Please review the following information to +## ensure the GNU Lesser General Public License version 3 requirements +## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +## +## GNU General Public License Usage +## Alternatively, this file may be used under the terms of the GNU +## General Public License version 2.0 or (at your option) the GNU General +## Public license version 3 or any later version approved by the KDE Free +## Qt Foundation. The licenses are as published by the Free Software +## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +## included in the packaging of this file. Please review the following +## information to ensure the GNU General Public License requirements will +## be met: https://www.gnu.org/licenses/gpl-2.0.html and +## https://www.gnu.org/licenses/gpl-3.0.html. +## +## $QT_END_LICENSE$ +## + +# A simple http server which prints out all incoming http requests to the console + +PORT=8080 + +while true +do + echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l -p $PORT -q 1 + echo "---------------------------" +done -- cgit v1.2.3