summaryrefslogtreecommitdiff
path: root/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp
Side-by-side diff
Diffstat (limited to 'libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp1182
1 files changed, 593 insertions, 589 deletions
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
@@ -32,4 +32,13 @@
+
+/* 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>
@@ -41,8 +50,3 @@
-#include <qpe/global.h>
-
-#include <opie2/xmltree.h>
-#include <opie2/ocontactaccessbackend.h>
-#include <opie2/ocontactaccess.h>
-
+/* STD */
#include <stdlib.h>
@@ -55,23 +59,23 @@ 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 ();
}
@@ -81,67 +85,67 @@ 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;
}
@@ -150,17 +154,17 @@ 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;
}
@@ -169,6 +173,6 @@ void OPimContactAccessBackend_XML::clear ()
{
- m_contactList.clear();
- m_uidToContact.clear();
+ m_contactList.clear();
+ m_uidToContact.clear();
- m_changed = false;
+ m_changed = false;
}
@@ -177,7 +181,7 @@ 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);
}
@@ -186,11 +190,11 @@ 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 );
}
@@ -199,11 +203,11 @@ 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 );
}
@@ -211,141 +215,141 @@ OPimContact OPimContactAccessBackend_XML::find ( int uid ) const
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;
}
@@ -354,16 +358,16 @@ 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;
}
@@ -372,11 +376,11 @@ 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
+ );
}
@@ -385,45 +389,45 @@ 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 );
+ }
}
@@ -433,25 +437,25 @@ 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;
@@ -461,9 +465,9 @@ 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;
}
@@ -472,20 +476,20 @@ 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;
}
@@ -494,14 +498,14 @@ 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;
}
@@ -509,4 +513,4 @@ bool OPimContactAccessBackend_XML::remove ( int uid )
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() );
}
@@ -515,6 +519,6 @@ 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 );
}
@@ -525,188 +529,188 @@ 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;
}
@@ -715,27 +719,27 @@ bool OPimContactAccessBackend_XML::load( const QString filename, bool isJournal
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() );
}
@@ -744,5 +748,5 @@ void OPimContactAccessBackend_XML::removeJournal()
{
- QFile f ( m_journalName );
- if ( f.exists() )
- f.remove();
+ QFile f ( m_journalName );
+ if ( f.exists() )
+ f.remove();
}