summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--libopie2/opiepim/ChangeLog4
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend.cpp205
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend.h9
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp140
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_sql.h21
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp14
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_vcard.h4
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_xml.cpp205
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_xml.h9
-rw-r--r--libopie2/opiepim/backend/opimaccessbackend.h40
-rw-r--r--libopie2/opiepim/core/ocontactaccess.h37
-rw-r--r--libopie2/opiepim/core/opimaccesstemplate.h53
-rw-r--r--libopie2/opiepim/core/opimtemplatebase.h55
-rw-r--r--libopie2/opiepim/opiepim.pro2
14 files changed, 489 insertions, 309 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,5 +88,9 @@ 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;
+ /**
* Slow and inefficent default implementation
@@ -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
{
@@ -746,3 +748,96 @@ QArray<int> OPimContactAccessBackend_SQL::sorted( bool asc, int , int , int )
QString query = "SELECT uid FROM addressbook ";
- query += "ORDER BY \"Last Name\" ";
+
+ 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\"";
+ }
@@ -751,3 +846,4 @@ QArray<int> OPimContactAccessBackend_SQL::sorted( bool asc, int , int , int )
- // 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,4 +86,5 @@ class OPimContactAccessBackend_SQL : public OPimContactAccessBackend {
- // Currently only asc implemented..
- QArray<int> sorted( bool asc, int , int , int );
+ 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,12 +92,49 @@ 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;
+ /**
* (Re)Implementation
@@ -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,6 +133,10 @@ struct OPimBase {
*
- * @see sorted
+ * @see OPimAccessTemplate<>::sorted()
*/
enum SortFilterBase {
+ /** Do not filter anything. */
+ FilterOff = 0,
+ /** Use given Categories for filter */
FilterCategory = 1,
+ /** The first available custom filter defined in the specialized frontends */
FilterCustom = 1024,
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