80 files changed, 0 insertions, 15551 deletions
diff --git a/libopie/pim/.cvsignore b/libopie/pim/.cvsignore deleted file mode 100644 index aef62c4..0000000 --- a/libopie/pim/.cvsignore +++ b/dev/null @@ -1,2 +0,0 @@ -config.in -moc* diff --git a/libopie/pim/ABSTRACT b/libopie/pim/ABSTRACT deleted file mode 100644 index 5538d19..0000000 --- a/libopie/pim/ABSTRACT +++ b/dev/null @@ -1,18 +0,0 @@ -What is Opie PIM? Why is it special? -Why do we need Opie PIM? - -The goal of OpiePIM is to be first of all -extendable, light weight, scalable and fast. -For the programmer we try to add a nice but -powerful API to all classes. - -Memory is a costy resource on small and embedded -devices. So we try to keep the memory usage as -low as possible. Never the less we won't use structs -and Pointers in the public API. -The whole pim framework is value based. Internally we try -to use implicit sharing as found in other Qt classes as well. -This makes it possible to give 3rd party devels a nice -API while keeping the memory usage as low as possible. - -We use C++ Templates diff --git a/libopie/pim/DESIGN b/libopie/pim/DESIGN deleted file mode 100644 index bd92b1b..0000000 --- a/libopie/pim/DESIGN +++ b/dev/null @@ -1,56 +0,0 @@ -Hija to the DESIGN of our OPIE PIM stuff - -This design was firstly discussed in the train -from Frankfurt to Hannover between me (zecke ) and eilers. - -We had a look at our pim implementation and the one from -trolltech and we looked what was missing. - -GOALS: - - clean implementation - - share code - - ObjectOriented Design - - Scalable - - Integration into common solutions like STL and Qt - - Addition - - Ease of Use - -GENERAL: - - use templates - - have a common base class for all Records OPimRecord - - use references instead of pointers - - make use of QShared internally memory consumption - -We've a 'public' and 'private' part in our lib -OPimAccessTemplate is the public part. This will be used -by 3rd party developers to access the PIMs. -OPimAccessBackend is the backend. You could also call it -resource. - -Both things need to be implemented for different kind of records. -By using templates we can make sure we share code and the reason -not to use simple inheretance is that we can specialise quite easy. - -For example we have OTodoAccess : public OPimAccessTemplate<OTodo>; -the we would do -OTodoAccess::List list = otodoAccess.all(); -OTodoAccess::List::Iterator it; -for( it = list.begin(); it != list.end(); ++it ); - - -as you can see from here it just behaves like you expect from Qt or STL. - -The kewlest thing is that List and List::Iterator is free to use if you -want to implement your own OPimAccessTemplate. -You just have to sub class it and voila you're done - - -Hope you enjoy using OPIE PIM - -regards Holger 'zecke' Freyther - - - - - - diff --git a/libopie/pim/TODO b/libopie/pim/TODO deleted file mode 100644 index 9bd2789..0000000 --- a/libopie/pim/TODO +++ b/dev/null @@ -1,34 +0,0 @@ --Add XML Index ( dropped ) --Add ReadOnly Resources ( to be discussed ) --Add Sorted/Random Access mode for faster access to the base ( to be discussed ) - -Yeah Stefan you're right I need to stop the fragmentation but these are just ideas -we not to talk about. - -New Ideas Widgets: - OCategoryPopup: - Like the function Menu in Xemacs. If there are too many - Categories sort them into sub popups. A-B,B-G,H-K.... - Integrate SUbcategories - - -New Ideas on Infrastructure: - -finally switch to sqlite - -rework Category Sub Categories - -X-Ref!!!!! - -signalling ( Peer to Peer/ Backend to Backend communication of changes on a file basis ) - -Signal the User about updates. Use QSignal and make it generic push from backend - to the access. - -flocking, mmapping - -Generic Tablewidget, getting QString for a record and attribute ( generic ) like QProperty - -chooser widgets - -hierachies - -multiple backends - -public private sort public and private on backends. default backend for each if multiple - backends loaded. Move from backend to backend.. ( backend mover app? ) - -importer/exporter - -check if cache also drops - -port to BigSize Api - - ORedoManager ORedoItem both are templates to allow undoing and redoing to a level... -
\ No newline at end of file diff --git a/libopie/pim/libopie.pro b/libopie/pim/libopie.pro deleted file mode 100644 index 62f235d..0000000 --- a/libopie/pim/libopie.pro +++ b/dev/null @@ -1,64 +0,0 @@ -TEMPLATE = lib -CONFIG += qte warn_on release -HEADERS = ofontmenu.h \ - tododb.h \ - todoevent.h todoresource.h \ - todovcalresource.h xmltree.h \ - colordialog.h colorpopupmenu.h \ - oclickablelabel.h oprocctrl.h \ - oprocess.h odevice.h \ - otimepicker.h otabwidget.h \ - otabbar.h otabinfo.h \ - ofileselector/ofiledialog.h \ - ofileselector/ofilelistview.h \ - ofileselector/ofileselector.h \ - ofileselector/ofileselectoritem.h \ - ofileselector/ofileview.h \ - ofileselector/olister.h \ - ofileselector/olocallister.h \ - ofileselector/ofileselectormain.h \ - pim/opimrecord.h \ - pim/otodo.h \ - pim/orecordlist.h \ - pim/opimaccesstemplate.h \ - pim/opimaccessbackend.h \ - pim/otodoaccess.h \ - pim/otodacessbackend.h \ - pim/ocontact.h \ - pim/ocontactaccess.h \ - pim/ocontactaccessbackend.h \ - pim/ocontactaccessbackend_xml.h \ - pim/orecord.h - -SOURCES = ofontmenu.cc \ - xmltree.cc \ - tododb.cpp todoevent.cpp \ - todovcalresource.cpp colordialog.cpp \ - colorpopupmenu.cpp oclickablelabel.cpp \ - oprocctrl.cpp oprocess.cpp \ - odevice.cpp otimepicker.cpp \ - otabwidget.cpp otabbar.cpp \ - ofileselector/ofiledialog.cpp \ - ofileselector/ofilelistview.cpp \ - ofileselector/ofileselector.cpp \ - ofileselector/ofileselectoritem.cpp \ - ofileselector/ofileview.cpp \ - ofileselector/olister.cpp \ - ofileselector/olocallister.cpp \ - ofileselector/ofileselectormain.cpp \ - pim/otodo.cpp \ - pim/opimrecord.cpp \ - pim/otodoaccess.cpp \ - pim/otodoaccessbackend.cpp \ - pim/ocontact.cpp \ - pim/ocontactaccess.cpp \ - pim/orecord.cpp - -TARGET = opie -INCLUDEPATH += $(OPIEDIR)/include -DESTDIR = $(OPIEDIR)/lib$(PROJMAK) -#VERSION = 1.0.0 - -INTERFACES = otimepickerbase.ui - -include ( $(OPIEDIR)/include.pro ) diff --git a/libopie/pim/obackendfactory.h b/libopie/pim/obackendfactory.h deleted file mode 100644 index 761ab9a..0000000 --- a/libopie/pim/obackendfactory.h +++ b/dev/null @@ -1,194 +0,0 @@ -/* - * Class to manage Backends. - * - * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) - * - * ===================================================================== - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; - * either version 2 of the License, or (at your option) any later - * version. - * ===================================================================== - * ToDo: Use plugins - * ===================================================================== - * Version: $Id$ - * ===================================================================== - * History: - * $Log$ - * Revision 1.9 2003/12/22 10:19:26 eilers - * Finishing implementation of sql-backend for datebook. But I have to - * port the PIM datebook application to use it, before I could debug the - * whole stuff. - * Thus, PIM-Database backend is finished, but highly experimental. And some - * parts are still generic. For instance, the "queryByExample()" methods are - * not (or not fully) implemented. Todo: custom-entries not stored. - * The big show stopper: matchRegExp() (needed by OpieSearch) needs regular - * expression search in the database, which is not supported by sqlite ! - * Therefore we need either an extended sqlite or a workaround which would - * be very slow and memory consuming.. - * - * Revision 1.8 2003/09/22 14:31:16 eilers - * Added first experimental incarnation of sql-backend for addressbook. - * Some modifications to be able to compile the todo sql-backend. - * A lot of changes fill follow... - * - * Revision 1.7 2003/08/01 12:30:16 eilers - * Merging changes from BRANCH_1_0 to HEAD - * - * Revision 1.6.4.1 2003/06/30 14:34:19 eilers - * Patches from Zecke: - * Fixing and cleaning up extraMap handling - * Adding d_ptr for binary compatibility in the future - * - * Revision 1.6 2003/04/13 18:07:10 zecke - * More API doc - * QString -> const QString& - * QString = 0l -> QString::null - * - * Revision 1.5 2003/02/21 23:31:52 zecke - * Add XML datebookresource - * -clean up todoaccessxml header - * -implement some more stuff in the oeven tester - * -extend DefaultFactory to not crash and to use datebook - * - * -reading of OEvents is working nicely.. saving will be added - * tomorrow - * -fix spelling in ODateBookAcces - * - * Revision 1.4 2002/10/14 15:55:18 eilers - * Redeactivate SQL.. ;) - * - * Revision 1.3 2002/10/10 17:08:58 zecke - * The Cache is finally in place - * I tested it with my todolist and it 'works' for 10.000 todos the hits are awesome ;) - * The read ahead functionality does not make sense for XMLs backends because most of the stuff is already in memory. While using readahead on SQL makes things a lot faster.... - * I still have to fully implement read ahead - * This change is bic but sc - * - * Revision 1.2 2002/10/08 09:27:36 eilers - * Fixed libopie.pro to include the new pim-API. - * The SQL-Stuff is currently deactivated. Otherwise everyone who wants to - * compile itself would need to install libsqlite, libopiesql... - * Therefore, the backend currently uses XML only.. - * - * Revision 1.1 2002/10/07 17:35:01 eilers - * added OBackendFactory for advanced backend access - * - * - * ===================================================================== - */ -#ifndef OPIE_BACKENDFACTORY_H_ -#define OPIE_BACKENDFACTORY_H_ - -#include <qstring.h> -#include <qasciidict.h> -#include <qpe/config.h> - -#include "otodoaccessxml.h" -#include "ocontactaccessbackend_xml.h" -#include "odatebookaccessbackend_xml.h" - -#ifdef __USE_SQL -#include "otodoaccesssql.h" -#include "ocontactaccessbackend_sql.h" -#include "odatebookaccessbackend_sql.h" -#endif - -class OBackendPrivate; - -/** - * This class is our factory. It will give us the default implementations - * of at least Todolist, Contacts and Datebook. In the future this class will - * allow users to switch the backend with ( XML->SQLite ) without the need - * to recompile.# - * This class as the whole PIM Api is making use of templates - * - * <pre> - * OTodoAccessBackend* backend = OBackEndFactory<OTodoAccessBackend>::Default("todo", QString::null ); - * backend->load(); - * </pre> - * - * @author Stefan Eilers - * @version 0.1 - */ -template<class T> -class OBackendFactory -{ - public: - OBackendFactory() {}; - - enum BACKENDS { - TODO, - CONTACT, - DATE - }; - - /** - * Returns a backend implementation for backendName - * @param backendName the type of the backend - * @param appName will be passed on to the backend - */ - static T* Default( const QString backendName, const QString& appName ){ - - // __asm__("int3"); - - Config config( "pimaccess" ); - config.setGroup ( backendName ); - QString backend = config.readEntry( "usebackend" ); - - qWarning("Selected backend for %s is: %s", backendName.latin1(), backend.latin1() ); - - QAsciiDict<int> dict ( 3 ); - dict.setAutoDelete ( TRUE ); - - dict.insert( "todo", new int (TODO) ); - dict.insert( "contact", new int (CONTACT) ); - dict.insert( "datebook", new int(DATE) ); - - int *find = dict[ backendName ]; - if (!find ) return 0; - - switch ( *find ){ - case TODO: -#ifdef __USE_SQL - if ( backend == "sql" ) - return (T*) new OTodoAccessBackendSQL(""); -#else - if ( backend == "sql" ) - qWarning ("OBackendFactory:: sql Backend for TODO not implemented! Using XML instead!"); -#endif - - return (T*) new OTodoAccessXML( appName ); - case CONTACT: -#ifdef __USE_SQL - if ( backend == "sql" ) - return (T*) new OContactAccessBackend_SQL(""); -#else - if ( backend == "sql" ) - qWarning ("OBackendFactory:: sql Backend for CONTACT not implemented! Using XML instead!"); -#endif - - return (T*) new OContactAccessBackend_XML( appName ); - case DATE: -#ifdef __USE_SQL - if ( backend == "sql" ) - return (T*) new ODateBookAccessBackend_SQL(""); -#else - if ( backend == "sql" ) - qWarning("OBackendFactory:: sql Backend for DATEBOOK not implemented! Using XML instead!"); -#endif - - return (T*) new ODateBookAccessBackend_XML( appName ); - default: - return NULL; - } - - - } - private: - OBackendPrivate* d; -}; - - -#endif diff --git a/libopie/pim/ocontact.cpp b/libopie/pim/ocontact.cpp deleted file mode 100644 index fcf3b26..0000000 --- a/libopie/pim/ocontact.cpp +++ b/dev/null @@ -1,1207 +0,0 @@ -/********************************************************************** -** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. -** Copyright (C) 2002-2003 by Stefan Eilers (eilers.stefan@epost.de) -** -** This file may be distributed and/or modified under the terms of the -** GNU General Public License version 2 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -** See http://www.trolltech.com/gpl/ for GPL licensing information. -** -** Contact info@trolltech.com if any conditions of this licensing are -** not clear to you. -** -**********************************************************************/ - -#define QTOPIA_INTERNAL_CONTACT_MRE - -#include "ocontact.h" -#include "opimresolver.h" -#include "oconversion.h" - -#include <qpe/stringutil.h> -#include <qpe/timestring.h> -#include <qpe/config.h> - -#include <qobject.h> -#include <qregexp.h> -#include <qstylesheet.h> -#include <qfileinfo.h> -#include <qmap.h> - -#include <stdio.h> - -/*! - \class Contact contact.h - \brief The Contact class holds the data of an address book entry. - - This data includes information the name of the person, contact - information, and business information such as deparment and job title. - - \ingroup qtopiaemb - \ingroup qtopiadesktop -*/ - - -/*! - Creates a new, empty contact. -*/ -OContact::OContact() - : OPimRecord(), mMap(), d( 0 ) -{ -} - -/*! - \internal - Creates a new contact. The properties of the contact are - set from \a fromMap. -*/ -OContact::OContact( const QMap<int, QString> &fromMap ) : - OPimRecord(), mMap( fromMap ), d( 0 ) -{ - QString cats = mMap[ Qtopia::AddressCategory ]; - if ( !cats.isEmpty() ) - setCategories( idsFromString( cats ) ); - - QString uidStr = find( Qtopia::AddressUid ); - - if ( uidStr.isEmpty() || (uidStr.toInt() == 0) ){ - qWarning( "Invalid UID found. Generate new one.." ); - setUid( uidGen().generate() ); - }else - setUid( uidStr.toInt() ); - -// if ( !uidStr.isEmpty() ) -// setUid( uidStr.toInt() ); -} - -/*! - Destroys a contact. -*/ -OContact::~OContact() -{ -} - -/*! \fn void OContact::setTitle( const QString &str ) - Sets the title of the contact to \a str. -*/ - -/*! \fn void OContact::setFirstName( const QString &str ) - Sets the first name of the contact to \a str. -*/ - -/*! \fn void OContact::setMiddleName( const QString &str ) - Sets the middle name of the contact to \a str. -*/ - -/*! \fn void OContact::setLastName( const QString &str ) - Sets the last name of the contact to \a str. -*/ - -/*! \fn void OContact::setSuffix( const QString &str ) - Sets the suffix of the contact to \a str. -*/ - -/*! \fn void OContact::setFileAs( const QString &str ) - Sets the contact to filed as \a str. -*/ - -/*! \fn void OContact::setDefaultEmail( const QString &str ) - Sets the default email of the contact to \a str. -*/ - -/*! \fn void OContact::setHomeStreet( const QString &str ) - Sets the home street address of the contact to \a str. -*/ - -/*! \fn void OContact::setHomeCity( const QString &str ) - Sets the home city of the contact to \a str. -*/ - -/*! \fn void OContact::setHomeState( const QString &str ) - Sets the home state of the contact to \a str. -*/ - -/*! \fn void OContact::setHomeZip( const QString &str ) - Sets the home zip code of the contact to \a str. -*/ - -/*! \fn void OContact::setHomeCountry( const QString &str ) - Sets the home country of the contact to \a str. -*/ - -/*! \fn void OContact::setHomePhone( const QString &str ) - Sets the home phone number of the contact to \a str. -*/ - -/*! \fn void OContact::setHomeFax( const QString &str ) - Sets the home fax number of the contact to \a str. -*/ - -/*! \fn void OContact::setHomeMobile( const QString &str ) - Sets the home mobile phone number of the contact to \a str. -*/ - -/*! \fn void OContact::setHomeWebpage( const QString &str ) - Sets the home webpage of the contact to \a str. -*/ - -/*! \fn void OContact::setCompany( const QString &str ) - Sets the company for contact to \a str. -*/ - -/*! \fn void OContact::setJobTitle( const QString &str ) - Sets the job title of the contact to \a str. -*/ - -/*! \fn void OContact::setDepartment( const QString &str ) - Sets the department for contact to \a str. -*/ - -/*! \fn void OContact::setOffice( const QString &str ) - Sets the office for contact to \a str. -*/ - -/*! \fn void OContact::setBusinessStreet( const QString &str ) - Sets the business street address of the contact to \a str. -*/ - -/*! \fn void OContact::setBusinessCity( const QString &str ) - Sets the business city of the contact to \a str. -*/ - -/*! \fn void OContact::setBusinessState( const QString &str ) - Sets the business state of the contact to \a str. -*/ - -/*! \fn void OContact::setBusinessZip( const QString &str ) - Sets the business zip code of the contact to \a str. -*/ - -/*! \fn void OContact::setBusinessCountry( const QString &str ) - Sets the business country of the contact to \a str. -*/ - -/*! \fn void OContact::setBusinessPhone( const QString &str ) - Sets the business phone number of the contact to \a str. -*/ - -/*! \fn void OContact::setBusinessFax( const QString &str ) - Sets the business fax number of the contact to \a str. -*/ - -/*! \fn void OContact::setBusinessMobile( const QString &str ) - Sets the business mobile phone number of the contact to \a str. -*/ - -/*! \fn void OContact::setBusinessPager( const QString &str ) - Sets the business pager number of the contact to \a str. -*/ - -/*! \fn void OContact::setBusinessWebpage( const QString &str ) - Sets the business webpage of the contact to \a str. -*/ - -/*! \fn void OContact::setProfession( const QString &str ) - Sets the profession of the contact to \a str. -*/ - -/*! \fn void OContact::setAssistant( const QString &str ) - Sets the assistant of the contact to \a str. -*/ - -/*! \fn void OContact::setManager( const QString &str ) - Sets the manager of the contact to \a str. -*/ - -/*! \fn void OContact::setSpouse( const QString &str ) - Sets the spouse of the contact to \a str. -*/ - -/*! \fn void OContact::setGender( const QString &str ) - Sets the gender of the contact to \a str. -*/ - -/*! \fn void OContact::setNickname( const QString &str ) - Sets the nickname of the contact to \a str. -*/ - -/*! \fn void OContact::setNotes( const QString &str ) - Sets the notes about the contact to \a str. -*/ - -/*! \fn QString OContact::title() const - Returns the title of the contact. -*/ - -/*! \fn QString OContact::firstName() const - Returns the first name of the contact. -*/ - -/*! \fn QString OContact::middleName() const - Returns the middle name of the contact. -*/ - -/*! \fn QString OContact::lastName() const - Returns the last name of the contact. -*/ - -/*! \fn QString OContact::suffix() const - Returns the suffix of the contact. -*/ - -/*! \fn QString OContact::fileAs() const - Returns the string the contact is filed as. -*/ - -/*! \fn QString OContact::defaultEmail() const - Returns the default email address of the contact. -*/ - -/*! \fn QString OContact::emails() const - Returns the list of email address for a contact separated by ';'s in a single - string. -*/ - -/*! \fn QString OContact::homeStreet() const - Returns the home street address of the contact. -*/ - -/*! \fn QString OContact::homeCity() const - Returns the home city of the contact. -*/ - -/*! \fn QString OContact::homeState() const - Returns the home state of the contact. -*/ - -/*! \fn QString OContact::homeZip() const - Returns the home zip of the contact. -*/ - -/*! \fn QString OContact::homeCountry() const - Returns the home country of the contact. -*/ - -/*! \fn QString OContact::homePhone() const - Returns the home phone number of the contact. -*/ - -/*! \fn QString OContact::homeFax() const - Returns the home fax number of the contact. -*/ - -/*! \fn QString OContact::homeMobile() const - Returns the home mobile number of the contact. -*/ - -/*! \fn QString OContact::homeWebpage() const - Returns the home webpage of the contact. -*/ - -/*! \fn QString OContact::company() const - Returns the company for the contact. -*/ - -/*! \fn QString OContact::department() const - Returns the department for the contact. -*/ - -/*! \fn QString OContact::office() const - Returns the office for the contact. -*/ - -/*! \fn QString OContact::jobTitle() const - Returns the job title of the contact. -*/ - -/*! \fn QString OContact::profession() const - Returns the profession of the contact. -*/ - -/*! \fn QString OContact::assistant() const - Returns the assistant of the contact. -*/ - -/*! \fn QString OContact::manager() const - Returns the manager of the contact. -*/ - -/*! \fn QString OContact::businessStreet() const - Returns the business street address of the contact. -*/ - -/*! \fn QString OContact::businessCity() const - Returns the business city of the contact. -*/ - -/*! \fn QString OContact::businessState() const - Returns the business state of the contact. -*/ - -/*! \fn QString OContact::businessZip() const - Returns the business zip of the contact. -*/ - -/*! \fn QString OContact::businessCountry() const - Returns the business country of the contact. -*/ - -/*! \fn QString OContact::businessPhone() const - Returns the business phone number of the contact. -*/ - -/*! \fn QString OContact::businessFax() const - Returns the business fax number of the contact. -*/ - -/*! \fn QString OContact::businessMobile() const - Returns the business mobile number of the contact. -*/ - -/*! \fn QString OContact::businessPager() const - Returns the business pager number of the contact. -*/ - -/*! \fn QString OContact::businessWebpage() const - Returns the business webpage of the contact. -*/ - -/*! \fn QString OContact::spouse() const - Returns the spouse of the contact. -*/ - -/*! \fn QString OContact::gender() const - Returns the gender of the contact. -*/ - -/*! \fn QString OContact::nickname() const - Returns the nickname of the contact. -*/ - -/*! \fn QString OContact::children() const - Returns the children of the contact. -*/ - -/*! \fn QString OContact::notes() const - Returns the notes relating to the the contact. -*/ - -/*! \fn QString OContact::groups() const - \internal - Returns the groups for the contact. -*/ - -/*! \fn QStringList OContact::groupList() const - \internal -*/ - -/*! \fn QString OContact::field(int) const - \internal -*/ - -/*! \fn void OContact::saveJournal( journal_action, const QString & = QString::null ) - \internal -*/ - -/*! \fn void OContact::setUid( int id ) - \internal - Sets the uid for this record to \a id. -*/ - -/*! \enum OContact::journal_action - \internal -*/ - -/*! - \internal -*/ -QMap<int, QString> OContact::toMap() const -{ - QMap<int, QString> map = mMap; - QString cats = idsToString( categories() ); - if ( !cats.isEmpty() ) - map.insert( Qtopia::AddressCategory, cats ); - return map; -} - -/*! - Returns a rich text formatted QString representing the contents the contact. -*/ -QString OContact::toRichText() const -{ - QString text; - QString value, comp, state; - QString str; - bool marker = false; - - Config cfg("qpe"); - cfg.setGroup("Appearance"); - int addressformat = cfg.readNumEntry( "AddressFormat", Zip_City_State ); - - // name, jobtitle and company - if ( !(value = fullName()).isEmpty() ) - text += "<b><h3><img src=\"addressbook/AddressBook\"> " + Qtopia::escapeString(value) + "</h3></b>"; - - if ( !(value = jobTitle()).isEmpty() ) - text += Qtopia::escapeString(value) + " "; - - comp = company(); - if ( !(value = department()).isEmpty() ) { - text += Qtopia::escapeString(value); - if ( comp ) - text += ", " + Qtopia::escapeString(comp); - }else if ( comp ) - text += "<br>" + Qtopia::escapeString(comp); - text += "<br><hr>"; - - // defailt email - QString defEmail = defaultEmail(); - if ( !defEmail.isEmpty() ){ - text += "<b><img src=\"addressbook/email\"> " + QObject::tr("Default Email: ") + "</b>" - + Qtopia::escapeString(defEmail); - marker = true; - } - - // business address - if ( !businessStreet().isEmpty() || !businessCity().isEmpty() || - !businessZip().isEmpty() || !businessCountry().isEmpty() ) { - text += QObject::tr( "<br><b>Work Address:</b>" ); - marker = true; - } - - if ( !(value = businessStreet()).isEmpty() ){ - text += "<br>" + Qtopia::escapeString(value); - marker = true; - } - - switch( addressformat ){ - case Zip_City_State:{ // Zip_Code City, State - state = businessState(); - if ( !(value = businessZip()).isEmpty() ){ - text += "<br>" + Qtopia::escapeString(value) + " "; - marker = true; - - } - if ( !(value = businessCity()).isEmpty() ) { - marker = true; - if ( businessZip().isEmpty() && !businessStreet().isEmpty() ) - text += "<br>"; - text += Qtopia::escapeString(value); - if ( state ) - text += ", " + Qtopia::escapeString(state); - } else if ( !state.isEmpty() ){ - text += "<br>" + Qtopia::escapeString(state); - marker = true; - } - break; - } - case City_State_Zip:{ // City, State Zip_Code - state = businessState(); - if ( !(value = businessCity()).isEmpty() ) { - marker = true; - text += "<br>" + Qtopia::escapeString(value); - if ( state ) - text += ", " + Qtopia::escapeString(state); - } else if ( !state.isEmpty() ){ - text += "<br>" + Qtopia::escapeString(state); - marker = true; - } - if ( !(value = businessZip()).isEmpty() ){ - text += " " + Qtopia::escapeString(value); - marker = true; - } - break; - } - } - - if ( !(value = businessCountry()).isEmpty() ){ - text += "<br>" + Qtopia::escapeString(value); - marker = true; - } - - // rest of Business data - str = office(); - if ( !str.isEmpty() ){ - text += "<br><b>" + QObject::tr("Office: ") + "</b>" - + Qtopia::escapeString(str); - marker = true; - } - str = businessWebpage(); - if ( !str.isEmpty() ){ - text += "<br><b><img src=\"addressbook/webpagework\"> " + QObject::tr("Business Web Page: ") + "</b>" - + Qtopia::escapeString(str); - marker = true; - } - str = businessPhone(); - if ( !str.isEmpty() ){ - text += "<br><b><img src=\"addressbook/phonework\"> " + QObject::tr("Business Phone: ") + "</b>" - + Qtopia::escapeString(str); - marker = true; - } - str = businessFax(); - if ( !str.isEmpty() ){ - text += "<br><b><img src=\"addressbook/faxwork\"> " + QObject::tr("Business Fax: ") + "</b>" - + Qtopia::escapeString(str); - marker = true; - } - str = businessMobile(); - if ( !str.isEmpty() ){ - text += "<br><b><img src=\"addressbook/mobilework\"> " + QObject::tr("Business Mobile: ") + "</b>" - + Qtopia::escapeString(str); - marker = true; - } - str = businessPager(); - if ( !str.isEmpty() ){ - text += "<br><b>" + QObject::tr("Business Pager: ") + "</b>" - + Qtopia::escapeString(str); - marker = true; - } - - // text += "<br>"; - - // home address - if ( !homeStreet().isEmpty() || !homeCity().isEmpty() || - !homeZip().isEmpty() || !homeCountry().isEmpty() ) { - text += QObject::tr( "<br><b>Home Address:</b>" ); - marker = true; - } - - if ( !(value = homeStreet()).isEmpty() ){ - text += "<br>" + Qtopia::escapeString(value); - marker = true; - } - - switch( addressformat ){ - case Zip_City_State:{ // Zip_Code City, State - state = homeState(); - if ( !(value = homeZip()).isEmpty() ){ - text += "<br>" + Qtopia::escapeString(value) + " "; - marker = true; - } - if ( !(value = homeCity()).isEmpty() ) { - marker = true; - if ( homeZip().isEmpty() && !homeStreet().isEmpty() ) - text += "<br>"; - text += Qtopia::escapeString(value); - if ( !state.isEmpty() ) - text += ", " + Qtopia::escapeString(state); - } else if (!state.isEmpty()) { - text += "<br>" + Qtopia::escapeString(state); - marker = true; - } - break; - } - case City_State_Zip:{ // City, State Zip_Code - state = homeState(); - if ( !(value = homeCity()).isEmpty() ) { - marker = true; - text += "<br>" + Qtopia::escapeString(value); - if ( state ) - text += ", " + Qtopia::escapeString(state); - } else if ( !state.isEmpty() ){ - text += "<br>" + Qtopia::escapeString(state); - marker = true; - } - if ( !(value = homeZip()).isEmpty() ){ - text += " " + Qtopia::escapeString(value); - marker = true; - } - break; - } - } - - if ( !(value = homeCountry()).isEmpty() ){ - text += "<br>" + Qtopia::escapeString(value); - marker = true; - } - - // rest of Home data - str = homeWebpage(); - if ( !str.isEmpty() ){ - text += "<br><b><img src=\"addressbook/webpagehome\"> " + QObject::tr("Home Web Page: ") + "</b>" - + Qtopia::escapeString(str); - marker = true; - } - str = homePhone(); - if ( !str.isEmpty() ){ - text += "<br><b><img src=\"addressbook/phonehome\"> " + QObject::tr("Home Phone: ") + "</b>" - + Qtopia::escapeString(str); - marker = true; - } - str = homeFax(); - if ( !str.isEmpty() ){ - text += "<br><b><img src=\"addressbook/faxhome\"> " + QObject::tr("Home Fax: ") + "</b>" - + Qtopia::escapeString(str); - marker = true; - } - str = homeMobile(); - if ( !str.isEmpty() ){ - text += "<br><b><img src=\"addressbook/mobilehome\"> " + QObject::tr("Home Mobile: ") + "</b>" - + Qtopia::escapeString(str); - marker = true; - } - - if ( marker ) - text += "<br><hr>"; - - // the rest... - str = emails(); - if ( !str.isEmpty() && ( str != defEmail ) ) - text += "<br><b>" + QObject::tr("All Emails: ") + "</b>" - + Qtopia::escapeString(str); - str = profession(); - if ( !str.isEmpty() ) - text += "<br><b>" + QObject::tr("Profession: ") + "</b>" - + Qtopia::escapeString(str); - str = assistant(); - if ( !str.isEmpty() ) - text += "<br><b>" + QObject::tr("Assistant: ") + "</b>" - + Qtopia::escapeString(str); - str = manager(); - if ( !str.isEmpty() ) - text += "<br><b>" + QObject::tr("Manager: ") + "</b>" - + Qtopia::escapeString(str); - str = gender(); - if ( !str.isEmpty() && str.toInt() != 0 ) { - text += "<br>"; - if ( str.toInt() == 1 ) - str = QObject::tr( "Male" ); - else if ( str.toInt() == 2 ) - str = QObject::tr( "Female" ); - text += "<b>" + QObject::tr("Gender: ") + "</b>" + str; - } - str = spouse(); - if ( !str.isEmpty() ) - text += "<br><b>" + QObject::tr("Spouse: ") + "</b>" - + Qtopia::escapeString(str); - if ( birthday().isValid() ){ - str = TimeString::numberDateString( birthday() ); - text += "<br><b>" + QObject::tr("Birthday: ") + "</b>" - + Qtopia::escapeString(str); - } - if ( anniversary().isValid() ){ - str = TimeString::numberDateString( anniversary() ); - text += "<br><b>" + QObject::tr("Anniversary: ") + "</b>" - + Qtopia::escapeString(str); - } - str = children(); - if ( !str.isEmpty() ) - text += "<br><b>" + QObject::tr("Children: ") + "</b>" - + Qtopia::escapeString(str); - - str = nickname(); - if ( !str.isEmpty() ) - text += "<br><b>" + QObject::tr("Nickname: ") + "</b>" - + Qtopia::escapeString(str); - - // categories - if ( categoryNames("Contacts").count() ){ - text += "<br><b>" + QObject::tr( "Category:") + "</b> "; - text += categoryNames("Contacts").join(", "); - } - - // notes last - if ( !(value = notes()).isEmpty() ) { - text += "<br><hr><b>" + QObject::tr( "Notes:") + "</b> "; - QRegExp reg("\n"); - - //QString tmp = Qtopia::escapeString(value); - QString tmp = QStyleSheet::convertFromPlainText(value); - //tmp.replace( reg, "<br>" ); - text += "<br>" + tmp + "<br>"; - } - return text; -} - -/*! - \internal -*/ -void OContact::insert( int key, const QString &v ) -{ - QString value = v.stripWhiteSpace(); - if ( value.isEmpty() ) - mMap.remove( key ); - else - mMap.insert( key, value ); -} - -/*! - \internal -*/ -void OContact::replace( int key, const QString & v ) -{ - QString value = v.stripWhiteSpace(); - if ( value.isEmpty() ) - mMap.remove( key ); - else - mMap.replace( key, value ); -} - -/*! - \internal -*/ -QString OContact::find( int key ) const -{ - return mMap[key]; -} - -/*! - \internal -*/ -QString OContact::displayAddress( const QString &street, - const QString &city, - const QString &state, - const QString &zip, - const QString &country ) const -{ - QString s = street; - if ( !street.isEmpty() ) - s+= "\n"; - s += city; - if ( !city.isEmpty() && !state.isEmpty() ) - s += ", "; - s += state; - if ( !state.isEmpty() && !zip.isEmpty() ) - s += " "; - s += zip; - if ( !country.isEmpty() && !s.isEmpty() ) - s += "\n"; - s += country; - return s; -} - -/*! - \internal -*/ -QString OContact::displayBusinessAddress() const -{ - return displayAddress( businessStreet(), businessCity(), - businessState(), businessZip(), - businessCountry() ); -} - -/*! - \internal -*/ -QString OContact::displayHomeAddress() const -{ - return displayAddress( homeStreet(), homeCity(), - homeState(), homeZip(), - homeCountry() ); -} - -/*! - Returns the full name of the contact -*/ -QString OContact::fullName() const -{ - QString title = find( Qtopia::Title ); - QString firstName = find( Qtopia::FirstName ); - QString middleName = find( Qtopia::MiddleName ); - QString lastName = find( Qtopia::LastName ); - QString suffix = find( Qtopia::Suffix ); - - QString name = title; - if ( !firstName.isEmpty() ) { - if ( !name.isEmpty() ) - name += " "; - name += firstName; - } - if ( !middleName.isEmpty() ) { - if ( !name.isEmpty() ) - name += " "; - name += middleName; - } - if ( !lastName.isEmpty() ) { - if ( !name.isEmpty() ) - name += " "; - name += lastName; - } - if ( !suffix.isEmpty() ) { - if ( !name.isEmpty() ) - name += " "; - name += suffix; - } - return name.simplifyWhiteSpace(); -} - -/*! - Returns a list of the names of the children of the contact. -*/ -QStringList OContact::childrenList() const -{ - return QStringList::split( " ", find( Qtopia::Children ) ); -} - -/*! \fn void OContact::insertEmail( const QString &email ) - - Insert \a email into the email list. Ensures \a email can only be added - once. If there is no default email address set, it sets it to the \a email. -*/ - -/*! \fn void OContact::removeEmail( const QString &email ) - - Removes the \a email from the email list. If the default email was \a email, - then the default email address is assigned to the first email in the - email list -*/ - -/*! \fn void OContact::clearEmails() - - Clears the email list. - */ - -/*! \fn void OContact::insertEmails( const QStringList &emailList ) - - Appends the \a emailList to the exiting email list - */ - -/*! - Returns a list of email addresses belonging to the contact, including - the default email address. -*/ -QStringList OContact::emailList() const -{ - QString emailStr = emails(); - - QStringList r; - if ( !emailStr.isEmpty() ) { - qDebug(" emailstr "); - QStringList l = QStringList::split( emailSeparator(), emailStr ); - for ( QStringList::ConstIterator it = l.begin();it != l.end();++it ) - r += (*it).simplifyWhiteSpace(); - } - - return r; -} - -/*! - \overload - - Generates the string for the contact to be filed as from the first, - middle and last name of the contact. -*/ -void OContact::setFileAs() -{ - QString lastName, firstName, middleName, fileas; - - lastName = find( Qtopia::LastName ); - firstName = find( Qtopia::FirstName ); - middleName = find( Qtopia::MiddleName ); - if ( !lastName.isEmpty() && !firstName.isEmpty() - && !middleName.isEmpty() ) - fileas = lastName + ", " + firstName + " " + middleName; - else if ( !lastName.isEmpty() && !firstName.isEmpty() ) - fileas = lastName + ", " + firstName; - else if ( !lastName.isEmpty() || !firstName.isEmpty() || - !middleName.isEmpty() ) - fileas = firstName + ( firstName.isEmpty() ? "" : " " ) - + middleName + ( middleName.isEmpty() ? "" : " " ) - + lastName; - - replace( Qtopia::FileAs, fileas ); -} - -/*! - \internal - Appends the contact information to \a buf. -*/ -void OContact::save( QString &buf ) const -{ - static const QStringList SLFIELDS = fields(); - // I'm expecting "<Contact " in front of this... - for ( QMap<int, QString>::ConstIterator it = mMap.begin(); - it != mMap.end(); ++it ) { - const QString &value = it.data(); - int key = it.key(); - if ( !value.isEmpty() ) { - if ( key == Qtopia::AddressCategory || key == Qtopia::AddressUid) - continue; - - key -= Qtopia::AddressCategory+1; - buf += SLFIELDS[key]; - buf += "=\"" + Qtopia::escapeString(value) + "\" "; - } - } - buf += customToXml(); - if ( categories().count() > 0 ) - buf += "Categories=\"" + idsToString( categories() ) + "\" "; - buf += "Uid=\"" + QString::number( uid() ) + "\" "; - // You need to close this yourself -} - - -/*! - \internal - Returns the list of fields belonging to a contact - Never change order of this list ! It has to be regarding - enum AddressBookFields !! -*/ -QStringList OContact::fields() -{ - QStringList list; - - list.append( "Title" ); // Not Used! - list.append( "FirstName" ); - list.append( "MiddleName" ); - list.append( "LastName" ); - list.append( "Suffix" ); - list.append( "FileAs" ); - - list.append( "JobTitle" ); - list.append( "Department" ); - list.append( "Company" ); - list.append( "BusinessPhone" ); - list.append( "BusinessFax" ); - list.append( "BusinessMobile" ); - - list.append( "DefaultEmail" ); - list.append( "Emails" ); - - list.append( "HomePhone" ); - list.append( "HomeFax" ); - list.append( "HomeMobile" ); - - list.append( "BusinessStreet" ); - list.append( "BusinessCity" ); - list.append( "BusinessState" ); - list.append( "BusinessZip" ); - list.append( "BusinessCountry" ); - list.append( "BusinessPager" ); - list.append( "BusinessWebPage" ); - - list.append( "Office" ); - list.append( "Profession" ); - list.append( "Assistant" ); - list.append( "Manager" ); - - list.append( "HomeStreet" ); - list.append( "HomeCity" ); - list.append( "HomeState" ); - list.append( "HomeZip" ); - list.append( "HomeCountry" ); - list.append( "HomeWebPage" ); - - list.append( "Spouse" ); - list.append( "Gender" ); - list.append( "Birthday" ); - list.append( "Anniversary" ); - list.append( "Nickname" ); - list.append( "Children" ); - - list.append( "Notes" ); - list.append( "Groups" ); - - return list; -} - - -/*! - Sets the list of email address for contact to those contained in \a str. - Email address should be separated by ';'s. -*/ -void OContact::setEmails( const QString &str ) -{ - replace( Qtopia::Emails, str ); - if ( str.isEmpty() ) - setDefaultEmail( QString::null ); -} - -/*! - Sets the list of children for the contact to those contained in \a str. -*/ -void OContact::setChildren( const QString &str ) -{ - replace( Qtopia::Children, str ); -} - -/*! - \overload - Returns TRUE if the contact matches the regular expression \a regexp. - Otherwise returns FALSE. -*/ -bool OContact::match( const QRegExp &r ) const -{ - setLastHitField( -1 ); - bool match; - match = false; - QMap<int, QString>::ConstIterator it; - for ( it = mMap.begin(); it != mMap.end(); ++it ) { - if ( (*it).find( r ) > -1 ) { - setLastHitField( it.key() ); - match = true; - break; - } - } - return match; -} - - -QString OContact::toShortText() const -{ - return ( fullName() ); -} -QString OContact::type() const -{ - return QString::fromLatin1( "OContact" ); -} - - - -class QString OContact::recordField( int pos ) const -{ - QStringList SLFIELDS = fields(); // ?? why this ? (se) - return SLFIELDS[pos]; -} - -// In future releases, we should store birthday and anniversary -// internally as QDate instead of QString ! -// QString is always too complicate to interprete (DD.MM.YY, DD/MM/YY, MM/DD/YY, etc..)(se) - -/*! \fn void OContact::setBirthday( const QDate& date ) - Sets the birthday for the contact to \a date. If date is null - the current stored date will be removed. -*/ -void OContact::setBirthday( const QDate &v ) -{ - if ( v.isNull() ){ - qWarning( "Remove Birthday"); - replace( Qtopia::Birthday, QString::null ); - return; - } - - if ( v.isValid() ) - replace( Qtopia::Birthday, OConversion::dateToString( v ) ); - -} - - -/*! \fn void OContact::setAnniversary( const QDate &date ) - Sets the anniversary of the contact to \a date. If date is - null, the current stored date will be removed. -*/ -void OContact::setAnniversary( const QDate &v ) -{ - if ( v.isNull() ){ - qWarning( "Remove Anniversary"); - replace( Qtopia::Anniversary, QString::null ); - return; - } - - if ( v.isValid() ) - replace( Qtopia::Anniversary, OConversion::dateToString( v ) ); -} - -/*! \fn QDate OContact::birthday() const - Returns the birthday of the contact. -*/ -QDate OContact::birthday() const -{ - QString str = find( Qtopia::Birthday ); - // qWarning ("Birthday %s", str.latin1() ); - if ( !str.isEmpty() ) - return OConversion::dateFromString ( str ); - else - return QDate(); -} - - -/*! \fn QDate OContact::anniversary() const - Returns the anniversary of the contact. -*/ -QDate OContact::anniversary() const -{ - QDate empty; - QString str = find( Qtopia::Anniversary ); - // qWarning ("Anniversary %s", str.latin1() ); - if ( !str.isEmpty() ) - return OConversion::dateFromString ( str ); - else - return empty; -} - - -void OContact::insertEmail( const QString &v ) -{ - //qDebug("insertEmail %s", v.latin1()); - QString e = v.simplifyWhiteSpace(); - QString def = defaultEmail(); - - // if no default, set it as the default email and don't insert - if ( def.isEmpty() ) { - setDefaultEmail( e ); // will insert into the list for us - return; - } - - // otherwise, insert assuming doesn't already exist - QString emailsStr = find( Qtopia::Emails ); - if ( emailsStr.contains( e )) - return; - if ( !emailsStr.isEmpty() ) - emailsStr += emailSeparator(); - emailsStr += e; - replace( Qtopia::Emails, emailsStr ); -} - -void OContact::removeEmail( const QString &v ) -{ - QString e = v.simplifyWhiteSpace(); - QString def = defaultEmail(); - QString emailsStr = find( Qtopia::Emails ); - QStringList emails = emailList(); - - // otherwise, must first contain it - if ( !emailsStr.contains( e ) ) - return; - - // remove it - //qDebug(" removing email from list %s", e.latin1()); - emails.remove( e ); - // reset the string - emailsStr = emails.join(emailSeparator()); // Sharp's brain dead separator - replace( Qtopia::Emails, emailsStr ); - - // if default, then replace the default email with the first one - if ( def == e ) { - //qDebug("removeEmail is default; setting new default"); - if ( !emails.count() ) - clearEmails(); - else // setDefaultEmail will remove e from the list - setDefaultEmail( emails.first() ); - } -} -void OContact::clearEmails() -{ - mMap.remove( Qtopia::DefaultEmail ); - mMap.remove( Qtopia::Emails ); -} -void OContact::setDefaultEmail( const QString &v ) -{ - QString e = v.simplifyWhiteSpace(); - - //qDebug("OContact::setDefaultEmail %s", e.latin1()); - replace( Qtopia::DefaultEmail, e ); - - if ( !e.isEmpty() ) - insertEmail( e ); - -} - -void OContact::insertEmails( const QStringList &v ) -{ - for ( QStringList::ConstIterator it = v.begin(); it != v.end(); ++it ) - insertEmail( *it ); -} -int OContact::rtti() { - return OPimResolver::AddressBook; -} -void OContact::setUid( int i ) -{ - OPimRecord::setUid(i); - replace( Qtopia::AddressUid , QString::number(i)); -} diff --git a/libopie/pim/ocontact.h b/libopie/pim/ocontact.h deleted file mode 100644 index 1d46b81..0000000 --- a/libopie/pim/ocontact.h +++ b/dev/null @@ -1,240 +0,0 @@ -/********************************************************************** -** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. -** Copyright (C) 2002-2003 by Stefan Eilers (eilers.stefan@epost.de) -** -** This file may be distributed and/or modified under the terms of the -** GNU General Public License version 2 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -** See http://www.trolltech.com/gpl/ for GPL licensing information. -** -** Contact info@trolltech.com if any conditions of this licensing are -** not clear to you. -** -**********************************************************************/ - -#ifndef __OCONTACT_H__ -#define __OCONTACT_H__ - -#include <opie/opimrecord.h> -#include <qpe/recordfields.h> - -#include <qdatetime.h> -#include <qstringlist.h> - -#if defined(QPC_TEMPLATEDLL) -// MOC_SKIP_BEGIN -QPC_TEMPLATEEXTERN template class QPC_EXPORT QMap<int, QString>; -// MOC_SKIP_END -#endif - -class OContactPrivate; - -/** - * OContact class represents a specialised PIM Record for contacts. - * It does store all kind of persopn related information. - * - * @short Contact Container - * @author TT, Stefan Eiler, Holger Freyther - */ -class QPC_EXPORT OContact : public OPimRecord -{ - friend class DataSet; -public: - OContact(); - OContact( const QMap<int, QString> &fromMap ); - virtual ~OContact(); - - enum DateFormat{ - Zip_City_State = 0, - City_State_Zip - }; - - /* - * do we need to inline them - * if yes do we need to inline them this way? - * -zecke - */ - void setTitle( const QString &v ) { replace( Qtopia::Title, v ); } - void setFirstName( const QString &v ) { replace( Qtopia::FirstName, v ); } - void setMiddleName( const QString &v ) { replace( Qtopia::MiddleName, v ); } - void setLastName( const QString &v ) { replace( Qtopia::LastName, v ); } - void setSuffix( const QString &v ) { replace( Qtopia::Suffix, v ); } - void setFileAs( const QString &v ) { replace( Qtopia::FileAs, v ); } - void setFileAs(); - - // default email address - void setDefaultEmail( const QString &v ); - // inserts email to list and ensure's doesn't already exist - void insertEmail( const QString &v ); - void removeEmail( const QString &v ); - void clearEmails(); - void insertEmails( const QStringList &v ); - - // home - void setHomeStreet( const QString &v ) { replace( Qtopia::HomeStreet, v ); } - void setHomeCity( const QString &v ) { replace( Qtopia::HomeCity, v ); } - void setHomeState( const QString &v ) { replace( Qtopia::HomeState, v ); } - void setHomeZip( const QString &v ) { replace( Qtopia::HomeZip, v ); } - void setHomeCountry( const QString &v ) { replace( Qtopia::HomeCountry, v ); } - void setHomePhone( const QString &v ) { replace( Qtopia::HomePhone, v ); } - void setHomeFax( const QString &v ) { replace( Qtopia::HomeFax, v ); } - void setHomeMobile( const QString &v ) { replace( Qtopia::HomeMobile, v ); } - void setHomeWebpage( const QString &v ) { replace( Qtopia::HomeWebPage, v ); } - - // business - void setCompany( const QString &v ) { replace( Qtopia::Company, v ); } - void setBusinessStreet( const QString &v ) { replace( Qtopia::BusinessStreet, v ); } - void setBusinessCity( const QString &v ) { replace( Qtopia::BusinessCity, v ); } - void setBusinessState( const QString &v ) { replace( Qtopia::BusinessState, v ); } - void setBusinessZip( const QString &v ) { replace( Qtopia::BusinessZip, v ); } - void setBusinessCountry( const QString &v ) { replace( Qtopia::BusinessCountry, v ); } - void setBusinessWebpage( const QString &v ) { replace( Qtopia::BusinessWebPage, v ); } - void setJobTitle( const QString &v ) { replace( Qtopia::JobTitle, v ); } - void setDepartment( const QString &v ) { replace( Qtopia::Department, v ); } - void setOffice( const QString &v ) { replace( Qtopia::Office, v ); } - void setBusinessPhone( const QString &v ) { replace( Qtopia::BusinessPhone, v ); } - void setBusinessFax( const QString &v ) { replace( Qtopia::BusinessFax, v ); } - void setBusinessMobile( const QString &v ) { replace( Qtopia::BusinessMobile, v ); } - void setBusinessPager( const QString &v ) { replace( Qtopia::BusinessPager, v ); } - void setProfession( const QString &v ) { replace( Qtopia::Profession, v ); } - void setAssistant( const QString &v ) { replace( Qtopia::Assistant, v ); } - void setManager( const QString &v ) { replace( Qtopia::Manager, v ); } - - // personal - void setSpouse( const QString &v ) { replace( Qtopia::Spouse, v ); } - void setGender( const QString &v ) { replace( Qtopia::Gender, v ); } - void setBirthday( const QDate &v ); - void setAnniversary( const QDate &v ); - void setNickname( const QString &v ) { replace( Qtopia::Nickname, v ); } - void setChildren( const QString &v ); - - // other - void setNotes( const QString &v ) { replace( Qtopia::Notes, v); } - - virtual bool match( const QRegExp ®exp ) const; - -// // custom -// void setCustomField( const QString &key, const QString &v ) -// { replace(Custom- + key, v ); } - - // name - QString fullName() const; - QString title() const { return find( Qtopia::Title ); } - QString firstName() const { return find( Qtopia::FirstName ); } - QString middleName() const { return find( Qtopia::MiddleName ); } - QString lastName() const { return find( Qtopia::LastName ); } - QString suffix() const { return find( Qtopia::Suffix ); } - QString fileAs() const { return find( Qtopia::FileAs ); } - - // email - QString defaultEmail() const { return find( Qtopia::DefaultEmail ); } - QStringList emailList() const; - - // home - /* - * OPimAddress address(enum Location)const; - * would be some how nicer... - * -zecke - */ - QString homeStreet() const { return find( Qtopia::HomeStreet ); } - QString homeCity() const { return find( Qtopia::HomeCity ); } - QString homeState() const { return find( Qtopia::HomeState ); } - QString homeZip() const { return find( Qtopia::HomeZip ); } - QString homeCountry() const { return find( Qtopia::HomeCountry ); } - QString homePhone() const { return find( Qtopia::HomePhone ); } - QString homeFax() const { return find( Qtopia::HomeFax ); } - QString homeMobile() const { return find( Qtopia::HomeMobile ); } - QString homeWebpage() const { return find( Qtopia::HomeWebPage ); } - /** Multi line string containing all non-empty address info in the form - * Street - * City, State Zip - * Country - */ - QString displayHomeAddress() const; - - // business - QString company() const { return find( Qtopia::Company ); } - QString businessStreet() const { return find( Qtopia::BusinessStreet ); } - QString businessCity() const { return find( Qtopia::BusinessCity ); } - QString businessState() const { return find( Qtopia::BusinessState ); } - QString businessZip() const { return find( Qtopia::BusinessZip ); } - QString businessCountry() const { return find( Qtopia::BusinessCountry ); } - QString businessWebpage() const { return find( Qtopia::BusinessWebPage ); } - QString jobTitle() const { return find( Qtopia::JobTitle ); } - QString department() const { return find( Qtopia::Department ); } - QString office() const { return find( Qtopia::Office ); } - QString businessPhone() const { return find( Qtopia::BusinessPhone ); } - QString businessFax() const { return find( Qtopia::BusinessFax ); } - QString businessMobile() const { return find( Qtopia::BusinessMobile ); } - QString businessPager() const { return find( Qtopia::BusinessPager ); } - QString profession() const { return find( Qtopia::Profession ); } - QString assistant() const { return find( Qtopia::Assistant ); } - QString manager() const { return find( Qtopia::Manager ); } - /** Multi line string containing all non-empty address info in the form - * Street - * City, State Zip - * Country - */ - QString displayBusinessAddress() const; - - //personal - QString spouse() const { return find( Qtopia::Spouse ); } - QString gender() const { return find( Qtopia::Gender ); } - QDate birthday() const; - QDate anniversary() const; - QString nickname() const { return find( Qtopia::Nickname ); } - QString children() const { return find( Qtopia::Children ); } - QStringList childrenList() const; - - // other - QString notes() const { return find( Qtopia::Notes ); } - QString groups() const { return find( Qtopia::Groups ); } - QStringList groupList() const; - - QString toRichText() const; - QMap<int, QString> toMap() const; - QString field( int key ) const { return find( key ); } - - - void setUid( int i ); - - QString toShortText()const; - QString type()const; - class QString recordField(int) const; - - // Why private ? (eilers,se) - QString emailSeparator() const { return " "; } - - // the emails should be seperated by a comma - void setEmails( const QString &v ); - QString emails() const { return find( Qtopia::Emails ); } - static int rtti(); - -private: - // The XML Backend needs some access to the private functions - friend class OContactAccessBackend_XML; - - void insert( int key, const QString &value ); - void replace( int key, const QString &value ); - QString find( int key ) const; - static QStringList fields(); - - void save( QString &buf ) const; - - QString displayAddress( const QString &street, - const QString &city, - const QString &state, - const QString &zip, - const QString &country ) const; - - QMap<int, QString> mMap; - OContactPrivate *d; -}; - - -#endif diff --git a/libopie/pim/ocontactaccess.cpp b/libopie/pim/ocontactaccess.cpp deleted file mode 100644 index bc359f7..0000000 --- a/libopie/pim/ocontactaccess.cpp +++ b/dev/null @@ -1,173 +0,0 @@ -/* - * Class to manage the Contacts. - * - * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) - * - * ===================================================================== - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * ===================================================================== - * Info: This class could just work with a change in the header-file - * of the Contact class ! Therefore our libopie only compiles - * with our version of libqpe - * ===================================================================== - * ToDo: XML-Backend: Automatic reload if something was changed... - * - * - * ===================================================================== - * Version: $Id$ - * ===================================================================== - * History: - * $Log$ - * Revision 1.9 2004/03/02 12:14:22 alwin - * run the optimize_connect script - * the whole cvs is tagged with "before_optimize_connect" if there are problems you - * can check the diff (but it had compiled and run here) - * - * Revision 1.8 2003/05/08 13:55:09 tille - * search stuff - * and match, toRichText & toShortText in oevent - * - * Revision 1.7 2002/11/13 14:14:51 eilers - * Added sorted for Contacts.. - * - * Revision 1.6 2002/11/01 15:10:42 eilers - * Added regExp-search in database for all fields in a contact. - * - * Revision 1.5 2002/10/16 10:52:40 eilers - * Added some docu to the interface and now using the cache infrastucture by zecke.. :) - * - * Revision 1.4 2002/10/14 16:21:54 eilers - * Some minor interface updates - * - * Revision 1.3 2002/10/07 17:34:24 eilers - * added OBackendFactory for advanced backend access - * - * Revision 1.2 2002/10/02 16:18:11 eilers - * debugged and seems to work almost perfectly .. - * - * Revision 1.1 2002/09/27 17:11:44 eilers - * Added API for accessing the Contact-Database ! It is compiling, but - * please do not expect that anything is working ! - * I will debug that stuff in the next time .. - * Please read README_COMPILE for compiling ! - * - * - */ - -#include "ocontactaccess.h" -#include "obackendfactory.h" - -#include <qasciidict.h> -#include <qdatetime.h> -#include <qfile.h> -#include <qregexp.h> -#include <qlist.h> -#include <qcopchannel_qws.h> - -//#include <qpe/qcopenvelope_qws.h> -#include <qpe/global.h> - -#include <errno.h> -#include <fcntl.h> -#include <unistd.h> -#include <stdlib.h> - -#include "ocontactaccessbackend_xml.h" - - -OContactAccess::OContactAccess ( const QString appname, const QString , - OContactAccessBackend* end, bool autosync ): - OPimAccessTemplate<OContact>( end ) -{ - /* take care of the backend. If there is no one defined, we - * will use the XML-Backend as default (until we have a cute SQL-Backend..). - */ - if( end == 0 ) { - qWarning ("Using BackendFactory !"); - end = OBackendFactory<OContactAccessBackend>::Default( "contact", appname ); - } - // Set backend locally and in template - m_backEnd = end; - OPimAccessTemplate<OContact>::setBackEnd (end); - - - /* Connect signal of external db change to function */ - QCopChannel *dbchannel = new QCopChannel( "QPE/PIM", this ); - connect( dbchannel, SIGNAL(received(const QCString&,const QByteArray&)), - this, SLOT(copMessage(const QCString&,const QByteArray&)) ); - if ( autosync ){ - QCopChannel *syncchannel = new QCopChannel( "QPE/Sync", this ); - connect( syncchannel, SIGNAL(received(const QCString&,const QByteArray&)), - this, SLOT(copMessage(const QCString&,const QByteArray&)) ); - } - - -} -OContactAccess::~OContactAccess () -{ - /* The user may forget to save the changed database, therefore try to - * do it for him.. - */ - save(); - // delete m_backEnd; is done by template.. -} - - -bool OContactAccess::save () -{ - /* If the database was changed externally, we could not save the - * Data. This will remove added items which is unacceptable ! - * Therefore: Reload database and merge the data... - */ - if ( OPimAccessTemplate<OContact>::wasChangedExternally() ) - reload(); - - bool status = OPimAccessTemplate<OContact>::save(); - if ( !status ) return false; - - /* Now tell everyone that new data is available. - */ - QCopEnvelope e( "QPE/PIM", "addressbookUpdated()" ); - - return true; -} - -const uint OContactAccess::querySettings() -{ - return ( m_backEnd->querySettings() ); -} - -bool OContactAccess::hasQuerySettings ( int querySettings ) const -{ - return ( m_backEnd->hasQuerySettings ( querySettings ) ); -} -ORecordList<OContact> OContactAccess::sorted( bool ascending, int sortOrder, int sortFilter, int cat ) const -{ - QArray<int> matchingContacts = m_backEnd -> sorted( ascending, sortOrder, sortFilter, cat ); - return ( ORecordList<OContact>(matchingContacts, this) ); -} - - -bool OContactAccess::wasChangedExternally()const -{ - return ( m_backEnd->wasChangedExternally() ); -} - - -void OContactAccess::copMessage( const QCString &msg, const QByteArray & ) -{ - if ( msg == "addressbookUpdated()" ){ - qWarning ("OContactAccess: Received addressbokUpdated()"); - emit signalChanged ( this ); - } else if ( msg == "flush()" ) { - qWarning ("OContactAccess: Received flush()"); - save (); - } else if ( msg == "reload()" ) { - qWarning ("OContactAccess: Received reload()"); - reload (); - emit signalChanged ( this ); - } -} diff --git a/libopie/pim/ocontactaccess.h b/libopie/pim/ocontactaccess.h deleted file mode 100644 index bd6da40..0000000 --- a/libopie/pim/ocontactaccess.h +++ b/dev/null @@ -1,193 +0,0 @@ -/* - * Class to manage the Contacts. - * - * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) - * Copyright (c) 2002 by Holger Freyther (zecke@handhelds.org) - * - * ===================================================================== - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; - * either version 2 of the License, or (at your option) any later - * version. - * ===================================================================== - * ToDo: Define enum for query settings - * ===================================================================== - * Version: $Id$ - * ===================================================================== - * History: - * $Log$ - * Revision 1.10 2003/12/22 10:19:26 eilers - * Finishing implementation of sql-backend for datebook. But I have to - * port the PIM datebook application to use it, before I could debug the - * whole stuff. - * Thus, PIM-Database backend is finished, but highly experimental. And some - * parts are still generic. For instance, the "queryByExample()" methods are - * not (or not fully) implemented. Todo: custom-entries not stored. - * The big show stopper: matchRegExp() (needed by OpieSearch) needs regular - * expression search in the database, which is not supported by sqlite ! - * Therefore we need either an extended sqlite or a workaround which would - * be very slow and memory consuming.. - * - * Revision 1.9 2003/08/01 12:30:16 eilers - * Merging changes from BRANCH_1_0 to HEAD - * - * Revision 1.8.2.1 2003/06/30 14:34:19 eilers - * Patches from Zecke: - * Fixing and cleaning up extraMap handling - * Adding d_ptr for binary compatibility in the future - * - * Revision 1.8 2003/05/08 13:55:09 tille - * search stuff - * and match, toRichText & toShortText in oevent - * - * Revision 1.7 2003/04/13 18:07:10 zecke - * More API doc - * QString -> const QString& - * QString = 0l -> QString::null - * - * Revision 1.6 2003/01/02 14:27:12 eilers - * Improved query by example: Search by date is possible.. First step - * for a today plugin for birthdays.. - * - * Revision 1.5 2002/11/13 14:14:51 eilers - * Added sorted for Contacts.. - * - * Revision 1.4 2002/11/01 15:10:42 eilers - * Added regExp-search in database for all fields in a contact. - * - * Revision 1.3 2002/10/16 10:52:40 eilers - * Added some docu to the interface and now using the cache infrastucture by zecke.. :) - * - * Revision 1.2 2002/10/14 16:21:54 eilers - * Some minor interface updates - * - * Revision 1.1 2002/09/27 17:11:44 eilers - * Added API for accessing the Contact-Database ! It is compiling, but - * please do not expect that anything is working ! - * I will debug that stuff in the next time .. - * Please read README_COMPILE for compiling ! - * - * ===================================================================== - */ -#ifndef _OCONTACTACCESS_H -#define _OCONTACTACCESS_H - -#include <qobject.h> - -#include <qpe/qcopenvelope_qws.h> - -#include <qvaluelist.h> -#include <qfileinfo.h> - -#include "ocontact.h" -#include "ocontactaccessbackend.h" -#include "opimaccesstemplate.h" - -/** - * Class to access the contacts database. - * This is just a frontend for the real database handling which is - * done by the backend. - * This class is used to access the Contacts on a system. This class as any OPIE PIM - * class is backend independent. - * @author Stefan Eilers, Holger Freyther - * @see OPimAccessTemplate - */ -class OContactAccess: public QObject, public OPimAccessTemplate<OContact> -{ - Q_OBJECT - - public: - /** - * Create Database with contacts (addressbook). - * @param appname Name of application which wants access to the database - * (i.e. "todolist") - * @param filename The name of the database file. If not set, the default one - * is used. - * @param backend Pointer to an alternative Backend. If not set, we will use - * the default backend. - * @param handlesync If <b>true</b> the database stores the current state - * automatically if it receives the signals <i>flush()</i> and <i>reload()</i> - * which are used before and after synchronisation. If the application wants - * to react itself, it should be disabled by setting it to <b>false</b> - * @see OContactAccessBackend - */ - OContactAccess (const QString appname, const QString filename = 0l, - OContactAccessBackend* backend = 0l, bool handlesync = true); - ~OContactAccess (); - - /** Constants for query. - * Use this constants to set the query parameters. - * Note: <i>query_IgnoreCase</i> just make sense with one of the other attributes ! - * @see queryByExample() - */ - enum QuerySettings { - WildCards = 0x0001, - IgnoreCase = 0x0002, - RegExp = 0x0004, - ExactMatch = 0x0008, - MatchOne = 0x0010, // Only one Entry must match - DateDiff = 0x0020, // Find all entries from today until given date - DateYear = 0x0040, // The year matches - DateMonth = 0x0080, // The month matches - DateDay = 0x0100, // The day matches - }; - - - /** Return all Contacts in a sorted manner. - * @param ascending true: Sorted in acending order. - * @param sortOrder Currently not implemented. Just defined to stay compatible to otodoaccess - * @param sortFilter Currently not implemented. Just defined to stay compatible to otodoaccess - * @param cat Currently not implemented. Just defined to stay compatible to otodoaccess - */ - List sorted( bool ascending, int sortOrder, int sortFilter, int cat ) const; - - /** Return all possible settings. - * @return All settings provided by the current backend - * (i.e.: query_WildCards & query_IgnoreCase) - */ - const uint querySettings(); - - /** Check whether settings are correct. - * @return <i>true</i> if the given settings are correct and possible. - */ - bool hasQuerySettings ( int querySettings ) const; - - /** - * if the resource was changed externally. - * You should use the signal instead of polling possible changes ! - */ - bool wasChangedExternally()const; - - - /** Save contacts database. - * Save is more a "commit". After calling this function, all changes are public available. - * @return true if successful - */ - bool save(); - - signals: - /* Signal is emitted if the database was changed. Therefore - * we may need to reload to stay consistent. - * @param which Pointer to the database who created this event. This pointer - * is useful if an application has to handle multiple databases at the same time. - * @see reload() - */ - void signalChanged ( const OContactAccess *which ); - - - private: - // class OContactAccessPrivate; - // OContactAccessPrivate* d; - OContactAccessBackend *m_backEnd; - bool m_loading:1; - - private slots: - void copMessage( const QCString &msg, const QByteArray &data ); - - private: - class Private; - Private *d; - -}; -#endif diff --git a/libopie/pim/ocontactaccessbackend.h b/libopie/pim/ocontactaccessbackend.h deleted file mode 100644 index 0eac6dc..0000000 --- a/libopie/pim/ocontactaccessbackend.h +++ b/dev/null @@ -1,128 +0,0 @@ -/** - * The class responsible for managing a backend. - * The implementation of this abstract class contains - * the complete database handling. - * - * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) - * Copyright (c) 2002 by Holger Freyther (zecke@handhelds.org) - * - * ===================================================================== - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; - * either version 2 of the License, or (at your option) any later - * version. - * ===================================================================== - * ToDo: Define enum for query settings - * ===================================================================== - * Version: $Id$ - * ===================================================================== - * History: - * $Log$ - * Revision 1.7 2004/02/19 02:05:37 zecke - * Add notes for API fixes and BC stuff - * - * Revision 1.6 2003/08/01 12:30:16 eilers - * Merging changes from BRANCH_1_0 to HEAD - * - * Revision 1.5.4.1 2003/06/30 14:34:19 eilers - * Patches from Zecke: - * Fixing and cleaning up extraMap handling - * Adding d_ptr for binary compatibility in the future - * - * Revision 1.5 2003/04/13 18:07:10 zecke - * More API doc - * QString -> const QString& - * QString = 0l -> QString::null - * - * Revision 1.4 2002/11/13 14:14:51 eilers - * Added sorted for Contacts.. - * - * Revision 1.3 2002/11/01 15:10:42 eilers - * Added regExp-search in database for all fields in a contact. - * - * Revision 1.2 2002/10/07 17:34:24 eilers - * added OBackendFactory for advanced backend access - * - * Revision 1.1 2002/09/27 17:11:44 eilers - * Added API for accessing the Contact-Database ! It is compiling, but - * please do not expect that anything is working ! - * I will debug that stuff in the next time .. - * Please read README_COMPILE for compiling ! - * - * ===================================================================== - * - */ - -#ifndef _OCONTACTACCESSBACKEND_H_ -#define _OCONTACTACCESSBACKEND_H_ - -#include "ocontact.h" -#include "opimaccessbackend.h" - -#include <qregexp.h> - -/** - * This class represents the interface of all Contact Backends. - * Derivates of this class will be used to access the contacts. - * As implementation currently XML and vCard exist. This class needs to be implemented - * if you want to provide your own storage. - * In all queries a list of uids is passed on instead of loading the actual record! - * - * @see OContactAccessBackend_VCard - * @see OContactAccessBackend_XML - */ -class OContactAccessBackend: public OPimAccessBackend<OContact> { - public: - /** - * @todo make non line in regard to BC guide of KDE - */ - OContactAccessBackend() {} - /** - * @todo make non inline in regard to the BC guide of KDE - */ - virtual ~OContactAccessBackend() {} - - - /** - * Return if database was changed externally. - * This may just make sense on file based databases like a XML-File. - * It is used to prevent to overwrite the current database content - * if the file was already changed by something else ! - * If this happens, we have to reload before save our data. - * If we use real databases, this should be handled by the database - * management system themselve, therefore this function should always return false in - * this case. It is not our problem to handle this conflict ... - * @return <i>true</i> if the database was changed and if save without reload will - * be dangerous. <i>false</i> if the database was not changed or it is save to write - * in this situation. - */ - virtual bool wasChangedExternally() = 0; - - virtual QArray<int> matchRegexp( const QRegExp &r ) const = 0; - - /** - * Return all possible settings. - * @return All settings provided by the current backend - * (i.e.: query_WildCards & query_IgnoreCase) - */ - virtual const uint querySettings() = 0; - - /** - * Check whether settings are correct. - * @return <i>true</i> if the given settings are correct and possible. - */ - virtual bool hasQuerySettings (uint querySettings) const = 0; - - /** - * FIXME!!! - * Returns a sorted list of records either ascendinf or descending for a giving criteria and category - */ - virtual QArray<int> sorted( bool ascending, int sortOrder, int sortFilter, int cat ) = 0; - - -private: - class Private; - Private *d; -}; -#endif diff --git a/libopie/pim/ocontactaccessbackend_sql.cpp b/libopie/pim/ocontactaccessbackend_sql.cpp deleted file mode 100644 index d20df56..0000000 --- a/libopie/pim/ocontactaccessbackend_sql.cpp +++ b/dev/null @@ -1,945 +0,0 @@ -/* - * SQL Backend for the OPIE-Contact Database. - * - * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) - * - * ===================================================================== - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * ===================================================================== - * ===================================================================== - * Version: $Id$ - * ===================================================================== - * History: - * $Log$ - * Revision 1.5 2004/03/14 13:50:35 alwin - * namespace correction - * - * Revision 1.4 2003/12/22 10:19:26 eilers - * Finishing implementation of sql-backend for datebook. But I have to - * port the PIM datebook application to use it, before I could debug the - * whole stuff. - * Thus, PIM-Database backend is finished, but highly experimental. And some - * parts are still generic. For instance, the "queryByExample()" methods are - * not (or not fully) implemented. Todo: custom-entries not stored. - * The big show stopper: matchRegExp() (needed by OpieSearch) needs regular - * expression search in the database, which is not supported by sqlite ! - * Therefore we need either an extended sqlite or a workaround which would - * be very slow and memory consuming.. - * - * Revision 1.3 2003/12/08 15:18:10 eilers - * Committing unfinished sql implementation before merging to libopie2 starts.. - * - * Revision 1.2 2003/09/29 07:44:26 eilers - * Improvement of PIM-SQL Databases, but search queries are still limited. - * Addressbook: Changed table layout. Now, we just need 1/3 of disk-space. - * Todo: Started to add new attributes. Some type conversions missing. - * - * Revision 1.1 2003/09/22 14:31:16 eilers - * Added first experimental incarnation of sql-backend for addressbook. - * Some modifications to be able to compile the todo sql-backend. - * A lot of changes fill follow... - * - */ - -#include "ocontactaccessbackend_sql.h" - -#include <qarray.h> -#include <qdatetime.h> -#include <qstringlist.h> - -#include <qpe/global.h> -#include <qpe/recordfields.h> - -#include <opie/ocontactfields.h> -#include <opie/oconversion.h> -#include <opie2/osqldriver.h> -#include <opie2/osqlresult.h> -#include <opie2/osqlmanager.h> -#include <opie2/osqlquery.h> - -using namespace Opie::DB; - - -// If defined, we use a horizontal table ( uid, attr1, attr2, attr3, ..., attrn ) instead -// vertical like "uid, type, value". -// DON'T DEACTIVATE THIS DEFINE IN PRODUCTIVE ENVIRONMENTS !! -#define __STORE_HORIZONTAL_ - -// Distinct loading is not very fast. If I expect that every person has just -// one (and always one) 'Last Name', I can request all uid's for existing lastnames, -// which is faster.. -// But this may not be true for all entries, like company contacts.. -// The current AddressBook application handles this problem, but other may not.. (eilers) -#define __USE_SUPERFAST_LOADQUERY - - -/* - * Implementation of used query types - * CREATE query - * LOAD query - * INSERT - * REMOVE - * CLEAR - */ -namespace { - /** - * CreateQuery for the Todolist Table - */ - class CreateQuery : public OSQLQuery { - public: - CreateQuery(); - ~CreateQuery(); - QString query()const; - }; - - /** - * Clears (delete) a Table - */ - class ClearQuery : public OSQLQuery { - public: - ClearQuery(); - ~ClearQuery(); - QString query()const; - - }; - - - /** - * LoadQuery - * this one queries for all uids - */ - class LoadQuery : public OSQLQuery { - public: - LoadQuery(); - ~LoadQuery(); - QString query()const; - }; - - /** - * inserts/adds a OContact to the table - */ - class InsertQuery : public OSQLQuery { - public: - InsertQuery(const OContact& ); - ~InsertQuery(); - QString query()const; - private: - OContact m_contact; - }; - - - /** - * removes one from the table - */ - class RemoveQuery : public OSQLQuery { - public: - RemoveQuery(int uid ); - ~RemoveQuery(); - QString query()const; - private: - int m_uid; - }; - - /** - * a find query for noncustom elements - */ - class FindQuery : public OSQLQuery { - public: - FindQuery(int uid); - FindQuery(const QArray<int>& ); - ~FindQuery(); - QString query()const; - private: - QString single()const; - QString multi()const; - QArray<int> m_uids; - int m_uid; - }; - - /** - * a find query for custom elements - */ - class FindCustomQuery : public OSQLQuery { - public: - FindCustomQuery(int uid); - FindCustomQuery(const QArray<int>& ); - ~FindCustomQuery(); - QString query()const; - private: - QString single()const; - QString multi()const; - QArray<int> m_uids; - int m_uid; - }; - - - - // We using three tables to store the information: - // 1. addressbook : It contains General information about the contact (non custom) - // 2. custom_data : Not official supported entries - // All tables are connected by the uid of the contact. - // Maybe I should add a table for meta-information ? - CreateQuery::CreateQuery() : OSQLQuery() {} - CreateQuery::~CreateQuery() {} - QString CreateQuery::query()const { - QString qu; -#ifdef __STORE_HORIZONTAL_ - - qu += "create table addressbook( uid PRIMARY KEY "; - - QStringList fieldList = OContactFields::untrfields( false ); - for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ - qu += QString( ",\"%1\" VARCHAR(10)" ).arg( *it ); - } - qu += " );"; - - qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR, priority INTEGER, value VARCHAR, PRIMARY KEY /* identifier */ (uid, id) );"; - -#else - - qu += "create table addressbook( uid INTEGER, id INTEGER, type VARCHAR, priority INTEGER, value VARCHAR, PRIMARY KEY /* identifier */ (uid, id));"; - qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR, priority INTEGER, value VARCHAR, PRIMARY KEY /* identifier */ (uid, id) );"; -// qu += "create table dates( uid PRIMARY KEY, type, day, month, year, hour, minute, second );"; - -#endif // __STORE_HORIZONTAL_ - return qu; - } - - ClearQuery::ClearQuery() - : OSQLQuery() {} - ClearQuery::~ClearQuery() {} - QString ClearQuery::query()const { - QString qu = "drop table addressbook;"; - qu += "drop table custom_data;"; -// qu += "drop table dates;"; - return qu; - } - - - LoadQuery::LoadQuery() : OSQLQuery() {} - LoadQuery::~LoadQuery() {} - QString LoadQuery::query()const { - QString qu; -#ifdef __STORE_HORIZONTAL_ - qu += "select uid from addressbook"; -#else -# ifndef __USE_SUPERFAST_LOADQUERY - qu += "select distinct uid from addressbook"; -# else - qu += "select uid from addressbook where type = 'Last Name'"; -# endif // __USE_SUPERFAST_LOADQUERY -#endif // __STORE_HORIZONTAL_ - - return qu; - } - - - InsertQuery::InsertQuery( const OContact& contact ) - : OSQLQuery(), m_contact( contact ) { - } - - InsertQuery::~InsertQuery() { - } - - /* - * converts from a OContact to a query - */ - QString InsertQuery::query()const{ - -#ifdef __STORE_HORIZONTAL_ - QString qu; - qu += "insert into addressbook VALUES( " + - QString::number( m_contact.uid() ); - - // Get all information out of the contact-class - // Remember: The category is stored in contactMap, too ! - QMap<int, QString> contactMap = m_contact.toMap(); - - QStringList fieldList = OContactFields::untrfields( false ); - QMap<QString, int> translate = OContactFields::untrFieldsToId(); - for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ - // Convert Column-String to Id and get value for this id.. - // Hmmm.. Maybe not very cute solution.. - int id = translate[*it]; - switch ( id ){ - case Qtopia::Birthday:{ - // These entries should stored in a special format - // year-month-day - QDate day = m_contact.birthday(); - if ( day.isValid() ){ - qu += QString(",\"%1-%2-%3\"") - .arg( day.year() ) - .arg( day.month() ) - .arg( day.day() ); - } else { - qu += ",\"\""; - } - } - break; - case Qtopia::Anniversary:{ - // These entries should stored in a special format - // year-month-day - QDate day = m_contact.anniversary(); - if ( day.isValid() ){ - qu += QString(",\"%1-%2-%3\"") - .arg( day.year() ) - .arg( day.month() ) - .arg( day.day() ); - } else { - qu += ",\"\""; - } - } - break; - - default: - qu += QString( ",\"%1\"" ).arg( contactMap[id] ); - } - } - qu += " );"; - - -#else - // Get all information out of the contact-class - // Remember: The category is stored in contactMap, too ! - QMap<int, QString> contactMap = m_contact.toMap(); - - QMap<QString, QString> addressbook_db; - - // Get the translation from the ID to the String - QMap<int, QString> transMap = OContactFields::idToUntrFields(); - - for( QMap<int, QString>::Iterator it = contactMap.begin(); - it != contactMap.end(); ++it ){ - switch ( it.key() ){ - case Qtopia::Birthday:{ - // These entries should stored in a special format - // year-month-day - QDate day = m_contact.birthday(); - addressbook_db.insert( transMap[it.key()], - QString("%1-%2-%3") - .arg( day.year() ) - .arg( day.month() ) - .arg( day.day() ) ); - } - break; - case Qtopia::Anniversary:{ - // These entries should stored in a special format - // year-month-day - QDate day = m_contact.anniversary(); - addressbook_db.insert( transMap[it.key()], - QString("%1-%2-%3") - .arg( day.year() ) - .arg( day.month() ) - .arg( day.day() ) ); - } - break; - case Qtopia::AddressUid: // Ignore UID - break; - default: // Translate id to String - addressbook_db.insert( transMap[it.key()], it.data() ); - break; - } - - } - - // Now convert this whole stuff into a SQL String, beginning with - // the addressbook table.. - QString qu; - // qu += "begin transaction;"; - int id = 0; - for( QMap<QString, QString>::Iterator it = addressbook_db.begin(); - it != addressbook_db.end(); ++it ){ - qu += "insert into addressbook VALUES(" - + QString::number( m_contact.uid() ) - + "," - + QString::number( id++ ) - + ",'" - + it.key() //.latin1() - + "'," - + "0" // Priority for future enhancements - + ",'" - + it.data() //.latin1() - + "');"; - } - -#endif //__STORE_HORIZONTAL_ - // Now add custom data.. -#ifdef __STORE_HORIZONTAL_ - int id = 0; -#endif - id = 0; - QMap<QString, QString> customMap = m_contact.toExtraMap(); - for( QMap<QString, QString>::Iterator it = customMap.begin(); - it != customMap.end(); ++it ){ - qu += "insert into custom_data VALUES(" - + QString::number( m_contact.uid() ) - + "," - + QString::number( id++ ) - + ",'" - + it.key() //.latin1() - + "'," - + "0" // Priority for future enhancements - + ",'" - + it.data() //.latin1() - + "');"; - } - // qu += "commit;"; - qWarning("add %s", qu.latin1() ); - return qu; - } - - - RemoveQuery::RemoveQuery(int uid ) - : OSQLQuery(), m_uid( uid ) {} - RemoveQuery::~RemoveQuery() {} - QString RemoveQuery::query()const { - QString qu = "DELETE from addressbook where uid = " - + QString::number(m_uid) + ";"; - qu += "DELETE from custom_data where uid = " - + QString::number(m_uid) + ";"; - return qu; - } - - - - - FindQuery::FindQuery(int uid) - : OSQLQuery(), m_uid( uid ) { - } - FindQuery::FindQuery(const QArray<int>& ints) - : OSQLQuery(), m_uids( ints ){ - } - FindQuery::~FindQuery() { - } - QString FindQuery::query()const{ -// if ( m_uids.count() == 0 ) - return single(); - } - /* - else - return multi(); - } - QString FindQuery::multi()const { - QString qu = "select uid, type, value from addressbook where"; - for (uint i = 0; i < m_uids.count(); i++ ) { - qu += " UID = " + QString::number( m_uids[i] ) + " OR"; - } - qu.remove( qu.length()-2, 2 ); // Hmmmm.. - return qu; - } - */ -#ifdef __STORE_HORIZONTAL_ - QString FindQuery::single()const{ - QString qu = "select *"; - qu += " from addressbook where uid = " + QString::number(m_uid); - - // qWarning("find query: %s", qu.latin1() ); - return qu; - } -#else - QString FindQuery::single()const{ - QString qu = "select uid, type, value from addressbook where uid = "; - qu += QString::number(m_uid); - return qu; - } -#endif - - - FindCustomQuery::FindCustomQuery(int uid) - : OSQLQuery(), m_uid( uid ) { - } - FindCustomQuery::FindCustomQuery(const QArray<int>& ints) - : OSQLQuery(), m_uids( ints ){ - } - FindCustomQuery::~FindCustomQuery() { - } - QString FindCustomQuery::query()const{ -// if ( m_uids.count() == 0 ) - return single(); - } - QString FindCustomQuery::single()const{ - QString qu = "select uid, type, value from custom_data where uid = "; - qu += QString::number(m_uid); - return qu; - } - -}; - - -/* --------------------------------------------------------------------------- */ - -OContactAccessBackend_SQL::OContactAccessBackend_SQL ( const QString& /* appname */, - const QString& filename ): - OContactAccessBackend(), m_changed(false), m_driver( NULL ) -{ - qWarning("C'tor OContactAccessBackend_SQL starts"); - QTime t; - t.start(); - - /* Expecting to access the default filename if nothing else is set */ - if ( filename.isEmpty() ){ - m_fileName = Global::applicationFileName( "addressbook","addressbook.db" ); - } else - m_fileName = filename; - - // Get the standart sql-driver from the OSQLManager.. - OSQLManager man; - m_driver = man.standard(); - m_driver->setUrl( m_fileName ); - - load(); - - qWarning("C'tor OContactAccessBackend_SQL ends: %d ms", t.elapsed() ); -} - -OContactAccessBackend_SQL::~OContactAccessBackend_SQL () -{ - if( m_driver ) - delete m_driver; -} - -bool OContactAccessBackend_SQL::load () -{ - if (!m_driver->open() ) - return false; - - // Don't expect that the database exists. - // It is save here to create the table, even if it - // do exist. ( Is that correct for all databases ?? ) - CreateQuery creat; - OSQLResult res = m_driver->query( &creat ); - - update(); - - return true; - -} - -bool OContactAccessBackend_SQL::reload() -{ - return load(); -} - -bool OContactAccessBackend_SQL::save() -{ - return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers) -} - - -void OContactAccessBackend_SQL::clear () -{ - ClearQuery cle; - OSQLResult res = m_driver->query( &cle ); - - reload(); -} - -bool OContactAccessBackend_SQL::wasChangedExternally() -{ - return false; -} - -QArray<int> OContactAccessBackend_SQL::allRecords() const -{ - - // FIXME: Think about cute handling of changed tables.. - // Thus, we don't have to call update here... - if ( m_changed ) - ((OContactAccessBackend_SQL*)this)->update(); - - return m_uids; -} - -bool OContactAccessBackend_SQL::add ( const OContact &newcontact ) -{ - InsertQuery ins( newcontact ); - OSQLResult res = m_driver->query( &ins ); - - if ( res.state() == OSQLResult::Failure ) - return false; - - int c = m_uids.count(); - m_uids.resize( c+1 ); - m_uids[c] = newcontact.uid(); - - return true; -} - - -bool OContactAccessBackend_SQL::remove ( int uid ) -{ - RemoveQuery rem( uid ); - OSQLResult res = m_driver->query(&rem ); - - if ( res.state() == OSQLResult::Failure ) - return false; - - m_changed = true; - - return true; -} - -bool OContactAccessBackend_SQL::replace ( const OContact &contact ) -{ - if ( !remove( contact.uid() ) ) - return false; - - return add( contact ); -} - - -OContact OContactAccessBackend_SQL::find ( int uid ) const -{ - qWarning("OContactAccessBackend_SQL::find()"); - QTime t; - t.start(); - - OContact retContact( requestNonCustom( uid ) ); - retContact.setExtraMap( requestCustom( uid ) ); - - qWarning("OContactAccessBackend_SQL::find() needed: %d ms", t.elapsed() ); - return retContact; -} - - - -QArray<int> OContactAccessBackend_SQL::queryByExample ( const OContact &query, int settings, const QDateTime& d = QDateTime() ) -{ - QString qu = "SELECT uid FROM addressbook WHERE"; - - QMap<int, QString> queryFields = query.toMap(); - QStringList fieldList = OContactFields::untrfields( false ); - QMap<QString, int> translate = OContactFields::untrFieldsToId(); - - // Convert every filled field to a SQL-Query - bool isAnyFieldSelected = false; - for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ - int id = translate[*it]; - QString queryStr = queryFields[id]; - if ( !queryStr.isEmpty() ){ - isAnyFieldSelected = true; - switch( id ){ - default: - // Switching between case sensitive and insensitive... - // LIKE is not case sensitive, GLOB is case sensitive - // Do exist a better solution to switch this ? - if ( settings & OContactAccess::IgnoreCase ) - qu += "(\"" + *it + "\"" + " LIKE " + "'" - + queryStr.replace(QRegExp("\\*"),"%") + "'" + ") AND "; - else - qu += "(\"" + *it + "\"" + " GLOB " + "'" - + queryStr + "'" + ") AND "; - - } - } - } - // Skip trailing "AND" - if ( isAnyFieldSelected ) - qu = qu.left( qu.length() - 4 ); - - qWarning( "queryByExample query: %s", qu.latin1() ); - - // Execute query and return the received uid's - OSQLRawQuery raw( qu ); - OSQLResult res = m_driver->query( &raw ); - if ( res.state() != OSQLResult::Success ){ - QArray<int> empty; - return empty; - } - - QArray<int> list = extractUids( res ); - - return list; -} - -QArray<int> OContactAccessBackend_SQL::matchRegexp( const QRegExp &r ) const -{ - QArray<int> nix(0); - return nix; -} - -const uint OContactAccessBackend_SQL::querySettings() -{ - return OContactAccess::IgnoreCase - || OContactAccess::WildCards; -} - -bool OContactAccessBackend_SQL::hasQuerySettings (uint querySettings) const -{ - /* OContactAccess::IgnoreCase, DateDiff, DateYear, DateMonth, DateDay - * may be added with any of the other settings. IgnoreCase should never used alone. - * Wildcards, RegExp, ExactMatch should never used at the same time... - */ - - // Step 1: Check whether the given settings are supported by this backend - if ( ( querySettings & ( - OContactAccess::IgnoreCase - | OContactAccess::WildCards -// | OContactAccess::DateDiff -// | OContactAccess::DateYear -// | OContactAccess::DateMonth -// | OContactAccess::DateDay -// | OContactAccess::RegExp -// | OContactAccess::ExactMatch - ) ) != querySettings ) - return false; - - // Step 2: Check whether the given combinations are ok.. - - // IngoreCase alone is invalid - if ( querySettings == OContactAccess::IgnoreCase ) - return false; - - // WildCards, RegExp and ExactMatch should never used at the same time - switch ( querySettings & ~( OContactAccess::IgnoreCase - | OContactAccess::DateDiff - | OContactAccess::DateYear - | OContactAccess::DateMonth - | OContactAccess::DateDay - ) - ){ - case OContactAccess::RegExp: - return ( true ); - case OContactAccess::WildCards: - return ( true ); - case OContactAccess::ExactMatch: - return ( true ); - case 0: // one of the upper removed bits were set.. - return ( true ); - default: - return ( false ); - } - -} - -QArray<int> OContactAccessBackend_SQL::sorted( bool asc, int , int , int ) -{ - QTime t; - t.start(); - -#ifdef __STORE_HORIZONTAL_ - QString query = "SELECT uid FROM addressbook "; - query += "ORDER BY \"Last Name\" "; -#else - QString query = "SELECT uid FROM addressbook WHERE type = 'Last Name' "; - query += "ORDER BY upper( value )"; -#endif - - if ( !asc ) - query += "DESC"; - - // qWarning("sorted query is: %s", query.latin1() ); - - OSQLRawQuery raw( query ); - OSQLResult res = m_driver->query( &raw ); - if ( res.state() != OSQLResult::Success ){ - QArray<int> empty; - return empty; - } - - QArray<int> list = extractUids( res ); - - qWarning("sorted needed %d ms!", t.elapsed() ); - return list; -} - - -void OContactAccessBackend_SQL::update() -{ - qWarning("Update starts"); - QTime t; - t.start(); - - // Now load the database set and extract the uid's - // which will be held locally - - LoadQuery lo; - OSQLResult res = m_driver->query(&lo); - if ( res.state() != OSQLResult::Success ) - return; - - m_uids = extractUids( res ); - - m_changed = false; - - qWarning("Update ends %d ms", t.elapsed() ); -} - -QArray<int> OContactAccessBackend_SQL::extractUids( OSQLResult& res ) const -{ - qWarning("extractUids"); - QTime t; - t.start(); - OSQLResultItem::ValueList list = res.results(); - OSQLResultItem::ValueList::Iterator it; - QArray<int> ints(list.count() ); - qWarning(" count = %d", list.count() ); - - int i = 0; - for (it = list.begin(); it != list.end(); ++it ) { - ints[i] = (*it).data("uid").toInt(); - i++; - } - qWarning("extractUids ready: count2 = %d needs %d ms", i, t.elapsed() ); - - return ints; - -} - -#ifdef __STORE_HORIZONTAL_ -QMap<int, QString> OContactAccessBackend_SQL::requestNonCustom( int uid ) const -{ - QTime t; - t.start(); - - QMap<int, QString> nonCustomMap; - - int t2needed = 0; - int t3needed = 0; - QTime t2; - t2.start(); - FindQuery query( uid ); - OSQLResult res_noncustom = m_driver->query( &query ); - t2needed = t2.elapsed(); - - OSQLResultItem resItem = res_noncustom.first(); - - QTime t3; - t3.start(); - // Now loop through all columns - QStringList fieldList = OContactFields::untrfields( false ); - QMap<QString, int> translate = OContactFields::untrFieldsToId(); - for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ - // Get data for the selected column and store it with the - // corresponding id into the map.. - - int id = translate[*it]; - QString value = resItem.data( (*it) ); - - // qWarning("Reading %s... found: %s", (*it).latin1(), value.latin1() ); - - switch( id ){ - case Qtopia::Birthday: - case Qtopia::Anniversary:{ - // Birthday and Anniversary are encoded special ( yyyy-mm-dd ) - QStringList list = QStringList::split( '-', value ); - QStringList::Iterator lit = list.begin(); - int year = (*lit).toInt(); - int month = (*(++lit)).toInt(); - int day = (*(++lit)).toInt(); - if ( ( day != 0 ) && ( month != 0 ) && ( year != 0 ) ){ - QDate date( year, month, day ); - nonCustomMap.insert( id, OConversion::dateToString( date ) ); - } - } - break; - case Qtopia::AddressCategory: - qWarning("Category is: %s", value.latin1() ); - default: - nonCustomMap.insert( id, value ); - } - } - - // First insert uid - nonCustomMap.insert( Qtopia::AddressUid, resItem.data( "uid" ) ); - t3needed = t3.elapsed(); - - // qWarning("Adding UID: %s", resItem.data( "uid" ).latin1() ); - qWarning("RequestNonCustom needed: insg.:%d ms, query: %d ms, mapping: %d ms", - t.elapsed(), t2needed, t3needed ); - - return nonCustomMap; -} -#else - -QMap<int, QString> OContactAccessBackend_SQL::requestNonCustom( int uid ) const -{ - QTime t; - t.start(); - - QMap<int, QString> nonCustomMap; - - int t2needed = 0; - QTime t2; - t2.start(); - FindQuery query( uid ); - OSQLResult res_noncustom = m_driver->query( &query ); - t2needed = t2.elapsed(); - - if ( res_noncustom.state() == OSQLResult::Failure ) { - qWarning("OSQLResult::Failure in find query !!"); - QMap<int, QString> empty; - return empty; - } - - int t3needed = 0; - QTime t3; - t3.start(); - QMap<QString, int> translateMap = OContactFields::untrFieldsToId(); - - OSQLResultItem::ValueList list = res_noncustom.results(); - OSQLResultItem::ValueList::Iterator it = list.begin(); - for ( ; it != list.end(); ++it ) { - if ( (*it).data("type") != "" ){ - int typeId = translateMap[(*it).data( "type" )]; - switch( typeId ){ - case Qtopia::Birthday: - case Qtopia::Anniversary:{ - // Birthday and Anniversary are encoded special ( yyyy-mm-dd ) - QStringList list = QStringList::split( '-', (*it).data( "value" ) ); - QStringList::Iterator lit = list.begin(); - int year = (*lit).toInt(); - qWarning("1. %s", (*lit).latin1()); - int month = (*(++lit)).toInt(); - qWarning("2. %s", (*lit).latin1()); - int day = (*(++lit)).toInt(); - qWarning("3. %s", (*lit).latin1()); - qWarning( "RequestNonCustom->Converting:%s to Year: %d, Month: %d, Day: %d ", (*it).data( "value" ).latin1(), year, month, day ); - QDate date( year, month, day ); - nonCustomMap.insert( typeId, OConversion::dateToString( date ) ); - } - break; - default: - nonCustomMap.insert( typeId, - (*it).data( "value" ) ); - } - } - } - // Add UID to Map.. - nonCustomMap.insert( Qtopia::AddressUid, QString::number( uid ) ); - t3needed = t3.elapsed(); - - qWarning("RequestNonCustom needed: insg.:%d ms, query: %d ms, mapping: %d ms", t.elapsed(), t2needed, t3needed ); - return nonCustomMap; -} - -#endif // __STORE_HORIZONTAL_ - -QMap<QString, QString> OContactAccessBackend_SQL::requestCustom( int uid ) const -{ - QTime t; - t.start(); - - QMap<QString, QString> customMap; - - FindCustomQuery query( uid ); - OSQLResult res_custom = m_driver->query( &query ); - - if ( res_custom.state() == OSQLResult::Failure ) { - qWarning("OSQLResult::Failure in find query !!"); - QMap<QString, QString> empty; - return empty; - } - - OSQLResultItem::ValueList list = res_custom.results(); - OSQLResultItem::ValueList::Iterator it = list.begin(); - for ( ; it != list.end(); ++it ) { - customMap.insert( (*it).data( "type" ), (*it).data( "value" ) ); - } - - qWarning("RequestCustom needed: %d ms", t.elapsed() ); - return customMap; -} diff --git a/libopie/pim/ocontactaccessbackend_sql.h b/libopie/pim/ocontactaccessbackend_sql.h deleted file mode 100644 index f553760..0000000 --- a/libopie/pim/ocontactaccessbackend_sql.h +++ b/dev/null @@ -1,107 +0,0 @@ -/* - * SQL Backend for the OPIE-Contact Database. - * - * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) - * - * ===================================================================== - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * ===================================================================== - * - * - * ===================================================================== - * Version: $Id$ - * ===================================================================== - * History: - * $Log$ - * Revision 1.3 2004/03/14 13:50:35 alwin - * namespace correction - * - * Revision 1.2 2003/12/08 15:18:11 eilers - * Committing unfinished sql implementation before merging to libopie2 starts.. - * - * Revision 1.1 2003/09/22 14:31:16 eilers - * Added first experimental incarnation of sql-backend for addressbook. - * Some modifications to be able to compile the todo sql-backend. - * A lot of changes fill follow... - * - * - */ - -#ifndef _OContactAccessBackend_SQL_ -#define _OContactAccessBackend_SQL_ - -#include "ocontactaccessbackend.h" -#include "ocontactaccess.h" - -#include <qlist.h> -#include <qdict.h> - -namespace Opie { namespace DB { -class OSQLDriver; -class OSQLResult; -class OSQLResultItem; - -}} - -/* the default xml implementation */ -/** - * This class is the SQL implementation of a Contact backend - * it does implement everything available for OContact. - * @see OPimAccessBackend for more information of available methods - */ -class OContactAccessBackend_SQL : public OContactAccessBackend { - public: - OContactAccessBackend_SQL ( const QString& appname, const QString& filename = QString::null ); - - ~OContactAccessBackend_SQL (); - - bool save(); - - bool load (); - - void clear (); - - bool wasChangedExternally(); - - QArray<int> allRecords() const; - - OContact find ( int uid ) const; - // FIXME: Add lookahead-cache support ! - //OContact find(int uid, const QArray<int>&, uint cur, Frontend::CacheDirection )const; - - QArray<int> queryByExample ( const OContact &query, int settings, - const QDateTime& d ); - - QArray<int> matchRegexp( const QRegExp &r ) const; - - const uint querySettings(); - - bool hasQuerySettings (uint querySettings) const; - - // Currently only asc implemented.. - QArray<int> sorted( bool asc, int , int , int ); - bool add ( const OContact &newcontact ); - - bool replace ( const OContact &contact ); - - bool remove ( int uid ); - bool reload(); - - private: - QArray<int> extractUids( Opie::DB::OSQLResult& res ) const; - QMap<int, QString> requestNonCustom( int uid ) const; - QMap<QString, QString> requestCustom( int uid ) const; - void update(); - - protected: - bool m_changed; - QString m_fileName; - QArray<int> m_uids; - - Opie::DB::OSQLDriver* m_driver; -}; - -#endif diff --git a/libopie/pim/ocontactaccessbackend_vcard.cpp b/libopie/pim/ocontactaccessbackend_vcard.cpp deleted file mode 100644 index b60c5be..0000000 --- a/libopie/pim/ocontactaccessbackend_vcard.cpp +++ b/dev/null @@ -1,646 +0,0 @@ -/* - * VCard Backend for the OPIE-Contact Database. - * - * Copyright (C) 2000 Trolltech AS. All rights reserved. - * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) - * - * ===================================================================== - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * ===================================================================== - * ToDo: - * - * ===================================================================== - * Version: $Id$ - * ===================================================================== - * History: - * $Log$ - * Revision 1.11 2003/08/01 12:30:16 eilers - * Merging changes from BRANCH_1_0 to HEAD - * - * Revision 1.10.4.3 2003/07/23 08:54:37 eilers - * Default email was added to the list of all emails, which already contains - * the default email.. - * This closes bug #1045 - * - * Revision 1.10.4.2 2003/07/23 08:44:45 eilers - * Importing of Notes in vcard files wasn't implemented. - * Closes bug #1044 - * - * Revision 1.10.4.1 2003/06/02 13:37:49 eilers - * Fixing memory leak - * - * Revision 1.10 2003/04/13 18:07:10 zecke - * More API doc - * QString -> const QString& - * QString = 0l -> QString::null - * - * Revision 1.9 2003/03/21 10:33:09 eilers - * Merged speed optimized xml backend for contacts to main. - * Added QDateTime to querybyexample. For instance, it is now possible to get - * all Birthdays/Anniversaries between two dates. This should be used - * to show all birthdays in the datebook.. - * This change is sourcecode backward compatible but you have to upgrade - * the binaries for today-addressbook. - * - * Revision 1.8 2003/02/21 16:52:49 zecke - * -Remove old Todo classes they're deprecated and today I already using the - * new API - * -Guard against self assignment in OTodo - * -Add test apps for OPIM - * -Opiefied Event classes - * -Added TimeZone handling and pinning of TimeZones to OEvent - * -Adjust ORecur and the widget to better timezone behaviour - * - * Revision 1.7 2003/02/16 22:25:46 zecke - * 0000276 Fix for that bug.. or better temp workaround - * A Preferred Number is HOME|VOICE - * A CellPhone is HOME|VOICE|CELL the type & HOME|VOICE test - * triggers both - * and the cell phone number overrides the other entries.. - * - * as a temp I check that it's not equal to HOME|VOICE|CELL before setting the - * number - * - * The right and final fix would be to reorder the if statement to make it - * if else based and the less common thing put to the bottom - * - * OTodoAccessVcal fix the date for beaming - * - * Revision 1.6 2003/01/13 15:49:31 eilers - * Fixing crash when businesscard.vcf is missing.. - * - * Revision 1.5 2002/12/07 13:26:22 eilers - * Fixing bug in storing anniversary.. - * - * Revision 1.4 2002/11/13 14:14:51 eilers - * Added sorted for Contacts.. - * - * Revision 1.3 2002/11/11 16:41:09 kergoth - * no default arguments in implementation - * - * Revision 1.2 2002/11/10 15:41:53 eilers - * Bugfixes.. - * - * Revision 1.1 2002/11/09 14:34:52 eilers - * Added VCard Backend. - * - */ -#include "ocontactaccessbackend_vcard.h" -#include "../../library/backend/vobject_p.h" -#include "../../library/backend/qfiledirect_p.h" - -#include <qpe/timeconversion.h> - -#include <qfile.h> - -OContactAccessBackend_VCard::OContactAccessBackend_VCard ( const QString& , const QString& filename ): - m_dirty( false ), - m_file( filename ) -{ - load(); -} - - -bool OContactAccessBackend_VCard::load () -{ - m_map.clear(); - m_dirty = false; - - VObject* obj = 0l; - - if ( QFile::exists(m_file) ){ - obj = Parse_MIME_FromFileName( QFile::encodeName(m_file).data() ); - if ( !obj ) - return false; - }else{ - qWarning("File \"%s\" not found !", m_file.latin1() ); - return false; - } - - while ( obj ) { - OContact con = parseVObject( obj ); - /* - * if uid is 0 assign a new one - * this at least happens on - * Nokia6210 - */ - if ( con.uid() == 0 ){ - con.setUid( 1 ); - qWarning("assigned new uid %d",con.uid() ); - } - - m_map.insert( con.uid(), con ); - - VObject *t = obj; - obj = nextVObjectInList(obj); - cleanVObject( t ); - } - - return true; - -} -bool OContactAccessBackend_VCard::reload() -{ - return load(); -} -bool OContactAccessBackend_VCard::save() -{ - if (!m_dirty ) - return true; - - QFileDirect file( m_file ); - if (!file.open(IO_WriteOnly ) ) - return false; - - VObject *obj; - obj = newVObject( VCCalProp ); - addPropValue( obj, VCVersionProp, "1.0" ); - - VObject *vo; - for(QMap<int, OContact>::ConstIterator it=m_map.begin(); it !=m_map.end(); ++it ){ - vo = createVObject( *it ); - writeVObject( file.directHandle() , vo ); - cleanVObject( vo ); - } - cleanStrTbl(); - deleteVObject( obj ); - - m_dirty = false; - return true; - - -} -void OContactAccessBackend_VCard::clear () -{ - m_map.clear(); - m_dirty = true; // ??? sure ? (se) -} - -bool OContactAccessBackend_VCard::add ( const OContact& newcontact ) -{ - m_map.insert( newcontact.uid(), newcontact ); - m_dirty = true; - return true; -} - -bool OContactAccessBackend_VCard::remove ( int uid ) -{ - m_map.remove( uid ); - m_dirty = true; - return true; -} - -bool OContactAccessBackend_VCard::replace ( const OContact &contact ) -{ - m_map.replace( contact.uid(), contact ); - m_dirty = true; - return true; -} - -OContact OContactAccessBackend_VCard::find ( int uid ) const -{ - return m_map[uid]; -} - -QArray<int> OContactAccessBackend_VCard::allRecords() const -{ - QArray<int> ar( m_map.count() ); - QMap<int, OContact>::ConstIterator it; - int i = 0; - for ( it = m_map.begin(); it != m_map.end(); ++it ) { - ar[i] = it.key(); - i++; - } - return ar; -} - -// Not implemented -QArray<int> OContactAccessBackend_VCard::queryByExample ( const OContact&, int, const QDateTime& ) -{ - QArray<int> ar(0); - return ar; -} - -// Not implemented -QArray<int> OContactAccessBackend_VCard::matchRegexp( const QRegExp& ) const -{ - QArray<int> ar(0); - return ar; -} - -const uint OContactAccessBackend_VCard::querySettings() -{ - return 0; // No search possible -} - -bool OContactAccessBackend_VCard::hasQuerySettings (uint ) const -{ - return false; // No search possible, therefore all settings invalid ;) -} - -bool OContactAccessBackend_VCard::wasChangedExternally() -{ - return false; // Don't expect concurrent access -} - -// Not implemented -QArray<int> OContactAccessBackend_VCard::sorted( bool , int, int, int ) -{ - QArray<int> ar(0); - return ar; -} - -// *** Private stuff *** - - -OContact OContactAccessBackend_VCard::parseVObject( VObject *obj ) -{ - OContact c; - - VObjectIterator it; - initPropIterator( &it, obj ); - while( moreIteration( &it ) ) { - VObject *o = nextVObject( &it ); - QCString name = vObjectName( o ); - QCString value = vObjectStringZValue( o ); - if ( name == VCNameProp ) { - VObjectIterator nit; - initPropIterator( &nit, o ); - while( moreIteration( &nit ) ) { - VObject *o = nextVObject( &nit ); - QCString name = vObjectTypeInfo( o ); - QString value = vObjectStringZValue( o ); - if ( name == VCNamePrefixesProp ) - c.setTitle( value ); - else if ( name == VCNameSuffixesProp ) - c.setSuffix( value ); - else if ( name == VCFamilyNameProp ) - c.setLastName( value ); - else if ( name == VCGivenNameProp ) - c.setFirstName( value ); - else if ( name == VCAdditionalNamesProp ) - c.setMiddleName( value ); - } - } - else if ( name == VCAdrProp ) { - bool work = TRUE; // default address is work address - QString street; - QString city; - QString region; - QString postal; - QString country; - - VObjectIterator nit; - initPropIterator( &nit, o ); - while( moreIteration( &nit ) ) { - VObject *o = nextVObject( &nit ); - QCString name = vObjectName( o ); - QString value = vObjectStringZValue( o ); - if ( name == VCHomeProp ) - work = FALSE; - else if ( name == VCWorkProp ) - work = TRUE; - else if ( name == VCStreetAddressProp ) - street = value; - else if ( name == VCCityProp ) - city = value; - else if ( name == VCRegionProp ) - region = value; - else if ( name == VCPostalCodeProp ) - postal = value; - else if ( name == VCCountryNameProp ) - country = value; - } - if ( work ) { - c.setBusinessStreet( street ); - c.setBusinessCity( city ); - c.setBusinessCountry( country ); - c.setBusinessZip( postal ); - c.setBusinessState( region ); - } else { - c.setHomeStreet( street ); - c.setHomeCity( city ); - c.setHomeCountry( country ); - c.setHomeZip( postal ); - c.setHomeState( region ); - } - } - else if ( name == VCTelephoneProp ) { - enum { - HOME = 0x01, - WORK = 0x02, - VOICE = 0x04, - CELL = 0x08, - FAX = 0x10, - PAGER = 0x20, - UNKNOWN = 0x80 - }; - int type = 0; - - VObjectIterator nit; - initPropIterator( &nit, o ); - while( moreIteration( &nit ) ) { - VObject *o = nextVObject( &nit ); - QCString name = vObjectTypeInfo( o ); - if ( name == VCHomeProp ) - type |= HOME; - else if ( name == VCWorkProp ) - type |= WORK; - else if ( name == VCVoiceProp ) - type |= VOICE; - else if ( name == VCCellularProp ) - type |= CELL; - else if ( name == VCFaxProp ) - type |= FAX; - else if ( name == VCPagerProp ) - type |= PAGER; - else if ( name == VCPreferredProp ) - ; - else - type |= UNKNOWN; - } - if ( (type & UNKNOWN) != UNKNOWN ) { - if ( ( type & (HOME|WORK) ) == 0 ) // default - type |= HOME; - if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default - type |= VOICE; - - qWarning("value %s %d", value.data(), type ); - if ( (type & (VOICE|HOME) ) == (VOICE|HOME) && (type & (CELL|HOME) ) != (CELL|HOME) ) - c.setHomePhone( value ); - if ( ( type & (FAX|HOME) ) == (FAX|HOME) ) - c.setHomeFax( value ); - if ( ( type & (CELL|HOME) ) == (CELL|HOME) ) - c.setHomeMobile( value ); - if ( ( type & (VOICE|WORK) ) == (VOICE|WORK) && (type & (CELL|WORK) ) != (CELL|WORK) ) - c.setBusinessPhone( value ); - if ( ( type & (FAX|WORK) ) == (FAX|WORK) ) - c.setBusinessFax( value ); - if ( ( type & (CELL|WORK) ) == (CELL|WORK) ) - c.setBusinessMobile( value ); - if ( ( type & (PAGER|WORK) ) == (PAGER|WORK) ) - c.setBusinessPager( value ); - } - } - else if ( name == VCEmailAddressProp ) { - QString email = vObjectStringZValue( o ); - bool valid = TRUE; - VObjectIterator nit; - initPropIterator( &nit, o ); - while( moreIteration( &nit ) ) { - VObject *o = nextVObject( &nit ); - QCString name = vObjectTypeInfo( o ); - if ( name != VCInternetProp && name != VCHomeProp && - name != VCWorkProp && - name != VCPreferredProp ) - // ### preffered should map to default email - valid = FALSE; - } - if ( valid ) { - c.insertEmail( email ); - } - } - else if ( name == VCURLProp ) { - VObjectIterator nit; - initPropIterator( &nit, o ); - while( moreIteration( &nit ) ) { - VObject *o = nextVObject( &nit ); - QCString name = vObjectTypeInfo( o ); - if ( name == VCHomeProp ) - c.setHomeWebpage( value ); - else if ( name == VCWorkProp ) - c.setBusinessWebpage( value ); - } - } - else if ( name == VCOrgProp ) { - VObjectIterator nit; - initPropIterator( &nit, o ); - while( moreIteration( &nit ) ) { - VObject *o = nextVObject( &nit ); - QCString name = vObjectName( o ); - QString value = vObjectStringZValue( o ); - if ( name == VCOrgNameProp ) - c.setCompany( value ); - else if ( name == VCOrgUnitProp ) - c.setDepartment( value ); - else if ( name == VCOrgUnit2Prop ) - c.setOffice( value ); - } - } - else if ( name == VCTitleProp ) { - c.setJobTitle( value ); - } - else if ( name == "X-Qtopia-Profession" ) { - c.setProfession( value ); - } - else if ( name == "X-Qtopia-Manager" ) { - c.setManager( value ); - } - else if ( name == "X-Qtopia-Assistant" ) { - c.setAssistant( value ); - } - else if ( name == "X-Qtopia-Spouse" ) { - c.setSpouse( value ); - } - else if ( name == "X-Qtopia-Gender" ) { - c.setGender( value ); - } - else if ( name == "X-Qtopia-Anniversary" ) { - c.setAnniversary( convVCardDateToDate( value ) ); - } - else if ( name == "X-Qtopia-Nickname" ) { - c.setNickname( value ); - } - else if ( name == "X-Qtopia-Children" ) { - c.setChildren( value ); - } - else if ( name == VCBirthDateProp ) { - // Reading Birthdate regarding RFC 2425 (5.8.4) - c.setBirthday( convVCardDateToDate( value ) ); - - } - else if ( name == VCCommentProp ) { - c.setNotes( value ); - } -#if 0 - else { - printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) ); - VObjectIterator nit; - initPropIterator( &nit, o ); - while( moreIteration( &nit ) ) { - VObject *o = nextVObject( &nit ); - QCString name = vObjectName( o ); - QString value = vObjectStringZValue( o ); - printf(" subprop: %s = %s\n", name.data(), value.latin1() ); - } - } -#endif - } - c.setFileAs(); - return c; -} - - -VObject* OContactAccessBackend_VCard::createVObject( const OContact &c ) -{ - VObject *vcard = newVObject( VCCardProp ); - safeAddPropValue( vcard, VCVersionProp, "2.1" ); - safeAddPropValue( vcard, VCLastRevisedProp, TimeConversion::toISO8601( QDateTime::currentDateTime() ) ); - safeAddPropValue( vcard, VCUniqueStringProp, QString::number(c.uid()) ); - - // full name - safeAddPropValue( vcard, VCFullNameProp, c.fullName() ); - - // name properties - VObject *name = safeAddProp( vcard, VCNameProp ); - safeAddPropValue( name, VCFamilyNameProp, c.lastName() ); - safeAddPropValue( name, VCGivenNameProp, c.firstName() ); - safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() ); - safeAddPropValue( name, VCNamePrefixesProp, c.title() ); - safeAddPropValue( name, VCNameSuffixesProp, c.suffix() ); - - // home properties - VObject *home_adr= safeAddProp( vcard, VCAdrProp ); - safeAddProp( home_adr, VCHomeProp ); - safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() ); - safeAddPropValue( home_adr, VCCityProp, c.homeCity() ); - safeAddPropValue( home_adr, VCRegionProp, c.homeState() ); - safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() ); - safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() ); - - VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() ); - safeAddProp( home_phone, VCHomeProp ); - home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() ); - safeAddProp( home_phone, VCHomeProp ); - safeAddProp( home_phone, VCCellularProp ); - home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() ); - safeAddProp( home_phone, VCHomeProp ); - safeAddProp( home_phone, VCFaxProp ); - - VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() ); - safeAddProp( url, VCHomeProp ); - - // work properties - VObject *work_adr= safeAddProp( vcard, VCAdrProp ); - safeAddProp( work_adr, VCWorkProp ); - safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() ); - safeAddPropValue( work_adr, VCCityProp, c.businessCity() ); - safeAddPropValue( work_adr, VCRegionProp, c.businessState() ); - safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() ); - safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() ); - - VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() ); - safeAddProp( work_phone, VCWorkProp ); - work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() ); - safeAddProp( work_phone, VCWorkProp ); - safeAddProp( work_phone, VCCellularProp ); - work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() ); - safeAddProp( work_phone, VCWorkProp ); - safeAddProp( work_phone, VCFaxProp ); - work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() ); - safeAddProp( work_phone, VCWorkProp ); - safeAddProp( work_phone, VCPagerProp ); - - url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() ); - safeAddProp( url, VCWorkProp ); - - VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() ); - safeAddProp( title, VCWorkProp ); - - - QStringList emails = c.emailList(); - // emails.prepend( c.defaultEmail() ); Fix for bugreport #1045 - for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) { - VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it ); - safeAddProp( email, VCInternetProp ); - } - - safeAddPropValue( vcard, VCNoteProp, c.notes() ); - - // Exporting Birthday regarding RFC 2425 (5.8.4) - if ( c.birthday().isValid() ){ - qWarning("Exporting birthday as: %s", convDateToVCardDate( c.birthday() ).latin1() ); - safeAddPropValue( vcard, VCBirthDateProp, convDateToVCardDate( c.birthday() ) ); - } - - if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) { - VObject *org = safeAddProp( vcard, VCOrgProp ); - safeAddPropValue( org, VCOrgNameProp, c.company() ); - safeAddPropValue( org, VCOrgUnitProp, c.department() ); - safeAddPropValue( org, VCOrgUnit2Prop, c.office() ); - } - - // some values we have to export as custom fields - safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() ); - safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() ); - safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() ); - - safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() ); - safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() ); - if ( c.anniversary().isValid() ){ - qWarning("Exporting anniversary as: %s", convDateToVCardDate( c.anniversary() ).latin1() ); - safeAddPropValue( vcard, "X-Qtopia-Anniversary", convDateToVCardDate( c.anniversary() ) ); - } - safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() ); - safeAddPropValue( vcard, "X-Qtopia-Children", c.children() ); - - return vcard; -} - -QString OContactAccessBackend_VCard::convDateToVCardDate( const QDate& d ) const -{ - QString str_rfc2425 = QString("%1-%2-%3") - .arg( d.year() ) - .arg( d.month(), 2 ) - .arg( d.day(), 2 ); - // Now replace spaces with "0"... - int pos = 0; - while ( ( pos = str_rfc2425.find (' ') ) > 0 ) - str_rfc2425.replace( pos, 1, "0" ); - - return str_rfc2425; -} - -QDate OContactAccessBackend_VCard::convVCardDateToDate( const QString& datestr ) -{ - int monthPos = datestr.find('-'); - int dayPos = datestr.find('-', monthPos+1 ); - int sep_ignore = 1; - if ( monthPos == -1 || dayPos == -1 ) { - qDebug("fromString didn't find - in str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos ); - // Ok.. No "-" found, therefore we will try to read other format ( YYYYMMDD ) - if ( datestr.length() == 8 ){ - monthPos = 4; - dayPos = 6; - sep_ignore = 0; - qDebug("Try with follwing positions str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos ); - } else { - return QDate(); - } - } - int y = datestr.left( monthPos ).toInt(); - int m = datestr.mid( monthPos + sep_ignore, dayPos - monthPos - sep_ignore ).toInt(); - int d = datestr.mid( dayPos + sep_ignore ).toInt(); - qDebug("TimeConversion::fromString ymd = %s => %d %d %d; mpos = %d ypos = %d", datestr.latin1(), y, m, d, monthPos, dayPos); - QDate date ( y,m,d ); - return date; -} - -VObject* OContactAccessBackend_VCard::safeAddPropValue( VObject *o, const char *prop, const QString &value ) -{ - VObject *ret = 0; - if ( o && !value.isEmpty() ) - ret = addPropValue( o, prop, value.latin1() ); - return ret; -} - -VObject* OContactAccessBackend_VCard::safeAddProp( VObject *o, const char *prop) -{ - VObject *ret = 0; - if ( o ) - ret = addProp( o, prop ); - return ret; -} diff --git a/libopie/pim/ocontactaccessbackend_vcard.h b/libopie/pim/ocontactaccessbackend_vcard.h deleted file mode 100644 index 712d769..0000000 --- a/libopie/pim/ocontactaccessbackend_vcard.h +++ b/dev/null @@ -1,96 +0,0 @@ -/* - * VCard Backend for the OPIE-Contact Database. - * - * Copyright (C) 2000 Trolltech AS. All rights reserved. - * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) - * - * ===================================================================== - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * ===================================================================== - * ToDo: - * - * ===================================================================== - * Version: $Id$ - * ===================================================================== - * History: - * $Log$ - * Revision 1.6 2003/04/13 18:07:10 zecke - * More API doc - * QString -> const QString& - * QString = 0l -> QString::null - * - * Revision 1.5 2003/03/21 10:33:09 eilers - * Merged speed optimized xml backend for contacts to main. - * Added QDateTime to querybyexample. For instance, it is now possible to get - * all Birthdays/Anniversaries between two dates. This should be used - * to show all birthdays in the datebook.. - * This change is sourcecode backward compatible but you have to upgrade - * the binaries for today-addressbook. - * - * Revision 1.4 2002/12/07 13:26:22 eilers - * Fixing bug in storing anniversary.. - * - * Revision 1.3 2002/11/13 14:14:51 eilers - * Added sorted for Contacts.. - * - * Revision 1.2 2002/11/10 15:41:53 eilers - * Bugfixes.. - * - * Revision 1.1 2002/11/09 14:34:52 eilers - * Added VCard Backend. - * - */ -#ifndef __OCONTACTACCESSBACKEND_VCARD_H_ -#define __OCONTACTACCESSBACKEND_VCARD_H_ - -#include <opie/ocontact.h> - -#include "ocontactaccessbackend.h" - -class VObject; - -/** - * This is the vCard 2.1 implementation of the Contact Storage - * @see OContactAccessBackend_XML - * @see OPimAccessBackend - */ -class OContactAccessBackend_VCard : public OContactAccessBackend { - public: - OContactAccessBackend_VCard ( const QString& appname, const QString& filename = QString::null ); - - bool load (); - bool reload(); - bool save(); - void clear (); - - bool add ( const OContact& newcontact ); - bool remove ( int uid ); - bool replace ( const OContact& contact ); - - OContact find ( int uid ) const; - QArray<int> allRecords() const; - QArray<int> queryByExample ( const OContact &query, int settings, const QDateTime& d = QDateTime() ); - QArray<int> matchRegexp( const QRegExp &r ) const; - - const uint querySettings(); - bool hasQuerySettings (uint querySettings) const; - QArray<int> sorted( bool ascending, int sortOrder, int sortFilter, int cat ); - bool wasChangedExternally(); - -private: - OContact parseVObject( VObject* obj ); - VObject* createVObject( const OContact& c ); - QString convDateToVCardDate( const QDate& c ) const; - QDate convVCardDateToDate( const QString& datestr ); - VObject *safeAddPropValue( VObject *o, const char* prop, const QString& value ); - VObject *safeAddProp( VObject* o, const char* prop); - - bool m_dirty : 1; - QString m_file; - QMap<int, OContact> m_map; -}; - -#endif diff --git a/libopie/pim/ocontactaccessbackend_xml.cpp b/libopie/pim/ocontactaccessbackend_xml.cpp deleted file mode 100644 index 2373ad6..0000000 --- a/libopie/pim/ocontactaccessbackend_xml.cpp +++ b/dev/null @@ -1,821 +0,0 @@ -/* - * XML Backend for the OPIE-Contact Database. - * - * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) - * - * ===================================================================== - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * ===================================================================== - * - * ===================================================================== - * Version: $Id$ - * ===================================================================== - * History: - * $Log$ - * Revision 1.10 2004/03/01 15:44:36 chicken - * fix includes - * - * Revision 1.9 2003/09/22 14:31:16 eilers - * Added first experimental incarnation of sql-backend for addressbook. - * Some modifications to be able to compile the todo sql-backend. - * A lot of changes fill follow... - * - * Revision 1.8 2003/08/30 15:28:26 eilers - * Removed some unimportant debug output which causes slow down.. - * - * Revision 1.7 2003/08/01 12:30:16 eilers - * Merging changes from BRANCH_1_0 to HEAD - * - * Revision 1.6 2003/07/07 16:19:47 eilers - * Fixing serious bug in hasQuerySettings() - * - * Revision 1.5 2003/04/13 18:07:10 zecke - * More API doc - * QString -> const QString& - * QString = 0l -> QString::null - * - * Revision 1.4 2003/03/21 14:32:54 mickeyl - * g++ compliance fix: default arguments belong into the declaration, but not the definition - * - * Revision 1.3 2003/03/21 12:26:28 eilers - * Fixing small bug: If we search a birthday from today to today, it returned - * every contact .. - * - * Revision 1.2 2003/03/21 10:33:09 eilers - * Merged speed optimized xml backend for contacts to main. - * Added QDateTime to querybyexample. For instance, it is now possible to get - * all Birthdays/Anniversaries between two dates. This should be used - * to show all birthdays in the datebook.. - * This change is sourcecode backward compatible but you have to upgrade - * the binaries for today-addressbook. - * - * Revision 1.1.2.2 2003/02/11 12:17:28 eilers - * Speed optimization. Removed the sequential search loops. - * - * Revision 1.1.2.1 2003/02/10 15:31:38 eilers - * Writing offsets to debug output.. - * - * Revision 1.1 2003/02/09 15:05:01 eilers - * Nothing happened.. Just some cleanup before I will start.. - * - * Revision 1.12 2003/01/03 16:58:03 eilers - * Reenable debug output - * - * Revision 1.11 2003/01/03 12:31:28 eilers - * Bugfix for calculating data diffs.. - * - * Revision 1.10 2003/01/02 14:27:12 eilers - * Improved query by example: Search by date is possible.. First step - * for a today plugin for birthdays.. - * - * Revision 1.9 2002/12/08 12:48:57 eilers - * Moved journal-enum from ocontact into i the xml-backend.. - * - * Revision 1.8 2002/11/14 17:04:24 eilers - * Sorting will now work if fullname is identical on some entries - * - * Revision 1.7 2002/11/13 15:02:46 eilers - * Small Bug in sorted fixed - * - * Revision 1.6 2002/11/13 14:14:51 eilers - * Added sorted for Contacts.. - * - * Revision 1.5 2002/11/01 15:10:42 eilers - * Added regExp-search in database for all fields in a contact. - * - * Revision 1.4 2002/10/16 10:52:40 eilers - * Added some docu to the interface and now using the cache infrastucture by zecke.. :) - * - * Revision 1.3 2002/10/14 16:21:54 eilers - * Some minor interface updates - * - * Revision 1.2 2002/10/07 17:34:24 eilers - * added OBackendFactory for advanced backend access - * - * Revision 1.1 2002/09/27 17:11:44 eilers - * Added API for accessing the Contact-Database ! It is compiling, but - * please do not expect that anything is working ! - * I will debug that stuff in the next time .. - * Please read README_COMPILE for compiling ! - * - * - */ - -#include "ocontactaccessbackend_xml.h" - -#include <qasciidict.h> -#include <qfile.h> -#include <qfileinfo.h> -#include <qregexp.h> -#include <qarray.h> -#include <qmap.h> - -#include <qpe/global.h> - -#include <opie/xmltree.h> -#include "ocontactaccessbackend.h" -#include "ocontactaccess.h" - -#include <stdlib.h> -#include <errno.h> - -using namespace Opie; - - -OContactAccessBackend_XML::OContactAccessBackend_XML ( const QString& appname, const QString& filename ): - m_changed( false ) -{ - // Just m_contactlist should call delete if an entry - // is removed. - m_contactList.setAutoDelete( true ); - m_uidToContact.setAutoDelete( false ); - - m_appName = appname; - - /* Set journalfile name ... */ - m_journalName = getenv("HOME"); - m_journalName +="/.abjournal" + appname; - - /* Expecting to access the default filename if nothing else is set */ - if ( filename.isEmpty() ){ - m_fileName = Global::applicationFileName( "addressbook","addressbook.xml" ); - } else - m_fileName = filename; - - /* Load Database now */ - load (); -} - -bool OContactAccessBackend_XML::save() -{ - - if ( !m_changed ) - return true; - - QString strNewFile = m_fileName + ".new"; - QFile f( strNewFile ); - if ( !f.open( IO_WriteOnly|IO_Raw ) ) - return false; - - int total_written; - int idx_offset = 0; - QString out; - - // Write Header - out = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE Addressbook ><AddressBook>\n" - " <Groups>\n" - " </Groups>\n" - " <Contacts>\n"; - QCString cstr = out.utf8(); - f.writeBlock( cstr.data(), cstr.length() ); - idx_offset += cstr.length(); - out = ""; - - // Write all contacts - QListIterator<OContact> it( m_contactList ); - for ( ; it.current(); ++it ) { - // qWarning(" Uid %d at Offset: %x", (*it)->uid(), idx_offset ); - out += "<Contact "; - (*it)->save( out ); - out += "/>\n"; - cstr = out.utf8(); - total_written = f.writeBlock( cstr.data(), cstr.length() ); - idx_offset += cstr.length(); - if ( total_written != int(cstr.length()) ) { - f.close(); - QFile::remove( strNewFile ); - return false; - } - out = ""; - } - out += " </Contacts>\n</AddressBook>\n"; - - // Write Footer - cstr = out.utf8(); - total_written = f.writeBlock( cstr.data(), cstr.length() ); - if ( total_written != int( cstr.length() ) ) { - f.close(); - QFile::remove( strNewFile ); - return false; - } - f.close(); - - // move the file over, I'm just going to use the system call - // because, I don't feel like using QDir. - if ( ::rename( strNewFile.latin1(), m_fileName.latin1() ) < 0 ) { - qWarning( "problem renaming file %s to %s, errno: %d", - strNewFile.latin1(), m_journalName.latin1(), errno ); - // remove the tmp file... - QFile::remove( strNewFile ); - } - - /* The journalfile should be removed now... */ - removeJournal(); - - m_changed = false; - return true; -} - -bool OContactAccessBackend_XML::load () -{ - m_contactList.clear(); - m_uidToContact.clear(); - - /* Load XML-File and journal if it exists */ - if ( !load ( m_fileName, false ) ) - return false; - /* The returncode of the journalfile is ignored due to the - * fact that it does not exist when this class is instantiated ! - * But there may such a file exist, if the application crashed. - * Therefore we try to load it to get the changes before the # - * crash happened... - */ - load (m_journalName, true); - - return true; -} - -void OContactAccessBackend_XML::clear () -{ - m_contactList.clear(); - m_uidToContact.clear(); - - m_changed = false; -} - -bool OContactAccessBackend_XML::wasChangedExternally() -{ - QFileInfo fi( m_fileName ); - - QDateTime lastmod = fi.lastModified (); - - return (lastmod != m_readtime); -} - -QArray<int> OContactAccessBackend_XML::allRecords() const -{ - QArray<int> uid_list( m_contactList.count() ); - - uint counter = 0; - QListIterator<OContact> it( m_contactList ); - for( ; it.current(); ++it ){ - uid_list[counter++] = (*it)->uid(); - } - - return ( uid_list ); -} - -OContact OContactAccessBackend_XML::find ( int uid ) const -{ - OContact foundContact; //Create empty contact - - OContact* found = m_uidToContact.find( QString().setNum( uid ) ); - - if ( found ){ - foundContact = *found; - } - - return ( foundContact ); -} - -QArray<int> OContactAccessBackend_XML::queryByExample ( const OContact &query, int settings, - const QDateTime& d ) -{ - - QArray<int> m_currentQuery( m_contactList.count() ); - QListIterator<OContact> it( m_contactList ); - uint arraycounter = 0; - - for( ; it.current(); ++it ){ - /* Search all fields and compare them with query object. Store them into list - * if all fields matches. - */ - QDate* queryDate = 0l; - QDate* checkDate = 0l; - bool allcorrect = true; - for ( int i = 0; i < Qtopia::Groups; i++ ) { - // Birthday and anniversary are special nonstring fields and should - // be handled specially - switch ( i ){ - case Qtopia::Birthday: - queryDate = new QDate( query.birthday() ); - checkDate = new QDate( (*it)->birthday() ); - case Qtopia::Anniversary: - if ( queryDate == 0l ){ - queryDate = new QDate( query.anniversary() ); - checkDate = new QDate( (*it)->anniversary() ); - } - - if ( queryDate->isValid() ){ - if( checkDate->isValid() ){ - if ( settings & OContactAccess::DateYear ){ - if ( queryDate->year() != checkDate->year() ) - allcorrect = false; - } - if ( settings & OContactAccess::DateMonth ){ - if ( queryDate->month() != checkDate->month() ) - allcorrect = false; - } - if ( settings & OContactAccess::DateDay ){ - if ( queryDate->day() != checkDate->day() ) - allcorrect = false; - } - if ( settings & OContactAccess::DateDiff ) { - QDate current; - // If we get an additional date, we - // will take this date instead of - // the current one.. - if ( !d.date().isValid() ) - current = QDate::currentDate(); - else - current = d.date(); - - // We have to equalize the year, otherwise - // the search will fail.. - checkDate->setYMD( current.year(), - checkDate->month(), - checkDate->day() ); - if ( *checkDate < current ) - checkDate->setYMD( current.year()+1, - checkDate->month(), - checkDate->day() ); - - // Check whether the birthday/anniversary date is between - // the current/given date and the maximum date - // ( maximum time range ) ! - qWarning("Checking if %s is between %s and %s ! ", - checkDate->toString().latin1(), - current.toString().latin1(), - queryDate->toString().latin1() ); - if ( current.daysTo( *queryDate ) >= 0 ){ - if ( !( ( *checkDate >= current ) && - ( *checkDate <= *queryDate ) ) ){ - allcorrect = false; - qWarning (" Nope!.."); - } - } - } - } else{ - // checkDate is invalid. Therefore this entry is always rejected - allcorrect = false; - } - } - - delete queryDate; - queryDate = 0l; - delete checkDate; - checkDate = 0l; - break; - default: - /* Just compare fields which are not empty in the query object */ - if ( !query.field(i).isEmpty() ){ - switch ( settings & ~( OContactAccess::IgnoreCase - | OContactAccess::DateDiff - | OContactAccess::DateYear - | OContactAccess::DateMonth - | OContactAccess::DateDay - | OContactAccess::MatchOne - ) ){ - - case OContactAccess::RegExp:{ - QRegExp expr ( query.field(i), - !(settings & OContactAccess::IgnoreCase), - false ); - if ( expr.find ( (*it)->field(i), 0 ) == -1 ) - allcorrect = false; - } - break; - case OContactAccess::WildCards:{ - QRegExp expr ( query.field(i), - !(settings & OContactAccess::IgnoreCase), - true ); - if ( expr.find ( (*it)->field(i), 0 ) == -1 ) - allcorrect = false; - } - break; - case OContactAccess::ExactMatch:{ - if (settings & OContactAccess::IgnoreCase){ - if ( query.field(i).upper() != - (*it)->field(i).upper() ) - allcorrect = false; - }else{ - if ( query.field(i) != (*it)->field(i) ) - allcorrect = false; - } - } - break; - } - } - } - } - if ( allcorrect ){ - m_currentQuery[arraycounter++] = (*it)->uid(); - } - } - - // Shrink to fit.. - m_currentQuery.resize(arraycounter); - - return m_currentQuery; -} - -QArray<int> OContactAccessBackend_XML::matchRegexp( const QRegExp &r ) const -{ - QArray<int> m_currentQuery( m_contactList.count() ); - QListIterator<OContact> it( m_contactList ); - uint arraycounter = 0; - - for( ; it.current(); ++it ){ - if ( (*it)->match( r ) ){ - m_currentQuery[arraycounter++] = (*it)->uid(); - } - - } - // Shrink to fit.. - m_currentQuery.resize(arraycounter); - - return m_currentQuery; -} - -const uint OContactAccessBackend_XML::querySettings() -{ - return ( OContactAccess::WildCards - | OContactAccess::IgnoreCase - | OContactAccess::RegExp - | OContactAccess::ExactMatch - | OContactAccess::DateDiff - | OContactAccess::DateYear - | OContactAccess::DateMonth - | OContactAccess::DateDay - ); -} - -bool OContactAccessBackend_XML::hasQuerySettings (uint querySettings) const -{ - /* OContactAccess::IgnoreCase, DateDiff, DateYear, DateMonth, DateDay - * may be added with any of the other settings. IgnoreCase should never used alone. - * Wildcards, RegExp, ExactMatch should never used at the same time... - */ - - // Step 1: Check whether the given settings are supported by this backend - if ( ( querySettings & ( - OContactAccess::IgnoreCase - | OContactAccess::WildCards - | OContactAccess::DateDiff - | OContactAccess::DateYear - | OContactAccess::DateMonth - | OContactAccess::DateDay - | OContactAccess::RegExp - | OContactAccess::ExactMatch - ) ) != querySettings ) - return false; - - // Step 2: Check whether the given combinations are ok.. - - // IngoreCase alone is invalid - if ( querySettings == OContactAccess::IgnoreCase ) - return false; - - // WildCards, RegExp and ExactMatch should never used at the same time - switch ( querySettings & ~( OContactAccess::IgnoreCase - | OContactAccess::DateDiff - | OContactAccess::DateYear - | OContactAccess::DateMonth - | OContactAccess::DateDay - ) - ){ - case OContactAccess::RegExp: - return ( true ); - case OContactAccess::WildCards: - return ( true ); - case OContactAccess::ExactMatch: - return ( true ); - case 0: // one of the upper removed bits were set.. - return ( true ); - default: - return ( false ); - } -} - -// Currently only asc implemented.. -QArray<int> OContactAccessBackend_XML::sorted( bool asc, int , int , int ) -{ - QMap<QString, int> nameToUid; - QStringList names; - QArray<int> m_currentQuery( m_contactList.count() ); - - // First fill map and StringList with all Names - // Afterwards sort namelist and use map to fill array to return.. - QListIterator<OContact> it( m_contactList ); - for( ; it.current(); ++it ){ - names.append( (*it)->fileAs() + QString::number( (*it)->uid() ) ); - nameToUid.insert( (*it)->fileAs() + QString::number( (*it)->uid() ), (*it)->uid() ); - } - names.sort(); - - int i = 0; - if ( asc ){ - for ( QStringList::Iterator it = names.begin(); it != names.end(); ++it ) - m_currentQuery[i++] = nameToUid[ (*it) ]; - }else{ - for ( QStringList::Iterator it = names.end(); it != names.begin(); --it ) - m_currentQuery[i++] = nameToUid[ (*it) ]; - } - - return m_currentQuery; - -} - -bool OContactAccessBackend_XML::add ( const OContact &newcontact ) -{ - //qWarning("odefaultbackend: ACTION::ADD"); - updateJournal (newcontact, ACTION_ADD); - addContact_p( newcontact ); - - m_changed = true; - - return true; -} - -bool OContactAccessBackend_XML::replace ( const OContact &contact ) -{ - m_changed = true; - - OContact* found = m_uidToContact.find ( QString().setNum( contact.uid() ) ); - - if ( found ) { - OContact* newCont = new OContact( contact ); - - updateJournal ( *newCont, ACTION_REPLACE); - m_contactList.removeRef ( found ); - m_contactList.append ( newCont ); - m_uidToContact.remove( QString().setNum( contact.uid() ) ); - m_uidToContact.insert( QString().setNum( newCont->uid() ), newCont ); - - qWarning("Nur zur Sicherheit: %d == %d ?",contact.uid(), newCont->uid()); - - return true; - } else - return false; -} - -bool OContactAccessBackend_XML::remove ( int uid ) -{ - m_changed = true; - - OContact* found = m_uidToContact.find ( QString().setNum( uid ) ); - - if ( found ) { - updateJournal ( *found, ACTION_REMOVE); - m_contactList.removeRef ( found ); - m_uidToContact.remove( QString().setNum( uid ) ); - - return true; - } else - return false; -} - -bool OContactAccessBackend_XML::reload(){ - /* Reload is the same as load in this implementation */ - return ( load() ); -} - -void OContactAccessBackend_XML::addContact_p( const OContact &newcontact ) -{ - OContact* contRef = new OContact( newcontact ); - - m_contactList.append ( contRef ); - m_uidToContact.insert( QString().setNum( newcontact.uid() ), contRef ); -} - -/* This function loads the xml-database and the journalfile */ -bool OContactAccessBackend_XML::load( const QString filename, bool isJournal ) -{ - - /* We use the time of the last read to check if the file was - * changed externally. - */ - if ( !isJournal ){ - QFileInfo fi( filename ); - m_readtime = fi.lastModified (); - } - - const int JOURNALACTION = Qtopia::Notes + 1; - const int JOURNALROW = JOURNALACTION + 1; - - bool foundAction = false; - journal_action action = ACTION_ADD; - int journalKey = 0; - QMap<int, QString> contactMap; - QMap<QString, QString> customMap; - QMap<QString, QString>::Iterator customIt; - QAsciiDict<int> dict( 47 ); - - dict.setAutoDelete( TRUE ); - dict.insert( "Uid", new int(Qtopia::AddressUid) ); - dict.insert( "Title", new int(Qtopia::Title) ); - dict.insert( "FirstName", new int(Qtopia::FirstName) ); - dict.insert( "MiddleName", new int(Qtopia::MiddleName) ); - dict.insert( "LastName", new int(Qtopia::LastName) ); - dict.insert( "Suffix", new int(Qtopia::Suffix) ); - dict.insert( "FileAs", new int(Qtopia::FileAs) ); - dict.insert( "Categories", new int(Qtopia::AddressCategory) ); - dict.insert( "DefaultEmail", new int(Qtopia::DefaultEmail) ); - dict.insert( "Emails", new int(Qtopia::Emails) ); - dict.insert( "HomeStreet", new int(Qtopia::HomeStreet) ); - dict.insert( "HomeCity", new int(Qtopia::HomeCity) ); - dict.insert( "HomeState", new int(Qtopia::HomeState) ); - dict.insert( "HomeZip", new int(Qtopia::HomeZip) ); - dict.insert( "HomeCountry", new int(Qtopia::HomeCountry) ); - dict.insert( "HomePhone", new int(Qtopia::HomePhone) ); - dict.insert( "HomeFax", new int(Qtopia::HomeFax) ); - dict.insert( "HomeMobile", new int(Qtopia::HomeMobile) ); - dict.insert( "HomeWebPage", new int(Qtopia::HomeWebPage) ); - dict.insert( "Company", new int(Qtopia::Company) ); - dict.insert( "BusinessStreet", new int(Qtopia::BusinessStreet) ); - dict.insert( "BusinessCity", new int(Qtopia::BusinessCity) ); - dict.insert( "BusinessState", new int(Qtopia::BusinessState) ); - dict.insert( "BusinessZip", new int(Qtopia::BusinessZip) ); - dict.insert( "BusinessCountry", new int(Qtopia::BusinessCountry) ); - dict.insert( "BusinessWebPage", new int(Qtopia::BusinessWebPage) ); - dict.insert( "JobTitle", new int(Qtopia::JobTitle) ); - dict.insert( "Department", new int(Qtopia::Department) ); - dict.insert( "Office", new int(Qtopia::Office) ); - dict.insert( "BusinessPhone", new int(Qtopia::BusinessPhone) ); - dict.insert( "BusinessFax", new int(Qtopia::BusinessFax) ); - dict.insert( "BusinessMobile", new int(Qtopia::BusinessMobile) ); - dict.insert( "BusinessPager", new int(Qtopia::BusinessPager) ); - dict.insert( "Profession", new int(Qtopia::Profession) ); - dict.insert( "Assistant", new int(Qtopia::Assistant) ); - dict.insert( "Manager", new int(Qtopia::Manager) ); - dict.insert( "Spouse", new int(Qtopia::Spouse) ); - dict.insert( "Children", new int(Qtopia::Children) ); - dict.insert( "Gender", new int(Qtopia::Gender) ); - dict.insert( "Birthday", new int(Qtopia::Birthday) ); - dict.insert( "Anniversary", new int(Qtopia::Anniversary) ); - dict.insert( "Nickname", new int(Qtopia::Nickname) ); - dict.insert( "Notes", new int(Qtopia::Notes) ); - dict.insert( "action", new int(JOURNALACTION) ); - dict.insert( "actionrow", new int(JOURNALROW) ); - - //qWarning( "OContactDefaultBackEnd::loading %s", filename.latin1() ); - - XMLElement *root = XMLElement::load( filename ); - if(root != 0l ){ // start parsing - /* Parse all XML-Elements and put the data into the - * Contact-Class - */ - XMLElement *element = root->firstChild(); - //qWarning("OContactAccess::load tagName(): %s", root->tagName().latin1() ); - element = element->firstChild(); - - /* Search Tag "Contacts" which is the parent of all Contacts */ - while( element && !isJournal ){ - if( element->tagName() != QString::fromLatin1("Contacts") ){ - //qWarning ("OContactDefBack::Searching for Tag \"Contacts\"! Found: %s", - // element->tagName().latin1()); - element = element->nextChild(); - } else { - element = element->firstChild(); - break; - } - } - /* Parse all Contacts and ignore unknown tags */ - while( element ){ - if( element->tagName() != QString::fromLatin1("Contact") ){ - //qWarning ("OContactDefBack::Searching for Tag \"Contact\"! Found: %s", - // element->tagName().latin1()); - element = element->nextChild(); - continue; - } - /* Found alement with tagname "contact", now parse and store all - * attributes contained - */ - //qWarning("OContactDefBack::load element tagName() : %s", - // element->tagName().latin1() ); - QString dummy; - foundAction = false; - - XMLElement::AttributeMap aMap = element->attributes(); - XMLElement::AttributeMap::Iterator it; - contactMap.clear(); - customMap.clear(); - for( it = aMap.begin(); it != aMap.end(); ++it ){ - // qWarning ("Read Attribute: %s=%s", it.key().latin1(),it.data().latin1()); - - int *find = dict[ it.key() ]; - /* Unknown attributes will be stored as "Custom" elements */ - if ( !find ) { - // qWarning("Attribute %s not known.", it.key().latin1()); - //contact.setCustomField(it.key(), it.data()); - customMap.insert( it.key(), it.data() ); - continue; - } - - /* Check if special conversion is needed and add attribute - * into Contact class - */ - switch( *find ) { - /* - case Qtopia::AddressUid: - contact.setUid( it.data().toInt() ); - break; - case Qtopia::AddressCategory: - contact.setCategories( Qtopia::Record::idsFromString( it.data( ))); - break; - */ - case JOURNALACTION: - action = journal_action(it.data().toInt()); - foundAction = true; - qWarning ("ODefBack(journal)::ACTION found: %d", action); - break; - case JOURNALROW: - journalKey = it.data().toInt(); - break; - default: // no conversion needed add them to the map - contactMap.insert( *find, it.data() ); - break; - } - } - /* now generate the Contact contact */ - OContact contact( contactMap ); - - for (customIt = customMap.begin(); customIt != customMap.end(); ++customIt ) { - contact.setCustomField( customIt.key(), customIt.data() ); - } - - if (foundAction){ - foundAction = false; - switch ( action ) { - case ACTION_ADD: - addContact_p (contact); - break; - case ACTION_REMOVE: - if ( !remove (contact.uid()) ) - qWarning ("ODefBack(journal)::Unable to remove uid: %d", - contact.uid() ); - break; - case ACTION_REPLACE: - if ( !replace ( contact ) ) - qWarning ("ODefBack(journal)::Unable to replace uid: %d", - contact.uid() ); - break; - default: - qWarning ("Unknown action: ignored !"); - break; - } - }else{ - /* Add contact to list */ - addContact_p (contact); - } - - /* Move to next element */ - element = element->nextChild(); - } - }else { - qWarning("ODefBack::could not load"); - } - delete root; - qWarning("returning from loading" ); - return true; -} - - -void OContactAccessBackend_XML::updateJournal( const OContact& cnt, - journal_action action ) -{ - QFile f( m_journalName ); - bool created = !f.exists(); - if ( !f.open(IO_WriteOnly|IO_Append) ) - return; - - QString buf; - QCString str; - - // if the file was created, we have to set the Tag "<CONTACTS>" to - // get a XML-File which is readable by our parser. - // This is just a cheat, but better than rewrite the parser. - if ( created ){ - buf = "<Contacts>"; - QCString cstr = buf.utf8(); - f.writeBlock( cstr.data(), cstr.length() ); - } - - buf = "<Contact "; - cnt.save( buf ); - buf += " action=\"" + QString::number( (int)action ) + "\" "; - buf += "/>\n"; - QCString cstr = buf.utf8(); - f.writeBlock( cstr.data(), cstr.length() ); -} - -void OContactAccessBackend_XML::removeJournal() -{ - QFile f ( m_journalName ); - if ( f.exists() ) - f.remove(); -} - diff --git a/libopie/pim/ocontactaccessbackend_xml.h b/libopie/pim/ocontactaccessbackend_xml.h deleted file mode 100644 index a0cae4d..0000000 --- a/libopie/pim/ocontactaccessbackend_xml.h +++ b/dev/null @@ -1,160 +0,0 @@ -/* - * XML Backend for the OPIE-Contact Database. - * - * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) - * - * ===================================================================== - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * ===================================================================== - * ToDo: XML-Backend: Automatic reload if something was changed... - * File Locking to protect against concurrent access - * - * - * ===================================================================== - * Version: $Id$ - * ===================================================================== - * History: - * $Log$ - * Revision 1.15 2003/09/22 14:31:16 eilers - * Added first experimental incarnation of sql-backend for addressbook. - * Some modifications to be able to compile the todo sql-backend. - * A lot of changes fill follow... - * - * Revision 1.14 2003/04/13 18:07:10 zecke - * More API doc - * QString -> const QString& - * QString = 0l -> QString::null - * - * Revision 1.13 2003/03/21 10:33:09 eilers - * Merged speed optimized xml backend for contacts to main. - * Added QDateTime to querybyexample. For instance, it is now possible to get - * all Birthdays/Anniversaries between two dates. This should be used - * to show all birthdays in the datebook.. - * This change is sourcecode backward compatible but you have to upgrade - * the binaries for today-addressbook. - * - * Revision 1.12.2.2 2003/02/11 12:17:28 eilers - * Speed optimization. Removed the sequential search loops. - * - * Revision 1.12.2.1 2003/02/09 15:05:01 eilers - * Nothing happened.. Just some cleanup before I will start.. - * - * Revision 1.12 2003/01/03 16:58:03 eilers - * Reenable debug output - * - * Revision 1.11 2003/01/03 12:31:28 eilers - * Bugfix for calculating data diffs.. - * - * Revision 1.10 2003/01/02 14:27:12 eilers - * Improved query by example: Search by date is possible.. First step - * for a today plugin for birthdays.. - * - * Revision 1.9 2002/12/08 12:48:57 eilers - * Moved journal-enum from ocontact into i the xml-backend.. - * - * Revision 1.8 2002/11/14 17:04:24 eilers - * Sorting will now work if fullname is identical on some entries - * - * Revision 1.7 2002/11/13 15:02:46 eilers - * Small Bug in sorted fixed - * - * Revision 1.6 2002/11/13 14:14:51 eilers - * Added sorted for Contacts.. - * - * Revision 1.5 2002/11/01 15:10:42 eilers - * Added regExp-search in database for all fields in a contact. - * - * Revision 1.4 2002/10/16 10:52:40 eilers - * Added some docu to the interface and now using the cache infrastucture by zecke.. :) - * - * Revision 1.3 2002/10/14 16:21:54 eilers - * Some minor interface updates - * - * Revision 1.2 2002/10/07 17:34:24 eilers - * added OBackendFactory for advanced backend access - * - * Revision 1.1 2002/09/27 17:11:44 eilers - * Added API for accessing the Contact-Database ! It is compiling, but - * please do not expect that anything is working ! - * I will debug that stuff in the next time .. - * Please read README_COMPILE for compiling ! - * - * - */ - -#ifndef _OContactAccessBackend_XML_ -#define _OContactAccessBackend_XML_ - -#include "ocontactaccessbackend.h" -#include "ocontactaccess.h" - -#include <qlist.h> -#include <qdict.h> - -/* the default xml implementation */ -/** - * This class is the XML implementation of a Contact backend - * it does implement everything available for OContact. - * @see OPimAccessBackend for more information of available methods - */ -class OContactAccessBackend_XML : public OContactAccessBackend { - public: - OContactAccessBackend_XML ( const QString& appname, const QString& filename = QString::null ); - - bool save(); - - bool load (); - - void clear (); - - bool wasChangedExternally(); - - QArray<int> allRecords() const; - - OContact find ( int uid ) const; - - QArray<int> queryByExample ( const OContact &query, int settings, const QDateTime& d = QDateTime() ); - - QArray<int> matchRegexp( const QRegExp &r ) const; - - const uint querySettings(); - - bool hasQuerySettings (uint querySettings) const; - - // Currently only asc implemented.. - QArray<int> sorted( bool asc, int , int , int ); - bool add ( const OContact &newcontact ); - - bool replace ( const OContact &contact ); - - bool remove ( int uid ); - bool reload(); - - private: - - enum journal_action { ACTION_ADD, ACTION_REMOVE, ACTION_REPLACE }; - - void addContact_p( const OContact &newcontact ); - - /* This function loads the xml-database and the journalfile */ - bool load( const QString filename, bool isJournal ); - - - void updateJournal( const OContact& cnt, journal_action action ); - void removeJournal(); - - protected: - bool m_changed; - QString m_journalName; - QString m_fileName; - QString m_appName; - QList<OContact> m_contactList; - QDateTime m_readtime; - - QDict<OContact> m_uidToContact; -}; - -#endif diff --git a/libopie/pim/ocontactfields.cpp b/libopie/pim/ocontactfields.cpp deleted file mode 100644 index 0f08a5a..0000000 --- a/libopie/pim/ocontactfields.cpp +++ b/dev/null @@ -1,477 +0,0 @@ - -#include "ocontactfields.h" - -#include <qstringlist.h> -#include <qobject.h> - -// We should use our own enum in the future .. -#include <qpe/recordfields.h> -#include <qpe/config.h> -#include <opie/ocontact.h> - -/*! - \internal - Returns a list of personal field names for a contact. -*/ -QStringList OContactFields::personalfields( bool sorted, bool translated ) -{ - QStringList list; - QMap<int, QString> mapIdToStr; - if ( translated ) - mapIdToStr = idToTrFields(); - else - mapIdToStr = idToUntrFields(); - - list.append( mapIdToStr[ Qtopia::AddressUid ] ); - list.append( mapIdToStr[ Qtopia::AddressCategory ] ); - - list.append( mapIdToStr[ Qtopia::Title ] ); - list.append( mapIdToStr[ Qtopia::FirstName ] ); - list.append( mapIdToStr[ Qtopia::MiddleName ] ); - list.append( mapIdToStr[ Qtopia::LastName ] ); - list.append( mapIdToStr[ Qtopia::Suffix ] ); - list.append( mapIdToStr[ Qtopia::FileAs ] ); - - list.append( mapIdToStr[ Qtopia::JobTitle ] ); - list.append( mapIdToStr[ Qtopia::Department ] ); - list.append( mapIdToStr[ Qtopia::Company ] ); - - list.append( mapIdToStr[ Qtopia::Notes ] ); - list.append( mapIdToStr[ Qtopia::Groups ] ); - - if (sorted) list.sort(); - return list; -} - -/*! - \internal - Returns a list of details field names for a contact. -*/ -QStringList OContactFields::detailsfields( bool sorted, bool translated ) -{ - QStringList list; - QMap<int, QString> mapIdToStr; - if ( translated ) - mapIdToStr = idToTrFields(); - else - mapIdToStr = idToUntrFields(); - - list.append( mapIdToStr[ Qtopia::Office ] ); - list.append( mapIdToStr[ Qtopia::Profession ] ); - list.append( mapIdToStr[ Qtopia::Assistant ] ); - list.append( mapIdToStr[ Qtopia::Manager ] ); - - list.append( mapIdToStr[ Qtopia::Spouse ] ); - list.append( mapIdToStr[ Qtopia::Gender ] ); - list.append( mapIdToStr[ Qtopia::Birthday ] ); - list.append( mapIdToStr[ Qtopia::Anniversary ] ); - list.append( mapIdToStr[ Qtopia::Nickname ] ); - list.append( mapIdToStr[ Qtopia::Children ] ); - - if (sorted) list.sort(); - return list; -} - -/*! - \internal - Returns a list of phone field names for a contact. -*/ -QStringList OContactFields::phonefields( bool sorted, bool translated ) -{ - QStringList list; - QMap<int, QString> mapIdToStr; - if ( translated ) - mapIdToStr = idToTrFields(); - else - mapIdToStr = idToUntrFields(); - - list.append( mapIdToStr[Qtopia::BusinessPhone] ); - list.append( mapIdToStr[Qtopia::BusinessFax] ); - list.append( mapIdToStr[Qtopia::BusinessMobile] ); - list.append( mapIdToStr[Qtopia::BusinessPager] ); - list.append( mapIdToStr[Qtopia::BusinessWebPage] ); - - list.append( mapIdToStr[Qtopia::DefaultEmail] ); - list.append( mapIdToStr[Qtopia::Emails] ); - - list.append( mapIdToStr[Qtopia::HomePhone] ); - list.append( mapIdToStr[Qtopia::HomeFax] ); - list.append( mapIdToStr[Qtopia::HomeMobile] ); - // list.append( mapIdToStr[Qtopia::HomePager] ); - list.append( mapIdToStr[Qtopia::HomeWebPage] ); - - if (sorted) list.sort(); - - return list; -} - -/*! - \internal - Returns a list of field names for a contact. -*/ -QStringList OContactFields::fields( bool sorted, bool translated ) -{ - QStringList list; - QMap<int, QString> mapIdToStr; - if ( translated ) - mapIdToStr = idToTrFields(); - else - mapIdToStr = idToUntrFields(); - - list += personalfields( sorted, translated ); - - list += phonefields( sorted, translated ); - - list.append( mapIdToStr[Qtopia::BusinessStreet] ); - list.append( mapIdToStr[Qtopia::BusinessCity] ); - list.append( mapIdToStr[Qtopia::BusinessState] ); - list.append( mapIdToStr[Qtopia::BusinessZip] ); - list.append( mapIdToStr[Qtopia::BusinessCountry] ); - - list.append( mapIdToStr[Qtopia::HomeStreet] ); - list.append( mapIdToStr[Qtopia::HomeCity] ); - list.append( mapIdToStr[Qtopia::HomeState] ); - list.append( mapIdToStr[Qtopia::HomeZip] ); - list.append( mapIdToStr[Qtopia::HomeCountry] ); - - list += detailsfields( sorted, translated ); - - if (sorted) list.sort(); - - return list; -} - - -/*! - \internal - Returns an untranslated list of personal field names for a contact. -*/ -QStringList OContactFields::untrpersonalfields( bool sorted ) -{ - return personalfields( sorted, false ); -} - - -/*! - \internal - Returns a translated list of personal field names for a contact. -*/ -QStringList OContactFields::trpersonalfields( bool sorted ) -{ - return personalfields( sorted, true ); -} - - -/*! - \internal - Returns an untranslated list of details field names for a contact. -*/ -QStringList OContactFields::untrdetailsfields( bool sorted ) -{ - return detailsfields( sorted, false ); -} - - -/*! - \internal - Returns a translated list of details field names for a contact. -*/ -QStringList OContactFields::trdetailsfields( bool sorted ) -{ - return detailsfields( sorted, true ); -} - - -/*! - \internal - Returns a translated list of phone field names for a contact. -*/ -QStringList OContactFields::trphonefields( bool sorted ) -{ - return phonefields( sorted, true ); -} - -/*! - \internal - Returns an untranslated list of phone field names for a contact. -*/ -QStringList OContactFields::untrphonefields( bool sorted ) -{ - return phonefields( sorted, false ); -} - - -/*! - \internal - Returns a translated list of field names for a contact. -*/ -QStringList OContactFields::trfields( bool sorted ) -{ - return fields( sorted, true ); -} - -/*! - \internal - Returns an untranslated list of field names for a contact. -*/ -QStringList OContactFields::untrfields( bool sorted ) -{ - return fields( sorted, false ); -} - -QMap<int, QString> OContactFields::idToTrFields() -{ - QMap<int, QString> ret_map; - - ret_map.insert( Qtopia::AddressUid, QObject::tr( "User Id" ) ); - ret_map.insert( Qtopia::AddressCategory, QObject::tr( "Categories" ) ); - - ret_map.insert( Qtopia::Title, QObject::tr( "Name Title") ); - ret_map.insert( Qtopia::FirstName, QObject::tr( "First Name" ) ); - ret_map.insert( Qtopia::MiddleName, QObject::tr( "Middle Name" ) ); - ret_map.insert( Qtopia::LastName, QObject::tr( "Last Name" ) ); - ret_map.insert( Qtopia::Suffix, QObject::tr( "Suffix" )); - ret_map.insert( Qtopia::FileAs, QObject::tr( "File As" ) ); - - ret_map.insert( Qtopia::JobTitle, QObject::tr( "Job Title" ) ); - ret_map.insert( Qtopia::Department, QObject::tr( "Department" ) ); - ret_map.insert( Qtopia::Company, QObject::tr( "Company" ) ); - ret_map.insert( Qtopia::BusinessPhone, QObject::tr( "Business Phone" ) ); - ret_map.insert( Qtopia::BusinessFax, QObject::tr( "Business Fax" ) ); - ret_map.insert( Qtopia::BusinessMobile, QObject::tr( "Business Mobile" )); - - // email - ret_map.insert( Qtopia::DefaultEmail, QObject::tr( "Default Email" ) ); - ret_map.insert( Qtopia::Emails, QObject::tr( "Emails" ) ); - - ret_map.insert( Qtopia::HomePhone, QObject::tr( "Home Phone" ) ); - ret_map.insert( Qtopia::HomeFax, QObject::tr( "Home Fax" ) ); - ret_map.insert( Qtopia::HomeMobile, QObject::tr( "Home Mobile" ) ); - - // business - ret_map.insert( Qtopia::BusinessStreet, QObject::tr( "Business Street" ) ); - ret_map.insert( Qtopia::BusinessCity, QObject::tr( "Business City" ) ); - ret_map.insert( Qtopia::BusinessState, QObject::tr( "Business State" ) ); - ret_map.insert( Qtopia::BusinessZip, QObject::tr( "Business Zip" ) ); - ret_map.insert( Qtopia::BusinessCountry, QObject::tr( "Business Country" ) ); - ret_map.insert( Qtopia::BusinessPager, QObject::tr( "Business Pager" ) ); - ret_map.insert( Qtopia::BusinessWebPage, QObject::tr( "Business WebPage" ) ); - - ret_map.insert( Qtopia::Office, QObject::tr( "Office" ) ); - ret_map.insert( Qtopia::Profession, QObject::tr( "Profession" ) ); - ret_map.insert( Qtopia::Assistant, QObject::tr( "Assistant" ) ); - ret_map.insert( Qtopia::Manager, QObject::tr( "Manager" ) ); - - // home - ret_map.insert( Qtopia::HomeStreet, QObject::tr( "Home Street" ) ); - ret_map.insert( Qtopia::HomeCity, QObject::tr( "Home City" ) ); - ret_map.insert( Qtopia::HomeState, QObject::tr( "Home State" ) ); - ret_map.insert( Qtopia::HomeZip, QObject::tr( "Home Zip" ) ); - ret_map.insert( Qtopia::HomeCountry, QObject::tr( "Home Country" ) ); - ret_map.insert( Qtopia::HomeWebPage, QObject::tr( "Home Web Page" ) ); - - //personal - ret_map.insert( Qtopia::Spouse, QObject::tr( "Spouse" ) ); - ret_map.insert( Qtopia::Gender, QObject::tr( "Gender" ) ); - ret_map.insert( Qtopia::Birthday, QObject::tr( "Birthday" ) ); - ret_map.insert( Qtopia::Anniversary, QObject::tr( "Anniversary" ) ); - ret_map.insert( Qtopia::Nickname, QObject::tr( "Nickname" ) ); - ret_map.insert( Qtopia::Children, QObject::tr( "Children" ) ); - - // other - ret_map.insert( Qtopia::Notes, QObject::tr( "Notes" ) ); - - - return ret_map; -} - -QMap<int, QString> OContactFields::idToUntrFields() -{ - QMap<int, QString> ret_map; - - ret_map.insert( Qtopia::AddressUid, "User Id" ); - ret_map.insert( Qtopia::AddressCategory, "Categories" ); - - ret_map.insert( Qtopia::Title, "Name Title" ); - ret_map.insert( Qtopia::FirstName, "First Name" ); - ret_map.insert( Qtopia::MiddleName, "Middle Name" ); - ret_map.insert( Qtopia::LastName, "Last Name" ); - ret_map.insert( Qtopia::Suffix, "Suffix" ); - ret_map.insert( Qtopia::FileAs, "File As" ); - - ret_map.insert( Qtopia::JobTitle, "Job Title" ); - ret_map.insert( Qtopia::Department, "Department" ); - ret_map.insert( Qtopia::Company, "Company" ); - ret_map.insert( Qtopia::BusinessPhone, "Business Phone" ); - ret_map.insert( Qtopia::BusinessFax, "Business Fax" ); - ret_map.insert( Qtopia::BusinessMobile, "Business Mobile" ); - - // email - ret_map.insert( Qtopia::DefaultEmail, "Default Email" ); - ret_map.insert( Qtopia::Emails, "Emails" ); - - ret_map.insert( Qtopia::HomePhone, "Home Phone" ); - ret_map.insert( Qtopia::HomeFax, "Home Fax" ); - ret_map.insert( Qtopia::HomeMobile, "Home Mobile" ); - - // business - ret_map.insert( Qtopia::BusinessStreet, "Business Street" ); - ret_map.insert( Qtopia::BusinessCity, "Business City" ); - ret_map.insert( Qtopia::BusinessState, "Business State" ); - ret_map.insert( Qtopia::BusinessZip, "Business Zip" ); - ret_map.insert( Qtopia::BusinessCountry, "Business Country" ); - ret_map.insert( Qtopia::BusinessPager, "Business Pager" ); - ret_map.insert( Qtopia::BusinessWebPage, "Business WebPage" ); - - ret_map.insert( Qtopia::Office, "Office" ); - ret_map.insert( Qtopia::Profession, "Profession" ); - ret_map.insert( Qtopia::Assistant, "Assistant" ); - ret_map.insert( Qtopia::Manager, "Manager" ); - - // home - ret_map.insert( Qtopia::HomeStreet, "Home Street" ); - ret_map.insert( Qtopia::HomeCity, "Home City" ); - ret_map.insert( Qtopia::HomeState, "Home State" ); - ret_map.insert( Qtopia::HomeZip, "Home Zip" ); - ret_map.insert( Qtopia::HomeCountry, "Home Country" ); - ret_map.insert( Qtopia::HomeWebPage, "Home Web Page" ); - - //personal - ret_map.insert( Qtopia::Spouse, "Spouse" ); - ret_map.insert( Qtopia::Gender, "Gender" ); - ret_map.insert( Qtopia::Birthday, "Birthday" ); - ret_map.insert( Qtopia::Anniversary, "Anniversary" ); - ret_map.insert( Qtopia::Nickname, "Nickname" ); - ret_map.insert( Qtopia::Children, "Children" ); - - // other - ret_map.insert( Qtopia::Notes, "Notes" ); - ret_map.insert( Qtopia::Groups, "Groups" ); - - - return ret_map; -} - -QMap<QString, int> OContactFields::trFieldsToId() -{ - QMap<int, QString> idtostr = idToTrFields(); - QMap<QString, int> ret_map; - - - QMap<int, QString>::Iterator it; - for( it = idtostr.begin(); it != idtostr.end(); ++it ) - ret_map.insert( *it, it.key() ); - - - return ret_map; -} - -/* ======================================================================= */ - -QMap<QString, int> OContactFields::untrFieldsToId() -{ - QMap<int, QString> idtostr = idToUntrFields(); - QMap<QString, int> ret_map; - - - QMap<int, QString>::Iterator it; - for( it = idtostr.begin(); it != idtostr.end(); ++it ) - ret_map.insert( *it, it.key() ); - - - return ret_map; -} - - -OContactFields::OContactFields(): - fieldOrder( DEFAULT_FIELD_ORDER ), - changedFieldOrder( false ) -{ - // Get the global field order from the config file and - // use it as a start pattern - Config cfg ( "AddressBook" ); - cfg.setGroup( "ContactFieldOrder" ); - globalFieldOrder = cfg.readEntry( "General", DEFAULT_FIELD_ORDER ); -} - -OContactFields::~OContactFields(){ - - // We will store the fieldorder into the config file - // to reuse it for the future.. - if ( changedFieldOrder ){ - Config cfg ( "AddressBook" ); - cfg.setGroup( "ContactFieldOrder" ); - cfg.writeEntry( "General", globalFieldOrder ); - } -} - - - -void OContactFields::saveToRecord( OContact &cnt ){ - - qDebug("ocontactfields saveToRecord: >%s<",fieldOrder.latin1()); - - // Store fieldorder into this contact. - cnt.setCustomField( CONTACT_FIELD_ORDER_NAME, fieldOrder ); - - globalFieldOrder = fieldOrder; - changedFieldOrder = true; - -} - -void OContactFields::loadFromRecord( const OContact &cnt ){ - qDebug("ocontactfields loadFromRecord"); - qDebug("loading >%s<",cnt.fullName().latin1()); - - // Get fieldorder for this contact. If none is defined, - // we will use the global one from the config file.. - - fieldOrder = cnt.customField( CONTACT_FIELD_ORDER_NAME ); - - qDebug("fieldOrder from contact>%s<",fieldOrder.latin1()); - - if (fieldOrder.isEmpty()){ - fieldOrder = globalFieldOrder; - } - - - qDebug("effective fieldOrder in loadFromRecord >%s<",fieldOrder.latin1()); -} - -void OContactFields::setFieldOrder( int num, int index ){ - qDebug("qcontactfields setfieldorder pos %i -> %i",num,index); - - fieldOrder[num] = QString::number( index, 16 )[0]; - - // We will store this new fieldorder globally to - // remember it for contacts which have none - globalFieldOrder = fieldOrder; - changedFieldOrder = true; - - qDebug("fieldOrder >%s<",fieldOrder.latin1()); -} - -int OContactFields::getFieldOrder( int num, int defIndex ){ - qDebug("ocontactfields getFieldOrder"); - qDebug("fieldOrder >%s<",fieldOrder.latin1()); - - // Get index of combo as char.. - QChar poschar = fieldOrder[num]; - - bool ok; - int ret = 0; - // Convert char to number.. - if ( !( poschar == QChar::null ) ) - ret = QString( poschar ).toInt(&ok, 16); - else - ok = false; - - // Return default value if index for - // num was not set or if anything else happened.. - if ( !ok ) ret = defIndex; - - qDebug("returning >%i<",ret); - - return ret; - -} diff --git a/libopie/pim/ocontactfields.h b/libopie/pim/ocontactfields.h deleted file mode 100644 index f105de7..0000000 --- a/libopie/pim/ocontactfields.h +++ b/dev/null @@ -1,67 +0,0 @@ -#ifndef OPIE_CONTACTS_FIELDS -#define OPIE_CONTACTS_FIELDS - -class QStringList; - -#include <qmap.h> -#include <qstring.h> -#include <opie/ocontact.h> - -#define CONTACT_FIELD_ORDER_NAME "opie-contactfield-order" -#define DEFAULT_FIELD_ORDER "__________" - -class OContactFields{ - - public: - OContactFields(); - ~OContactFields(); - /** Set the index for combo boxes. - * Sets the <b>index</b> of combo <b>num</b>. - * @param num selects the number of the combo - * @param index sets the index in the combo - */ - void setFieldOrder( int num, int index ); - - /** Get the index for combo boxes. - * Returns the index of combo <b>num</b> or defindex - * if none was defined.. - * @param num Selects the number of the combo - * @param defIndex will be returned if none was defined (either - * globally in the config file, nor by the contact which was used - * by loadFromRecord() ) - */ - int getFieldOrder( int num, int defIndex); - - /** Store fieldorder to contact. */ - void saveToRecord( OContact& ); - /** Get Fieldorder from contact. */ - void loadFromRecord( const OContact& ); - - private: - QString fieldOrder; - QString globalFieldOrder; - bool changedFieldOrder; - - public: - static QStringList personalfields( bool sorted = true, bool translated = false ); - static QStringList phonefields( bool sorted = true, bool translated = false ); - static QStringList detailsfields( bool sorted = true, bool translated = false ); - static QStringList fields( bool sorted = true, bool translated = false ); - - static QStringList trpersonalfields( bool sorted = true ); - static QStringList untrpersonalfields( bool sorted = true ); - static QStringList trphonefields( bool sorted = true ); - static QStringList untrphonefields( bool sorted = true ); - static QStringList trdetailsfields( bool sorted = true ); - static QStringList untrdetailsfields( bool sorted = true ); - static QStringList trfields( bool sorted = true ); - static QStringList untrfields( bool sorted = true ); - - static QMap<int, QString> idToTrFields(); - static QMap<QString, int> trFieldsToId(); - static QMap<int, QString> idToUntrFields(); - static QMap<QString, int> untrFieldsToId(); - -}; - -#endif diff --git a/libopie/pim/oconversion.cpp b/libopie/pim/oconversion.cpp deleted file mode 100644 index 0d15414..0000000 --- a/libopie/pim/oconversion.cpp +++ b/dev/null @@ -1,113 +0,0 @@ -/**********************************************************************
-** Copyright (C) 2003 by Stefan Eilers (eilers.stefan@epost.de)
-**
-** This file may be distributed and/or modified under the terms of the
-** GNU Lesser General Public License version 2 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.
-**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-**
-**********************************************************************/
-
-#include "oconversion.h"
-#include <qpe/timeconversion.h>
-
-
-QString OConversion::dateToString( const QDate &d )
-{
- if ( d.isNull() || !d.isValid() )
- return QString::null;
-
- // ISO format in year, month, day (YYYYMMDD); e.g. 20021231
- QString year = QString::number( d.year() );
- QString month = QString::number( d.month() );
- month = month.rightJustify( 2, '0' );
- QString day = QString::number( d.day() );
- day = day.rightJustify( 2, '0' );
-
- QString str = year + month + day;
- //qDebug( "\tPimContact dateToStr = %s", str.latin1() );
-
- return str;
-}
-
-QDate OConversion::dateFromString( const QString& s )
-{
- QDate date;
-
- if ( s.isEmpty() )
- return date;
-
- // Be backward compatible to old Opie format:
- // Try to load old format. If it fails, try new ISO-Format!
- date = TimeConversion::fromString ( s );
- if ( date.isValid() )
- return date;
-
- // Read ISO-Format (YYYYMMDD)
- int year = s.mid(0, 4).toInt();
- int month = s.mid(4,2).toInt();
- int day = s.mid(6,2).toInt();
-
- // do some quick sanity checking -eilers
- // but we isValid() again? -zecke
- if ( year < 1900 || year > 3000 ) {
- qWarning( "PimContact year is not in range");
- return date;
- }
- if ( month < 0 || month > 12 ) {
- qWarning( "PimContact month is not in range");
- return date;
- }
- if ( day < 0 || day > 31 ) {
- qWarning( "PimContact day is not in range");
- return date;
- }
-
- date.setYMD( year, month, day );
- if ( !date.isValid() ) {
- qWarning( "PimContact date is not valid");
- return date;
- }
-
- return date;
-}
-QString OConversion::dateTimeToString( const QDateTime& dt ) {
- if (!dt.isValid() || dt.isNull() ) return QString::null;
-
- QString year = QString::number( dt.date().year() );
- QString month = QString::number( dt.date().month() );
- QString day = QString::number( dt.date().day() );
-
- QString hour = QString::number( dt.time().hour() );
- QString min = QString::number( dt.time().minute() );
- QString sec = QString::number( dt.time().second() );
-
- month = month.rightJustify( 2, '0' );
- day = day. rightJustify( 2, '0' );
- hour = hour. rightJustify( 2, '0' );
- min = min. rightJustify( 2, '0' );
- sec = sec. rightJustify( 2, '0' );
-
- QString str = day + month + year + hour + min + sec;
-
- return str;
-}
-QDateTime OConversion::dateTimeFromString( const QString& str) {
-
- if ( str.isEmpty() ) return QDateTime();
- int day = str.mid(0, 2).toInt();
- int month = str.mid(2, 2).toInt();
- int year = str.mid(4, 4).toInt();
- int hour = str.mid(8, 2).toInt();
- int min = str.mid(10, 2).toInt();
- int sec = str.mid(12, 2).toInt();
-
- QDate date( year, month, day );
- QTime time( hour, min, sec );
- QDateTime dt( date, time );
- return dt;
-}
-
diff --git a/libopie/pim/oconversion.h b/libopie/pim/oconversion.h deleted file mode 100644 index 4c0a497..0000000 --- a/libopie/pim/oconversion.h +++ b/dev/null @@ -1,48 +0,0 @@ -/********************************************************************** -** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. -** Copyright (C) 2002-2003 by Stefan Eilers (eilers.stefan@epost.de) -** -** This file may be distributed and/or modified under the terms of the -** GNU General Public License version 2 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -** See http://www.trolltech.com/gpl/ for GPL licensing information. -** -** Contact info@trolltech.com if any conditions of this licensing are -** not clear to you. -**********************************************************************/ - -#ifndef __oconversion_h__ -#define __oconversion_h__ - -/* #include <time.h> */ -/* #include <sys/types.h> */ -#include <qdatetime.h> - -/* FIXME namespace? -zecke */ -class OConversion -{ -public: - static QString dateToString( const QDate &d ); - static QDate dateFromString( const QString &datestr ); - - /** - * simple function to store DateTime as string and read from string - * no timezone changing is done - * DDMMYYYYHHMMSS is the simple format - */ - static QString dateTimeToString( const QDateTime& ); - static QDateTime dateTimeFromString( const QString& ); - -private: - class Private; - Private* d; - -}; - -#endif // __oconversion_h__ - diff --git a/libopie/pim/odatebookaccess.cpp b/libopie/pim/odatebookaccess.cpp deleted file mode 100644 index d95fed6..0000000 --- a/libopie/pim/odatebookaccess.cpp +++ b/dev/null @@ -1,81 +0,0 @@ -#include "obackendfactory.h" -#include "odatebookaccess.h" - -/** - * Simple constructor - * It takes a ODateBookAccessBackend as parent. If it is 0 the default implementation - * will be used! - * @param back The backend to be used or 0 for the default backend - * @param ac What kind of access is intended - */ -ODateBookAccess::ODateBookAccess( ODateBookAccessBackend* back, enum Access ac ) - : OPimAccessTemplate<OEvent>( back ) -{ - if (!back ) - back = OBackendFactory<ODateBookAccessBackend>::Default("datebook", QString::null ); - - m_backEnd = back; - setBackEnd( m_backEnd ); -} -ODateBookAccess::~ODateBookAccess() { -} - -/** - * @return all events available - */ -ODateBookAccess::List ODateBookAccess::rawEvents()const { - QArray<int> ints = m_backEnd->rawEvents(); - - List lis( ints, this ); - return lis; -} - -/** - * @return all repeating events - */ -ODateBookAccess::List ODateBookAccess::rawRepeats()const { - QArray<int> ints = m_backEnd->rawRepeats(); - - List lis( ints, this ); - return lis; -} - -/** - * @return all non repeating events - */ -ODateBookAccess::List ODateBookAccess::nonRepeats()const { - QArray<int> ints = m_backEnd->nonRepeats(); - - List lis( ints, this ); - return lis; -} - -/** - * @return dates in the time span between from and to - * @param from Include all events from... - * @param to Include all events to... - */ -OEffectiveEvent::ValueList ODateBookAccess::effectiveEvents( const QDate& from, const QDate& to ) const { - return m_backEnd->effectiveEvents( from, to ); -} -/** - * @return all events at a given datetime - */ -OEffectiveEvent::ValueList ODateBookAccess::effectiveEvents( const QDateTime& start ) const { - return m_backEnd->effectiveEvents( start ); -} - -/** - * @return non repeating dates in the time span between from and to - * @param from Include all events from... - * @param to Include all events to... - */ -OEffectiveEvent::ValueList ODateBookAccess::effectiveNonRepeatingEvents( const QDate& from, const QDate& to ) const { - return m_backEnd->effectiveNonRepeatingEvents( from, to ); -} -/** - * @return all non repeating events at a given datetime - */ -OEffectiveEvent::ValueList ODateBookAccess::effectiveNonRepeatingEvents( const QDateTime& start ) const { - return m_backEnd->effectiveNonRepeatingEvents( start ); -} diff --git a/libopie/pim/odatebookaccess.h b/libopie/pim/odatebookaccess.h deleted file mode 100644 index 62196da..0000000 --- a/libopie/pim/odatebookaccess.h +++ b/dev/null @@ -1,44 +0,0 @@ -#ifndef OPIE_DATE_BOOK_ACCESS_H -#define OPIE_DATE_BOOK_ACCESS_H - -#include "odatebookaccessbackend.h" -#include "opimaccesstemplate.h" - -#include "oevent.h" - -/** - * This is the object orientated datebook database. It'll use OBackendFactory - * to query for a backend. - * All access to the datebook should be done via this class. - * Make sure to load and save the datebook this is not part of - * destructing and creating the object - * - * @author Holger Freyther, Stefan Eilers - */ -class ODateBookAccess : public OPimAccessTemplate<OEvent> { -public: - ODateBookAccess( ODateBookAccessBackend* = 0l, enum Access acc = Random ); - ~ODateBookAccess(); - - /* return all events */ - List rawEvents()const; - - /* return repeating events */ - List rawRepeats()const; - - /* return non repeating events */ - List nonRepeats()const; - - /* return non repeating events (from,to) */ - OEffectiveEvent::ValueList effectiveEvents( const QDate& from, const QDate& to ) const; - OEffectiveEvent::ValueList effectiveEvents( const QDateTime& start ) const; - OEffectiveEvent::ValueList effectiveNonRepeatingEvents( const QDate& from, const QDate& to ) const; - OEffectiveEvent::ValueList effectiveNonRepeatingEvents( const QDateTime& start ) const; - -private: - ODateBookAccessBackend* m_backEnd; - class Private; - Private* d; -}; - -#endif diff --git a/libopie/pim/odatebookaccessbackend.cpp b/libopie/pim/odatebookaccessbackend.cpp deleted file mode 100644 index f0c5d65..0000000 --- a/libopie/pim/odatebookaccessbackend.cpp +++ b/dev/null @@ -1,182 +0,0 @@ -#include <qtl.h> - -#include "orecur.h" - -#include "odatebookaccessbackend.h" - -namespace { -/* a small helper to get all NonRepeating events for a range of time */ - void events( OEffectiveEvent::ValueList& tmpList, const OEvent::ValueList& events, - const QDate& from, const QDate& to ) { - QDateTime dtStart, dtEnd; - - for ( OEvent::ValueList::ConstIterator it = events.begin(); it != events.end(); ++it ) { - dtStart = (*it).startDateTime(); - dtEnd = (*it).endDateTime(); - - /* - * If in range - */ - if (dtStart.date() >= from && dtEnd.date() <= to ) { - OEffectiveEvent eff; - eff.setEvent( (*it) ); - eff.setDate( dtStart.date() ); - eff.setStartTime( dtStart.time() ); - - /* if not on the same day */ - if ( dtStart.date() != dtEnd.date() ) - eff.setEndTime( QTime(23, 59, 0 ) ); - else - eff.setEndTime( dtEnd.time() ); - - tmpList.append( eff ); - } - - /* we must also check for end date information... */ - if ( dtEnd.date() != dtStart.date() && dtEnd.date() >= from ) { - QDateTime dt = dtStart.addDays( 1 ); - dt.setTime( QTime(0, 0, 0 ) ); - QDateTime dtStop; - if ( dtEnd > to ) - dtStop = to; - else - dtStop = dtEnd; - - while ( dt <= dtStop ) { - OEffectiveEvent eff; - eff.setEvent( (*it) ); - eff.setDate( dt.date() ); - - if ( dt >= from ) { - eff.setStartTime( QTime(0, 0, 0 ) ); - if ( dt.date() == dtEnd.date() ) - eff.setEndTime( dtEnd.time() ); - else - eff.setEndTime( QTime(23, 59, 0 ) ); - tmpList.append( eff ); - } - dt = dt.addDays( 1 ); - } - } - } - } - - void repeat( OEffectiveEvent::ValueList& tmpList, const OEvent::ValueList& list, - const QDate& from, const QDate& to ) { - QDate repeat; - for ( OEvent::ValueList::ConstIterator it = list.begin(); it != list.end(); ++it ) { - int dur = (*it).startDateTime().date().daysTo( (*it).endDateTime().date() ); - QDate itDate = from.addDays(-dur ); - ORecur rec = (*it).recurrence(); - if ( !rec.hasEndDate() || rec.endDate() > to ) { - rec.setEndDate( to ); - rec.setHasEndDate( true ); - } - while (rec.nextOcurrence(itDate, repeat ) ) { - if (repeat > to ) break; - OEffectiveEvent eff; - eff.setDate( repeat ); - if ( (*it).isAllDay() ) { - eff.setStartTime( QTime(0, 0, 0 ) ); - eff.setEndTime( QTime(23, 59, 59 ) ); - }else { - /* we only occur by days, not hours/minutes/seconds. Hence - * the actual end and start times will be the same for - * every repeated event. For multi day events this is - * fixed up later if on wronge day span - */ - eff.setStartTime( (*it).startDateTime().time() ); - eff.setEndTime( (*it).endDateTime().time() ); - } - if ( dur != 0 ) { - // multi-day repeating events - QDate sub_it = QMAX( repeat, from ); - QDate startDate = repeat; - QDate endDate = startDate.addDays( dur ); - - while ( sub_it <= endDate && sub_it <= to ) { - OEffectiveEvent tmpEff = eff; - tmpEff.setEvent( (*it) ); - if ( sub_it != startDate ) - tmpEff.setStartTime( QTime(0, 0, 0 ) ); - if ( sub_it != endDate ) - tmpEff.setEndTime( QTime( 23, 59, 59 ) ); - - tmpEff.setDate( sub_it ); - tmpEff.setEffectiveDates( startDate, endDate ); - tmpList.append( tmpEff ); - - sub_it = sub_it.addDays( 1 ); - } - itDate = endDate; - }else { - eff.setEvent( (*it) ); - tmpList.append( eff ); - itDate = repeat.addDays( 1 ); - } - } - } - } -} - -ODateBookAccessBackend::ODateBookAccessBackend() - : OPimAccessBackend<OEvent>() -{ - -} -ODateBookAccessBackend::~ODateBookAccessBackend() { - -} -OEffectiveEvent::ValueList ODateBookAccessBackend::effectiveEvents( const QDate& from, - const QDate& to ) { - OEffectiveEvent::ValueList tmpList; - OEvent::ValueList list = directNonRepeats(); - - events( tmpList, list, from, to ); - repeat( tmpList, directRawRepeats(),from,to ); - - list = directRawRepeats(); // Useless, isn't it ? (eilers) - - qHeapSort( tmpList ); - return tmpList; -} -OEffectiveEvent::ValueList ODateBookAccessBackend::effectiveEvents( const QDateTime& dt ) { - OEffectiveEvent::ValueList day = effectiveEvents( dt.date(), dt.date() ); - OEffectiveEvent::ValueList::Iterator it; - - OEffectiveEvent::ValueList tmpList; - QDateTime dtTmp; - for ( it = day.begin(); it != day.end(); ++it ) { - dtTmp = QDateTime( (*it).date(), (*it).startTime() ); - if ( QABS(dt.secsTo(dtTmp) ) < 60 ) - tmpList.append( (*it) ); - } - - return tmpList; -} - -OEffectiveEvent::ValueList ODateBookAccessBackend::effectiveNonRepeatingEvents( const QDate& from, - const QDate& to ) { - OEffectiveEvent::ValueList tmpList; - OEvent::ValueList list = directNonRepeats(); - - events( tmpList, list, from, to ); - - qHeapSort( tmpList ); - return tmpList; -} - -OEffectiveEvent::ValueList ODateBookAccessBackend::effectiveNonRepeatingEvents( const QDateTime& dt ) { - OEffectiveEvent::ValueList day = effectiveNonRepeatingEvents( dt.date(), dt.date() ); - OEffectiveEvent::ValueList::Iterator it; - - OEffectiveEvent::ValueList tmpList; - QDateTime dtTmp; - for ( it = day.begin(); it != day.end(); ++it ) { - dtTmp = QDateTime( (*it).date(), (*it).startTime() ); - if ( QABS(dt.secsTo(dtTmp) ) < 60 ) - tmpList.append( (*it) ); - } - - return tmpList; -} diff --git a/libopie/pim/odatebookaccessbackend.h b/libopie/pim/odatebookaccessbackend.h deleted file mode 100644 index 3472ab3..0000000 --- a/libopie/pim/odatebookaccessbackend.h +++ b/dev/null @@ -1,90 +0,0 @@ -#ifndef OPIE_DATE_BOOK_ACCESS_BACKEND_H -#define OPIE_DATE_BOOK_ACCESS_BACKEND_H - -#include <qarray.h> - -#include "opimaccessbackend.h" -#include "oevent.h" - -/** - * This class is the interface to the storage of Events. - * @see OPimAccessBackend - * - */ -class ODateBookAccessBackend : public OPimAccessBackend<OEvent> { -public: - typedef int UID; - - /** - * c'tor without parameter - */ - ODateBookAccessBackend(); - ~ODateBookAccessBackend(); - - /** - * This method should return a list of UIDs containing - * all events. No filter should be applied - * @return list of events - */ - virtual QArray<UID> rawEvents()const = 0; - - /** - * This method should return a list of UIDs containing - * all repeating events. No filter should be applied - * @return list of repeating events - */ - virtual QArray<UID> rawRepeats()const = 0; - - /** - * This mthod should return a list of UIDs containing all non - * repeating events. No filter should be applied - * @return list of nonrepeating events - */ - virtual QArray<UID> nonRepeats() const = 0; - - /** - * If you do not want to implement the effectiveEvents methods below - * you need to supply it with directNonRepeats. - * This method can return empty lists if effectiveEvents is implememted - */ - virtual OEvent::ValueList directNonRepeats() = 0; - - /** - * Same as above but return raw repeats! - */ - virtual OEvent::ValueList directRawRepeats() = 0; - - /* is implemented by default but you can reimplement it*/ - /** - * Effective Events are special event occuring during a time frame. This method does calcualte - * EffectiveEvents bases on the directNonRepeats and directRawRepeats. You may implement this method - * yourself - */ - virtual OEffectiveEvent::ValueList effectiveEvents( const QDate& from, const QDate& to ); - - /** - * this is an overloaded member function - * @see effectiveEvents( const QDate& from, const QDate& to ) - */ - virtual OEffectiveEvent::ValueList effectiveEvents( const QDateTime& start ); - - /** - * Effective Events are special event occuring during a time frame. This method does calcualte - * EffectiveEvents bases on the directNonRepeats and directRawRepeats. You may implement this method - * yourself - */ - virtual OEffectiveEvent::ValueList effectiveNonRepeatingEvents( const QDate& from, const QDate& to ); - - /** - * this is an overloaded member function - * @see effectiveNonRepeatingEvents( const QDate& from, const QDate& to ) - */ - virtual OEffectiveEvent::ValueList effectiveNonRepeatingEvents( const QDateTime& start ); - -private: - class Private; - Private *d; - -}; - -#endif diff --git a/libopie/pim/odatebookaccessbackend_sql.cpp b/libopie/pim/odatebookaccessbackend_sql.cpp deleted file mode 100644 index 44dd2bc..0000000 --- a/libopie/pim/odatebookaccessbackend_sql.cpp +++ b/dev/null @@ -1,371 +0,0 @@ -/* - * SQL Backend for the OPIE-Calender Database. - * - * Copyright (c) 2003 by Stefan Eilers (Eilers.Stefan@epost.de) - * - * ===================================================================== - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * ===================================================================== - * ===================================================================== - * Version: $Id$ - * ===================================================================== - * History: - * $Log$ - * Revision 1.4 2004/03/14 13:50:35 alwin - * namespace correction - * - * Revision 1.3 2003/12/22 11:41:39 eilers - * Fixing stupid bug, found by sourcode review.. - * - * Revision 1.2 2003/12/22 10:19:26 eilers - * Finishing implementation of sql-backend for datebook. But I have to - * port the PIM datebook application to use it, before I could debug the - * whole stuff. - * Thus, PIM-Database backend is finished, but highly experimental. And some - * parts are still generic. For instance, the "queryByExample()" methods are - * not (or not fully) implemented. Todo: custom-entries not stored. - * The big show stopper: matchRegExp() (needed by OpieSearch) needs regular - * expression search in the database, which is not supported by sqlite ! - * Therefore we need either an extended sqlite or a workaround which would - * be very slow and memory consuming.. - * - * Revision 1.1 2003/12/08 15:18:12 eilers - * Committing unfinished sql implementation before merging to libopie2 starts.. - * - * - */ - -#include <stdio.h> -#include <stdlib.h> - -#include <qarray.h> -#include <qstringlist.h> - -#include <qpe/global.h> - -#include <opie2/osqldriver.h> -#include <opie2/osqlmanager.h> -#include <opie2/osqlquery.h> - -#include "orecur.h" -#include "odatebookaccessbackend_sql.h" - -using namespace Opie::DB; - - -ODateBookAccessBackend_SQL::ODateBookAccessBackend_SQL( const QString& , - const QString& fileName ) - : ODateBookAccessBackend(), m_driver( NULL ) -{ - m_fileName = fileName.isEmpty() ? Global::applicationFileName( "datebook", "datebook.db" ) : fileName; - - // Get the standart sql-driver from the OSQLManager.. - OSQLManager man; - m_driver = man.standard(); - m_driver->setUrl( m_fileName ); - - initFields(); - - load(); -} - -ODateBookAccessBackend_SQL::~ODateBookAccessBackend_SQL() { - if( m_driver ) - delete m_driver; -} - -void ODateBookAccessBackend_SQL::initFields() -{ - - // This map contains the translation of the fieldtype id's to - // the names of the table columns - m_fieldMap.insert( OEvent::FUid, "uid" ); - m_fieldMap.insert( OEvent::FCategories, "Categories" ); - m_fieldMap.insert( OEvent::FDescription, "Description" ); - m_fieldMap.insert( OEvent::FLocation, "Location" ); - m_fieldMap.insert( OEvent::FType, "Type" ); - m_fieldMap.insert( OEvent::FAlarm, "Alarm" ); - m_fieldMap.insert( OEvent::FSound, "Sound" ); - m_fieldMap.insert( OEvent::FRType, "RType" ); - m_fieldMap.insert( OEvent::FRWeekdays, "RWeekdays" ); - m_fieldMap.insert( OEvent::FRPosition, "RPosition" ); - m_fieldMap.insert( OEvent::FRFreq, "RFreq" ); - m_fieldMap.insert( OEvent::FRHasEndDate, "RHasEndDate" ); - m_fieldMap.insert( OEvent::FREndDate, "REndDate" ); - m_fieldMap.insert( OEvent::FRCreated, "RCreated" ); - m_fieldMap.insert( OEvent::FRExceptions, "RExceptions" ); - m_fieldMap.insert( OEvent::FStart, "Start" ); - m_fieldMap.insert( OEvent::FEnd, "End" ); - m_fieldMap.insert( OEvent::FNote, "Note" ); - m_fieldMap.insert( OEvent::FTimeZone, "TimeZone" ); - m_fieldMap.insert( OEvent::FRecParent, "RecParent" ); - m_fieldMap.insert( OEvent::FRecChildren, "Recchildren" ); - - // Create a map that maps the column name to the id - QMapConstIterator<int, QString> it; - for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ - m_reverseFieldMap.insert( it.data(), it.key() ); - } - -} - -bool ODateBookAccessBackend_SQL::load() -{ - if (!m_driver->open() ) - return false; - - // Don't expect that the database exists. - // It is save here to create the table, even if it - // do exist. ( Is that correct for all databases ?? ) - QString qu = "create table datebook( uid INTEGER PRIMARY KEY "; - - QMap<int, QString>::Iterator it; - for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ - qu += QString( ",%1 VARCHAR(10)" ).arg( it.data() ); - } - qu += " );"; - - qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR, priority INTEGER, value VARCHAR, PRIMARY KEY /* identifier */ (uid, id) );"; - - qWarning( "command: %s", qu.latin1() ); - - OSQLRawQuery raw( qu ); - OSQLResult res = m_driver->query( &raw ); - if ( res.state() != OSQLResult::Success ) - return false; - - update(); - - return true; -} - -void ODateBookAccessBackend_SQL::update() -{ - - QString qu = "select uid from datebook"; - OSQLRawQuery raw( qu ); - OSQLResult res = m_driver->query( &raw ); - if ( res.state() != OSQLResult::Success ){ - // m_uids.clear(); - return; - } - - m_uids = extractUids( res ); - -} - -bool ODateBookAccessBackend_SQL::reload() -{ - return load(); -} - -bool ODateBookAccessBackend_SQL::save() -{ - return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers) -} - -QArray<int> ODateBookAccessBackend_SQL::allRecords()const -{ - return m_uids; -} - -QArray<int> ODateBookAccessBackend_SQL::queryByExample(const OEvent&, int, const QDateTime& ) { - return QArray<int>(); -} - -void ODateBookAccessBackend_SQL::clear() -{ - QString qu = "drop table datebook;"; - qu += "drop table custom_data;"; - - OSQLRawQuery raw( qu ); - OSQLResult res = m_driver->query( &raw ); - - reload(); -} - - -OEvent ODateBookAccessBackend_SQL::find( int uid ) const{ - QString qu = "select *"; - qu += "from datebook where uid = " + QString::number(uid); - - OSQLRawQuery raw( qu ); - OSQLResult res = m_driver->query( &raw ); - - OSQLResultItem resItem = res.first(); - - // Create Map for date event and insert UID - QMap<int,QString> dateEventMap; - dateEventMap.insert( OEvent::FUid, QString::number( uid ) ); - - // Now insert the data out of the columns into the map. - QMapConstIterator<int, QString> it; - for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ - dateEventMap.insert( m_reverseFieldMap[*it], resItem.data( *it ) ); - } - - // Last step: Put map into date event and return it - OEvent retDate( dateEventMap ); - - return retDate; -} - -// FIXME: Speed up update of uid's.. -bool ODateBookAccessBackend_SQL::add( const OEvent& ev ) -{ - QMap<int,QString> eventMap = ev.toMap(); - - QString qu = "insert into datebook VALUES( " + QString::number( ev.uid() ); - QMap<int, QString>::Iterator it; - for ( it = ++m_fieldMap.begin(); it != m_fieldMap.end(); ++it ){ - if ( !eventMap[it.key()].isEmpty() ) - qu += QString( ",\"%1\"" ).arg( eventMap[it.key()] ); - else - qu += QString( ",\"\"" ); - } - qu += " );"; - - // Add custom entries - int id = 0; - QMap<QString, QString> customMap = ev.toExtraMap(); - for( QMap<QString, QString>::Iterator it = customMap.begin(); - it != customMap.end(); ++it ){ - qu += "insert into custom_data VALUES(" - + QString::number( ev.uid() ) - + "," - + QString::number( id++ ) - + ",'" - + it.key() //.latin1() - + "'," - + "0" // Priority for future enhancements - + ",'" - + it.data() //.latin1() - + "');"; - } - qWarning("add %s", qu.latin1() ); - - OSQLRawQuery raw( qu ); - OSQLResult res = m_driver->query( &raw ); - if ( res.state() != OSQLResult::Success ){ - return false; - } - - // Update list of uid's - update(); - - return true; -} - -// FIXME: Speed up update of uid's.. -bool ODateBookAccessBackend_SQL::remove( int uid ) -{ - QString qu = "DELETE from datebook where uid = " - + QString::number( uid ) + ";"; - qu += "DELETE from custom_data where uid = " - + QString::number( uid ) + ";"; - - OSQLRawQuery raw( qu ); - OSQLResult res = m_driver->query( &raw ); - if ( res.state() != OSQLResult::Success ){ - return false; - } - - // Update list of uid's - update(); - - return true; -} - -bool ODateBookAccessBackend_SQL::replace( const OEvent& ev ) -{ - remove( ev.uid() ); - return add( ev ); -} - -QArray<int> ODateBookAccessBackend_SQL::rawEvents()const -{ - return allRecords(); -} - -QArray<int> ODateBookAccessBackend_SQL::rawRepeats()const -{ - QString qu = "select uid from datebook where RType!=\"\" AND RType!=\"NoRepeat\""; - OSQLRawQuery raw( qu ); - OSQLResult res = m_driver->query( &raw ); - if ( res.state() != OSQLResult::Success ){ - QArray<int> nix; - return nix; - } - - return extractUids( res ); -} - -QArray<int> ODateBookAccessBackend_SQL::nonRepeats()const -{ - QString qu = "select uid from datebook where RType=\"\" or RType=\"NoRepeat\""; - OSQLRawQuery raw( qu ); - OSQLResult res = m_driver->query( &raw ); - if ( res.state() != OSQLResult::Success ){ - QArray<int> nix; - return nix; - } - - return extractUids( res ); -} - -OEvent::ValueList ODateBookAccessBackend_SQL::directNonRepeats() -{ - QArray<int> nonRepUids = nonRepeats(); - OEvent::ValueList list; - - for (uint i = 0; i < nonRepUids.count(); ++i ){ - list.append( find( nonRepUids[i] ) ); - } - - return list; - -} -OEvent::ValueList ODateBookAccessBackend_SQL::directRawRepeats() -{ - QArray<int> rawRepUids = rawRepeats(); - OEvent::ValueList list; - - for (uint i = 0; i < rawRepUids.count(); ++i ){ - list.append( find( rawRepUids[i] ) ); - } - - return list; -} - - -QArray<int> ODateBookAccessBackend_SQL::matchRegexp( const QRegExp &r ) const -{ - QArray<int> null; - return null; -} - -/* ===== Private Functions ========================================== */ - -QArray<int> ODateBookAccessBackend_SQL::extractUids( OSQLResult& res ) const -{ - qWarning("extractUids"); - QTime t; - t.start(); - OSQLResultItem::ValueList list = res.results(); - OSQLResultItem::ValueList::Iterator it; - QArray<int> ints(list.count() ); - qWarning(" count = %d", list.count() ); - - int i = 0; - for (it = list.begin(); it != list.end(); ++it ) { - ints[i] = (*it).data("uid").toInt(); - i++; - } - qWarning("extractUids ready: count2 = %d needs %d ms", i, t.elapsed() ); - - return ints; - -} diff --git a/libopie/pim/odatebookaccessbackend_sql.h b/libopie/pim/odatebookaccessbackend_sql.h deleted file mode 100644 index ba514bc..0000000 --- a/libopie/pim/odatebookaccessbackend_sql.h +++ b/dev/null @@ -1,65 +0,0 @@ -#ifndef OPIE_DATE_BOOK_ACCESS_BACKEND_SQL__H -#define OPIE_DATE_BOOK_ACCESS_BACKEND_SQL__H - -#include <qmap.h> -#include <opie2/osqlresult.h> - -#include "odatebookaccessbackend.h" - -namespace Opie { namespace DB { -class OSQLDriver; - -}} - -/** - * This is the default SQL implementation for DateBoook SQL storage - * It fully implements the interface - * @see ODateBookAccessBackend - * @see OPimAccessBackend - */ -class ODateBookAccessBackend_SQL : public ODateBookAccessBackend { -public: - ODateBookAccessBackend_SQL( const QString& appName, - const QString& fileName = QString::null); - ~ODateBookAccessBackend_SQL(); - - bool load(); - bool reload(); - bool save(); - - QArray<int> allRecords()const; - QArray<int> matchRegexp(const QRegExp &r) const; - QArray<int> queryByExample( const OEvent&, int, const QDateTime& d = QDateTime() ); - OEvent find( int uid )const; - void clear(); - bool add( const OEvent& ev ); - bool remove( int uid ); - bool replace( const OEvent& ev ); - - QArray<UID> rawEvents()const; - QArray<UID> rawRepeats()const; - QArray<UID> nonRepeats()const; - - OEvent::ValueList directNonRepeats(); - OEvent::ValueList directRawRepeats(); - -private: - bool loadFile(); - QString m_fileName; - QArray<int> m_uids; - - QMap<int, QString> m_fieldMap; - QMap<QString, int> m_reverseFieldMap; - - Opie::DB::OSQLDriver* m_driver; - - class Private; - Private *d; - - void initFields(); - void update(); - QArray<int> extractUids( Opie::DB::OSQLResult& res ) const; - -}; - -#endif diff --git a/libopie/pim/odatebookaccessbackend_xml.cpp b/libopie/pim/odatebookaccessbackend_xml.cpp deleted file mode 100644 index 929d004..0000000 --- a/libopie/pim/odatebookaccessbackend_xml.cpp +++ b/dev/null @@ -1,612 +0,0 @@ -#include <errno.h> -#include <fcntl.h> - -#include <stdio.h> -#include <stdlib.h> - -#include <sys/types.h> -#include <sys/mman.h> -#include <sys/stat.h> - -#include <unistd.h> - -#include <qasciidict.h> -#include <qfile.h> - -#include <qtopia/global.h> -#include <qtopia/stringutil.h> -#include <qtopia/timeconversion.h> - -#include "opimnotifymanager.h" -#include "orecur.h" -#include "otimezone.h" -#include "odatebookaccessbackend_xml.h" - -namespace { - // FROM TT again -char *strstrlen(const char *haystack, int hLen, const char* needle, int nLen) -{ - char needleChar; - char haystackChar; - if (!needle || !haystack || !hLen || !nLen) - return 0; - - const char* hsearch = haystack; - - if ((needleChar = *needle++) != 0) { - nLen--; //(to make up for needle++) - do { - do { - if ((haystackChar = *hsearch++) == 0) - return (0); - if (hsearch >= haystack + hLen) - return (0); - } while (haystackChar != needleChar); - } while (strncmp(hsearch, needle, QMIN(hLen - (hsearch - haystack), nLen)) != 0); - hsearch--; - } - return ((char *)hsearch); -} -} - -namespace { - time_t start, end, created, rp_end; - ORecur* rec; - ORecur* recur() { - if (!rec) - rec = new ORecur; - - return rec; - } - int alarmTime; - int snd; - enum Attribute{ - FDescription = 0, - FLocation, - FCategories, - FUid, - FType, - FAlarm, - FSound, - FRType, - FRWeekdays, - FRPosition, - FRFreq, - FRHasEndDate, - FREndDate, - FRStart, - FREnd, - FNote, - FCreated, // Should't this be called FRCreated ? - FTimeZone, - FRecParent, - FRecChildren, - FExceptions - }; - - // FIXME: Use OEvent::toMap() here !! (eilers) - inline void save( const OEvent& ev, QString& buf ) { - qWarning("Saving %d %s", ev.uid(), ev.description().latin1() ); - buf += " description=\"" + Qtopia::escapeString(ev.description() ) + "\""; - if (!ev.location().isEmpty() ) - buf += " location=\"" + Qtopia::escapeString(ev.location() ) + "\""; - - buf += " categories=\""+ Qtopia::escapeString( Qtopia::Record::idsToString( ev.categories() ) ) + "\""; - buf += " uid=\"" + QString::number( ev.uid() ) + "\""; - - if (ev.isAllDay() ) - buf += " type=\"AllDay\""; // is that all ?? (eilers) - - if (ev.hasNotifiers() ) { - OPimAlarm alarm = ev.notifiers().alarms()[0]; // take only the first - int minutes = alarm.dateTime().secsTo( ev.startDateTime() ) / 60; - buf += " alarm=\"" + QString::number(minutes) + "\" sound=\""; - if ( alarm.sound() == OPimAlarm::Loud ) - buf += "loud"; - else - buf += "silent"; - buf += "\""; - } - if ( ev.hasRecurrence() ) { - buf += ev.recurrence().toString(); - } - - /* - * fscking timezones :) well, we'll first convert - * the QDateTime to a QDateTime in UTC time - * and then we'll create a nice time_t - */ - OTimeZone zone( ev.timeZone().isEmpty() ? OTimeZone::current() : ev.timeZone() ); - buf += " start=\"" + QString::number( zone.fromUTCDateTime( zone.toDateTime( ev.startDateTime(), OTimeZone::utc() ) ) ) + "\""; - buf += " end=\"" + QString::number( zone.fromUTCDateTime( zone.toDateTime( ev.endDateTime() , OTimeZone::utc() ) ) ) + "\""; - if (!ev.note().isEmpty() ) { - buf += " note=\"" + Qtopia::escapeString( ev.note() ) + "\""; - } - - buf += " timezone=\""; - if ( ev.timeZone().isEmpty() ) - buf += "None"; - else - buf += ev.timeZone(); - buf += "\""; - - if (ev.parent() != 0 ) { - buf += " recparent=\""+QString::number(ev.parent() )+"\""; - } - - if (ev.children().count() != 0 ) { - QArray<int> children = ev.children(); - buf += " recchildren=\""; - for ( uint i = 0; i < children.count(); i++ ) { - if ( i != 0 ) buf += " "; - buf += QString::number( children[i] ); - } - buf+= "\""; - } - - // skip custom writing - } - - inline bool forAll( const QMap<int, OEvent>& list, QFile& file ) { - QMap<int, OEvent>::ConstIterator it; - QString buf; - QCString str; - int total_written; - for ( it = list.begin(); it != list.end(); ++it ) { - buf = "<event"; - save( it.data(), buf ); - buf += " />\n"; - str = buf.utf8(); - - total_written = file.writeBlock(str.data(), str.length() ); - if ( total_written != int(str.length() ) ) - return false; - } - return true; - } -} - -ODateBookAccessBackend_XML::ODateBookAccessBackend_XML( const QString& , - const QString& fileName ) - : ODateBookAccessBackend() { - m_name = fileName.isEmpty() ? Global::applicationFileName( "datebook", "datebook.xml" ) : fileName; - m_changed = false; -} -ODateBookAccessBackend_XML::~ODateBookAccessBackend_XML() { -} -bool ODateBookAccessBackend_XML::load() { - return loadFile(); -} -bool ODateBookAccessBackend_XML::reload() { - clear(); - return load(); -} -bool ODateBookAccessBackend_XML::save() { - if (!m_changed) return true; - - int total_written; - QString strFileNew = m_name + ".new"; - - QFile f( strFileNew ); - if (!f.open( IO_WriteOnly | IO_Raw ) ) return false; - - QString buf( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" ); - buf += "<!DOCTYPE DATEBOOK><DATEBOOK>\n"; - buf += "<events>\n"; - QCString str = buf.utf8(); - total_written = f.writeBlock( str.data(), str.length() ); - if ( total_written != int(str.length() ) ) { - f.close(); - QFile::remove( strFileNew ); - return false; - } - - if (!forAll( m_raw, f ) ) { - f.close(); - QFile::remove( strFileNew ); - return false; - } - if (!forAll( m_rep, f ) ) { - f.close(); - QFile::remove( strFileNew ); - return false; - } - - buf = "</events>\n</DATEBOOK>\n"; - str = buf.utf8(); - total_written = f.writeBlock( str.data(), str.length() ); - if ( total_written != int(str.length() ) ) { - f.close(); - QFile::remove( strFileNew ); - return false; - } - f.close(); - - if ( ::rename( strFileNew, m_name ) < 0 ) { - QFile::remove( strFileNew ); - return false; - } - - m_changed = false; - return true; -} -QArray<int> ODateBookAccessBackend_XML::allRecords()const { - QArray<int> ints( m_raw.count()+ m_rep.count() ); - uint i = 0; - QMap<int, OEvent>::ConstIterator it; - - for ( it = m_raw.begin(); it != m_raw.end(); ++it ) { - ints[i] = it.key(); - i++; - } - for ( it = m_rep.begin(); it != m_rep.end(); ++it ) { - ints[i] = it.key(); - i++; - } - - return ints; -} -QArray<int> ODateBookAccessBackend_XML::queryByExample(const OEvent&, int, const QDateTime& ) { - return QArray<int>(); -} -void ODateBookAccessBackend_XML::clear() { - m_changed = true; - m_raw.clear(); - m_rep.clear(); -} -OEvent ODateBookAccessBackend_XML::find( int uid ) const{ - if ( m_raw.contains( uid ) ) - return m_raw[uid]; - else - return m_rep[uid]; -} -bool ODateBookAccessBackend_XML::add( const OEvent& ev ) { - m_changed = true; - if (ev.hasRecurrence() ) - m_rep.insert( ev.uid(), ev ); - else - m_raw.insert( ev.uid(), ev ); - - return true; -} -bool ODateBookAccessBackend_XML::remove( int uid ) { - m_changed = true; - m_rep.remove( uid ); - m_rep.remove( uid ); - - return true; -} -bool ODateBookAccessBackend_XML::replace( const OEvent& ev ) { - replace( ev.uid() ); // ??? Shouldn't this be "remove( ev.uid() ) ??? (eilers) - return add( ev ); -} -QArray<int> ODateBookAccessBackend_XML::rawEvents()const { - return allRecords(); -} -QArray<int> ODateBookAccessBackend_XML::rawRepeats()const { - QArray<int> ints( m_rep.count() ); - uint i = 0; - QMap<int, OEvent>::ConstIterator it; - - for ( it = m_rep.begin(); it != m_rep.end(); ++it ) { - ints[i] = it.key(); - i++; - } - - return ints; -} -QArray<int> ODateBookAccessBackend_XML::nonRepeats()const { - QArray<int> ints( m_raw.count() ); - uint i = 0; - QMap<int, OEvent>::ConstIterator it; - - for ( it = m_raw.begin(); it != m_raw.end(); ++it ) { - ints[i] = it.key(); - i++; - } - - return ints; -} -OEvent::ValueList ODateBookAccessBackend_XML::directNonRepeats() { - OEvent::ValueList list; - QMap<int, OEvent>::ConstIterator it; - for (it = m_raw.begin(); it != m_raw.end(); ++it ) - list.append( it.data() ); - - return list; -} -OEvent::ValueList ODateBookAccessBackend_XML::directRawRepeats() { - OEvent::ValueList list; - QMap<int, OEvent>::ConstIterator it; - for (it = m_rep.begin(); it != m_rep.end(); ++it ) - list.append( it.data() ); - - return list; -} - -// FIXME: Use OEvent::fromMap() (eilers) -bool ODateBookAccessBackend_XML::loadFile() { - m_changed = false; - - int fd = ::open( QFile::encodeName(m_name).data(), O_RDONLY ); - if ( fd < 0 ) return false; - - struct stat attribute; - if ( ::fstat(fd, &attribute ) == -1 ) { - ::close( fd ); - return false; - } - void* map_addr = ::mmap(NULL, attribute.st_size, PROT_READ, MAP_SHARED, fd, 0 ); - if ( map_addr == ( (caddr_t)-1) ) { - ::close( fd ); - return false; - } - - ::madvise( map_addr, attribute.st_size, MADV_SEQUENTIAL ); - ::close( fd ); - - QAsciiDict<int> dict(FExceptions+1); - dict.setAutoDelete( true ); - dict.insert( "description", new int(FDescription) ); - dict.insert( "location", new int(FLocation) ); - dict.insert( "categories", new int(FCategories) ); - dict.insert( "uid", new int(FUid) ); - dict.insert( "type", new int(FType) ); - dict.insert( "alarm", new int(FAlarm) ); - dict.insert( "sound", new int(FSound) ); - dict.insert( "rtype", new int(FRType) ); - dict.insert( "rweekdays", new int(FRWeekdays) ); - dict.insert( "rposition", new int(FRPosition) ); - dict.insert( "rfreq", new int(FRFreq) ); - dict.insert( "rhasenddate", new int(FRHasEndDate) ); - dict.insert( "enddt", new int(FREndDate) ); - dict.insert( "start", new int(FRStart) ); - dict.insert( "end", new int(FREnd) ); - dict.insert( "note", new int(FNote) ); - dict.insert( "created", new int(FCreated) ); // Shouldn't this be FRCreated ?? - dict.insert( "recparent", new int(FRecParent) ); - dict.insert( "recchildren", new int(FRecChildren) ); - dict.insert( "exceptions", new int(FExceptions) ); - dict.insert( "timezone", new int(FTimeZone) ); - - char* dt = (char*)map_addr; - int len = attribute.st_size; - int i = 0; - char* point; - const char* collectionString = "<event "; - int strLen = ::strlen(collectionString); - int *find; - while ( ( point = ::strstrlen( dt+i, len -i, collectionString, strLen ) ) != 0 ) { - i = point -dt; - i+= strLen; - - alarmTime = -1; - snd = 0; // silent - - OEvent ev; - rec = 0; - - while ( TRUE ) { - while ( i < len && (dt[i] == ' ' || dt[i] == '\n' || dt[i] == '\r') ) - ++i; - if ( i >= len-2 || (dt[i] == '/' && dt[i+1] == '>') ) - break; - - - // we have another attribute, read it. - int j = i; - while ( j < len && dt[j] != '=' ) - ++j; - QCString attr( dt+i, j-i+1); - - i = ++j; // skip = - - // find the start of quotes - while ( i < len && dt[i] != '"' ) - ++i; - j = ++i; - - bool haveUtf = FALSE; - bool haveEnt = FALSE; - while ( j < len && dt[j] != '"' ) { - if ( ((unsigned char)dt[j]) > 0x7f ) - haveUtf = TRUE; - if ( dt[j] == '&' ) - haveEnt = TRUE; - ++j; - } - if ( i == j ) { - // empty value - i = j + 1; - continue; - } - - QCString value( dt+i, j-i+1 ); - i = j + 1; - - QString str = (haveUtf ? QString::fromUtf8( value ) - : QString::fromLatin1( value ) ); - if ( haveEnt ) - str = Qtopia::plainString( str ); - - /* - * add key + value - */ - find = dict[attr.data()]; - if (!find) - ev.setCustomField( attr, str ); - else { - setField( ev, *find, str ); - } - } - /* time to finalize */ - finalizeRecord( ev ); - delete rec; - } - ::munmap(map_addr, attribute.st_size ); - m_changed = false; // changed during add - - return true; -} - -// FIXME: Use OEvent::fromMap() which makes this obsolete.. (eilers) -void ODateBookAccessBackend_XML::finalizeRecord( OEvent& ev ) { - /* AllDay is alway in UTC */ - if ( ev.isAllDay() ) { - OTimeZone utc = OTimeZone::utc(); - ev.setStartDateTime( utc.fromUTCDateTime( start ) ); - ev.setEndDateTime ( utc.fromUTCDateTime( end ) ); - ev.setTimeZone( "UTC"); // make sure it is really utc - }else { - /* to current date time */ - // qWarning(" Start is %d", start ); - OTimeZone zone( ev.timeZone().isEmpty() ? OTimeZone::current() : ev.timeZone() ); - QDateTime date = zone.toDateTime( start ); - qWarning(" Start is %s", date.toString().latin1() ); - ev.setStartDateTime( zone.toDateTime( date, OTimeZone::current() ) ); - - date = zone.toDateTime( end ); - ev.setEndDateTime ( zone.toDateTime( date, OTimeZone::current() ) ); - } - if ( rec && rec->doesRecur() ) { - OTimeZone utc = OTimeZone::utc(); - ORecur recu( *rec ); // call copy c'tor; - recu.setEndDate ( utc.fromUTCDateTime( rp_end ).date() ); - recu.setCreatedDateTime( utc.fromUTCDateTime( created ) ); - recu.setStart( ev.startDateTime().date() ); - ev.setRecurrence( recu ); - } - - if (alarmTime != -1 ) { - QDateTime dt = ev.startDateTime().addSecs( -1*alarmTime*60 ); - OPimAlarm al( snd , dt ); - ev.notifiers().add( al ); - } - if ( m_raw.contains( ev.uid() ) || m_rep.contains( ev.uid() ) ) { - qWarning("already contains assign uid"); - ev.setUid( 1 ); - } - qWarning("addind %d %s", ev.uid(), ev.description().latin1() ); - if ( ev.hasRecurrence() ) - m_rep.insert( ev.uid(), ev ); - else - m_raw.insert( ev.uid(), ev ); - -} -void ODateBookAccessBackend_XML::setField( OEvent& e, int id, const QString& value) { -// qWarning(" setting %s", value.latin1() ); - switch( id ) { - case FDescription: - e.setDescription( value ); - break; - case FLocation: - e.setLocation( value ); - break; - case FCategories: - e.setCategories( e.idsFromString( value ) ); - break; - case FUid: - e.setUid( value.toInt() ); - break; - case FType: - if ( value == "AllDay" ) { - e.setAllDay( true ); - e.setTimeZone( "UTC" ); - } - break; - case FAlarm: - alarmTime = value.toInt(); - break; - case FSound: - snd = value == "loud" ? OPimAlarm::Loud : OPimAlarm::Silent; - break; - // recurrence stuff - case FRType: - if ( value == "Daily" ) - recur()->setType( ORecur::Daily ); - else if ( value == "Weekly" ) - recur()->setType( ORecur::Weekly); - else if ( value == "MonthlyDay" ) - recur()->setType( ORecur::MonthlyDay ); - else if ( value == "MonthlyDate" ) - recur()->setType( ORecur::MonthlyDate ); - else if ( value == "Yearly" ) - recur()->setType( ORecur::Yearly ); - else - recur()->setType( ORecur::NoRepeat ); - break; - case FRWeekdays: - recur()->setDays( value.toInt() ); - break; - case FRPosition: - recur()->setPosition( value.toInt() ); - break; - case FRFreq: - recur()->setFrequency( value.toInt() ); - break; - case FRHasEndDate: - recur()->setHasEndDate( value.toInt() ); - break; - case FREndDate: { - rp_end = (time_t) value.toLong(); - break; - } - case FRStart: { - start = (time_t) value.toLong(); - break; - } - case FREnd: { - end = ( (time_t) value.toLong() ); - break; - } - case FNote: - e.setNote( value ); - break; - case FCreated: - created = value.toInt(); - break; - case FRecParent: - e.setParent( value.toInt() ); - break; - case FRecChildren:{ - QStringList list = QStringList::split(' ', value ); - for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { - e.addChild( (*it).toInt() ); - } - } - break; - case FExceptions:{ - QStringList list = QStringList::split(' ', value ); - for (QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { - QDate date( (*it).left(4).toInt(), (*it).mid(4, 2).toInt(), (*it).right(2).toInt() ); - qWarning("adding exception %s", date.toString().latin1() ); - recur()->exceptions().append( date ); - } - } - break; - case FTimeZone: - if ( value != "None" ) - e.setTimeZone( value ); - break; - default: - break; - } -} -QArray<int> ODateBookAccessBackend_XML::matchRegexp( const QRegExp &r ) const -{ - QArray<int> m_currentQuery( m_raw.count()+ m_rep.count() ); - uint arraycounter = 0; - QMap<int, OEvent>::ConstIterator it; - - for ( it = m_raw.begin(); it != m_raw.end(); ++it ) - if ( it.data().match( r ) ) - m_currentQuery[arraycounter++] = it.data().uid(); - for ( it = m_rep.begin(); it != m_rep.end(); ++it ) - if ( it.data().match( r ) ) - m_currentQuery[arraycounter++] = it.data().uid(); - - // Shrink to fit.. - m_currentQuery.resize(arraycounter); - - return m_currentQuery; -} diff --git a/libopie/pim/odatebookaccessbackend_xml.h b/libopie/pim/odatebookaccessbackend_xml.h deleted file mode 100644 index a5cc0fc..0000000 --- a/libopie/pim/odatebookaccessbackend_xml.h +++ b/dev/null @@ -1,55 +0,0 @@ -#ifndef OPIE_DATE_BOOK_ACCESS_BACKEND_XML__H -#define OPIE_DATE_BOOK_ACCESS_BACKEND_XML__H - -#include <qmap.h> - -#include "odatebookaccessbackend.h" - -/** - * This is the default XML implementation for DateBoook XML storage - * It fully implements the interface - * @see ODateBookAccessBackend - * @see OPimAccessBackend - */ -class ODateBookAccessBackend_XML : public ODateBookAccessBackend { -public: - ODateBookAccessBackend_XML( const QString& appName, - const QString& fileName = QString::null); - ~ODateBookAccessBackend_XML(); - - bool load(); - bool reload(); - bool save(); - - QArray<int> allRecords()const; - QArray<int> matchRegexp(const QRegExp &r) const; - QArray<int> queryByExample( const OEvent&, int, const QDateTime& d = QDateTime() ); - OEvent find( int uid )const; - void clear(); - bool add( const OEvent& ev ); - bool remove( int uid ); - bool replace( const OEvent& ev ); - - QArray<UID> rawEvents()const; - QArray<UID> rawRepeats()const; - QArray<UID> nonRepeats()const; - - OEvent::ValueList directNonRepeats(); - OEvent::ValueList directRawRepeats(); - -private: - bool m_changed :1 ; - bool loadFile(); - inline void finalizeRecord( OEvent& ev ); - inline void setField( OEvent&, int field, const QString& val ); - QString m_name; - QMap<int, OEvent> m_raw; - QMap<int, OEvent> m_rep; - - struct Data; - Data* data; - class Private; - Private *d; -}; - -#endif diff --git a/libopie/pim/oevent.cpp b/libopie/pim/oevent.cpp deleted file mode 100644 index 9b31957..0000000 --- a/libopie/pim/oevent.cpp +++ b/dev/null @@ -1,717 +0,0 @@ -#include <qshared.h> -#include <qarray.h> - -#include <qpe/palmtopuidgen.h> -#include <qpe/categories.h> -#include <qpe/stringutil.h> - -#include "orecur.h" -#include "opimresolver.h" -#include "opimnotifymanager.h" - -#include "oevent.h" - -int OCalendarHelper::week( const QDate& date) { - // Calculates the week this date is in within that - // month. Equals the "row" is is in in the month view - int week = 1; - QDate tmp( date.year(), date.month(), 1 ); - if ( date.dayOfWeek() < tmp.dayOfWeek() ) - ++week; - - week += ( date.day() - 1 ) / 7; - - return week; -} -int OCalendarHelper::ocurrence( const QDate& date) { - // calculates the number of occurrances of this day of the - // week till the given date (e.g 3rd Wednesday of the month) - return ( date.day() - 1 ) / 7 + 1; -} -int OCalendarHelper::dayOfWeek( char day ) { - int dayOfWeek = 1; - char i = ORecur::MON; - while ( !( i & day ) && i <= ORecur::SUN ) { - i <<= 1; - ++dayOfWeek; - } - return dayOfWeek; -} -int OCalendarHelper::monthDiff( const QDate& first, const QDate& second ) { - return ( second.year() - first.year() ) * 12 + - second.month() - first.month(); -} - -struct OEvent::Data : public QShared { - Data() : QShared() { - child = 0; - recur = 0; - manager = 0; - isAllDay = false; - parent = 0; - } - ~Data() { - delete manager; - delete recur; - } - QString description; - QString location; - OPimNotifyManager* manager; - ORecur* recur; - QString note; - QDateTime created; - QDateTime start; - QDateTime end; - bool isAllDay : 1; - QString timezone; - QArray<int>* child; - int parent; -}; - -OEvent::OEvent( int uid ) - : OPimRecord( uid ) { - data = new Data; -} -OEvent::OEvent( const OEvent& ev) - : OPimRecord( ev ), data( ev.data ) -{ - data->ref(); -} - -OEvent::OEvent( const QMap<int, QString> map ) - : OPimRecord( 0 ) -{ - data = new Data; - - fromMap( map ); -} - -OEvent::~OEvent() { - if ( data->deref() ) { - delete data; - data = 0; - } -} -OEvent& OEvent::operator=( const OEvent& ev) { - if ( this == &ev ) return *this; - - OPimRecord::operator=( ev ); - ev.data->ref(); - deref(); - data = ev.data; - - - return *this; -} -QString OEvent::description()const { - return data->description; -} -void OEvent::setDescription( const QString& description ) { - changeOrModify(); - data->description = description; -} -void OEvent::setLocation( const QString& loc ) { - changeOrModify(); - data->location = loc; -} -QString OEvent::location()const { - return data->location; -} -OPimNotifyManager &OEvent::notifiers()const { - // I hope we can skip the changeOrModify here - // the notifier should take care of it - // and OPimNotify is shared too - if (!data->manager ) - data->manager = new OPimNotifyManager; - - return *data->manager; -} -bool OEvent::hasNotifiers()const { - if (!data->manager ) - return false; - if (data->manager->reminders().isEmpty() && - data->manager->alarms().isEmpty() ) - return false; - - return true; -} -ORecur OEvent::recurrence()const { - if (!data->recur) - data->recur = new ORecur; - - return *data->recur; -} -void OEvent::setRecurrence( const ORecur& rec) { - changeOrModify(); - if (data->recur ) - (*data->recur) = rec; - else - data->recur = new ORecur( rec ); -} -bool OEvent::hasRecurrence()const { - if (!data->recur ) return false; - return data->recur->doesRecur(); -} -QString OEvent::note()const { - return data->note; -} -void OEvent::setNote( const QString& note ) { - changeOrModify(); - data->note = note; -} -QDateTime OEvent::createdDateTime()const { - return data->created; -} -void OEvent::setCreatedDateTime( const QDateTime& time ) { - changeOrModify(); - data->created = time; -} -QDateTime OEvent::startDateTime()const { - if ( data->isAllDay ) - return QDateTime( data->start.date(), QTime(0, 0, 0 ) ); - return data->start; -} -QDateTime OEvent::startDateTimeInZone()const { - /* if no timezone, or all day event or if the current and this timeZone match... */ - if (data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return startDateTime(); - - OTimeZone zone(data->timezone ); - return zone.toDateTime( data->start, OTimeZone::current() ); -} -void OEvent::setStartDateTime( const QDateTime& dt ) { - changeOrModify(); - data->start = dt; -} -QDateTime OEvent::endDateTime()const { - /* - * if all Day event the end time needs - * to be on the same day as the start - */ - if ( data->isAllDay ) - return QDateTime( data->start.date(), QTime(23, 59, 59 ) ); - return data->end; -} -QDateTime OEvent::endDateTimeInZone()const { - /* if no timezone, or all day event or if the current and this timeZone match... */ - if (data->timezone.isEmpty() || data->isAllDay || data->timezone == OTimeZone::current().timeZone() ) return endDateTime(); - - OTimeZone zone(data->timezone ); - return zone.toDateTime( data->end, OTimeZone::current() ); -} -void OEvent::setEndDateTime( const QDateTime& dt ) { - changeOrModify(); - data->end = dt; -} -bool OEvent::isMultipleDay()const { - return data->end.date().day() - data->start.date().day(); -} -bool OEvent::isAllDay()const { - return data->isAllDay; -} -void OEvent::setAllDay( bool allDay ) { - changeOrModify(); - data->isAllDay = allDay; - if (allDay ) data->timezone = "UTC"; -} -void OEvent::setTimeZone( const QString& tz ) { - changeOrModify(); - data->timezone = tz; -} -QString OEvent::timeZone()const { - if (data->isAllDay ) return QString::fromLatin1("UTC"); - return data->timezone; -} -bool OEvent::match( const QRegExp& re )const { - if ( re.match( data->description ) != -1 ){ - setLastHitField( Qtopia::DatebookDescription ); - return true; - } - if ( re.match( data->note ) != -1 ){ - setLastHitField( Qtopia::Note ); - return true; - } - if ( re.match( data->location ) != -1 ){ - setLastHitField( Qtopia::Location ); - return true; - } - if ( re.match( data->start.toString() ) != -1 ){ - setLastHitField( Qtopia::StartDateTime ); - return true; - } - if ( re.match( data->end.toString() ) != -1 ){ - setLastHitField( Qtopia::EndDateTime ); - return true; - } - return false; -} -QString OEvent::toRichText()const { - QString text, value; - - // description - text += "<b><h3><img src=\"datebook/DateBook\">"; - if ( !description().isEmpty() ) { - text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "" ); - } - text += "</h3></b><br><hr><br>"; - - // location - if ( !(value = location()).isEmpty() ) { - text += "<b>" + QObject::tr( "Location:" ) + "</b> "; - text += Qtopia::escapeString(value) + "<br>"; - } - - // all day event - if ( isAllDay() ) { - text += "<b><i>" + QObject::tr( "This is an all day event" ) + "</i></b><br>"; - } - // multiple day event - else if ( isMultipleDay () ) { - text += "<b><i>" + QObject::tr( "This is a multiple day event" ) + "</i></b><br>"; - } - // start & end times - else { - // start time - if ( startDateTime().isValid() ) { - text += "<b>" + QObject::tr( "Start:") + "</b> "; - text += Qtopia::escapeString(startDateTime().toString() ). - replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; - } - - // end time - if ( endDateTime().isValid() ) { - text += "<b>" + QObject::tr( "End:") + "</b> "; - text += Qtopia::escapeString(endDateTime().toString() ). - replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; - } - } - - // categories - if ( categoryNames("Calendar").count() ){ - text += "<b>" + QObject::tr( "Category:") + "</b> "; - text += categoryNames("Calendar").join(", "); - text += "<br>"; - } - - //notes - if ( !note().isEmpty() ) { - text += "<b>" + QObject::tr( "Note:") + "</b><br>"; - text += note(); -// text += Qtopia::escapeString(note() ). -// replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; - } - return text; -} -QString OEvent::toShortText()const { - QString text; - text += QString::number( startDateTime().date().day() ); - text += "."; - text += QString::number( startDateTime().date().month() ); - text += "."; - text += QString::number( startDateTime().date().year() ); - text += " "; - text += QString::number( startDateTime().time().hour() ); - text += ":"; - text += QString::number( startDateTime().time().minute() ); - text += " - "; - text += description(); - return text; -} -QString OEvent::type()const { - return QString::fromLatin1("OEvent"); -} -QString OEvent::recordField( int /*id */ )const { - return QString::null; -} -int OEvent::rtti() { - return OPimResolver::DateBook; -} -bool OEvent::loadFromStream( QDataStream& ) { - return true; -} -bool OEvent::saveToStream( QDataStream& )const { - return true; -} -void OEvent::changeOrModify() { - if ( data->count != 1 ) { - data->deref(); - Data* d2 = new Data; - d2->description = data->description; - d2->location = data->location; - - if (data->manager ) - d2->manager = new OPimNotifyManager( *data->manager ); - - if ( data->recur ) - d2->recur = new ORecur( *data->recur ); - - d2->note = data->note; - d2->created = data->created; - d2->start = data->start; - d2->end = data->end; - d2->isAllDay = data->isAllDay; - d2->timezone = data->timezone; - d2->parent = data->parent; - - if ( data->child ) { - d2->child = new QArray<int>( *data->child ); - d2->child->detach(); - } - - data = d2; - } -} -void OEvent::deref() { - if ( data->deref() ) { - delete data; - data = 0; - } -} -// Exporting Event data to map. Using the same -// encoding as ODateBookAccessBackend_xml does.. -// Thus, we could remove the stuff there and use this -// for it and for all other places.. -// Encoding should happen at one place, only ! (eilers) -QMap<int, QString> OEvent::toMap()const { - QMap<int, QString> retMap; - - retMap.insert( OEvent::FUid, QString::number( uid() ) ); - retMap.insert( OEvent::FCategories, Qtopia::escapeString( Qtopia::Record::idsToString( categories() ) )); - retMap.insert( OEvent::FDescription, Qtopia::escapeString( description() ) ); - retMap.insert( OEvent::FLocation, Qtopia::escapeString( location() ) ); - retMap.insert( OEvent::FType, isAllDay() ? "AllDay" : "" ); - OPimAlarm alarm = notifiers().alarms()[0]; - retMap.insert( OEvent::FAlarm, QString::number( alarm.dateTime().secsTo( startDateTime() ) / 60 ) ); - retMap.insert( OEvent::FSound, (alarm.sound() == OPimAlarm::Loud) ? "loud" : "silent" ); - - OTimeZone zone( timeZone().isEmpty() ? OTimeZone::current() : timeZone() ); - retMap.insert( OEvent::FStart, QString::number( zone.fromUTCDateTime( zone.toDateTime( startDateTime(), OTimeZone::utc() ) ) ) ); - retMap.insert( OEvent::FEnd, QString::number( zone.fromUTCDateTime( zone.toDateTime( endDateTime(), OTimeZone::utc() ) ) ) ); - retMap.insert( OEvent::FNote, Qtopia::escapeString( note() ) ); - retMap.insert( OEvent::FTimeZone, timeZone().isEmpty() ? QString( "None" ) : timeZone() ); - if( parent() ) - retMap.insert( OEvent::FRecParent, QString::number( parent() ) ); - if( children().count() ){ - QArray<int> childr = children(); - QString buf; - for ( uint i = 0; i < childr.count(); i++ ) { - if ( i != 0 ) buf += " "; - buf += QString::number( childr[i] ); - } - retMap.insert( OEvent::FRecChildren, buf ); - } - - // Add recurrence stuff - if( hasRecurrence() ){ - ORecur recur = recurrence(); - QMap<int, QString> recFields = recur.toMap(); - retMap.insert( OEvent::FRType, recFields[ORecur::RType] ); - retMap.insert( OEvent::FRWeekdays, recFields[ORecur::RWeekdays] ); - retMap.insert( OEvent::FRPosition, recFields[ORecur::RPosition] ); - retMap.insert( OEvent::FRFreq, recFields[ORecur::RFreq] ); - retMap.insert( OEvent::FRHasEndDate, recFields[ORecur::RHasEndDate] ); - retMap.insert( OEvent::FREndDate, recFields[ORecur::EndDate] ); - retMap.insert( OEvent::FRCreated, recFields[ORecur::Created] ); - retMap.insert( OEvent::FRExceptions, recFields[ORecur::Exceptions] ); - } else { - ORecur recur = recurrence(); - QMap<int, QString> recFields = recur.toMap(); - retMap.insert( OEvent::FRType, recFields[ORecur::RType] ); - } - - return retMap; -} - -void OEvent::fromMap( const QMap<int, QString>& map ) -{ - - // We just want to set the UID if it is really stored. - if ( !map[OEvent::FUid].isEmpty() ) - setUid( map[OEvent::FUid].toInt() ); - - setCategories( idsFromString( map[OEvent::FCategories] ) ); - setDescription( map[OEvent::FDescription] ); - setLocation( map[OEvent::FLocation] ); - - if ( map[OEvent::FType] == "AllDay" ) - setAllDay( true ); - else - setAllDay( false ); - - int alarmTime = -1; - if( !map[OEvent::FAlarm].isEmpty() ) - alarmTime = map[OEvent::FAlarm].toInt(); - - int sound = ( ( map[OEvent::FSound] == "loud" ) ? OPimAlarm::Loud : OPimAlarm::Silent ); - if ( ( alarmTime != -1 ) ){ - QDateTime dt = startDateTime().addSecs( -1*alarmTime*60 ); - OPimAlarm al( sound , dt ); - notifiers().add( al ); - } - if ( !map[OEvent::FTimeZone].isEmpty() && ( map[OEvent::FTimeZone] != "None" ) ){ - setTimeZone( map[OEvent::FTimeZone] ); - } - - time_t start = (time_t) map[OEvent::FStart].toLong(); - time_t end = (time_t) map[OEvent::FEnd].toLong(); - - /* AllDay is always in UTC */ - if ( isAllDay() ) { - OTimeZone utc = OTimeZone::utc(); - setStartDateTime( utc.fromUTCDateTime( start ) ); - setEndDateTime ( utc.fromUTCDateTime( end ) ); - setTimeZone( "UTC"); // make sure it is really utc - }else { - /* to current date time */ - // qWarning(" Start is %d", start ); - OTimeZone zone( timeZone().isEmpty() ? OTimeZone::current() : timeZone() ); - QDateTime date = zone.toDateTime( start ); - qWarning(" Start is %s", date.toString().latin1() ); - setStartDateTime( zone.toDateTime( date, OTimeZone::current() ) ); - - date = zone.toDateTime( end ); - setEndDateTime ( zone.toDateTime( date, OTimeZone::current() ) ); - } - - if ( !map[OEvent::FRecParent].isEmpty() ) - setParent( map[OEvent::FRecParent].toInt() ); - - if ( !map[OEvent::FRecChildren].isEmpty() ){ - QStringList list = QStringList::split(' ', map[OEvent::FRecChildren] ); - for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { - addChild( (*it).toInt() ); - } - } - - // Fill recurrence stuff and put it directly into the ORecur-Object using fromMap.. - if( !map[OEvent::FRType].isEmpty() ){ - QMap<int, QString> recFields; - recFields.insert( ORecur::RType, map[OEvent::FRType] ); - recFields.insert( ORecur::RWeekdays, map[OEvent::FRWeekdays] ); - recFields.insert( ORecur::RPosition, map[OEvent::FRPosition] ); - recFields.insert( ORecur::RFreq, map[OEvent::FRFreq] ); - recFields.insert( ORecur::RHasEndDate, map[OEvent::FRHasEndDate] ); - recFields.insert( ORecur::EndDate, map[OEvent::FREndDate] ); - recFields.insert( ORecur::Created, map[OEvent::FRCreated] ); - recFields.insert( ORecur::Exceptions, map[OEvent::FRExceptions] ); - ORecur recur( recFields ); - setRecurrence( recur ); - } - -} - - -int OEvent::parent()const { - return data->parent; -} -void OEvent::setParent( int uid ) { - changeOrModify(); - data->parent = uid; -} -QArray<int> OEvent::children() const{ - if (!data->child) return QArray<int>(); - else - return data->child->copy(); -} -void OEvent::setChildren( const QArray<int>& arr ) { - changeOrModify(); - if (data->child) delete data->child; - - data->child = new QArray<int>( arr ); - data->child->detach(); -} -void OEvent::addChild( int uid ) { - changeOrModify(); - if (!data->child ) { - data->child = new QArray<int>(1); - (*data->child)[0] = uid; - }else{ - int count = data->child->count(); - data->child->resize( count + 1 ); - (*data->child)[count] = uid; - } -} -void OEvent::removeChild( int uid ) { - if (!data->child || !data->child->contains( uid ) ) return; - changeOrModify(); - QArray<int> newAr( data->child->count() - 1 ); - int j = 0; - uint count = data->child->count(); - for ( uint i = 0; i < count; i++ ) { - if ( (*data->child)[i] != uid ) { - newAr[j] = (*data->child)[i]; - j++; - } - } - (*data->child) = newAr; -} -struct OEffectiveEvent::Data : public QShared { - Data() : QShared() { - } - OEvent event; - QDate date; - QTime start, end; - QDate startDate, endDate; - bool dates : 1; -}; - -OEffectiveEvent::OEffectiveEvent() { - data = new Data; - data->date = QDate::currentDate(); - data->start = data->end = QTime::currentTime(); - data->dates = false; -} -OEffectiveEvent::OEffectiveEvent( const OEvent& ev, const QDate& startDate, - Position pos ) { - data = new Data; - data->event = ev; - data->date = startDate; - if ( pos & Start ) - data->start = ev.startDateTime().time(); - else - data->start = QTime( 0, 0, 0 ); - - if ( pos & End ) - data->end = ev.endDateTime().time(); - else - data->end = QTime( 23, 59, 59 ); - - data->dates = false; -} -OEffectiveEvent::OEffectiveEvent( const OEffectiveEvent& ev) { - data = ev.data; - data->ref(); -} -OEffectiveEvent::~OEffectiveEvent() { - if ( data->deref() ) { - delete data; - data = 0; - } -} -OEffectiveEvent& OEffectiveEvent::operator=( const OEffectiveEvent& ev ) { - if ( *this == ev ) return *this; - - ev.data->ref(); - deref(); - data = ev.data; - - return *this; -} - -void OEffectiveEvent::setStartTime( const QTime& ti) { - changeOrModify(); - data->start = ti; -} -void OEffectiveEvent::setEndTime( const QTime& en) { - changeOrModify(); - data->end = en; -} -void OEffectiveEvent::setEvent( const OEvent& ev) { - changeOrModify(); - data->event = ev; -} -void OEffectiveEvent::setDate( const QDate& da) { - changeOrModify(); - data->date = da; -} -void OEffectiveEvent::setEffectiveDates( const QDate& from, - const QDate& to ) { - if (!from.isValid() ) { - data->dates = false; - return; - } - - data->startDate = from; - data->endDate = to; -} -QString OEffectiveEvent::description()const { - return data->event.description(); -} -QString OEffectiveEvent::location()const { - return data->event.location(); -} -QString OEffectiveEvent::note()const { - return data->event.note(); -} -OEvent OEffectiveEvent::event()const { - return data->event; -} -QTime OEffectiveEvent::startTime()const { - return data->start; -} -QTime OEffectiveEvent::endTime()const { - return data->end; -} -QDate OEffectiveEvent::date()const { - return data->date; -} -int OEffectiveEvent::length()const { - return (data->end.hour() * 60 - data->start.hour() * 60) - + QABS(data->start.minute() - data->end.minute() ); -} -int OEffectiveEvent::size()const { - return ( data->end.hour() - data->start.hour() ) * 3600 - + (data->end.minute() - data->start.minute() * 60 - + data->end.second() - data->start.second() ); -} -QDate OEffectiveEvent::startDate()const { - if ( data->dates ) - return data->startDate; - else if ( data->event.hasRecurrence() ) // single day, since multi-day should have a d pointer - return data->date; - else - return data->event.startDateTime().date(); -} -QDate OEffectiveEvent::endDate()const { - if ( data->dates ) - return data->endDate; - else if ( data->event.hasRecurrence() ) - return data->date; - else - return data->event.endDateTime().date(); -} -void OEffectiveEvent::deref() { - if ( data->deref() ) { - delete data; - data = 0; - } -} -void OEffectiveEvent::changeOrModify() { - if ( data->count != 1 ) { - data->deref(); - Data* d2 = new Data; - d2->event = data->event; - d2->date = data->date; - d2->start = data->start; - d2->end = data->end; - d2->startDate = data->startDate; - d2->endDate = data->endDate; - d2->dates = data->dates; - data = d2; - } -} -bool OEffectiveEvent::operator<( const OEffectiveEvent &e ) const{ - if ( data->date < e.date() ) - return TRUE; - if ( data->date == e.date() ) - return ( startTime() < e.startTime() ); - else - return FALSE; -} -bool OEffectiveEvent::operator<=( const OEffectiveEvent &e ) const{ - return (data->date <= e.date() ); -} -bool OEffectiveEvent::operator==( const OEffectiveEvent &e ) const { - return ( date() == e.date() - && startTime() == e.startTime() - && endTime()== e.endTime() - && event() == e.event() ); -} -bool OEffectiveEvent::operator!=( const OEffectiveEvent &e ) const { - return !(*this == e ); -} -bool OEffectiveEvent::operator>( const OEffectiveEvent &e ) const { - return !(*this <= e ); -} -bool OEffectiveEvent::operator>= ( const OEffectiveEvent &e ) const { - return !(*this < e); -} diff --git a/libopie/pim/oevent.h b/libopie/pim/oevent.h deleted file mode 100644 index 9eb948f..0000000 --- a/libopie/pim/oevent.h +++ b/dev/null @@ -1,236 +0,0 @@ -// CONTAINS GPLed code of TT - -#ifndef OPIE_PIM_EVENT_H -#define OPIE_PIM_EVENT_H - -#include <qstring.h> -#include <qdatetime.h> -#include <qvaluelist.h> - -#include <qpe/recordfields.h> -#include <qpe/palmtopuidgen.h> - -#include "otimezone.h" -#include "opimrecord.h" - -struct OCalendarHelper { - /** calculate the week number of the date */ - static int week( const QDate& ); - /** calculate the occurence of week days since the start of the month */ - static int ocurrence( const QDate& ); - - // returns the dayOfWeek for the *first* day it finds (ignores - // any further days!). Returns 1 (Monday) if there isn't any day found - static int dayOfWeek( char day ); - - /** returns the diff of month */ - static int monthDiff( const QDate& first, const QDate& second ); - -}; - -class OPimNotifyManager; -class ORecur; - -/** - * This is the container for all Events. It encapsules all - * available information for a single Event - * @short container for events. - */ -class OEvent : public OPimRecord { -public: - typedef QValueList<OEvent> ValueList; - /** - * RecordFields contain possible attributes - * used in the Results of toMap().. - */ - enum RecordFields { - FUid = Qtopia::UID_ID, - FCategories = Qtopia::CATEGORY_ID, - FDescription = 0, - FLocation, - FType, - FAlarm, - FSound, - FRType, - FRWeekdays, - FRPosition, - FRFreq, - FRHasEndDate, - FREndDate, - FRCreated, - FRExceptions, - FStart, - FEnd, - FNote, - FTimeZone, - FRecParent, - FRecChildren, - }; - - /** - * Start with an Empty OEvent. UID == 0 means that it is empty - */ - OEvent(int uid = 0); - - /** - * copy c'tor - */ - OEvent( const OEvent& ); - - /** - * Create OEvent, initialized by map - * @see enum RecordFields - */ - OEvent( const QMap<int, QString> map ); - ~OEvent(); - OEvent &operator=( const OEvent& ); - - QString description()const; - void setDescription( const QString& description ); - - QString location()const; - void setLocation( const QString& loc ); - - bool hasNotifiers()const; - OPimNotifyManager ¬ifiers()const; - - ORecur recurrence()const; - void setRecurrence( const ORecur& ); - bool hasRecurrence()const; - - QString note()const; - void setNote( const QString& note ); - - - QDateTime createdDateTime()const; - void setCreatedDateTime( const QDateTime& dt); - - /** set the date to dt. dt is the QDateTime in localtime */ - void setStartDateTime( const QDateTime& ); - /** returns the datetime in the local timeZone */ - QDateTime startDateTime()const; - - /** returns the start datetime in the current zone */ - QDateTime startDateTimeInZone()const; - - /** in current timezone */ - void setEndDateTime( const QDateTime& ); - /** in current timezone */ - QDateTime endDateTime()const; - QDateTime endDateTimeInZone()const; - - bool isMultipleDay()const; - bool isAllDay()const; - void setAllDay( bool isAllDay ); - - /* pin this event to a timezone! FIXME */ - void setTimeZone( const QString& timeZone ); - QString timeZone()const; - - - virtual bool match( const QRegExp& )const; - - /** For exception to recurrence here is a list of children... */ - QArray<int> children()const; - void setChildren( const QArray<int>& ); - void addChild( int uid ); - void removeChild( int uid ); - - /** return the parent OEvent */ - int parent()const; - void setParent( int uid ); - - - /* needed reimp */ - QString toRichText()const; - QString toShortText()const; - QString type()const; - - QMap<int, QString> toMap()const; - void fromMap( const QMap<int, QString>& map ); - QString recordField(int )const; - - static int rtti(); - - bool loadFromStream( QDataStream& ); - bool saveToStream( QDataStream& )const; - -/* bool operator==( const OEvent& ); - bool operator!=( const OEvent& ); - bool operator<( const OEvent& ); - bool operator<=( const OEvent& ); - bool operator>( const OEvent& ); - bool operator>=(const OEvent& ); -*/ -private: - inline void changeOrModify(); - void deref(); - struct Data; - Data* data; - class Private; - Private* priv; - -}; - -/** - * AN Event can span through multiple days. We split up a multiday eve - */ -class OEffectiveEvent { -public: - typedef QValueList<OEffectiveEvent> ValueList; - enum Position { MidWay, Start, End, StartEnd }; - // If we calculate the effective event of a multi-day event - // we have to figure out whether we are at the first day, - // at the end, or anywhere else ("middle"). This is important - // for the start/end times (00:00/23:59) - // MidWay: 00:00 -> 23:59, as we are "in the middle" of a multi- - // day event - // Start: start time -> 23:59 - // End: 00:00 -> end time - // Start | End == StartEnd: for single-day events (default) - // here we draw start time -> end time - OEffectiveEvent(); - OEffectiveEvent( const OEvent& event, const QDate& startDate, Position pos = StartEnd ); - OEffectiveEvent( const OEffectiveEvent& ); - OEffectiveEvent &operator=(const OEffectiveEvent& ); - ~OEffectiveEvent(); - - void setStartTime( const QTime& ); - void setEndTime( const QTime& ); - void setEvent( const OEvent& ); - void setDate( const QDate& ); - - void setEffectiveDates( const QDate& from, const QDate& to ); - - QString description()const; - QString location()const; - QString note()const; - OEvent event()const; - QTime startTime()const; - QTime endTime()const; - QDate date()const; - - /* return the length in hours */ - int length()const; - int size()const; - - QDate startDate()const; - QDate endDate()const; - - bool operator<( const OEffectiveEvent &e ) const; - bool operator<=( const OEffectiveEvent &e ) const; - bool operator==( const OEffectiveEvent &e ) const; - bool operator!=( const OEffectiveEvent &e ) const; - bool operator>( const OEffectiveEvent &e ) const; - bool operator>= ( const OEffectiveEvent &e ) const; - -private: - void deref(); - inline void changeOrModify(); - class Private; - Private* priv; - struct Data; - Data* data; - -}; -#endif diff --git a/libopie/pim/opimaccessbackend.h b/libopie/pim/opimaccessbackend.h deleted file mode 100644 index fd264fc..0000000 --- a/libopie/pim/opimaccessbackend.h +++ b/dev/null @@ -1,160 +0,0 @@ -#ifndef OPIE_PIM_ACCESS_BACKEND -#define OPIE_PIM_ACCESS_BACKEND - -#include <qarray.h> -#include <qdatetime.h> - -#include <opie/otemplatebase.h> -#include <opie/opimrecord.h> - - -class OPimAccessBackendPrivate; -/** - * OPimAccessBackend is the base class - * for all private backends - * it operates on OPimRecord as the base class - * and it's responsible for fast manipulating - * the resource the implementation takes care - * of - */ -template <class T = OPimRecord> -class OPimAccessBackend { -public: - typedef OTemplateBase<T> Frontend; - - /** The access hint from the frontend */ - OPimAccessBackend(int access = 0); - virtual ~OPimAccessBackend(); - - /** - * load the resource - */ - virtual bool load() = 0; - - /** - * reload the resource - */ - virtual bool reload() = 0; - - /** - * save the resource and - * all it's changes - */ - virtual bool save() = 0; - - /** - * return an array of - * all available uids - */ - virtual QArray<int> allRecords()const = 0; - - /** - * return a List of records - * that match the regex - */ - virtual QArray<int> matchRegexp(const QRegExp &r) const = 0; - - /** - * queryByExample for T with the given Settings - * - */ - virtual QArray<int> queryByExample( const T& t, int settings, const QDateTime& d = QDateTime() ) = 0; - - /** - * find the OPimRecord with uid @param uid - * returns T and T.isEmpty() if nothing was found - */ - virtual T find(int uid )const = 0; - - virtual T find(int uid, const QArray<int>& items, - uint current, typename Frontend::CacheDirection )const ; - /** - * clear the back end - */ - virtual void clear() = 0; - - /** - * add T - */ - virtual bool add( const T& t ) = 0; - - /** - * remove - */ - virtual bool remove( int uid ) = 0; - - /** - * replace a record with T.uid() - */ - virtual bool replace( const T& t ) = 0; - - /* - * setTheFrontEnd!!! - */ - void setFrontend( Frontend* front ); - - /** - * set the read ahead count - */ - void setReadAhead( uint count ); -protected: - int access()const; - void cache( const T& t )const; - - /** - * use a prime number here! - */ - void setSaneCacheSize( int ); - - uint readAhead()const; - -private: - OPimAccessBackendPrivate *d; - Frontend* m_front; - uint m_read; - int m_acc; - -}; - -template <class T> -OPimAccessBackend<T>::OPimAccessBackend(int acc) - : m_acc( acc ) -{ - m_front = 0l; -} -template <class T> -OPimAccessBackend<T>::~OPimAccessBackend() { - -} -template <class T> -void OPimAccessBackend<T>::setFrontend( Frontend* fr ) { - m_front = fr; -} -template <class T> -void OPimAccessBackend<T>::cache( const T& t )const { - if (m_front ) - m_front->cache( t ); -} -template <class T> -void OPimAccessBackend<T>::setSaneCacheSize( int size) { - if (m_front ) - m_front->setSaneCacheSize( size ); -} -template <class T> -T OPimAccessBackend<T>::find( int uid, const QArray<int>&, - uint, typename Frontend::CacheDirection )const { - return find( uid ); -} -template <class T> -void OPimAccessBackend<T>::setReadAhead( uint count ) { - m_read = count; -} -template <class T> -uint OPimAccessBackend<T>::readAhead()const { - return m_read; -} -template <class T> -int OPimAccessBackend<T>::access()const { - return m_acc; -} -#endif diff --git a/libopie/pim/opimaccesstemplate.h b/libopie/pim/opimaccesstemplate.h deleted file mode 100644 index ecbeb68..0000000 --- a/libopie/pim/opimaccesstemplate.h +++ b/dev/null @@ -1,302 +0,0 @@ -#ifndef OPIE_PIM_ACCESS_TEMPLATE_H -#define OPIE_PIM_ACCESS_TEMPLATE_H - -#include <qarray.h> - -#include <opie/opimrecord.h> -#include <opie/opimaccessbackend.h> -#include <opie/orecordlist.h> - -#include "opimcache.h" -#include "otemplatebase.h" - -class OPimAccessTemplatePrivate; -/** - * Thats the frontend to our OPIE PIM - * Library. Either you want to use it's - * interface or you want to implement - * your own Access lib - * Just create a OPimRecord and inherit from - * the plugins - */ - -template <class T = OPimRecord > -class OPimAccessTemplate : public OTemplateBase<T> { -public: - enum Access { - Random = 0, - SortedAccess - }; - typedef ORecordList<T> List; - typedef OPimAccessBackend<T> BackEnd; - typedef OPimCache<T> Cache; - - /** - * c'tor BackEnd - * enum Access a small hint on how to handle the backend - */ - OPimAccessTemplate( BackEnd* end); - - virtual ~OPimAccessTemplate(); - - /** - * load from the backend - */ - bool load(); - - /** Reload database. - * You should execute this function if the external database - * was changed. - * This function will load the external database and afterwards - * rejoin the local changes. Therefore the local database will be set consistent. - */ - virtual bool reload(); - - /** Save contacts database. - * Save is more a "commit". After calling this function, all changes are public available. - * @return true if successful - */ - bool save(); - - /** - * if the resource was changed externally - * You should use the signal handling instead of polling possible changes ! - * zecke: Do you implement a signal for otodoaccess ? - */ - bool wasChangedExternally()const; - - /** - * return a List of records - * you can iterate over them - */ - virtual List allRecords()const; - - /** - * return a List of records - * that match the regex - */ - virtual List matchRegexp( const QRegExp &r ) const; - - /** - * queryByExample. - * @see otodoaccess, ocontactaccess - */ - virtual List queryByExample( const T& t, int querySettings, const QDateTime& d = QDateTime() ); - - /** - * find the OPimRecord uid - */ - virtual T find( int uid )const; - - /** - * read ahead cache find method ;) - */ - virtual T find( int uid, const QArray<int>&, - uint current, typename OTemplateBase<T>::CacheDirection dir = OTemplateBase<T>::Forward )const; - - /* invalidate cache here */ - /** - * clears the backend and invalidates the backend - */ - void clear() ; - - /** - * add T to the backend - * @param t The item to add. - * @return <i>true</i> if added successfully. - */ - virtual bool add( const T& t ) ; - bool add( const OPimRecord& ); - - /* only the uid matters */ - /** - * remove T from the backend - * @param t The item to remove - * @return <i>true</i> if successful. - */ - virtual bool remove( const T& t ); - - /** - * remove the OPimRecord with uid - * @param uid The ID of the item to remove - * @return <i>true</i> if successful. - */ - bool remove( int uid ); - bool remove( const OPimRecord& ); - - /** - * replace T from backend - * @param t The item to replace - * @return <i>true</i> if successful. - */ - virtual bool replace( const T& t) ; - - void setReadAhead( uint count ); - /** - * @internal - */ - void cache( const T& )const; - void setSaneCacheSize( int ); - - QArray<int> records()const; -protected: - /** - * invalidate the cache - */ - void invalidateCache(); - - void setBackEnd( BackEnd* end ); - /** - * returns the backend - */ - BackEnd* backEnd(); - BackEnd* m_backEnd; - Cache m_cache; - -private: - OPimAccessTemplatePrivate *d; - -}; - -template <class T> -OPimAccessTemplate<T>::OPimAccessTemplate( BackEnd* end ) - : OTemplateBase<T>(), m_backEnd( end ) -{ - if (end ) - end->setFrontend( this ); -} -template <class T> -OPimAccessTemplate<T>::~OPimAccessTemplate() { - qWarning("~OPimAccessTemplate<T>"); - delete m_backEnd; -} -template <class T> -bool OPimAccessTemplate<T>::load() { - invalidateCache(); - return m_backEnd->load(); -} -template <class T> -bool OPimAccessTemplate<T>::reload() { - invalidateCache(); // zecke: I think this should be added (se) - return m_backEnd->reload(); -} -template <class T> -bool OPimAccessTemplate<T>::save() { - return m_backEnd->save(); -} -template <class T> -typename OPimAccessTemplate<T>::List OPimAccessTemplate<T>::allRecords()const { - QArray<int> ints = m_backEnd->allRecords(); - List lis(ints, this ); - return lis; -} -template <class T> -typename OPimAccessTemplate<T>::List OPimAccessTemplate<T>::matchRegexp( const QRegExp &r )const { - QArray<int> ints = m_backEnd->matchRegexp( r ); - List lis(ints, this ); - return lis; -} -template <class T> -QArray<int> OPimAccessTemplate<T>::records()const { - return m_backEnd->allRecords(); -} -template <class T> -typename OPimAccessTemplate<T>::List -OPimAccessTemplate<T>::queryByExample( const T& t, int settings, const QDateTime& d ) { - QArray<int> ints = m_backEnd->queryByExample( t, settings, d ); - - List lis(ints, this ); - return lis; -} -template <class T> -T OPimAccessTemplate<T>::find( int uid ) const{ - T t = m_backEnd->find( uid ); - cache( t ); - return t; -} -template <class T> -T OPimAccessTemplate<T>::find( int uid, const QArray<int>& ar, - uint current, typename OTemplateBase<T>::CacheDirection dir )const { - /* - * better do T.isEmpty() - * after a find this way we would - * avoid two finds in QCache... - */ - // qWarning("find it now %d", uid ); - if (m_cache.contains( uid ) ) { - return m_cache.find( uid ); - } - - T t = m_backEnd->find( uid, ar, current, dir ); - cache( t ); - return t; -} -template <class T> -void OPimAccessTemplate<T>::clear() { - invalidateCache(); - m_backEnd->clear(); -} -template <class T> -bool OPimAccessTemplate<T>::add( const T& t ) { - cache( t ); - return m_backEnd->add( t ); -} -template <class T> -bool OPimAccessTemplate<T>::add( const OPimRecord& rec) { - /* same type */ - if ( rec.rtti() == T::rtti() ) { - const T &t = static_cast<const T&>(rec); - return add(t); - } - return false; -} -template <class T> -bool OPimAccessTemplate<T>::remove( const T& t ) { - return remove( t.uid() ); -} -template <class T> -bool OPimAccessTemplate<T>::remove( int uid ) { - m_cache.remove( uid ); - return m_backEnd->remove( uid ); -} -template <class T> -bool OPimAccessTemplate<T>::remove( const OPimRecord& rec) { - return remove( rec.uid() ); -} -template <class T> -bool OPimAccessTemplate<T>::replace( const T& t ) { - m_cache.replace( t ); - return m_backEnd->replace( t ); -} -template <class T> -void OPimAccessTemplate<T>::invalidateCache() { - m_cache.invalidate(); -} -template <class T> -typename OPimAccessTemplate<T>::BackEnd* OPimAccessTemplate<T>::backEnd() { - return m_backEnd; -} -template <class T> -bool OPimAccessTemplate<T>::wasChangedExternally()const { - return false; -} -template <class T> -void OPimAccessTemplate<T>::setBackEnd( BackEnd* end ) { - m_backEnd = end; - if (m_backEnd ) - m_backEnd->setFrontend( this ); -} -template <class T> -void OPimAccessTemplate<T>::cache( const T& t ) const{ - /* hacky we need to work around the const*/ - ((OPimAccessTemplate<T>*)this)->m_cache.add( t ); -} -template <class T> -void OPimAccessTemplate<T>::setSaneCacheSize( int size ) { - m_cache.setSize( size ); -} -template <class T> -void OPimAccessTemplate<T>::setReadAhead( uint count ) { - m_backEnd->setReadAhead( count ); -} -#endif diff --git a/libopie/pim/opimcache.h b/libopie/pim/opimcache.h deleted file mode 100644 index 7f7cff5..0000000 --- a/libopie/pim/opimcache.h +++ b/dev/null @@ -1,131 +0,0 @@ -#ifndef OPIE_PIM_CACHE_H -#define OPIE_PIM_CACHE_H - -#include <qintcache.h> - -#include "opimrecord.h" - -class OPimCacheItemPrivate; - -template <class T = OPimRecord> -class OPimCacheItem { -public: - OPimCacheItem( const T& t = T() ); - OPimCacheItem( const OPimCacheItem& ); - ~OPimCacheItem(); - - OPimCacheItem &operator=( const OPimCacheItem& ); - - T record()const; - void setRecord( const T& ); -private: - T m_t; - OPimCacheItemPrivate *d; -}; - - -class OPimCachePrivate; -/** - * OPimCache for caching the items - * We support adding, removing - * and finding - */ -template <class T = OPimRecord> -class OPimCache { -public: - typedef OPimCacheItem<T> Item; - OPimCache(); - OPimCache( const OPimCache& ); - ~OPimCache(); - - OPimCache &operator=( const OPimCache& ); - - bool contains(int uid)const; - void invalidate(); - void setSize( int size ); - - T find(int uid )const; - void add( const T& ); - void remove( int uid ); - void replace( const T& ); - -private: - QIntCache<Item> m_cache; - OPimCachePrivate* d; -}; - -// Implementation -template <class T> -OPimCacheItem<T>::OPimCacheItem( const T& t ) - : m_t(t) { -} -template <class T> -OPimCacheItem<T>::~OPimCacheItem() { - -} -template <class T> -T OPimCacheItem<T>::record()const { - return m_t; -} -template <class T> -void OPimCacheItem<T>::setRecord( const T& t ) { - m_t = t; -} -// Cache -template <class T> -OPimCache<T>::OPimCache() - : m_cache(100, 53 ) -{ - m_cache.setAutoDelete( TRUE ); -} -template <class T> -OPimCache<T>::~OPimCache() { - -} -template <class T> -bool OPimCache<T>::contains(int uid )const { - Item* it = m_cache.find( uid, FALSE ); - if (!it) - return false; - return true; -} -template <class T> -void OPimCache<T>::invalidate() { - m_cache.clear(); -} -template <class T> -void OPimCache<T>::setSize( int size ) { - m_cache.setMaxCost( size ); -} -template <class T> -T OPimCache<T>::find(int uid )const { - Item *it = m_cache.find( uid ); - if (it) - return it->record(); - return T(); -} -template <class T> -void OPimCache<T>::add( const T& t ) { - Item* it = 0l; - it = m_cache.find(t.uid(), FALSE ); - - if (it ) - it->setRecord( t ); - - it = new Item( t ); - if (!m_cache.insert( t.uid(), it ) ) - delete it; -} -template <class T> -void OPimCache<T>::remove( int uid ) { - m_cache.remove( uid ); -} -template <class T> -void OPimCache<T>::replace( const T& t) { - Item *it = m_cache.find( t.uid() ); - if ( it ) { - it->setRecord( t ); - } -} - -#endif diff --git a/libopie/pim/opimmaintainer.cpp b/libopie/pim/opimmaintainer.cpp deleted file mode 100644 index 92cb25a..0000000 --- a/libopie/pim/opimmaintainer.cpp +++ b/dev/null @@ -1,37 +0,0 @@ -#include "opimmaintainer.h" - -OPimMaintainer::OPimMaintainer( int mode, int uid ) - : m_mode(mode), m_uid(uid ) -{} -OPimMaintainer::~OPimMaintainer() { -} -OPimMaintainer::OPimMaintainer( const OPimMaintainer& main ) { - *this = main; -} -OPimMaintainer &OPimMaintainer::operator=( const OPimMaintainer& main ) { - m_mode = main.m_mode; - m_uid = main.m_uid; - - return *this; -} -bool OPimMaintainer::operator==( const OPimMaintainer& main ) { - if (m_mode != main.m_mode ) return false; - if (m_uid != main.m_uid ) return false; - - return true; -} -bool OPimMaintainer::operator!=( const OPimMaintainer& main ) { - return !(*this == main ); -} -int OPimMaintainer::mode()const { - return m_mode; -} -int OPimMaintainer::uid()const { - return m_uid; -} -void OPimMaintainer::setMode( int mo) { - m_mode = mo; -} -void OPimMaintainer::setUid( int uid ) { - m_uid = uid; -} diff --git a/libopie/pim/opimmaintainer.h b/libopie/pim/opimmaintainer.h deleted file mode 100644 index 793d066..0000000 --- a/libopie/pim/opimmaintainer.h +++ b/dev/null @@ -1,40 +0,0 @@ -#ifndef OPIE_PIM_MAINTAINER_H -#define OPIE_PIM_MAINTAINER_H - -#include <qstring.h> - -/** - * Who maintains what? - */ -class OPimMaintainer { -public: - enum Mode { Undefined = -1, - Nothing = 0, - Responsible, - DoneBy, - Coordinating, - }; - OPimMaintainer( int mode = Undefined, int uid = 0); - OPimMaintainer( const OPimMaintainer& ); - ~OPimMaintainer(); - - OPimMaintainer &operator=( const OPimMaintainer& ); - bool operator==( const OPimMaintainer& ); - bool operator!=( const OPimMaintainer& ); - - - int mode()const; - int uid()const; - - void setMode( int mode ); - void setUid( int uid ); - -private: - int m_mode; - int m_uid; - class Private; - Private *d; - -}; - -#endif diff --git a/libopie/pim/opimmainwindow.cpp b/libopie/pim/opimmainwindow.cpp deleted file mode 100644 index 99a0333..0000000 --- a/libopie/pim/opimmainwindow.cpp +++ b/dev/null @@ -1,150 +0,0 @@ -#include <qapplication.h> -#include <qdatetime.h> -#include <qcopchannel_qws.h> - -#include <qpe/sound.h> -#include <qpe/qcopenvelope_qws.h> -#include <qpe/qpeapplication.h> - -#include "opimresolver.h" -#include "opimmainwindow.h" - -OPimMainWindow::OPimMainWindow( const QString& service, QWidget* parent, - const char* name, WFlags flag ) - : QMainWindow( parent, name, flag ), m_rtti(-1), m_service( service ), m_fallBack(0l) { - - /* - * let's generate our QCopChannel - */ - m_str = QString("QPE/"+m_service).local8Bit(); - m_channel= new QCopChannel(m_str, this ); - connect(m_channel, SIGNAL(received(const QCString&,const QByteArray&) ), - this, SLOT( appMessage(const QCString&,const QByteArray&) ) ); - connect(qApp, SIGNAL(appMessage(const QCString&,const QByteArray&) ), - this, SLOT( appMessage(const QCString&,const QByteArray&) ) ); - - /* connect flush and reload */ - connect(qApp, SIGNAL(flush() ), - this, SLOT(flush() ) ); - connect(qApp, SIGNAL(reload() ), - this, SLOT(reload() ) ); -} -OPimMainWindow::~OPimMainWindow() { - delete m_channel; -} -QCopChannel* OPimMainWindow::channel() { - return m_channel; -} -void OPimMainWindow::doSetDocument( const QString& ) { - -} -void OPimMainWindow::appMessage( const QCString& cmd, const QByteArray& array ) { - bool needShow = false; - /* - * create demands to create - * a new record... - */ - QDataStream stream(array, IO_ReadOnly); - if ( cmd == "create()" ) { - raise(); - int uid = create(); - QCopEnvelope e(m_str, "created(int)" ); - e << uid; - needShow = true; - }else if ( cmd == "remove(int)" ) { - int uid; - stream >> uid; - bool rem = remove( uid ); - QCopEnvelope e(m_str, "removed(bool)" ); - e << rem; - needShow = true; - }else if ( cmd == "beam(int)" ) { - int uid; - stream >> uid; - beam( uid); - }else if ( cmd == "show(int)" ) { - raise(); - int uid; - stream >> uid; - show( uid ); - needShow = true; - }else if ( cmd == "edit(int)" ) { - raise(); - int uid; - stream >> uid; - edit( uid ); - }else if ( cmd == "add(int,QByteArray)" ) { - int rtti; - QByteArray array; - stream >> rtti; - stream >> array; - m_fallBack = record(rtti, array ); - if (!m_fallBack) return; - add( *m_fallBack ); - delete m_fallBack; - }else if ( cmd == "alarm(QDateTime,int)" ) { - raise(); - QDateTime dt; int uid; - stream >> dt; - stream >> uid; - qWarning(" Date: %s Uid: %d", dt.toString().latin1(), uid ); - QDateTime current = QDateTime::currentDateTime(); - if ( current.time().hour() != dt.time().hour() && current.time().minute() != dt.time().minute() ) - return; - doAlarm( dt, uid ); - needShow = true; - } - - if (needShow ) - QPEApplication::setKeepRunning(); -} -/* implement the url scripting here */ -void OPimMainWindow::setDocument( const QString& str) { - doSetDocument( str ); -} -/* - * we now try to get the array demarshalled - * check if the rtti matches this one - */ -OPimRecord* OPimMainWindow::record( int rtti, const QByteArray& array ) { - if ( service() != rtti ) - return 0l; - - OPimRecord* record = OPimResolver::self()->record( rtti ); - QDataStream str(array, IO_ReadOnly ); - if ( !record || !record->loadFromStream(str) ) { - delete record; - record = 0l; - } - - return record; -} -/* - * get the rtti for the service - */ -int OPimMainWindow::service() { - if ( m_rtti == -1 ) - m_rtti = OPimResolver::self()->serviceId( m_service ); - - return m_rtti; -} -void OPimMainWindow::doAlarm( const QDateTime&, int ) { - -} -void OPimMainWindow::startAlarm(int count ) { - m_alarmCount = count; - m_playedCount = 0; - Sound::soundAlarm(); - m_timerId = startTimer( 5000 ); -} -void OPimMainWindow::killAlarm() { - killTimer( m_timerId ); -} -void OPimMainWindow::timerEvent( QTimerEvent* e) { - if ( m_playedCount <m_alarmCount ) { - m_playedCount++; - Sound::soundAlarm(); - }else { - killTimer( e->timerId() ); - } -} diff --git a/libopie/pim/opimmainwindow.h b/libopie/pim/opimmainwindow.h deleted file mode 100644 index 855d364..0000000 --- a/libopie/pim/opimmainwindow.h +++ b/dev/null @@ -1,99 +0,0 @@ -#ifndef OPIE_PIM_MAINWINDOW_H -#define OPIE_PIM_MAINWINDOW_H - -#include <qmainwindow.h> - -#include <opie/opimrecord.h> - -/** - * This is a common Opie PIM MainWindow - * it takes care of the QCOP internals - * and implements some functions - * for the URL scripting schema - */ -/* - * due Qt and Templates with signal and slots - * do not work that good :( - * (Ok how to moc a template ;) ) - * We will have the mainwindow which calls a struct which - * is normally reimplemented as a template ;) - */ - -class QCopChannel; -class QDateTime; -class OPimMainWindow : public QMainWindow { - Q_OBJECT -public: - enum TransPort { BlueTooth=0, - IrDa }; - - OPimMainWindow( const QString& service, QWidget *parent = 0, const char* name = 0, - WFlags f = WType_TopLevel); - virtual ~OPimMainWindow(); - - -protected slots: - /* - * called when a setDocument - * couldn't be handled by this window - */ - virtual void doSetDocument( const QString& ); - /* for syncing */ - virtual void flush() = 0; - virtual void reload() = 0; - - /** create a new Records and return the uid */ - virtual int create() = 0; - /** remove a record with UID == uid */ - virtual bool remove( int uid ) = 0; - /** beam the record with UID = uid */ - virtual void beam( int uid ) = 0; - - /** show the record with UID == uid */ - virtual void show( int uid ) = 0; - /** edit the record */ - virtual void edit( int uid ) = 0; - - /** make a copy of it! */ - virtual void add( const OPimRecord& ) = 0; - - virtual void doAlarm( const QDateTime&, int uid ); - - QCopChannel* channel(); - -protected: - /** - * start to play soundAlarm() - * @param count How many times the alarm is played - */ - void startAlarm(int count = 10); - void killAlarm(); - void timerEvent( QTimerEvent* ); - -private slots: - void appMessage( const QCString&, const QByteArray& ); - void setDocument( const QString& ); - - -private: - class Private; - Private* d; - - int m_rtti; - QCopChannel* m_channel; - QString m_service; - QCString m_str; - OPimRecord* m_fallBack; - int m_alarmCount; - int m_playedCount; - int m_timerId; - /* I would love to do this as a template - * but can't think of a right way - * because I need signal and slots -zecke - */ - virtual OPimRecord* record( int rtti, const QByteArray& ) ; - int service(); -}; - - -#endif diff --git a/libopie/pim/opimnotify.cpp b/libopie/pim/opimnotify.cpp deleted file mode 100644 index af5514b..0000000 --- a/libopie/pim/opimnotify.cpp +++ b/dev/null @@ -1,227 +0,0 @@ -#include <qshared.h> - -#include "opimnotify.h" - -struct OPimNotify::Data : public QShared { - Data() : QShared(),dur(-1),parent(0) { - - } - QDateTime start; - int dur; - QString application; - int parent; -}; - -OPimNotify::OPimNotify( const QDateTime& start, int duration, int parent ) { - data = new Data; - data->start = start; - data->dur = duration; - data->parent = parent; -} -OPimNotify::OPimNotify( const OPimNotify& noti) - : data( noti.data ) -{ - data->ref(); -} -OPimNotify::~OPimNotify() { - if ( data->deref() ) { - delete data; - data = 0l; - } -} - -OPimNotify &OPimNotify::operator=( const OPimNotify& noti) { - noti.data->ref(); - deref(); - data = noti.data; - - return *this; -} -bool OPimNotify::operator==( const OPimNotify& noti ) { - if ( data == noti.data ) return true; - if ( data->dur != noti.data->dur ) return false; - if ( data->parent != noti.data->parent ) return false; - if ( data->application != noti.data->application ) return false; - if ( data->start != noti.data->start ) return false; - - return true; -} -QDateTime OPimNotify::dateTime()const { - return data->start; -} -QString OPimNotify::service()const { - return data->application; -} -int OPimNotify::parent()const { - return data->parent; -} -int OPimNotify::duration()const { - return data->dur; -} -QDateTime OPimNotify::endTime()const { - return QDateTime( data->start.date(), data->start.time().addSecs( data->dur) ); -} -void OPimNotify::setDateTime( const QDateTime& time ) { - copyIntern(); - data->start = time; -} -void OPimNotify::setDuration( int dur ) { - copyIntern(); - data->dur = dur; -} -void OPimNotify::setParent( int uid ) { - copyIntern(); - data->parent = uid; -} -void OPimNotify::setService( const QString& str ) { - copyIntern(); - data->application = str; -} -void OPimNotify::copyIntern() { - if ( data->count != 1 ) { - data->deref(); - Data* dat = new Data; - dat->start = data->start; - dat->dur = data->dur; - dat->application = data->application; - dat->parent = data->parent; - data = dat; - } -} -void OPimNotify::deref() { - if ( data->deref() ) { - delete data; - data = 0; - } -} - -/***********************************************************/ -struct OPimAlarm::Data : public QShared { - Data() : QShared() { - sound = 1; - } - int sound; - QString file; -}; -OPimAlarm::OPimAlarm( int sound, const QDateTime& start, int duration, int parent ) - : OPimNotify( start, duration, parent ) -{ - data = new Data; - data->sound = sound; -} -OPimAlarm::OPimAlarm( const OPimAlarm& al) - : OPimNotify(al), data( al.data ) -{ - data->ref(); -} -OPimAlarm::~OPimAlarm() { - if ( data->deref() ) { - delete data; - data = 0l; - } -} -OPimAlarm &OPimAlarm::operator=( const OPimAlarm& al) -{ - OPimNotify::operator=( al ); - deref(); - al.data->ref(); - - data = al.data; - - - return *this; -} -bool OPimAlarm::operator==( const OPimAlarm& al) { - if ( data->sound != al.data->sound ) return false; - else if ( data->sound == Custom && data->file != al.data->file ) - return false; - - return OPimNotify::operator==( al ); -} -QString OPimAlarm::type()const { - return QString::fromLatin1("OPimAlarm"); -} -int OPimAlarm::sound()const { - return data->sound; -} -QString OPimAlarm::file()const { - return data->file; -} -void OPimAlarm::setSound( int snd) { - copyIntern(); - data->sound = snd; -} -void OPimAlarm::setFile( const QString& sound ) { - copyIntern(); - data->file = sound; -} -void OPimAlarm::deref() { - if ( data->deref() ) { - delete data; - data = 0l; - } -} -void OPimAlarm::copyIntern() { - if ( data->count != 1 ) { - data->deref(); - Data *newDat = new Data; - newDat->sound = data->sound; - newDat->file = data->file; - data = newDat; - } -} -/************************/ -struct OPimReminder::Data : public QShared { - Data() : QShared(), record( 0) { - } - int record; - -}; -OPimReminder::OPimReminder( int uid, const QDateTime& start, int dur, int parent ) - : OPimNotify( start, dur, parent ) -{ - data = new Data; - data->record = uid; -} -OPimReminder::OPimReminder( const OPimReminder& rem ) - : OPimNotify( rem ), data( rem.data ) -{ - data->ref(); -} -OPimReminder& OPimReminder::operator=( const OPimReminder& rem) { - OPimNotify::operator=(rem ); - - deref(); - rem.data->ref(); - data = rem.data; - - return *this; -} -bool OPimReminder::operator==( const OPimReminder& rem) { - if ( data->record != rem.data->record ) return false; - - return OPimNotify::operator==( rem ); -} -QString OPimReminder::type()const { - return QString::fromLatin1("OPimReminder"); -} -int OPimReminder::recordUid()const { - return data->record; -} -void OPimReminder::setRecordUid( int uid ) { - copyIntern(); - data->record = uid; -} -void OPimReminder::deref() { - if ( data->deref() ) { - delete data; - data = 0l; - } -} -void OPimReminder::copyIntern() { - if ( data->count != 1 ) { - Data* da = new Data; - da->record = data->record; - data = da; - } -} diff --git a/libopie/pim/opimnotify.h b/libopie/pim/opimnotify.h deleted file mode 100644 index 58417db..0000000 --- a/libopie/pim/opimnotify.h +++ b/dev/null @@ -1,144 +0,0 @@ -#ifndef OPIE_PIM_NOTIFY_H -#define OPIE_PIM_NOTIFY_H - -#include <qdatetime.h> -#include <qvaluelist.h> - -/** - * This is the base class of Notifiers. Possible - * notifiers would be Alarms, Reminders - * What they share is that they have - * A DateTime, Type, Duration - * This is what this base class takes care of - * on top of that it's shared - */ -/* - * TALK to eilers: have a class OPimDuration which sets the Duration - * given on the Due/Start Date? -zecke - * discuss: do we need a uid for the notify? -zecke - */ -class OPimNotify { -public: - typedef QValueList<OPimNotify> ValueList; - OPimNotify( const QDateTime& start = QDateTime(), int duration = 0, int parent = 0 ); - OPimNotify( const OPimNotify& ); - virtual ~OPimNotify(); - - OPimNotify &operator=(const OPimNotify& ); - bool operator==( const OPimNotify& ); - - virtual QString type()const = 0; - - /** start date */ - QDateTime dateTime()const; - QString service()const; - - /** - * RETURN the parent uid - */ - int parent()const; - - /** - * in Seconds - */ - int duration()const; - - /** - * Start Time + Duration - */ - QDateTime endTime()const; - - void setDateTime( const QDateTime& ); - void setDuration( int dur ); - void setParent(int uid ); - void setService( const QString& ); - - -private: - inline void copyIntern(); - void deref(); - struct Data; - Data* data; - - /* d-pointer */ - class NotifyPrivate; - NotifyPrivate* d; - -}; -/** - * An alarm is a sound/mail/buzzer played/send - * at a given time to inform about - * an Event - */ -class OPimAlarm : public OPimNotify { -public: - enum Sound{Loud=1, Silent=0, Custom=2 }; - OPimAlarm( int sound = Silent, const QDateTime& start = QDateTime(), int duration = 0, int parent = 0 ); - OPimAlarm( const OPimAlarm& ); - ~OPimAlarm(); - - OPimAlarm &operator=( const OPimAlarm& ); - bool operator==( const OPimAlarm& ); - QString type()const; - - int sound()const; - QString file()const; - - void setSound( int ); - /* only when sound is custom... */ - void setFile( const QString& sound ); - -private: - void deref(); - void copyIntern(); - struct Data; - Data * data; - - class Private; - Private* d; - -}; - -/** - * A Reminder will be put into the - * datebook - * Note that the returned dateTime() may be not valid. - * In these cases one must resolve the uid and get the OEvent - */ -class OPimReminder : public OPimNotify { -public: - - /** - * c'tor of a reminder - * @param uid The uid of the Record inside the Datebook - * @param start the StartDate invalid for all day... - * @param duration The duration of the event ( -1 for all day ) - * @param parent The 'parent' record of this reminder - */ - OPimReminder( int uid = 0, const QDateTime& start = QDateTime(), - int duration = 0, int parent = 0 ); - OPimReminder( const OPimReminder& ); - OPimReminder &operator=(const OPimReminder& ); - - QString type()const; - - bool operator==( const OPimReminder& ); - - /** - * the uid of the alarm - * inside the 'datebook' application - */ - int recordUid()const; - void setRecordUid( int uid ); - -private: - void deref(); - void copyIntern(); - - struct Data; - Data* data; - class Private; - Private *d; -}; - -#endif diff --git a/libopie/pim/opimnotifymanager.cpp b/libopie/pim/opimnotifymanager.cpp deleted file mode 100644 index d6f0ead..0000000 --- a/libopie/pim/opimnotifymanager.cpp +++ b/dev/null @@ -1,162 +0,0 @@ -#include "opimnotifymanager.h" - -#include "oconversion.h" - -#include <qstringlist.h> - -OPimNotifyManager::OPimNotifyManager( const Reminders& rem, const Alarms& al) - : m_rem( rem ), m_al( al ) -{} -OPimNotifyManager::~OPimNotifyManager() { -} -/* use static_cast and type instead of dynamic... */ -void OPimNotifyManager::add( const OPimNotify& noti) { - if ( noti.type() == QString::fromLatin1("OPimReminder") ) { - const OPimReminder& rem = static_cast<const OPimReminder&>(noti); - m_rem.append( rem ); - }else if ( noti.type() == QString::fromLatin1("OPimAlarm") ) { - const OPimAlarm& al = static_cast<const OPimAlarm&>(noti); - m_al.append( al ); - } -} -void OPimNotifyManager::remove( const OPimNotify& noti) { - if ( noti.type() == QString::fromLatin1("OPimReminder") ) { - const OPimReminder& rem = static_cast<const OPimReminder&>(noti); - m_rem.remove( rem ); - }else if ( noti.type() == QString::fromLatin1("OPimAlarm") ) { - const OPimAlarm& al = static_cast<const OPimAlarm&>(noti); - m_al.remove( al ); - } -} -void OPimNotifyManager::replace( const OPimNotify& noti) { - if ( noti.type() == QString::fromLatin1("OPimReminder") ) { - const OPimReminder& rem = static_cast<const OPimReminder&>(noti); - m_rem.remove( rem ); - m_rem.append( rem ); - }else if ( noti.type() == QString::fromLatin1("OPimAlarm") ) { - const OPimAlarm& al = static_cast<const OPimAlarm&>(noti); - m_al.remove( al ); - m_al.append( al ); - } -} -OPimNotifyManager::Reminders OPimNotifyManager::reminders()const { - return m_rem; -} -OPimNotifyManager::Alarms OPimNotifyManager::alarms()const { - return m_al; -} -OPimAlarm OPimNotifyManager::alarmAtDateTime( const QDateTime& when, bool& found ) const { - Alarms::ConstIterator it; - found = true; - - for ( it = m_al.begin(); it != m_al.end(); ++it ){ - if ( (*it).dateTime() == when ) - return (*it); - } - - // Fall through if nothing could be found - found = false; - OPimAlarm empty; - return empty; -} - - -void OPimNotifyManager::setAlarms( const Alarms& al) { - m_al = al; -} -void OPimNotifyManager::setReminders( const Reminders& rem) { - m_rem = rem; -} -/* FIXME!!! */ -/** - * The idea is to check if the provider for our service - * is online - * if it is we will use QCOP - * if not the Factory to get the backend... - * Qtopia1.6 services would be kewl to have here.... - */ -void OPimNotifyManager::registerNotify( const OPimNotify& ) { - -} -/* FIXME!!! */ -/** - * same as above... - * Also implement Url model - * have a MainWindow.... - */ -void OPimNotifyManager::deregister( const OPimNotify& ) { - -} - -bool OPimNotifyManager::isEmpty()const { - qWarning("is Empty called on OPimNotifyManager %d %d", m_rem.count(), m_al.count() ); - if ( m_rem.isEmpty() && m_al.isEmpty() ) return true; - else return false; -} - -// Taken from otodoaccessxml.. -QString OPimNotifyManager::alarmsToString() const -{ - QString str; - - OPimNotifyManager::Alarms alarms = m_al; - if ( !alarms.isEmpty() ) { - QStringList als; - OPimNotifyManager::Alarms::Iterator it = alarms.begin(); - for ( ; it != alarms.end(); ++it ) { - /* only if time is valid */ - if ( (*it).dateTime().isValid() ) { - als << OConversion::dateTimeToString( (*it).dateTime() ) - + ":" + QString::number( (*it).duration() ) - + ":" + QString::number( (*it).sound() ) - + ":"; - } - } - // now write the list - qWarning("als: %s", als.join("____________").latin1() ); - str = als.join(";"); - } - - return str; -} -QString OPimNotifyManager::remindersToString() const -{ - QString str; - - OPimNotifyManager::Reminders reminders = m_rem; - if (!reminders.isEmpty() ) { - OPimNotifyManager::Reminders::Iterator it = reminders.begin(); - QStringList records; - for ( ; it != reminders.end(); ++it ) { - records << QString::number( (*it).recordUid() ); - } - str = records.join(";"); - } - - return str; -} - -void OPimNotifyManager::alarmsFromString( const QString& str ) -{ - QStringList als = QStringList::split(";", str ); - for (QStringList::Iterator it = als.begin(); it != als.end(); ++it ) { - QStringList alarm = QStringList::split(":", (*it), TRUE ); // allow empty - qWarning("alarm: %s", alarm.join("___").latin1() ); - qWarning("alarm[0]: %s %s", alarm[0].latin1(), - OConversion::dateTimeFromString( alarm[0] ).toString().latin1() ); - OPimAlarm al( alarm[2].toInt(), OConversion::dateTimeFromString( alarm[0] ), - alarm[1].toInt() ); - add( al ); - } -} - -void OPimNotifyManager::remindersFromString( const QString& str ) -{ - - QStringList rems = QStringList::split(";", str ); - for (QStringList::Iterator it = rems.begin(); it != rems.end(); ++it ) { - OPimReminder rem( (*it).toInt() ); - add( rem ); - } - -} diff --git a/libopie/pim/opimnotifymanager.h b/libopie/pim/opimnotifymanager.h deleted file mode 100644 index f3c22f9..0000000 --- a/libopie/pim/opimnotifymanager.h +++ b/dev/null @@ -1,91 +0,0 @@ -#ifndef OPIE_PIM_NOTIFY_MANAGER_H -#define OPIE_PIM_NOTIFY_MANAGER_H - -#include <qvaluelist.h> - -#include <opie/opimnotify.h> - -/** - * The notify manager keeps track of the Notifiers.... - */ -class OPimNotifyManager { -public: - typedef QValueList<OPimReminder> Reminders; - typedef QValueList<OPimAlarm> Alarms; - OPimNotifyManager( const Reminders& rems = Reminders(), const Alarms& alarms = Alarms() ); - ~OPimNotifyManager(); - - /* we will cast it for you ;) */ - void add( const OPimNotify& ); - void remove( const OPimNotify& ); - /* replaces all with this one! */ - void replace( const OPimNotify& ); - - Reminders reminders()const; - - /** - * Return - */ - Alarms alarms()const; - - /** - * Return alarm at DateTime "when". If more than one is registered at this - * DateTime, the first one is returned. - * If none was found, an empty Alarm is returned. - * @param when The date and time of the returned alarm - * @param found Returns true if anything was found. - * @return Returns the found alarm at given DateTime. It is empty if found is false - * (nothing could be found at given date and time) - */ - OPimAlarm alarmAtDateTime( const QDateTime& when, bool& found ) const; - - void setAlarms( const Alarms& ); - void setReminders( const Reminders& ); - - /* register is a Ansi C keyword... */ - /** - * This function will register the Notify to the Alarm Server - * or datebook depending on the type of the notify - */ - void registerNotify( const OPimNotify& ); - - /** - * this will do the opposite.. - */ - void deregister( const OPimNotify& ); - - bool isEmpty()const; - - /** - * Return all alarms as string - */ - QString alarmsToString() const; - /** - * Return all notifiers as string - */ - QString remindersToString() const; - - /** - * Convert string to alarms - * @param str String created by alarmsToString() - */ - void alarmsFromString( const QString& str ); - - /** - * Convert string to reminders - * @param str String created by remindersToString() - */ - void remindersFromString( const QString& str ); - - - -private: - Reminders m_rem; - Alarms m_al; - - class Private; - Private *d; - -}; - -#endif diff --git a/libopie/pim/opimrecord.cpp b/libopie/pim/opimrecord.cpp deleted file mode 100644 index 2365748..0000000 --- a/libopie/pim/opimrecord.cpp +++ b/dev/null @@ -1,182 +0,0 @@ -#include <qarray.h> - -#include <qpe/categories.h> -#include <qpe/categoryselect.h> - -#include "opimrecord.h" - -Qtopia::UidGen OPimRecord::m_uidGen( Qtopia::UidGen::Qtopia ); - - -OPimRecord::OPimRecord( int uid ) - : Qtopia::Record() { - - m_lastHit = -1; - setUid( uid ); -} -OPimRecord::~OPimRecord() { -} -OPimRecord::OPimRecord( const OPimRecord& rec ) - : Qtopia::Record( rec ) -{ - (*this) = rec; -} - -OPimRecord &OPimRecord::operator=( const OPimRecord& rec) { - if ( this == &rec ) return *this; - - Qtopia::Record::operator=( rec ); - m_xrefman = rec.m_xrefman; - m_lastHit = rec.m_lastHit; - - return *this; -} -/* - * category names - */ -QStringList OPimRecord::categoryNames( const QString& appname ) const { - QStringList list; - QArray<int> cats = categories(); - Categories catDB; - catDB.load( categoryFileName() ); - - for (uint i = 0; i < cats.count(); i++ ) { - list << catDB.label( appname, cats[i] ); - } - - return list; -} -void OPimRecord::setCategoryNames( const QStringList& ) { - -} -void OPimRecord::addCategoryName( const QString& ) { - Categories catDB; - catDB.load( categoryFileName() ); - - -} -bool OPimRecord::isEmpty()const { - return ( uid() == 0 ); -} -/*QString OPimRecord::crossToString()const { - QString str; - QMap<QString, QArray<int> >::ConstIterator it; - for (it = m_relations.begin(); it != m_relations.end(); ++it ) { - QArray<int> id = it.data(); - for ( uint i = 0; i < id.size(); ++i ) { - str += it.key() + "," + QString::number( i ) + ";"; - } - } - str = str.remove( str.length()-1, 1); // strip the ; - //qWarning("IDS " + str ); - - return str; - }*/ -/* if uid = 1 assign a new one */ -void OPimRecord::setUid( int uid ) { - if ( uid == 1) - uid = uidGen().generate(); - - Qtopia::Record::setUid( uid ); -}; -Qtopia::UidGen &OPimRecord::uidGen() { - return m_uidGen; -} -OPimXRefManager &OPimRecord::xrefmanager() { - return m_xrefman; -} -int OPimRecord::rtti(){ - return 0; -} - -/** - * now let's put our data into the stream - */ -/* - * First read UID - * Categories - * XRef - */ -bool OPimRecord::loadFromStream( QDataStream& stream ) { - int Int; - uint UInt; - stream >> Int; - setUid(Int); - - /** Categories */ - stream >> UInt; - QArray<int> array(UInt); - for (uint i = 0; i < UInt; i++ ) { - stream >> array[i]; - } - setCategories( array ); - - /* - * now we do the X-Ref stuff - */ - OPimXRef xref; - stream >> UInt; - for ( uint i = 0; i < UInt; i++ ) { - xref.setPartner( OPimXRef::One, partner( stream ) ); - xref.setPartner( OPimXRef::Two, partner( stream ) ); - m_xrefman.add( xref ); - } - - return true; -} -bool OPimRecord::saveToStream( QDataStream& stream )const { - /** UIDs */ - - stream << uid(); - - /** Categories */ - stream << categories().count(); - for ( uint i = 0; i < categories().count(); i++ ) { - stream << categories()[i]; - } - - /* - * first the XRef count - * then the xrefs - */ - stream << m_xrefman.list().count(); - for ( OPimXRef::ValueList::ConstIterator it = m_xrefman.list().begin(); - it != m_xrefman.list().end(); ++it ) { - flush( (*it).partner( OPimXRef::One), stream ); - flush( (*it).partner( OPimXRef::Two), stream ); - } - return true; -} -void OPimRecord::flush( const OPimXRefPartner& par, QDataStream& str ) const{ - str << par.service(); - str << par.uid(); - str << par.field(); -} -OPimXRefPartner OPimRecord::partner( QDataStream& stream ) { - OPimXRefPartner par; - QString str; - int i; - - stream >> str; - par.setService( str ); - - stream >> i; - par.setUid( i ); - - stream >> i ; - par.setField( i ); - - return par; -} -void OPimRecord::setLastHitField( int lastHit )const { - m_lastHit = lastHit; -} -int OPimRecord::lastHitField()const{ - return m_lastHit; -} -QMap<QString, QString> OPimRecord::toExtraMap()const { - return customMap; -} -void OPimRecord::setExtraMap( const QMap<QString, QString>& map) { - customMap = map; -} diff --git a/libopie/pim/opimrecord.h b/libopie/pim/opimrecord.h deleted file mode 100644 index 3d774e2..0000000 --- a/libopie/pim/opimrecord.h +++ b/dev/null @@ -1,158 +0,0 @@ -#ifndef OPIE_PIM_RECORD_H -#define OPIE_PIM_RECORD_H - -#include <qdatastream.h> -#include <qmap.h> -#include <qstring.h> -#include <qstringlist.h> - -/* - * we need to get customMap which is private... - */ -#define private protected -#include <qpe/palmtoprecord.h> -#undef private - -#include <opie/opimxrefmanager.h> - -/** - * This is the base class for - * all PIM Records - * - */ -class OPimRecord : public Qtopia::Record { -public: - /** - * c'tor - * uid of 0 isEmpty - * uid of 1 will be assigned a new one - */ - OPimRecord(int uid = 0); - ~OPimRecord(); - - /** - * copy c'tor - */ - OPimRecord( const OPimRecord& rec ); - - /** - * copy operator - */ - OPimRecord &operator=( const OPimRecord& ); - - /** - * category names resolved - */ - QStringList categoryNames( const QString& appname )const; - - /** - * set category names they will be resolved - */ - void setCategoryNames( const QStringList& ); - - /** - * addCategoryName adds a name - * to the internal category list - */ - void addCategoryName( const QString& ); - - /** - * if a Record isEmpty - * it's empty if it's 0 - */ - virtual bool isEmpty()const; - - /** - * toRichText summary - */ - virtual QString toRichText()const = 0; - - /** - * a small one line summary - */ - virtual QString toShortText()const = 0; - - /** - * the name of the Record - */ - virtual QString type()const = 0; - - /** - * matches the Records the regular expression? - */ - virtual bool match( const QString ®exp ) const - {setLastHitField( -1 ); - return Qtopia::Record::match(QRegExp(regexp));}; - - /** - * if implemented this function returns which item has been - * last hit by the match() function. - * or -1 if not implemented or no hit has occured - */ - int lastHitField()const; - - /** - * converts the internal structure to a map - */ - virtual QMap<int, QString> toMap()const = 0; - // virtual fromMap( const <int, QString>& map ) = 0; // Should be added in the future (eilers) - - /** - * key value representation of extra items - */ - QMap<QString, QString> toExtraMap()const; - void setExtraMap( const QMap<QString, QString>& ); - - /** - * the name for a recordField - */ - virtual QString recordField(int)const = 0; - - /** - * returns a reference of the - * Cross Reference Manager - * Partner 'One' is THIS PIM RECORD! - * 'Two' is the Partner where we link to - */ - OPimXRefManager& xrefmanager(); - - /** - * set the uid - */ - virtual void setUid( int uid ); - - /* - * used inside the Templates for casting - * REIMPLEMENT in your .... - */ - static int rtti(); - - /** - * some marshalling and de marshalling code - * saves the OPimRecord - * to and from a DataStream - */ - virtual bool loadFromStream(QDataStream& ); - virtual bool saveToStream( QDataStream& stream )const; - -protected: - // need to be const cause it is called from const methods - mutable int m_lastHit; - void setLastHitField( int lastHit )const; - Qtopia::UidGen &uidGen(); -// QString crossToString()const; - -private: - class OPimRecordPrivate; - OPimRecordPrivate *d; - OPimXRefManager m_xrefman; - static Qtopia::UidGen m_uidGen; - -private: - void flush( const OPimXRefPartner&, QDataStream& stream )const; - OPimXRefPartner partner( QDataStream& ); -}; - - - -#endif diff --git a/libopie/pim/opimresolver.cpp b/libopie/pim/opimresolver.cpp deleted file mode 100644 index 4ebbd6e..0000000 --- a/libopie/pim/opimresolver.cpp +++ b/dev/null @@ -1,198 +0,0 @@ -#include <qcopchannel_qws.h> - -#include <qpe/qcopenvelope_qws.h> - -#include "otodoaccess.h" -#include "ocontactaccess.h" - -//#include "opimfactory.h" -#include "opimresolver.h" - -OPimResolver* OPimResolver::m_self = 0l; - -OPimResolver::OPimResolver() { - /* the built in channels */ - m_builtIns << "Todolist" << "Addressbook" << "Datebook"; -} -OPimResolver* OPimResolver::self() { - if (!m_self) - m_self = new OPimResolver(); - - return m_self; -} - -/* - * FIXME use a cache here too - */ -OPimRecord* OPimResolver::record( const QString& service, int uid ) { - OPimRecord* rec = 0l; - OPimBase* base = backend( service ); - - if ( base ) - rec = base->record( uid ); - delete base; - - return rec; -} -OPimRecord* OPimResolver::record( const QString& service ) { - return record( serviceId( service ) ); -} -OPimRecord* OPimResolver::record( int rtti ) { - OPimRecord* rec = 0l; - switch( rtti ) { - case 1: /* todolist */ - rec = new OTodo(); - case 2: /* contact */ - rec = new OContact(); - default: - break; - } - /* - * FIXME resolve externally - */ - if (!rec ) { - ; - } - return 0l; -} -bool OPimResolver::isBuiltIn( const QString& str) const{ - return m_builtIns.contains( str ); -} -QCString OPimResolver::qcopChannel( enum BuiltIn& built)const { - QCString str("QPE/"); - switch( built ) { - case TodoList: - str += "Todolist"; - break; - case DateBook: - str += "Datebook"; - break; - case AddressBook: - str += "Addressbook"; - break; - default: - break; - } - - return str; -} -QCString OPimResolver::qcopChannel( const QString& service )const { - QCString str("QPE/"); - str += service.latin1(); - return str; -} -/* - * Implement services!! - * FIXME - */ -QCString OPimResolver::applicationChannel( enum BuiltIn& built)const { - QCString str("QPE/Application/"); - switch( built ) { - case TodoList: - str += "todolist"; - break; - case DateBook: - str += "datebook"; - break; - case AddressBook: - str += "addressbook"; - break; - } - - return str; -} -QCString OPimResolver::applicationChannel( const QString& service )const { - QCString str("QPE/Application/"); - - if ( isBuiltIn( service ) ) { - if ( service == "Todolist" ) - str += "todolist"; - else if ( service == "Datebook" ) - str += "datebook"; - else if ( service == "Addressbook" ) - str += "addressbook"; - }else - ; // FIXME for additional stuff - - return str; -} -QStringList OPimResolver::services()const { - return m_builtIns; -} -QString OPimResolver::serviceName( int rtti ) const{ - QString str; - switch ( rtti ) { - case TodoList: - str = "Todolist"; - break; - case DateBook: - str = "Datebook"; - break; - case AddressBook: - str = "Addressbook"; - break; - default: - break; - } - return str; - // FIXME me for 3rd party -} -int OPimResolver::serviceId( const QString& service ) { - int rtti = 0; - if ( service == "Todolist" ) - rtti = TodoList; - else if ( service == "Datebook" ) - rtti = DateBook; - else if ( service == "Addressbook" ) - rtti = AddressBook; - - return rtti; -} -/** - * check if the 'service' is registered and if so we'll - */ -bool OPimResolver::add( const QString& service, const OPimRecord& rec) { - if ( QCopChannel::isRegistered( applicationChannel( service ) ) ) { - QByteArray data; - QDataStream arg(data, IO_WriteOnly ); - if ( rec.saveToStream( arg ) ) { - QCopEnvelope env( applicationChannel( service ), "add(int,QByteArray)" ); - env << rec.rtti(); - env << data; - }else - return false; - }else{ - OPimBase* base = backend( service ); - if (!base ) return false; - - base->load(); - base->add( rec ); - base->save(); - delete base; - } - - return true; -} -OPimBase* OPimResolver::backend( const QString& service ) { - return backend( serviceId( service ) ); -} -OPimBase* OPimResolver::backend( int rtti ) { - OPimBase* base = 0l; - switch( rtti ) { - case TodoList: - base = new OTodoAccess(); - break; - case DateBook: - break; - case AddressBook: - base = new OContactAccess("Resolver"); - break; - default: - break; - } - // FIXME for 3rd party - if (!base ) - ; - - return base; -} diff --git a/libopie/pim/opimresolver.h b/libopie/pim/opimresolver.h deleted file mode 100644 index 1ce1619..0000000 --- a/libopie/pim/opimresolver.h +++ b/dev/null @@ -1,90 +0,0 @@ -#ifndef OPIE_PIM_RESOLVER -#define OPIE_PIM_RESOLVER - -#include <qstring.h> -#include <qvaluelist.h> - -#include <opie/otemplatebase.h> - -/** - * OPimResolver is a MetaClass to access - * available backends read only. - * It will be used to resolve uids + app names - * to full informations - * to traverse through a list of alarms, reminders - * to get access to built in PIM functionality - * and to more stuff - * THE PERFORMANCE will depend on THE BACKEND - * USING XML is a waste of memory!!!!! - */ -class OPimResolver { -public: - enum BuiltIn { TodoList = 0, - DateBook, - AddressBook - }; - static OPimResolver* self(); - - - /** - * return a record for a uid - * and an service - * You've THE OWNERSHIP NOW! - */ - OPimRecord *record( const QString& service, int uid ); - - /** - * return the QCopChannel for service - * When we will use Qtopia Services it will be used here - */ - QCString qcopChannel( enum BuiltIn& )const; - QCString qcopChannel( const QString& service )const; - - /** - * The Application channel (QPE/Application/name) - */ - QCString applicationChannel( enum BuiltIn& )const; - QCString applicationChannel( const QString& service )const; - - /** - * return a list of available services - */ - QStringList services()const; - inline QString serviceName(int rrti )const; - int serviceId( const QString& Service); - /** - * add a record to a service... ;) - */ - bool add( const QString& service, const OPimRecord& ); - - - /** - * record returns an empty record for a given service. - * Be sure to delete it!!! - * - */ - OPimRecord* record( const QString& service ); - OPimRecord* record( int rtti ); - - /** - * you can cast to your - */ - OPimBase* backend( const QString& service ); - OPimBase* backend( int rtti ); -private: - OPimResolver(); - void loadData(); - inline bool isBuiltIn( const QString& )const; - OPimRecord* recordExtern( const QString&, int ); - OPimRecord* recordExtern( const QString& ); - - static OPimResolver* m_self; - struct Data; - class Private; - - Data* data; - Private* d; - QStringList m_builtIns; -}; - -#endif diff --git a/libopie/pim/opimstate.cpp b/libopie/pim/opimstate.cpp deleted file mode 100644 index 6fb2feb..0000000 --- a/libopie/pim/opimstate.cpp +++ b/dev/null @@ -1,64 +0,0 @@ -#include <qshared.h> - -#include "opimstate.h" - -/* - * for one int this does not make - * much sense but never the less - * we will do it for the future - */ -struct OPimState::Data : public QShared { - Data() : QShared(),state(Undefined) { - } - int state; -}; - -OPimState::OPimState( int state ) { - data = new Data; - data->state = state; -} -OPimState::OPimState( const OPimState& st) : - data( st.data ) { - /* ref up */ - data->ref(); -} -OPimState::~OPimState() { - if ( data->deref() ) { - delete data ; - data = 0; - } -} -bool OPimState::operator==( const OPimState& st) { - if ( data->state == st.data->state ) return true; - - return false; -} -OPimState &OPimState::operator=( const OPimState& st) { - st.data->ref(); - deref(); - data = st.data; - - return *this; -} -void OPimState::setState( int st) { - copyInternally(); - data->state = st; -} -int OPimState::state()const { - return data->state; -} -void OPimState::deref() { - if ( data->deref() ) { - delete data; - data = 0l; - } -} -void OPimState::copyInternally() { - /* we need to change it */ - if ( data->count != 1 ) { - data->deref(); - Data* d2 = new Data; - d2->state = data->state; - data = d2; - } -} diff --git a/libopie/pim/opimstate.h b/libopie/pim/opimstate.h deleted file mode 100644 index cf6af46..0000000 --- a/libopie/pim/opimstate.h +++ b/dev/null @@ -1,46 +0,0 @@ -#ifndef OPIE_PIM_STATE_H -#define OPIE_PIM_STATE_H - -#include <qstring.h> - -/** - * The State of a Task - * This class encapsules the state of a todo - * and it's shared too - */ -/* - * in c a simple struct would be enough ;) - * g_new_state(); - * g_do_some_thing( state_t* ); - * ;) - */ -class OPimState { -public: - enum State { - Started = 0, - Postponed, - Finished, - NotStarted, - Undefined - }; - OPimState( int state = Undefined ); - OPimState( const OPimState& ); - ~OPimState(); - - bool operator==( const OPimState& ); - OPimState &operator=( const OPimState& ); - void setState( int state); - int state()const; -private: - void deref(); - inline void copyInternally(); - - struct Data; - Data* data; - - class Private; - Private *d; -}; - - -#endif diff --git a/libopie/pim/opimxref.cpp b/libopie/pim/opimxref.cpp deleted file mode 100644 index 8eefbd8..0000000 --- a/libopie/pim/opimxref.cpp +++ b/dev/null @@ -1,47 +0,0 @@ -#include "opimxref.h" - -OPimXRef::OPimXRef( const OPimXRefPartner& one, const OPimXRefPartner& two ) - : m_partners(2) -{ - m_partners[0] = one; - m_partners[1] = two; -} -OPimXRef::OPimXRef() - : m_partners(2) -{ - -} -OPimXRef::OPimXRef( const OPimXRef& ref) { - *this = ref; -} -OPimXRef::~OPimXRef() { -} -OPimXRef &OPimXRef::operator=( const OPimXRef& ref) { - m_partners = ref.m_partners; - m_partners.detach(); - - return* this; -} -bool OPimXRef::operator==( const OPimXRef& oper ) { - if ( m_partners == oper.m_partners ) return true; - - return false; -} -OPimXRefPartner OPimXRef::partner( enum Partners par) const{ - return m_partners[par]; -} -void OPimXRef::setPartner( enum Partners par, const OPimXRefPartner& part) { - m_partners[par] = part; -} -bool OPimXRef::containsString( const QString& string ) const{ - if ( m_partners[One].service() == string || - m_partners[Two].service() == string ) return true; - - return false; -} -bool OPimXRef::containsUid( int uid ) const{ - if ( m_partners[One].uid() == uid || - m_partners[Two].uid() == uid ) return true; - - return false; -} diff --git a/libopie/pim/opimxref.h b/libopie/pim/opimxref.h deleted file mode 100644 index 6852651..0000000 --- a/libopie/pim/opimxref.h +++ b/dev/null @@ -1,39 +0,0 @@ -#ifndef OPIM_XREF_H -#define OPIM_XREF_H - -#include <qarray.h> -#include <qvaluelist.h> - -#include <opie/opimxrefpartner.h> - -/** - * this is a Cross Referecne between - * two Cross Reference Partners - */ -class OPimXRef { -public: - typedef QValueList<OPimXRef> ValueList; - enum Partners { One, Two }; - OPimXRef( const OPimXRefPartner& ONE, const OPimXRefPartner& ); - OPimXRef(); - OPimXRef( const OPimXRef& ); - ~OPimXRef(); - - OPimXRef &operator=( const OPimXRef& ); - bool operator==( const OPimXRef& ); - - OPimXRefPartner partner( enum Partners )const; - - void setPartner( enum Partners, const OPimXRefPartner& ); - - bool containsString( const QString& service)const; - bool containsUid( int uid )const; - -private: - QArray<OPimXRefPartner> m_partners; - - class Private; - Private *d; -}; - -#endif diff --git a/libopie/pim/opimxrefmanager.cpp b/libopie/pim/opimxrefmanager.cpp deleted file mode 100644 index 58bfd24..0000000 --- a/libopie/pim/opimxrefmanager.cpp +++ b/dev/null @@ -1,71 +0,0 @@ -#include "opimxrefmanager.h" - - -OPimXRefManager::OPimXRefManager() { -} -OPimXRefManager::OPimXRefManager( const OPimXRefManager& ref) { - m_list = ref.m_list; -} -OPimXRefManager::~OPimXRefManager() { -} -OPimXRefManager &OPimXRefManager::operator=( const OPimXRefManager& ref) { - m_list = ref.m_list; - return *this; -} -bool OPimXRefManager::operator==( const OPimXRefManager& /*ref*/) { - // if ( m_list == ref.m_list ) return true; - - return false; -} -void OPimXRefManager::add( const OPimXRef& ref) { - m_list.append( ref ); -} -void OPimXRefManager::remove( const OPimXRef& ref) { - m_list.remove( ref ); -} -void OPimXRefManager::replace( const OPimXRef& ref) { - m_list.remove( ref ); - m_list.append( ref ); -} -void OPimXRefManager::clear() { - m_list.clear(); -} -QStringList OPimXRefManager::apps()const { - OPimXRef::ValueList::ConstIterator it; - QStringList list; - - QString str; - for ( it = m_list.begin(); it != m_list.end(); ++it ) { - str = (*it).partner( OPimXRef::One ).service(); - if ( !list.contains( str ) ) list << str; - - str = (*it).partner( OPimXRef::Two ).service(); - if ( !list.contains( str ) ) list << str; - } - return list; -} -OPimXRef::ValueList OPimXRefManager::list()const { - return m_list; -} -OPimXRef::ValueList OPimXRefManager::list( const QString& appName )const{ - OPimXRef::ValueList list; - OPimXRef::ValueList::ConstIterator it; - - for ( it = m_list.begin(); it != m_list.end(); ++it ) { - if ( (*it).containsString( appName ) ) - list.append( (*it) ); - } - - return list; -} -OPimXRef::ValueList OPimXRefManager::list( int uid )const { - OPimXRef::ValueList list; - OPimXRef::ValueList::ConstIterator it; - - for ( it = m_list.begin(); it != m_list.end(); ++it ) { - if ( (*it).containsUid( uid ) ) - list.append( (*it) ); - } - - return list; -} diff --git a/libopie/pim/opimxrefmanager.h b/libopie/pim/opimxrefmanager.h deleted file mode 100644 index c485e98..0000000 --- a/libopie/pim/opimxrefmanager.h +++ b/dev/null @@ -1,43 +0,0 @@ -#ifndef OPIM_XREF_MANAGER_H -#define OPIM_XREF_MANAGER_H - -#include <qstringlist.h> - -#include <opie/opimxref.h> - -/** - * This is a simple manager for - * OPimXRefs. - * It allows addition, removing, replacing - * clearing and 'querying' the XRef... - */ -class OPimXRefManager { -public: - OPimXRefManager(); - OPimXRefManager( const OPimXRefManager& ); - ~OPimXRefManager(); - - OPimXRefManager& operator=( const OPimXRefManager& ); - bool operator==( const OPimXRefManager& ); - - void add( const OPimXRef& ); - void remove( const OPimXRef& ); - void replace( const OPimXRef& ); - - void clear(); - - /** - * apps participating - */ - QStringList apps()const; - OPimXRef::ValueList list()const; - OPimXRef::ValueList list( const QString& service )const; - OPimXRef::ValueList list( int uid )const; - -private: - OPimXRef::ValueList m_list; - class Private; - Private *d; -}; - -#endif diff --git a/libopie/pim/opimxrefpartner.cpp b/libopie/pim/opimxrefpartner.cpp deleted file mode 100644 index 6ef3efb..0000000 --- a/libopie/pim/opimxrefpartner.cpp +++ b/dev/null @@ -1,43 +0,0 @@ -#include "opimxrefpartner.h" - -OPimXRefPartner::OPimXRefPartner( const QString& appName, - int uid, int field ) - : m_app(appName), m_uid(uid), m_field( field ) { -} -OPimXRefPartner::OPimXRefPartner( const OPimXRefPartner& ref ) { - *this = ref; -} -OPimXRefPartner::~OPimXRefPartner() { -} -OPimXRefPartner &OPimXRefPartner::operator=( const OPimXRefPartner& par ) { - m_app = par.m_app; - m_uid = par.m_uid; - m_field = par.m_field; - - return *this; -} -bool OPimXRefPartner::operator==( const OPimXRefPartner& par ) { - if ( m_app != par.m_app ) return false; - if ( m_uid != par.m_uid ) return false; - if ( m_field != par.m_field ) return false; - - return true; -} -QString OPimXRefPartner::service()const { - return m_app; -} -int OPimXRefPartner::uid()const { - return m_uid; -} -int OPimXRefPartner::field()const { - return m_field; -} -void OPimXRefPartner::setService( const QString& appName ) { - m_app = appName; -} -void OPimXRefPartner::setUid( int uid ) { - m_uid = uid; -} -void OPimXRefPartner::setField( int field ) { - m_field = field; -} diff --git a/libopie/pim/opimxrefpartner.h b/libopie/pim/opimxrefpartner.h deleted file mode 100644 index d76e384..0000000 --- a/libopie/pim/opimxrefpartner.h +++ b/dev/null @@ -1,40 +0,0 @@ -#ifndef OPIM_XREF_PARTNER_H -#define OPIM_XREF_PARTNER_H - -#include <qstring.h> - -/** - * This class represents one partner - * of a Cross Reference. - * In Opie one application - * can link one uid - * with one tableId( fieldId ) to another. - */ -class OPimXRefPartner { -public: - OPimXRefPartner( const QString& service = QString::null, - int uid = 0, int field = -1 ); - OPimXRefPartner( const OPimXRefPartner& ); - OPimXRefPartner& operator=( const OPimXRefPartner& ); - ~OPimXRefPartner(); - - bool operator==(const OPimXRefPartner& ); - - QString service()const; - int uid()const; - int field()const; - - void setService( const QString& service ); - void setUid( int uid ); - void setField( int field ); -private: - QString m_app; - int m_uid; - int m_field; - - class Private; - Private* d; -}; - - -#endif diff --git a/libopie/pim/orecordlist.h b/libopie/pim/orecordlist.h deleted file mode 100644 index 5211f57..0000000 --- a/libopie/pim/orecordlist.h +++ b/dev/null @@ -1,306 +0,0 @@ - -#ifndef OPIE_RECORD_LIST_H -#define OPIE_RECORD_LIST_H - -#include <qarray.h> - -#include "otemplatebase.h" -#include "opimrecord.h" - -class ORecordListIteratorPrivate; -/** - * Our List Iterator - * it behaves like STL or Qt - * - * for(it = list.begin(); it != list.end(); ++it ) - * doSomeCoolStuff( (*it) ); - */ -template <class T> class ORecordList; -template <class T = OPimRecord> -class ORecordListIterator { - friend class ORecordList<T>; -public: - typedef OTemplateBase<T> Base; - - /** - * The c'tor used internally from - * ORecordList - */ - ORecordListIterator( const QArray<int>, const Base* ); - - /** - * The standard c'tor - */ - ORecordListIterator(); - ~ORecordListIterator(); - - ORecordListIterator( const ORecordListIterator& ); - ORecordListIterator &operator=(const ORecordListIterator& ); - - /** - * a * operator ;) - * use it like this T = (*it); - */ - T operator*(); - ORecordListIterator &operator++(); - ORecordListIterator &operator--(); - - bool operator==( const ORecordListIterator& it ); - bool operator!=( const ORecordListIterator& it ); - - /** - * the current item - */ - uint current()const; - - /** - * the number of items - */ - uint count()const; - - /** - * sets the current item - */ - void setCurrent( uint cur ); - -private: - QArray<int> m_uids; - uint m_current; - const Base* m_temp; - bool m_end : 1; - T m_record; - bool m_direction :1; - - /* d pointer for future versions */ - ORecordListIteratorPrivate *d; -}; - -class ORecordListPrivate; -/** - * The recordlist used as a return type - * from OPimAccessTemplate - */ -template <class T = OPimRecord > -class ORecordList { -public: - typedef OTemplateBase<T> Base; - typedef ORecordListIterator<T> Iterator; - - /** - * c'tor - */ - ORecordList () { - } -ORecordList( const QArray<int>& ids, - const Base* ); - ~ORecordList(); - - /** - * the first iterator - */ - Iterator begin(); - - /** - * the end - */ - Iterator end(); - - /** - * the number of items in the list - */ - uint count()const; - - T operator[]( uint i ); - int uidAt(uint i ); - - /** - * Remove the contact with given uid - */ - bool remove( int uid ); - - /* - ConstIterator begin()const; - ConstIterator end()const; - */ -private: - QArray<int> m_ids; - const Base* m_acc; - ORecordListPrivate *d; -}; - -/* ok now implement it */ -template <class T> -ORecordListIterator<T>::ORecordListIterator() { - m_current = 0; - m_temp = 0l; - m_end = true; - m_record = T(); - /* forward */ - m_direction = TRUE; -} -template <class T> -ORecordListIterator<T>::~ORecordListIterator() { -/* nothing to delete */ -} - -template <class T> -ORecordListIterator<T>::ORecordListIterator( const ORecordListIterator<T>& it) { -// qWarning("ORecordListIterator copy c'tor"); - m_uids = it.m_uids; - m_current = it.m_current; - m_temp = it.m_temp; - m_end = it.m_end; - m_record = it.m_record; - m_direction = it.m_direction; -} - -template <class T> -ORecordListIterator<T> &ORecordListIterator<T>::operator=( const ORecordListIterator<T>& it) { - m_uids = it.m_uids; - m_current = it.m_current; - m_temp = it.m_temp; - m_end = it.m_end; - m_record = it.m_record; - - return *this; -} - -template <class T> -T ORecordListIterator<T>::operator*() { - //qWarning("operator* %d %d", m_current, m_uids[m_current] ); - if (!m_end ) - m_record = m_temp->find( m_uids[m_current], m_uids, m_current, - m_direction ? Base::Forward : - Base::Reverse ); - else - m_record = T(); - - return m_record; -} - -template <class T> -ORecordListIterator<T> &ORecordListIterator<T>::operator++() { - m_direction = true; - if (m_current < m_uids.count() ) { - m_end = false; - ++m_current; - }else - m_end = true; - - return *this; -} -template <class T> -ORecordListIterator<T> &ORecordListIterator<T>::operator--() { - m_direction = false; - if ( m_current > 0 ) { - --m_current; - m_end = false; - } else - m_end = true; - - return *this; -} - -template <class T> -bool ORecordListIterator<T>::operator==( const ORecordListIterator<T>& it ) { - - /* if both are at we're the same.... */ - if ( m_end == it.m_end ) return true; - - if ( m_uids != it.m_uids ) return false; - if ( m_current != it.m_current ) return false; - if ( m_temp != it.m_temp ) return false; - - return true; -} -template <class T> -bool ORecordListIterator<T>::operator!=( const ORecordListIterator<T>& it ) { - return !(*this == it ); -} -template <class T> -ORecordListIterator<T>::ORecordListIterator( const QArray<int> uids, - const Base* t ) - : m_uids( uids ), m_current( 0 ), m_temp( t ), m_end( false ), - m_direction( false ) -{ - /* if the list is empty we're already at the end of the list */ - if (uids.count() == 0 ) - m_end = true; -} -template <class T> -uint ORecordListIterator<T>::current()const { - return m_current; -} -template <class T> -void ORecordListIterator<T>::setCurrent( uint cur ) { - if( cur < m_uids.count() ) { - m_end = false; - m_current= cur; - } -} -template <class T> -uint ORecordListIterator<T>::count()const { - return m_uids.count(); -} -template <class T> -ORecordList<T>::ORecordList( const QArray<int>& ids, - const Base* acc ) - : m_ids( ids ), m_acc( acc ) -{ -} -template <class T> -ORecordList<T>::~ORecordList() { -/* nothing to do here */ -} -template <class T> -typename ORecordList<T>::Iterator ORecordList<T>::begin() { - Iterator it( m_ids, m_acc ); - return it; -} -template <class T> -typename ORecordList<T>::Iterator ORecordList<T>::end() { - Iterator it( m_ids, m_acc ); - it.m_end = true; - it.m_current = m_ids.count(); - - return it; -} -template <class T> -uint ORecordList<T>::count()const { -return m_ids.count(); -} -template <class T> -T ORecordList<T>::operator[]( uint i ) { - if ( i >= m_ids.count() ) - return T(); - /* forward */ - return m_acc->find( m_ids[i], m_ids, i ); -} -template <class T> -int ORecordList<T>::uidAt( uint i ) { - return m_ids[i]; -} - -template <class T> -bool ORecordList<T>::remove( int uid ) { - QArray<int> copy( m_ids.count() ); - int counter = 0; - bool ret_val = false; - - for (uint i = 0; i < m_ids.count(); i++){ - if ( m_ids[i] != uid ){ - copy[counter++] = m_ids[i]; - - }else - ret_val = true; - } - - copy.resize( counter ); - m_ids = copy; - - - return ret_val; -} - - -#endif diff --git a/libopie/pim/orecur.cpp b/libopie/pim/orecur.cpp deleted file mode 100644 index f46f22e..0000000 --- a/libopie/pim/orecur.cpp +++ b/dev/null @@ -1,593 +0,0 @@ -#include <time.h> - -#include <qshared.h> - -#include <qtopia/timeconversion.h> - -#include "otimezone.h" -#include "orecur.h" - -struct ORecur::Data : public QShared { - Data() : QShared() { - type = ORecur::NoRepeat; - freq = -1; - days = 0; - pos = 0; - create = QDateTime::currentDateTime(); - hasEnd = FALSE; - end = QDate::currentDate(); - } - char days; // Q_UINT8 for 8 seven days;) - ORecur::RepeatType type; - int freq; - int pos; - bool hasEnd : 1; - QDate end; - QDateTime create; - int rep; - QString app; - ExceptionList list; - QDate start; -}; - - -ORecur::ORecur() { - data = new Data; -} - -ORecur::ORecur( const QMap<int, QString>& map ) -{ - ORecur(); - fromMap( map ); -} - - -ORecur::ORecur( const ORecur& rec) - : data( rec.data ) -{ - data->ref(); -} -ORecur::~ORecur() { - if ( data->deref() ) { - delete data; - data = 0l; - } -} -void ORecur::deref() { - if ( data->deref() ) { - delete data; - data = 0l; - } -} -bool ORecur::operator==( const ORecur& )const { - return false; -} -ORecur &ORecur::operator=( const ORecur& re) { - if ( *this == re ) return *this; - - re.data->ref(); - deref(); - data = re.data; - - return *this; -} -bool ORecur::doesRecur()const { - return !( type() == NoRepeat ); -} -/* - * we try to be smart here - * - */ -bool ORecur::doesRecur( const QDate& date ) { - /* the day before the recurrance */ - QDate da = date.addDays(-1); - - QDate recur; - if (!nextOcurrence( da, recur ) ) - return false; - - return (recur == date); -} -// FIXME unuglify! -// GPL from Datebookdb.cpp -// FIXME exception list! -bool ORecur::nextOcurrence( const QDate& from, QDate& next ) { - bool stillLooking; - stillLooking = p_nextOccurrence( from, next ); - while ( stillLooking && data->list.contains(next) ) - stillLooking = p_nextOccurrence( next.addDays(1), next ); - - return stillLooking; -} -bool ORecur::p_nextOccurrence( const QDate& from, QDate& next ) { - - // easy checks, first are we too far in the future or too far in the past? - QDate tmpDate; - int freq = frequency(); - int diff, diff2, a; - int iday, imonth, iyear; - int dayOfWeek = 0; - int firstOfWeek = 0; - int weekOfMonth; - - - if (hasEndDate() && endDate() < from) - return FALSE; - - if (start() >= from ) { - next = start(); - return TRUE; - } - - switch ( type() ) { - case Weekly: - /* weekly is just daily by 7 */ - /* first convert the repeatPattern.Days() mask to the next - day of week valid after from */ - dayOfWeek = from.dayOfWeek(); - dayOfWeek--; /* we want 0-6, doco for above specs 1-7 */ - - /* this is done in case freq > 1 and from in week not - for this round */ - // firstOfWeek = 0; this is already done at decl. - while(!((1 << firstOfWeek) & days() )) - firstOfWeek++; - - /* there is at least one 'day', or there would be no event */ - while(!((1 << (dayOfWeek % 7)) & days() )) - dayOfWeek++; - - dayOfWeek = dayOfWeek % 7; /* the actual day of week */ - dayOfWeek -= start().dayOfWeek() -1; - - firstOfWeek = firstOfWeek % 7; /* the actual first of week */ - firstOfWeek -= start().dayOfWeek() -1; - - // dayOfWeek may be negitive now - // day of week is number of days to add to start day - - freq *= 7; - // FALL-THROUGH !!!!! - case Daily: - // the add is for the possible fall through from weekly */ - if(start().addDays(dayOfWeek) > from) { - /* first week exception */ - next = QDate(start().addDays(dayOfWeek) ); - if ((next > endDate()) - && hasEndDate() ) - return FALSE; - return TRUE; - } - /* if from is middle of a non-week */ - - diff = start().addDays(dayOfWeek).daysTo(from) % freq; - diff2 = start().addDays(firstOfWeek).daysTo(from) % freq; - - if(diff != 0) - diff = freq - diff; - if(diff2 != 0) - diff2 = freq - diff2; - diff = QMIN(diff, diff2); - - next = QDate(from.addDays(diff)); - if ( (next > endDate()) - && hasEndDate() ) - return FALSE; - return TRUE; - case MonthlyDay: - iday = from.day(); - iyear = from.year(); - imonth = from.month(); - /* find equivelent day of month for this month */ - dayOfWeek = start().dayOfWeek(); - weekOfMonth = (start().day() - 1) / 7; - - /* work out when the next valid month is */ - a = from.year() - start().year(); - a *= 12; - a = a + (imonth - start().month()); - /* a is e.start()monthsFrom(from); */ - if(a % freq) { - a = freq - (a % freq); - imonth = from.month() + a; - if (imonth > 12) { - imonth--; - iyear += imonth / 12; - imonth = imonth % 12; - imonth++; - } - } - /* imonth is now the first month after or on - from that matches the frequency given */ - - /* find for this month */ - tmpDate = QDate( iyear, imonth, 1 ); - - iday = 1; - iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7; - iday += 7 * weekOfMonth; - while (iday > tmpDate.daysInMonth()) { - imonth += freq; - if (imonth > 12) { - imonth--; - iyear += imonth / 12; - imonth = imonth % 12; - imonth++; - } - tmpDate = QDate( iyear, imonth, 1 ); - /* these loops could go for a while, check end case now */ - if ((tmpDate > endDate()) && hasEndDate() ) - return FALSE; - iday = 1; - iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7; - iday += 7 * weekOfMonth; - } - tmpDate = QDate(iyear, imonth, iday); - - if (tmpDate >= from) { - next = tmpDate; - if ((next > endDate() ) && hasEndDate() ) - return FALSE; - return TRUE; - } - - /* need to find the next iteration */ - do { - imonth += freq; - if (imonth > 12) { - imonth--; - iyear += imonth / 12; - imonth = imonth % 12; - imonth++; - } - tmpDate = QDate( iyear, imonth, 1 ); - /* these loops could go for a while, check end case now */ - if ((tmpDate > endDate()) && hasEndDate() ) - return FALSE; - iday = 1; - iday += (7 + dayOfWeek - tmpDate.dayOfWeek()) % 7; - iday += 7 * weekOfMonth; - } while (iday > tmpDate.daysInMonth()); - tmpDate = QDate(iyear, imonth, iday); - - next = tmpDate; - if ((next > endDate()) && hasEndDate() ) - return FALSE; - return TRUE; - case MonthlyDate: - iday = start().day(); - iyear = from.year(); - imonth = from.month(); - - a = from.year() - start().year(); - a *= 12; - a = a + (imonth - start().month()); - /* a is e.start()monthsFrom(from); */ - if(a % freq) { - a = freq - (a % freq); - imonth = from.month() + a; - if (imonth > 12) { - imonth--; - iyear += imonth / 12; - imonth = imonth % 12; - imonth++; - } - } - /* imonth is now the first month after or on - from that matches the frequencey given */ - - /* this could go for a while, worse case, 4*12 iterations, probably */ - while(!QDate::isValid(iyear, imonth, iday) ) { - imonth += freq; - if (imonth > 12) { - imonth--; - iyear += imonth / 12; - imonth = imonth % 12; - imonth++; - } - /* these loops could go for a while, check end case now */ - if ((QDate(iyear, imonth, 1) > endDate()) && hasEndDate() ) - return FALSE; - } - - if(QDate(iyear, imonth, iday) >= from) { - /* done */ - next = QDate(iyear, imonth, iday); - if ((next > endDate()) && hasEndDate() ) - return FALSE; - return TRUE; - } - - /* ok, need to cycle */ - imonth += freq; - imonth--; - iyear += imonth / 12; - imonth = imonth % 12; - imonth++; - - while(!QDate::isValid(iyear, imonth, iday) ) { - imonth += freq; - imonth--; - iyear += imonth / 12; - imonth = imonth % 12; - imonth++; - if ((QDate(iyear, imonth, 1) > endDate()) && hasEndDate() ) - return FALSE; - } - - next = QDate(iyear, imonth, iday); - if ((next > endDate()) && hasEndDate() ) - return FALSE; - return TRUE; - case Yearly: - iday = start().day(); - imonth = start().month(); - iyear = from.year(); // after all, we want to start in this year - - diff = 1; - if(imonth == 2 && iday > 28) { - /* leap year, and it counts, calculate actual frequency */ - if(freq % 4) - if (freq % 2) - freq = freq * 4; - else - freq = freq * 2; - /* else divides by 4 already, leave freq alone */ - diff = 4; - } - - a = from.year() - start().year(); - if(a % freq) { - a = freq - (a % freq); - iyear = iyear + a; - } - - /* under the assumption we won't hit one of the special not-leap years twice */ - if(!QDate::isValid(iyear, imonth, iday)) { - /* must have been skipping by leap years and hit one that wasn't, (e.g. 2100) */ - iyear += freq; - } - - if(QDate(iyear, imonth, iday) >= from) { - next = QDate(iyear, imonth, iday); - - if ((next > endDate()) && hasEndDate() ) - return FALSE; - return TRUE; - } - /* iyear == from.year(), need to advance again */ - iyear += freq; - /* under the assumption we won't hit one of the special not-leap years twice */ - if(!QDate::isValid(iyear, imonth, iday)) { - /* must have been skipping by leap years and hit one that wasn't, (e.g. 2100) */ - iyear += freq; - } - - next = QDate(iyear, imonth, iday); - if ((next > endDate()) && hasEndDate() ) - return FALSE; - return TRUE; - default: - return FALSE; - } -} -ORecur::RepeatType ORecur::type()const{ - return data->type; -} -int ORecur::frequency()const { - return data->freq; -} -int ORecur::position()const { - return data->pos; -} -char ORecur::days() const{ - return data->days; -} -bool ORecur::hasEndDate()const { - return data->hasEnd; -} -QDate ORecur::endDate()const { - return data->end; -} -QDate ORecur::start()const{ - return data->start; -} -QDateTime ORecur::createdDateTime()const { - return data->create; -} -int ORecur::repetition()const { - return data->rep; -} -QString ORecur::service()const { - return data->app; -} -ORecur::ExceptionList& ORecur::exceptions() { - return data->list; -} -void ORecur::setType( const RepeatType& z) { - checkOrModify(); - data->type = z; -} -void ORecur::setFrequency( int freq ) { - checkOrModify(); - data->freq = freq; -} -void ORecur::setPosition( int pos ) { - checkOrModify(); - data->pos = pos; -} -void ORecur::setDays( char c ) { - checkOrModify(); - data->days = c; -} -void ORecur::setEndDate( const QDate& dt) { - checkOrModify(); - data->end = dt; -} -void ORecur::setCreatedDateTime( const QDateTime& t) { - checkOrModify(); - data->create = t; -} -void ORecur::setHasEndDate( bool b) { - checkOrModify(); - data->hasEnd = b; -} -void ORecur::setRepitition( int rep ) { - checkOrModify(); - data->rep = rep; -} -void ORecur::setService( const QString& app ) { - checkOrModify(); - data->app = app; -} -void ORecur::setStart( const QDate& dt ) { - checkOrModify(); - data->start = dt; -} -void ORecur::checkOrModify() { - if ( data->count != 1 ) { - data->deref(); - Data* d2 = new Data; - d2->days = data->days; - d2->type = data->type; - d2->freq = data->freq; - d2->pos = data->pos; - d2->hasEnd = data->hasEnd; - d2->end = data->end; - d2->create = data->create; - d2->rep = data->rep; - d2->app = data->app; - d2->list = data->list; - d2->start = data->start; - data = d2; - } -} -QString ORecur::toString()const { - QString buf; - QMap<int, QString> recMap = toMap(); - - buf += " rtype=\""; - buf += recMap[ORecur::RType]; - buf += "\""; - if (data->days > 0 ) - buf += " rweekdays=\"" + recMap[ORecur::RWeekdays] + "\""; - if ( data->pos != 0 ) - buf += " rposition=\"" + recMap[ORecur::RPosition] + "\""; - - buf += " rfreq=\"" + recMap[ORecur::RFreq] + "\""; - buf += " rhasenddate=\"" + recMap[ORecur::RHasEndDate]+ "\""; - if ( data->hasEnd ) - buf += " enddt=\"" - + recMap[ORecur::EndDate] - + "\""; - buf += " created=\"" + recMap[ORecur::Created] + "\""; - - if ( data->list.isEmpty() ) return buf; - buf += " exceptions=\""; - buf += recMap[ORecur::Exceptions]; - buf += "\" "; - - return buf; -} - -QString ORecur::rTypeString() const -{ - QString retString; - switch ( data->type ) { - case ORecur::Daily: - retString = "Daily"; - break; - case ORecur::Weekly: - retString = "Weekly"; - break; - case ORecur::MonthlyDay: - retString = "MonthlyDay"; - break; - case ORecur::MonthlyDate: - retString = "MonthlyDate"; - break; - case ORecur::Yearly: - retString = "Yearly"; - break; - default: - retString = "NoRepeat"; - break; - - } - - return retString; -} - -QMap<QString, ORecur::RepeatType> ORecur::rTypeValueConvertMap() const -{ - QMap<QString, RepeatType> convertMap; - - convertMap.insert( QString( "Daily" ), ORecur::Daily ); - convertMap.insert( QString( "Weekly" ), ORecur::Weekly ); - convertMap.insert( QString( "MonthlyDay" ), ORecur::MonthlyDay ); - convertMap.insert( QString( "MonthlyDate" ), ORecur::MonthlyDate ); - convertMap.insert( QString( "Yearly" ), ORecur::Yearly ); - convertMap.insert( QString( "NoRepeat" ), ORecur::NoRepeat ); - - return convertMap; -} - - -QMap<int, QString> ORecur::toMap() const -{ - QMap<int, QString> retMap; - - retMap.insert( ORecur::RType, rTypeString() ); - retMap.insert( ORecur::RWeekdays, QString::number( static_cast<int>( data->days ) ) ); - retMap.insert( ORecur::RPosition, QString::number(data->pos ) ); - retMap.insert( ORecur::RFreq, QString::number( data->freq ) ); - retMap.insert( ORecur::RHasEndDate, QString::number( static_cast<int>( data->hasEnd ) ) ); - if( data -> hasEnd ) - retMap.insert( ORecur::EndDate, QString::number( OTimeZone::utc().fromUTCDateTime( QDateTime( data->end, QTime(12,0,0) ) ) ) ); - retMap.insert( ORecur::Created, QString::number( OTimeZone::utc().fromUTCDateTime( data->create ) ) ); - - if ( data->list.isEmpty() ) return retMap; - - // save exceptions list here!! - ExceptionList::ConstIterator it; - ExceptionList list = data->list; - QString exceptBuf; - QDate date; - for ( it = list.begin(); it != list.end(); ++it ) { - date = (*it); - if ( it != list.begin() ) exceptBuf += " "; - - exceptBuf += QCString().sprintf("%04d%02d%02d", date.year(), date.month(), date.day() ); - } - - retMap.insert( ORecur::Exceptions, exceptBuf ); - - return retMap; -} - -void ORecur::fromMap( const QMap<int, QString>& map ) -{ - QMap<QString, RepeatType> repTypeMap = rTypeValueConvertMap(); - - data -> type = repTypeMap[ map [ORecur::RType] ]; - data -> days = (char) map[ ORecur::RWeekdays ].toInt(); - data -> pos = map[ ORecur::RPosition ].toInt(); - data -> freq = map[ ORecur::RFreq ].toInt(); - data -> hasEnd= map[ ORecur::RHasEndDate ].toInt() ? true : false; - OTimeZone utc = OTimeZone::utc(); - if ( data -> hasEnd ){ - data -> end = utc.fromUTCDateTime( (time_t) map[ ORecur::EndDate ].toLong() ).date(); - } - data -> create = utc.fromUTCDateTime( (time_t) map[ ORecur::Created ].toLong() ).date(); - -#if 0 - // FIXME: Exceptions currently not supported... - // Convert the list of exceptions from QString into ExceptionList - data -> list.clear(); - QString exceptStr = map[ ORecur::Exceptions ]; - QStringList exceptList = QStringList::split( " ", exceptStr ); - ... -#endif - - -} diff --git a/libopie/pim/orecur.h b/libopie/pim/orecur.h deleted file mode 100644 index d7ecd90..0000000 --- a/libopie/pim/orecur.h +++ b/dev/null @@ -1,107 +0,0 @@ -/* - * GPL from TT - */ - -#ifndef OPIE_RECUR_H -#define OPIE_RECUR_H - -#include <sys/types.h> - -#include <qdatetime.h> -#include <qvaluelist.h> -#include <qmap.h> - - -/** - * Class to handle Recurrencies.. - */ - -class ORecur { -public: - typedef QValueList<QDate> ExceptionList; - enum RepeatType{ NoRepeat = -1, Daily, Weekly, MonthlyDay, - MonthlyDate, Yearly }; - enum Days { MON = 0x01, TUE = 0x02, WED = 0x04, THU = 0x08, - FRI = 0x10, SAT = 0x20, SUN = 0x40 }; - enum Fields{ RType = 0, RWeekdays, RPosition, RFreq, RHasEndDate, - EndDate, Created, Exceptions }; - - ORecur(); - ORecur( const QMap<int, QString>& map ); - ORecur( const ORecur& ); - ~ORecur(); - - ORecur &operator=( const ORecur& ); - bool operator==(const ORecur& )const; - - bool doesRecur()const; - /* if it recurrs on that day */ - bool doesRecur( const QDate& ); - RepeatType type()const; - int frequency()const; - int position()const; - char days()const; - bool hasEndDate()const; - QDate start()const; - QDate endDate()const; - QDateTime createdDateTime()const; - /** - * starting on monday=0, sunday=6 - * for convience - */ - bool repeatOnWeekDay( int day )const; - - /** - * FromWhereToStart is not included!!! - */ - bool nextOcurrence( const QDate& FromWhereToStart, QDate &recurDate ); - - /** - * The module this ORecur belongs to - */ - QString service()const; - - /* - * reference to the exception list - */ - ExceptionList &exceptions(); - - /** - * the current repetition - */ - int repetition()const; - - void setType( const RepeatType& ); - void setFrequency( int freq ); - void setPosition( int pos ); - void setDays( char c); - void setEndDate( const QDate& dt ); - void setStart( const QDate& dt ); - void setCreatedDateTime( const QDateTime& ); - void setHasEndDate( bool b ); - void setRepitition(int ); - - void setService( const QString& ser ); - - QMap<int, QString> toMap() const; - void fromMap( const QMap<int, QString>& map ); - - /* almost internal */ - QString toString()const; -private: - bool p_nextOccurrence( const QDate& from, QDate& next ); - void deref(); - inline void checkOrModify(); - - /* Converts rType to String */ - QString rTypeString() const; - /* Returns a map to convert Stringname for RType to RepeatType */ - QMap<QString, RepeatType> rTypeValueConvertMap() const; - - class Data; - Data* data; - class ORecurPrivate; - ORecurPrivate *d; -}; - -#endif diff --git a/libopie/pim/otemplatebase.h b/libopie/pim/otemplatebase.h deleted file mode 100644 index cadac74..0000000 --- a/libopie/pim/otemplatebase.h +++ b/dev/null @@ -1,98 +0,0 @@ -#ifndef OPIE_TEMPLATE_BASE_H -#define OPIE_TEMPLATE_BASE_H - -#include <qarray.h> - -#include <opie/opimrecord.h> - - -/** - * Templates do not have a base class, This is why - * we've this class - * this is here to give us the possibility - * to have a common base class - * You may not want to use that interface internaly - * POOR mans interface - */ -class OPimBasePrivate; -struct OPimBase { - /** - * return the rtti - */ - virtual int rtti()= 0; - virtual OPimRecord* record()const = 0; - virtual OPimRecord* record(int uid)const = 0; - virtual bool add( const OPimRecord& ) = 0; - virtual bool remove( int uid ) = 0; - virtual bool remove( const OPimRecord& ) = 0; - virtual void clear() = 0; - virtual bool load() = 0; - virtual bool save() = 0; - virtual QArray<int> records()const = 0; - /* - * ADD editing here? - * -zecke - */ -private: - OPimBasePrivate* d; - -}; -/** - * internal template base - * T needs to implement the copy c'tor!!! - */ -class OTemplateBasePrivate; -template <class T = OPimRecord> -class OTemplateBase : public OPimBase { -public: - enum CacheDirection { Forward=0, Reverse }; - OTemplateBase() { - }; - virtual ~OTemplateBase() { - } - virtual T find( int uid )const = 0; - - /** - * read ahead find - */ - virtual T find( int uid, const QArray<int>& items, - uint current, CacheDirection dir = Forward )const = 0; - virtual void cache( const T& )const = 0; - virtual void setSaneCacheSize( int ) = 0; - - /* reimplement of OPimBase */ - int rtti(); - OPimRecord* record()const; - OPimRecord* record(int uid )const; - static T* rec(); - -private: - OTemplateBasePrivate *d; -}; - -/* - * implementation - */ -template <class T> -int -OTemplateBase<T>::rtti() { - return T::rtti(); -} -template <class T> -OPimRecord* OTemplateBase<T>::record()const { - T* t = new T; - return t; -} -template <class T> -OPimRecord* OTemplateBase<T>::record(int uid )const { - T t2 = find(uid ); - T* t1 = new T(t2); - - return t1; -}; -template <class T> -T* OTemplateBase<T>::rec() { - return new T; -} - -#endif diff --git a/libopie/pim/otimezone.cpp b/libopie/pim/otimezone.cpp deleted file mode 100644 index 34659c3..0000000 --- a/libopie/pim/otimezone.cpp +++ b/dev/null @@ -1,113 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#include <sys/types.h> - -#include "otimezone.h" - -namespace { - - QDateTime utcTime( time_t t) { - tm* broken = ::gmtime( &t ); - QDateTime ret; - ret.setDate( QDate( broken->tm_year + 1900, broken->tm_mon +1, broken->tm_mday ) ); - ret.setTime( QTime( broken->tm_hour, broken->tm_min, broken->tm_sec ) ); - return ret; - } - QDateTime utcTime( time_t t, const QString& zone) { - QCString org = ::getenv( "TZ" ); -#ifndef Q_OS_MACX // Following line causes bus errors on Mac - ::setenv( "TZ", zone.latin1(), true ); - ::tzset(); - - tm* broken = ::localtime( &t ); - ::setenv( "TZ", org, true ); -#else -#warning "Need a replacement for MacOSX!!" - tm* broken = ::localtime( &t ); -#endif - - QDateTime ret; - ret.setDate( QDate( broken->tm_year + 1900, broken->tm_mon +1, broken->tm_mday ) ); - ret.setTime( QTime( broken->tm_hour, broken->tm_min, broken->tm_sec ) ); - - return ret; - } - time_t to_Time_t( const QDateTime& utc, const QString& str ) { - QDate d = utc.date(); - QTime t = utc.time(); - - tm broken; - broken.tm_year = d.year() - 1900; - broken.tm_mon = d.month() - 1; - broken.tm_mday = d.day(); - broken.tm_hour = t.hour(); - broken.tm_min = t.minute(); - broken.tm_sec = t.second(); - - QCString org = ::getenv( "TZ" ); -#ifndef Q_OS_MACX // Following line causes bus errors on Mac - ::setenv( "TZ", str.latin1(), true ); - ::tzset(); - - time_t ti = ::mktime( &broken ); - ::setenv( "TZ", org, true ); -#else -#warning "Need a replacement for MacOSX!!" - time_t ti = ::mktime( &broken ); -#endif - return ti; - } -} -OTimeZone::OTimeZone( const ZoneName& zone ) - : m_name(zone) { -} -OTimeZone::~OTimeZone() { -} - -bool OTimeZone::isValid()const { - return !m_name.isEmpty(); -} - -/* - * we will get the current timezone - * and ask it to convert to the timezone date - */ -QDateTime OTimeZone::toLocalDateTime( const QDateTime& dt) { - return OTimeZone::current().toDateTime( dt, *this ); -} -QDateTime OTimeZone::toUTCDateTime( const QDateTime& dt ) { - return OTimeZone::utc().toDateTime( dt, *this ); -} -QDateTime OTimeZone::fromUTCDateTime( time_t t) { - return utcTime( t ); -} -QDateTime OTimeZone::toDateTime( time_t t) { - return utcTime( t, m_name ); -} -/* - * convert dt to utc using zone.m_name - * convert utc -> timeZoneDT using this->m_name - */ -QDateTime OTimeZone::toDateTime( const QDateTime& dt, const OTimeZone& zone ) { - time_t utc = to_Time_t( dt, zone.m_name ); - qWarning("%d %s", utc, zone.m_name.latin1() ); - return utcTime( utc, m_name ); -} -time_t OTimeZone::fromDateTime( const QDateTime& time ) { - return to_Time_t( time, m_name ); -} -time_t OTimeZone::fromUTCDateTime( const QDateTime& time ) { - return to_Time_t( time, "UTC" ); -} -OTimeZone OTimeZone::current() { - QCString str = ::getenv("TZ"); - OTimeZone zone( str ); - return zone; -} -OTimeZone OTimeZone::utc() { - return OTimeZone("UTC"); -} -QString OTimeZone::timeZone()const { - return m_name; -} diff --git a/libopie/pim/otimezone.h b/libopie/pim/otimezone.h deleted file mode 100644 index bb08349..0000000 --- a/libopie/pim/otimezone.h +++ b/dev/null @@ -1,71 +0,0 @@ -#ifndef OPIE_TIME_ZONE_H -#define OPIE_TIME_ZONE_H - -#include <time.h> -#include <qdatetime.h> - -/** - * A very primitive class to convert time - * from one timezone to another - * and to localtime - * and time_t - */ -class OTimeZone { - public: - typedef QString ZoneName; - OTimeZone( const ZoneName& = ZoneName::null ); - virtual ~OTimeZone(); // just in case. - - bool isValid()const; - - /** - * converts the QDateTime to a DateTime - * in the local timezone - * if QDateTime is 25th Jan and takes place in Europe/Berlin at 12h - * and the current timezone is Europe/London the returned - * time will be 11h. - */ - QDateTime toLocalDateTime( const QDateTime& dt ); - - /** - * converts the QDateTime to UTC time - */ - QDateTime toUTCDateTime( const QDateTime& dt ); - - /** - * reads the time_t into a QDateTime using UTC as timezone! - */ - QDateTime fromUTCDateTime( time_t ); - - /** - * converts the time_t to the time in the timezone - */ - QDateTime toDateTime( time_t ); - - /** - * converts the QDateTime from one timezone to this timeZone - */ - QDateTime toDateTime( const QDateTime&, const OTimeZone& timeZone ); - - /** - * converts the date time into a time_t. It takes the timezone into account - */ - time_t fromDateTime( const QDateTime& ); - - /** - * converts the datetime with timezone UTC - */ - time_t fromUTCDateTime( const QDateTime& ); - - static OTimeZone current(); - static OTimeZone utc(); - - QString timeZone()const; - private: - ZoneName m_name; - class Private; - Private* d; -}; - - -#endif diff --git a/libopie/pim/otodo.cpp b/libopie/pim/otodo.cpp deleted file mode 100644 index b2c76f8..0000000 --- a/libopie/pim/otodo.cpp +++ b/dev/null @@ -1,519 +0,0 @@ - -#include <qobject.h> -#include <qshared.h> - - - -#include <qpe/palmtopuidgen.h> -#include <qpe/palmtoprecord.h> -#include <qpe/categories.h> -#include <qpe/categoryselect.h> -#include <qpe/stringutil.h> - - -#include "opimstate.h" -#include "orecur.h" -#include "opimmaintainer.h" -#include "opimnotifymanager.h" -#include "opimresolver.h" - -#include "otodo.h" - - -struct OTodo::OTodoData : public QShared { - OTodoData() : QShared() { - recur = 0; - state = 0; - maintainer = 0; - notifiers = 0; - }; - ~OTodoData() { - delete recur; - delete maintainer; - delete notifiers; - } - - QDate date; - bool isCompleted:1; - bool hasDate:1; - int priority; - QString desc; - QString sum; - QMap<QString, QString> extra; - ushort prog; - OPimState *state; - ORecur *recur; - OPimMaintainer *maintainer; - QDate start; - QDate completed; - OPimNotifyManager *notifiers; -}; - -OTodo::OTodo(const OTodo &event ) - : OPimRecord( event ), data( event.data ) -{ - data->ref(); -// qWarning("ref up"); -} -OTodo::~OTodo() { - -// qWarning("~OTodo " ); - if ( data->deref() ) { -// qWarning("OTodo::dereffing"); - delete data; - data = 0l; - } -} -OTodo::OTodo(bool completed, int priority, - const QArray<int> &category, - const QString& summary, - const QString &description, - ushort progress, - bool hasDate, QDate date, int uid ) - : OPimRecord( uid ) -{ -// qWarning("OTodoData " + summary); - setCategories( category ); - - data = new OTodoData; - - data->date = date; - data->isCompleted = completed; - data->hasDate = hasDate; - data->priority = priority; - data->sum = summary; - data->prog = progress; - data->desc = Qtopia::simplifyMultiLineSpace(description ); -} -OTodo::OTodo(bool completed, int priority, - const QStringList &category, - const QString& summary, - const QString &description, - ushort progress, - bool hasDate, QDate date, int uid ) - : OPimRecord( uid ) -{ -// qWarning("OTodoData" + summary); - setCategories( idsFromString( category.join(";") ) ); - - data = new OTodoData; - - data->date = date; - data->isCompleted = completed; - data->hasDate = hasDate; - data->priority = priority; - data->sum = summary; - data->prog = progress; - data->desc = Qtopia::simplifyMultiLineSpace(description ); -} -bool OTodo::match( const QRegExp ®Exp )const -{ - if( QString::number( data->priority ).find( regExp ) != -1 ){ - setLastHitField( Priority ); - return true; - }else if( data->hasDate && data->date.toString().find( regExp) != -1 ){ - setLastHitField( HasDate ); - return true; - }else if(data->desc.find( regExp ) != -1 ){ - setLastHitField( Description ); - return true; - }else if(data->sum.find( regExp ) != -1 ) { - setLastHitField( Summary ); - return true; - } - return false; -} -bool OTodo::isCompleted() const -{ - return data->isCompleted; -} -bool OTodo::hasDueDate() const -{ - return data->hasDate; -} -bool OTodo::hasStartDate()const { - return data->start.isValid(); -} -bool OTodo::hasCompletedDate()const { - return data->completed.isValid(); -} -int OTodo::priority()const -{ - return data->priority; -} -QString OTodo::summary() const -{ - return data->sum; -} -ushort OTodo::progress() const -{ - return data->prog; -} -QDate OTodo::dueDate()const -{ - return data->date; -} -QDate OTodo::startDate()const { - return data->start; -} -QDate OTodo::completedDate()const { - return data->completed; -} -QString OTodo::description()const -{ - return data->desc; -} -bool OTodo::hasState() const{ - if (!data->state ) return false; - return ( data->state->state() != OPimState::Undefined ); -} -OPimState OTodo::state()const { - if (!data->state ) { - OPimState state; - return state; - } - - return (*data->state); -} -bool OTodo::hasRecurrence()const { - if (!data->recur) return false; - return data->recur->doesRecur(); -} -ORecur OTodo::recurrence()const { - if (!data->recur) return ORecur(); - - return (*data->recur); -} -bool OTodo::hasMaintainer()const { - if (!data->maintainer) return false; - - return (data->maintainer->mode() != OPimMaintainer::Undefined ); -} -OPimMaintainer OTodo::maintainer()const { - if (!data->maintainer) return OPimMaintainer(); - - return (*data->maintainer); -} -void OTodo::setCompleted( bool completed ) -{ - changeOrModify(); - data->isCompleted = completed; -} -void OTodo::setHasDueDate( bool hasDate ) -{ - changeOrModify(); - data->hasDate = hasDate; -} -void OTodo::setDescription(const QString &desc ) -{ -// qWarning( "desc " + desc ); - changeOrModify(); - data->desc = Qtopia::simplifyMultiLineSpace(desc ); -} -void OTodo::setSummary( const QString& sum ) -{ - changeOrModify(); - data->sum = sum; -} -void OTodo::setPriority(int prio ) -{ - changeOrModify(); - data->priority = prio; -} -void OTodo::setDueDate( const QDate& date ) -{ - changeOrModify(); - data->date = date; -} -void OTodo::setStartDate( const QDate& date ) { - changeOrModify(); - data->start = date; -} -void OTodo::setCompletedDate( const QDate& date ) { - changeOrModify(); - data->completed = date; -} -void OTodo::setState( const OPimState& state ) { - changeOrModify(); - if (data->state ) - (*data->state) = state; - else - data->state = new OPimState( state ); -} -void OTodo::setRecurrence( const ORecur& rec) { - changeOrModify(); - if (data->recur ) - (*data->recur) = rec; - else - data->recur = new ORecur( rec ); -} -void OTodo::setMaintainer( const OPimMaintainer& pim ) { - changeOrModify(); - - if (data->maintainer ) - (*data->maintainer) = pim; - else - data->maintainer = new OPimMaintainer( pim ); -} -bool OTodo::isOverdue( ) -{ - if( data->hasDate && !data->isCompleted) - return QDate::currentDate() > data->date; - return false; -} -void OTodo::setProgress(ushort progress ) -{ - changeOrModify(); - data->prog = progress; -} -QString OTodo::toShortText() const { - return summary(); -} -/*! - Returns a richt text string -*/ -QString OTodo::toRichText() const -{ - QString text; - QStringList catlist; - - // summary - text += "<b><h3><img src=\"todo/TodoList\"> "; - if ( !summary().isEmpty() ) { - text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "" ); - } - text += "</h3></b><br><hr><br>"; - - // description - if( !description().isEmpty() ){ - text += "<b>" + QObject::tr( "Description:" ) + "</b><br>"; - text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>"; - } - - // priority - int priorityval = priority(); - text += "<b>" + QObject::tr( "Priority:") +" </b><img src=\"todo/priority" + - QString::number( priorityval ) + "\"> "; - - switch ( priorityval ) - { - case 1 : text += QObject::tr( "Very high" ); - break; - case 2 : text += QObject::tr( "High" ); - break; - case 3 : text += QObject::tr( "Normal" ); - break; - case 4 : text += QObject::tr( "Low" ); - break; - case 5 : text += QObject::tr( "Very low" ); - break; - }; - text += "<br>"; - - // progress - text += "<b>" + QObject::tr( "Progress:") + " </b>" - + QString::number( progress() ) + " %<br>"; - - // due date - if (hasDueDate() ){ - QDate dd = dueDate(); - int off = QDate::currentDate().daysTo( dd ); - - text += "<b>" + QObject::tr( "Deadline:" ) + " </b><font color=\""; - if ( off < 0 ) - text += "#FF0000"; - else if ( off == 0 ) - text += "#FFFF00"; - else if ( off > 0 ) - text += "#00FF00"; - - text += "\">" + dd.toString() + "</font><br>"; - } - - // categories - text += "<b>" + QObject::tr( "Category:") + "</b> "; - text += categoryNames( "Todo List" ).join(", "); - text += "<br>"; - - return text; -} -bool OTodo::hasNotifiers()const { - if (!data->notifiers) return false; - return !data->notifiers->isEmpty(); -} -OPimNotifyManager& OTodo::notifiers() { - if (!data->notifiers ) - data->notifiers = new OPimNotifyManager; - return (*data->notifiers); -} -const OPimNotifyManager& OTodo::notifiers()const{ - if (!data->notifiers ) - data->notifiers = new OPimNotifyManager; - - return (*data->notifiers); -} - -bool OTodo::operator<( const OTodo &toDoEvent )const{ - if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; - if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; - if( hasDueDate() && toDoEvent.hasDueDate() ){ - if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide - return priority() < toDoEvent.priority(); - }else{ - return dueDate() < toDoEvent.dueDate(); - } - } - return false; -} -bool OTodo::operator<=(const OTodo &toDoEvent )const -{ - if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; - if( !hasDueDate() && toDoEvent.hasDueDate() ) return true; - if( hasDueDate() && toDoEvent.hasDueDate() ){ - if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide - return priority() <= toDoEvent.priority(); - }else{ - return dueDate() <= toDoEvent.dueDate(); - } - } - return true; -} -bool OTodo::operator>(const OTodo &toDoEvent )const -{ - if( !hasDueDate() && !toDoEvent.hasDueDate() ) return false; - if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; - if( hasDueDate() && toDoEvent.hasDueDate() ){ - if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide - return priority() > toDoEvent.priority(); - }else{ - return dueDate() > toDoEvent.dueDate(); - } - } - return false; -} -bool OTodo::operator>=(const OTodo &toDoEvent )const -{ - if( !hasDueDate() && !toDoEvent.hasDueDate() ) return true; - if( !hasDueDate() && toDoEvent.hasDueDate() ) return false; - if( hasDueDate() && toDoEvent.hasDueDate() ){ - if( dueDate() == toDoEvent.dueDate() ){ // let's the priority decide - return priority() > toDoEvent.priority(); - }else{ - return dueDate() > toDoEvent.dueDate(); - } - } - return true; -} -bool OTodo::operator==(const OTodo &toDoEvent )const -{ - if ( data->priority != toDoEvent.data->priority ) return false; - if ( data->priority != toDoEvent.data->prog ) return false; - if ( data->isCompleted != toDoEvent.data->isCompleted ) return false; - if ( data->hasDate != toDoEvent.data->hasDate ) return false; - if ( data->date != toDoEvent.data->date ) return false; - if ( data->sum != toDoEvent.data->sum ) return false; - if ( data->desc != toDoEvent.data->desc ) return false; - if ( data->maintainer != toDoEvent.data->maintainer ) - return false; - - return OPimRecord::operator==( toDoEvent ); -} -void OTodo::deref() { - -// qWarning("deref in ToDoEvent"); - if ( data->deref() ) { -// qWarning("deleting"); - delete data; - data= 0; - } -} -OTodo &OTodo::operator=(const OTodo &item ) -{ - if ( this == &item ) return *this; - - OPimRecord::operator=( item ); - //qWarning("operator= ref "); - item.data->ref(); - deref(); - data = item.data; - - return *this; -} - -QMap<int, QString> OTodo::toMap() const { - QMap<int, QString> map; - - map.insert( Uid, QString::number( uid() ) ); - map.insert( Category, idsToString( categories() ) ); - map.insert( HasDate, QString::number( data->hasDate ) ); - map.insert( Completed, QString::number( data->isCompleted ) ); - map.insert( Description, data->desc ); - map.insert( Summary, data->sum ); - map.insert( Priority, QString::number( data->priority ) ); - map.insert( DateDay, QString::number( data->date.day() ) ); - map.insert( DateMonth, QString::number( data->date.month() ) ); - map.insert( DateYear, QString::number( data->date.year() ) ); - map.insert( Progress, QString::number( data->prog ) ); -// map.insert( CrossReference, crossToString() ); - /* FIXME!!! map.insert( State, ); - map.insert( Recurrence, ); - map.insert( Reminders, ); - map. - */ - return map; -} - -/** - * change or modify looks at the ref count and either - * creates a new QShared Object or it can modify it - * right in place - */ -void OTodo::changeOrModify() { - if ( data->count != 1 ) { - qWarning("changeOrModify"); - data->deref(); - OTodoData* d2 = new OTodoData(); - copy(data, d2 ); - data = d2; - } -} -// WATCHOUT -/* - * if you add something to the Data struct - * be sure to copy it here - */ -void OTodo::copy( OTodoData* src, OTodoData* dest ) { - dest->date = src->date; - dest->isCompleted = src->isCompleted; - dest->hasDate = src->hasDate; - dest->priority = src->priority; - dest->desc = src->desc; - dest->sum = src->sum; - dest->extra = src->extra; - dest->prog = src->prog; - - if (src->state ) - dest->state = new OPimState( *src->state ); - - if (src->recur ) - dest->recur = new ORecur( *src->recur ); - - if (src->maintainer ) - dest->maintainer = new OPimMaintainer( *src->maintainer ) - ; - dest->start = src->start; - dest->completed = src->completed; - - if (src->notifiers ) - dest->notifiers = new OPimNotifyManager( *src->notifiers ); -} -QString OTodo::type() const { - return QString::fromLatin1("OTodo"); -} -QString OTodo::recordField(int /*id*/ )const { - return QString::null; -} - -int OTodo::rtti(){ - return OPimResolver::TodoList; -} diff --git a/libopie/pim/otodo.h b/libopie/pim/otodo.h deleted file mode 100644 index 6df98b9..0000000 --- a/libopie/pim/otodo.h +++ b/dev/null @@ -1,285 +0,0 @@ - -#ifndef OPIE_TODO_EVENT_H -#define OPIE_TODO_EVENT_H - - -#include <qarray.h> -#include <qmap.h> -#include <qregexp.h> -#include <qstringlist.h> -#include <qdatetime.h> -#include <qvaluelist.h> - -#include <qpe/recordfields.h> -#include <qpe/palmtopuidgen.h> - -#include <opie/opimrecord.h> - - -class OPimState; -class ORecur; -class OPimMaintainer; -class OPimNotifyManager; -class OTodo : public OPimRecord { -public: - typedef QValueList<OTodo> ValueList; - enum RecordFields { - Uid = Qtopia::UID_ID, - Category = Qtopia::CATEGORY_ID, - HasDate, - Completed, - Description, - Summary, - Priority, - DateDay, - DateMonth, - DateYear, - Progress, - CrossReference, - State, - Recurrence, - Alarms, - Reminders, - Notifiers, - Maintainer, - StartDate, - CompletedDate - }; - public: - // priorities from Very low to very high - enum TaskPriority { VeryHigh=1, High, Normal, Low, VeryLow }; - - /* Constructs a new ToDoEvent - @param completed Is the TodoEvent completed - @param priority What is the priority of this ToDoEvent - @param category Which category does it belong( uid ) - @param summary A small summary of the todo - @param description What is this ToDoEvent about - @param hasDate Does this Event got a deadline - @param date what is the deadline? - @param uid what is the UUID of this Event - **/ - OTodo( bool completed = false, int priority = Normal, - const QStringList &category = QStringList(), - const QString &summary = QString::null , - const QString &description = QString::null, - ushort progress = 0, - bool hasDate = false, QDate date = QDate::currentDate(), - int uid = 0 /*empty*/ ); - - OTodo( bool completed, int priority, - const QArray<int>& category, - const QString& summary = QString::null, - const QString& description = QString::null, - ushort progress = 0, - bool hasDate = false, QDate date = QDate::currentDate(), - int uid = 0 /* empty */ ); - - /** Copy c'tor - * - */ - OTodo(const OTodo & ); - - /** - *destructor - */ - ~OTodo(); - - /** - * Is this event completed? - */ - bool isCompleted() const; - - /** - * Does this Event have a deadline - */ - bool hasDueDate() const; - bool hasStartDate()const; - bool hasCompletedDate()const; - - /** - * What is the priority? - */ - int priority()const ; - - /** - * progress as ushort 0, 20, 40, 60, 80 or 100% - */ - ushort progress() const; - - /** - * The due Date - */ - QDate dueDate()const; - - /** - * When did it start? - */ - QDate startDate()const; - - /** - * When was it completed? - */ - QDate completedDate()const; - - /** - * does it have a state? - */ - bool hasState()const; - - /** - * What is the state of this OTodo? - */ - OPimState state()const; - - /** - * has recurrence? - */ - bool hasRecurrence()const; - - /** - * the recurrance of this - */ - ORecur recurrence()const; - - /** - * does this OTodo have a maintainer? - */ - bool hasMaintainer()const; - - /** - * the Maintainer of this OTodo - */ - OPimMaintainer maintainer()const; - - /** - * The description of the todo - */ - QString description()const; - - /** - * A small summary of the todo - */ - QString summary() const; - - /** - * @reimplemented - * Return this todoevent in a RichText formatted QString - */ - QString toRichText() const; - - bool hasNotifiers()const; - /* - * FIXME check if the sharing is still fine!! -zecke - * ### CHECK If API is fine - */ - /** - * return a reference to our notifiers... - */ - OPimNotifyManager ¬ifiers(); - - /** - * - */ - const OPimNotifyManager ¬ifiers()const; - - /** - * reimplementations - */ - QString type()const; - QString toShortText()const; - QString recordField(int id )const; - - /** - * toMap puts all data into the map. int relates - * to ToDoEvent RecordFields enum - */ - QMap<int, QString> toMap()const; - - /** - * Set if this Todo is completed - */ - void setCompleted(bool completed ); - - /** - * set if this todo got an end data - */ - void setHasDueDate( bool hasDate ); - // FIXME we do not have these for start, completed - // cause we'll use the isNull() of QDate for figuring - // out if it's has a date... - // decide what to do here? -zecke - - /** - * Set the priority of the Todo - */ - void setPriority(int priority ); - - /** - * Set the progress. - */ - void setProgress( ushort progress ); - - /** - * set the end date - */ - void setDueDate( const QDate& date ); - - /** - * set the start date - */ - void setStartDate( const QDate& date ); - - /** - * set the completed date - */ - void setCompletedDate( const QDate& date ); - - void setRecurrence( const ORecur& ); - - void setDescription(const QString& ); - void setSummary(const QString& ); - - /** - * set the state of a Todo - * @param state State what the todo should take - */ - void setState( const OPimState& state); - - /** - * set the Maintainer Mode - */ - void setMaintainer( const OPimMaintainer& ); - - bool isOverdue(); - - - virtual bool match( const QRegExp &r )const; - - bool operator<(const OTodo &toDoEvent )const; - bool operator<=(const OTodo &toDoEvent )const; - bool operator!=(const OTodo &toDoEvent )const; - bool operator>(const OTodo &toDoEvent )const; - bool operator>=(const OTodo &toDoEvent)const; - bool operator==(const OTodo &toDoEvent )const; - OTodo &operator=(const OTodo &toDoEvent ); - - static int rtti(); - - private: - class OTodoPrivate; - struct OTodoData; - - void deref(); - inline void changeOrModify(); - void copy( OTodoData* src, OTodoData* dest ); - OTodoPrivate *d; - OTodoData *data; - -}; -inline bool OTodo::operator!=(const OTodo &toDoEvent )const { - return !(*this == toDoEvent); -} - - -#endif diff --git a/libopie/pim/otodoaccess.cpp b/libopie/pim/otodoaccess.cpp deleted file mode 100644 index 37f6fbc..0000000 --- a/libopie/pim/otodoaccess.cpp +++ b/dev/null @@ -1,62 +0,0 @@ -#include <qdatetime.h> - -#include <qpe/alarmserver.h> - -// #include "otodoaccesssql.h" -#include "otodoaccess.h" -#include "obackendfactory.h" - -OTodoAccess::OTodoAccess( OTodoAccessBackend* end, enum Access ) - : QObject(), OPimAccessTemplate<OTodo>( end ), m_todoBackEnd( end ) -{ -// if (end == 0l ) -// m_todoBackEnd = new OTodoAccessBackendSQL( QString::null); - - // Zecke: Du musst hier noch für das XML-Backend einen Appnamen übergeben ! - if (end == 0l ) - m_todoBackEnd = OBackendFactory<OTodoAccessBackend>::Default ("todo", QString::null); - - setBackEnd( m_todoBackEnd ); -} -OTodoAccess::~OTodoAccess() { -// qWarning("~OTodoAccess"); -} -void OTodoAccess::mergeWith( const QValueList<OTodo>& list ) { - QValueList<OTodo>::ConstIterator it; - for ( it = list.begin(); it != list.end(); ++it ) { - replace( (*it) ); - } -} -OTodoAccess::List OTodoAccess::effectiveToDos( const QDate& start, - const QDate& end, - bool includeNoDates ) { - QArray<int> ints = m_todoBackEnd->effectiveToDos( start, end, includeNoDates ); - - List lis( ints, this ); - return lis; -} -OTodoAccess::List OTodoAccess::effectiveToDos( const QDate& start, - bool includeNoDates ) { - return effectiveToDos( start, QDate::currentDate(), - includeNoDates ); -} -OTodoAccess::List OTodoAccess::overDue() { - List lis( m_todoBackEnd->overDue(), this ); - return lis; -} -/* sort order */ -OTodoAccess::List OTodoAccess::sorted( bool ascending, int sort,int filter, int cat ) { - QArray<int> ints = m_todoBackEnd->sorted( ascending, sort, - filter, cat ); - OTodoAccess::List list( ints, this ); - return list; -} -void OTodoAccess::removeAllCompleted() { - m_todoBackEnd->removeAllCompleted(); -} -QBitArray OTodoAccess::backendSupport( const QString& ) const{ - return m_todoBackEnd->supports(); -} -bool OTodoAccess::backendSupports( int attr, const QString& ar) const{ - return backendSupport(ar).testBit( attr ); -} diff --git a/libopie/pim/otodoaccess.h b/libopie/pim/otodoaccess.h deleted file mode 100644 index 916923f..0000000 --- a/libopie/pim/otodoaccess.h +++ b/dev/null @@ -1,105 +0,0 @@ -#ifndef OPIE_TODO_ACCESS_H -#define OPIE_TODO_ACCESS_H - -#include <qobject.h> -#include <qvaluelist.h> - -#include "otodo.h" -#include "otodoaccessbackend.h" -#include "opimaccesstemplate.h" - - -/** - * OTodoAccess - * the class to get access to - * the todolist - */ -class OTodoAccess : public QObject, public OPimAccessTemplate<OTodo> { - Q_OBJECT -public: - enum SortOrder { Completed = 0, - Priority, - Description, - Deadline }; - enum SortFilter{ Category =1, - OnlyOverDue= 2, - DoNotShowCompleted =4 }; - /** - * if you use 0l - * the default resource will be - * picked up - */ - OTodoAccess( OTodoAccessBackend* = 0l, enum Access acc = Random ); - ~OTodoAccess(); - - - /* our functions here */ - /** - * include todos from start to end - * includeNoDates whether or not to include - * events with no dates - */ - List effectiveToDos( const QDate& start, - const QDate& end, - bool includeNoDates = true ); - - /** - * start - * end date taken from the currentDate() - */ - List effectiveToDos( const QDate& start, - bool includeNoDates = true ); - - - /** - * return overdue OTodos - */ - List overDue(); - - /** - * - */ - List sorted( bool ascending, int sortOrder, int sortFilter, int cat ); - - /** - * merge a list of OTodos into - * the resource - */ - void mergeWith( const QValueList<OTodo>& ); - - /** - * delete all already completed items - */ - void removeAllCompleted(); - - /** - * request information about what a backend supports. - * Supports in the sense of beeing able to store. - * This is related to the enum in OTodo - * - * @param backend Will be used in the future when we support multiple backend - */ - QBitArray backendSupport( const QString& backend = QString::null )const; - - /** - * see above but for a specefic attribute. This method was added for convience - * @param attr The attribute to be queried for - * @param backend Will be used in the future when we support multiple backends - */ - bool backendSupports( int attr, const QString& backend = QString::null )const; -signals: - /** - * if the OTodoAccess was changed - */ - void changed( const OTodoAccess* ); - void changed( const OTodoAccess*, int uid ); - void added( const OTodoAccess*, int uid ); - void removed( const OTodoAccess*, int uid ); -private: - int m_cat; - OTodoAccessBackend* m_todoBackEnd; - class OTodoAccessPrivate; - OTodoAccessPrivate* d; -}; - -#endif diff --git a/libopie/pim/otodoaccessbackend.cpp b/libopie/pim/otodoaccessbackend.cpp deleted file mode 100644 index baaeecc..0000000 --- a/libopie/pim/otodoaccessbackend.cpp +++ b/dev/null @@ -1,10 +0,0 @@ - -#include "otodoaccessbackend.h" - -OTodoAccessBackend::OTodoAccessBackend() - : OPimAccessBackend<OTodo>() -{ -} -OTodoAccessBackend::~OTodoAccessBackend() { - -} diff --git a/libopie/pim/otodoaccessbackend.h b/libopie/pim/otodoaccessbackend.h deleted file mode 100644 index 6be95bc..0000000 --- a/libopie/pim/otodoaccessbackend.h +++ b/dev/null @@ -1,28 +0,0 @@ -#ifndef OPIE_TODO_ACCESS_BACKEND_H -#define OPIE_TODO_ACCESS_BACKEND_H - -#include <qbitarray.h> - -#include "otodo.h" -#include "opimaccessbackend.h" - -class OTodoAccessBackend : public OPimAccessBackend<OTodo> { -public: - OTodoAccessBackend(); - ~OTodoAccessBackend(); - virtual QArray<int> effectiveToDos( const QDate& start, - const QDate& end, - bool includeNoDates ) = 0; - virtual QArray<int> overDue() = 0; - virtual QArray<int> sorted( bool asc, int sortOrder, int sortFilter, - int cat ) = 0; - virtual void removeAllCompleted() = 0; - virtual QBitArray supports()const = 0; - -private: - class Private; - Private *d; - -}; - -#endif diff --git a/libopie/pim/otodoaccesssql.cpp b/libopie/pim/otodoaccesssql.cpp deleted file mode 100644 index fd01a42..0000000 --- a/libopie/pim/otodoaccesssql.cpp +++ b/dev/null @@ -1,694 +0,0 @@ - -#include <qdatetime.h> - -#include <qpe/global.h> - -#include <opie2/osqldriver.h> -#include <opie2/osqlresult.h> -#include <opie2/osqlmanager.h> -#include <opie2/osqlquery.h> - -#include "otodoaccesssql.h" -#include "opimstate.h" -#include "opimnotifymanager.h" -#include "orecur.h" - -using namespace Opie::DB; -/* - * first some query - * CREATE query - * LOAD query - * INSERT - * REMOVE - * CLEAR - */ -namespace { - /** - * CreateQuery for the Todolist Table - */ - class CreateQuery : public OSQLQuery { - public: - CreateQuery(); - ~CreateQuery(); - QString query()const; - }; - - /** - * LoadQuery - * this one queries for all uids - */ - class LoadQuery : public OSQLQuery { - public: - LoadQuery(); - ~LoadQuery(); - QString query()const; - }; - - /** - * inserts/adds a OTodo to the table - */ - class InsertQuery : public OSQLQuery { - public: - InsertQuery(const OTodo& ); - ~InsertQuery(); - QString query()const; - private: - OTodo m_todo; - }; - - /** - * removes one from the table - */ - class RemoveQuery : public OSQLQuery { - public: - RemoveQuery(int uid ); - ~RemoveQuery(); - QString query()const; - private: - int m_uid; - }; - - /** - * Clears (delete) a Table - */ - class ClearQuery : public OSQLQuery { - public: - ClearQuery(); - ~ClearQuery(); - QString query()const; - - }; - - /** - * a find query - */ - class FindQuery : public OSQLQuery { - public: - FindQuery(int uid); - FindQuery(const QArray<int>& ); - ~FindQuery(); - QString query()const; - private: - QString single()const; - QString multi()const; - QArray<int> m_uids; - int m_uid; - }; - - /** - * overdue query - */ - class OverDueQuery : public OSQLQuery { - public: - OverDueQuery(); - ~OverDueQuery(); - QString query()const; - }; - class EffQuery : public OSQLQuery { - public: - EffQuery( const QDate&, const QDate&, bool inc ); - ~EffQuery(); - QString query()const; - private: - QString with()const; - QString out()const; - QDate m_start; - QDate m_end; - bool m_inc :1; - }; - - - CreateQuery::CreateQuery() : OSQLQuery() {} - CreateQuery::~CreateQuery() {} - QString CreateQuery::query()const { - QString qu; - qu += "create table todolist( uid PRIMARY KEY, categories, completed, "; - qu += "description, summary, priority, DueDate, progress , state, "; - // This is the recurrance-stuff .. Exceptions are currently not supported (see ORecur.cpp) ! (eilers) - qu += "RType, RWeekdays, RPosition, RFreq, RHasEndDate, EndDate, Created, Exceptions, "; - qu += "reminders, alarms, maintainer, startdate, completeddate);"; - qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR(10), value VARCHAR(10), PRIMARY KEY /* identifier */ (uid, id) );"; - return qu; - } - - LoadQuery::LoadQuery() : OSQLQuery() {} - LoadQuery::~LoadQuery() {} - QString LoadQuery::query()const { - QString qu; - // We do not need "distinct" here. The primary key is always unique.. - //qu += "select distinct uid from todolist"; - qu += "select uid from todolist"; - - return qu; - } - - InsertQuery::InsertQuery( const OTodo& todo ) - : OSQLQuery(), m_todo( todo ) { - } - InsertQuery::~InsertQuery() { - } - /* - * converts from a OTodo to a query - * we leave out X-Ref + Alarms - */ - QString InsertQuery::query()const{ - - int year, month, day; - year = month = day = 0; - if (m_todo.hasDueDate() ) { - QDate date = m_todo.dueDate(); - year = date.year(); - month = date.month(); - day = date.day(); - } - int sYear = 0, sMonth = 0, sDay = 0; - if( m_todo.hasStartDate() ){ - QDate sDate = m_todo.startDate(); - sYear = sDate.year(); - sMonth= sDate.month(); - sDay = sDate.day(); - } - - int eYear = 0, eMonth = 0, eDay = 0; - if( m_todo.hasCompletedDate() ){ - QDate eDate = m_todo.completedDate(); - eYear = eDate.year(); - eMonth= eDate.month(); - eDay = eDate.day(); - } - QString qu; - QMap<int, QString> recMap = m_todo.recurrence().toMap(); - qu = "insert into todolist VALUES(" - + QString::number( m_todo.uid() ) + "," - + "'" + m_todo.idsToString( m_todo.categories() ) + "'" + "," - + QString::number( m_todo.isCompleted() ) + "," - + "'" + m_todo.description() + "'" + "," - + "'" + m_todo.summary() + "'" + "," - + QString::number(m_todo.priority() ) + "," - + "'" + QString::number(year) + "-" - + QString::number(month) - + "-" + QString::number( day ) + "'" + "," - + QString::number( m_todo.progress() ) + "," - + QString::number( m_todo.state().state() ) + "," - + "'" + recMap[ ORecur::RType ] + "'" + "," - + "'" + recMap[ ORecur::RWeekdays ] + "'" + "," - + "'" + recMap[ ORecur::RPosition ] + "'" + "," - + "'" + recMap[ ORecur::RFreq ] + "'" + "," - + "'" + recMap[ ORecur::RHasEndDate ] + "'" + "," - + "'" + recMap[ ORecur::EndDate ] + "'" + "," - + "'" + recMap[ ORecur::Created ] + "'" + "," - + "'" + recMap[ ORecur::Exceptions ] + "'" + ","; - - if ( m_todo.hasNotifiers() ) { - OPimNotifyManager manager = m_todo.notifiers(); - qu += "'" + manager.remindersToString() + "'" + "," - + "'" + manager.alarmsToString() + "'" + ","; - } - else{ - qu += QString( "''" ) + "," - + "''" + ","; - } - - qu += QString( "''" ) + QString( "," ) // Maintainers (cur. not supported !) - + "'" + QString::number(sYear) + "-" - + QString::number(sMonth) - + "-" + QString::number(sDay) + "'" + "," - + "'" + QString::number(eYear) + "-" - + QString::number(eMonth) - + "-"+QString::number(eDay) + "'" - + ")"; - - qWarning("add %s", qu.latin1() ); - return qu; - } - - RemoveQuery::RemoveQuery(int uid ) - : OSQLQuery(), m_uid( uid ) {} - RemoveQuery::~RemoveQuery() {} - QString RemoveQuery::query()const { - QString qu = "DELETE from todolist where uid = " + QString::number(m_uid); - return qu; - } - - - ClearQuery::ClearQuery() - : OSQLQuery() {} - ClearQuery::~ClearQuery() {} - QString ClearQuery::query()const { - QString qu = "drop table todolist"; - return qu; - } - FindQuery::FindQuery(int uid) - : OSQLQuery(), m_uid(uid ) { - } - FindQuery::FindQuery(const QArray<int>& ints) - : OSQLQuery(), m_uids(ints){ - } - FindQuery::~FindQuery() { - } - QString FindQuery::query()const{ - if (m_uids.count() == 0 ) - return single(); - else - return multi(); - } - QString FindQuery::single()const{ - QString qu = "select * from todolist where uid = " + QString::number(m_uid); - return qu; - } - QString FindQuery::multi()const { - QString qu = "select * from todolist where "; - for (uint i = 0; i < m_uids.count(); i++ ) { - qu += " UID = " + QString::number( m_uids[i] ) + " OR"; - } - qu.remove( qu.length()-2, 2 ); - return qu; - } - - OverDueQuery::OverDueQuery(): OSQLQuery() {} - OverDueQuery::~OverDueQuery() {} - QString OverDueQuery::query()const { - QDate date = QDate::currentDate(); - QString str; - str = QString("select uid from todolist where DueDate ='%1-%2-%3'").arg(date.year() ).arg(date.month() ).arg(date.day() ); - - return str; - } - - - EffQuery::EffQuery( const QDate& start, const QDate& end, bool inc ) - : OSQLQuery(), m_start( start ), m_end( end ),m_inc(inc) {} - EffQuery::~EffQuery() {} - QString EffQuery::query()const { - return m_inc ? with() : out(); - } - QString EffQuery::with()const { - QString str; - str = QString("select uid from todolist where ( DueDate >= '%1-%2-%3' AND DueDate <= '%4-%5-%6' ) OR DueDate = '0-0-0' ") - .arg( m_start.year() ).arg( m_start.month() ).arg( m_start.day() ) - .arg( m_end .year() ).arg( m_end .month() ).arg( m_end .day() ); - return str; - } - QString EffQuery::out()const { - QString str; - str = QString("select uid from todolist where DueDate >= '%1-%2-%3' AND DueDate <= '%4-%5-%6'") - .arg(m_start.year() ).arg(m_start.month() ).arg( m_start.day() ) - .arg(m_end. year() ).arg(m_end. month() ).arg(m_end.day() ); - - return str; - } -}; - -OTodoAccessBackendSQL::OTodoAccessBackendSQL( const QString& file ) - : OTodoAccessBackend(), m_dict(15), m_driver(NULL), m_dirty(true) -{ - QString fi = file; - if ( fi.isEmpty() ) - fi = Global::applicationFileName( "todolist", "todolist.db" ); - OSQLManager man; - m_driver = man.standard(); - m_driver->setUrl(fi); - // fillDict(); -} - -OTodoAccessBackendSQL::~OTodoAccessBackendSQL(){ - if( m_driver ) - delete m_driver; -} - -bool OTodoAccessBackendSQL::load(){ - if (!m_driver->open() ) - return false; - - CreateQuery creat; - OSQLResult res = m_driver->query(&creat ); - - m_dirty = true; - return true; -} -bool OTodoAccessBackendSQL::reload(){ - return load(); -} - -bool OTodoAccessBackendSQL::save(){ - return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers) -} -QArray<int> OTodoAccessBackendSQL::allRecords()const { - if (m_dirty ) - update(); - - return m_uids; -} -QArray<int> OTodoAccessBackendSQL::queryByExample( const OTodo& , int, const QDateTime& ){ - QArray<int> ints(0); - return ints; -} -OTodo OTodoAccessBackendSQL::find(int uid ) const{ - FindQuery query( uid ); - return todo( m_driver->query(&query) ); - -} -OTodo OTodoAccessBackendSQL::find( int uid, const QArray<int>& ints, - uint cur, Frontend::CacheDirection dir ) const{ - uint CACHE = readAhead(); - qWarning("searching for %d", uid ); - QArray<int> search( CACHE ); - uint size =0; - OTodo to; - - // we try to cache CACHE items - switch( dir ) { - /* forward */ - case 0: // FIXME: Not a good style to use magic numbers here (eilers) - for (uint i = cur; i < ints.count() && size < CACHE; i++ ) { - qWarning("size %d %d", size, ints[i] ); - search[size] = ints[i]; - size++; - } - break; - /* reverse */ - case 1: // FIXME: Not a good style to use magic numbers here (eilers) - for (uint i = cur; i != 0 && size < CACHE; i-- ) { - search[size] = ints[i]; - size++; - } - break; - } - search.resize( size ); - FindQuery query( search ); - OSQLResult res = m_driver->query( &query ); - if ( res.state() != OSQLResult::Success ) - return to; - - return todo( res ); -} -void OTodoAccessBackendSQL::clear() { - ClearQuery cle; - OSQLResult res = m_driver->query( &cle ); - CreateQuery qu; - res = m_driver->query(&qu); -} -bool OTodoAccessBackendSQL::add( const OTodo& t) { - InsertQuery ins( t ); - OSQLResult res = m_driver->query( &ins ); - - if ( res.state() == OSQLResult::Failure ) - return false; - int c = m_uids.count(); - m_uids.resize( c+1 ); - m_uids[c] = t.uid(); - - return true; -} -bool OTodoAccessBackendSQL::remove( int uid ) { - RemoveQuery rem( uid ); - OSQLResult res = m_driver->query(&rem ); - - if ( res.state() == OSQLResult::Failure ) - return false; - - m_dirty = true; - return true; -} -/* - * FIXME better set query - * but we need the cache for that - * now we remove - */ -bool OTodoAccessBackendSQL::replace( const OTodo& t) { - remove( t.uid() ); - bool b= add(t); - m_dirty = false; // we changed some stuff but the UID stayed the same - return b; -} -QArray<int> OTodoAccessBackendSQL::overDue() { - OverDueQuery qu; - return uids( m_driver->query(&qu ) ); -} -QArray<int> OTodoAccessBackendSQL::effectiveToDos( const QDate& s, - const QDate& t, - bool u) { - EffQuery ef(s, t, u ); - return uids (m_driver->query(&ef) ); -} -/* - * - */ -QArray<int> OTodoAccessBackendSQL::sorted( bool asc, int sortOrder, - int sortFilter, int cat ) { - qWarning("sorted %d, %d", asc, sortOrder ); - QString query; - query = "select uid from todolist WHERE "; - - /* - * Sort Filter stuff - * not that straight forward - * FIXME: Replace magic numbers - * - */ - /* Category */ - if ( sortFilter & 1 ) { - QString str; - if (cat != 0 ) str = QString::number( cat ); - query += " categories like '%" +str+"%' AND"; - } - /* Show only overdue */ - if ( sortFilter & 2 ) { - QDate date = QDate::currentDate(); - QString due; - QString base; - base = QString("DueDate <= '%1-%2-%3' AND completed = 0").arg( date.year() ).arg( date.month() ).arg( date.day() ); - query += " " + base + " AND"; - } - /* not show completed */ - if ( sortFilter & 4 ) { - query += " completed = 0 AND"; - }else{ - query += " ( completed = 1 OR completed = 0) AND"; - } - /* srtip the end */ - query = query.remove( query.length()-3, 3 ); - - - /* - * sort order stuff - * quite straight forward - */ - query += "ORDER BY "; - switch( sortOrder ) { - /* completed */ - case 0: - query += "completed"; - break; - case 1: - query += "priority"; - break; - case 2: - query += "summary"; - break; - case 3: - query += "DueDate"; - break; - } - - if ( !asc ) { - qWarning("not ascending!"); - query += " DESC"; - } - - qWarning( query ); - OSQLRawQuery raw(query ); - return uids( m_driver->query(&raw) ); -} -bool OTodoAccessBackendSQL::date( QDate& da, const QString& str ) const{ - if ( str == "0-0-0" ) - return false; - else{ - int day, year, month; - QStringList list = QStringList::split("-", str ); - year = list[0].toInt(); - month = list[1].toInt(); - day = list[2].toInt(); - da.setYMD( year, month, day ); - return true; - } -} -OTodo OTodoAccessBackendSQL::todo( const OSQLResult& res) const{ - if ( res.state() == OSQLResult::Failure ) { - OTodo to; - return to; - } - - OSQLResultItem::ValueList list = res.results(); - OSQLResultItem::ValueList::Iterator it = list.begin(); - qWarning("todo1"); - OTodo to = todo( (*it) ); - cache( to ); - ++it; - - for ( ; it != list.end(); ++it ) { - qWarning("caching"); - cache( todo( (*it) ) ); - } - return to; -} -OTodo OTodoAccessBackendSQL::todo( OSQLResultItem& item )const { - qWarning("todo"); - bool hasDueDate = false; QDate dueDate = QDate::currentDate(); - hasDueDate = date( dueDate, item.data("DueDate") ); - QStringList cats = QStringList::split(";", item.data("categories") ); - - qWarning("Item is completed: %d", item.data("completed").toInt() ); - - OTodo to( (bool)item.data("completed").toInt(), item.data("priority").toInt(), - cats, item.data("summary"), item.data("description"), - item.data("progress").toUShort(), hasDueDate, dueDate, - item.data("uid").toInt() ); - - bool isOk; - int prioInt = QString( item.data("priority") ).toInt( &isOk ); - if ( isOk ) - to.setPriority( prioInt ); - - bool hasStartDate = false; QDate startDate = QDate::currentDate(); - hasStartDate = date( startDate, item.data("startdate") ); - bool hasCompletedDate = false; QDate completedDate = QDate::currentDate(); - hasCompletedDate = date( completedDate, item.data("completeddate") ); - - if ( hasStartDate ) - to.setStartDate( startDate ); - if ( hasCompletedDate ) - to.setCompletedDate( completedDate ); - - OPimNotifyManager& manager = to.notifiers(); - manager.alarmsFromString( item.data("alarms") ); - manager.remindersFromString( item.data("reminders") ); - - OPimState pimState; - pimState.setState( QString( item.data("state") ).toInt() ); - to.setState( pimState ); - - QMap<int, QString> recMap; - recMap.insert( ORecur::RType , item.data("RType") ); - recMap.insert( ORecur::RWeekdays , item.data("RWeekdays") ); - recMap.insert( ORecur::RPosition , item.data("RPosition") ); - recMap.insert( ORecur::RFreq , item.data("RFreq") ); - recMap.insert( ORecur::RHasEndDate, item.data("RHasEndDate") ); - recMap.insert( ORecur::EndDate , item.data("EndDate") ); - recMap.insert( ORecur::Created , item.data("Created") ); - recMap.insert( ORecur::Exceptions , item.data("Exceptions") ); - - ORecur recur; - recur.fromMap( recMap ); - to.setRecurrence( recur ); - - return to; -} -OTodo OTodoAccessBackendSQL::todo( int uid )const { - FindQuery find( uid ); - return todo( m_driver->query(&find) ); -} -/* - * update the dict - */ -void OTodoAccessBackendSQL::fillDict() { - /* initialize dict */ - /* - * UPDATE dict if you change anything!!! - * FIXME: Isn't this dict obsolete ? (eilers) - */ - m_dict.setAutoDelete( TRUE ); - m_dict.insert("Categories" , new int(OTodo::Category) ); - m_dict.insert("Uid" , new int(OTodo::Uid) ); - m_dict.insert("HasDate" , new int(OTodo::HasDate) ); - m_dict.insert("Completed" , new int(OTodo::Completed) ); - m_dict.insert("Description" , new int(OTodo::Description) ); - m_dict.insert("Summary" , new int(OTodo::Summary) ); - m_dict.insert("Priority" , new int(OTodo::Priority) ); - m_dict.insert("DateDay" , new int(OTodo::DateDay) ); - m_dict.insert("DateMonth" , new int(OTodo::DateMonth) ); - m_dict.insert("DateYear" , new int(OTodo::DateYear) ); - m_dict.insert("Progress" , new int(OTodo::Progress) ); - m_dict.insert("Completed", new int(OTodo::Completed) ); // Why twice ? (eilers) - m_dict.insert("CrossReference", new int(OTodo::CrossReference) ); -// m_dict.insert("HasAlarmDateTime",new int(OTodo::HasAlarmDateTime) ); // old stuff (eilers) -// m_dict.insert("AlarmDateTime", new int(OTodo::AlarmDateTime) ); // old stuff (eilers) -} -/* - * need to be const so let's fool the - * compiler :( - */ -void OTodoAccessBackendSQL::update()const { - ((OTodoAccessBackendSQL*)this)->m_dirty = false; - LoadQuery lo; - OSQLResult res = m_driver->query(&lo); - if ( res.state() != OSQLResult::Success ) - return; - - ((OTodoAccessBackendSQL*)this)->m_uids = uids( res ); -} -QArray<int> OTodoAccessBackendSQL::uids( const OSQLResult& res) const{ - - OSQLResultItem::ValueList list = res.results(); - OSQLResultItem::ValueList::Iterator it; - QArray<int> ints(list.count() ); - qWarning(" count = %d", list.count() ); - - int i = 0; - for (it = list.begin(); it != list.end(); ++it ) { - ints[i] = (*it).data("uid").toInt(); - i++; - } - return ints; -} - -QArray<int> OTodoAccessBackendSQL::matchRegexp( const QRegExp &r ) const -{ - -#warning OTodoAccessBackendSQL::matchRegexp() not implemented !! - -#if 0 - - Copied from xml-backend by not adapted to sql (eilers) - - QArray<int> m_currentQuery( m_events.count() ); - uint arraycounter = 0; - - - - QMap<int, OTodo>::ConstIterator it; - for (it = m_events.begin(); it != m_events.end(); ++it ) { - if ( it.data().match( r ) ) - m_currentQuery[arraycounter++] = it.data().uid(); - - } - // Shrink to fit.. - m_currentQuery.resize(arraycounter); - - return m_currentQuery; -#endif - QArray<int> empty; - return empty; -} -QBitArray OTodoAccessBackendSQL::supports()const { - - return sup(); -} - -QBitArray OTodoAccessBackendSQL::sup() const{ - - QBitArray ar( OTodo::CompletedDate + 1 ); - ar.fill( true ); - ar[OTodo::CrossReference] = false; - ar[OTodo::State ] = false; - ar[OTodo::Reminders] = false; - ar[OTodo::Notifiers] = false; - ar[OTodo::Maintainer] = false; - - return ar; -} - -void OTodoAccessBackendSQL::removeAllCompleted(){ -#warning OTodoAccessBackendSQL::removeAllCompleted() not implemented !! - -} diff --git a/libopie/pim/otodoaccesssql.h b/libopie/pim/otodoaccesssql.h deleted file mode 100644 index 72214de..0000000 --- a/libopie/pim/otodoaccesssql.h +++ b/dev/null @@ -1,61 +0,0 @@ -#ifndef OPIE_PIM_ACCESS_SQL_H -#define OPIE_PIM_ACCESS_SQL_H - -#include <qasciidict.h> - -#include "otodoaccessbackend.h" - -namespace Opie{ -namespace DB { -class OSQLDriver; -class OSQLResult; -class OSQLResultItem; -} -} - -class OTodoAccessBackendSQL : public OTodoAccessBackend { -public: - OTodoAccessBackendSQL( const QString& file ); - ~OTodoAccessBackendSQL(); - - bool load(); - bool reload(); - bool save(); - QArray<int> allRecords()const; - - QArray<int> queryByExample( const OTodo& t, int settings, const QDateTime& d = QDateTime() ); - OTodo find(int uid)const; - OTodo find(int uid, const QArray<int>&, uint cur, Frontend::CacheDirection )const; - void clear(); - bool add( const OTodo& t ); - bool remove( int uid ); - bool replace( const OTodo& t ); - - QArray<int> overDue(); - QArray<int> effectiveToDos( const QDate& start, - const QDate& end, bool includeNoDates ); - QArray<int> sorted(bool asc, int sortOrder, int sortFilter, int cat ); - - QBitArray supports()const; - QArray<int> matchRegexp( const QRegExp &r ) const; - void removeAllCompleted(); - - -private: - void update()const; - void fillDict(); - inline bool date( QDate& date, const QString& )const; - inline OTodo todo( const Opie::DB::OSQLResult& )const; - inline OTodo todo( Opie::DB::OSQLResultItem& )const; - inline QArray<int> uids( const Opie::DB::OSQLResult& )const; - OTodo todo( int uid )const; - QBitArray sup() const; - - QAsciiDict<int> m_dict; - Opie::DB::OSQLDriver* m_driver; - QArray<int> m_uids; - bool m_dirty : 1; -}; - - -#endif diff --git a/libopie/pim/otodoaccessvcal.cpp b/libopie/pim/otodoaccessvcal.cpp deleted file mode 100644 index 6415952..0000000 --- a/libopie/pim/otodoaccessvcal.cpp +++ b/dev/null @@ -1,249 +0,0 @@ -#include <qfile.h> - -#include <qtopia/private/vobject_p.h> -#include <qtopia/timeconversion.h> -#include <qtopia/private/qfiledirect_p.h> - -#include "otodoaccessvcal.h" - -namespace { - static OTodo eventByVObj( VObject *obj ){ - OTodo event; - VObject *ob; - QCString name; - // no uid, attendees, ... and no fun - // description - if( ( ob = isAPropertyOf( obj, VCDescriptionProp )) != 0 ){ - name = vObjectStringZValue( ob ); -#if 0 - event.setDescription( name ); -#else - event.setSummary( name ); -#endif - } - // summary - if ( ( ob = isAPropertyOf( obj, VCSummaryProp ) ) != 0 ) { - name = vObjectStringZValue( ob ); -#if 0 - event.setSummary( name ); -#else - event.setDescription( name ); -#endif - } - // completed - if( ( ob = isAPropertyOf( obj, VCStatusProp )) != 0 ){ - name = vObjectStringZValue( ob ); - if( name == "COMPLETED" ){ - event.setCompleted( true ); - }else{ - event.setCompleted( false ); - } - }else - event.setCompleted( false ); - // priority - if ((ob = isAPropertyOf(obj, VCPriorityProp))) { - name = vObjectStringZValue( ob ); - bool ok; - event.setPriority(name.toInt(&ok) ); - } - //due date - if((ob = isAPropertyOf(obj, VCDueProp)) ){ - event.setHasDueDate( true ); - name = vObjectStringZValue( ob ); - event.setDueDate( TimeConversion::fromISO8601( name).date() ); - } - // categories - if((ob = isAPropertyOf( obj, VCCategoriesProp )) != 0 ){ - name = vObjectStringZValue( ob ); - qWarning("Categories:%s", name.data() ); - } - - event.setUid( 1 ); - return event; - }; - static VObject *vobjByEvent( const OTodo &event ) { - VObject *task = newVObject( VCTodoProp ); - if( task == 0 ) - return 0l; - - if( event.hasDueDate() ) { - QTime time(0, 0, 0); - QDateTime date(event.dueDate(), time ); - addPropValue( task, VCDueProp, - TimeConversion::toISO8601( date ) ); - } - - if( event.isCompleted() ) - addPropValue( task, VCStatusProp, "COMPLETED"); - - QString string = QString::number(event.priority() ); - addPropValue( task, VCPriorityProp, string.local8Bit() ); - - addPropValue( task, VCCategoriesProp, - event.idsToString( event.categories() ).local8Bit() ); - -#if 0 - - // There seems a misrepresentation between summary in otodoevent - // and summary in vcard. - // The same with description.. - // Description is summary and vice versa.. Argh.. (eilers) - - - addPropValue( task, VCDescriptionProp, - event.description().local8Bit() ); - - addPropValue( task, VCSummaryProp, - event.summary().local8Bit() ); - -#else - addPropValue( task, VCDescriptionProp, - event.summary().local8Bit() ); - - addPropValue( task, VCSummaryProp, - event.description().local8Bit() ); -#endif - return task; -}; -} - -OTodoAccessVCal::OTodoAccessVCal( const QString& path ) - : m_dirty(false), m_file( path ) -{ -} -OTodoAccessVCal::~OTodoAccessVCal() { -} -bool OTodoAccessVCal::load() { - m_map.clear(); - m_dirty = false; - - VObject* vcal = 0l; - vcal = Parse_MIME_FromFileName( QFile::encodeName(m_file).data() ); - if (!vcal ) - return false; - - // Iterate over the list - VObjectIterator it; - VObject* vobj; - - initPropIterator(&it, vcal); - - while( moreIteration( &it ) ) { - vobj = ::nextVObject( &it ); - QCString name = ::vObjectName( vobj ); - if( name == VCTodoProp ){ - OTodo to = eventByVObj( vobj ); - m_map.insert( to.uid(), to ); - } - } - - // Should I do a delete vcal? - - return true; -} -bool OTodoAccessVCal::reload() { - return load(); -} -bool OTodoAccessVCal::save() { - if (!m_dirty ) - return true; - - QFileDirect file( m_file ); - if (!file.open(IO_WriteOnly ) ) - return false; - - VObject *obj; - obj = newVObject( VCCalProp ); - addPropValue( obj, VCVersionProp, "1.0" ); - VObject *vo; - for(QMap<int, OTodo>::ConstIterator it=m_map.begin(); it !=m_map.end(); ++it ){ - vo = vobjByEvent( it.data() ); - addVObjectProp(obj, vo ); - } - writeVObject( file.directHandle(), obj ); - cleanVObject( obj ); - cleanStrTbl(); - - m_dirty = false; - return true; -} -void OTodoAccessVCal::clear() { - m_map.clear(); - m_dirty = true; -} -bool OTodoAccessVCal::add( const OTodo& to ) { - m_map.insert( to.uid(), to ); - m_dirty = true; - return true; -} -bool OTodoAccessVCal::remove( int uid ) { - m_map.remove( uid ); - m_dirty = true; - return true; -} -void OTodoAccessVCal::removeAllCompleted() { - for ( QMap<int, OTodo>::Iterator it = m_map.begin(); it != m_map.end(); ++it ) { - if ( (*it).isCompleted() ) - m_map.remove( it ); - } -} -bool OTodoAccessVCal::replace( const OTodo& to ) { - m_map.replace( to.uid(), to ); - m_dirty = true; - return true; -} -OTodo OTodoAccessVCal::find(int uid )const { - return m_map[uid]; -} -QArray<int> OTodoAccessVCal::sorted( bool, int, int, int ) { - QArray<int> ar(0); - return ar; -} -QArray<int> OTodoAccessVCal::allRecords()const { - QArray<int> ar( m_map.count() ); - QMap<int, OTodo>::ConstIterator it; - int i = 0; - for ( it = m_map.begin(); it != m_map.end(); ++it ) { - ar[i] = it.key(); - i++; - } - return ar; -} -QArray<int> OTodoAccessVCal::matchRegexp(const QRegExp& /* r */)const { - QArray<int> ar(0); - return ar; -} -QArray<int> OTodoAccessVCal::queryByExample( const OTodo&, int, const QDateTime& ) { - QArray<int> ar(0); - return ar; -} -QArray<int> OTodoAccessVCal::effectiveToDos( const QDate& , - const QDate& , - bool ) { - QArray<int> ar(0); - return ar; -} -QArray<int> OTodoAccessVCal::overDue() { - QArray<int> ar(0); - return ar; -} -QBitArray OTodoAccessVCal::supports()const { - static QBitArray ar = sup(); - - return ar; -} -QBitArray OTodoAccessVCal::sup() { - QBitArray ar ( OTodo::CompletedDate +1 ); - ar.fill( true ); - - ar[OTodo::CrossReference] = false; - ar[OTodo::State ] = false; - ar[OTodo::Reminders] = false; - ar[OTodo::Notifiers] = false; - ar[OTodo::Maintainer] = false; - ar[OTodo::Progress] = false; - ar[OTodo::Alarms ] = false; - ar[OTodo::Recurrence] = false; - - return ar; -} diff --git a/libopie/pim/otodoaccessvcal.h b/libopie/pim/otodoaccessvcal.h deleted file mode 100644 index 2b17147..0000000 --- a/libopie/pim/otodoaccessvcal.h +++ b/dev/null @@ -1,40 +0,0 @@ -#ifndef OPIE_OTODO_ACCESS_VCAL_H -#define OPIE_OTODO_ACCESS_VCAL_H - -#include "otodoaccessbackend.h" - -class OTodoAccessVCal : public OTodoAccessBackend { -public: - OTodoAccessVCal(const QString& ); - ~OTodoAccessVCal(); - - bool load(); - bool reload(); - bool save(); - - QArray<int> allRecords()const; - QArray<int> matchRegexp(const QRegExp &r) const; - QArray<int> queryByExample( const OTodo& t, int sort, const QDateTime& d = QDateTime() ); - QArray<int> effectiveToDos( const QDate& start, - const QDate& end, - bool includeNoDates ); - QArray<int> overDue(); - QArray<int> sorted( bool asc, int sortOrder, int sortFilter, - int cat ); - OTodo find(int uid)const; - void clear(); - bool add( const OTodo& ); - bool remove( int uid ); - bool replace( const OTodo& ); - - void removeAllCompleted(); - virtual QBitArray supports()const; - -private: - static QBitArray sup(); - bool m_dirty : 1; - QString m_file; - QMap<int, OTodo> m_map; -}; - -#endif diff --git a/libopie/pim/otodoaccessxml.cpp b/libopie/pim/otodoaccessxml.cpp deleted file mode 100644 index 4a5cb33..0000000 --- a/libopie/pim/otodoaccessxml.cpp +++ b/dev/null @@ -1,876 +0,0 @@ -#include <errno.h> -#include <fcntl.h> - -#include <sys/mman.h> -#include <sys/stat.h> -#include <sys/types.h> - -#include <unistd.h> - - -#include <qfile.h> -#include <qvector.h> - -#include <qpe/global.h> -#include <qpe/stringutil.h> -#include <qpe/timeconversion.h> - -#include "oconversion.h" -#include "opimstate.h" -#include "otimezone.h" -#include "opimnotifymanager.h" -#include "orecur.h" -#include "otodoaccessxml.h" - -namespace { - time_t rp_end; - ORecur* rec; - ORecur *recur() { - if (!rec ) rec = new ORecur; - return rec; - } - int snd; - enum MoreAttributes { - FRType = OTodo::CompletedDate + 2, - FRWeekdays, - FRPosition, - FRFreq, - FRHasEndDate, - FREndDate, - FRStart, - FREnd - }; - // FROM TT again -char *strstrlen(const char *haystack, int hLen, const char* needle, int nLen) -{ - char needleChar; - char haystackChar; - if (!needle || !haystack || !hLen || !nLen) - return 0; - - const char* hsearch = haystack; - - if ((needleChar = *needle++) != 0) { - nLen--; //(to make up for needle++) - do { - do { - if ((haystackChar = *hsearch++) == 0) - return (0); - if (hsearch >= haystack + hLen) - return (0); - } while (haystackChar != needleChar); - } while (strncmp(hsearch, needle, QMIN(hLen - (hsearch - haystack), nLen)) != 0); - hsearch--; - } - return ((char *)hsearch); -} -} - - -OTodoAccessXML::OTodoAccessXML( const QString& appName, - const QString& fileName ) - : OTodoAccessBackend(), m_app( appName ), m_opened( false ), m_changed( false ) -{ - if (!fileName.isEmpty() ) - m_file = fileName; - else - m_file = Global::applicationFileName( "todolist", "todolist.xml" ); -} -OTodoAccessXML::~OTodoAccessXML() { - -} -bool OTodoAccessXML::load() { - rec = 0; - m_opened = true; - m_changed = false; - /* initialize dict */ - /* - * UPDATE dict if you change anything!!! - */ - QAsciiDict<int> dict(26); - dict.setAutoDelete( TRUE ); - dict.insert("Categories" , new int(OTodo::Category) ); - dict.insert("Uid" , new int(OTodo::Uid) ); - dict.insert("HasDate" , new int(OTodo::HasDate) ); - dict.insert("Completed" , new int(OTodo::Completed) ); - dict.insert("Description" , new int(OTodo::Description) ); - dict.insert("Summary" , new int(OTodo::Summary) ); - dict.insert("Priority" , new int(OTodo::Priority) ); - dict.insert("DateDay" , new int(OTodo::DateDay) ); - dict.insert("DateMonth" , new int(OTodo::DateMonth) ); - dict.insert("DateYear" , new int(OTodo::DateYear) ); - dict.insert("Progress" , new int(OTodo::Progress) ); - dict.insert("CompletedDate", new int(OTodo::CompletedDate) ); - dict.insert("StartDate", new int(OTodo::StartDate) ); - dict.insert("CrossReference", new int(OTodo::CrossReference) ); - dict.insert("State", new int(OTodo::State) ); - dict.insert("Alarms", new int(OTodo::Alarms) ); - dict.insert("Reminders", new int(OTodo::Reminders) ); - dict.insert("Notifiers", new int(OTodo::Notifiers) ); - dict.insert("Maintainer", new int(OTodo::Maintainer) ); - dict.insert("rtype", new int(FRType) ); - dict.insert("rweekdays", new int(FRWeekdays) ); - dict.insert("rposition", new int(FRPosition) ); - dict.insert("rfreq", new int(FRFreq) ); - dict.insert("start", new int(FRStart) ); - dict.insert("rhasenddate", new int(FRHasEndDate) ); - dict.insert("enddt", new int(FREndDate) ); - - // here the custom XML parser from TT it's GPL - // but we want to push OpiePIM... to TT..... - // mmap part from zecke :) - int fd = ::open( QFile::encodeName(m_file).data(), O_RDONLY ); - struct stat attribut; - if ( fd < 0 ) return false; - - if ( fstat(fd, &attribut ) == -1 ) { - ::close( fd ); - return false; - } - void* map_addr = ::mmap(NULL, attribut.st_size, PROT_READ, MAP_SHARED, fd, 0 ); - if ( map_addr == ( (caddr_t)-1) ) { - ::close(fd ); - return false; - } - /* advise the kernel who we want to read it */ - ::madvise( map_addr, attribut.st_size, MADV_SEQUENTIAL ); - /* we do not the file any more */ - ::close( fd ); - - char* dt = (char*)map_addr; - int len = attribut.st_size; - int i = 0; - char *point; - const char* collectionString = "<Task "; - int strLen = strlen(collectionString); - while ( ( point = strstrlen( dt+i, len -i, collectionString, strLen ) ) != 0l ) { - i = point -dt; - i+= strLen; - qWarning("Found a start at %d %d", i, (point-dt) ); - - OTodo ev; - m_year = m_month = m_day = 0; - - while ( TRUE ) { - while ( i < len && (dt[i] == ' ' || dt[i] == '\n' || dt[i] == '\r') ) - ++i; - if ( i >= len-2 || (dt[i] == '/' && dt[i+1] == '>') ) - break; - - // we have another attribute, read it. - int j = i; - while ( j < len && dt[j] != '=' ) - ++j; - QCString attr( dt+i, j-i+1); - - i = ++j; // skip = - - // find the start of quotes - while ( i < len && dt[i] != '"' ) - ++i; - j = ++i; - - bool haveUtf = FALSE; - bool haveEnt = FALSE; - while ( j < len && dt[j] != '"' ) { - if ( ((unsigned char)dt[j]) > 0x7f ) - haveUtf = TRUE; - if ( dt[j] == '&' ) - haveEnt = TRUE; - ++j; - } - if ( i == j ) { - // empty value - i = j + 1; - continue; - } - - QCString value( dt+i, j-i+1 ); - i = j + 1; - - QString str = (haveUtf ? QString::fromUtf8( value ) - : QString::fromLatin1( value ) ); - if ( haveEnt ) - str = Qtopia::plainString( str ); - - /* - * add key + value - */ - todo( &dict, ev, attr, str ); - - } - /* - * now add it - */ - qWarning("End at %d", i ); - if (m_events.contains( ev.uid() ) || ev.uid() == 0) { - ev.setUid( 1 ); - m_changed = true; - } - if ( ev.hasDueDate() ) { - ev.setDueDate( QDate(m_year, m_month, m_day) ); - } - if ( rec && rec->doesRecur() ) { - OTimeZone utc = OTimeZone::utc(); - ORecur recu( *rec ); // call copy c'tor - recu.setEndDate( utc.fromUTCDateTime( rp_end ).date() ); - recu.setStart( ev.dueDate() ); - ev.setRecurrence( recu ); - } - m_events.insert(ev.uid(), ev ); - m_year = m_month = m_day = -1; - delete rec; - rec = 0; - } - - munmap(map_addr, attribut.st_size ); - - qWarning("counts %d records loaded!", m_events.count() ); - return true; -} -bool OTodoAccessXML::reload() { - m_events.clear(); - return load(); -} -bool OTodoAccessXML::save() { -// qWarning("saving"); - if (!m_opened || !m_changed ) { -// qWarning("not saving"); - return true; - } - QString strNewFile = m_file + ".new"; - QFile f( strNewFile ); - if (!f.open( IO_WriteOnly|IO_Raw ) ) - return false; - - int written; - QString out; - out = "<!DOCTYPE Tasks>\n<Tasks>\n"; - - // for all todos - QMap<int, OTodo>::Iterator it; - for (it = m_events.begin(); it != m_events.end(); ++it ) { - out+= "<Task " + toString( (*it) ) + " />\n"; - QCString cstr = out.utf8(); - written = f.writeBlock( cstr.data(), cstr.length() ); - - /* less written then we wanted */ - if ( written != (int)cstr.length() ) { - f.close(); - QFile::remove( strNewFile ); - return false; - } - out = QString::null; - } - - out += "</Tasks>"; - QCString cstr = out.utf8(); - written = f.writeBlock( cstr.data(), cstr.length() ); - - if ( written != (int)cstr.length() ) { - f.close(); - QFile::remove( strNewFile ); - return false; - } - /* flush before renaming */ - f.close(); - - if( ::rename( strNewFile.latin1(), m_file.latin1() ) < 0 ) { -// qWarning("error renaming"); - QFile::remove( strNewFile ); - } - - m_changed = false; - return true; -} -QArray<int> OTodoAccessXML::allRecords()const { - QArray<int> ids( m_events.count() ); - QMap<int, OTodo>::ConstIterator it; - int i = 0; - - for ( it = m_events.begin(); it != m_events.end(); ++it ) { - ids[i] = it.key(); - i++; - } - return ids; -} -QArray<int> OTodoAccessXML::queryByExample( const OTodo&, int, const QDateTime& ) { - QArray<int> ids(0); - return ids; -} -OTodo OTodoAccessXML::find( int uid )const { - OTodo todo; - todo.setUid( 0 ); // isEmpty() - QMap<int, OTodo>::ConstIterator it = m_events.find( uid ); - if ( it != m_events.end() ) - todo = it.data(); - - return todo; -} -void OTodoAccessXML::clear() { - if (m_opened ) - m_changed = true; - - m_events.clear(); -} -bool OTodoAccessXML::add( const OTodo& todo ) { -// qWarning("add"); - m_changed = true; - m_events.insert( todo.uid(), todo ); - - return true; -} -bool OTodoAccessXML::remove( int uid ) { - m_changed = true; - m_events.remove( uid ); - - return true; -} -bool OTodoAccessXML::replace( const OTodo& todo) { - m_changed = true; - m_events.replace( todo.uid(), todo ); - - return true; -} -QArray<int> OTodoAccessXML::effectiveToDos( const QDate& start, - const QDate& end, - bool includeNoDates ) { - QArray<int> ids( m_events.count() ); - QMap<int, OTodo>::Iterator it; - - int i = 0; - for ( it = m_events.begin(); it != m_events.end(); ++it ) { - if ( !it.data().hasDueDate() ) { - if ( includeNoDates ) { - ids[i] = it.key(); - i++; - } - }else if ( it.data().dueDate() >= start && - it.data().dueDate() <= end ) { - ids[i] = it.key(); - i++; - } - } - ids.resize( i ); - return ids; -} -QArray<int> OTodoAccessXML::overDue() { - QArray<int> ids( m_events.count() ); - int i = 0; - - QMap<int, OTodo>::Iterator it; - for ( it = m_events.begin(); it != m_events.end(); ++it ) { - if ( it.data().isOverdue() ) { - ids[i] = it.key(); - i++; - } - } - ids.resize( i ); - return ids; -} - - -/* private */ -void OTodoAccessXML::todo( QAsciiDict<int>* dict, OTodo& ev, - const QCString& attr, const QString& val) { -// qWarning("parse to do from XMLElement" ); - - int *find=0; - - find = (*dict)[ attr.data() ]; - if (!find ) { -// qWarning("Unknown option" + it.key() ); - ev.setCustomField( attr, val ); - return; - } - - switch( *find ) { - case OTodo::Uid: - ev.setUid( val.toInt() ); - break; - case OTodo::Category: - ev.setCategories( ev.idsFromString( val ) ); - break; - case OTodo::HasDate: - ev.setHasDueDate( val.toInt() ); - break; - case OTodo::Completed: - ev.setCompleted( val.toInt() ); - break; - case OTodo::Description: - ev.setDescription( val ); - break; - case OTodo::Summary: - ev.setSummary( val ); - break; - case OTodo::Priority: - ev.setPriority( val.toInt() ); - break; - case OTodo::DateDay: - m_day = val.toInt(); - break; - case OTodo::DateMonth: - m_month = val.toInt(); - break; - case OTodo::DateYear: - m_year = val.toInt(); - break; - case OTodo::Progress: - ev.setProgress( val.toInt() ); - break; - case OTodo::CompletedDate: - ev.setCompletedDate( OConversion::dateFromString( val ) ); - break; - case OTodo::StartDate: - ev.setStartDate( OConversion::dateFromString( val ) ); - break; - case OTodo::State: - ev.setState( val.toInt() ); - break; - case OTodo::Alarms:{ - OPimNotifyManager &manager = ev.notifiers(); - QStringList als = QStringList::split(";", val ); - for (QStringList::Iterator it = als.begin(); it != als.end(); ++it ) { - QStringList alarm = QStringList::split(":", (*it), TRUE ); // allow empty - qWarning("alarm: %s", alarm.join("___").latin1() ); - qWarning("alarm[0]: %s %s", alarm[0].latin1(), OConversion::dateTimeFromString( alarm[0] ).toString().latin1() ); - OPimAlarm al( alarm[2].toInt(), OConversion::dateTimeFromString( alarm[0] ), alarm[1].toInt() ); - manager.add( al ); - } - } - break; - case OTodo::Reminders:{ - OPimNotifyManager &manager = ev.notifiers(); - QStringList rems = QStringList::split(";", val ); - for (QStringList::Iterator it = rems.begin(); it != rems.end(); ++it ) { - OPimReminder rem( (*it).toInt() ); - manager.add( rem ); - } - } - break; - case OTodo::CrossReference: - { - /* - * A cross refernce looks like - * appname,id;appname,id - * we need to split it up - */ - QStringList refs = QStringList::split(';', val ); - QStringList::Iterator strIt; - for (strIt = refs.begin(); strIt != refs.end(); ++strIt ) { - int pos = (*strIt).find(','); - if ( pos > -1 ) - ; // ev.addRelation( (*strIt).left(pos), (*strIt).mid(pos+1).toInt() ); - - } - break; - } - /* Recurrence stuff below + post processing later */ - case FRType: - if ( val == "Daily" ) - recur()->setType( ORecur::Daily ); - else if ( val == "Weekly" ) - recur()->setType( ORecur::Weekly); - else if ( val == "MonthlyDay" ) - recur()->setType( ORecur::MonthlyDay ); - else if ( val == "MonthlyDate" ) - recur()->setType( ORecur::MonthlyDate ); - else if ( val == "Yearly" ) - recur()->setType( ORecur::Yearly ); - else - recur()->setType( ORecur::NoRepeat ); - break; - case FRWeekdays: - recur()->setDays( val.toInt() ); - break; - case FRPosition: - recur()->setPosition( val.toInt() ); - break; - case FRFreq: - recur()->setFrequency( val.toInt() ); - break; - case FRHasEndDate: - recur()->setHasEndDate( val.toInt() ); - break; - case FREndDate: { - rp_end = (time_t) val.toLong(); - break; - } - default: - ev.setCustomField( attr, val ); - break; - } -} - -// from PalmtopRecord... GPL ### FIXME -namespace { -QString customToXml(const QMap<QString, QString>& customMap ) -{ - //qWarning(QString("writing custom %1").arg(customMap.count())); - QString buf(" "); - for ( QMap<QString, QString>::ConstIterator cit = customMap.begin(); - cit != customMap.end(); ++cit) { -// qWarning(".ITEM."); - buf += cit.key(); - buf += "=\""; - buf += Qtopia::escapeString(cit.data()); - buf += "\" "; - } - return buf; -} - - -} - -QString OTodoAccessXML::toString( const OTodo& ev )const { - QString str; - - str += "Completed=\"" + QString::number( ev.isCompleted() ) + "\" "; - str += "HasDate=\"" + QString::number( ev.hasDueDate() ) + "\" "; - str += "Priority=\"" + QString::number( ev.priority() ) + "\" "; - str += "Progress=\"" + QString::number(ev.progress() ) + "\" "; - - str += "Categories=\"" + toString( ev.categories() ) + "\" "; - str += "Description=\"" + Qtopia::escapeString( ev.description() ) + "\" "; - str += "Summary=\"" + Qtopia::escapeString( ev.summary() ) + "\" "; - - if ( ev.hasDueDate() ) { - str += "DateYear=\"" + QString::number( ev.dueDate().year() ) + "\" "; - str += "DateMonth=\"" + QString::number( ev.dueDate().month() ) + "\" "; - str += "DateDay=\"" + QString::number( ev.dueDate().day() ) + "\" "; - } -// qWarning( "Uid %d", ev.uid() ); - str += "Uid=\"" + QString::number( ev.uid() ) + "\" "; - -// append the extra options - /* FIXME Qtopia::Record this is currently not - * possible you can set custom fields - * but don' iterate over the list - * I may do #define private protected - * for this case - cough --zecke - */ - /* - QMap<QString, QString> extras = ev.extras(); - QMap<QString, QString>::Iterator extIt; - for (extIt = extras.begin(); extIt != extras.end(); ++extIt ) - str += extIt.key() + "=\"" + extIt.data() + "\" "; - */ - // cross refernce - if ( ev.hasRecurrence() ) { - str += ev.recurrence().toString(); - } - if ( ev.hasStartDate() ) - str += "StartDate=\""+ OConversion::dateToString( ev.startDate() ) +"\" "; - if ( ev.hasCompletedDate() ) - str += "CompletedDate=\""+ OConversion::dateToString( ev.completedDate() ) +"\" "; - if ( ev.hasState() ) - str += "State=\""+QString::number( ev.state().state() )+"\" "; - - /* - * save reminders and notifiers! - * DATE_TIME:DURATION:SOUND:NOT_USED_YET;OTHER_DATE_TIME:OTHER_DURATION:SOUND:.... - */ - if ( ev.hasNotifiers() ) { - OPimNotifyManager manager = ev.notifiers(); - OPimNotifyManager::Alarms alarms = manager.alarms(); - if (!alarms.isEmpty() ) { - QStringList als; - OPimNotifyManager::Alarms::Iterator it = alarms.begin(); - for ( ; it != alarms.end(); ++it ) { - /* only if time is valid */ - if ( (*it).dateTime().isValid() ) { - als << OConversion::dateTimeToString( (*it).dateTime() ) - + ":" + QString::number( (*it).duration() ) - + ":" + QString::number( (*it).sound() ) - + ":"; - } - } - // now write the list - qWarning("als: %s", als.join("____________").latin1() ); - str += "Alarms=\""+als.join(";") +"\" "; - } - - /* - * now the same for reminders but more easy. We just save the uid of the OEvent. - */ - OPimNotifyManager::Reminders reminders = manager.reminders(); - if (!reminders.isEmpty() ) { - OPimNotifyManager::Reminders::Iterator it = reminders.begin(); - QStringList records; - for ( ; it != reminders.end(); ++it ) { - records << QString::number( (*it).recordUid() ); - } - str += "Reminders=\""+ records.join(";") +"\" "; - } - } - str += customToXml( ev.toExtraMap() ); - - - return str; -} -QString OTodoAccessXML::toString( const QArray<int>& ints ) const { - return Qtopia::Record::idsToString( ints ); -} - -/* internal class for sorting - * - * Inspired by todoxmlio.cpp from TT - */ - -struct OTodoXMLContainer { - OTodo todo; -}; - -namespace { - inline QString string( const OTodo& todo) { - return todo.summary().isEmpty() ? - todo.description().left(20 ) : - todo.summary(); - } - inline int completed( const OTodo& todo1, const OTodo& todo2) { - int ret = 0; - if ( todo1.isCompleted() ) ret++; - if ( todo2.isCompleted() ) ret--; - return ret; - } - inline int priority( const OTodo& t1, const OTodo& t2) { - return ( t1.priority() - t2.priority() ); - } - inline int description( const OTodo& t1, const OTodo& t2) { - return QString::compare( string(t1), string(t2) ); - } - inline int deadline( const OTodo& t1, const OTodo& t2) { - int ret = 0; - if ( t1.hasDueDate() && - t2.hasDueDate() ) - ret = t2.dueDate().daysTo( t1.dueDate() ); - else if ( t1.hasDueDate() ) - ret = -1; - else if ( t2.hasDueDate() ) - ret = 1; - else - ret = 0; - - return ret; - } - -}; - -/* - * Returns: - * 0 if item1 == item2 - * - * non-zero if item1 != item2 - * - * This function returns int rather than bool so that reimplementations - * can return one of three values and use it to sort by: - * - * 0 if item1 == item2 - * - * > 0 (positive integer) if item1 > item2 - * - * < 0 (negative integer) if item1 < item2 - * - */ -class OTodoXMLVector : public QVector<OTodoXMLContainer> { -public: - OTodoXMLVector(int size, bool asc, int sort) - : QVector<OTodoXMLContainer>( size ) - { - setAutoDelete( true ); - m_asc = asc; - m_sort = sort; - } - /* return the summary/description */ - QString string( const OTodo& todo) { - return todo.summary().isEmpty() ? - todo.description().left(20 ) : - todo.summary(); - } - /** - * we take the sortorder( switch on it ) - * - */ - int compareItems( Item d1, Item d2 ) { - bool seComp, sePrio, seDesc, seDeadline; - seComp = sePrio = seDeadline = seDesc = false; - int ret =0; - OTodoXMLContainer* con1 = (OTodoXMLContainer*)d1; - OTodoXMLContainer* con2 = (OTodoXMLContainer*)d2; - - /* same item */ - if ( con1->todo.uid() == con2->todo.uid() ) - return 0; - - switch ( m_sort ) { - /* completed */ - case 0: { - ret = completed( con1->todo, con2->todo ); - seComp = TRUE; - break; - } - /* priority */ - case 1: { - ret = priority( con1->todo, con2->todo ); - sePrio = TRUE; - break; - } - /* description */ - case 2: { - ret = description( con1->todo, con2->todo ); - seDesc = TRUE; - break; - } - /* deadline */ - case 3: { - ret = deadline( con1->todo, con2->todo ); - seDeadline = TRUE; - break; - } - default: - ret = 0; - break; - }; - /* - * FIXME do better sorting if the first sort criteria - * ret equals 0 start with complete and so on... - */ - - /* twist it we're not ascending*/ - if (!m_asc) - ret = ret * -1; - - if ( ret ) - return ret; - - // default did not gave difference let's try it other way around - /* - * General try if already checked if not test - * and return - * 1.Completed - * 2.Priority - * 3.Description - * 4.DueDate - */ - if (!seComp ) { - if ( (ret = completed( con1->todo, con2->todo ) ) ) { - if (!m_asc ) ret *= -1; - return ret; - } - } - if (!sePrio ) { - if ( (ret = priority( con1->todo, con2->todo ) ) ) { - if (!m_asc ) ret *= -1; - return ret; - } - } - if (!seDesc ) { - if ( (ret = description(con1->todo, con2->todo ) ) ) { - if (!m_asc) ret *= -1; - return ret; - } - } - if (!seDeadline) { - if ( (ret = deadline( con1->todo, con2->todo ) ) ) { - if (!m_asc) ret *= -1; - return ret; - } - } - - return 0; - } - private: - bool m_asc; - int m_sort; - -}; - -QArray<int> OTodoAccessXML::sorted( bool asc, int sortOrder, - int sortFilter, int cat ) { - OTodoXMLVector vector(m_events.count(), asc,sortOrder ); - QMap<int, OTodo>::Iterator it; - int item = 0; - - bool bCat = sortFilter & 1 ? true : false; - bool bOnly = sortFilter & 2 ? true : false; - bool comp = sortFilter & 4 ? true : false; - for ( it = m_events.begin(); it != m_events.end(); ++it ) { - - /* show category */ - /* -1 == unfiled */ - if ( bCat && cat == -1 ) { - if(!(*it).categories().isEmpty() ) - continue; - }else if ( bCat && cat != 0) - if (!(*it).categories().contains( cat ) ) { - continue; - } - /* isOverdue but we should not show overdue - why?*/ -/* if ( (*it).isOverdue() && !bOnly ) { - qWarning("item is overdue but !bOnly"); - continue; - } -*/ - if ( !(*it).isOverdue() && bOnly ) { - continue; - } - - if ((*it).isCompleted() && comp ) { - continue; - } - - - OTodoXMLContainer* con = new OTodoXMLContainer(); - con->todo = (*it); - vector.insert(item, con ); - item++; - } - vector.resize( item ); - /* sort it now */ - vector.sort(); - /* now get the uids */ - QArray<int> array( vector.count() ); - for (uint i= 0; i < vector.count(); i++ ) { - array[i] = ( vector.at(i) )->todo.uid(); - } - return array; -}; -void OTodoAccessXML::removeAllCompleted() { - QMap<int, OTodo> events = m_events; - for ( QMap<int, OTodo>::Iterator it = m_events.begin(); it != m_events.end(); ++it ) { - if ( (*it).isCompleted() ) - events.remove( it.key() ); - } - m_events = events; -} -QBitArray OTodoAccessXML::supports()const { - static QBitArray ar = sup(); - return ar; -} -QBitArray OTodoAccessXML::sup() { - QBitArray ar( OTodo::CompletedDate +1 ); - ar.fill( true ); - ar[OTodo::CrossReference] = false; - ar[OTodo::State ] = false; - ar[OTodo::Reminders] = false; - ar[OTodo::Notifiers] = false; - ar[OTodo::Maintainer] = false; - - return ar; -} -QArray<int> OTodoAccessXML::matchRegexp( const QRegExp &r ) const -{ - QArray<int> m_currentQuery( m_events.count() ); - uint arraycounter = 0; - - QMap<int, OTodo>::ConstIterator it; - for (it = m_events.begin(); it != m_events.end(); ++it ) { - if ( it.data().match( r ) ) - m_currentQuery[arraycounter++] = it.data().uid(); - - } - // Shrink to fit.. - m_currentQuery.resize(arraycounter); - - return m_currentQuery; -} diff --git a/libopie/pim/otodoaccessxml.h b/libopie/pim/otodoaccessxml.h deleted file mode 100644 index e4850a1..0000000 --- a/libopie/pim/otodoaccessxml.h +++ b/dev/null @@ -1,60 +0,0 @@ -#ifndef OPIE_TODO_ACCESS_XML_H -#define OPIE_TODO_ACCESS_XML_H - -#include <qasciidict.h> -#include <qmap.h> - -#include "otodoaccessbackend.h" - -namespace Opie { - class XMLElement; -}; - -class OTodoAccessXML : public OTodoAccessBackend { -public: - /** - * fileName if Empty we will use the default path - */ - OTodoAccessXML( const QString& appName, - const QString& fileName = QString::null ); - ~OTodoAccessXML(); - - bool load(); - bool reload(); - bool save(); - - QArray<int> allRecords()const; - QArray<int> matchRegexp(const QRegExp &r) const; - QArray<int> queryByExample( const OTodo&, int querysettings, const QDateTime& d = QDateTime() ); - OTodo find( int uid )const; - void clear(); - bool add( const OTodo& ); - bool remove( int uid ); - void removeAllCompleted(); - bool replace( const OTodo& ); - - /* our functions */ - QArray<int> effectiveToDos( const QDate& start, - const QDate& end, - bool includeNoDates ); - QArray<int> overDue(); - QArray<int> sorted( bool asc, int sortOrder, - int sortFilter, int cat ); - QBitArray supports()const; -private: - static QBitArray sup(); - void todo( QAsciiDict<int>*, OTodo&,const QCString&,const QString& ); - QString toString( const OTodo& )const; - QString toString( const QArray<int>& ints ) const; - QMap<int, OTodo> m_events; - QString m_file; - QString m_app; - bool m_opened : 1; - bool m_changed : 1; - class OTodoAccessXMLPrivate; - OTodoAccessXMLPrivate* d; - int m_year, m_month, m_day; - -}; - -#endif diff --git a/libopie/pim/test/converter.cpp b/libopie/pim/test/converter.cpp deleted file mode 100644 index bfdb605..0000000 --- a/libopie/pim/test/converter.cpp +++ b/dev/null @@ -1,107 +0,0 @@ -#include "converter.h" - -#include <qdatetime.h> -#include <qprogressbar.h> - -#include <qpe/qpeapplication.h> - -#include <opie/ocontactaccess.h> -#include <opie/ocontactaccessbackend_xml.h> -#include <opie/ocontactaccessbackend_sql.h> - -#include <opie/odatebookaccess.h> -#include <opie/odatebookaccessbackend_xml.h> -#include <opie/odatebookaccessbackend_sql.h> - -// #define _ADDRESSBOOK_ACCESS - -Converter::Converter(){ -} - -void Converter::start_conversion(){ - qWarning("Converting Contacts from XML to SQL.."); - - // Creating backends to the requested databases.. - -#ifdef _ADDRESSBOOK_ACCESS - OContactAccessBackend* xmlBackend = new OContactAccessBackend_XML( "Converter", - QString::null ); - - OContactAccessBackend* sqlBackend = new OContactAccessBackend_SQL( QString::null, - QString::null ); - // Put the created backends into frontends to access them - OContactAccess* xmlAccess = new OContactAccess ( "addressbook_xml", - QString::null , xmlBackend, true ); - - OContactAccess* sqlAccess = new OContactAccess ( "addressbook_sql", - QString::null ); - -#else - ODateBookAccessBackend* xmlBackend = new ODateBookAccessBackend_XML( "Converter", - QString::null ); - - ODateBookAccessBackend* sqlBackend = new ODateBookAccessBackend_SQL( QString::null, - QString::null ); - // Put the created backends into frontends to access them - ODateBookAccess* xmlAccess = new ODateBookAccess ( xmlBackend ); - - ODateBookAccess* sqlAccess = new ODateBookAccess ( sqlBackend ); - - xmlAccess->load(); - -#endif - - QTime t; - t.start(); - -// Clean the sql-database.. - sqlAccess->clear(); - -#ifdef _ADDRESSBOOK_ACCESS - // Now trasmit every contact from the xml database to the sql-database - OContactAccess::List contactList = xmlAccess->allRecords(); - m_progressBar->setTotalSteps( contactList.count() ); - int count = 0; - if ( sqlAccess && xmlAccess ){ - OContactAccess::List::Iterator it; - for ( it = contactList.begin(); it != contactList.end(); ++it ){ - sqlAccess->add( *it ); - m_progressBar->setProgress( ++count ); - } - } -#else - // Now transmit every contact from the xml database to the sql-database - ODateBookAccess::List dateList = xmlAccess->allRecords(); - m_progressBar->setTotalSteps( dateList.count() ); - qWarning( "Number of elements to copy: %d", dateList.count() ); - - int count = 0; - if ( sqlAccess && xmlAccess ){ - ODateBookAccess::List::Iterator it; - for ( it = dateList.begin(); it != dateList.end(); ++it ){ - sqlAccess->add( *it ); - m_progressBar->setProgress( ++count ); - } - } - -#endif - // Delete the frontends. Backends will be deleted automatically, too ! - delete sqlAccess; - - qWarning("Conversion is finished and needed %d ms !", t.elapsed()); - - delete xmlAccess; -} - -int main( int argc, char** argv ) { - - QPEApplication a( argc, argv ); - - Converter dlg; - - a.showMainWidget( &dlg ); - // dlg. showMaximized ( ); - - return a.exec(); - -} diff --git a/libopie/pim/test/converter.h b/libopie/pim/test/converter.h deleted file mode 100755 index 1cc2a7c..0000000 --- a/libopie/pim/test/converter.h +++ b/dev/null @@ -1,18 +0,0 @@ -#ifndef _CONVERTER_H_ -#define _CONVERTER_H_ - - -#include "converter_base.h" - - -class Converter: public converter_base { -public: - Converter(); - - void start_conversion(); -private: - -}; - - -#endif diff --git a/libopie/pim/test/converter.pro b/libopie/pim/test/converter.pro deleted file mode 100644 index bd9c7a3..0000000 --- a/libopie/pim/test/converter.pro +++ b/dev/null @@ -1,12 +0,0 @@ -# TEMPLATE = app -CONFIG = qt warn_on debug -# CONFIG = qt warn_on release -#HEADERS = -SOURCES = converter.cpp -INTERFACES = converter_base.ui -INCLUDEPATH += $(OPIEDIR)/include -DEPENDPATH += $(OPIEDIR)/include -LIBS += -lqpe -lopie -TARGET = converter - -include ( $(OPIEDIR)/include.pro ) diff --git a/libopie/pim/test/converter_base.ui b/libopie/pim/test/converter_base.ui deleted file mode 100644 index e9bf636..0000000 --- a/libopie/pim/test/converter_base.ui +++ b/dev/null @@ -1,238 +0,0 @@ -<!DOCTYPE UI><UI> -<class>converter_base</class> -<widget> - <class>QDialog</class> - <property stdset="1"> - <name>name</name> - <cstring>converter_base</cstring> - </property> - <property stdset="1"> - <name>geometry</name> - <rect> - <x>0</x> - <y>0</y> - <width>273</width> - <height>324</height> - </rect> - </property> - <property stdset="1"> - <name>caption</name> - <string>PIM-Database Converter</string> - </property> - <property> - <name>layoutMargin</name> - </property> - <grid> - <property stdset="1"> - <name>margin</name> - <number>4</number> - </property> - <property stdset="1"> - <name>spacing</name> - <number>6</number> - </property> - <widget row="0" column="0" > - <class>QGroupBox</class> - <property stdset="1"> - <name>name</name> - <cstring>GroupBox6</cstring> - </property> - <property stdset="1"> - <name>title</name> - <string>Converter</string> - </property> - <property> - <name>layoutMargin</name> - </property> - <property> - <name>layoutSpacing</name> - </property> - <vbox> - <property stdset="1"> - <name>margin</name> - <number>4</number> - </property> - <property stdset="1"> - <name>spacing</name> - <number>4</number> - </property> - <widget> - <class>QGroupBox</class> - <property stdset="1"> - <name>name</name> - <cstring>GroupBox1</cstring> - </property> - <property stdset="1"> - <name>title</name> - <string>Select Database:</string> - </property> - <grid> - <property stdset="1"> - <name>margin</name> - <number>11</number> - </property> - <property stdset="1"> - <name>spacing</name> - <number>6</number> - </property> - <widget row="0" column="1" > - <class>QComboBox</class> - <item> - <property> - <name>text</name> - <string>Addressbook</string> - </property> - </item> - <item> - <property> - <name>text</name> - <string>TodoList</string> - </property> - </item> - <property stdset="1"> - <name>name</name> - <cstring>ComboBox1</cstring> - </property> - </widget> - </grid> - </widget> - <widget> - <class>QGroupBox</class> - <property stdset="1"> - <name>name</name> - <cstring>GroupBox2</cstring> - </property> - <property stdset="1"> - <name>title</name> - <string>Source/Destination:</string> - </property> - <grid> - <property stdset="1"> - <name>margin</name> - <number>11</number> - </property> - <property stdset="1"> - <name>spacing</name> - <number>6</number> - </property> - <widget row="1" column="0" > - <class>QLabel</class> - <property stdset="1"> - <name>name</name> - <cstring>TextLabel3_2</cstring> - </property> - <property stdset="1"> - <name>text</name> - <string>to</string> - </property> - </widget> - <widget row="1" column="1" > - <class>QComboBox</class> - <item> - <property> - <name>text</name> - <string>Select</string> - </property> - </item> - <item> - <property> - <name>text</name> - <string>XML</string> - </property> - </item> - <item> - <property> - <name>text</name> - <string>SQL (SQLite)</string> - </property> - </item> - <property stdset="1"> - <name>name</name> - <cstring>ComboBox2_3</cstring> - </property> - </widget> - <widget row="0" column="0" > - <class>QLabel</class> - <property stdset="1"> - <name>name</name> - <cstring>TextLabel2_2</cstring> - </property> - <property stdset="1"> - <name>text</name> - <string>Convert from</string> - </property> - </widget> - <widget row="0" column="1" > - <class>QComboBox</class> - <item> - <property> - <name>text</name> - <string>XML</string> - </property> - </item> - <item> - <property> - <name>text</name> - <string>SQL (SQLite)</string> - </property> - </item> - <property stdset="1"> - <name>name</name> - <cstring>ComboBox2_2_2</cstring> - </property> - </widget> - </grid> - </widget> - <widget> - <class>QGroupBox</class> - <property stdset="1"> - <name>name</name> - <cstring>GroupBox4</cstring> - </property> - <property stdset="1"> - <name>title</name> - <string>Progress:</string> - </property> - <grid> - <property stdset="1"> - <name>margin</name> - <number>11</number> - </property> - <property stdset="1"> - <name>spacing</name> - <number>6</number> - </property> - <widget row="0" column="0" > - <class>QProgressBar</class> - <property stdset="1"> - <name>name</name> - <cstring>m_progressBar</cstring> - </property> - </widget> - </grid> - </widget> - <widget> - <class>QPushButton</class> - <property stdset="1"> - <name>name</name> - <cstring>PushButton1</cstring> - </property> - <property stdset="1"> - <name>text</name> - <string>Go!</string> - </property> - </widget> - </vbox> - </widget> - </grid> -</widget> -<connections> - <connection> - <sender>PushButton1</sender> - <signal>clicked()</signal> - <receiver>converter_base</receiver> - <slot>start_conversion()</slot> - </connection> - <slot access="public">start_conversion()</slot> -</connections> -</UI> diff --git a/libopie/pim/test/oevent_test.cpp b/libopie/pim/test/oevent_test.cpp deleted file mode 100644 index 9f16911..0000000 --- a/libopie/pim/test/oevent_test.cpp +++ b/dev/null @@ -1,35 +0,0 @@ -#include <qdatetime.h> - -#include "../oevent.h" -#include "../odatebookaccess.h" - -int main(int argc, char* argv ) { - ODateBookAccess acc; - if(!acc.load() ) qWarning("could not load"); - - ODateBookAccess::List::Iterator it; - ODateBookAccess::List list = acc.allRecords(); - - for( it = list.begin(); it != list.end(); ++it ){ - OEvent ev = (*it); - qWarning("Summary: %s",ev.description().latin1() ); - qWarning("Start: %s End: %s",ev.startDateTime().toString().latin1(), ev.endDateTime().toString().latin1() ); - qWarning("All Day: %d Recurrence: %d",ev.isAllDay(), ev.hasRecurrence() ); - qWarning("UID %d", ev.uid() ); - - } - QDate date1(2003,02,01 ); - QDate date2(2003,03,01 ); - - OEffectiveEvent::ValueList effList = acc.effectiveEvents( date1,date2 ); - OEffectiveEvent::ValueList::Iterator effIt; - - for( effIt = effList.begin(); effIt != effList.end(); ++effIt ){ - OEffectiveEvent ef = (*effIt); - qWarning("Summary: %s", ef.description().latin1() ); - qWarning("Date: %s", ef.date().toString().latin1() ); - } - acc.save(); - - return 0; -} diff --git a/libopie/pim/test/oevent_test.pro b/libopie/pim/test/oevent_test.pro deleted file mode 100644 index 3365def..0000000 --- a/libopie/pim/test/oevent_test.pro +++ b/dev/null @@ -1,11 +0,0 @@ -TEMPLATE = app -#CONFIG = qt warn_on debug -CONFIG = qt warn_on release -#HEADERS = -SOURCES = oevent_test.cpp -INCLUDEPATH += $(OPIEDIR)/include -DEPENDPATH += $(OPIEDIR)/include -LIBS += -lqpe -lopie -TARGET = oevent_test - -include ( $(OPIEDIR)/include.pro )
\ No newline at end of file diff --git a/libopie/pim/test/test_todo.cpp b/libopie/pim/test/test_todo.cpp deleted file mode 100644 index 7440503..0000000 --- a/libopie/pim/test/test_todo.cpp +++ b/dev/null @@ -1,36 +0,0 @@ -#include <qdatetime.h> -#include <qmap.h> - -#include <opie/otodo.h> -#include <opie/otodoaccess.h> -#include <opie/otodoaccessxml.h> - -int main(int argc, char* argv[] ) { - - OTodoAccessXML* xml = new OTodoAccessXML("demo"); - OTodoAccess ac(xml); - int elc; - QTime timer; - qWarning("start loading"); - timer.start(); - ac.load(); - elc = timer.elapsed(); - qWarning("Elapsed loading %d %d", elc, elc/1000); - - timer.start(); - OTodoAccess::List lis = ac.allRecords(); - elc = timer.elapsed(); - qWarning("Elapsed allRecords %d %d", elc, elc/1000 ); - OTodoAccess::List::Iterator it; - timer.start(); -ac.save(); -/* - for( it = lis.begin(); it != lis.end(); ++it ) { - qWarning("Desc: " + (*it).summary() ); - qWarning("UID %d", (*it).uid() ); - } - */ -elc = timer.elapsed(); - - qWarning("elapsed iterating %d %d", elc, elc/1000 ); -}; diff --git a/libopie/pim/test/todo_test.pro b/libopie/pim/test/todo_test.pro deleted file mode 100644 index 3d14dda..0000000 --- a/libopie/pim/test/todo_test.pro +++ b/dev/null @@ -1,11 +0,0 @@ -TEMPLATE = app -#CONFIG = qt warn_on debug -CONFIG = qt warn_on release -#HEADERS = -SOURCES = test_todo.cpp -INCLUDEPATH += $(OPIEDIR)/include -DEPENDPATH += $(OPIEDIR)/include -LIBS += -lqpe -lopie -lopiesql -TARGET = todo_test - -include ( $(OPIEDIR)/ )
\ No newline at end of file |