summaryrefslogtreecommitdiff
path: root/libopie2/opiepim/backend
Side-by-side diff
Diffstat (limited to 'libopie2/opiepim/backend') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp1326
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp894
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp1182
-rw-r--r--libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp579
-rw-r--r--libopie2/opiepim/backend/odatebookaccessbackend_xml.cpp170
-rw-r--r--libopie2/opiepim/backend/otodoaccesssql.cpp444
-rw-r--r--libopie2/opiepim/backend/otodoaccessvcal.cpp20
-rw-r--r--libopie2/opiepim/backend/otodoaccessxml.cpp191
8 files changed, 2420 insertions, 2386 deletions
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp
index 14207be..dda23cc 100644
--- a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp
+++ b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp
@@ -1,852 +1,856 @@
/*
This file is part of the Opie Project
Copyright (C) Stefan Eilers <eilers.stefan@epost.de>
=. Copyright (C) The Opie Team <opie-devel@handhelds.org>
.=l.
.>+-=
_;:, .> :=|. This program is free software; you can
.> <`_, > . <= redistribute it and/or modify it under
:`=1 )Y*s>-.-- : the terms of the GNU Library General Public
.="- .-=="i, .._ License as published by the Free Software
- . .-<_> .<> Foundation; either version 2 of the License,
._= =} : or (at your option) any later version.
.%`+i> _;_.
.i_,=:_. -<s. This program is distributed in the hope that
+ . -:. = it will be useful, but WITHOUT ANY WARRANTY;
: .. .:, . . . without even the implied warranty of
=_ + =;=|` MERCHANTABILITY or FITNESS FOR A
_.=:. : :=>`: PARTICULAR PURPOSE. See the GNU
..}^=.= = ; Library General Public License for more
++= -. .` .: details.
: = ...= . :.=-
-. .:....=;==+<; You should have received a copy of the GNU
-_. . . )=. = Library General Public License along with
-- :-=` this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
/*
* SQL Backend for the OPIE-Contact Database.
*/
#include "ocontactaccessbackend_sql.h"
-#include <qarray.h>
-#include <qdatetime.h>
-#include <qstringlist.h>
-
-#include <qpe/global.h>
-#include <qpe/recordfields.h>
-
+/* OPIE */
#include <opie2/opimcontact.h>
#include <opie2/opimcontactfields.h>
#include <opie2/opimdateconversion.h>
#include <opie2/osqldriver.h>
#include <opie2/osqlresult.h>
#include <opie2/osqlmanager.h>
#include <opie2/osqlquery.h>
+#include <opie2/odebug.h>
+
+#include <qpe/global.h>
+#include <qpe/recordfields.h>
+
+/* QT */
+#include <qarray.h>
+#include <qdatetime.h>
+#include <qstringlist.h>
+
using namespace Opie;
using namespace Opie::DB;
/*
* 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 OPimContact to the table
- */
- class InsertQuery : public OSQLQuery {
- public:
- InsertQuery(const OPimContact& );
- ~InsertQuery();
- QString query()const;
- private:
- OPimContact 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 two 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;
-
- qu += "create table addressbook( uid PRIMARY KEY ";
-
- QStringList fieldList = OPimContactFields::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(10), priority INTEGER, value VARCHAR(10), PRIMARY KEY /* identifier */ (uid, id) );";
-
- 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;
- qu += "select uid from addressbook";
-
- return qu;
- }
-
-
- InsertQuery::InsertQuery( const OPimContact& contact )
- : OSQLQuery(), m_contact( contact ) {
- }
-
- InsertQuery::~InsertQuery() {
- }
-
- /*
- * converts from a OPimContact to a query
- */
- QString InsertQuery::query()const{
-
- 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 = OPimContactFields::untrfields( false );
- QMap<QString, int> translate = OPimContactFields::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:
- case Qtopia::Anniversary:{
- QDate day;
- if ( id == Qtopia::Birthday ){
- day = m_contact.birthday();
- } else {
- day = m_contact.anniversary();
- }
- // These entries should stored in a special format
- // year-month-day
- if ( day.isValid() ){
- qu += QString(",\"%1-%2-%3\"")
- .arg( QString::number( day.year() ).rightJustify( 4, '0' ) )
- .arg( QString::number( day.month() ).rightJustify( 2, '0' ) )
- .arg( QString::number( day.day() ).rightJustify( 2, '0' ) );
- } else {
- qu += ",\"\"";
- }
- }
- break;
- default:
- qu += QString( ",\"%1\"" ).arg( contactMap[id] );
- }
- }
- qu += " );";
-
-
- // Now add custom data..
- int id = 0;
- 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()
- + "',"
- + "0" // Priority for future enhancements
- + ",'"
- + it.data()
- + "');";
- }
- // qu += "commit;";
- qDebug("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();
- }
+ /**
+ * 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 OPimContact to the table
+ */
+ class InsertQuery : public OSQLQuery {
+ public:
+ InsertQuery(const OPimContact& );
+ ~InsertQuery();
+ QString query()const;
+ private:
+ OPimContact 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 two 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;
+
+ qu += "create table addressbook( uid PRIMARY KEY ";
+
+ QStringList fieldList = OPimContactFields::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(10), priority INTEGER, value VARCHAR(10), PRIMARY KEY /* identifier */ (uid, id) );";
+
+ 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;
+ qu += "select uid from addressbook";
+
+ return qu;
+ }
+
+
+ InsertQuery::InsertQuery( const OPimContact& contact )
+ : OSQLQuery(), m_contact( contact ) {
+ }
+
+ InsertQuery::~InsertQuery() {
+ }
+
+ /*
+ * converts from a OPimContact to a query
+ */
+ QString InsertQuery::query()const{
+
+ 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 = OPimContactFields::untrfields( false );
+ QMap<QString, int> translate = OPimContactFields::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:
+ case Qtopia::Anniversary:{
+ QDate day;
+ if ( id == Qtopia::Birthday ){
+ day = m_contact.birthday();
+ } else {
+ day = m_contact.anniversary();
+ }
+ // These entries should stored in a special format
+ // year-month-day
+ if ( day.isValid() ){
+ qu += QString(",\"%1-%2-%3\"")
+ .arg( QString::number( day.year() ).rightJustify( 4, '0' ) )
+ .arg( QString::number( day.month() ).rightJustify( 2, '0' ) )
+ .arg( QString::number( day.day() ).rightJustify( 2, '0' ) );
+ } else {
+ qu += ",\"\"";
+ }
+ }
+ break;
+ default:
+ qu += QString( ",\"%1\"" ).arg( contactMap[id] );
+ }
+ }
+ qu += " );";
+
+
+ // Now add custom data..
+ int id = 0;
+ 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()
+ + "',"
+ + "0" // Priority for future enhancements
+ + ",'"
+ + it.data()
+ + "');";
+ }
+ // qu += "commit;";
+ odebug << "add " << qu << "" << oendl;
+ 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;
- }
- */
- QString FindQuery::single()const{
- QString qu = "select *";
- qu += " from addressbook where uid = " + QString::number(m_uid);
-
- // qWarning("find query: %s", qu.latin1() );
- return qu;
- }
-
-
- 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;
- }
+ 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;
+ }
+ */
+ QString FindQuery::single()const{
+ QString qu = "select *";
+ qu += " from addressbook where uid = " + QString::number(m_uid);
+
+ // owarn << "find query: " << qu << "" << oendl;
+ return qu;
+ }
+
+
+ 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;
+ }
};
/* --------------------------------------------------------------------------- */
namespace Opie {
-OPimContactAccessBackend_SQL::OPimContactAccessBackend_SQL ( const QString& /* appname */,
- const QString& filename ):
- OPimContactAccessBackend(), m_changed(false), m_driver( NULL )
+OPimContactAccessBackend_SQL::OPimContactAccessBackend_SQL ( const QString& /* appname */,
+ const QString& filename ):
+ OPimContactAccessBackend(), m_changed(false), m_driver( NULL )
{
- qDebug("C'tor OPimContactAccessBackend_SQL starts");
- QTime t;
- t.start();
+ odebug << "C'tor OPimContactAccessBackend_SQL starts" << oendl;
+ 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;
+ /* 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 );
+ // Get the standart sql-driver from the OSQLManager..
+ OSQLManager man;
+ m_driver = man.standard();
+ m_driver->setUrl( m_fileName );
- load();
+ load();
- qDebug("C'tor OPimContactAccessBackend_SQL ends: %d ms", t.elapsed() );
+ odebug << "C'tor OPimContactAccessBackend_SQL ends: " << t.elapsed() << " ms" << oendl;
}
OPimContactAccessBackend_SQL::~OPimContactAccessBackend_SQL ()
{
- if( m_driver )
- delete m_driver;
+ if( m_driver )
+ delete m_driver;
}
bool OPimContactAccessBackend_SQL::load ()
{
- if (!m_driver->open() )
- return false;
+ 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 );
+ // 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();
+ update();
- return true;
+ return true;
}
bool OPimContactAccessBackend_SQL::reload()
{
- return load();
+ return load();
}
bool OPimContactAccessBackend_SQL::save()
{
- return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers)
+ return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers)
}
void OPimContactAccessBackend_SQL::clear ()
{
- ClearQuery cle;
- OSQLResult res = m_driver->query( &cle );
+ ClearQuery cle;
+ OSQLResult res = m_driver->query( &cle );
- reload();
+ reload();
}
bool OPimContactAccessBackend_SQL::wasChangedExternally()
{
- return false;
+ return false;
}
QArray<int> OPimContactAccessBackend_SQL::allRecords() const
{
- // FIXME: Think about cute handling of changed tables..
- // Thus, we don't have to call update here...
- if ( m_changed )
- ((OPimContactAccessBackend_SQL*)this)->update();
-
- return m_uids;
+ // FIXME: Think about cute handling of changed tables..
+ // Thus, we don't have to call update here...
+ if ( m_changed )
+ ((OPimContactAccessBackend_SQL*)this)->update();
+
+ return m_uids;
}
bool OPimContactAccessBackend_SQL::add ( const OPimContact &newcontact )
{
- qDebug("add in contact SQL-Backend");
- 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;
+ odebug << "add in contact SQL-Backend" << oendl;
+ 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 OPimContactAccessBackend_SQL::remove ( int uid )
{
- RemoveQuery rem( uid );
- OSQLResult res = m_driver->query(&rem );
+ RemoveQuery rem( uid );
+ OSQLResult res = m_driver->query(&rem );
- if ( res.state() == OSQLResult::Failure )
- return false;
+ if ( res.state() == OSQLResult::Failure )
+ return false;
- m_changed = true;
+ m_changed = true;
- return true;
+ return true;
}
bool OPimContactAccessBackend_SQL::replace ( const OPimContact &contact )
{
- if ( !remove( contact.uid() ) )
- return false;
-
- return add( contact );
+ if ( !remove( contact.uid() ) )
+ return false;
+
+ return add( contact );
}
OPimContact OPimContactAccessBackend_SQL::find ( int uid ) const
{
- qDebug("OPimContactAccessBackend_SQL::find()");
- QTime t;
- t.start();
+ odebug << "OPimContactAccessBackend_SQL::find()" << oendl;
+ QTime t;
+ t.start();
- OPimContact retContact( requestNonCustom( uid ) );
- retContact.setExtraMap( requestCustom( uid ) );
+ OPimContact retContact( requestNonCustom( uid ) );
+ retContact.setExtraMap( requestCustom( uid ) );
- qDebug("OPimContactAccessBackend_SQL::find() needed: %d ms", t.elapsed() );
- return retContact;
+ odebug << "OPimContactAccessBackend_SQL::find() needed: " << t.elapsed() << " ms" << oendl;
+ return retContact;
}
QArray<int> OPimContactAccessBackend_SQL::queryByExample ( const OPimContact &query, int settings, const QDateTime& qd )
{
- QString qu = "SELECT uid FROM addressbook WHERE";
- QString searchQuery ="";
-
- QDate startDate;
-
- if ( qd.isValid() )
- startDate = qd.date();
- else
- startDate = QDate::currentDate();
-
-
- QMap<int, QString> queryFields = query.toMap();
- QStringList fieldList = OPimContactFields::untrfields( false );
- QMap<QString, int> translate = OPimContactFields::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];
- QDate* endDate = 0l;
-
- if ( !queryStr.isEmpty() ){
- // If something is alredy stored in the query, add an "AND"
- // to the end of the string to prepare for the next ..
- if ( !searchQuery.isEmpty() )
- searchQuery += " AND";
-
-// isAnyFieldSelected = true;
- switch( id ){
- case Qtopia::Birthday:
- endDate = new QDate( query.birthday() );
- // Fall through !
- case Qtopia::Anniversary:
- if ( endDate == 0l )
- endDate = new QDate( query.anniversary() );
-
- if ( settings & OPimContactAccess::DateDiff ) {
- searchQuery += QString( " (\"%1\" <= '%2-%3-%4\' AND \"%5\" >= '%6-%7-%8')" )
- .arg( *it )
- .arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) )
- .arg( QString::number( endDate->month() ).rightJustify( 2, '0' ) )
- .arg( QString::number( endDate->day() ).rightJustify( 2, '0' ) )
- .arg( *it )
- .arg( QString::number( startDate.year() ).rightJustify( 4, '0' ) )
- .arg( QString::number( startDate.month() ).rightJustify( 2, '0' ) )
- .arg( QString::number( startDate.day() ).rightJustify( 2, '0' ) ) ;
- }
-
- if ( settings & OPimContactAccess::DateYear ){
- if ( settings & OPimContactAccess::DateDiff )
- searchQuery += " AND";
-
- searchQuery += QString( " (\"%1\" LIKE '%2-%')" )
- .arg( *it )
- .arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) );
- }
-
- if ( settings & OPimContactAccess::DateMonth ){
- if ( ( settings & OPimContactAccess::DateDiff )
- || ( settings & OPimContactAccess::DateYear ) )
- searchQuery += " AND";
-
- searchQuery += QString( " (\"%1\" LIKE '%-%2-%')" )
- .arg( *it )
- .arg( QString::number( endDate->month() ).rightJustify( 2, '0' ) );
- }
-
- if ( settings & OPimContactAccess::DateDay ){
- if ( ( settings & OPimContactAccess::DateDiff )
- || ( settings & OPimContactAccess::DateYear )
- || ( settings & OPimContactAccess::DateMonth ) )
- searchQuery += " AND";
-
- searchQuery += QString( " (\"%1\" LIKE '%-%-%2')" )
- .arg( *it )
- .arg( QString::number( endDate->day() ).rightJustify( 2, '0' ) );
- }
-
- break;
- 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 & OPimContactAccess::IgnoreCase )
- searchQuery += "(\"" + *it + "\"" + " LIKE " + "'"
- + queryStr.replace(QRegExp("\\*"),"%") + "'" + ")";
- else
- searchQuery += "(\"" + *it + "\"" + " GLOB " + "'"
- + queryStr + "'" + ")";
-
- }
- }
- }
- // Skip trailing "AND"
-// if ( isAnyFieldSelected )
-// qu = qu.left( qu.length() - 4 );
-
- qu += searchQuery;
-
- qDebug( "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;
+ QString qu = "SELECT uid FROM addressbook WHERE";
+ QString searchQuery ="";
+
+ QDate startDate;
+
+ if ( qd.isValid() )
+ startDate = qd.date();
+ else
+ startDate = QDate::currentDate();
+
+
+ QMap<int, QString> queryFields = query.toMap();
+ QStringList fieldList = OPimContactFields::untrfields( false );
+ QMap<QString, int> translate = OPimContactFields::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];
+ QDate* endDate = 0l;
+
+ if ( !queryStr.isEmpty() ){
+ // If something is alredy stored in the query, add an "AND"
+ // to the end of the string to prepare for the next ..
+ if ( !searchQuery.isEmpty() )
+ searchQuery += " AND";
+
+// isAnyFieldSelected = true;
+ switch( id ){
+ case Qtopia::Birthday:
+ endDate = new QDate( query.birthday() );
+ // Fall through !
+ case Qtopia::Anniversary:
+ if ( endDate == 0l )
+ endDate = new QDate( query.anniversary() );
+
+ if ( settings & OPimContactAccess::DateDiff ) {
+ searchQuery += QString( " (\"%1\" <= '%2-%3-%4\' AND \"%5\" >= '%6-%7-%8')" )
+ .arg( *it )
+ .arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) )
+ .arg( QString::number( endDate->month() ).rightJustify( 2, '0' ) )
+ .arg( QString::number( endDate->day() ).rightJustify( 2, '0' ) )
+ .arg( *it )
+ .arg( QString::number( startDate.year() ).rightJustify( 4, '0' ) )
+ .arg( QString::number( startDate.month() ).rightJustify( 2, '0' ) )
+ .arg( QString::number( startDate.day() ).rightJustify( 2, '0' ) ) ;
+ }
+
+ if ( settings & OPimContactAccess::DateYear ){
+ if ( settings & OPimContactAccess::DateDiff )
+ searchQuery += " AND";
+
+ searchQuery += QString( " (\"%1\" LIKE '%2-%')" )
+ .arg( *it )
+ .arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) );
+ }
+
+ if ( settings & OPimContactAccess::DateMonth ){
+ if ( ( settings & OPimContactAccess::DateDiff )
+ || ( settings & OPimContactAccess::DateYear ) )
+ searchQuery += " AND";
+
+ searchQuery += QString( " (\"%1\" LIKE '%-%2-%')" )
+ .arg( *it )
+ .arg( QString::number( endDate->month() ).rightJustify( 2, '0' ) );
+ }
+
+ if ( settings & OPimContactAccess::DateDay ){
+ if ( ( settings & OPimContactAccess::DateDiff )
+ || ( settings & OPimContactAccess::DateYear )
+ || ( settings & OPimContactAccess::DateMonth ) )
+ searchQuery += " AND";
+
+ searchQuery += QString( " (\"%1\" LIKE '%-%-%2')" )
+ .arg( *it )
+ .arg( QString::number( endDate->day() ).rightJustify( 2, '0' ) );
+ }
+
+ break;
+ 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 & OPimContactAccess::IgnoreCase )
+ searchQuery += "(\"" + *it + "\"" + " LIKE " + "'"
+ + queryStr.replace(QRegExp("\\*"),"%") + "'" + ")";
+ else
+ searchQuery += "(\"" + *it + "\"" + " GLOB " + "'"
+ + queryStr + "'" + ")";
+
+ }
+ }
+ }
+ // Skip trailing "AND"
+// if ( isAnyFieldSelected )
+// qu = qu.left( qu.length() - 4 );
+
+ qu += searchQuery;
+
+ odebug << "queryByExample query: " << qu << "" << oendl;
+
+ // 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> OPimContactAccessBackend_SQL::matchRegexp( const QRegExp &r ) const
{
#if 0
- QArray<int> nix(0);
- return nix;
+ QArray<int> nix(0);
+ return nix;
#else
- QString qu = "SELECT uid FROM addressbook WHERE (";
- QString searchlist;
+ QString qu = "SELECT uid FROM addressbook WHERE (";
+ QString searchlist;
- QStringList fieldList = OPimContactFields::untrfields( false );
- // QMap<QString, int> translate = OPimContactFields::untrFieldsToId();
- for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){
- if ( !searchlist.isEmpty() )
- searchlist += " OR ";
- searchlist += " rlike(\""+ r.pattern() + "\",\"" + *it + "\") ";
- }
-
- qu = qu + searchlist + ")";
+ QStringList fieldList = OPimContactFields::untrfields( false );
+ // QMap<QString, int> translate = OPimContactFields::untrFieldsToId();
+ for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){
+ if ( !searchlist.isEmpty() )
+ searchlist += " OR ";
+ searchlist += " rlike(\""+ r.pattern() + "\",\"" + *it + "\") ";
+ }
- qDebug( "query: %s", qu.latin1() );
+ qu = qu + searchlist + ")";
- OSQLRawQuery raw( qu );
- OSQLResult res = m_driver->query( &raw );
+ odebug << "query: " << qu << "" << oendl;
- return extractUids( res );
+ OSQLRawQuery raw( qu );
+ OSQLResult res = m_driver->query( &raw );
+
+ return extractUids( res );
#endif
}
const uint OPimContactAccessBackend_SQL::querySettings()
{
- return OPimContactAccess::IgnoreCase
- | OPimContactAccess::WildCards
- | OPimContactAccess::DateDiff
- | OPimContactAccess::DateYear
- | OPimContactAccess::DateMonth
- | OPimContactAccess::DateDay
- ;
+ return OPimContactAccess::IgnoreCase
+ | OPimContactAccess::WildCards
+ | OPimContactAccess::DateDiff
+ | OPimContactAccess::DateYear
+ | OPimContactAccess::DateMonth
+ | OPimContactAccess::DateDay
+ ;
}
bool OPimContactAccessBackend_SQL::hasQuerySettings (uint querySettings) const
{
- /* OPimContactAccess::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 & (
- OPimContactAccess::IgnoreCase
- | OPimContactAccess::WildCards
- | OPimContactAccess::DateDiff
- | OPimContactAccess::DateYear
- | OPimContactAccess::DateMonth
- | OPimContactAccess::DateDay
-// | OPimContactAccess::RegExp
-// | OPimContactAccess::ExactMatch
- ) ) != querySettings )
- return false;
-
- // Step 2: Check whether the given combinations are ok..
-
- // IngoreCase alone is invalid
- if ( querySettings == OPimContactAccess::IgnoreCase )
- return false;
-
- // WildCards, RegExp and ExactMatch should never used at the same time
- switch ( querySettings & ~( OPimContactAccess::IgnoreCase
- | OPimContactAccess::DateDiff
- | OPimContactAccess::DateYear
- | OPimContactAccess::DateMonth
- | OPimContactAccess::DateDay
- )
- ){
- case OPimContactAccess::RegExp:
- return ( true );
- case OPimContactAccess::WildCards:
- return ( true );
- case OPimContactAccess::ExactMatch:
- return ( true );
- case 0: // one of the upper removed bits were set..
- return ( true );
- default:
- return ( false );
- }
+ /* OPimContactAccess::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 & (
+ OPimContactAccess::IgnoreCase
+ | OPimContactAccess::WildCards
+ | OPimContactAccess::DateDiff
+ | OPimContactAccess::DateYear
+ | OPimContactAccess::DateMonth
+ | OPimContactAccess::DateDay
+// | OPimContactAccess::RegExp
+// | OPimContactAccess::ExactMatch
+ ) ) != querySettings )
+ return false;
+
+ // Step 2: Check whether the given combinations are ok..
+
+ // IngoreCase alone is invalid
+ if ( querySettings == OPimContactAccess::IgnoreCase )
+ return false;
+
+ // WildCards, RegExp and ExactMatch should never used at the same time
+ switch ( querySettings & ~( OPimContactAccess::IgnoreCase
+ | OPimContactAccess::DateDiff
+ | OPimContactAccess::DateYear
+ | OPimContactAccess::DateMonth
+ | OPimContactAccess::DateDay
+ )
+ ){
+ case OPimContactAccess::RegExp:
+ return ( true );
+ case OPimContactAccess::WildCards:
+ return ( true );
+ case OPimContactAccess::ExactMatch:
+ return ( true );
+ case 0: // one of the upper removed bits were set..
+ return ( true );
+ default:
+ return ( false );
+ }
}
QArray<int> OPimContactAccessBackend_SQL::sorted( bool asc, int , int , int )
{
- QTime t;
- t.start();
+ QTime t;
+ t.start();
- QString query = "SELECT uid FROM addressbook ";
- query += "ORDER BY \"Last Name\" ";
+ QString query = "SELECT uid FROM addressbook ";
+ query += "ORDER BY \"Last Name\" ";
- if ( !asc )
- query += "DESC";
+ if ( !asc )
+ query += "DESC";
- // qDebug("sorted query is: %s", query.latin1() );
+ // odebug << "sorted query is: " << query << "" << oendl;
- OSQLRawQuery raw( query );
- OSQLResult res = m_driver->query( &raw );
- if ( res.state() != OSQLResult::Success ){
- QArray<int> empty;
- return empty;
- }
+ OSQLRawQuery raw( query );
+ OSQLResult res = m_driver->query( &raw );
+ if ( res.state() != OSQLResult::Success ){
+ QArray<int> empty;
+ return empty;
+ }
- QArray<int> list = extractUids( res );
+ QArray<int> list = extractUids( res );
- qDebug("sorted needed %d ms!", t.elapsed() );
- return list;
+ odebug << "sorted needed " << t.elapsed() << " ms!" << oendl;
+ return list;
}
void OPimContactAccessBackend_SQL::update()
{
- qDebug("Update starts");
- QTime t;
- t.start();
+ odebug << "Update starts" << oendl;
+ QTime t;
+ t.start();
- // Now load the database set and extract the uid's
- // which will be held locally
+ // 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;
+ LoadQuery lo;
+ OSQLResult res = m_driver->query(&lo);
+ if ( res.state() != OSQLResult::Success )
+ return;
- m_uids = extractUids( res );
+ m_uids = extractUids( res );
- m_changed = false;
+ m_changed = false;
- qDebug("Update ends %d ms", t.elapsed() );
+ odebug << "Update ends " << t.elapsed() << " ms" << oendl;
}
QArray<int> OPimContactAccessBackend_SQL::extractUids( OSQLResult& res ) const
{
- qDebug("extractUids");
- QTime t;
- t.start();
- OSQLResultItem::ValueList list = res.results();
- OSQLResultItem::ValueList::Iterator it;
- QArray<int> ints(list.count() );
- qDebug(" count = %d", list.count() );
-
- int i = 0;
- for (it = list.begin(); it != list.end(); ++it ) {
- ints[i] = (*it).data("uid").toInt();
- i++;
- }
- qDebug("extractUids ready: count2 = %d needs %d ms", i, t.elapsed() );
-
- return ints;
+ odebug << "extractUids" << oendl;
+ QTime t;
+ t.start();
+ OSQLResultItem::ValueList list = res.results();
+ OSQLResultItem::ValueList::Iterator it;
+ QArray<int> ints(list.count() );
+ odebug << " count = " << list.count() << "" << oendl;
+
+ int i = 0;
+ for (it = list.begin(); it != list.end(); ++it ) {
+ ints[i] = (*it).data("uid").toInt();
+ i++;
+ }
+ odebug << "extractUids ready: count2 = " << i << " needs " << t.elapsed() << " ms" << oendl;
+
+ return ints;
}
QMap<int, QString> OPimContactAccessBackend_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 = OPimContactFields::untrfields( false );
- QMap<QString, int> translate = OPimContactFields::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) );
-
- // qDebug("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, OPimDateConversion::dateToString( date ) );
- }
- }
- break;
- case Qtopia::AddressCategory:
- qDebug("Category is: %s", value.latin1() );
- default:
- nonCustomMap.insert( id, value );
- }
- }
-
- // First insert uid
- nonCustomMap.insert( Qtopia::AddressUid, resItem.data( "uid" ) );
- t3needed = t3.elapsed();
-
- // qDebug("Adding UID: %s", resItem.data( "uid" ).latin1() );
- qDebug("RequestNonCustom needed: insg.:%d ms, query: %d ms, mapping: %d ms",
- t.elapsed(), t2needed, t3needed );
-
- return nonCustomMap;
+ 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 = OPimContactFields::untrfields( false );
+ QMap<QString, int> translate = OPimContactFields::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) );
+
+ // odebug << "Reading " << (*it) << "... found: " << value << "" << oendl;
+
+ 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, OPimDateConversion::dateToString( date ) );
+ }
+ }
+ break;
+ case Qtopia::AddressCategory:
+ odebug << "Category is: " << value << "" << oendl;
+ default:
+ nonCustomMap.insert( id, value );
+ }
+ }
+
+ // First insert uid
+ nonCustomMap.insert( Qtopia::AddressUid, resItem.data( "uid" ) );
+ t3needed = t3.elapsed();
+
+ // odebug << "Adding UID: " << resItem.data( "uid" ) << "" << oendl;
+ odebug << "RequestNonCustom needed: insg.:" << t.elapsed() << " ms, query: " << t2needed
+ << " ms, mapping: " << t3needed << " ms" << oendl;
+
+ return nonCustomMap;
}
QMap<QString, QString> OPimContactAccessBackend_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" ) );
- }
-
- qDebug("RequestCustom needed: %d ms", t.elapsed() );
- return customMap;
+ QTime t;
+ t.start();
+
+ QMap<QString, QString> customMap;
+
+ FindCustomQuery query( uid );
+ OSQLResult res_custom = m_driver->query( &query );
+
+ if ( res_custom.state() == OSQLResult::Failure ) {
+ owarn << "OSQLResult::Failure in find query !!" << oendl;
+ 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" ) );
+ }
+
+ odebug << "RequestCustom needed: " << t.elapsed() << " ms" << oendl;
+ return customMap;
}
}
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp
index ffa6a7d..b6ea461 100644
--- a/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp
+++ b/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp
@@ -1,596 +1,598 @@
/*
This file is part of the Opie Project
Copyright (C) The Main Author <main-author@whereever.org>
=. Copyright (C) The Opie Team <opie-devel@handhelds.org>
.=l.
.>+-=
_;:, .> :=|. This program is free software; you can
.> <`_, > . <= redistribute it and/or modify it under
:`=1 )Y*s>-.-- : the terms of the GNU Library General Public
.="- .-=="i, .._ License as published by the Free Software
- . .-<_> .<> Foundation; either version 2 of the License,
._= =} : or (at your option) any later version.
.%`+i> _;_.
.i_,=:_. -<s. This program is distributed in the hope that
+ . -:. = it will be useful, but WITHOUT ANY WARRANTY;
: .. .:, . . . without even the implied warranty of
=_ + =;=|` MERCHANTABILITY or FITNESS FOR A
_.=:. : :=>`: PARTICULAR PURPOSE. See the GNU
..}^=.= = ; Library General Public License for more
++= -. .` .: details.
: = ...= . :.=-
-. .:....=;==+<; You should have received a copy of the GNU
-_. . . )=. = Library General Public License along with
-- :-=` this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
/*
* VCard Backend for the OPIE-Contact Database.
*/
#include "vobject_p.h"
/* OPIE */
#include <opie2/ocontactaccessbackend_vcard.h>
+#include <opie2/odebug.h>
+
#include <qpe/timeconversion.h>
//FIXME: Hack to allow direct access to FILE* fh. Rewrite this!
#define protected public
#include <qfile.h>
#undef protected
namespace Opie {
OPimContactAccessBackend_VCard::OPimContactAccessBackend_VCard ( const QString& , const QString& filename ):
- m_dirty( false ),
- m_file( filename )
+ m_dirty( false ),
+ m_file( filename )
{
- load();
+ load();
}
bool OPimContactAccessBackend_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 ) {
- OPimContact 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;
+ 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{
+ owarn << "File \"" << m_file << "\" not found !" << oendl;
+ return false;
+ }
+
+ while ( obj ) {
+ OPimContact con = parseVObject( obj );
+ /*
+ * if uid is 0 assign a new one
+ * this at least happens on
+ * Nokia6210
+ */
+ if ( con.uid() == 0 ){
+ con.setUid( 1 );
+ owarn << "assigned new uid " << con.uid() << "" << oendl;
+ }
+
+ m_map.insert( con.uid(), con );
+
+ VObject *t = obj;
+ obj = nextVObjectInList(obj);
+ cleanVObject( t );
+ }
+
+ return true;
}
bool OPimContactAccessBackend_VCard::reload()
{
- return load();
+ return load();
}
bool OPimContactAccessBackend_VCard::save()
{
- if (!m_dirty )
- return true;
+ if (!m_dirty )
+ return true;
- QFile file( m_file );
- if (!file.open(IO_WriteOnly ) )
- return false;
+ QFile file( m_file );
+ if (!file.open(IO_WriteOnly ) )
+ return false;
- VObject *obj;
- obj = newVObject( VCCalProp );
- addPropValue( obj, VCVersionProp, "1.0" );
+ VObject *obj;
+ obj = newVObject( VCCalProp );
+ addPropValue( obj, VCVersionProp, "1.0" );
- VObject *vo;
- for(QMap<int, OPimContact>::ConstIterator it=m_map.begin(); it !=m_map.end(); ++it ){
- vo = createVObject( *it );
- writeVObject( file.fh, vo ); //FIXME: HACK!!!
- cleanVObject( vo );
- }
- cleanStrTbl();
- deleteVObject( obj );
+ VObject *vo;
+ for(QMap<int, OPimContact>::ConstIterator it=m_map.begin(); it !=m_map.end(); ++it ){
+ vo = createVObject( *it );
+ writeVObject( file.fh, vo ); //FIXME: HACK!!!
+ cleanVObject( vo );
+ }
+ cleanStrTbl();
+ deleteVObject( obj );
- m_dirty = false;
- return true;
+ m_dirty = false;
+ return true;
}
void OPimContactAccessBackend_VCard::clear ()
{
- m_map.clear();
- m_dirty = true; // ??? sure ? (se)
+ m_map.clear();
+ m_dirty = true; // ??? sure ? (se)
}
bool OPimContactAccessBackend_VCard::add ( const OPimContact& newcontact )
{
- m_map.insert( newcontact.uid(), newcontact );
- m_dirty = true;
- return true;
+ m_map.insert( newcontact.uid(), newcontact );
+ m_dirty = true;
+ return true;
}
bool OPimContactAccessBackend_VCard::remove ( int uid )
{
- m_map.remove( uid );
- m_dirty = true;
- return true;
+ m_map.remove( uid );
+ m_dirty = true;
+ return true;
}
bool OPimContactAccessBackend_VCard::replace ( const OPimContact &contact )
{
- m_map.replace( contact.uid(), contact );
- m_dirty = true;
- return true;
+ m_map.replace( contact.uid(), contact );
+ m_dirty = true;
+ return true;
}
OPimContact OPimContactAccessBackend_VCard::find ( int uid ) const
{
return m_map[uid];
}
QArray<int> OPimContactAccessBackend_VCard::allRecords() const
{
- QArray<int> ar( m_map.count() );
- QMap<int, OPimContact>::ConstIterator it;
- int i = 0;
- for ( it = m_map.begin(); it != m_map.end(); ++it ) {
- ar[i] = it.key();
- i++;
- }
- return ar;
+ QArray<int> ar( m_map.count() );
+ QMap<int, OPimContact>::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> OPimContactAccessBackend_VCard::queryByExample ( const OPimContact&, int, const QDateTime& )
{
- QArray<int> ar(0);
- return ar;
+ QArray<int> ar(0);
+ return ar;
}
// Not implemented
QArray<int> OPimContactAccessBackend_VCard::matchRegexp( const QRegExp& ) const
{
- QArray<int> ar(0);
- return ar;
+ QArray<int> ar(0);
+ return ar;
}
const uint OPimContactAccessBackend_VCard::querySettings()
{
- return 0; // No search possible
+ return 0; // No search possible
}
bool OPimContactAccessBackend_VCard::hasQuerySettings (uint ) const
{
- return false; // No search possible, therefore all settings invalid ;)
+ return false; // No search possible, therefore all settings invalid ;)
}
bool OPimContactAccessBackend_VCard::wasChangedExternally()
{
- return false; // Don't expect concurrent access
+ return false; // Don't expect concurrent access
}
// Not implemented
QArray<int> OPimContactAccessBackend_VCard::sorted( bool , int, int, int )
{
- QArray<int> ar(0);
- return ar;
+ QArray<int> ar(0);
+ return ar;
}
// *** Private stuff ***
OPimContact OPimContactAccessBackend_VCard::parseVObject( VObject *obj )
{
- OPimContact 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 );
- }
+ OPimContact 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;
+
+ owarn << "value " << value.data() << " " << type << "" << oendl;
+ 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() );
- }
- }
+ 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;
+ }
+ c.setFileAs();
+ return c;
}
VObject* OPimContactAccessBackend_VCard::createVObject( const OPimContact &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;
+ 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() ){
+ owarn << "Exporting birthday as: " << convDateToVCardDate( c.birthday() ) << "" << oendl;
+ 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() ){
+ owarn << "Exporting anniversary as: " << convDateToVCardDate( c.anniversary() ) << "" << oendl;
+ 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 OPimContactAccessBackend_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;
+ 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 OPimContactAccessBackend_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;
+ int monthPos = datestr.find('-');
+ int dayPos = datestr.find('-', monthPos+1 );
+ int sep_ignore = 1;
+ if ( monthPos == -1 || dayPos == -1 ) {
+ odebug << "fromString didn't find - in str = " << datestr << "; mpos = " << monthPos << " ypos = " << dayPos << "" << oendl;
+ // Ok.. No "-" found, therefore we will try to read other format ( YYYYMMDD )
+ if ( datestr.length() == 8 ){
+ monthPos = 4;
+ dayPos = 6;
+ sep_ignore = 0;
+ odebug << "Try with follwing positions str = " << datestr << "; mpos = " << monthPos << " ypos = " << dayPos << "" << oendl;
+ } 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();
+ odebug << "TimeConversion::fromString ymd = " << datestr << " => " << y << " " << m << " " << d << "; mpos = " << monthPos << " ypos = " << dayPos << "" << oendl;
+ QDate date ( y,m,d );
+ return date;
}
VObject* OPimContactAccessBackend_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 *ret = 0;
+ if ( o && !value.isEmpty() )
+ ret = addPropValue( o, prop, value.latin1() );
+ return ret;
}
VObject* OPimContactAccessBackend_VCard::safeAddProp( VObject *o, const char *prop)
{
- VObject *ret = 0;
- if ( o )
- ret = addProp( o, prop );
- return ret;
+ VObject *ret = 0;
+ if ( o )
+ ret = addProp( o, prop );
+ return ret;
}
}
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp
index 7b4d81f..5ffcb11 100644
--- a/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp
+++ b/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp
@@ -1,750 +1,754 @@
/*
This file is part of the Opie Project
Copyright (C) Stefan Eilers (Eilers.Stefan@epost.de)
=. Copyright (C) The Opie Team <opie-devel@handhelds.org>
.=l.
.>+-=
_;:, .> :=|. This program is free software; you can
.> <`_, > . <= redistribute it and/or modify it under
:`=1 )Y*s>-.-- : the terms of the GNU Library General Public
.="- .-=="i, .._ License as published by the Free Software
- . .-<_> .<> Foundation; either version 2 of the License,
._= =} : or (at your option) any later version.
.%`+i> _;_.
.i_,=:_. -<s. This program is distributed in the hope that
+ . -:. = it will be useful, but WITHOUT ANY WARRANTY;
: .. .:, . . . without even the implied warranty of
=_ + =;=|` MERCHANTABILITY or FITNESS FOR A
_.=:. : :=>`: PARTICULAR PURPOSE. See the GNU
..}^=.= = ; Library General Public License for more
++= -. .` .: details.
: = ...= . :.=-
-. .:....=;==+<; You should have received a copy of the GNU
-_. . . )=. = Library General Public License along with
-- :-=` this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
/*
* XML Backend for the OPIE-Contact Database.
*/
+
+/* OPIE */
#include <opie2/ocontactaccessbackend_xml.h>
+#include <opie2/xmltree.h>
+#include <opie2/ocontactaccessbackend.h>
+#include <opie2/ocontactaccess.h>
+#include <opie2/odebug.h>
+
+#include <qpe/global.h>
+/* QT */
#include <qasciidict.h>
#include <qfile.h>
#include <qfileinfo.h>
#include <qregexp.h>
#include <qarray.h>
#include <qmap.h>
-#include <qpe/global.h>
-
-#include <opie2/xmltree.h>
-#include <opie2/ocontactaccessbackend.h>
-#include <opie2/ocontactaccess.h>
-
+/* STD */
#include <stdlib.h>
#include <errno.h>
using namespace Opie::Core;
namespace Opie {
OPimContactAccessBackend_XML::OPimContactAccessBackend_XML ( const QString& appname, const QString& filename ):
- m_changed( false )
+ m_changed( false )
{
- // Just m_contactlist should call delete if an entry
- // is removed.
- m_contactList.setAutoDelete( true );
- m_uidToContact.setAutoDelete( false );
+ // Just m_contactlist should call delete if an entry
+ // is removed.
+ m_contactList.setAutoDelete( true );
+ m_uidToContact.setAutoDelete( false );
- m_appName = appname;
+ m_appName = appname;
- /* Set journalfile name ... */
- m_journalName = getenv("HOME");
- m_journalName +="/.abjournal" + 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;
+ /* 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 ();
+ /* Load Database now */
+ load ();
}
bool OPimContactAccessBackend_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<OPimContact> 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;
+ 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<OPimContact> it( m_contactList );
+ for ( ; it.current(); ++it ) {
+ // owarn << " Uid " << (*it)->uid() << " at Offset: " << idx_offset << "" << oendl;
+ 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 OPimContactAccessBackend_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;
+ 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 OPimContactAccessBackend_XML::clear ()
{
- m_contactList.clear();
- m_uidToContact.clear();
+ m_contactList.clear();
+ m_uidToContact.clear();
- m_changed = false;
+ m_changed = false;
}
bool OPimContactAccessBackend_XML::wasChangedExternally()
{
- QFileInfo fi( m_fileName );
+ QFileInfo fi( m_fileName );
- QDateTime lastmod = fi.lastModified ();
+ QDateTime lastmod = fi.lastModified ();
- return (lastmod != m_readtime);
+ return (lastmod != m_readtime);
}
QArray<int> OPimContactAccessBackend_XML::allRecords() const
{
- QArray<int> uid_list( m_contactList.count() );
+ QArray<int> uid_list( m_contactList.count() );
- uint counter = 0;
- QListIterator<OPimContact> it( m_contactList );
- for( ; it.current(); ++it ){
- uid_list[counter++] = (*it)->uid();
- }
+ uint counter = 0;
+ QListIterator<OPimContact> it( m_contactList );
+ for( ; it.current(); ++it ){
+ uid_list[counter++] = (*it)->uid();
+ }
- return ( uid_list );
+ return ( uid_list );
}
OPimContact OPimContactAccessBackend_XML::find ( int uid ) const
{
- OPimContact foundContact; //Create empty contact
+ OPimContact foundContact; //Create empty contact
- OPimContact* found = m_uidToContact.find( QString().setNum( uid ) );
+ OPimContact* found = m_uidToContact.find( QString().setNum( uid ) );
- if ( found ){
- foundContact = *found;
- }
+ if ( found ){
+ foundContact = *found;
+ }
- return ( foundContact );
+ return ( foundContact );
}
QArray<int> OPimContactAccessBackend_XML::queryByExample ( const OPimContact &query, int settings,
- const QDateTime& d )
+ const QDateTime& d )
{
- QArray<int> m_currentQuery( m_contactList.count() );
- QListIterator<OPimContact> 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() );
- // fall through
- case Qtopia::Anniversary:
- if ( queryDate == 0l ){
- queryDate = new QDate( query.anniversary() );
- checkDate = new QDate( (*it)->anniversary() );
- }
-
- if ( queryDate->isValid() ){
- if( checkDate->isValid() ){
- if ( settings & OPimContactAccess::DateYear ){
- if ( queryDate->year() != checkDate->year() )
- allcorrect = false;
- }
- if ( settings & OPimContactAccess::DateMonth ){
- if ( queryDate->month() != checkDate->month() )
- allcorrect = false;
- }
- if ( settings & OPimContactAccess::DateDay ){
- if ( queryDate->day() != checkDate->day() )
- allcorrect = false;
- }
- if ( settings & OPimContactAccess::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 & ~( OPimContactAccess::IgnoreCase
- | OPimContactAccess::DateDiff
- | OPimContactAccess::DateYear
- | OPimContactAccess::DateMonth
- | OPimContactAccess::DateDay
- | OPimContactAccess::MatchOne
- ) ){
-
- case OPimContactAccess::RegExp:{
- QRegExp expr ( query.field(i),
- !(settings & OPimContactAccess::IgnoreCase),
- false );
- if ( expr.find ( (*it)->field(i), 0 ) == -1 )
- allcorrect = false;
- }
- break;
- case OPimContactAccess::WildCards:{
- QRegExp expr ( query.field(i),
- !(settings & OPimContactAccess::IgnoreCase),
- true );
- if ( expr.find ( (*it)->field(i), 0 ) == -1 )
- allcorrect = false;
- }
- break;
- case OPimContactAccess::ExactMatch:{
- if (settings & OPimContactAccess::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> m_currentQuery( m_contactList.count() );
+ QListIterator<OPimContact> 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() );
+ // fall through
+ case Qtopia::Anniversary:
+ if ( queryDate == 0l ){
+ queryDate = new QDate( query.anniversary() );
+ checkDate = new QDate( (*it)->anniversary() );
+ }
+
+ if ( queryDate->isValid() ){
+ if( checkDate->isValid() ){
+ if ( settings & OPimContactAccess::DateYear ){
+ if ( queryDate->year() != checkDate->year() )
+ allcorrect = false;
+ }
+ if ( settings & OPimContactAccess::DateMonth ){
+ if ( queryDate->month() != checkDate->month() )
+ allcorrect = false;
+ }
+ if ( settings & OPimContactAccess::DateDay ){
+ if ( queryDate->day() != checkDate->day() )
+ allcorrect = false;
+ }
+ if ( settings & OPimContactAccess::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 & ~( OPimContactAccess::IgnoreCase
+ | OPimContactAccess::DateDiff
+ | OPimContactAccess::DateYear
+ | OPimContactAccess::DateMonth
+ | OPimContactAccess::DateDay
+ | OPimContactAccess::MatchOne
+ ) ){
+
+ case OPimContactAccess::RegExp:{
+ QRegExp expr ( query.field(i),
+ !(settings & OPimContactAccess::IgnoreCase),
+ false );
+ if ( expr.find ( (*it)->field(i), 0 ) == -1 )
+ allcorrect = false;
+ }
+ break;
+ case OPimContactAccess::WildCards:{
+ QRegExp expr ( query.field(i),
+ !(settings & OPimContactAccess::IgnoreCase),
+ true );
+ if ( expr.find ( (*it)->field(i), 0 ) == -1 )
+ allcorrect = false;
+ }
+ break;
+ case OPimContactAccess::ExactMatch:{
+ if (settings & OPimContactAccess::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> OPimContactAccessBackend_XML::matchRegexp( const QRegExp &r ) const
{
- QArray<int> m_currentQuery( m_contactList.count() );
- QListIterator<OPimContact> it( m_contactList );
- uint arraycounter = 0;
+ QArray<int> m_currentQuery( m_contactList.count() );
+ QListIterator<OPimContact> it( m_contactList );
+ uint arraycounter = 0;
- for( ; it.current(); ++it ){
- if ( (*it)->match( r ) ){
- m_currentQuery[arraycounter++] = (*it)->uid();
- }
+ for( ; it.current(); ++it ){
+ if ( (*it)->match( r ) ){
+ m_currentQuery[arraycounter++] = (*it)->uid();
+ }
- }
- // Shrink to fit..
- m_currentQuery.resize(arraycounter);
+ }
+ // Shrink to fit..
+ m_currentQuery.resize(arraycounter);
- return m_currentQuery;
+ return m_currentQuery;
}
const uint OPimContactAccessBackend_XML::querySettings()
{
- return ( OPimContactAccess::WildCards
- | OPimContactAccess::IgnoreCase
- | OPimContactAccess::RegExp
- | OPimContactAccess::ExactMatch
- | OPimContactAccess::DateDiff
- | OPimContactAccess::DateYear
- | OPimContactAccess::DateMonth
- | OPimContactAccess::DateDay
- );
+ return ( OPimContactAccess::WildCards
+ | OPimContactAccess::IgnoreCase
+ | OPimContactAccess::RegExp
+ | OPimContactAccess::ExactMatch
+ | OPimContactAccess::DateDiff
+ | OPimContactAccess::DateYear
+ | OPimContactAccess::DateMonth
+ | OPimContactAccess::DateDay
+ );
}
bool OPimContactAccessBackend_XML::hasQuerySettings (uint querySettings) const
{
- /* OPimContactAccess::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 & (
- OPimContactAccess::IgnoreCase
- | OPimContactAccess::WildCards
- | OPimContactAccess::DateDiff
- | OPimContactAccess::DateYear
- | OPimContactAccess::DateMonth
- | OPimContactAccess::DateDay
- | OPimContactAccess::RegExp
- | OPimContactAccess::ExactMatch
- ) ) != querySettings )
- return false;
-
- // Step 2: Check whether the given combinations are ok..
-
- // IngoreCase alone is invalid
- if ( querySettings == OPimContactAccess::IgnoreCase )
- return false;
-
- // WildCards, RegExp and ExactMatch should never used at the same time
- switch ( querySettings & ~( OPimContactAccess::IgnoreCase
- | OPimContactAccess::DateDiff
- | OPimContactAccess::DateYear
- | OPimContactAccess::DateMonth
- | OPimContactAccess::DateDay
- )
- ){
- case OPimContactAccess::RegExp:
- return ( true );
- case OPimContactAccess::WildCards:
- return ( true );
- case OPimContactAccess::ExactMatch:
- return ( true );
- case 0: // one of the upper removed bits were set..
- return ( true );
- default:
- return ( false );
- }
+ /* OPimContactAccess::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 & (
+ OPimContactAccess::IgnoreCase
+ | OPimContactAccess::WildCards
+ | OPimContactAccess::DateDiff
+ | OPimContactAccess::DateYear
+ | OPimContactAccess::DateMonth
+ | OPimContactAccess::DateDay
+ | OPimContactAccess::RegExp
+ | OPimContactAccess::ExactMatch
+ ) ) != querySettings )
+ return false;
+
+ // Step 2: Check whether the given combinations are ok..
+
+ // IngoreCase alone is invalid
+ if ( querySettings == OPimContactAccess::IgnoreCase )
+ return false;
+
+ // WildCards, RegExp and ExactMatch should never used at the same time
+ switch ( querySettings & ~( OPimContactAccess::IgnoreCase
+ | OPimContactAccess::DateDiff
+ | OPimContactAccess::DateYear
+ | OPimContactAccess::DateMonth
+ | OPimContactAccess::DateDay
+ )
+ ){
+ case OPimContactAccess::RegExp:
+ return ( true );
+ case OPimContactAccess::WildCards:
+ return ( true );
+ case OPimContactAccess::ExactMatch:
+ return ( true );
+ case 0: // one of the upper removed bits were set..
+ return ( true );
+ default:
+ return ( false );
+ }
}
// Currently only asc implemented..
QArray<int> OPimContactAccessBackend_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<OPimContact> 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;
+ 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<OPimContact> 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 OPimContactAccessBackend_XML::add ( const OPimContact &newcontact )
{
- //qWarning("odefaultbackend: ACTION::ADD");
- updateJournal (newcontact, ACTION_ADD);
- addContact_p( newcontact );
+ //owarn << "odefaultbackend: ACTION::ADD" << oendl;
+ updateJournal (newcontact, ACTION_ADD);
+ addContact_p( newcontact );
- m_changed = true;
+ m_changed = true;
- return true;
+ return true;
}
bool OPimContactAccessBackend_XML::replace ( const OPimContact &contact )
{
- m_changed = true;
+ m_changed = true;
- OPimContact* found = m_uidToContact.find ( QString().setNum( contact.uid() ) );
+ OPimContact* found = m_uidToContact.find ( QString().setNum( contact.uid() ) );
- if ( found ) {
- OPimContact* newCont = new OPimContact( contact );
+ if ( found ) {
+ OPimContact* newCont = new OPimContact( 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 );
+ 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());
+ owarn << "Nur zur Sicherheit: " << contact.uid() << " == " << newCont->uid() << " ?" << oendl;
- return true;
- } else
- return false;
+ return true;
+ } else
+ return false;
}
bool OPimContactAccessBackend_XML::remove ( int uid )
{
- m_changed = true;
+ m_changed = true;
- OPimContact* found = m_uidToContact.find ( QString().setNum( uid ) );
+ OPimContact* found = m_uidToContact.find ( QString().setNum( uid ) );
- if ( found ) {
- updateJournal ( *found, ACTION_REMOVE);
- m_contactList.removeRef ( found );
- m_uidToContact.remove( QString().setNum( uid ) );
+ if ( found ) {
+ updateJournal ( *found, ACTION_REMOVE);
+ m_contactList.removeRef ( found );
+ m_uidToContact.remove( QString().setNum( uid ) );
- return true;
- } else
- return false;
+ return true;
+ } else
+ return false;
}
bool OPimContactAccessBackend_XML::reload(){
- /* Reload is the same as load in this implementation */
- return ( load() );
+ /* Reload is the same as load in this implementation */
+ return ( load() );
}
void OPimContactAccessBackend_XML::addContact_p( const OPimContact &newcontact )
{
- OPimContact* contRef = new OPimContact( newcontact );
+ OPimContact* contRef = new OPimContact( newcontact );
- m_contactList.append ( contRef );
- m_uidToContact.insert( QString().setNum( newcontact.uid() ), contRef );
+ m_contactList.append ( contRef );
+ m_uidToContact.insert( QString().setNum( newcontact.uid() ), contRef );
}
/* This function loads the xml-database and the journalfile */
bool OPimContactAccessBackend_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( "OPimContactDefaultBackEnd::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("OPimContactAccess::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 ("OPimContactDefBack::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 ("OPimContactDefBack::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("OPimContactDefBack::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 */
- OPimContact 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;
+ /* 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) );
+
+ //owarn << "OPimContactDefaultBackEnd::loading " << filename << "" << oendl;
+
+ 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();
+ //owarn << "OPimContactAccess::load tagName(): " << root->tagName() << "" << oendl;
+ element = element->firstChild();
+
+ /* Search Tag "Contacts" which is the parent of all Contacts */
+ while( element && !isJournal ){
+ if( element->tagName() != QString::fromLatin1("Contacts") ){
+ //qWarning ("OPimContactDefBack::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 ("OPimContactDefBack::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("OPimContactDefBack::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 ) {
+ // owarn << "Attribute " << it.key() << " not known." << oendl;
+ //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 */
+ OPimContact 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 {
+ owarn << "ODefBack::could not load" << oendl;
+ }
+ delete root;
+ owarn << "returning from loading" << oendl;
+ return true;
}
void OPimContactAccessBackend_XML::updateJournal( const OPimContact& cnt,
- journal_action action )
+ 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() );
+ 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 OPimContactAccessBackend_XML::removeJournal()
{
- QFile f ( m_journalName );
- if ( f.exists() )
- f.remove();
+ QFile f ( m_journalName );
+ if ( f.exists() )
+ f.remove();
}
}
diff --git a/libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp b/libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp
index f4f3c94..105c106 100644
--- a/libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp
+++ b/libopie2/opiepim/backend/odatebookaccessbackend_sql.cpp
@@ -1,454 +1,459 @@
/*
This file is part of the Opie Project
Copyright (C) Stefan Eilers (Eilers.Stefan@epost.de)
=. Copyright (C) The Opie Team <opie-devel@handhelds.org>
.=l.
.>+-=
_;:, .> :=|. This program is free software; you can
.> <`_, > . <= redistribute it and/or modify it under
:`=1 )Y*s>-.-- : the terms of the GNU Library General Public
.="- .-=="i, .._ License as published by the Free Software
- . .-<_> .<> Foundation; either version 2 of the License,
._= =} : or (at your option) any later version.
.%`+i> _;_.
.i_,=:_. -<s. This program is distributed in the hope that
+ . -:. = it will be useful, but WITHOUT ANY WARRANTY;
: .. .:, . . . without even the implied warranty of
=_ + =;=|` MERCHANTABILITY or FITNESS FOR A
_.=:. : :=>`: PARTICULAR PURPOSE. See the GNU
..}^=.= = ; Library General Public License for more
++= -. .` .: details.
: = ...= . :.=-
-. .:....=;==+<; You should have received a copy of the GNU
-_. . . )=. = Library General Public License along with
-- :-=` this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
/*
* SQL Backend for the OPIE-Calender Database.
*
*/
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <qarray.h>
-#include <qstringlist.h>
-
-#include <qpe/global.h>
-
+/* OPIE */
#include <opie2/osqldriver.h>
#include <opie2/osqlmanager.h>
#include <opie2/osqlquery.h>
#include <opie2/opimrecurrence.h>
#include <opie2/odatebookaccessbackend_sql.h>
+#include <opie2/odebug.h>
+
+#include <qpe/global.h>
+
+/* QT */
+#include <qarray.h>
+#include <qstringlist.h>
+
+/* STD */
+#include <stdio.h>
+#include <stdlib.h>
+
using namespace Opie::DB;
namespace {
- /**
- * 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;
- };
-
- 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;
- }
+ /**
+ * 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;
+ };
+
+ 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;
+ }
}
namespace Opie {
ODateBookAccessBackend_SQL::ODateBookAccessBackend_SQL( const QString& ,
const QString& fileName )
- : ODateBookAccessBackend(), m_driver( NULL )
+ : ODateBookAccessBackend(), m_driver( NULL )
{
- m_fileName = fileName.isEmpty() ? Global::applicationFileName( "datebook", "datebook.db" ) : fileName;
+ 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;
+ 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( OPimEvent::FUid, "uid" );
- m_fieldMap.insert( OPimEvent::FCategories, "Categories" );
- m_fieldMap.insert( OPimEvent::FDescription, "Description" );
- m_fieldMap.insert( OPimEvent::FLocation, "Location" );
- m_fieldMap.insert( OPimEvent::FType, "Type" );
- m_fieldMap.insert( OPimEvent::FAlarm, "Alarm" );
- m_fieldMap.insert( OPimEvent::FSound, "Sound" );
- m_fieldMap.insert( OPimEvent::FRType, "RType" );
- m_fieldMap.insert( OPimEvent::FRWeekdays, "RWeekdays" );
- m_fieldMap.insert( OPimEvent::FRPosition, "RPosition" );
- m_fieldMap.insert( OPimEvent::FRFreq, "RFreq" );
- m_fieldMap.insert( OPimEvent::FRHasEndDate, "RHasEndDate" );
- m_fieldMap.insert( OPimEvent::FREndDate, "REndDate" );
- m_fieldMap.insert( OPimEvent::FRCreated, "RCreated" );
- m_fieldMap.insert( OPimEvent::FRExceptions, "RExceptions" );
- m_fieldMap.insert( OPimEvent::FStart, "Start" );
- m_fieldMap.insert( OPimEvent::FEnd, "End" );
- m_fieldMap.insert( OPimEvent::FNote, "Note" );
- m_fieldMap.insert( OPimEvent::FTimeZone, "TimeZone" );
- m_fieldMap.insert( OPimEvent::FRecParent, "RecParent" );
- m_fieldMap.insert( OPimEvent::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() );
- }
-
+ // This map contains the translation of the fieldtype id's to
+ // the names of the table columns
+ m_fieldMap.insert( OPimEvent::FUid, "uid" );
+ m_fieldMap.insert( OPimEvent::FCategories, "Categories" );
+ m_fieldMap.insert( OPimEvent::FDescription, "Description" );
+ m_fieldMap.insert( OPimEvent::FLocation, "Location" );
+ m_fieldMap.insert( OPimEvent::FType, "Type" );
+ m_fieldMap.insert( OPimEvent::FAlarm, "Alarm" );
+ m_fieldMap.insert( OPimEvent::FSound, "Sound" );
+ m_fieldMap.insert( OPimEvent::FRType, "RType" );
+ m_fieldMap.insert( OPimEvent::FRWeekdays, "RWeekdays" );
+ m_fieldMap.insert( OPimEvent::FRPosition, "RPosition" );
+ m_fieldMap.insert( OPimEvent::FRFreq, "RFreq" );
+ m_fieldMap.insert( OPimEvent::FRHasEndDate, "RHasEndDate" );
+ m_fieldMap.insert( OPimEvent::FREndDate, "REndDate" );
+ m_fieldMap.insert( OPimEvent::FRCreated, "RCreated" );
+ m_fieldMap.insert( OPimEvent::FRExceptions, "RExceptions" );
+ m_fieldMap.insert( OPimEvent::FStart, "Start" );
+ m_fieldMap.insert( OPimEvent::FEnd, "End" );
+ m_fieldMap.insert( OPimEvent::FNote, "Note" );
+ m_fieldMap.insert( OPimEvent::FTimeZone, "TimeZone" );
+ m_fieldMap.insert( OPimEvent::FRecParent, "RecParent" );
+ m_fieldMap.insert( OPimEvent::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()
+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(10), priority INTEGER, value VARCHAR(10), 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;
+ 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(10), priority INTEGER, value VARCHAR(10), PRIMARY KEY /* identifier */ (uid, id) );";
+
+ owarn << "command: " << qu << "" << oendl;
+
+ 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 );
-
+ 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()
+bool ODateBookAccessBackend_SQL::reload()
{
- return load();
+ return load();
}
-bool ODateBookAccessBackend_SQL::save()
+bool ODateBookAccessBackend_SQL::save()
{
- return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers)
+ return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers)
}
-QArray<int> ODateBookAccessBackend_SQL::allRecords()const
+QArray<int> ODateBookAccessBackend_SQL::allRecords()const
{
- return m_uids;
+ return m_uids;
}
QArray<int> ODateBookAccessBackend_SQL::queryByExample(const OPimEvent&, int, const QDateTime& ) {
- return QArray<int>();
+ return QArray<int>();
}
-void ODateBookAccessBackend_SQL::clear()
+void ODateBookAccessBackend_SQL::clear()
{
- QString qu = "drop table datebook;";
- qu += "drop table custom_data;";
+ QString qu = "drop table datebook;";
+ qu += "drop table custom_data;";
- OSQLRawQuery raw( qu );
- OSQLResult res = m_driver->query( &raw );
+ OSQLRawQuery raw( qu );
+ OSQLResult res = m_driver->query( &raw );
- reload();
+ reload();
}
OPimEvent ODateBookAccessBackend_SQL::find( int uid ) const{
- qDebug( "ODateBookAccessBackend_SQL::find( %d )", uid );
+ odebug << "ODateBookAccessBackend_SQL::find( " << uid << " )" << oendl;
- QString qu = "select *";
- qu += "from datebook where uid = " + QString::number(uid);
+ QString qu = "select *";
+ qu += "from datebook where uid = " + QString::number(uid);
- qDebug( "Query: %s", qu.latin1() );
+ odebug << "Query: " << qu << "" << oendl;
- OSQLRawQuery raw( qu );
- OSQLResult res = m_driver->query( &raw );
+ OSQLRawQuery raw( qu );
+ OSQLResult res = m_driver->query( &raw );
- OSQLResultItem resItem = res.first();
+ OSQLResultItem resItem = res.first();
- // Create Map for date event and insert UID
- QMap<int,QString> dateEventMap;
- dateEventMap.insert( OPimEvent::FUid, QString::number( uid ) );
+ // Create Map for date event and insert UID
+ QMap<int,QString> dateEventMap;
+ dateEventMap.insert( OPimEvent::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 ) );
- }
+ // 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, add custom map and return it
- OPimEvent retDate( dateEventMap );
- retDate.setExtraMap( requestCustom( uid ) );
+ // Last step: Put map into date event, add custom map and return it
+ OPimEvent retDate( dateEventMap );
+ retDate.setExtraMap( requestCustom( uid ) );
- qDebug( "ODateBookAccessBackend_SQL::find( %d ) end", uid );
- return retDate;
+ odebug << "ODateBookAccessBackend_SQL::find( " << uid << " ) end" << oendl;
+ return retDate;
}
// FIXME: Speed up update of uid's..
-bool ODateBookAccessBackend_SQL::add( const OPimEvent& ev )
+bool ODateBookAccessBackend_SQL::add( const OPimEvent& 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;
+ 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()
+ + "');";
+ }
+ owarn << "add " << qu << "" << oendl;
+
+ 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 )
+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;
+ 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 OPimEvent& ev )
+bool ODateBookAccessBackend_SQL::replace( const OPimEvent& ev )
{
remove( ev.uid() );
return add( ev );
}
-QArray<int> ODateBookAccessBackend_SQL::rawEvents()const
+QArray<int> ODateBookAccessBackend_SQL::rawEvents()const
{
return allRecords();
}
-QArray<int> ODateBookAccessBackend_SQL::rawRepeats()const
+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 );
+ 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
+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 );
+ 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 );
}
-OPimEvent::ValueList ODateBookAccessBackend_SQL::directNonRepeats()
+OPimEvent::ValueList ODateBookAccessBackend_SQL::directNonRepeats()
{
- QArray<int> nonRepUids = nonRepeats();
- OPimEvent::ValueList list;
+ QArray<int> nonRepUids = nonRepeats();
+ OPimEvent::ValueList list;
- for (uint i = 0; i < nonRepUids.count(); ++i ){
- list.append( find( nonRepUids[i] ) );
- }
+ for (uint i = 0; i < nonRepUids.count(); ++i ){
+ list.append( find( nonRepUids[i] ) );
+ }
- return list;
+ return list;
}
-OPimEvent::ValueList ODateBookAccessBackend_SQL::directRawRepeats()
+OPimEvent::ValueList ODateBookAccessBackend_SQL::directRawRepeats()
{
- QArray<int> rawRepUids = rawRepeats();
- OPimEvent::ValueList list;
+ QArray<int> rawRepUids = rawRepeats();
+ OPimEvent::ValueList list;
- for (uint i = 0; i < rawRepUids.count(); ++i ){
- list.append( find( rawRepUids[i] ) );
- }
+ for (uint i = 0; i < rawRepUids.count(); ++i ){
+ list.append( find( rawRepUids[i] ) );
+ }
- return list;
+ return list;
}
QArray<int> ODateBookAccessBackend_SQL::matchRegexp( const QRegExp &r ) const
{
- QString qu = "SELECT uid FROM datebook WHERE (";
+ QString qu = "SELECT uid FROM datebook WHERE (";
- // Do it make sense to search other fields, too ?
- qu += " rlike(\""+ r.pattern() + "\", Location ) OR";
- qu += " rlike(\""+ r.pattern() + "\", Note )";
-
- qu += " )";
+ // Do it make sense to search other fields, too ?
+ qu += " rlike(\""+ r.pattern() + "\", Location ) OR";
+ qu += " rlike(\""+ r.pattern() + "\", Note )";
- qDebug( "query: %s", qu.latin1() );
+ qu += " )";
- OSQLRawQuery raw( qu );
- OSQLResult res = m_driver->query( &raw );
+ odebug << "query: " << qu << "" << oendl;
- return extractUids( res );
+ OSQLRawQuery raw( qu );
+ OSQLResult res = m_driver->query( &raw );
+
+ return extractUids( res );
}
/* ===== 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;
+ owarn << "extractUids" << oendl;
+ QTime t;
+ t.start();
+ OSQLResultItem::ValueList list = res.results();
+ OSQLResultItem::ValueList::Iterator it;
+ QArray<int> ints(list.count() );
+ owarn << " count = " << list.count() << "" << oendl;
+
+ int i = 0;
+ for (it = list.begin(); it != list.end(); ++it ) {
+ ints[i] = (*it).data("uid").toInt();
+ i++;
+ }
+ owarn << "extractUids ready: count2 = " << i << " needs " << t.elapsed() << " ms" << oendl;
+
+ return ints;
}
QMap<QString, QString> ODateBookAccessBackend_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" ) );
- }
-
- qDebug("RequestCustom needed: %d ms", t.elapsed() );
- return customMap;
+ QTime t;
+ t.start();
+
+ QMap<QString, QString> customMap;
+
+ FindCustomQuery query( uid );
+ OSQLResult res_custom = m_driver->query( &query );
+
+ if ( res_custom.state() == OSQLResult::Failure ) {
+ owarn << "OSQLResult::Failure in find query !!" << oendl;
+ 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" ) );
+ }
+
+ odebug << "RequestCustom needed: " << t.elapsed() << " ms" << oendl;
+ return customMap;
}
}
diff --git a/libopie2/opiepim/backend/odatebookaccessbackend_xml.cpp b/libopie2/opiepim/backend/odatebookaccessbackend_xml.cpp
index 77c0253..2ff36e3 100644
--- a/libopie2/opiepim/backend/odatebookaccessbackend_xml.cpp
+++ b/libopie2/opiepim/backend/odatebookaccessbackend_xml.cpp
@@ -1,645 +1,651 @@
/*
This file is part of the Opie Project
Copyright (C) Stefan Eilers (Eilers.Stefan@epost.de)
=. Copyright (C) The Opie Team <opie-devel@handhelds.org>
.=l.
.>+-=
_;:, .> :=|. This program is free software; you can
.> <`_, > . <= redistribute it and/or modify it under
:`=1 )Y*s>-.-- : the terms of the GNU Library General Public
.="- .-=="i, .._ License as published by the Free Software
- . .-<_> .<> Foundation; either version 2 of the License,
._= =} : or (at your option) any later version.
.%`+i> _;_.
.i_,=:_. -<s. This program is distributed in the hope that
+ . -:. = it will be useful, but WITHOUT ANY WARRANTY;
: .. .:, . . . without even the implied warranty of
=_ + =;=|` MERCHANTABILITY or FITNESS FOR A
_.=:. : :=>`: PARTICULAR PURPOSE. See the GNU
..}^=.= = ; Library General Public License for more
++= -. .` .: details.
: = ...= . :.=-
-. .:....=;==+<; You should have received a copy of the GNU
-_. . . )=. = Library General Public License along with
-- :-=` this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
+
+/* OPIE */
+#include <opie2/opimnotifymanager.h>
+#include <opie2/opimrecurrence.h>
+#include <opie2/opimtimezone.h>
+#include <opie2/odatebookaccessbackend_xml.h>
+#include <opie2/odebug.h>
+
+#include <qtopia/global.h>
+#include <qtopia/stringutil.h>
+#include <qtopia/timeconversion.h>
+
+/* QT */
+#include <qasciidict.h>
+#include <qfile.h>
+
+/* STD */
#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 <opie2/opimnotifymanager.h>
-#include <opie2/opimrecurrence.h>
-#include <opie2/opimtimezone.h>
-#include <opie2/odatebookaccessbackend_xml.h>
using namespace Opie;
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;
+ 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--;
+ 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;
OPimRecurrence* rec;
OPimRecurrence* recur() {
if (!rec)
rec = new OPimRecurrence;
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 ?
+ FAlarm,
+ FSound,
+ FRType,
+ FRWeekdays,
+ FRPosition,
+ FRFreq,
+ FRHasEndDate,
+ FREndDate,
+ FRStart,
+ FREnd,
+ FNote,
+ FCreated, // Should't this be called FRCreated ?
FTimeZone,
FRecParent,
FRecChildren,
FExceptions
};
// FIXME: Use OPimEvent::toMap() here !! (eilers)
inline void save( const OPimEvent& ev, QString& buf ) {
- qWarning("Saving %d %s", ev.uid(), ev.description().latin1() );
+ owarn << "Saving " << ev.uid() << " " << ev.description() << "" << oendl;
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)
+ 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
*/
OPimTimeZone zone( ev.timeZone().isEmpty() ? OPimTimeZone::current() : ev.timeZone() );
buf += " start=\"" + QString::number( zone.fromUTCDateTime( zone.toDateTime( ev.startDateTime(), OPimTimeZone::utc() ) ) ) + "\"";
buf += " end=\"" + QString::number( zone.fromUTCDateTime( zone.toDateTime( ev.endDateTime() , OPimTimeZone::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, OPimEvent>& list, QFile& file ) {
QMap<int, OPimEvent>::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;
}
}
namespace Opie {
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, OPimEvent>::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 OPimEvent&, int, const QDateTime& ) {
return QArray<int>();
}
void ODateBookAccessBackend_XML::clear() {
m_changed = true;
m_raw.clear();
m_rep.clear();
}
OPimEvent 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 OPimEvent& 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 OPimEvent& 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, OPimEvent>::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, OPimEvent>::ConstIterator it;
for ( it = m_raw.begin(); it != m_raw.end(); ++it ) {
ints[i] = it.key();
i++;
}
return ints;
}
OPimEvent::ValueList ODateBookAccessBackend_XML::directNonRepeats() {
OPimEvent::ValueList list;
QMap<int, OPimEvent>::ConstIterator it;
for (it = m_raw.begin(); it != m_raw.end(); ++it )
list.append( it.data() );
return list;
}
OPimEvent::ValueList ODateBookAccessBackend_XML::directRawRepeats() {
OPimEvent::ValueList list;
QMap<int, OPimEvent>::ConstIterator it;
for (it = m_rep.begin(); it != m_rep.end(); ++it )
list.append( it.data() );
return list;
}
// FIXME: Use OPimEvent::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
OPimEvent 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 );
+ ++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 OPimEvent::fromMap() which makes this obsolete.. (eilers)
void ODateBookAccessBackend_XML::finalizeRecord( OPimEvent& ev ) {
/* AllDay is alway in UTC */
if ( ev.isAllDay() ) {
OPimTimeZone utc = OPimTimeZone::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 );
+ // owarn << " Start is " << start << "" << oendl;
OPimTimeZone zone( ev.timeZone().isEmpty() ? OPimTimeZone::current() : ev.timeZone() );
QDateTime date = zone.toDateTime( start );
- qWarning(" Start is %s", date.toString().latin1() );
+ owarn << " Start is " << date.toString() << "" << oendl;
ev.setStartDateTime( zone.toDateTime( date, OPimTimeZone::current() ) );
date = zone.toDateTime( end );
ev.setEndDateTime ( zone.toDateTime( date, OPimTimeZone::current() ) );
}
if ( rec && rec->doesRecur() ) {
OPimTimeZone utc = OPimTimeZone::utc();
OPimRecurrence 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");
+ owarn << "already contains assign uid" << oendl;
ev.setUid( 1 );
}
- qWarning("addind %d %s", ev.uid(), ev.description().latin1() );
+ owarn << "addind " << ev.uid() << " " << ev.description() << "" << oendl;
if ( ev.hasRecurrence() )
m_rep.insert( ev.uid(), ev );
else
m_raw.insert( ev.uid(), ev );
}
void ODateBookAccessBackend_XML::setField( OPimEvent& e, int id, const QString& value) {
-// qWarning(" setting %s", value.latin1() );
+// owarn << " setting " << value << "" << oendl;
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( OPimRecurrence::Daily );
else if ( value == "Weekly" )
recur()->setType( OPimRecurrence::Weekly);
else if ( value == "MonthlyDay" )
recur()->setType( OPimRecurrence::MonthlyDay );
else if ( value == "MonthlyDate" )
recur()->setType( OPimRecurrence::MonthlyDate );
else if ( value == "Yearly" )
recur()->setType( OPimRecurrence::Yearly );
else
recur()->setType( OPimRecurrence::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() );
+ owarn << "adding exception " << date.toString() << "" << oendl;
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, OPimEvent>::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/libopie2/opiepim/backend/otodoaccesssql.cpp b/libopie2/opiepim/backend/otodoaccesssql.cpp
index 132b5a6..6f65c48 100644
--- a/libopie2/opiepim/backend/otodoaccesssql.cpp
+++ b/libopie2/opiepim/backend/otodoaccesssql.cpp
@@ -1,880 +1,884 @@
/*
This file is part of the Opie Project
Copyright (C) Stefan Eilers (Eilers.Stefan@epost.de)
Copyright (C) Holger Freyther (zecke@handhelds.org)
=. Copyright (C) The Opie Team <opie-devel@handhelds.org>
.=l.
.>+-=
_;:, .> :=|. This program is free software; you can
.> <`_, > . <= redistribute it and/or modify it under
:`=1 )Y*s>-.-- : the terms of the GNU Library General Public
.="- .-=="i, .._ License as published by the Free Software
- . .-<_> .<> Foundation; either version 2 of the License,
._= =} : or (at your option) any later version.
.%`+i> _;_.
.i_,=:_. -<s. This program is distributed in the hope that
+ . -:. = it will be useful, but WITHOUT ANY WARRANTY;
: .. .:, . . . without even the implied warranty of
=_ + =;=|` MERCHANTABILITY or FITNESS FOR A
_.=:. : :=>`: PARTICULAR PURPOSE. See the GNU
..}^=.= = ; Library General Public License for more
++= -. .` .: details.
: = ...= . :.=-
-. .:....=;==+<; You should have received a copy of the GNU
-_. . . )=. = Library General Public License along with
-- :-=` this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
-#include <qdatetime.h>
-#include <qmap.h>
-#include <qstring.h>
-
-#include <qpe/global.h>
-
+/* OPIE */
#include <opie2/osqldriver.h>
#include <opie2/osqlresult.h>
#include <opie2/osqlmanager.h>
#include <opie2/osqlquery.h>
#include <opie2/otodoaccesssql.h>
#include <opie2/opimstate.h>
#include <opie2/opimnotifymanager.h>
#include <opie2/opimrecurrence.h>
+#include <opie2/odebug.h>
+
+#include <qpe/global.h>
+
+/* QT */
+#include <qdatetime.h>
+#include <qmap.h>
+#include <qstring.h>
+
using namespace Opie::DB;
using namespace Opie;
/*
* 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 OPimTodo to the table
*/
class InsertQuery : public OSQLQuery {
public:
InsertQuery(const OPimTodo& );
~InsertQuery();
QString query()const;
private:
OPimTodo 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;
};
- /**
- * 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;
- };
+ /**
+ * 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;
+ };
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 OPimRecurrence.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), priority INTEGER, value VARCHAR(10), PRIMARY KEY /* identifier */ (uid, id) );";
+ // This is the recurrance-stuff .. Exceptions are currently not supported (see OPimRecurrence.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), priority INTEGER, 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..
+ // 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 OPimTodo& todo )
: OSQLQuery(), m_todo( todo ) {
}
InsertQuery::~InsertQuery() {
}
/*
* converts from a OPimTodo to a query
* we leave out X-Ref + Maintainer
* FIXME: Implement/Finish toMap()/fromMap() into OpimTodo to move the encoding
* decoding stuff there.. (eilers)
*/
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();
- }
+ }
+ 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();
+ 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).rightJustify( 4, '0' ) + "-"
- + QString::number(month).rightJustify( 2, '0' )
- + "-" + QString::number( day ).rightJustify( 2, '0' )+ "'" + ","
- + QString::number( m_todo.progress() ) + ","
- + QString::number( m_todo.state().state() ) + ","
- + "'" + recMap[ OPimRecurrence::RType ] + "'" + ","
- + "'" + recMap[ OPimRecurrence::RWeekdays ] + "'" + ","
- + "'" + recMap[ OPimRecurrence::RPosition ] + "'" + ","
- + "'" + recMap[ OPimRecurrence::RFreq ] + "'" + ","
- + "'" + recMap[ OPimRecurrence::RHasEndDate ] + "'" + ","
- + "'" + recMap[ OPimRecurrence::EndDate ] + "'" + ","
- + "'" + recMap[ OPimRecurrence::Created ] + "'" + ","
- + "'" + recMap[ OPimRecurrence::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).rightJustify( 4, '0' ) + "-"
- + QString::number(sMonth).rightJustify( 2, '0' )
- + "-" + QString::number(sDay).rightJustify( 2, '0' )+ "'" + ","
- + "'" + QString::number(eYear).rightJustify( 4, '0' ) + "-"
- + QString::number(eMonth).rightJustify( 2, '0' )
- + "-"+QString::number(eDay).rightJustify( 2, '0' ) + "'"
- + "); ";
-
- // Save custom Entries:
- int id = 0;
- id = 0;
- QMap<QString, QString> customMap = m_todo.toExtraMap();
- for( QMap<QString, QString>::Iterator it = customMap.begin();
- it != customMap.end(); ++it ){
- qu += "insert into custom_data VALUES("
- + QString::number( m_todo.uid() )
- + ","
- + QString::number( id++ )
- + ",'"
- + it.key()
- + "',"
- + "0" // Priority for future enhancements
- + ",'"
- + it.data()
- + "');";
- }
-
-
- qDebug("add %s", qu.latin1() );
+ + 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).rightJustify( 4, '0' ) + "-"
+ + QString::number(month).rightJustify( 2, '0' )
+ + "-" + QString::number( day ).rightJustify( 2, '0' )+ "'" + ","
+ + QString::number( m_todo.progress() ) + ","
+ + QString::number( m_todo.state().state() ) + ","
+ + "'" + recMap[ OPimRecurrence::RType ] + "'" + ","
+ + "'" + recMap[ OPimRecurrence::RWeekdays ] + "'" + ","
+ + "'" + recMap[ OPimRecurrence::RPosition ] + "'" + ","
+ + "'" + recMap[ OPimRecurrence::RFreq ] + "'" + ","
+ + "'" + recMap[ OPimRecurrence::RHasEndDate ] + "'" + ","
+ + "'" + recMap[ OPimRecurrence::EndDate ] + "'" + ","
+ + "'" + recMap[ OPimRecurrence::Created ] + "'" + ","
+ + "'" + recMap[ OPimRecurrence::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).rightJustify( 4, '0' ) + "-"
+ + QString::number(sMonth).rightJustify( 2, '0' )
+ + "-" + QString::number(sDay).rightJustify( 2, '0' )+ "'" + ","
+ + "'" + QString::number(eYear).rightJustify( 4, '0' ) + "-"
+ + QString::number(eMonth).rightJustify( 2, '0' )
+ + "-"+QString::number(eDay).rightJustify( 2, '0' ) + "'"
+ + "); ";
+
+ // Save custom Entries:
+ int id = 0;
+ id = 0;
+ QMap<QString, QString> customMap = m_todo.toExtraMap();
+ for( QMap<QString, QString>::Iterator it = customMap.begin();
+ it != customMap.end(); ++it ){
+ qu += "insert into custom_data VALUES("
+ + QString::number( m_todo.uid() )
+ + ","
+ + QString::number( id++ )
+ + ",'"
+ + it.key()
+ + "',"
+ + "0" // Priority for future enhancements
+ + ",'"
+ + it.data()
+ + "');";
+ }
+
+
+ odebug << "add " << qu << "" << oendl;
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) + " ;";
- qu += "DELETE FROM custom_data WHERE uid = " + QString::number(m_uid);
+ qu += "DELETE FROM custom_data 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( QString::number( date.year() ).rightJustify( 4, '0' ) )
- .arg( QString::number( date.month() ).rightJustify( 2, '0' ) )
- .arg( QString::number( date.day() ) .rightJustify( 2, '0' ) );
+ .arg( QString::number( date.year() ).rightJustify( 4, '0' ) )
+ .arg( QString::number( date.month() ).rightJustify( 2, '0' ) )
+ .arg( QString::number( date.day() ) .rightJustify( 2, '0' ) );
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( QString::number( m_start.year() ).rightJustify( 4, '0' ) )
- .arg( QString::number( m_start.month() ).rightJustify( 2, '0' ) )
- .arg( QString::number( m_start.day() ).rightJustify( 2, '0' ) )
- .arg( QString::number( m_end.year() ).rightJustify( 4, '0' ) )
- .arg( QString::number( m_end.month() ).rightJustify( 2, '0' ) )
- .arg( QString::number( m_end.day() ).rightJustify( 2, '0' ) );
+ .arg( QString::number( m_start.year() ).rightJustify( 4, '0' ) )
+ .arg( QString::number( m_start.month() ).rightJustify( 2, '0' ) )
+ .arg( QString::number( m_start.day() ).rightJustify( 2, '0' ) )
+ .arg( QString::number( m_end.year() ).rightJustify( 4, '0' ) )
+ .arg( QString::number( m_end.month() ).rightJustify( 2, '0' ) )
+ .arg( QString::number( m_end.day() ).rightJustify( 2, '0' ) );
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( QString::number( m_start.year() ).rightJustify( 4, '0' ) )
- .arg( QString::number( m_start.month() ).rightJustify( 2, '0' ) )
- .arg( QString::number( m_start.day() ).rightJustify( 2, '0' ) )
- .arg( QString::number( m_end.year() ).rightJustify( 4, '0' ) )
- .arg( QString::number( m_end.month() ).rightJustify( 2, '0' ) )
- .arg( QString::number( m_end.day() ).rightJustify( 2, '0' ) );
+ .arg( QString::number( m_start.year() ).rightJustify( 4, '0' ) )
+ .arg( QString::number( m_start.month() ).rightJustify( 2, '0' ) )
+ .arg( QString::number( m_start.day() ).rightJustify( 2, '0' ) )
+ .arg( QString::number( m_end.year() ).rightJustify( 4, '0' ) )
+ .arg( QString::number( m_end.month() ).rightJustify( 2, '0' ) )
+ .arg( QString::number( m_end.day() ).rightJustify( 2, '0' ) );
return str;
}
- FindCustomQuery::FindCustomQuery(int uid)
- : OSQLQuery(), m_uid( uid ) {
- }
- FindCustomQuery::FindCustomQuery(const QArray<int>& ints)
- : OSQLQuery(), m_uids( ints ){
- }
- FindCustomQuery::~FindCustomQuery() {
- }
- QString FindCustomQuery::query()const{
- return single(); // Multiple requests not supported !
- }
- QString FindCustomQuery::single()const{
- QString qu = "select uid, type, value from custom_data where uid = ";
- qu += QString::number(m_uid);
- return qu;
- }
+ FindCustomQuery::FindCustomQuery(int uid)
+ : OSQLQuery(), m_uid( uid ) {
+ }
+ FindCustomQuery::FindCustomQuery(const QArray<int>& ints)
+ : OSQLQuery(), m_uids( ints ){
+ }
+ FindCustomQuery::~FindCustomQuery() {
+ }
+ QString FindCustomQuery::query()const{
+ return single(); // Multiple requests not supported !
+ }
+ QString FindCustomQuery::single()const{
+ QString qu = "select uid, type, value from custom_data where uid = ";
+ qu += QString::number(m_uid);
+ return qu;
+ }
};
namespace Opie {
OPimTodoAccessBackendSQL::OPimTodoAccessBackendSQL( const QString& file )
- : OPimTodoAccessBackend(),/* m_dict(15),*/ m_driver(NULL), m_dirty(true)
+ : OPimTodoAccessBackend(),/* 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();
}
OPimTodoAccessBackendSQL::~OPimTodoAccessBackendSQL(){
- if( m_driver )
- delete m_driver;
+ if( m_driver )
+ delete m_driver;
}
bool OPimTodoAccessBackendSQL::load(){
if (!m_driver->open() )
return false;
CreateQuery creat;
OSQLResult res = m_driver->query(&creat );
m_dirty = true;
return true;
}
bool OPimTodoAccessBackendSQL::reload(){
return load();
}
bool OPimTodoAccessBackendSQL::save(){
return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers)
}
QArray<int> OPimTodoAccessBackendSQL::allRecords()const {
if (m_dirty )
update();
return m_uids;
}
QArray<int> OPimTodoAccessBackendSQL::queryByExample( const OPimTodo& , int, const QDateTime& ){
QArray<int> ints(0);
return ints;
}
OPimTodo OPimTodoAccessBackendSQL::find(int uid ) const{
FindQuery query( uid );
return todo( m_driver->query(&query) );
}
OPimTodo OPimTodoAccessBackendSQL::find( int uid, const QArray<int>& ints,
uint cur, Frontend::CacheDirection dir ) const{
uint CACHE = readAhead();
- qDebug("searching for %d", uid );
+ odebug << "searching for " << uid << "" << oendl;
QArray<int> search( CACHE );
uint size =0;
OPimTodo 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++ ) {
- qDebug("size %d %d", size, ints[i] );
+ odebug << "size " << size << " " << ints[i] << "" << oendl;
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 OPimTodoAccessBackendSQL::clear() {
ClearQuery cle;
OSQLResult res = m_driver->query( &cle );
CreateQuery qu;
res = m_driver->query(&qu);
}
bool OPimTodoAccessBackendSQL::add( const OPimTodo& 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 OPimTodoAccessBackendSQL::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 OPimTodoAccessBackendSQL::replace( const OPimTodo& 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> OPimTodoAccessBackendSQL::overDue() {
OverDueQuery qu;
return uids( m_driver->query(&qu ) );
}
QArray<int> OPimTodoAccessBackendSQL::effectiveToDos( const QDate& s,
const QDate& t,
bool u) {
EffQuery ef(s, t, u );
return uids (m_driver->query(&ef) );
}
/*
*
*/
QArray<int> OPimTodoAccessBackendSQL::sorted( bool asc, int sortOrder,
int sortFilter, int cat ) {
- qDebug("sorted %d, %d", asc, sortOrder );
+ odebug << "sorted " << asc << ", " << sortOrder << "" << oendl;
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( QString::number( date.year() ).rightJustify( 4, '0' ) )
- .arg( QString::number( date.month() ).rightJustify( 2, '0' ) )
- .arg( QString::number( date.day() ).rightJustify( 2, '0' ) );
+ .arg( QString::number( date.year() ).rightJustify( 4, '0' ) )
+ .arg( QString::number( date.month() ).rightJustify( 2, '0' ) )
+ .arg( QString::number( date.day() ).rightJustify( 2, '0' ) );
query += " " + base + " AND";
}
/* not show completed */
if ( sortFilter & 4 ) {
query += " completed = 0 AND";
}else{
query += " ( completed = 1 OR completed = 0) AND";
}
/* strip 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 ) {
- qDebug("not ascending!");
+ odebug << "not ascending!" << oendl;
query += " DESC";
}
- qDebug( query );
+ odebug << query << oendl;
OSQLRawQuery raw(query );
return uids( m_driver->query(&raw) );
}
bool OPimTodoAccessBackendSQL::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;
}
}
OPimTodo OPimTodoAccessBackendSQL::todo( const OSQLResult& res ) const{
if ( res.state() == OSQLResult::Failure ) {
OPimTodo to;
return to;
}
OSQLResultItem::ValueList list = res.results();
OSQLResultItem::ValueList::Iterator it = list.begin();
- qDebug("todo1");
+ odebug << "todo1" << oendl;
OPimTodo to = todo( (*it) );
cache( to );
++it;
for ( ; it != list.end(); ++it ) {
- qDebug("caching");
+ odebug << "caching" << oendl;
cache( todo( (*it) ) );
}
return to;
}
OPimTodo OPimTodoAccessBackendSQL::todo( OSQLResultItem& item )const {
- qDebug("todo(ResultItem)");
+ odebug << "todo(ResultItem)" << oendl;
// Request information from addressbook table and create the OPimTodo-object.
bool hasDueDate = false; QDate dueDate = QDate::currentDate();
hasDueDate = date( dueDate, item.data("DueDate") );
QStringList cats = QStringList::split(";", item.data("categories") );
- qDebug("Item is completed: %d", item.data("completed").toInt() );
+ odebug << "Item is completed: " << item.data("completed").toInt() << "" << oendl;
OPimTodo 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 );
+ 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 );
+ to.setStartDate( startDate );
if ( hasCompletedDate )
- to.setCompletedDate( completedDate );
+ 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( OPimRecurrence::RType , item.data("RType") );
recMap.insert( OPimRecurrence::RWeekdays , item.data("RWeekdays") );
recMap.insert( OPimRecurrence::RPosition , item.data("RPosition") );
recMap.insert( OPimRecurrence::RFreq , item.data("RFreq") );
recMap.insert( OPimRecurrence::RHasEndDate, item.data("RHasEndDate") );
recMap.insert( OPimRecurrence::EndDate , item.data("EndDate") );
recMap.insert( OPimRecurrence::Created , item.data("Created") );
recMap.insert( OPimRecurrence::Exceptions , item.data("Exceptions") );
OPimRecurrence recur;
recur.fromMap( recMap );
to.setRecurrence( recur );
// Finally load the custom-entries for this UID and put it into the created object
to.setExtraMap( requestCustom( to.uid() ) );
return to;
}
OPimTodo OPimTodoAccessBackendSQL::todo( int uid )const {
FindQuery find( uid );
return todo( m_driver->query(&find) );
}
/*
* update the dict
*/
void OPimTodoAccessBackendSQL::fillDict() {
#if 0
/* 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(OPimTodo::Category) );
m_dict.insert("Uid" , new int(OPimTodo::Uid) );
m_dict.insert("HasDate" , new int(OPimTodo::HasDate) );
m_dict.insert("Completed" , new int(OPimTodo::Completed) );
m_dict.insert("Description" , new int(OPimTodo::Description) );
m_dict.insert("Summary" , new int(OPimTodo::Summary) );
m_dict.insert("Priority" , new int(OPimTodo::Priority) );
m_dict.insert("DateDay" , new int(OPimTodo::DateDay) );
m_dict.insert("DateMonth" , new int(OPimTodo::DateMonth) );
m_dict.insert("DateYear" , new int(OPimTodo::DateYear) );
m_dict.insert("Progress" , new int(OPimTodo::Progress) );
m_dict.insert("Completed", new int(OPimTodo::Completed) ); // Why twice ? (eilers)
m_dict.insert("CrossReference", new int(OPimTodo::CrossReference) );
// m_dict.insert("HasAlarmDateTime",new int(OPimTodo::HasAlarmDateTime) ); // old stuff (eilers)
// m_dict.insert("AlarmDateTime", new int(OPimTodo::AlarmDateTime) ); // old stuff (eilers)
#endif
}
/*
* need to be const so let's fool the
* compiler :(
*/
void OPimTodoAccessBackendSQL::update()const {
((OPimTodoAccessBackendSQL*)this)->m_dirty = false;
LoadQuery lo;
OSQLResult res = m_driver->query(&lo);
if ( res.state() != OSQLResult::Success )
return;
((OPimTodoAccessBackendSQL*)this)->m_uids = uids( res );
}
QArray<int> OPimTodoAccessBackendSQL::uids( const OSQLResult& res) const{
OSQLResultItem::ValueList list = res.results();
OSQLResultItem::ValueList::Iterator it;
QArray<int> ints(list.count() );
- qDebug(" count = %d", list.count() );
+ odebug << " count = " << list.count() << "" << oendl;
int i = 0;
for (it = list.begin(); it != list.end(); ++it ) {
ints[i] = (*it).data("uid").toInt();
i++;
}
return ints;
}
QArray<int> OPimTodoAccessBackendSQL::matchRegexp( const QRegExp &r ) const
{
#if 0
- QArray<int> empty;
- return empty;
+ QArray<int> empty;
+ return empty;
#else
- QString qu = "SELECT uid FROM todolist WHERE (";
+ QString qu = "SELECT uid FROM todolist WHERE (";
- // Do it make sense to search other fields, too ?
- qu += " rlike(\""+ r.pattern() + "\",\"description\") OR";
- qu += " rlike(\""+ r.pattern() + "\",\"summary\")";
+ // Do it make sense to search other fields, too ?
+ qu += " rlike(\""+ r.pattern() + "\",\"description\") OR";
+ qu += " rlike(\""+ r.pattern() + "\",\"summary\")";
- qu += ")";
+ qu += ")";
- qDebug( "query: %s", qu.latin1() );
+ odebug << "query: " << qu << "" << oendl;
- OSQLRawQuery raw( qu );
- OSQLResult res = m_driver->query( &raw );
+ OSQLRawQuery raw( qu );
+ OSQLResult res = m_driver->query( &raw );
- return uids( res );
+ return uids( res );
#endif
}
QBitArray OPimTodoAccessBackendSQL::supports()const {
- return sup();
+ return sup();
}
QBitArray OPimTodoAccessBackendSQL::sup() const{
- QBitArray ar( OPimTodo::CompletedDate + 1 );
- ar.fill( true );
- ar[OPimTodo::CrossReference] = false;
- ar[OPimTodo::State ] = false;
- ar[OPimTodo::Reminders] = false;
- ar[OPimTodo::Notifiers] = false;
- ar[OPimTodo::Maintainer] = false;
+ QBitArray ar( OPimTodo::CompletedDate + 1 );
+ ar.fill( true );
+ ar[OPimTodo::CrossReference] = false;
+ ar[OPimTodo::State ] = false;
+ ar[OPimTodo::Reminders] = false;
+ ar[OPimTodo::Notifiers] = false;
+ ar[OPimTodo::Maintainer] = false;
- return ar;
+ return ar;
}
void OPimTodoAccessBackendSQL::removeAllCompleted(){
- // First we need the uids from all entries which are
- // completed. Then, we just have to remove them...
+ // First we need the uids from all entries which are
+ // completed. Then, we just have to remove them...
- QString qu = "SELECT uid FROM todolist WHERE completed = 1";
+ QString qu = "SELECT uid FROM todolist WHERE completed = 1";
- OSQLRawQuery raw( qu );
- OSQLResult res = m_driver->query( &raw );
+ OSQLRawQuery raw( qu );
+ OSQLResult res = m_driver->query( &raw );
- QArray<int> completed_uids = uids( res );
+ QArray<int> completed_uids = uids( res );
- qDebug( "Number of completed: %d", completed_uids.size() );
+ odebug << "Number of completed: " << completed_uids.size() << "" << oendl;
- if ( completed_uids.size() == 0 )
- return;
+ if ( completed_uids.size() == 0 )
+ return;
- qu = "DELETE FROM todolist WHERE (";
- QString query;
+ qu = "DELETE FROM todolist WHERE (";
+ QString query;
- for ( int i = 0; i < completed_uids.size(); i++ ){
- if ( !query.isEmpty() )
- query += " OR ";
- query += QString( "uid = %1" ).arg( completed_uids[i] );
- }
- qu += query + " );";
+ for ( int i = 0; i < completed_uids.size(); i++ ){
+ if ( !query.isEmpty() )
+ query += " OR ";
+ query += QString( "uid = %1" ).arg( completed_uids[i] );
+ }
+ qu += query + " );";
- // Put remove of custom entries in this query to speed up..
- qu += "DELETE FORM custom_data WHERE (";
- query = "";
+ // Put remove of custom entries in this query to speed up..
+ qu += "DELETE FORM custom_data WHERE (";
+ query = "";
- for ( int i = 0; i < completed_uids.size(); i++ ){
- if ( !query.isEmpty() )
- query += " OR ";
- query += QString( "uid = %1" ).arg( completed_uids[i] );
- }
- qu += query + " );";
+ for ( int i = 0; i < completed_uids.size(); i++ ){
+ if ( !query.isEmpty() )
+ query += " OR ";
+ query += QString( "uid = %1" ).arg( completed_uids[i] );
+ }
+ qu += query + " );";
- qDebug( "query: %s", qu.latin1() );
+ odebug << "query: " << qu << "" << oendl;
- OSQLRawQuery raw2( qu );
- res = m_driver->query( &raw2 );
- if ( res.state() == OSQLResult::Failure ) {
- qWarning("OPimTodoAccessBackendSQL::removeAllCompleted():Failure in query: %s", qu.latin1() );
- }
+ OSQLRawQuery raw2( qu );
+ res = m_driver->query( &raw2 );
+ if ( res.state() == OSQLResult::Failure ) {
+ owarn << "OPimTodoAccessBackendSQL::removeAllCompleted():Failure in query: " << qu << "" << oendl;
+ }
}
QMap<QString, QString> OPimTodoAccessBackendSQL::requestCustom( int uid ) const
{
- QMap<QString, QString> customMap;
+ QMap<QString, QString> customMap;
- FindCustomQuery query( uid );
- OSQLResult res_custom = m_driver->query( &query );
+ 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;
- }
+ if ( res_custom.state() == OSQLResult::Failure ) {
+ owarn << "OSQLResult::Failure in find query !!" << oendl;
+ 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" ) );
- }
+ 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" ) );
+ }
- return customMap;
+ return customMap;
}
}
diff --git a/libopie2/opiepim/backend/otodoaccessvcal.cpp b/libopie2/opiepim/backend/otodoaccessvcal.cpp
index 03d4479..14a325e 100644
--- a/libopie2/opiepim/backend/otodoaccessvcal.cpp
+++ b/libopie2/opiepim/backend/otodoaccessvcal.cpp
@@ -1,285 +1,289 @@
/*
This file is part of the Opie Project
Copyright (C) Stefan Eilers (Eilers.Stefan@epost.de)
=. Copyright (C) The Opie Team <opie-devel@handhelds.org>
.=l.
.>+-=
_;:, .> :=|. This program is free software; you can
.> <`_, > . <= redistribute it and/or modify it under
:`=1 )Y*s>-.-- : the terms of the GNU Library General Public
.="- .-=="i, .._ License as published by the Free Software
- . .-<_> .<> Foundation; either version 2 of the License,
._= =} : or (at your option) any later version.
.%`+i> _;_.
.i_,=:_. -<s. This program is distributed in the hope that
+ . -:. = it will be useful, but WITHOUT ANY WARRANTY;
: .. .:, . . . without even the implied warranty of
=_ + =;=|` MERCHANTABILITY or FITNESS FOR A
_.=:. : :=>`: PARTICULAR PURPOSE. See the GNU
..}^=.= = ; Library General Public License for more
++= -. .` .: details.
: = ...= . :.=-
-. .:....=;==+<; You should have received a copy of the GNU
-_. . . )=. = Library General Public License along with
-- :-=` this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
-/* OPIE */
#include "vobject_p.h"
-#include <qpe/timeconversion.h>
+
+/* OPIE */
#include <opie2/otodoaccessvcal.h>
+#include <opie2/odebug.h>
+#include <qpe/timeconversion.h>
+
+/* QT */
//FIXME: Hack to allow direct access to FILE* fh. Rewrite this!
#define protected public
#include <qfile.h>
#undef protected
using namespace Opie;
namespace {
static OPimTodo eventByVObj( VObject *obj ){
OPimTodo 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() );
+ owarn << "Categories:" << name.data() << "" << oendl;
}
event.setUid( 1 );
return event;
};
static VObject *vobjByEvent( const OPimTodo &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)
+ // 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
+#endif
return task;
};
}
namespace Opie {
OPimTodoAccessVCal::OPimTodoAccessVCal( const QString& path )
: m_dirty(false), m_file( path )
{
}
OPimTodoAccessVCal::~OPimTodoAccessVCal() {
}
bool OPimTodoAccessVCal::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 ){
OPimTodo to = eventByVObj( vobj );
m_map.insert( to.uid(), to );
}
}
// Should I do a delete vcal?
return true;
}
bool OPimTodoAccessVCal::reload() {
return load();
}
bool OPimTodoAccessVCal::save() {
if (!m_dirty )
return true;
QFile 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, OPimTodo>::ConstIterator it=m_map.begin(); it !=m_map.end(); ++it ){
vo = vobjByEvent( it.data() );
addVObjectProp(obj, vo );
}
writeVObject( file.fh, obj ); //FIXME: HACK!!!
cleanVObject( obj );
cleanStrTbl();
m_dirty = false;
return true;
}
void OPimTodoAccessVCal::clear() {
m_map.clear();
m_dirty = true;
}
bool OPimTodoAccessVCal::add( const OPimTodo& to ) {
m_map.insert( to.uid(), to );
m_dirty = true;
return true;
}
bool OPimTodoAccessVCal::remove( int uid ) {
m_map.remove( uid );
m_dirty = true;
return true;
}
void OPimTodoAccessVCal::removeAllCompleted() {
for ( QMap<int, OPimTodo>::Iterator it = m_map.begin(); it != m_map.end(); ++it ) {
if ( (*it).isCompleted() )
m_map.remove( it );
}
}
bool OPimTodoAccessVCal::replace( const OPimTodo& to ) {
m_map.replace( to.uid(), to );
m_dirty = true;
return true;
}
OPimTodo OPimTodoAccessVCal::find(int uid )const {
return m_map[uid];
}
QArray<int> OPimTodoAccessVCal::sorted( bool, int, int, int ) {
QArray<int> ar(0);
return ar;
}
QArray<int> OPimTodoAccessVCal::allRecords()const {
QArray<int> ar( m_map.count() );
QMap<int, OPimTodo>::ConstIterator it;
int i = 0;
for ( it = m_map.begin(); it != m_map.end(); ++it ) {
ar[i] = it.key();
i++;
}
return ar;
}
QArray<int> OPimTodoAccessVCal::matchRegexp(const QRegExp& /* r */)const {
QArray<int> ar(0);
return ar;
}
QArray<int> OPimTodoAccessVCal::queryByExample( const OPimTodo&, int, const QDateTime& ) {
QArray<int> ar(0);
return ar;
}
QArray<int> OPimTodoAccessVCal::effectiveToDos( const QDate& ,
const QDate& ,
bool ) {
QArray<int> ar(0);
return ar;
}
QArray<int> OPimTodoAccessVCal::overDue() {
QArray<int> ar(0);
return ar;
}
QBitArray OPimTodoAccessVCal::supports()const {
static QBitArray ar = sup();
return ar;
}
QBitArray OPimTodoAccessVCal::sup() {
QBitArray ar ( OPimTodo::CompletedDate +1 );
ar.fill( true );
ar[OPimTodo::CrossReference] = false;
ar[OPimTodo::State ] = false;
ar[OPimTodo::Reminders] = false;
ar[OPimTodo::Notifiers] = false;
ar[OPimTodo::Maintainer] = false;
ar[OPimTodo::Progress] = false;
ar[OPimTodo::Alarms ] = false;
ar[OPimTodo::Recurrence] = false;
return ar;
}
}
diff --git a/libopie2/opiepim/backend/otodoaccessxml.cpp b/libopie2/opiepim/backend/otodoaccessxml.cpp
index cce6111..3e06d88 100644
--- a/libopie2/opiepim/backend/otodoaccessxml.cpp
+++ b/libopie2/opiepim/backend/otodoaccessxml.cpp
@@ -1,909 +1,914 @@
/*
This file is part of the Opie Project
Copyright (C) Stefan Eilers (Eilers.Stefan@epost.de)
=. Copyright (C) The Opie Team <opie-devel@handhelds.org>
.=l.
.>+-=
_;:, .> :=|. This program is free software; you can
.> <`_, > . <= redistribute it and/or modify it under
:`=1 )Y*s>-.-- : the terms of the GNU Library General Public
.="- .-=="i, .._ License as published by the Free Software
- . .-<_> .<> Foundation; either version 2 of the License,
._= =} : or (at your option) any later version.
.%`+i> _;_.
.i_,=:_. -<s. This program is distributed in the hope that
+ . -:. = it will be useful, but WITHOUT ANY WARRANTY;
: .. .:, . . . without even the implied warranty of
=_ + =;=|` MERCHANTABILITY or FITNESS FOR A
_.=:. : :=>`: PARTICULAR PURPOSE. See the GNU
..}^=.= = ; Library General Public License for more
++= -. .` .: details.
: = ...= . :.=-
-. .:....=;==+<; You should have received a copy of the GNU
-_. . . )=. = Library General Public License along with
-- :-=` this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
+
+/* OPIE */
+#include <opie2/opimdateconversion.h>
+#include <opie2/opimstate.h>
+#include <opie2/opimtimezone.h>
+#include <opie2/opimnotifymanager.h>
+#include <opie2/opimrecurrence.h>
+#include <opie2/otodoaccessxml.h>
+#include <opie2/odebug.h>
+
+#include <qpe/global.h>
+#include <qpe/stringutil.h>
+#include <qpe/timeconversion.h>
+
+/* QT */
+#include <qfile.h>
+#include <qvector.h>
+
+/* STD */
#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 <opie2/opimdateconversion.h>
-#include <opie2/opimstate.h>
-#include <opie2/opimtimezone.h>
-#include <opie2/opimnotifymanager.h>
-#include <opie2/opimrecurrence.h>
-#include <opie2/otodoaccessxml.h>
-
using namespace Opie;
namespace {
time_t rp_end;
OPimRecurrence* rec;
OPimRecurrence *recur() {
if (!rec ) rec = new OPimRecurrence;
return rec;
}
int snd;
enum MoreAttributes {
FRType = OPimTodo::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;
+ 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--;
+ 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 Opie {
OPimTodoAccessXML::OPimTodoAccessXML( const QString& appName,
const QString& fileName )
: OPimTodoAccessBackend(), m_app( appName ), m_opened( false ), m_changed( false )
{
if (!fileName.isEmpty() )
m_file = fileName;
else
m_file = Global::applicationFileName( "todolist", "todolist.xml" );
}
OPimTodoAccessXML::~OPimTodoAccessXML() {
}
bool OPimTodoAccessXML::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(OPimTodo::Category) );
dict.insert("Uid" , new int(OPimTodo::Uid) );
dict.insert("HasDate" , new int(OPimTodo::HasDate) );
dict.insert("Completed" , new int(OPimTodo::Completed) );
dict.insert("Description" , new int(OPimTodo::Description) );
dict.insert("Summary" , new int(OPimTodo::Summary) );
dict.insert("Priority" , new int(OPimTodo::Priority) );
dict.insert("DateDay" , new int(OPimTodo::DateDay) );
dict.insert("DateMonth" , new int(OPimTodo::DateMonth) );
dict.insert("DateYear" , new int(OPimTodo::DateYear) );
dict.insert("Progress" , new int(OPimTodo::Progress) );
dict.insert("CompletedDate", new int(OPimTodo::CompletedDate) );
dict.insert("StartDate", new int(OPimTodo::StartDate) );
dict.insert("CrossReference", new int(OPimTodo::CrossReference) );
dict.insert("State", new int(OPimTodo::State) );
dict.insert("Alarms", new int(OPimTodo::Alarms) );
dict.insert("Reminders", new int(OPimTodo::Reminders) );
dict.insert("Notifiers", new int(OPimTodo::Notifiers) );
dict.insert("Maintainer", new int(OPimTodo::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) );
+ owarn << "Found a start at " << i << " " << (point-dt) << "" << oendl;
OPimTodo 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 );
+ ++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 );
+ owarn << "End at " << i << "" << oendl;
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() ) {
OPimTimeZone utc = OPimTimeZone::utc();
OPimRecurrence 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() );
+ owarn << "counts " << m_events.count() << " records loaded!" << oendl;
return true;
}
bool OPimTodoAccessXML::reload() {
m_events.clear();
return load();
}
bool OPimTodoAccessXML::save() {
-// qWarning("saving");
+// owarn << "saving" << oendl;
if (!m_opened || !m_changed ) {
-// qWarning("not saving");
+// owarn << "not saving" << oendl;
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, OPimTodo>::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");
+// owarn << "error renaming" << oendl;
QFile::remove( strNewFile );
}
m_changed = false;
return true;
}
QArray<int> OPimTodoAccessXML::allRecords()const {
QArray<int> ids( m_events.count() );
QMap<int, OPimTodo>::ConstIterator it;
int i = 0;
for ( it = m_events.begin(); it != m_events.end(); ++it ) {
ids[i] = it.key();
i++;
}
return ids;
}
QArray<int> OPimTodoAccessXML::queryByExample( const OPimTodo&, int, const QDateTime& ) {
QArray<int> ids(0);
return ids;
}
OPimTodo OPimTodoAccessXML::find( int uid )const {
OPimTodo todo;
todo.setUid( 0 ); // isEmpty()
QMap<int, OPimTodo>::ConstIterator it = m_events.find( uid );
if ( it != m_events.end() )
todo = it.data();
return todo;
}
void OPimTodoAccessXML::clear() {
if (m_opened )
m_changed = true;
m_events.clear();
}
bool OPimTodoAccessXML::add( const OPimTodo& todo ) {
-// qWarning("add");
+// owarn << "add" << oendl;
m_changed = true;
m_events.insert( todo.uid(), todo );
return true;
}
bool OPimTodoAccessXML::remove( int uid ) {
m_changed = true;
m_events.remove( uid );
return true;
}
bool OPimTodoAccessXML::replace( const OPimTodo& todo) {
m_changed = true;
m_events.replace( todo.uid(), todo );
return true;
}
QArray<int> OPimTodoAccessXML::effectiveToDos( const QDate& start,
const QDate& end,
bool includeNoDates ) {
QArray<int> ids( m_events.count() );
QMap<int, OPimTodo>::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> OPimTodoAccessXML::overDue() {
QArray<int> ids( m_events.count() );
int i = 0;
QMap<int, OPimTodo>::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 OPimTodoAccessXML::todo( QAsciiDict<int>* dict, OPimTodo& ev,
const QCString& attr, const QString& val) {
-// qWarning("parse to do from XMLElement" );
+// owarn << "parse to do from XMLElement" << oendl;
int *find=0;
find = (*dict)[ attr.data() ];
if (!find ) {
-// qWarning("Unknown option" + it.key() );
+// owarn << "Unknown option" + it.key() << oendl;
ev.setCustomField( attr, val );
return;
}
switch( *find ) {
case OPimTodo::Uid:
ev.setUid( val.toInt() );
break;
case OPimTodo::Category:
ev.setCategories( ev.idsFromString( val ) );
break;
case OPimTodo::HasDate:
ev.setHasDueDate( val.toInt() );
break;
case OPimTodo::Completed:
ev.setCompleted( val.toInt() );
break;
case OPimTodo::Description:
ev.setDescription( val );
break;
case OPimTodo::Summary:
ev.setSummary( val );
break;
case OPimTodo::Priority:
ev.setPriority( val.toInt() );
break;
case OPimTodo::DateDay:
m_day = val.toInt();
break;
case OPimTodo::DateMonth:
m_month = val.toInt();
break;
case OPimTodo::DateYear:
m_year = val.toInt();
break;
case OPimTodo::Progress:
ev.setProgress( val.toInt() );
break;
case OPimTodo::CompletedDate:
ev.setCompletedDate( OPimDateConversion::dateFromString( val ) );
break;
case OPimTodo::StartDate:
ev.setStartDate( OPimDateConversion::dateFromString( val ) );
break;
case OPimTodo::State:
ev.setState( val.toInt() );
break;
case OPimTodo::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(), OPimDateConversion::dateTimeFromString( alarm[0] ).toString().latin1() );
+ owarn << "alarm: " << alarm.join("___") << "" << oendl;
+ owarn << "alarm[0]: " << alarm[0] << " " << OPimDateConversion::dateTimeFromString( alarm[0] ).toString() << "" << oendl;
OPimAlarm al( alarm[2].toInt(), OPimDateConversion::dateTimeFromString( alarm[0] ), alarm[1].toInt() );
manager.add( al );
}
}
break;
case OPimTodo::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 OPimTodo::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( OPimRecurrence::Daily );
else if ( val == "Weekly" )
recur()->setType( OPimRecurrence::Weekly);
else if ( val == "MonthlyDay" )
recur()->setType( OPimRecurrence::MonthlyDay );
else if ( val == "MonthlyDate" )
recur()->setType( OPimRecurrence::MonthlyDate );
else if ( val == "Yearly" )
recur()->setType( OPimRecurrence::Yearly );
else
recur()->setType( OPimRecurrence::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()));
+ //owarn << QString("writing custom %1").arg(customMap.count()) << oendl;
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 += "\" ";
+ cit != customMap.end(); ++cit) {
+// owarn << ".ITEM." << oendl;
+ buf += cit.key();
+ buf += "=\"";
+ buf += Qtopia::escapeString(cit.data());
+ buf += "\" ";
}
return buf;
}
}
QString OPimTodoAccessXML::toString( const OPimTodo& 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() );
+// owarn << "Uid " << ev.uid() << "" << oendl;
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=\""+ OPimDateConversion::dateToString( ev.startDate() ) +"\" ";
if ( ev.hasCompletedDate() )
str += "CompletedDate=\""+ OPimDateConversion::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 << OPimDateConversion::dateTimeToString( (*it).dateTime() )
+ ":" + QString::number( (*it).duration() )
+ ":" + QString::number( (*it).sound() )
+ ":";
}
}
// now write the list
- qWarning("als: %s", als.join("____________").latin1() );
+ owarn << "als: " << als.join("____________") << "" << oendl;
str += "Alarms=\""+als.join(";") +"\" ";
}
/*
* now the same for reminders but more easy. We just save the uid of the OPimEvent.
*/
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 OPimTodoAccessXML::toString( const QArray<int>& ints ) const {
return Qtopia::Record::idsToString( ints );
}
/* internal class for sorting
*
* Inspired by todoxmlio.cpp from TT
*/
struct OPimTodoXMLContainer {
OPimTodo todo;
};
namespace {
inline QString string( const OPimTodo& todo) {
return todo.summary().isEmpty() ?
todo.description().left(20 ) :
todo.summary();
}
inline int completed( const OPimTodo& todo1, const OPimTodo& todo2) {
int ret = 0;
if ( todo1.isCompleted() ) ret++;
if ( todo2.isCompleted() ) ret--;
return ret;
}
inline int priority( const OPimTodo& t1, const OPimTodo& t2) {
return ( t1.priority() - t2.priority() );
}
inline int description( const OPimTodo& t1, const OPimTodo& t2) {
return QString::compare( string(t1), string(t2) );
}
inline int deadline( const OPimTodo& t1, const OPimTodo& 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 OPimTodoXMLVector : public QVector<OPimTodoXMLContainer> {
public:
OPimTodoXMLVector(int size, bool asc, int sort)
: QVector<OPimTodoXMLContainer>( size )
{
setAutoDelete( true );
m_asc = asc;
m_sort = sort;
}
/* return the summary/description */
QString string( const OPimTodo& 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;
OPimTodoXMLContainer* con1 = (OPimTodoXMLContainer*)d1;
OPimTodoXMLContainer* con2 = (OPimTodoXMLContainer*)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> OPimTodoAccessXML::sorted( bool asc, int sortOrder,
int sortFilter, int cat ) {
OPimTodoXMLVector vector(m_events.count(), asc,sortOrder );
QMap<int, OPimTodo>::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");
+ owarn << "item is overdue but !bOnly" << oendl;
continue;
}
*/
if ( !(*it).isOverdue() && bOnly ) {
continue;
}
if ((*it).isCompleted() && comp ) {
continue;
}
OPimTodoXMLContainer* con = new OPimTodoXMLContainer();
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 OPimTodoAccessXML::removeAllCompleted() {
QMap<int, OPimTodo> events = m_events;
for ( QMap<int, OPimTodo>::Iterator it = m_events.begin(); it != m_events.end(); ++it ) {
if ( (*it).isCompleted() )
events.remove( it.key() );
}
m_events = events;
}
QBitArray OPimTodoAccessXML::supports()const {
static QBitArray ar = sup();
return ar;
}
QBitArray OPimTodoAccessXML::sup() {
QBitArray ar( OPimTodo::CompletedDate +1 );
ar.fill( true );
ar[OPimTodo::CrossReference] = false;
ar[OPimTodo::State ] = false;
ar[OPimTodo::Reminders] = false;
ar[OPimTodo::Notifiers] = false;
ar[OPimTodo::Maintainer] = false;
return ar;
}
QArray<int> OPimTodoAccessXML::matchRegexp( const QRegExp &r ) const
{
- QArray<int> m_currentQuery( m_events.count() );
- uint arraycounter = 0;
+ QArray<int> m_currentQuery( m_events.count() );
+ uint arraycounter = 0;
QMap<int, OPimTodo>::ConstIterator it;
for (it = m_events.begin(); it != m_events.end(); ++it ) {
- if ( it.data().match( r ) )
- m_currentQuery[arraycounter++] = it.data().uid();
+ if ( it.data().match( r ) )
+ m_currentQuery[arraycounter++] = it.data().uid();
- }
- // Shrink to fit..
- m_currentQuery.resize(arraycounter);
+ }
+ // Shrink to fit..
+ m_currentQuery.resize(arraycounter);
- return m_currentQuery;
+ return m_currentQuery;
}
}