author | eilers <eilers> | 2004-12-20 14:14:07 (UTC) |
---|---|---|
committer | eilers <eilers> | 2004-12-20 14:14:07 (UTC) |
commit | 18e47153532d016d878f47e0ce11cb1a9716218e (patch) (side-by-side diff) | |
tree | 52eb6c25258fda0b2f295a29809c4603f5e17b0b | |
parent | 876e48baa20213d8265041cfac3034fe92cb0590 (diff) | |
download | opie-18e47153532d016d878f47e0ce11cb1a9716218e.zip opie-18e47153532d016d878f47e0ce11cb1a9716218e.tar.gz opie-18e47153532d016d878f47e0ce11cb1a9716218e.tar.bz2 |
Recovery of the following Changes:
* Implement fast and full featured version of sorted() for addressbook
* Implement generic queryByExample for all Addressboook backends. It allows incremental search.
* Update of API Documentation
-rw-r--r-- | libopie2/opiepim/ChangeLog | 4 | ||||
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend.cpp | 205 | ||||
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend.h | 9 | ||||
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp | 144 | ||||
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_sql.h | 23 | ||||
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp | 14 | ||||
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_vcard.h | 4 | ||||
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp | 205 | ||||
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_xml.h | 9 | ||||
-rw-r--r-- | libopie2/opiepim/backend/opimaccessbackend.h | 40 | ||||
-rw-r--r-- | libopie2/opiepim/core/ocontactaccess.h | 37 | ||||
-rw-r--r-- | libopie2/opiepim/core/opimaccesstemplate.h | 53 | ||||
-rw-r--r-- | libopie2/opiepim/core/opimtemplatebase.h | 57 | ||||
-rw-r--r-- | libopie2/opiepim/opiepim.pro | 2 |
14 files changed, 493 insertions, 313 deletions
diff --git a/libopie2/opiepim/ChangeLog b/libopie2/opiepim/ChangeLog index 9c85e4b..dd57259 100644 --- a/libopie2/opiepim/ChangeLog +++ b/libopie2/opiepim/ChangeLog @@ -1 +1,5 @@ +2004-11-23 Stefan Eilers <stefan@eilers-online.net> + * Implement fast and full featured version of sorted() for addressbook + * Implement generic queryByExample for all Addressboook backends. It allows incremental search. + * Update of API Documentation 2004-11-18 Holger Freyther <freyther@handhelds.org> diff --git a/libopie2/opiepim/backend/ocontactaccessbackend.cpp b/libopie2/opiepim/backend/ocontactaccessbackend.cpp index 6ef60eb..b4fdd46 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend.cpp +++ b/libopie2/opiepim/backend/ocontactaccessbackend.cpp @@ -35,2 +35,4 @@ +#include <qdatetime.h> + namespace Opie { @@ -38,10 +40,201 @@ OPimContactAccessBackend::OPimContactAccessBackend() {} -UIDArray -OPimContactAccessBackend::queryByExample( const OPimContact&, int, - const QDateTime& )const { - return UIDArray(); +UIDArray OPimContactAccessBackend::queryByExample( const UIDArray& uid_array, const OPimContact& query, int settings, + const QDateTime& d )const { + odebug << "Using Unaccelerated OPimContactAccessBackend implementation of queryByExample!" << oendl; + + UIDArray m_currentQuery( uid_array.count() ); + uint arraycounter = 0; + + for( uint it = 0; it < uid_array.count(); ++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( find( uid_array[it] ).birthday() ); + // fall through + case Qtopia::Anniversary: + if ( queryDate == 0l ){ + queryDate = new QDate( query.anniversary() ); + checkDate = new QDate( find( uid_array[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 ) ! + if ( current.daysTo( *queryDate ) >= 0 ){ + if ( !( ( *checkDate >= current ) && + ( *checkDate <= *queryDate ) ) ){ + allcorrect = false; + } + } + } + } 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 ( find( uid_array[it] ).field(i), 0 ) == -1 ) + allcorrect = false; + } + break; + case OPimContactAccess::WildCards:{ + QRegExp expr ( query.field(i), + !(settings & OPimContactAccess::IgnoreCase), + true ); + if ( expr.find ( find( uid_array[it] ).field(i), 0 ) == -1 ) + allcorrect = false; + } + break; + case OPimContactAccess::ExactMatch:{ + if (settings & OPimContactAccess::IgnoreCase){ + if ( query.field(i).upper() != + find( uid_array[it] ).field(i).upper() ) + allcorrect = false; + }else{ + if ( query.field(i) != find( uid_array[it] ).field(i) ) + allcorrect = false; + } + } + break; + } + } + } + } + if ( allcorrect ){ + m_currentQuery[arraycounter++] = uid_array[it]; + } + } + + // Shrink to fit.. + m_currentQuery.resize(arraycounter); + + return m_currentQuery; + } -UIDArray -OPimContactAccessBackend::sorted( const UIDArray& ar, bool asc, int sortOrder, +const uint OPimContactAccessBackend::querySettings() const +{ + return ( OPimContactAccess::WildCards + | OPimContactAccess::IgnoreCase + | OPimContactAccess::RegExp + | OPimContactAccess::ExactMatch + | OPimContactAccess::DateDiff + | OPimContactAccess::DateYear + | OPimContactAccess::DateMonth + | OPimContactAccess::DateDay + ); +} + +bool OPimContactAccessBackend::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 ); + } +} + + +UIDArray OPimContactAccessBackend::sorted( const UIDArray& ar, bool asc, int sortOrder, int filter, const QArray<int>& categories)const { diff --git a/libopie2/opiepim/backend/ocontactaccessbackend.h b/libopie2/opiepim/backend/ocontactaccessbackend.h index efb04c7..ee6dbc2 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend.h +++ b/libopie2/opiepim/backend/ocontactaccessbackend.h @@ -82,3 +82,3 @@ class OPimContactAccessBackend: public OPimAccessBackend<OPimContact> { */ - virtual const uint querySettings() = 0; + virtual const uint querySettings() const; @@ -88,4 +88,8 @@ class OPimContactAccessBackend: public OPimAccessBackend<OPimContact> { */ - virtual bool hasQuerySettings (uint querySettings) const = 0; + virtual bool hasQuerySettings (uint querySettings) const; + /** + * Advanced search mechanism. + */ + UIDArray queryByExample( const UIDArray& uidlist, const OPimContact&, int settings, const QDateTime &d = QDateTime() ) const; /** @@ -94,3 +98,2 @@ class OPimContactAccessBackend: public OPimAccessBackend<OPimContact> { //@{ - UIDArray queryByExample( const OPimContact&, int settings, const QDateTime& d = QDateTime() )const; UIDArray sorted( const UIDArray&, bool asc, int, int, const QArray<int>& )const; diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp index 3d284f7..9375f43 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp +++ b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp @@ -129,3 +129,3 @@ namespace { FindQuery(int uid); - FindQuery(const QArray<int>& ); + FindQuery(const UIDArray& ); ~FindQuery(); @@ -135,3 +135,3 @@ namespace { QString multi()const; - QArray<int> m_uids; + UIDArray m_uids; int m_uid; @@ -145,3 +145,3 @@ namespace { FindCustomQuery(int uid); - FindCustomQuery(const QArray<int>& ); + FindCustomQuery(const UIDArray& ); ~FindCustomQuery(); @@ -151,3 +151,3 @@ namespace { QString multi()const; - QArray<int> m_uids; + UIDArray m_uids; int m_uid; @@ -296,3 +296,3 @@ namespace { } - FindQuery::FindQuery(const QArray<int>& ints) + FindQuery::FindQuery(const UIDArray& ints) : OSQLQuery(), m_uids( ints ){ @@ -331,3 +331,3 @@ namespace { } - FindCustomQuery::FindCustomQuery(const QArray<int>& ints) + FindCustomQuery::FindCustomQuery(const UIDArray& ints) : OSQLQuery(), m_uids( ints ){ @@ -424,3 +424,3 @@ bool OPimContactAccessBackend_SQL::wasChangedExternally() -QArray<int> OPimContactAccessBackend_SQL::allRecords() const +UIDArray OPimContactAccessBackend_SQL::allRecords() const { @@ -487,3 +487,3 @@ OPimContact OPimContactAccessBackend_SQL::find ( int uid ) const -OPimContact OPimContactAccessBackend_SQL::find( int uid, const QArray<int>& queryUids, uint current, Frontend::CacheDirection direction ) const +OPimContact OPimContactAccessBackend_SQL::find( int uid, const UIDArray& queryUids, uint current, Frontend::CacheDirection direction ) const { @@ -530,3 +530,4 @@ OPimContact OPimContactAccessBackend_SQL::find( int uid, const QArray<int>& quer -QArray<int> OPimContactAccessBackend_SQL::queryByExample ( const OPimContact &query, int settings, const QDateTime& qd ) +UIDArray OPimContactAccessBackend_SQL::queryByExample ( const OPimContact &query, int settings, + const QDateTime& qd ) const { @@ -641,3 +642,3 @@ QArray<int> OPimContactAccessBackend_SQL::queryByExample ( const OPimContact &qu if ( res.state() != OSQLResult::Success ){ - QArray<int> empty; + UIDArray empty; return empty; @@ -645,3 +646,3 @@ QArray<int> OPimContactAccessBackend_SQL::queryByExample ( const OPimContact &qu - QArray<int> list = extractUids( res ); + UIDArray list = extractUids( res ); @@ -650,3 +651,3 @@ QArray<int> OPimContactAccessBackend_SQL::queryByExample ( const OPimContact &qu -QArray<int> OPimContactAccessBackend_SQL::matchRegexp( const QRegExp &r ) const +UIDArray OPimContactAccessBackend_SQL::matchRegexp( const QRegExp &r ) const { @@ -681,3 +682,3 @@ QArray<int> OPimContactAccessBackend_SQL::matchRegexp( const QRegExp &r ) const -const uint OPimContactAccessBackend_SQL::querySettings() +const uint OPimContactAccessBackend_SQL::querySettings() const { @@ -740,3 +741,4 @@ bool OPimContactAccessBackend_SQL::hasQuerySettings (uint querySettings) const -QArray<int> OPimContactAccessBackend_SQL::sorted( bool asc, int , int , int ) +UIDArray OPimContactAccessBackend_SQL::sorted( const UIDArray& ar, bool asc, int sortOrder, + int filter, const QArray<int>& categories )const { @@ -745,9 +747,103 @@ QArray<int> OPimContactAccessBackend_SQL::sorted( bool asc, int , int , int ) - QString query = "SELECT uid FROM addressbook "; - query += "ORDER BY \"Last Name\" "; + QString query = "SELECT uid FROM addressbook"; + + query += " WHERE ("; + for ( uint i = 0; i < ar.count(); i++ ) { + query += " uid = " + QString::number( ar[i] ) + " OR"; + } + query.remove( query.length()-2, 2 ); // Hmmmm.. + query += ")"; + + + if ( filter != OPimBase::FilterOff ){ + if ( filter & OPimContactAccess::DoNotShowWithCategory ){ + query += " AND ( \"Categories\" == '' )"; + } else if ( filter & OPimBase::FilterCategory ){ + query += " AND ("; + for ( uint i = 0; i < categories.count(); i++ ){ + query += "\"Categories\" LIKE"; + query += QString( " '%" ) + QString::number( categories[i] ) + "%' OR"; + } + query.remove( query.length()-2, 2 ); // Hmmmm.. + query += ")"; + } + + if ( filter & OPimContactAccess::DoNotShowWithoutChildren ){ + query += " AND ( \"Children\" != '' )"; + } + + if ( filter & OPimContactAccess::DoNotShowWithoutAnniversary ){ + query += " AND ( \"Anniversary\" != '' )"; + } + + if ( filter & OPimContactAccess::DoNotShowWithoutBirthday ){ + query += " AND ( \"Birthday\" != '' )"; + } + + if ( filter & OPimContactAccess::DoNotShowWithoutHomeAddress ){ + // Expect that no Street means no Address, too! (eilers) + query += " AND ( \"Home Street\" != '' )"; + } + + if ( filter & OPimContactAccess::DoNotShowWithoutBusinessAddress ){ + // Expect that no Street means no Address, too! (eilers) + query += " AND ( \"Business Street\" != '' )"; + } + + } + + query += " ORDER BY"; + + switch ( sortOrder ) { + case OPimContactAccess::SortSummary: + query += " \"Notes\""; + break; + case OPimContactAccess::SortByCategory: + query += " \"Categories\""; + break; + case OPimContactAccess::SortByDate: + query += " \"\""; + break; + case OPimContactAccess::SortTitle: + query += " \"Name Title\""; + break; + case OPimContactAccess::SortFirstName: + query += " \"First Name\""; + break; + case OPimContactAccess::SortMiddleName: + query += " \"Middle Name\""; + break; + case OPimContactAccess::SortLastName: + query += " \"Last Name\""; + break; + case OPimContactAccess::SortFileAsName: + query += " \"File As\""; + break; + case OPimContactAccess::SortSuffix: + query += " \"Suffix\""; + break; + case OPimContactAccess::SortEmail: + query += " \"Default Email\""; + break; + case OPimContactAccess::SortNickname: + query += " \"Nickname\""; + break; + case OPimContactAccess::SortAnniversary: + query += " \"Anniversary\""; + break; + case OPimContactAccess::SortBirthday: + query += " \"Birthday\""; + break; + case OPimContactAccess::SortGender: + query += " \"Gender\""; + break; + default: + query += " \"Last Name\""; + } if ( !asc ) - query += "DESC"; + query += " DESC"; + - // odebug << "sorted query is: " << query << "" << oendl; + odebug << "sorted query is: " << query << "" << oendl; @@ -756,3 +852,3 @@ QArray<int> OPimContactAccessBackend_SQL::sorted( bool asc, int , int , int ) if ( res.state() != OSQLResult::Success ){ - QArray<int> empty; + UIDArray empty; return empty; @@ -760,3 +856,3 @@ QArray<int> OPimContactAccessBackend_SQL::sorted( bool asc, int , int , int ) - QArray<int> list = extractUids( res ); + UIDArray list = extractUids( res ); @@ -788,3 +884,3 @@ void OPimContactAccessBackend_SQL::update() -QArray<int> OPimContactAccessBackend_SQL::extractUids( OSQLResult& res ) const +UIDArray OPimContactAccessBackend_SQL::extractUids( OSQLResult& res ) const { @@ -795,3 +891,3 @@ QArray<int> OPimContactAccessBackend_SQL::extractUids( OSQLResult& res ) const OSQLResultItem::ValueList::Iterator it; - QArray<int> ints(list.count() ); + UIDArray ints(list.count() ); odebug << " count = " << list.count() << "" << oendl; @@ -839,3 +935,3 @@ QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) co /* Returns contact requested by uid and fills cache with contacts requested by uids in the cachelist */ -OPimContact OPimContactAccessBackend_SQL::requestContactsAndCache( int uid, const QArray<int>& uidlist )const +OPimContact OPimContactAccessBackend_SQL::requestContactsAndCache( int uid, const UIDArray& uidlist )const { @@ -845,3 +941,3 @@ OPimContact OPimContactAccessBackend_SQL::requestContactsAndCache( int uid, cons // by using the cache.. - QArray<int> cachelist = uidlist; + UIDArray cachelist = uidlist; OPimContact retContact; diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_sql.h b/libopie2/opiepim/backend/ocontactaccessbackend_sql.h index 28d9746..299c175 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_sql.h +++ b/libopie2/opiepim/backend/ocontactaccessbackend_sql.h @@ -72,13 +72,13 @@ class OPimContactAccessBackend_SQL : public OPimContactAccessBackend { - QArray<int> allRecords() const; + UIDArray allRecords() const; OPimContact find( int uid ) const; - OPimContact find( int uid, const QArray<int>& items, uint cur, Frontend::CacheDirection ) const; + OPimContact find( int uid, const UIDArray& items, uint cur, Frontend::CacheDirection ) const; - QArray<int> queryByExample ( const OPimContact &query, int settings, - const QDateTime& d ); + UIDArray queryByExample ( const OPimContact &query, int settings, + const QDateTime& d ) const; - QArray<int> matchRegexp( const QRegExp &r ) const; + UIDArray matchRegexp( const QRegExp &r ) const; - const uint querySettings(); + const uint querySettings() const; @@ -86,5 +86,6 @@ class OPimContactAccessBackend_SQL : public OPimContactAccessBackend { - // Currently only asc implemented.. - QArray<int> sorted( bool asc, int , int , int ); - bool add ( const OPimContact &newcontact ); + UIDArray sorted( const UIDArray& ar, bool asc, int sortOrder, + int filter, const QArray<int>& categories)const; + + bool add ( const OPimContact &newcontact ); @@ -96,3 +97,3 @@ class OPimContactAccessBackend_SQL : public OPimContactAccessBackend { private: - QArray<int> extractUids( Opie::DB::OSQLResult& res ) const; + UIDArray extractUids( Opie::DB::OSQLResult& res ) const; QMap<int, QString> requestNonCustom( int uid ) const; @@ -106,3 +107,3 @@ class OPimContactAccessBackend_SQL : public OPimContactAccessBackend { QString m_fileName; - QArray<int> m_uids; + UIDArray m_uids; diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp index 5bb21c7..f3b6d56 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp +++ b/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp @@ -159,5 +159,5 @@ OPimContact OPimContactAccessBackend_VCard::find ( int uid ) const -QArray<int> OPimContactAccessBackend_VCard::allRecords() const +UIDArray OPimContactAccessBackend_VCard::allRecords() const { - QArray<int> ar( m_map.count() ); + UIDArray ar( m_map.count() ); QMap<int, OPimContact>::ConstIterator it; @@ -171,12 +171,2 @@ QArray<int> OPimContactAccessBackend_VCard::allRecords() const -const uint OPimContactAccessBackend_VCard::querySettings() -{ - return 0; // No search possible -} - -bool OPimContactAccessBackend_VCard::hasQuerySettings (uint ) const -{ - return false; // No search possible, therefore all settings invalid ;) -} - bool OPimContactAccessBackend_VCard::wasChangedExternally() diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_vcard.h b/libopie2/opiepim/backend/ocontactaccessbackend_vcard.h index b734530..3591988 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_vcard.h +++ b/libopie2/opiepim/backend/ocontactaccessbackend_vcard.h @@ -60,6 +60,4 @@ class OPimContactAccessBackend_VCard : public OPimContactAccessBackend { OPimContact find ( int uid ) const; - QArray<int> allRecords() const; + UIDArray allRecords() const; - const uint querySettings(); - bool hasQuerySettings (uint querySettings) const; bool wasChangedExternally(); diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp index 5df7253..f96f1bf 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp +++ b/libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp @@ -185,5 +185,5 @@ bool OPimContactAccessBackend_XML::wasChangedExternally() -QArray<int> OPimContactAccessBackend_XML::allRecords() const +UIDArray OPimContactAccessBackend_XML::allRecords() const { - QArray<int> uid_list( m_contactList.count() ); + UIDArray uid_list( m_contactList.count() ); @@ -211,141 +211,6 @@ OPimContact OPimContactAccessBackend_XML::find ( int uid ) const -QArray<int> OPimContactAccessBackend_XML::queryByExample ( const OPimContact &query, int settings, - const QDateTime& d )const -{ - 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 ) ! - if ( current.daysTo( *queryDate ) >= 0 ){ - if ( !( ( *checkDate >= current ) && - ( *checkDate <= *queryDate ) ) ){ - allcorrect = false; - } - } - } - } 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 +UIDArray OPimContactAccessBackend_XML::matchRegexp( const QRegExp &r ) const { - QArray<int> m_currentQuery( m_contactList.count() ); + UIDArray m_currentQuery( m_contactList.count() ); QListIterator<OPimContact> it( m_contactList ); @@ -365,61 +230,3 @@ QArray<int> OPimContactAccessBackend_XML::matchRegexp( const QRegExp &r ) const -const uint OPimContactAccessBackend_XML::querySettings() -{ - 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 ); - } -} @@ -427,3 +234,3 @@ bool OPimContactAccessBackend_XML::hasQuerySettings (uint querySettings) const // Currently only asc implemented.. -QArray<int> OPimContactAccessBackend_XML::sorted( bool asc, int , int , int ) +UIDArray OPimContactAccessBackend_XML::sorted( bool asc, int , int , int ) { @@ -431,3 +238,3 @@ QArray<int> OPimContactAccessBackend_XML::sorted( bool asc, int , int , int ) QStringList names; - QArray<int> m_currentQuery( m_contactList.count() ); + UIDArray m_currentQuery( m_contactList.count() ); diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_xml.h b/libopie2/opiepim/backend/ocontactaccessbackend_xml.h index 3e4f1e1..39378ec 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_xml.h +++ b/libopie2/opiepim/backend/ocontactaccessbackend_xml.h @@ -60,3 +60,3 @@ class OPimContactAccessBackend_XML : public OPimContactAccessBackend { - QArray<int> allRecords() const; + UIDArray allRecords() const; @@ -64,8 +64,3 @@ class OPimContactAccessBackend_XML : public OPimContactAccessBackend { - QArray<int> queryByExample ( const OPimContact &query, int settings, const QDateTime& d )const; - QArray<int> matchRegexp( const QRegExp &r ) const; - - const uint querySettings(); - - bool hasQuerySettings (uint querySettings) const; + UIDArray matchRegexp( const QRegExp &r ) const; diff --git a/libopie2/opiepim/backend/opimaccessbackend.h b/libopie2/opiepim/backend/opimaccessbackend.h index 0d112c9..7321758 100644 --- a/libopie2/opiepim/backend/opimaccessbackend.h +++ b/libopie2/opiepim/backend/opimaccessbackend.h @@ -68,2 +68,21 @@ public: + //@{ + // FIXME: Uncommented some of the abstract functions below. This should be removed as they are implemented in + // all typespecifc backenends (eilers) + /** + * Return all possible settings for queryByExample() + * @return All settings provided by the current backend + * (i.e.: query_WildCards & query_IgnoreCase) + * See implementation in the specific backends for contacts, todo and dates. + */ + virtual const uint querySettings() const { return 0; } /* FIXME: Make Abstrakt !! = 0; */ + + /** + * Check whether settings are correct for queryByExample() + * See implementation in the specific backends for OPimContactAccess, OPimTodoAccess and ODateBookAccess. + * @return <i>true</i> if the given settings are correct and possible. + */ + virtual bool hasQuerySettings (uint querySettings) const { return false; } /* FIXME: Make Abstrakt !! = 0; */ + //@} + @@ -72,5 +91,7 @@ public: virtual UIDArray matchRegexp(const QRegExp &r) const; - virtual UIDArray queryByExample( const T& t, int settings, const QDateTime& d = QDateTime() )const = 0; - virtual UIDArray queryByExample( const OPimRecord* rec, int, const QDateTime& d = QDateTime() )const; - virtual UIDArray sorted( const UIDArray&, bool asc, int sortOrder, int sortFilter, const QArray<int>& cats )const; + virtual UIDArray queryByExample( const UIDArray&, const T& t, + int settings, const QDateTime& d = QDateTime() )const { return UIDArray(); } /* FIXME: Make Abstrakt !! = 0; */ + virtual UIDArray queryByExample( const T& t, int settings, const QDateTime& d = QDateTime() )const; + virtual UIDArray queryByExample( const OPimRecord* rec, int settings, const QDateTime& d = QDateTime() )const; + virtual UIDArray sorted( const UIDArray&, bool asc, int sortOrder, int sortFilter, const QArray<int>& cats )const = 0; virtual UIDArray sorted( bool asc, int sortOrder, int sortFilter, const QArray<int>& cats )const; @@ -152,2 +173,9 @@ UIDArray OPimAccessBackend<T>::matchRegexp( const QRegExp& reg )const { template <class T> +UIDArray OPimAccessBackend<T>::queryByExample( const T& rec, int settings, + const QDateTime& datetime )const { + + return queryByExample( allRecords(), rec, settings, datetime ); +} + +template <class T> UIDArray OPimAccessBackend<T>::queryByExample( const OPimRecord* rec, int settings, @@ -163,8 +191,2 @@ UIDArray OPimAccessBackend<T>::queryByExample( const OPimRecord* rec, int settin template <class T> -UIDArray OPimAccessBackend<T>::sorted( const UIDArray& ids, bool, - int, int, const QArray<int>& ) const { - return ids; -} - -template <class T> UIDArray OPimAccessBackend<T>::sorted( bool asc, int order, int filter, diff --git a/libopie2/opiepim/core/ocontactaccess.h b/libopie2/opiepim/core/ocontactaccess.h index 691ece2..bd85b4e 100644 --- a/libopie2/opiepim/core/ocontactaccess.h +++ b/libopie2/opiepim/core/ocontactaccess.h @@ -62,10 +62,25 @@ class OPimContactAccess: public QObject, public OPimAccessTemplate<OPimContact> public: + /** + * Filter for sorted() + * @see SortFilterBase in OPimBase + */ enum SortFilter { - DoNotShowNoneChildren = FilterCustom<<1, - DoNotShowNoneAnniversary = FilterCustom<<2, - DoNotShowNoneBirthday = FilterCustom<<3, - DoNotShowNoHomeAddress = FilterCustom<<4, - DoNotShowNoBusinessAddress = FilterCustom<<5 + /** Don't return entries who don't have children */ + DoNotShowWithoutChildren = FilterCustom<<1, + /** Don't return entries who don't have an anniversary */ + DoNotShowWithoutAnniversary = FilterCustom<<2, + /** Don't return entries who don't have a birthday */ + DoNotShowWithoutBirthday = FilterCustom<<3, + /** Don't return entries who don't have a home address */ + DoNotShowWithoutHomeAddress = FilterCustom<<4, + /** Don't return entries who don't have a business address */ + DoNotShowWithoutBusinessAddress = FilterCustom<<5, + /** Don't return entries which hava any category */ + DoNotShowWithCategory = FilterCustom << 6 }; + /** + * Sort order for sorted() + * @see SortOrderBase in OPimBase + */ enum SortOrder { @@ -74,2 +89,3 @@ class OPimContactAccess: public QObject, public OPimAccessTemplate<OPimContact> SortMiddleName, + SortLastName, SortSuffix, @@ -77,2 +93,3 @@ class OPimContactAccess: public QObject, public OPimAccessTemplate<OPimContact> SortNickname, + SortFileAsName, SortAnniversary, @@ -101,5 +118,7 @@ class OPimContactAccess: public QObject, public OPimAccessTemplate<OPimContact> - /** Return all possible settings. + /** + * Return all possible settings for queryByExample(). * @return All settings provided by the current backend - * (i.e.: query_WildCards & query_IgnoreCase) + * (i.e.: WildCards & IgnoreCase) + * @see QuerySettings in OPimBase for details of the parameter */ @@ -107,4 +126,6 @@ class OPimContactAccess: public QObject, public OPimAccessTemplate<OPimContact> - /** Check whether settings are correct. + /** + * Check whether settings are correct for queryByExample(). * @return <i>true</i> if the given settings are correct and possible. + * @see QuerySettings in OPimBase for details of the parameter */ diff --git a/libopie2/opiepim/core/opimaccesstemplate.h b/libopie2/opiepim/core/opimaccesstemplate.h index 2deb92a..073d5f9 100644 --- a/libopie2/opiepim/core/opimaccesstemplate.h +++ b/libopie2/opiepim/core/opimaccesstemplate.h @@ -92,11 +92,48 @@ public: uint current, typename OTemplateBase<T>::CacheDirection dir = OTemplateBase<T>::Forward )const; - virtual List sorted( const List&, bool ascending, int sortOrder, + //@} + + /** + * Get sorted lists.. + * @see OPimContactAccess, OPimTodoAccess and ODateBookAccess regarding more info for the following params: + * @param list of UID's received by allRecords() or others... + * @param sortOrder Setting the sort order defined by enum SortOrder + * @param ascending Sort in ascending order if true, otherwise descending + * @param sortFilter Setting the sort filter defined by enum SortFilter + * @param cat number of category. + */ + virtual List sorted( const List& list, bool ascending, int sortOrder, int sortFilter, int cat )const; - virtual List sorted( const List&, bool ascending, int sortOrder, + + /** + * Get sorted lists.. + * @see OPimContactAccess, OPimTodoAccess and ODateBookAccess regarding more info for the following params: + * @param list of UID's received by allRecords() or others... + * @param sortOrder Setting the sort order defined by enum SortOrder + * @param ascending Sort in ascending order if true, otherwise descending + * @param sortFilter Setting the sort filter defined by enum SortFilter + * @param cats List of categories. + */ + virtual List sorted( const List& list, bool ascending, int sortOrder, int sortFilter, const QArray<UID>& cats )const; + + /** + * Get sorted lists.. + * @see OPimContactAccess, OPimTodoAccess and ODateBookAccess regarding more info for the following params: + * @param ascending Sort in ascending order if true, otherwise descending + * @param sortOrder Setting the sort order defined by enum SortOrder + * @param sortFilter Setting the sort filter defined by enum SortFilter + * @param cat number of category. + */ virtual List sorted( bool ascending, int sortOrder, int sortFilter, int cat )const; - virtual List sorted( bool ascending, int sortOrder, int sortOrder, - const QArray<UID>& cats )const; - //@} + /** + * Get sorted lists.. + * @see OPimContactAccess, OPimTodoAccess and ODateBookAccess regarding more info for the following params: + * @param ascending Sort in ascending order if true, otherwise descending + * @param sortOrder Setting the sort order defined by enum SortOrder + * @param sortFilter Setting the sort filter defined by enum SortFilter + * @param cats List of categories. + */ + virtual List sorted( bool ascending, int sortOrder, int sortFilter, + const QArray<UID>& cats )const; /** @@ -131,3 +168,2 @@ public: void setReadAhead( uint count ); - virtual T cacheFind( int uid )const; void cache( const T& )const; @@ -260,7 +296,2 @@ T OPimAccessTemplate<T>::find( UID uid ) const{ -template <class T> -T OPimAccessTemplate<T>::cacheFind( int uid ) const -{ - return m_cache.find( uid ); -} diff --git a/libopie2/opiepim/core/opimtemplatebase.h b/libopie2/opiepim/core/opimtemplatebase.h index b238a68..c8abab4 100644 --- a/libopie2/opiepim/core/opimtemplatebase.h +++ b/libopie2/opiepim/core/opimtemplatebase.h @@ -82,2 +82,3 @@ struct OPimBase { virtual QArray<UID> records()const = 0; + //@} @@ -89,12 +90,22 @@ struct OPimBase { enum QuerySettings { - WildCards = 0x0001, /** Use Wildcards */ - IgnoreCase = 0x0002, /** Ignore the Case */ - RegExp = 0x0004, /** Do a Regular Expression match */ - ExactMatch = 0x0008, /** It needs to exactly match */ - MatchOne = 0x0010, /** Only one Entry must match */ - DateDiff = 0x0020, /** Find all entries from today until given date */ - DateYear = 0x0040, /** The year matches */ - DateMonth = 0x0080, /** The month matches */ - DateDay = 0x0100, /** The day matches */ - LastItem = 0xffff /** the last possible name */ + /** Use Wildcards */ + WildCards = 0x0001, + /** Ignore the Case */ + IgnoreCase = 0x0002, + /** Do a Regular Expression match */ + RegExp = 0x0004, + /** It needs to exactly match */ + ExactMatch = 0x0008, + /** Only one Entry must match */ + MatchOne = 0x0010, + /** Find all entries from today until given date */ + DateDiff = 0x0020, + /** The year matches */ + DateYear = 0x0040, + /** The month matches */ + DateMonth = 0x0080, + /** The day matches */ + DateDay = 0x0100, + /** The last possible name matches */ + LastItem = 0xffff }; @@ -105,7 +116,12 @@ struct OPimBase { enum SortOrderBase { - SortSummary = 0, /** Sort by a Summary of the records */ - SortByCategory = 1, /** Sort by Category */ - SortByDate = 2, /** Sort by Date */ - SortCustom = 10, /** The First available sort number for the OPimAccessTemplates */ - LastSortOrderBase = 0xffff /** make this enum 16bit large */ + /** Sort by a Summary of the records */ + SortSummary = 0, + /** Sort by Category */ + SortByCategory = 1, + /** Sort by Date */ + SortByDate = 2, + /** The First available sort number for the OPimAccessTemplates */ + SortCustom = 10, + /** make this enum 16bit large */ + LastSortOrderBase = 0xffff }; @@ -113,4 +129,3 @@ struct OPimBase { /** - * Sort with the help of the \sa sorted function - * a list of Items. + * Sort a list of Items with the help of the sorted() function. * The Item you provide in SortOrder will be used @@ -118,7 +133,11 @@ struct OPimBase { * - * @see sorted + * @see OPimAccessTemplate<>::sorted() */ enum SortFilterBase { + /** Do not filter anything. */ + FilterOff = 0, + /** Use given Categories for filter */ FilterCategory = 1, - FilterCustom = 1024, + /** The first available custom filter defined in the specialized frontends */ + FilterCustom = 1024, LastSortFilterBase = 0xffffffff diff --git a/libopie2/opiepim/opiepim.pro b/libopie2/opiepim/opiepim.pro index 47ec6da..992fb8b 100644 --- a/libopie2/opiepim/opiepim.pro +++ b/libopie2/opiepim/opiepim.pro @@ -6,3 +6,3 @@ INTERFACES = TARGET = opiepim2 -VERSION = 1.9.1 +VERSION = 1.8.6 INCLUDEPATH += $(OPIEDIR)/include |