--- /dev/null
+Cuong Le <metacuong@gmail.com>
+ - project owner/developer
--- /dev/null
+ GNU GENERAL PUBLIC LICENSE\r
+ Version 2, June 1991\r
+\r
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.\r
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\r
+ Everyone is permitted to copy and distribute verbatim copies\r
+ of this license document, but changing it is not allowed.\r
+\r
+ Preamble\r
+\r
+ The licenses for most software are designed to take away your\r
+freedom to share and change it. By contrast, the GNU General Public\r
+License is intended to guarantee your freedom to share and change free\r
+software--to make sure the software is free for all its users. This\r
+General Public License applies to most of the Free Software\r
+Foundation's software and to any other program whose authors commit to\r
+using it. (Some other Free Software Foundation software is covered by\r
+the GNU Lesser General Public License instead.) You can apply it to\r
+your programs, too.\r
+\r
+ When we speak of free software, we are referring to freedom, not\r
+price. Our General Public Licenses are designed to make sure that you\r
+have the freedom to distribute copies of free software (and charge for\r
+this service if you wish), that you receive source code or can get it\r
+if you want it, that you can change the software or use pieces of it\r
+in new free programs; and that you know you can do these things.\r
+\r
+ To protect your rights, we need to make restrictions that forbid\r
+anyone to deny you these rights or to ask you to surrender the rights.\r
+These restrictions translate to certain responsibilities for you if you\r
+distribute copies of the software, or if you modify it.\r
+\r
+ For example, if you distribute copies of such a program, whether\r
+gratis or for a fee, you must give the recipients all the rights that\r
+you have. You must make sure that they, too, receive or can get the\r
+source code. And you must show them these terms so they know their\r
+rights.\r
+\r
+ We protect your rights with two steps: (1) copyright the software, and\r
+(2) offer you this license which gives you legal permission to copy,\r
+distribute and/or modify the software.\r
+\r
+ Also, for each author's protection and ours, we want to make certain\r
+that everyone understands that there is no warranty for this free\r
+software. If the software is modified by someone else and passed on, we\r
+want its recipients to know that what they have is not the original, so\r
+that any problems introduced by others will not reflect on the original\r
+authors' reputations.\r
+\r
+ Finally, any free program is threatened constantly by software\r
+patents. We wish to avoid the danger that redistributors of a free\r
+program will individually obtain patent licenses, in effect making the\r
+program proprietary. To prevent this, we have made it clear that any\r
+patent must be licensed for everyone's free use or not licensed at all.\r
+\r
+ The precise terms and conditions for copying, distribution and\r
+modification follow.\r
+\r
+ GNU GENERAL PUBLIC LICENSE\r
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\r
+\r
+ 0. This License applies to any program or other work which contains\r
+a notice placed by the copyright holder saying it may be distributed\r
+under the terms of this General Public License. The "Program", below,\r
+refers to any such program or work, and a "work based on the Program"\r
+means either the Program or any derivative work under copyright law:\r
+that is to say, a work containing the Program or a portion of it,\r
+either verbatim or with modifications and/or translated into another\r
+language. (Hereinafter, translation is included without limitation in\r
+the term "modification".) Each licensee is addressed as "you".\r
+\r
+Activities other than copying, distribution and modification are not\r
+covered by this License; they are outside its scope. The act of\r
+running the Program is not restricted, and the output from the Program\r
+is covered only if its contents constitute a work based on the\r
+Program (independent of having been made by running the Program).\r
+Whether that is true depends on what the Program does.\r
+\r
+ 1. You may copy and distribute verbatim copies of the Program's\r
+source code as you receive it, in any medium, provided that you\r
+conspicuously and appropriately publish on each copy an appropriate\r
+copyright notice and disclaimer of warranty; keep intact all the\r
+notices that refer to this License and to the absence of any warranty;\r
+and give any other recipients of the Program a copy of this License\r
+along with the Program.\r
+\r
+You may charge a fee for the physical act of transferring a copy, and\r
+you may at your option offer warranty protection in exchange for a fee.\r
+\r
+ 2. You may modify your copy or copies of the Program or any portion\r
+of it, thus forming a work based on the Program, and copy and\r
+distribute such modifications or work under the terms of Section 1\r
+above, provided that you also meet all of these conditions:\r
+\r
+ a) You must cause the modified files to carry prominent notices\r
+ stating that you changed the files and the date of any change.\r
+\r
+ b) You must cause any work that you distribute or publish, that in\r
+ whole or in part contains or is derived from the Program or any\r
+ part thereof, to be licensed as a whole at no charge to all third\r
+ parties under the terms of this License.\r
+\r
+ c) If the modified program normally reads commands interactively\r
+ when run, you must cause it, when started running for such\r
+ interactive use in the most ordinary way, to print or display an\r
+ announcement including an appropriate copyright notice and a\r
+ notice that there is no warranty (or else, saying that you provide\r
+ a warranty) and that users may redistribute the program under\r
+ these conditions, and telling the user how to view a copy of this\r
+ License. (Exception: if the Program itself is interactive but\r
+ does not normally print such an announcement, your work based on\r
+ the Program is not required to print an announcement.)\r
+\r
+These requirements apply to the modified work as a whole. If\r
+identifiable sections of that work are not derived from the Program,\r
+and can be reasonably considered independent and separate works in\r
+themselves, then this License, and its terms, do not apply to those\r
+sections when you distribute them as separate works. But when you\r
+distribute the same sections as part of a whole which is a work based\r
+on the Program, the distribution of the whole must be on the terms of\r
+this License, whose permissions for other licensees extend to the\r
+entire whole, and thus to each and every part regardless of who wrote it.\r
+\r
+Thus, it is not the intent of this section to claim rights or contest\r
+your rights to work written entirely by you; rather, the intent is to\r
+exercise the right to control the distribution of derivative or\r
+collective works based on the Program.\r
+\r
+In addition, mere aggregation of another work not based on the Program\r
+with the Program (or with a work based on the Program) on a volume of\r
+a storage or distribution medium does not bring the other work under\r
+the scope of this License.\r
+\r
+ 3. You may copy and distribute the Program (or a work based on it,\r
+under Section 2) in object code or executable form under the terms of\r
+Sections 1 and 2 above provided that you also do one of the following:\r
+\r
+ a) Accompany it with the complete corresponding machine-readable\r
+ source code, which must be distributed under the terms of Sections\r
+ 1 and 2 above on a medium customarily used for software interchange; or,\r
+\r
+ b) Accompany it with a written offer, valid for at least three\r
+ years, to give any third party, for a charge no more than your\r
+ cost of physically performing source distribution, a complete\r
+ machine-readable copy of the corresponding source code, to be\r
+ distributed under the terms of Sections 1 and 2 above on a medium\r
+ customarily used for software interchange; or,\r
+\r
+ c) Accompany it with the information you received as to the offer\r
+ to distribute corresponding source code. (This alternative is\r
+ allowed only for noncommercial distribution and only if you\r
+ received the program in object code or executable form with such\r
+ an offer, in accord with Subsection b above.)\r
+\r
+The source code for a work means the preferred form of the work for\r
+making modifications to it. For an executable work, complete source\r
+code means all the source code for all modules it contains, plus any\r
+associated interface definition files, plus the scripts used to\r
+control compilation and installation of the executable. However, as a\r
+special exception, the source code distributed need not include\r
+anything that is normally distributed (in either source or binary\r
+form) with the major components (compiler, kernel, and so on) of the\r
+operating system on which the executable runs, unless that component\r
+itself accompanies the executable.\r
+\r
+If distribution of executable or object code is made by offering\r
+access to copy from a designated place, then offering equivalent\r
+access to copy the source code from the same place counts as\r
+distribution of the source code, even though third parties are not\r
+compelled to copy the source along with the object code.\r
+\r
+ 4. You may not copy, modify, sublicense, or distribute the Program\r
+except as expressly provided under this License. Any attempt\r
+otherwise to copy, modify, sublicense or distribute the Program is\r
+void, and will automatically terminate your rights under this License.\r
+However, parties who have received copies, or rights, from you under\r
+this License will not have their licenses terminated so long as such\r
+parties remain in full compliance.\r
+\r
+ 5. You are not required to accept this License, since you have not\r
+signed it. However, nothing else grants you permission to modify or\r
+distribute the Program or its derivative works. These actions are\r
+prohibited by law if you do not accept this License. Therefore, by\r
+modifying or distributing the Program (or any work based on the\r
+Program), you indicate your acceptance of this License to do so, and\r
+all its terms and conditions for copying, distributing or modifying\r
+the Program or works based on it.\r
+\r
+ 6. Each time you redistribute the Program (or any work based on the\r
+Program), the recipient automatically receives a license from the\r
+original licensor to copy, distribute or modify the Program subject to\r
+these terms and conditions. You may not impose any further\r
+restrictions on the recipients' exercise of the rights granted herein.\r
+You are not responsible for enforcing compliance by third parties to\r
+this License.\r
+\r
+ 7. If, as a consequence of a court judgment or allegation of patent\r
+infringement or for any other reason (not limited to patent issues),\r
+conditions are imposed on you (whether by court order, agreement or\r
+otherwise) that contradict the conditions of this License, they do not\r
+excuse you from the conditions of this License. If you cannot\r
+distribute so as to satisfy simultaneously your obligations under this\r
+License and any other pertinent obligations, then as a consequence you\r
+may not distribute the Program at all. For example, if a patent\r
+license would not permit royalty-free redistribution of the Program by\r
+all those who receive copies directly or indirectly through you, then\r
+the only way you could satisfy both it and this License would be to\r
+refrain entirely from distribution of the Program.\r
+\r
+If any portion of this section is held invalid or unenforceable under\r
+any particular circumstance, the balance of the section is intended to\r
+apply and the section as a whole is intended to apply in other\r
+circumstances.\r
+\r
+It is not the purpose of this section to induce you to infringe any\r
+patents or other property right claims or to contest validity of any\r
+such claims; this section has the sole purpose of protecting the\r
+integrity of the free software distribution system, which is\r
+implemented by public license practices. Many people have made\r
+generous contributions to the wide range of software distributed\r
+through that system in reliance on consistent application of that\r
+system; it is up to the author/donor to decide if he or she is willing\r
+to distribute software through any other system and a licensee cannot\r
+impose that choice.\r
+\r
+This section is intended to make thoroughly clear what is believed to\r
+be a consequence of the rest of this License.\r
+\r
+ 8. If the distribution and/or use of the Program is restricted in\r
+certain countries either by patents or by copyrighted interfaces, the\r
+original copyright holder who places the Program under this License\r
+may add an explicit geographical distribution limitation excluding\r
+those countries, so that distribution is permitted only in or among\r
+countries not thus excluded. In such case, this License incorporates\r
+the limitation as if written in the body of this License.\r
+\r
+ 9. The Free Software Foundation may publish revised and/or new versions\r
+of the General Public License from time to time. Such new versions will\r
+be similar in spirit to the present version, but may differ in detail to\r
+address new problems or concerns.\r
+\r
+Each version is given a distinguishing version number. If the Program\r
+specifies a version number of this License which applies to it and "any\r
+later version", you have the option of following the terms and conditions\r
+either of that version or of any later version published by the Free\r
+Software Foundation. If the Program does not specify a version number of\r
+this License, you may choose any version ever published by the Free Software\r
+Foundation.\r
+\r
+ 10. If you wish to incorporate parts of the Program into other free\r
+programs whose distribution conditions are different, write to the author\r
+to ask for permission. For software which is copyrighted by the Free\r
+Software Foundation, write to the Free Software Foundation; we sometimes\r
+make exceptions for this. Our decision will be guided by the two goals\r
+of preserving the free status of all derivatives of our free software and\r
+of promoting the sharing and reuse of software generally.\r
+\r
+ NO WARRANTY\r
+\r
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\r
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\r
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\r
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\r
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\r
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\r
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\r
+REPAIR OR CORRECTION.\r
+\r
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\r
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\r
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\r
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\r
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\r
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\r
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\r
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\r
+POSSIBILITY OF SUCH DAMAGES.\r
--- /dev/null
+# checksum 0x9840 version 0x40002
+# This file was generated by an application wizard of Qt Creator.
+# The code below handles deployment to Symbian and Maemo, aswell as copying
+# of the application data to shadow build directories on desktop.
+# It is recommended not to modify this file, since newer versions of Qt Creator
+# may offer an updated version of it.
+
+defineTest(qtcAddDeployment) {
+for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemsources = $${item}.sources
+ $$itemsources = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath= $$eval($${deploymentfolder}.target)
+ export($$itemsources)
+ export($$itempath)
+ DEPLOYMENT += $$item
+}
+
+MAINPROFILEPWD = $$PWD
+
+symbian {
+ isEmpty(ICON):exists($${TARGET}.svg):ICON = $${TARGET}.svg
+ isEmpty(TARGET.EPOCHEAPSIZE):TARGET.EPOCHEAPSIZE = 0x20000 0x2000000
+} else:win32 {
+ copyCommand =
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
+ source = $$replace(source, /, \\)
+ sourcePathSegments = $$split(source, \\)
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)/$$last(sourcePathSegments)
+ target = $$replace(target, /, \\)
+ !isEqual(source,$$target) {
+ !isEmpty(copyCommand):copyCommand += &&
+ isEqual(QMAKE_DIR_SEP, \\) {
+ copyCommand += $(COPY_DIR) \"$$source\" \"$$target\"
+ } else {
+ source = $$replace(source, \\\\, /)
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
+ target = $$replace(target, \\\\, /)
+ copyCommand += test -d \"$$target\" || mkdir -p \"$$target\" && cp -r \"$$source\" \"$$target\"
+ }
+ }
+ }
+ !isEmpty(copyCommand) {
+ copyCommand = @echo Copying application data... && $$copyCommand
+ copydeploymentfolders.commands = $$copyCommand
+ first.depends = $(first) copydeploymentfolders
+ export(first.depends)
+ export(copydeploymentfolders.commands)
+ QMAKE_EXTRA_TARGETS += first copydeploymentfolders
+ }
+} else:unix {
+ maemo5 {
+ desktopfile.path = /usr/share/applications/hildon
+ } else {
+ desktopfile.path = /usr/share/applications
+ copyCommand =
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source)
+ source = $$replace(source, \\\\, /)
+ macx {
+ target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target)
+ } else {
+ target = $$OUT_PWD/$$eval($${deploymentfolder}.target)
+ }
+ target = $$replace(target, \\\\, /)
+ sourcePathSegments = $$split(source, /)
+ targetFullPath = $$target/$$last(sourcePathSegments)
+ !isEqual(source,$$targetFullPath) {
+ !isEmpty(copyCommand):copyCommand += &&
+ copyCommand += $(MKDIR) \"$$target\"
+ copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\"
+ }
+ }
+ !isEmpty(copyCommand) {
+ copyCommand = @echo Copying application data... && $$copyCommand
+ copydeploymentfolders.commands = $$copyCommand
+ first.depends = $(first) copydeploymentfolders
+ export(first.depends)
+ export(copydeploymentfolders.commands)
+ QMAKE_EXTRA_TARGETS += first copydeploymentfolders
+ }
+ }
+ installPrefix = /opt/$${TARGET}
+ for(deploymentfolder, DEPLOYMENTFOLDERS) {
+ item = item$${deploymentfolder}
+ itemfiles = $${item}.files
+ $$itemfiles = $$eval($${deploymentfolder}.source)
+ itempath = $${item}.path
+ $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target)
+ export($$itemfiles)
+ export($$itempath)
+ INSTALLS += $$item
+ }
+ icon.files = $${TARGET}.png
+ icon.path = /usr/share/icons/hicolor/64x64/apps
+ desktopfile.files = $${TARGET}.desktop
+ target.path = $${installPrefix}/bin
+ export(icon.files)
+ export(icon.path)
+ export(desktopfile.files)
+ export(desktopfile.path)
+ export(target.path)
+ INSTALLS += desktopfile icon target
+}
+
+export (ICON)
+export (INSTALLS)
+export (DEPLOYMENT)
+export (TARGET.EPOCHEAPSIZE)
+export (TARGET.CAPABILITY)
+export (LIBS)
+export (QMAKE_EXTRA_TARGETS)
+}
--- /dev/null
+/*
+Copyright (C) 2011 by Cuong Le <metacuong@gmail.com>
+
+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, see <http://www.gnu.org/licenses/>
+*/
+
+#include "elv1db.h"
+
+#include <QtSql/QSqlQuery>
+#include <QtSql/QSqlRecord>
+
+#include <QString>
+#include <QVariant>
+
+#include <QDebug>
+
+elv1db::elv1db(QObject *parent):
+ QThread(parent),
+ m_type_query(0),
+ m_db(QSqlDatabase::addDatabase("QSQLITE"))
+{
+ m_db.setDatabaseName("/home/user/.rtcom-eventlogger/el-v1.db");
+ m_db.open();
+}
+
+elv1db::~elv1db(){
+ if (m_db.isOpen())
+ m_db.close();
+}
+
+PhoneType elv1db::phonetype(QString metastr){
+ if (metastr.contains("ring/tel/ring"))
+ return GSM_NETWORK;
+ else if (metastr.contains("spirit/skype"))
+ return SKYPE;
+ else if (metastr.contains("gabble/jabber") && metastr.contains("40gmail_2ecom0"))
+ return GOOGLE_TALK;
+ else if (metastr.contains("gabble/jabber"))
+ return JABBER;
+ return UNKNOW;
+}
+
+QString elv1db::calltype(){
+ return this->m_call_type==ALL_CALL?"and (event_type_id = 1 or event_type_id = 3)":
+ this->m_call_type==INCOMING?"and event_type_id = 1 and outgoing = 0":
+ this->m_call_type==OUTGOING?"and event_type_id = 1 and outgoing = 1":"and event_type_id = 3";
+}
+
+void elv1db::run(){
+ if (this->m_type_query == 0)
+ emit start_indicator();
+ else
+ emit detail_start_indicator();
+
+ sleep(1);
+
+ if (this->m_type_query == 0){
+ QString m_group_by_call(H_TOTAL_GROUP_BY);
+ setQuery(m_group_by_call
+ .arg(this->m_all_call?"":"and E.local_uid='ring/tel/ring'")
+ .arg(calltype()));
+ }
+ else{
+ QString m_filter(" and remote_name = '%1' %2 ");
+ m_filter = m_filter.arg(m_contact_name).arg(calltype());
+ QString m_default_search = QString(H_DEFAULT_SEARCH).arg(m_filter).arg(100);
+ setQuery(m_default_search);
+ }
+
+ QSqlQuery *query = new QSqlQuery(this->m_query);
+ QSqlRecord record = query->record();
+ if(record.count() > 0){
+ if (this->m_type_query == 0){
+ this->m_records.clear();
+ while (query->next()) {
+ elv1rec *ef=new elv1rec();
+ ef->set_contact_name(query->value(0).value<QString>());
+ ef->set_total_call(query->value(1).value<QString>());
+ this->m_records << ef;
+ }
+ }else{
+
+ this->m_detail_records.clear();
+
+ while (query->next()) {
+ elv1Detailrec *ef=new elv1Detailrec();
+
+ int calltype = query->value(0).value< int >();
+
+ if (calltype == 1 || calltype == 3){
+ ef->set_phonenumber(query->value(5).value<QString>());
+ ef->set_starttime(query->value(1).value<uint>());
+ ef->set_endtime(query->value(2).value<uint>());
+ if (query->value(2).value<uint>())
+ ef->set_callduration(query->value(2).value<uint>() - query->value(1).value<uint>());
+ else
+ ef->set_callduration(0);
+ if (calltype == 1) //call (outgoing/incoming)
+ ef->set_calltype(query->value(7).value<bool>()?OUTGOING:INCOMING);
+ else // call but missed
+ ef->set_calltype(MISSED);
+
+ ef->set_phonetype(
+ this->phonetype(query->value(4).value<QString>())
+ );
+
+ this->m_detail_records << ef;
+ }
+
+ }
+ }
+ }
+
+ delete query;
+
+ if (this->m_type_query == 0)
+ emit group_by_finished();
+ else
+ emit detail_finished();
+}
--- /dev/null
+/*
+Copyright (C) 2011 by Cuong Le <metacuong@gmail.com>
+
+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, see <http://www.gnu.org/licenses/>
+*/
+
+#ifndef ELV1DB_H
+#define ELV1DB_H
+
+#include <QThread>
+#include <QtSql/QSqlDatabase>
+#include <QIcon>
+#include <QDateTime>
+
+#define H_TOTAL_GROUP_BY "select remote_name, count(*) from Events E, Remotes R where R.remote_uid=E.remote_uid and E.local_uid=R.local_uid %1 %2 group by remote_name order by start_time desc"
+#define H_DEFAULT_SEARCH "select event_type_id, start_time, end_time, is_read, E.local_uid, E.remote_uid, free_text, outgoing, remote_name from Events E, Remotes R where R.remote_uid=E.remote_uid and E.local_uid=R.local_uid %1 order by start_time desc limit %2"
+
+#define P_TYPE_GSM_NETWORK "ring/tel/ring"
+#define P_TYPE_SKYPE "spirit/skype"
+#define P_TYPE_JABBER "gabble/jabber"
+
+#define ICONS_ROOT_DIR "/usr/share/icons/hicolor/"
+
+#define IMG_AVATAR ICONS_ROOT_DIR "48x48/hildon/general_default_avatar.png"
+#define IMG_OUTGOING ICONS_ROOT_DIR "48x48/hildon/general_sent.png"
+#define IMG_INCOMING ICONS_ROOT_DIR "48x48/hildon/general_received.png"
+#define IMG_MISSED ICONS_ROOT_DIR "48x48/hildon/general_missed.png"
+
+#define IMG_CELL ICONS_ROOT_DIR "32x32/hildon/call_status_cellular.png"
+#define IMG_SKYPE ICONS_ROOT_DIR "32x32/hildon/general_skype.png"
+#define IMG_GOOGLE ICONS_ROOT_DIR "32x32/hildon/general_gtalk.png"
+#define IMG_SIP ICONS_ROOT_DIR "32x32/hildon/general_sip.png"
+#define IMG_OVI ICONS_ROOT_DIR "32x32/hildon/general_ovi.png"
+#define IMG_JABBER ICONS_ROOT_DIR "32x32/hildon/general_jabber.png"
+
+/*
+ The record class for group by informations first screen
+ */
+class elv1rec : public QObject
+{
+ Q_OBJECT
+public:
+
+ elv1rec():
+ m_avatar(QIcon::fromTheme( "general_default_avatar", QIcon(IMG_AVATAR)))
+ {
+ }
+
+ QString contact_name() const{
+ return m_contact_name;
+ }
+
+ QString total_call() const{
+ return m_total_call;
+ }
+
+ QIcon avatar() const{
+ return m_avatar;
+ }
+
+ void set_contact_name(QString contact_name){
+ m_contact_name = contact_name;
+ }
+
+ void set_total_call(QString total_call){
+ m_total_call = total_call;
+ }
+
+ void set_avatar(QIcon avatar){
+ m_avatar = avatar;
+ }
+
+private:
+ QString m_contact_name;
+ QString m_total_call;
+ QIcon m_avatar;
+};
+
+/*
+ The record class for detail informations second screen
+ */
+enum PhoneType { GSM_NETWORK = 0, SKYPE = 1, JABBER = 2, GOOGLE_TALK = 3, UNKNOW = 4};
+enum CallType { OUTGOING = 0, INCOMING = 1, MISSED = 2, ALL_CALL = 3};
+
+class elv1Detailrec : public QObject
+{
+ Q_OBJECT
+
+public:
+
+ elv1Detailrec()
+ {}
+
+ void set_phonenumber(QString phonenumber){ m_phonenumber = phonenumber;}
+ void set_starttime(uint starttime){ m_starttime.setTime_t(starttime);}
+ void set_endtime(uint endtime){ m_endtime.setTime_t(endtime);}
+ void set_calltype(CallType calltype){
+ m_calltype = calltype;
+ m_icon = QIcon::fromTheme(calltype==OUTGOING?
+ "general_sent":calltype==INCOMING?
+ "general_received":"general_missed", QIcon(calltype==OUTGOING?
+ IMG_OUTGOING:calltype==INCOMING?
+ IMG_INCOMING:IMG_MISSED));
+
+ }
+
+ void set_phonetype(PhoneType phonetype){
+ m_phonetype = phonetype;
+ QString _m_icon_meta;
+ QString _m_icon_path;
+ switch (phonetype){
+ case GSM_NETWORK:
+ _m_icon_meta = "call_status_cellular";
+ _m_icon_path = IMG_CELL;
+ break;
+ case SKYPE:
+ _m_icon_meta = "general_skype";
+ _m_icon_path = IMG_SKYPE;
+ break;
+ case JABBER:
+ _m_icon_meta = "general_jabber";
+ _m_icon_path = IMG_JABBER;
+ break;
+ case GOOGLE_TALK:
+ _m_icon_meta = "general_gtalk";
+ _m_icon_path = IMG_GOOGLE;
+ break;
+ default:
+ _m_icon_meta = "call_status_unknow";
+ _m_icon_path = "unknow";
+ break;
+ }
+
+ m_type_call_icon = QIcon::fromTheme(_m_icon_meta, QIcon(_m_icon_path));
+ }
+
+ void set_callduration(uint callduration){ m_callduration = callduration;}
+
+ QString get_phonenumber() const { return m_phonenumber;}
+ QIcon get_icon() const { return m_icon;}
+ QIcon get_type_call_icon() const { return m_type_call_icon;}
+ QTime get_starttime() const { return m_starttime.time();}
+ QTime get_endtime() const { return m_endtime.time();}
+ QDate get_startdate() const { return m_starttime.date();}
+ QDate get_enddate() const { return m_endtime.date();}
+ CallType get_calltype() const { return m_calltype;}
+ uint get_duration() const { return m_callduration;}
+
+private:
+ QIcon m_icon; //incoming/outgoing/missed call icons
+ QIcon m_type_call_icon; //cell/skype/sip/jingle/...
+ QString m_phonenumber;
+ QDateTime m_starttime;
+ QDateTime m_endtime;
+ CallType m_calltype;
+ PhoneType m_phonetype;
+ uint m_callduration;
+};
+
+/*
+ The main db management class
+ *MUST* be inherited QThread
+ */
+
+
+class elv1db : public QThread
+{
+ Q_OBJECT
+public:
+ explicit elv1db(QObject *parent = 0);
+ ~elv1db();
+
+ void run();
+
+ void setQuery(QString o_query) {
+ m_query = o_query;
+ }
+
+ QString m_contact_name;
+
+ QList<elv1rec*> m_records;
+ QList<elv1Detailrec*> m_detail_records;
+
+ bool m_type_query;
+
+ bool m_all_call;
+ CallType m_call_type;
+
+signals:
+ void start_indicator();
+ void group_by_finished();
+ void detail_finished();
+ void detail_start_indicator();
+
+private:
+ QSqlDatabase m_db;
+ QString m_query;
+
+ PhoneType phonetype(QString metastr);
+ QString calltype();
+};
+
+#endif // ELV1DB_H
--- /dev/null
+/*
+Copyright (C) 2011 by Cuong Le <metacuong@gmail.com>
+
+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, see <http://www.gnu.org/licenses/>
+*/
+
+#include "listitemdetaildelegate.h"
+
+listitemdetailDelegate::listitemdetailDelegate(QObject*)
+{
+}
+
+listitemdetailDelegate::~listitemdetailDelegate(){
+
+}
+
+void listitemdetailDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {
+ QString header = index.data(Qt::DisplayRole).toString();
+
+ QRect r = option.rect;
+
+ if (!header.isNull()){
+ r.adjust(0,10,0,-10);
+ QLinearGradient gradientSelected(r.left(),r.top(),r.left(),r.height()+r.top());
+ gradientSelected.setColorAt(0.0, QColor::fromRgb(119,213,247));
+ gradientSelected.setColorAt(0.9, QColor::fromRgb(27,134,183));
+ gradientSelected.setColorAt(1.0, QColor::fromRgb(0,120,174));
+ painter->setBrush(gradientSelected);
+ painter->drawRect(r);
+
+ painter->setPen(Qt::blue);
+ painter->setFont(QFont("Nokia Sans", 18, QFont::Normal));
+ painter->drawText(r.left(), r.top(), r.width(), r.height(), Qt::AlignCenter, header, &r);
+ }else{
+ painter->setPen(Qt::white);
+ QString phone_number = index.data(Qt::UserRole + 1).toString();
+ QString start_end = index.data(Qt::UserRole + 2).toString();
+ QIcon icon_type = QIcon(qvariant_cast<QIcon>(index.data(Qt::UserRole+4)));
+ QIcon icon_call_type = QIcon(qvariant_cast<QIcon>(index.data(Qt::UserRole+5)));
+
+ painter->setFont(QFont("Nokia Sans", 16, QFont::Normal));
+ icon_type.paint(painter, r, Qt::AlignVCenter|Qt::AlignLeft);
+ icon_call_type.paint(painter, r, Qt::AlignVCenter|Qt::AlignRight);
+
+ r = option.rect.adjusted(55, 0, -10, -30);
+ painter->setFont(QFont("Nokia Sans", 18, QFont::Bold));
+ painter->drawText(r.left(), r.top(), r.width(), r.height(), Qt::AlignBottom|Qt::AlignLeft, phone_number, &r);
+
+ painter->setFont(QFont("Nokia Sans", 14, QFont::Normal));
+ r = option.rect.adjusted(55, 30, -10, -10);
+ painter->drawText(r.left(), r.top(), r.width(), r.height(), Qt::AlignBottom|Qt::AlignLeft, start_end, &r);
+ }
+}
+
+QSize listitemdetailDelegate::sizeHint(const QStyleOptionViewItem&, const QModelIndex&) const {
+ return QSize(200, 70);
+}
--- /dev/null
+/*
+Copyright (C) 2011 by Cuong Le <metacuong@gmail.com>
+
+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, see <http://www.gnu.org/licenses/>
+*/
+
+#ifndef LISTITEMDETAILDELEGATE_H
+#define LISTITEMDETAILDELEGATE_H
+
+#include <QPainter>
+#include <QAbstractItemDelegate>
+
+class listitemdetailDelegate : public QAbstractItemDelegate
+{
+public:
+ listitemdetailDelegate(QObject *parent = 0);
+ void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const;
+ QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const;
+
+ virtual ~listitemdetailDelegate();
+};
+
+#endif // LISTITEMDETAILDELEGATE_H
--- /dev/null
+/*
+Copyright (C) 2011 by Cuong Le <metacuong@gmail.com>
+
+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, see <http://www.gnu.org/licenses/>
+*/
+
+#include "loadingbox.h"
+
+loadingbox::loadingbox(QWidget *parent) :
+ QWidget(parent)
+{
+}
--- /dev/null
+/*
+Copyright (C) 2011 by Cuong Le <metacuong@gmail.com>
+
+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, see <http://www.gnu.org/licenses/>
+*/
+
+#ifndef LOADINGBOX_H
+#define LOADINGBOX_H
+
+#include <QWidget>
+
+class loadingbox : public QWidget
+{
+ Q_OBJECT
+public:
+ explicit loadingbox(QWidget *parent = 0);
+
+signals:
+
+public slots:
+
+};
+
+#endif // LOADINGBOX_H
--- /dev/null
+/*
+Copyright (C) 2011 by Cuong Le <metacuong@gmail.com>
+
+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, see <http://www.gnu.org/licenses/>
+*/
+
+#include "mainwindow.h"
+
+#include <QtGui/QApplication>
+
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+
+ MainWindow mainWindow;
+ mainWindow.setOrientation(MainWindow::ScreenOrientationAuto);
+ mainWindow.showExpanded();
+
+ return app.exec();
+}
--- /dev/null
+/*
+Copyright (C) 2011 by Cuong Le <metacuong@gmail.com>
+
+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, see <http://www.gnu.org/licenses/>
+*/
+
+#include "mainwindow.h"
+
+#include <QtGui>
+#include <QtCore/QCoreApplication>
+#include <QDebug>
+
+
+#include "listitemdetaildelegate.h"
+
+MainWindow::MainWindow(QWidget *parent):
+ QMainWindow(parent),
+ m_elv1db(new elv1db(parent))
+{
+
+ detail_dlg = new QMainWindow(this);
+ detail_dlg->installEventFilter(this);
+
+ m_contact_detail = new QListWidget(detail_dlg);
+ m_contact_detail->setSelectionMode(QAbstractItemView::NoSelection);
+ m_contact_detail->setObjectName("m_contact_detail");
+ detail_dlg->setCentralWidget(m_contact_detail);
+ #ifdef Q_WS_MAEMO_5
+ detail_dlg->setAttribute(Qt::WA_Maemo5StackedWindow);
+ #endif
+
+
+ this->setWindowTitle(QString::fromUtf8("VN Call History"));
+
+ m_contacts_widget = new QTableWidget(0, 3, this);
+ m_contacts_widget->setProperty( "FingerScrollable", true );
+ m_contacts_widget->setSelectionBehavior(QAbstractItemView::SelectRows);
+ m_contacts_widget->setSelectionMode(QAbstractItemView::SingleSelection);
+ m_contacts_widget->setIconSize( QSize( 48, 48 ) );
+
+ m_contacts_widget->horizontalHeader()->setDefaultSectionSize( 30 );
+ m_contacts_widget->horizontalHeader()->setResizeMode( 0, QHeaderView::Fixed );
+ m_contacts_widget->horizontalHeader()->setResizeMode( 1, QHeaderView::Stretch );
+ m_contacts_widget->horizontalHeader()->setResizeMode( 2, QHeaderView::Fixed );
+
+ m_contacts_widget->verticalHeader()->hide();
+ m_contacts_widget->horizontalHeader()->hide();
+
+ connect(m_contacts_widget, SIGNAL(cellClicked(int,int)), this, SLOT(cellClicked(int,int)));
+
+ m_elv1db->m_type_query = 0;
+
+ connect(m_elv1db, SIGNAL(group_by_finished()), this, SLOT(elv1db_finised()));
+ connect(m_elv1db, SIGNAL(detail_finished()), this, SLOT(elv1db_detail_finised()));
+ connect(m_elv1db, SIGNAL(start_indicator()), this, SLOT(start_indicator()));
+ connect(m_elv1db, SIGNAL(detail_start_indicator()), this, SLOT(detail_start_indicator()));
+
+ this->setup_menu();
+ this->setup_menu_detail();
+
+ this->setCentralWidget(m_contacts_widget);
+
+ m_elv1db->m_call_type = ALL_CALL;
+ m_elv1db->m_all_call = false;
+ m_elv1db->start();
+
+#ifdef Q_WS_MAEMO_5
+ this->setAttribute(Qt::WA_Maemo5StackedWindow);
+#endif
+
+}
+
+MainWindow::~MainWindow()
+{
+ delete this->m_contacts_widget;
+ delete this->m_contact_detail;
+ delete this->m_elv1db;
+}
+
+void MainWindow::cellClicked(int row, int col){
+ qDebug() << "cellClicked : " << row << ":" << col;
+
+ m_contact_detail->clear();
+
+ const elv1rec *ef= m_elv1db->m_records.at(row);
+
+ m_elv1db->m_contact_name = ef->contact_name();
+
+ detail_dlg->setWindowTitle(ef->contact_name());
+ detail_dlg->show();
+
+ m_elv1db->m_type_query = 1;
+ m_elv1db->start();
+}
+
+void MainWindow::elv1db_detail_finised(){
+ QDate t_cache;
+
+ m_contact_detail->setItemDelegate(new listitemdetailDelegate(m_contact_detail));
+
+ foreach(elv1Detailrec *ef, m_elv1db->m_detail_records){
+ QString detail_format("%1 | %2 | Duration: %3");
+ QTime final_duration;
+
+ uint secs = ef->get_duration() % 60;
+ uint mins = ef->get_duration() / 60;
+ uint hours = ef->get_duration() / 3600;
+
+ final_duration.setHMS(hours,mins,secs);
+
+ if ((t_cache.day()!=ef->get_startdate().day()) ||
+ (t_cache.month()!=ef->get_startdate().month()) ||
+ (t_cache.year()!=ef->get_startdate().year()) ){
+
+ QListWidgetItem *header = new QListWidgetItem();
+ header->setData(Qt::DisplayRole, ef->get_startdate().toString());
+ m_contact_detail->addItem(header);
+
+ t_cache=ef->get_startdate();
+ }
+
+ QListWidgetItem *item = new QListWidgetItem();
+ item->setData(Qt::UserRole + 1, ef->get_phonenumber());
+ item->setData(Qt::UserRole + 2, detail_format.arg(ef->get_starttime().toString())
+ .arg(ef->get_endtime().toString())
+ .arg(final_duration.toString()));
+ item->setData(Qt::UserRole + 4, ef->get_icon());
+ item->setData(Qt::UserRole + 5, ef->get_type_call_icon());
+ m_contact_detail->addItem(item);
+ }
+
+ this->me_indicator(this->detail_dlg, false);
+ m_elv1db->m_type_query = 0;
+}
+
+void MainWindow::elv1db_finised(){
+ qDebug() << " Process the elv1 database is done";
+
+ m_contacts_widget->clear();
+ m_contacts_widget->setRowCount(0);
+
+ int i=0;
+
+ foreach(elv1rec *ef,m_elv1db->m_records){
+ QTableWidgetItem *m_thumbnail = new QTableWidgetItem;
+ m_thumbnail->setIcon(ef->avatar());
+
+ m_contacts_widget->insertRow(i);
+ m_contacts_widget->setItem(i,0, m_thumbnail);
+
+ QString _m_total_call(" (%1) ");
+ _m_total_call = _m_total_call.arg(ef->total_call());
+
+ QString _m_contact_name(" %1");
+ _m_contact_name = _m_contact_name.arg(ef->contact_name());
+
+ QLabel *m_total_call = new QLabel(_m_total_call);
+ m_total_call->setAlignment(Qt::AlignCenter);
+
+ m_contacts_widget->setCellWidget(i,1, new QLabel(_m_contact_name));
+ m_contacts_widget->setCellWidget(i,2, m_total_call);
+ i++;
+ }
+
+ m_contacts_widget->resizeRowsToContents();
+ m_contacts_widget->resizeColumnsToContents();
+
+ this->stop_indicator();
+
+ m_contacts_widget->setEnabled(true);
+}
+
+void MainWindow::start_indicator(){
+ this->me_indicator(this, true);
+}
+
+void MainWindow::stop_indicator(){
+ this->me_indicator(this, false);
+}
+
+void MainWindow::detail_start_indicator(){
+ this->me_indicator(this->detail_dlg, true);
+}
+
+void MainWindow::me_indicator(QMainWindow *qmw, bool m_show){
+ qmw->setAttribute(Qt::WA_Maemo5ShowProgressIndicator, m_show);
+}
+
+void MainWindow::setup_menu(){
+ QActionGroup* m_type_group = new QActionGroup(this);
+ m_type_group->setExclusive(true);
+ m_type_group->setObjectName("m_type_group");
+
+ QAction* m_all_calls = new QAction(QString::fromUtf8("All call"), m_type_group );
+ m_all_calls->setCheckable(true);
+ m_all_calls->setObjectName( "m_all_calls" );
+ connect(m_all_calls, SIGNAL(triggered()), this, SLOT(select_all_call()));
+
+ QAction* m_gsm_calls = new QAction(QString::fromUtf8("GSM cellular"), m_type_group );
+ m_gsm_calls->setCheckable(true);
+ m_gsm_calls->setObjectName("m_gsm_calls");
+ connect(m_gsm_calls, SIGNAL(triggered()), this, SLOT(select_gsm_calls()));
+
+ m_gsm_calls->setChecked(true);
+
+
+ QActionGroup* m_type_group_af = new QActionGroup(this);
+ m_type_group_af->setExclusive(true);
+ m_type_group_af->setObjectName("m_type_group_detail");
+
+ QAction* m_all = new QAction(QString::fromUtf8("All"), m_type_group_af );
+ m_all->setCheckable(true);
+ m_all->setObjectName( "m_all" );
+ connect(m_all, SIGNAL(triggered()), this, SLOT(select_all_typecall()));
+
+ QAction* m_incoming = new QAction(QString::fromUtf8("Incoming"), m_type_group_af );
+ m_incoming->setCheckable(true);
+ m_incoming->setObjectName( "m_incoming" );
+ connect(m_incoming, SIGNAL(triggered()), this, SLOT(select_incoming_calls()));
+
+ QAction* m_outgoing = new QAction(QString::fromUtf8("Outgoing"), m_type_group_af );
+ m_outgoing->setCheckable(true);
+ m_outgoing->setObjectName( "m_outgoing" );
+ connect(m_outgoing, SIGNAL(triggered()), this, SLOT(select_outgoing_calls()));
+
+ QAction* m_missed = new QAction(QString::fromUtf8("Missed"), m_type_group_af );
+ m_missed->setCheckable(true);
+ m_missed->setObjectName( "m_missed" );
+ connect(m_missed, SIGNAL(triggered()), this, SLOT(select_missed_calls()));
+
+ m_all->setChecked(true);
+
+ this->menuBar()->addActions(m_type_group->actions());
+ this->menuBar()->addActions(m_type_group_af->actions());
+
+/* QAction *m_clear_log = this->menuBar()->addAction("Clear Log");
+ QAction *m_options = this->menuBar()->addAction(QString::fromUtf8("Options"));
+
+ connect(m_clear_log,SIGNAL(triggered()), this, SLOT(clearLog()));
+ connect(m_options, SIGNAL(triggered()), this, SLOT(dlgOptions()));*/
+
+ QAction *m_about = this->menuBar()->addAction("About");
+ QAction *m_about_qt = this->menuBar()->addAction("About Qt");
+
+ connect(m_about,SIGNAL(triggered()), this, SLOT(dlgAbout()));
+ connect(m_about_qt,SIGNAL(triggered()), qApp, SLOT(aboutQt()));
+
+}
+
+void MainWindow::select_all_call(){ //ring/tel/ring, spirit/skype, gabble/jabber
+ m_contacts_widget->setEnabled(false);
+ m_elv1db->m_all_call = true;
+ m_elv1db->start();
+}
+
+void MainWindow::select_gsm_calls(){ //ring/tel/ring
+ m_contacts_widget->setEnabled(false);
+ m_elv1db->m_all_call = false;
+ m_elv1db->start();
+}
+
+void MainWindow::select_all_typecall(){ //incoming, outgoing and missed calls
+ m_contacts_widget->setEnabled(false);
+ m_elv1db->m_call_type = ALL_CALL;
+ m_elv1db->start();
+}
+
+void MainWindow::select_incoming_calls(){
+ m_contacts_widget->setEnabled(false);
+ m_elv1db->m_call_type = INCOMING;
+ m_elv1db->start();
+}
+
+void MainWindow::select_outgoing_calls(){
+ m_contacts_widget->setEnabled(false);
+ m_elv1db->m_call_type = OUTGOING;
+ m_elv1db->start();
+}
+
+void MainWindow::select_missed_calls(){
+ m_contacts_widget->setEnabled(false);
+ m_elv1db->m_call_type = MISSED;
+ m_elv1db->start();
+}
+
+void MainWindow::clearLog(){
+}
+
+void MainWindow::setup_menu_detail(){
+}
+
+void MainWindow::dlgAbout(){
+ QMessageBox m_about;
+ m_about.setWindowTitle("About");
+ m_about.setText(
+ "<font size=4>VN Call History</font><br>"
+ "<font size=3>Version : 0.0.1 (09/28/2011)</font><br>"
+ "Author : Cuong Le <a href=\"mailto:metacuong@gmail.com\">metacuong@gmail.com</a><br>"
+ "<font size=2>"
+ "Homepage : <a href=\"http://vncallhistory.garage.maemo.org/\">http://vncallhistory.garage.maemo.org/</a><br>"
+ "Bugs report : <a href=\"https://garage.maemo.org/tracker/?group_id=2259\">https://garage.maemo.org/tracker/?group_id=2259</a><br>"
+ "License : GNU/GPL version 2"
+ "</font>"
+ );
+ m_about.exec();
+}
+
+void MainWindow::dlgOptions(){
+ dlg_options = new QMainWindow(this);
+ dlg_options->setWindowTitle(QString::fromUtf8("Options"));
+ dlg_options->installEventFilter(this);
+#ifdef Q_WS_MAEMO_5
+ dlg_options->setAttribute(Qt::WA_Maemo5StackedWindow);
+#endif
+ dlg_options->show();
+}
+
+void MainWindow::setOrientation(ScreenOrientation orientation)
+{
+#if defined(Q_OS_SYMBIAN)
+ // If the version of Qt on the device is < 4.7.2, that attribute won't work
+ if (orientation != ScreenOrientationAuto) {
+ const QStringList v = QString::fromAscii(qVersion()).split(QLatin1Char('.'));
+ if (v.count() == 3 && (v.at(0).toInt() << 16 | v.at(1).toInt() << 8 | v.at(2).toInt()) < 0x040702) {
+ qWarning("Screen orientation locking only supported with Qt 4.7.2 and above");
+ return;
+ }
+ }
+#endif // Q_OS_SYMBIAN
+
+ Qt::WidgetAttribute attribute;
+ switch (orientation) {
+#if QT_VERSION < 0x040702
+ // Qt < 4.7.2 does not yet have the Qt::WA_*Orientation attributes
+ case ScreenOrientationLockPortrait:
+ attribute = static_cast<Qt::WidgetAttribute>(128);
+ break;
+ case ScreenOrientationLockLandscape:
+ attribute = static_cast<Qt::WidgetAttribute>(129);
+ break;
+ default:
+ case ScreenOrientationAuto:
+ attribute = static_cast<Qt::WidgetAttribute>(130);
+ break;
+#else // QT_VERSION < 0x040702
+ case ScreenOrientationLockPortrait:
+ attribute = Qt::WA_LockPortraitOrientation;
+ break;
+ case ScreenOrientationLockLandscape:
+ attribute = Qt::WA_LockLandscapeOrientation;
+ break;
+ default:
+ case ScreenOrientationAuto:
+ attribute = Qt::WA_AutoOrientation;
+ break;
+#endif // QT_VERSION < 0x040702
+ };
+ setAttribute(attribute, true);
+}
+
+void MainWindow::showExpanded()
+{
+#ifdef Q_OS_SYMBIAN
+ showFullScreen();
+#elif defined(Q_WS_MAEMO_5)
+ showMaximized();
+#else
+ show();
+#endif
+}
--- /dev/null
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+/*
+Copyright (C) 2011 by Cuong Le <metacuong@gmail.com>
+
+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, see <http://www.gnu.org/licenses/>
+*/
+
+#include <QtGui/QMainWindow>
+
+#include "elv1db.h"
+
+#include <QListWidget>
+
+class QTableWidget;
+class QTableWidgetItem;
+class QListWidget;
+
+class MainWindow : public QMainWindow
+{
+ Q_OBJECT
+public:
+ enum ScreenOrientation {
+ ScreenOrientationLockPortrait,
+ ScreenOrientationLockLandscape,
+ ScreenOrientationAuto
+ };
+
+ explicit MainWindow(QWidget *parent = 0);
+ virtual ~MainWindow();
+
+ // Note that this will only have an effect on Symbian and Fremantle.
+ void setOrientation(ScreenOrientation orientation);
+
+ void showExpanded();
+
+private slots:
+ void dlgAbout();
+ void clearLog();
+ void dlgOptions();
+ void elv1db_finised();
+
+ void start_indicator();
+ void stop_indicator();
+
+ void elv1db_detail_finised();
+
+ void cellClicked(int, int);
+
+ void detail_start_indicator();
+
+ void select_gsm_calls();
+ void select_all_call();
+
+ void select_all_typecall();
+ void select_incoming_calls();
+ void select_outgoing_calls();
+ void select_missed_calls();
+
+private:
+ QTableWidget *m_contacts_widget;
+ QListWidget *m_contact_detail;
+
+ QMainWindow *dlg_options;
+
+ void setup_menu();
+ void setup_menu_detail();
+
+ elv1db *m_elv1db;
+
+ QMainWindow *detail_dlg;
+
+ void me_indicator(QMainWindow*, bool);
+};
+
+#endif // MAINWINDOW_H
--- /dev/null
+The Debian Package vcallhistory
+----------------------------
+
+Comments regarding the Package
+
+ -- Cuong Le <metacuong@gmail.com> Sun, 25 Sep 2011 14:31:43 +0700
--- /dev/null
+vcallhistory (0.0.1) unstable; urgency=low
+
+ * First beta release.
+
+ -- Cuong Le <metacuong@gmail.com> Sun, 25 Sep 2011 14:31:43 +0700
--- /dev/null
+Source: vcallhistory
+Section: user/utilities
+Priority: optional
+Maintainer: Cuong Le <metacuong@gmail.com>
+Build-Depends: debhelper (>= 5), libqt4-dev
+Standards-Version: 3.7.3
+Homepage: http://vncallhistory.garage.maemo.org/
+
+Package: vcallhistory
+Architecture: armel
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: Just another call history manager for Maemo 5 (Fremantle PR 1.2 and PR 1.3).
+XB-Maemo-Display-Name: VN Call History
+XSBC-Bugtracker: https://garage.maemo.org/tracker/?group_id=2259
+XB-Maemo-Icon-26: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAOxAAADsQBlSsOGwAACBpJREFUaIHNWb1rZccV/+l5DOfCFk/gwApc7AM3EgS8CybxAxcrcLFb2hBIXBmTyv+Ba5exq7WbLG6CHEjwugibdWOlCMRFAiocVgEbyYGA1OmB5czBPpZSzJyZM+fOfVKZI67ufXPn43x/3Q1kuH/v/iVCeiYQAIDBIBAYDAv2fW/+1Du73r+34Oc24wIwM87Oz+4d/P3gswAAt1+8fQkAh4eHOFudjRd1kO8deBUyfp+r9u6t3b61jWFzAD1DTwBsbFCgy63nt3ByelI3CW6V/y1uLLjxfG+QlPXIF6SF1zJQ9yEi8Lf8zYylncChs7G0CCC4yxPiCe6t8WszUKDmvRIzkg4z8CNuBQqEeB4nD2Zw2tQjg8rJnurovGIDUu2ppzpTnB69D/UdB8YGgMv5c3PwOTccnEKKwhqkO6rEAeOZwkCohFmkJ9XLEKTv+Zwxo0B9vXeIFdGiHsKBr1SlLhuMRMv5uk7PmkBez9f5YZ0HqUiM9XB0iEe+c/A6oEDw9rhuT2XirPHTwRmxV6U1xgcMzfiQfw95/hCGcgEo9xGCKmUrmQ4o46sEguNyzw467nMQi/jQTB/cbwCIHnkDFMjZD4OkbxNFAhAT4aQfLRsP4BFsxqKRkD5HDIiIAYiISSKIAGIlZML7Tb4LNbZsIODy5vzmWP+MKHtguRgtMteEKFm9JAIYEKHPKMghtO632FSWDp9nCQAu4jmq7TvV46gcdsQcHR/h6PgIex897O6lc07yPIQBQJISvF1Yt+oCKSGp26yn+x56xjSEAVEqEffv3cfTr56WqP3y3d2q0+hIMq9LPB/yFdHYkYnG1o0XvAIhsDBGUc5lpf5QSwQAHH11BCCJO+lnQpzBIKKR8bMkjhJRQtcEwCEk9boWqARGrtJQP4IwnsPMxQ1DADADzNh9dTchHGqsUdErAi1DABRDNwSHcfqh4zOfe3eTJ/XjGMaJnc1A81ZKzMMPH7Z7ZcRY1zsmJc53PJNPJA3M7ObdqByqP4+huknV6QfvPyguWFUj/QZWqxVe+9Vro9hByNmkMqMEyAExJCLUKoAa1Brp6XZeND0iYjG11lUSCNsvbdfkLliPxWBmPPrDo3qoSooI80BJEiGdxMJpd1dT+LU+5Qg2kBX3tC6xy5spopu0mbhp1lAgHPzzAG+9+VajJoSkZXd+ulOIJLNnQjYiKqM6xtwwXIBQKqfQSZF7GaYimf3z3u/38PovX09EAEAgLF+5Y9ZkDiN7p8B4+uXTwrCd7Z2MqK7PuZI5M3oJmnuTSoxAktoMGFLOYwnJdvDeh+8hcszrCXPKTqCk0tyoFQCc/ucYp6en1XZc2jCIxoMronvjRoMTTwYbcS2oHpKQicSM1fkKWz/ZqvqdL0WfgGSshgnW+zXnIsKDrx1KRVYgtFsNYWhF16na9p/sF0OHAAMN2L232y1MSoIomRibfTbVWcyEoK3GdE72cuNA1gMbSTU1ECrit8gDQOQzPP7T4+5WJc5oTNB7I/0+/9XbWSnMempjIeqfuMJfY4EAi5uLhrtQlTQcZUkqVFxuqazQwWBAzwZ6jK6BLGd+1DHmnv9PSKWOxc7tHWzON0vXjCWlusgIp5Q4XV5VGEhFvmUOUoKdrvZs39UYScBzQzcohjrhtfb/ul+I4hyJ3/jFGyCh7HLz3i59IPPf7hm1RnDIp9lVEtWIxaS8lhMTtWtJb419PH7yGKvVqrReFjcXWN5d9nN6oHIe44K+qKyM53MeX61WpiJzSV0viI2qLmMHOmfvd3vN2vlzczz64yO8/eu3cfj1IQBgcWuB5Ut3wCGpbK/9GCU6ghkQKsiry24CWc8fazI3IBUw6nGKtHrhnmsXeXW6wvKVJQ7+dVD0//jrY2wtFiANYi67jTL2/8hqWIjJcxs3WqKiS2V1w5JSoxYlalS6dvHCogTFptoT27hlfP7nz2sm5JK2UTfDp/CGubMmlOfJaayFxpVOgQDLl5c4Pj5uUuySJ2XCzxj44h9f4G9/2W+ZlO8RrfoUBwAYu0G/IqMciUl4NHnt3SD47jvvYvH8ouFcQTBGDD+k55PTkzQGlEZBKZquA71Alrif9c2lAoNJcz2XPCzvLhPiiIg/VH8+PDsAzyYXyYq85DYL2m6HnkWol4cNCnQ5n89HOT2K/nJLiHqk3NSKnWDj095PPv2kVmAheaEHv32Ajz/6uNoXOnlPx8AtrM6NG13JyuUpNiYwPP3qUhsCriqEpFZ3yVhrrm+fR8iLSznyOLP5PgCGC1TlaRqxiTZLRHQ900qo1/OiigGAFDlUJDsxQn83ElBPUdyfi7KVqDUfNhyUZkAnr7eIrBvrqpGm3+xaixy4CVAUcD2PIFOd6H4zYMqD2bFJzqPGKxZGaIoOx3EWNy6qiWO1Km1Ge2CYiqoTyOu5OeUefYCEq9s1kPlJo+rIHFjSqd7XlI6eroUcJ2pPKWWyWix5IGmbbiRUm7v6Qj8o9JpItTQ3qcc6dbgm1K9EmKzNIbXFWMpS31pc91EhHaTdNAbDqR7aerW5zJjt3umpNjmblGxAqS0sBLXmgoT7rKNi06PqpvZ7gmmcSLKRai2aBnOJpmx3W1daytgeihqlDt33GwAugdTqNmS17Qtn3H3IKDSZZRoryInOs+xwqPe8jqvEWNI5fM4fPANgE8DPb9y4AZG8egYIBAEBfMGpfTe7ioC89kKRr2NBALkw84Kk/S5ajFnyWRlpyX8EKs8CAS4A/i8DwM8sBv9Gksb/+/UdgN8o0v8DdOzI2FGskoUAAAAASUVORK5CYII=
--- /dev/null
+This package was debianized by Cuong Le <metacuong@gmail.com> on
+Sun, 25 Sep 2011 14:31:43 +0700.
+
+It was downloaded from <url://example.com>
+
+Upstream Author(s):
+
+ Cuong Le <metacuong@gmail.com>
+
+Copyright:
+
+ Copyright (C) 2011 Cuong Le>
+
+License:
+
+ This package 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 package 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 package; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL'.
+
+The Debian packaging is (C) 2011, Cuong Le <metacuong@gmail.com> and
+is licensed under the GPL, see above.
+
+
+# Please also look if there are files or directories which have a
+# different copyright/license attached and list them here.
--- /dev/null
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+APPNAME := vcallhistory
+builddir:
+ mkdir -p builddir
+
+builddir/Makefile: builddir
+ cd builddir && qmake-qt4 PREFIX=/usr ../$(APPNAME).pro
+
+build: build-stamp
+
+build-stamp: builddir/Makefile
+ dh_testdir
+
+ # Add here commands to compile the package.
+ cd builddir && $(MAKE)
+ #docbook-to-man debian/$(APPNAME).sgml > $(APPNAME).1
+
+ touch $@
+
+clean:
+ dh_testdir
+ dh_testroot
+ rm -f build-stamp
+
+ # Add here commands to clean up after the build process.
+ rm -rf builddir
+
+ dh_clean
+
+install: build
+ dh_testdir
+ dh_testroot
+ dh_clean -k
+ dh_installdirs
+
+ # Add here commands to install the package into debian/arora.
+ cd builddir && $(MAKE) INSTALL_ROOT=$(CURDIR)/debian/$(APPNAME) install
+
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+ dh_testdir
+ dh_testroot
+ dh_installdocs
+ dh_installexamples
+ dh_installman
+ dh_link
+ dh_strip
+ dh_compress
+ dh_fixperms
+ dh_installdeb
+ dh_shlibdeps
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install configure
--- /dev/null
+[Desktop Entry]
+Encoding=UTF-8
+Version=1.0
+Type=Application
+Terminal=false
+Name=VN Call History
+Exec=/opt/vcallhistory/bin/vcallhistory
+Icon=vcallhistory
+X-Window-Icon=
+X-HildonDesk-ShowInToolbar=true
+X-Osso-Type=application/x-executable
--- /dev/null
+# Add files and directories to ship with the application
+# by adapting the examples below.
+# file1.source = myfile
+# dir1.source = mydir
+DEPLOYMENTFOLDERS = # file1 dir1
+
+CONFIG += mobility qdbus
+MOBILITY = contacts
+QT += sql
+
+symbian:TARGET.UID3 = 0xE540C47E
+
+# Smart Installer package's UID
+# This UID is from the protected range
+# and therefore the package will fail to install if self-signed
+# By default qmake uses the unprotected range value if unprotected UID is defined for the application
+# and 0x2002CCCF value if protected UID is given to the application
+#symbian:DEPLOYMENT.installer_header = 0x2002CCCF
+
+# Allow network access on Symbian
+symbian:TARGET.CAPABILITY += NetworkServices
+
+# If your application uses the Qt Mobility libraries, uncomment
+# the following lines and add the respective components to the
+# MOBILITY variable.
+# CONFIG += mobility
+# MOBILITY +=
+
+SOURCES += \
+ main.cc \
+ mainwindow.cc \
+ elv1db.cc \
+ loadingbox.cc \
+ listitemdetaildelegate.cc
+HEADERS += mainwindow.h \
+ elv1db.h \
+ loadingbox.h \
+ listitemdetaildelegate.h
+FORMS +=
+
+# Please do not modify the following two lines. Required for deployment.
+include(deployment.pri)
+qtcAddDeployment()
+
+OTHER_FILES += \
+ qtc_packaging/debian_fremantle/rules \
+ qtc_packaging/debian_fremantle/README \
+ qtc_packaging/debian_fremantle/copyright \
+ qtc_packaging/debian_fremantle/control \
+ qtc_packaging/debian_fremantle/compat \
+ qtc_packaging/debian_fremantle/changelog
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ height="44px"
+ version="1.1"
+ viewBox="0 0 44 44"
+ width="44px"
+ x="0px"
+ y="0px"
+ id="svg2"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="qt.svg">
+ <metadata
+ id="metadata18">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs16">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 22 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="44 : 22 : 1"
+ inkscape:persp3d-origin="22 : 14.666667 : 1"
+ id="perspective2836" />
+ </defs>
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1020"
+ id="namedview14"
+ showgrid="false"
+ inkscape:zoom="21.454545"
+ inkscape:cx="49.412871"
+ inkscape:cy="21.894358"
+ inkscape:window-x="-4"
+ inkscape:window-y="-4"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="g3" />
+ <g
+ transform="matrix(0.18308778,0,0,0.18308778,6.6100946,3.2385199)"
+ id="g3">
+ <path
+ d="M 43.09,0.3586 C 40.94,0.0036 38.84,-0.0824 36.81,0.0776 31.968136,0.39505671 27.122677,0.73638425 22.28,1.0696 9.62,2.0816 0,12.4996 0,26.8896 l 0,169.7 14.19,13.2 28.87,-209.42 0.03,-0.011 z"
+ style="fill:#006225"
+ id="path5"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ d="m 174.4,160 c 0,12.5 -7.75,24.07 -17.57,25.77 L 14.23,209.73 V 25.93 C 14.23,9.21 27.57,-2.27 43.12,0.3 l 131.3,21.52 v 138.2 z"
+ style="fill:#80c342"
+ id="path7" />
+ <path
+ d="m 154.9,80.96 -12.96,-0.598 0,0.278 6.945,0.32 6.016,0 z"
+ style="fill:#006225"
+ id="path11" />
+ <path
+ d="m 144.6,135.6 c 0.66,0.328 1.43,0.476 2.351,0.476 0.161,0 0.329,-0.004 0.497,-0.016 2.55,-0.148 5.32,-0.933 8.343,-2.308 h -6.015 c -1.821,0.832 -3.532,1.457 -5.176,1.848 z"
+ style="fill:#006225"
+ id="path13" />
+ <path
+ id="path17"
+ style="fill:#ffffff"
+ d="m 91.15,132.4 c 2.351,-6.051 3.511,-17.91 3.511,-35.62 0,-15.89 -1.148,-26.82 -3.484,-32.81 -2.336,-6.027 -5.832,-9.281 -10.52,-9.691 -0.359,-0.031 -0.714,-0.051 -1.058,-0.051 -4.34,0 -7.68,2.535 -10.01,7.625 -2.52,5.543 -3.793,17.04 -3.793,34.44 0,16.82 1.238,28.75 3.734,35.75 2.356,6.672 5.879,9.976 10.5,9.976 0.207,0 0.41,-0.008 0.621,-0.019 4.633,-0.293 8.121,-3.496 10.49,-9.602 m 17.98,3.75 c -4.117,9.707 -10.39,16.06 -18.99,19 0.867,4.449 2.176,7.441 3.922,9.019 1.351,1.211 3.433,1.821 6.222,1.821 0.805,0 1.668,-0.055 2.59,-0.157 v 13.12 l -5.961,0.782 c -1.758,0.23 -3.426,0.343 -5.004,0.343 -5.218,0 -9.445,-1.265 -12.62,-3.824 -4.207,-3.379 -7.308,-9.894 -9.297,-19.54 -9.136,-1.945 -16.26,-7.754 -21.19,-17.5 -5.004,-9.902 -7.551,-24.39 -7.551,-43.34 0,-20.43 3.484,-35.51 10.34,-45.07 5.789,-8.07 13.86,-12.04 24.02,-12.04 1.629,0 3.309,0.102 5.043,0.305 11.95,1.375 20.62,7.016 26.26,16.79 5.535,9.562 8.254,23.27 8.254,41.26 0,16.48 -2,29.45 -6.043,39.02 z M 130.4,45.91 l 11.52,1.238 0,20.21 12.96,0.914 0,12.68 -12.96,-0.598 0,46.33 c 0,4.032 0.445,6.625 1.34,7.789 0.8,1.067 2.046,1.594 3.71,1.594 0.161,0 0.329,-0.004 0.497,-0.016 2.55,-0.148 5.32,-0.933 8.343,-2.308 v 11.65 c -5.136,2.258 -10.18,3.598 -15.12,4.02 -0.718,0.055 -1.41,0.086 -2.078,0.086 -4.48,0 -7.906,-1.301 -10.25,-3.934 -2.73,-3.051 -4.09,-7.949 -4.09,-14.67 V 79.535 L 118.046,79.25 V 65.66 l 7.586,0.547 4.773,-20.3 z" />
+ <path
+ d="m 100.3,166 c 0.809,0 1.672,-0.055 2.59,-0.157 H 98.054 C 98.73,165.949 99.507,166 100.3,166 z"
+ style="fill:#006225"
+ id="path19" />
+ <path
+ id="path21"
+ style="fill:#006225"
+ d="m 84.85,63.98 c 2.336,5.997 3.484,16.92 3.484,32.81 0,17.7 -1.16,29.57 -3.512,35.62 -1.894,4.879 -4.527,7.902 -7.863,9.07 0.965,0.368 1.992,0.551 3.078,0.551 0.207,0 0.41,-0.008 0.621,-0.019 4.633,-0.293 8.121,-3.496 10.49,-9.602 2.351,-6.051 3.511,-17.91 3.511,-35.62 0,-15.89 -1.148,-26.82 -3.484,-32.81 -2.336,-6.027 -5.832,-9.281 -10.52,-9.691 -0.359,-0.031 -0.714,-0.051 -1.058,-0.051 -1.09,0 -2.117,0.16 -3.082,0.481 h -0.004 c 3.601,1.121 6.379,4.215 8.336,9.261 z m -2.344,114.3 c -0.113,-0.05 -0.227,-0.105 -0.336,-0.16 -0.012,-0.004 -0.023,-0.012 -0.035,-0.015 -0.102,-0.051 -0.207,-0.106 -0.309,-0.157 -0.019,-0.011 -0.039,-0.019 -0.058,-0.031 -0.09,-0.051 -0.184,-0.098 -0.278,-0.148 -0.027,-0.016 -0.054,-0.036 -0.086,-0.051 -0.082,-0.043 -0.164,-0.09 -0.242,-0.137 -0.039,-0.023 -0.078,-0.047 -0.113,-0.07 -0.07,-0.039 -0.145,-0.082 -0.215,-0.125 -0.047,-0.031 -0.094,-0.059 -0.14,-0.09 -0.059,-0.039 -0.118,-0.074 -0.176,-0.113 -0.059,-0.039 -0.114,-0.075 -0.168,-0.114 -0.051,-0.031 -0.102,-0.066 -0.149,-0.097 -0.066,-0.047 -0.132,-0.094 -0.195,-0.137 -0.039,-0.027 -0.078,-0.055 -0.113,-0.082 -0.078,-0.055 -0.153,-0.113 -0.231,-0.172 -0.023,-0.016 -0.05,-0.035 -0.078,-0.055 -0.098,-0.078 -0.199,-0.156 -0.297,-0.234 -4.207,-3.379 -7.308,-9.894 -9.297,-19.54 -9.136,-1.945 -16.26,-7.754 -21.19,-17.5 -5.004,-9.902 -7.551,-24.39 -7.551,-43.34 0,-20.43 3.484,-35.51 10.34,-45.07 5.789,-8.07 13.86,-12.04 24.02,-12.04 h -6.351 c -10.15,0.008 -18.22,3.977 -24,12.04 -6.855,9.563 -10.34,24.64 -10.34,45.07 0,18.95 2.547,33.44 7.551,43.34 4.934,9.75 12.05,15.56 21.19,17.5 1.989,9.641 5.09,16.16 9.297,19.54 3.176,2.559 7.403,3.824 12.62,3.824 0.098,0 0.199,0 0.297,-0.004 h 5.539 c -3.406,-0.05 -6.383,-0.66 -8.906,-1.828 L 82.498,178.28 z M 128.4,145.6 c -2.73,-3.051 -4.09,-7.949 -4.09,-14.67 V 79.57 l -6.226,-0.285 v -13.59 h -6.016 v 3.035 c 0.871,3.273 1.555,6.82 2.063,10.64 l 4.164,0.192 v 51.36 c 0,6.723 1.367,11.62 4.09,14.67 2.343,2.633 5.765,3.934 10.25,3.934 h 6.015 c -4.48,0 -7.906,-1.301 -10.25,-3.934 z m 2.043,-99.66 -6.016,0 -4.668,19.88 5.911,0.422 4.773,-20.3 z" />
+ </g>
+</svg>