summaryrefslogtreecommitdiff
authoreilers <eilers>2004-12-20 14:14:07 (UTC)
committer eilers <eilers>2004-12-20 14:14:07 (UTC)
commit18e47153532d016d878f47e0ce11cb1a9716218e (patch) (unidiff)
tree52eb6c25258fda0b2f295a29809c4603f5e17b0b
parent876e48baa20213d8265041cfac3034fe92cb0590 (diff)
downloadopie-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
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,3 +1,7 @@
12004-11-23 Stefan Eilers <stefan@eilers-online.net>
2 * Implement fast and full featured version of sorted() for addressbook
3 * Implement generic queryByExample for all Addressboook backends. It allows incremental search.
4 * Update of API Documentation
12004-11-18 Holger Freyther <freyther@handhelds.org> 52004-11-18 Holger Freyther <freyther@handhelds.org>
2 * Every Access can give a set of Occurrences for a period or a datetime 6 * Every Access can give a set of Occurrences for a period or a datetime
3 * QueryByExample, Find, Sort can be generically accessed by OPimBase 7 * QueryByExample, Find, Sort can be generically accessed by OPimBase
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
@@ -33,17 +33,210 @@
33 33
34#include <opie2/odebug.h> 34#include <opie2/odebug.h>
35 35
36#include <qdatetime.h>
37
36namespace Opie { 38namespace Opie {
37OPimContactAccessBackend::OPimContactAccessBackend() {} 39OPimContactAccessBackend::OPimContactAccessBackend() {}
38 40
39UIDArray 41UIDArray OPimContactAccessBackend::queryByExample( const UIDArray& uid_array, const OPimContact& query, int settings,
40OPimContactAccessBackend::queryByExample( const OPimContact&, int, 42 const QDateTime& d )const {
41 const QDateTime& )const { 43 odebug << "Using Unaccelerated OPimContactAccessBackend implementation of queryByExample!" << oendl;
42 return UIDArray(); 44
45 UIDArray m_currentQuery( uid_array.count() );
46 uint arraycounter = 0;
47
48 for( uint it = 0; it < uid_array.count(); ++it ){
49 /* Search all fields and compare them with query object. Store them into list
50 * if all fields matches.
51 */
52 QDate* queryDate = 0l;
53 QDate* checkDate = 0l;
54 bool allcorrect = true;
55 for ( int i = 0; i < Qtopia::Groups; i++ ) {
56 // Birthday and anniversary are special nonstring fields and should
57 // be handled specially
58 switch ( i ){
59 case Qtopia::Birthday:
60 queryDate = new QDate( query.birthday() );
61 checkDate = new QDate( find( uid_array[it] ).birthday() );
62 // fall through
63 case Qtopia::Anniversary:
64 if ( queryDate == 0l ){
65 queryDate = new QDate( query.anniversary() );
66 checkDate = new QDate( find( uid_array[it] ).anniversary() );
67 }
68
69 if ( queryDate->isValid() ){
70 if( checkDate->isValid() ){
71 if ( settings & OPimContactAccess::DateYear ){
72 if ( queryDate->year() != checkDate->year() )
73 allcorrect = false;
74 }
75 if ( settings & OPimContactAccess::DateMonth ){
76 if ( queryDate->month() != checkDate->month() )
77 allcorrect = false;
78 }
79 if ( settings & OPimContactAccess::DateDay ){
80 if ( queryDate->day() != checkDate->day() )
81 allcorrect = false;
82 }
83 if ( settings & OPimContactAccess::DateDiff ) {
84 QDate current;
85 // If we get an additional date, we
86 // will take this date instead of
87 // the current one..
88 if ( !d.date().isValid() )
89 current = QDate::currentDate();
90 else
91 current = d.date();
92
93 // We have to equalize the year, otherwise
94 // the search will fail..
95 checkDate->setYMD( current.year(),
96 checkDate->month(),
97 checkDate->day() );
98 if ( *checkDate < current )
99 checkDate->setYMD( current.year()+1,
100 checkDate->month(),
101 checkDate->day() );
102
103 // Check whether the birthday/anniversary date is between
104 // the current/given date and the maximum date
105 // ( maximum time range ) !
106 if ( current.daysTo( *queryDate ) >= 0 ){
107 if ( !( ( *checkDate >= current ) &&
108 ( *checkDate <= *queryDate ) ) ){
109 allcorrect = false;
110 }
111 }
112 }
113 } else{
114 // checkDate is invalid. Therefore this entry is always rejected
115 allcorrect = false;
116 }
117 }
118
119 delete queryDate;
120 queryDate = 0l;
121 delete checkDate;
122 checkDate = 0l;
123 break;
124 default:
125 /* Just compare fields which are not empty in the query object */
126 if ( !query.field(i).isEmpty() ){
127 switch ( settings & ~( OPimContactAccess::IgnoreCase
128 | OPimContactAccess::DateDiff
129 | OPimContactAccess::DateYear
130 | OPimContactAccess::DateMonth
131 | OPimContactAccess::DateDay
132 | OPimContactAccess::MatchOne
133 ) ){
134
135 case OPimContactAccess::RegExp:{
136 QRegExp expr ( query.field(i),
137 !(settings & OPimContactAccess::IgnoreCase),
138 false );
139 if ( expr.find ( find( uid_array[it] ).field(i), 0 ) == -1 )
140 allcorrect = false;
141 }
142 break;
143 case OPimContactAccess::WildCards:{
144 QRegExp expr ( query.field(i),
145 !(settings & OPimContactAccess::IgnoreCase),
146 true );
147 if ( expr.find ( find( uid_array[it] ).field(i), 0 ) == -1 )
148 allcorrect = false;
149 }
150 break;
151 case OPimContactAccess::ExactMatch:{
152 if (settings & OPimContactAccess::IgnoreCase){
153 if ( query.field(i).upper() !=
154 find( uid_array[it] ).field(i).upper() )
155 allcorrect = false;
156 }else{
157 if ( query.field(i) != find( uid_array[it] ).field(i) )
158 allcorrect = false;
159 }
160 }
161 break;
162 }
163 }
164 }
165 }
166 if ( allcorrect ){
167 m_currentQuery[arraycounter++] = uid_array[it];
168 }
169 }
170
171 // Shrink to fit..
172 m_currentQuery.resize(arraycounter);
173
174 return m_currentQuery;
175
43} 176}
44 177
45UIDArray 178const uint OPimContactAccessBackend::querySettings() const
46OPimContactAccessBackend::sorted( const UIDArray& ar, bool asc, int sortOrder, 179{
180 return ( OPimContactAccess::WildCards
181 | OPimContactAccess::IgnoreCase
182 | OPimContactAccess::RegExp
183 | OPimContactAccess::ExactMatch
184 | OPimContactAccess::DateDiff
185 | OPimContactAccess::DateYear
186 | OPimContactAccess::DateMonth
187 | OPimContactAccess::DateDay
188 );
189}
190
191bool OPimContactAccessBackend::hasQuerySettings (uint querySettings) const
192{
193 /* OPimContactAccess::IgnoreCase, DateDiff, DateYear, DateMonth, DateDay
194 * may be added with any of the other settings. IgnoreCase should never used alone.
195 * Wildcards, RegExp, ExactMatch should never used at the same time...
196 */
197
198 // Step 1: Check whether the given settings are supported by this backend
199 if ( ( querySettings & (
200 OPimContactAccess::IgnoreCase
201 | OPimContactAccess::WildCards
202 | OPimContactAccess::DateDiff
203 | OPimContactAccess::DateYear
204 | OPimContactAccess::DateMonth
205 | OPimContactAccess::DateDay
206 | OPimContactAccess::RegExp
207 | OPimContactAccess::ExactMatch
208 ) ) != querySettings )
209 return false;
210
211 // Step 2: Check whether the given combinations are ok..
212
213 // IngoreCase alone is invalid
214 if ( querySettings == OPimContactAccess::IgnoreCase )
215 return false;
216
217 // WildCards, RegExp and ExactMatch should never used at the same time
218 switch ( querySettings & ~( OPimContactAccess::IgnoreCase
219 | OPimContactAccess::DateDiff
220 | OPimContactAccess::DateYear
221 | OPimContactAccess::DateMonth
222 | OPimContactAccess::DateDay
223 )
224 ){
225 case OPimContactAccess::RegExp:
226 return ( true );
227 case OPimContactAccess::WildCards:
228 return ( true );
229 case OPimContactAccess::ExactMatch:
230 return ( true );
231 case 0: // one of the upper removed bits were set..
232 return ( true );
233 default:
234 return ( false );
235 }
236}
237
238
239UIDArray OPimContactAccessBackend::sorted( const UIDArray& ar, bool asc, int sortOrder,
47 int filter, const QArray<int>& categories)const { 240 int filter, const QArray<int>& categories)const {
48 odebug << "Using Unaccelerated OPimContactAccessBackend sorted Implementation" << oendl; 241 odebug << "Using Unaccelerated OPimContactAccessBackend sorted Implementation" << oendl;
49 242
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
@@ -80,19 +80,22 @@ class OPimContactAccessBackend: public OPimAccessBackend<OPimContact> {
80 * @return All settings provided by the current backend 80 * @return All settings provided by the current backend
81 * (i.e.: query_WildCards & query_IgnoreCase) 81 * (i.e.: query_WildCards & query_IgnoreCase)
82 */ 82 */
83 virtual const uint querySettings() = 0; 83 virtual const uint querySettings() const;
84 84
85 /** 85 /**
86 * Check whether settings are correct. 86 * Check whether settings are correct.
87 * @return <i>true</i> if the given settings are correct and possible. 87 * @return <i>true</i> if the given settings are correct and possible.
88 */ 88 */
89 virtual bool hasQuerySettings (uint querySettings) const = 0; 89 virtual bool hasQuerySettings (uint querySettings) const;
90 90
91 /** 91 /**
92 * Advanced search mechanism.
93 */
94 UIDArray queryByExample( const UIDArray& uidlist, const OPimContact&, int settings, const QDateTime &d = QDateTime() ) const;
95 /**
92 * Slow and inefficent default implementation 96 * Slow and inefficent default implementation
93 */ 97 */
94//@{ 98//@{
95 UIDArray queryByExample( const OPimContact&, int settings, const QDateTime& d = QDateTime() )const;
96 UIDArray sorted( const UIDArray&, bool asc, int, int, const QArray<int>& )const; 99 UIDArray sorted( const UIDArray&, bool asc, int, int, const QArray<int>& )const;
97 OPimBackendOccurrence::List occurrences( const QDate&, const QDate& )const; 100 OPimBackendOccurrence::List occurrences( const QDate&, const QDate& )const;
98//@} 101//@}
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
@@ -127,13 +127,13 @@ namespace {
127 class FindQuery : public OSQLQuery { 127 class FindQuery : public OSQLQuery {
128 public: 128 public:
129 FindQuery(int uid); 129 FindQuery(int uid);
130 FindQuery(const QArray<int>& ); 130 FindQuery(const UIDArray& );
131 ~FindQuery(); 131 ~FindQuery();
132 QString query()const; 132 QString query()const;
133 private: 133 private:
134 QString single()const; 134 QString single()const;
135 QString multi()const; 135 QString multi()const;
136 QArray<int> m_uids; 136 UIDArray m_uids;
137 int m_uid; 137 int m_uid;
138 }; 138 };
139 139
@@ -143,13 +143,13 @@ namespace {
143 class FindCustomQuery : public OSQLQuery { 143 class FindCustomQuery : public OSQLQuery {
144 public: 144 public:
145 FindCustomQuery(int uid); 145 FindCustomQuery(int uid);
146 FindCustomQuery(const QArray<int>& ); 146 FindCustomQuery(const UIDArray& );
147 ~FindCustomQuery(); 147 ~FindCustomQuery();
148 QString query()const; 148 QString query()const;
149 private: 149 private:
150 QString single()const; 150 QString single()const;
151 QString multi()const; 151 QString multi()const;
152 QArray<int> m_uids; 152 UIDArray m_uids;
153 int m_uid; 153 int m_uid;
154 }; 154 };
155 155
@@ -294,7 +294,7 @@ namespace {
294 FindQuery::FindQuery(int uid) 294 FindQuery::FindQuery(int uid)
295 : OSQLQuery(), m_uid( uid ) { 295 : OSQLQuery(), m_uid( uid ) {
296 } 296 }
297 FindQuery::FindQuery(const QArray<int>& ints) 297 FindQuery::FindQuery(const UIDArray& ints)
298 : OSQLQuery(), m_uids( ints ){ 298 : OSQLQuery(), m_uids( ints ){
299 } 299 }
300 FindQuery::~FindQuery() { 300 FindQuery::~FindQuery() {
@@ -329,7 +329,7 @@ namespace {
329 FindCustomQuery::FindCustomQuery(int uid) 329 FindCustomQuery::FindCustomQuery(int uid)
330 : OSQLQuery(), m_uid( uid ) { 330 : OSQLQuery(), m_uid( uid ) {
331 } 331 }
332 FindCustomQuery::FindCustomQuery(const QArray<int>& ints) 332 FindCustomQuery::FindCustomQuery(const UIDArray& ints)
333 : OSQLQuery(), m_uids( ints ){ 333 : OSQLQuery(), m_uids( ints ){
334 } 334 }
335 FindCustomQuery::~FindCustomQuery() { 335 FindCustomQuery::~FindCustomQuery() {
@@ -422,7 +422,7 @@ bool OPimContactAccessBackend_SQL::wasChangedExternally()
422 return false; 422 return false;
423} 423}
424 424
425QArray<int> OPimContactAccessBackend_SQL::allRecords() const 425UIDArray OPimContactAccessBackend_SQL::allRecords() const
426{ 426{
427 427
428 // FIXME: Think about cute handling of changed tables.. 428 // FIXME: Think about cute handling of changed tables..
@@ -485,7 +485,7 @@ OPimContact OPimContactAccessBackend_SQL::find ( int uid ) const
485 return retContact; 485 return retContact;
486} 486}
487 487
488OPimContact OPimContactAccessBackend_SQL::find( int uid, const QArray<int>& queryUids, uint current, Frontend::CacheDirection direction ) const 488OPimContact OPimContactAccessBackend_SQL::find( int uid, const UIDArray& queryUids, uint current, Frontend::CacheDirection direction ) const
489{ 489{
490 odebug << "OPimContactAccessBackend_SQL::find( ..multi.. )" << oendl; 490 odebug << "OPimContactAccessBackend_SQL::find( ..multi.. )" << oendl;
491 odebug << "searching for " << uid << "" << oendl; 491 odebug << "searching for " << uid << "" << oendl;
@@ -528,7 +528,8 @@ OPimContact OPimContactAccessBackend_SQL::find( int uid, const QArray<int>& quer
528} 528}
529 529
530 530
531QArray<int> OPimContactAccessBackend_SQL::queryByExample ( const OPimContact &query, int settings, const QDateTime& qd ) 531UIDArray OPimContactAccessBackend_SQL::queryByExample ( const OPimContact &query, int settings,
532 const QDateTime& qd ) const
532{ 533{
533 QString qu = "SELECT uid FROM addressbook WHERE"; 534 QString qu = "SELECT uid FROM addressbook WHERE";
534 QString searchQuery =""; 535 QString searchQuery ="";
@@ -639,16 +640,16 @@ QArray<int> OPimContactAccessBackend_SQL::queryByExample ( const OPimContact &qu
639 OSQLRawQuery raw( qu ); 640 OSQLRawQuery raw( qu );
640 OSQLResult res = m_driver->query( &raw ); 641 OSQLResult res = m_driver->query( &raw );
641 if ( res.state() != OSQLResult::Success ){ 642 if ( res.state() != OSQLResult::Success ){
642 QArray<int> empty; 643 UIDArray empty;
643 return empty; 644 return empty;
644 } 645 }
645 646
646 QArray<int> list = extractUids( res ); 647 UIDArray list = extractUids( res );
647 648
648 return list; 649 return list;
649} 650}
650 651
651QArray<int> OPimContactAccessBackend_SQL::matchRegexp( const QRegExp &r ) const 652UIDArray OPimContactAccessBackend_SQL::matchRegexp( const QRegExp &r ) const
652{ 653{
653#if 0 654#if 0
654 QArray<int> nix(0); 655 QArray<int> nix(0);
@@ -679,7 +680,7 @@ QArray<int> OPimContactAccessBackend_SQL::matchRegexp( const QRegExp &r ) const
679#endif 680#endif
680} 681}
681 682
682const uint OPimContactAccessBackend_SQL::querySettings() 683const uint OPimContactAccessBackend_SQL::querySettings() const
683{ 684{
684 return OPimContactAccess::IgnoreCase 685 return OPimContactAccess::IgnoreCase
685 | OPimContactAccess::WildCards 686 | OPimContactAccess::WildCards
@@ -738,27 +739,122 @@ bool OPimContactAccessBackend_SQL::hasQuerySettings (uint querySettings) const
738 739
739} 740}
740 741
741QArray<int> OPimContactAccessBackend_SQL::sorted( bool asc, int , int , int ) 742UIDArray OPimContactAccessBackend_SQL::sorted( const UIDArray& ar, bool asc, int sortOrder,
743 int filter, const QArray<int>& categories )const
742{ 744{
743 QTime t; 745 QTime t;
744 t.start(); 746 t.start();
745 747
746 QString query = "SELECT uid FROM addressbook "; 748 QString query = "SELECT uid FROM addressbook ";
747 query += "ORDER BY \"Last Name\" "; 749
750 query += " WHERE (";
751 for ( uint i = 0; i < ar.count(); i++ ) {
752 query += " uid = " + QString::number( ar[i] ) + " OR";
753 }
754 query.remove( query.length()-2, 2 ); // Hmmmm..
755 query += ")";
756
757
758 if ( filter != OPimBase::FilterOff ){
759 if ( filter & OPimContactAccess::DoNotShowWithCategory ){
760 query += " AND ( \"Categories\" == '' )";
761 } else if ( filter & OPimBase::FilterCategory ){
762 query += " AND (";
763 for ( uint i = 0; i < categories.count(); i++ ){
764 query += "\"Categories\" LIKE";
765 query += QString( " '%" ) + QString::number( categories[i] ) + "%' OR";
766 }
767 query.remove( query.length()-2, 2 ); // Hmmmm..
768 query += ")";
769 }
770
771 if ( filter & OPimContactAccess::DoNotShowWithoutChildren ){
772 query += " AND ( \"Children\" != '' )";
773 }
774
775 if ( filter & OPimContactAccess::DoNotShowWithoutAnniversary ){
776 query += " AND ( \"Anniversary\" != '' )";
777 }
778
779 if ( filter & OPimContactAccess::DoNotShowWithoutBirthday ){
780 query += " AND ( \"Birthday\" != '' )";
781 }
782
783 if ( filter & OPimContactAccess::DoNotShowWithoutHomeAddress ){
784 // Expect that no Street means no Address, too! (eilers)
785 query += " AND ( \"Home Street\" != '' )";
786 }
787
788 if ( filter & OPimContactAccess::DoNotShowWithoutBusinessAddress ){
789 // Expect that no Street means no Address, too! (eilers)
790 query += " AND ( \"Business Street\" != '' )";
791 }
792
793 }
794
795 query += " ORDER BY";
796
797 switch ( sortOrder ) {
798 case OPimContactAccess::SortSummary:
799 query += " \"Notes\"";
800 break;
801 case OPimContactAccess::SortByCategory:
802 query += " \"Categories\"";
803 break;
804 case OPimContactAccess::SortByDate:
805 query += " \"\"";
806 break;
807 case OPimContactAccess::SortTitle:
808 query += " \"Name Title\"";
809 break;
810 case OPimContactAccess::SortFirstName:
811 query += " \"First Name\"";
812 break;
813 case OPimContactAccess::SortMiddleName:
814 query += " \"Middle Name\"";
815 break;
816 case OPimContactAccess::SortLastName:
817 query += " \"Last Name\"";
818 break;
819 case OPimContactAccess::SortFileAsName:
820 query += " \"File As\"";
821 break;
822 case OPimContactAccess::SortSuffix:
823 query += " \"Suffix\"";
824 break;
825 case OPimContactAccess::SortEmail:
826 query += " \"Default Email\"";
827 break;
828 case OPimContactAccess::SortNickname:
829 query += " \"Nickname\"";
830 break;
831 case OPimContactAccess::SortAnniversary:
832 query += " \"Anniversary\"";
833 break;
834 case OPimContactAccess::SortBirthday:
835 query += " \"Birthday\"";
836 break;
837 case OPimContactAccess::SortGender:
838 query += " \"Gender\"";
839 break;
840 default:
841 query += " \"Last Name\"";
842 }
748 843
749 if ( !asc ) 844 if ( !asc )
750 query += "DESC"; 845 query += "DESC";
751 846
752 // odebug << "sorted query is: " << query << "" << oendl; 847
848 odebug << "sorted query is: " << query << "" << oendl;
753 849
754 OSQLRawQuery raw( query ); 850 OSQLRawQuery raw( query );
755 OSQLResult res = m_driver->query( &raw ); 851 OSQLResult res = m_driver->query( &raw );
756 if ( res.state() != OSQLResult::Success ){ 852 if ( res.state() != OSQLResult::Success ){
757 QArray<int> empty; 853 UIDArray empty;
758 return empty; 854 return empty;
759 } 855 }
760 856
761 QArray<int> list = extractUids( res ); 857 UIDArray list = extractUids( res );
762 858
763 odebug << "sorted needed " << t.elapsed() << " ms!" << oendl; 859 odebug << "sorted needed " << t.elapsed() << " ms!" << oendl;
764 return list; 860 return list;
@@ -786,14 +882,14 @@ void OPimContactAccessBackend_SQL::update()
786 odebug << "Update ends " << t.elapsed() << " ms" << oendl; 882 odebug << "Update ends " << t.elapsed() << " ms" << oendl;
787} 883}
788 884
789QArray<int> OPimContactAccessBackend_SQL::extractUids( OSQLResult& res ) const 885UIDArray OPimContactAccessBackend_SQL::extractUids( OSQLResult& res ) const
790{ 886{
791 odebug << "extractUids" << oendl; 887 odebug << "extractUids" << oendl;
792 QTime t; 888 QTime t;
793 t.start(); 889 t.start();
794 OSQLResultItem::ValueList list = res.results(); 890 OSQLResultItem::ValueList list = res.results();
795 OSQLResultItem::ValueList::Iterator it; 891 OSQLResultItem::ValueList::Iterator it;
796 QArray<int> ints(list.count() ); 892 UIDArray ints(list.count() );
797 odebug << " count = " << list.count() << "" << oendl; 893 odebug << " count = " << list.count() << "" << oendl;
798 894
799 int i = 0; 895 int i = 0;
@@ -837,13 +933,13 @@ QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) co
837} 933}
838 934
839/* Returns contact requested by uid and fills cache with contacts requested by uids in the cachelist */ 935/* Returns contact requested by uid and fills cache with contacts requested by uids in the cachelist */
840OPimContact OPimContactAccessBackend_SQL::requestContactsAndCache( int uid, const QArray<int>& uidlist )const 936OPimContact OPimContactAccessBackend_SQL::requestContactsAndCache( int uid, const UIDArray& uidlist )const
841{ 937{
842 // We want to get all contacts with one query. 938 // We want to get all contacts with one query.
843 // We don't have to add the given uid to the uidlist, it is expected to be there already (see opimrecordlist.h). 939 // We don't have to add the given uid to the uidlist, it is expected to be there already (see opimrecordlist.h).
844 // All contacts will be stored in the cache, afterwards the contact with the user id "uid" will be returned 940 // All contacts will be stored in the cache, afterwards the contact with the user id "uid" will be returned
845 // by using the cache.. 941 // by using the cache..
846 QArray<int> cachelist = uidlist; 942 UIDArray cachelist = uidlist;
847 OPimContact retContact; 943 OPimContact retContact;
848 944
849 odebug << "Reqest and cache" << cachelist.size() << "elements !" << oendl; 945 odebug << "Reqest and cache" << cachelist.size() << "elements !" << oendl;
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
@@ -70,22 +70,23 @@ class OPimContactAccessBackend_SQL : public OPimContactAccessBackend {
70 70
71 bool wasChangedExternally(); 71 bool wasChangedExternally();
72 72
73 QArray<int> allRecords() const; 73 UIDArray allRecords() const;
74 74
75 OPimContact find( int uid ) const; 75 OPimContact find( int uid ) const;
76 OPimContact find( int uid, const QArray<int>& items, uint cur, Frontend::CacheDirection ) const; 76 OPimContact find( int uid, const UIDArray& items, uint cur, Frontend::CacheDirection ) const;
77 77
78 QArray<int> queryByExample ( const OPimContact &query, int settings, 78 UIDArray queryByExample ( const OPimContact &query, int settings,
79 const QDateTime& d ); 79 const QDateTime& d ) const;
80 80
81 QArray<int> matchRegexp( const QRegExp &r ) const; 81 UIDArray matchRegexp( const QRegExp &r ) const;
82 82
83 const uint querySettings(); 83 const uint querySettings() const;
84 84
85 bool hasQuerySettings (uint querySettings) const; 85 bool hasQuerySettings (uint querySettings) const;
86 86
87 // Currently only asc implemented.. 87 UIDArray sorted( const UIDArray& ar, bool asc, int sortOrder,
88 QArray<int> sorted( bool asc, int , int , int ); 88 int filter, const QArray<int>& categories)const;
89
89 bool add ( const OPimContact &newcontact ); 90 bool add ( const OPimContact &newcontact );
90 91
91 bool replace ( const OPimContact &contact ); 92 bool replace ( const OPimContact &contact );
@@ -94,7 +95,7 @@ class OPimContactAccessBackend_SQL : public OPimContactAccessBackend {
94 bool reload(); 95 bool reload();
95 96
96 private: 97 private:
97 QArray<int> extractUids( Opie::DB::OSQLResult& res ) const; 98 UIDArray extractUids( Opie::DB::OSQLResult& res ) const;
98 QMap<int, QString> requestNonCustom( int uid ) const; 99 QMap<int, QString> requestNonCustom( int uid ) const;
99 QMap<QString, QString> requestCustom( int uid ) const; 100 QMap<QString, QString> requestCustom( int uid ) const;
100 QMap<int, QString> fillNonCustomMap( const Opie::DB::OSQLResultItem& resultItem ) const; 101 QMap<int, QString> fillNonCustomMap( const Opie::DB::OSQLResultItem& resultItem ) const;
@@ -104,7 +105,7 @@ class OPimContactAccessBackend_SQL : public OPimContactAccessBackend {
104 protected: 105 protected:
105 bool m_changed; 106 bool m_changed;
106 QString m_fileName; 107 QString m_fileName;
107 QArray<int> m_uids; 108 UIDArray m_uids;
108 109
109 Opie::DB::OSQLDriver* m_driver; 110 Opie::DB::OSQLDriver* m_driver;
110}; 111};
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
@@ -157,9 +157,9 @@ OPimContact OPimContactAccessBackend_VCard::find ( int uid ) const
157 return m_map[uid]; 157 return m_map[uid];
158} 158}
159 159
160QArray<int> OPimContactAccessBackend_VCard::allRecords() const 160UIDArray OPimContactAccessBackend_VCard::allRecords() const
161{ 161{
162 QArray<int> ar( m_map.count() ); 162 UIDArray ar( m_map.count() );
163 QMap<int, OPimContact>::ConstIterator it; 163 QMap<int, OPimContact>::ConstIterator it;
164 int i = 0; 164 int i = 0;
165 for ( it = m_map.begin(); it != m_map.end(); ++it ) { 165 for ( it = m_map.begin(); it != m_map.end(); ++it ) {
@@ -169,16 +169,6 @@ QArray<int> OPimContactAccessBackend_VCard::allRecords() const
169 return ar; 169 return ar;
170} 170}
171 171
172const uint OPimContactAccessBackend_VCard::querySettings()
173{
174 return 0; // No search possible
175}
176
177bool OPimContactAccessBackend_VCard::hasQuerySettings (uint ) const
178{
179 return false; // No search possible, therefore all settings invalid ;)
180}
181
182bool OPimContactAccessBackend_VCard::wasChangedExternally() 172bool OPimContactAccessBackend_VCard::wasChangedExternally()
183{ 173{
184 return false; // Don't expect concurrent access 174 return false; // Don't expect concurrent access
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
@@ -58,10 +58,8 @@ class OPimContactAccessBackend_VCard : public OPimContactAccessBackend {
58 bool replace ( const OPimContact& contact ); 58 bool replace ( const OPimContact& contact );
59 59
60 OPimContact find ( int uid ) const; 60 OPimContact find ( int uid ) const;
61 QArray<int> allRecords() const; 61 UIDArray allRecords() const;
62 62
63 const uint querySettings();
64 bool hasQuerySettings (uint querySettings) const;
65 bool wasChangedExternally(); 63 bool wasChangedExternally();
66 64
67private: 65private:
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
@@ -183,9 +183,9 @@ bool OPimContactAccessBackend_XML::wasChangedExternally()
183 return (lastmod != m_readtime); 183 return (lastmod != m_readtime);
184} 184}
185 185
186QArray<int> OPimContactAccessBackend_XML::allRecords() const 186UIDArray OPimContactAccessBackend_XML::allRecords() const
187{ 187{
188 QArray<int> uid_list( m_contactList.count() ); 188 UIDArray uid_list( m_contactList.count() );
189 189
190 uint counter = 0; 190 uint counter = 0;
191 QListIterator<OPimContact> it( m_contactList ); 191 QListIterator<OPimContact> it( m_contactList );
@@ -209,145 +209,10 @@ OPimContact OPimContactAccessBackend_XML::find ( int uid ) const
209 return ( foundContact ); 209 return ( foundContact );
210} 210}
211 211
212QArray<int> OPimContactAccessBackend_XML::queryByExample ( const OPimContact &query, int settings,
213 const QDateTime& d )const
214{
215 QArray<int> m_currentQuery( m_contactList.count() );
216 QListIterator<OPimContact> it( m_contactList );
217 uint arraycounter = 0;
218
219 for( ; it.current(); ++it ){
220 /* Search all fields and compare them with query object. Store them into list
221 * if all fields matches.
222 */
223 QDate* queryDate = 0l;
224 QDate* checkDate = 0l;
225 bool allcorrect = true;
226 for ( int i = 0; i < Qtopia::Groups; i++ ) {
227 // Birthday and anniversary are special nonstring fields and should
228 // be handled specially
229 switch ( i ){
230 case Qtopia::Birthday:
231 queryDate = new QDate( query.birthday() );
232 checkDate = new QDate( (*it)->birthday() );
233 // fall through
234 case Qtopia::Anniversary:
235 if ( queryDate == 0l ){
236 queryDate = new QDate( query.anniversary() );
237 checkDate = new QDate( (*it)->anniversary() );
238 }
239
240 if ( queryDate->isValid() ){
241 if( checkDate->isValid() ){
242 if ( settings & OPimContactAccess::DateYear ){
243 if ( queryDate->year() != checkDate->year() )
244 allcorrect = false;
245 }
246 if ( settings & OPimContactAccess::DateMonth ){
247 if ( queryDate->month() != checkDate->month() )
248 allcorrect = false;
249 }
250 if ( settings & OPimContactAccess::DateDay ){
251 if ( queryDate->day() != checkDate->day() )
252 allcorrect = false;
253 }
254 if ( settings & OPimContactAccess::DateDiff ) {
255 QDate current;
256 // If we get an additional date, we
257 // will take this date instead of
258 // the current one..
259 if ( !d.date().isValid() )
260 current = QDate::currentDate();
261 else
262 current = d.date();
263
264 // We have to equalize the year, otherwise
265 // the search will fail..
266 checkDate->setYMD( current.year(),
267 checkDate->month(),
268 checkDate->day() );
269 if ( *checkDate < current )
270 checkDate->setYMD( current.year()+1,
271 checkDate->month(),
272 checkDate->day() );
273
274 // Check whether the birthday/anniversary date is between
275 // the current/given date and the maximum date
276 // ( maximum time range ) !
277 if ( current.daysTo( *queryDate ) >= 0 ){
278 if ( !( ( *checkDate >= current ) &&
279 ( *checkDate <= *queryDate ) ) ){
280 allcorrect = false;
281 }
282 }
283 }
284 } else{
285 // checkDate is invalid. Therefore this entry is always rejected
286 allcorrect = false;
287 }
288 }
289 212
290 delete queryDate; 213UIDArray OPimContactAccessBackend_XML::matchRegexp( const QRegExp &r ) const
291 queryDate = 0l;
292 delete checkDate;
293 checkDate = 0l;
294 break;
295 default:
296 /* Just compare fields which are not empty in the query object */
297 if ( !query.field(i).isEmpty() ){
298 switch ( settings & ~( OPimContactAccess::IgnoreCase
299 | OPimContactAccess::DateDiff
300 | OPimContactAccess::DateYear
301 | OPimContactAccess::DateMonth
302 | OPimContactAccess::DateDay
303 | OPimContactAccess::MatchOne
304 ) ){
305
306 case OPimContactAccess::RegExp:{
307 QRegExp expr ( query.field(i),
308 !(settings & OPimContactAccess::IgnoreCase),
309 false );
310 if ( expr.find ( (*it)->field(i), 0 ) == -1 )
311 allcorrect = false;
312 }
313 break;
314 case OPimContactAccess::WildCards:{
315 QRegExp expr ( query.field(i),
316 !(settings & OPimContactAccess::IgnoreCase),
317 true );
318 if ( expr.find ( (*it)->field(i), 0 ) == -1 )
319 allcorrect = false;
320 }
321 break;
322 case OPimContactAccess::ExactMatch:{
323 if (settings & OPimContactAccess::IgnoreCase){
324 if ( query.field(i).upper() !=
325 (*it)->field(i).upper() )
326 allcorrect = false;
327 }else{
328 if ( query.field(i) != (*it)->field(i) )
329 allcorrect = false;
330 }
331 }
332 break;
333 }
334 }
335 }
336 }
337 if ( allcorrect ){
338 m_currentQuery[arraycounter++] = (*it)->uid();
339 }
340 }
341
342 // Shrink to fit..
343 m_currentQuery.resize(arraycounter);
344
345 return m_currentQuery;
346}
347
348QArray<int> OPimContactAccessBackend_XML::matchRegexp( const QRegExp &r ) const
349{ 214{
350 QArray<int> m_currentQuery( m_contactList.count() ); 215 UIDArray m_currentQuery( m_contactList.count() );
351 QListIterator<OPimContact> it( m_contactList ); 216 QListIterator<OPimContact> it( m_contactList );
352 uint arraycounter = 0; 217 uint arraycounter = 0;
353 218
@@ -363,73 +228,15 @@ QArray<int> OPimContactAccessBackend_XML::matchRegexp( const QRegExp &r ) const
363 return m_currentQuery; 228 return m_currentQuery;
364} 229}
365 230
366const uint OPimContactAccessBackend_XML::querySettings()
367{
368 return ( OPimContactAccess::WildCards
369 | OPimContactAccess::IgnoreCase
370 | OPimContactAccess::RegExp
371 | OPimContactAccess::ExactMatch
372 | OPimContactAccess::DateDiff
373 | OPimContactAccess::DateYear
374 | OPimContactAccess::DateMonth
375 | OPimContactAccess::DateDay
376 );
377}
378
379bool OPimContactAccessBackend_XML::hasQuerySettings (uint querySettings) const
380{
381 /* OPimContactAccess::IgnoreCase, DateDiff, DateYear, DateMonth, DateDay
382 * may be added with any of the other settings. IgnoreCase should never used alone.
383 * Wildcards, RegExp, ExactMatch should never used at the same time...
384 */
385
386 // Step 1: Check whether the given settings are supported by this backend
387 if ( ( querySettings & (
388 OPimContactAccess::IgnoreCase
389 | OPimContactAccess::WildCards
390 | OPimContactAccess::DateDiff
391 | OPimContactAccess::DateYear
392 | OPimContactAccess::DateMonth
393 | OPimContactAccess::DateDay
394 | OPimContactAccess::RegExp
395 | OPimContactAccess::ExactMatch
396 ) ) != querySettings )
397 return false;
398
399 // Step 2: Check whether the given combinations are ok..
400 231
401 // IngoreCase alone is invalid
402 if ( querySettings == OPimContactAccess::IgnoreCase )
403 return false;
404
405 // WildCards, RegExp and ExactMatch should never used at the same time
406 switch ( querySettings & ~( OPimContactAccess::IgnoreCase
407 | OPimContactAccess::DateDiff
408 | OPimContactAccess::DateYear
409 | OPimContactAccess::DateMonth
410 | OPimContactAccess::DateDay
411 )
412 ){
413 case OPimContactAccess::RegExp:
414 return ( true );
415 case OPimContactAccess::WildCards:
416 return ( true );
417 case OPimContactAccess::ExactMatch:
418 return ( true );
419 case 0: // one of the upper removed bits were set..
420 return ( true );
421 default:
422 return ( false );
423 }
424}
425 232
426#if 0 233#if 0
427// Currently only asc implemented.. 234// Currently only asc implemented..
428QArray<int> OPimContactAccessBackend_XML::sorted( bool asc, int , int , int ) 235UIDArray OPimContactAccessBackend_XML::sorted( bool asc, int , int , int )
429{ 236{
430 QMap<QString, int> nameToUid; 237 QMap<QString, int> nameToUid;
431 QStringList names; 238 QStringList names;
432 QArray<int> m_currentQuery( m_contactList.count() ); 239 UIDArray m_currentQuery( m_contactList.count() );
433 240
434 // First fill map and StringList with all Names 241 // First fill map and StringList with all Names
435 // Afterwards sort namelist and use map to fill array to return.. 242 // Afterwards sort namelist and use map to fill array to return..
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
@@ -58,16 +58,11 @@ class OPimContactAccessBackend_XML : public OPimContactAccessBackend {
58 58
59 bool wasChangedExternally(); 59 bool wasChangedExternally();
60 60
61 QArray<int> allRecords() const; 61 UIDArray allRecords() const;
62 62
63 OPimContact find ( int uid ) const; 63 OPimContact find ( int uid ) const;
64 64
65 QArray<int> queryByExample ( const OPimContact &query, int settings, const QDateTime& d )const; 65 UIDArray matchRegexp( const QRegExp &r ) const;
66 QArray<int> matchRegexp( const QRegExp &r ) const;
67
68 const uint querySettings();
69
70 bool hasQuerySettings (uint querySettings) const;
71 66
72 bool add ( const OPimContact &newcontact ); 67 bool add ( const OPimContact &newcontact );
73 68
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
@@ -66,13 +66,34 @@ public:
66 virtual void clear() = 0; 66 virtual void clear() = 0;
67 //@} 67 //@}
68 68
69 //@{
70 // FIXME: Uncommented some of the abstract functions below. This should be removed as they are implemented in
71 // all typespecifc backenends (eilers)
72 /**
73 * Return all possible settings for queryByExample()
74 * @return All settings provided by the current backend
75 * (i.e.: query_WildCards & query_IgnoreCase)
76 * See implementation in the specific backends for contacts, todo and dates.
77 */
78 virtual const uint querySettings() const { return 0; } /* FIXME: Make Abstrakt !! = 0; */
79
80 /**
81 * Check whether settings are correct for queryByExample()
82 * See implementation in the specific backends for OPimContactAccess, OPimTodoAccess and ODateBookAccess.
83 * @return <i>true</i> if the given settings are correct and possible.
84 */
85 virtual bool hasQuerySettings (uint querySettings) const { return false; } /* FIXME: Make Abstrakt !! = 0; */
86 //@}
87
69 88
70 //@{ 89 //@{
71 virtual UIDArray allRecords()const = 0; 90 virtual UIDArray allRecords()const = 0;
72 virtual UIDArray matchRegexp(const QRegExp &r) const; 91 virtual UIDArray matchRegexp(const QRegExp &r) const;
73 virtual UIDArray queryByExample( const T& t, int settings, const QDateTime& d = QDateTime() )const = 0; 92 virtual UIDArray queryByExample( const UIDArray&, const T& t,
74 virtual UIDArray queryByExample( const OPimRecord* rec, int, const QDateTime& d = QDateTime() )const; 93 int settings, const QDateTime& d = QDateTime() )const { return UIDArray(); } /* FIXME: Make Abstrakt !! = 0; */
75 virtual UIDArray sorted( const UIDArray&, bool asc, int sortOrder, int sortFilter, const QArray<int>& cats )const; 94 virtual UIDArray queryByExample( const T& t, int settings, const QDateTime& d = QDateTime() )const;
95 virtual UIDArray queryByExample( const OPimRecord* rec, int settings, const QDateTime& d = QDateTime() )const;
96 virtual UIDArray sorted( const UIDArray&, bool asc, int sortOrder, int sortFilter, const QArray<int>& cats )const = 0;
76 virtual UIDArray sorted( bool asc, int sortOrder, int sortFilter, const QArray<int>& cats )const; 97 virtual UIDArray sorted( bool asc, int sortOrder, int sortFilter, const QArray<int>& cats )const;
77 virtual OPimBackendOccurrence::List occurrences( const QDate& start, const QDate& end)const; 98 virtual OPimBackendOccurrence::List occurrences( const QDate& start, const QDate& end)const;
78 virtual OPimBackendOccurrence::List occurrences( const QDateTime& dt )const; 99 virtual OPimBackendOccurrence::List occurrences( const QDateTime& dt )const;
@@ -150,6 +171,13 @@ UIDArray OPimAccessBackend<T>::matchRegexp( const QRegExp& reg )const {
150} 171}
151 172
152template <class T> 173template <class T>
174UIDArray OPimAccessBackend<T>::queryByExample( const T& rec, int settings,
175 const QDateTime& datetime )const {
176
177 return queryByExample( allRecords(), rec, settings, datetime );
178}
179
180template <class T>
153UIDArray OPimAccessBackend<T>::queryByExample( const OPimRecord* rec, int settings, 181UIDArray OPimAccessBackend<T>::queryByExample( const OPimRecord* rec, int settings,
154 const QDateTime& datetime )const { 182 const QDateTime& datetime )const {
155 T* tmp_rec = T::safeCast( rec ); 183 T* tmp_rec = T::safeCast( rec );
@@ -161,12 +189,6 @@ UIDArray OPimAccessBackend<T>::queryByExample( const OPimRecord* rec, int settin
161} 189}
162 190
163template <class T> 191template <class T>
164UIDArray OPimAccessBackend<T>::sorted( const UIDArray& ids, bool,
165 int, int, const QArray<int>& ) const {
166 return ids;
167}
168
169template <class T>
170UIDArray OPimAccessBackend<T>::sorted( bool asc, int order, int filter, 192UIDArray OPimAccessBackend<T>::sorted( bool asc, int order, int filter,
171 const QArray<int>& cats )const { 193 const QArray<int>& cats )const {
172 return sorted( allRecords(), asc, order, filter, cats ); 194 return sorted( allRecords(), asc, order, filter, cats );
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
@@ -60,21 +60,38 @@ class OPimContactAccess: public QObject, public OPimAccessTemplate<OPimContact>
60 Q_OBJECT 60 Q_OBJECT
61 61
62 public: 62 public:
63 /**
64 * Filter for sorted()
65 * @see SortFilterBase in OPimBase
66 */
63 enum SortFilter { 67 enum SortFilter {
64 DoNotShowNoneChildren = FilterCustom<<1, 68 /** Don't return entries who don't have children */
65 DoNotShowNoneAnniversary = FilterCustom<<2, 69 DoNotShowWithoutChildren = FilterCustom<<1,
66 DoNotShowNoneBirthday = FilterCustom<<3, 70 /** Don't return entries who don't have an anniversary */
67 DoNotShowNoHomeAddress = FilterCustom<<4, 71 DoNotShowWithoutAnniversary = FilterCustom<<2,
68 DoNotShowNoBusinessAddress = FilterCustom<<5 72 /** Don't return entries who don't have a birthday */
73 DoNotShowWithoutBirthday = FilterCustom<<3,
74 /** Don't return entries who don't have a home address */
75 DoNotShowWithoutHomeAddress = FilterCustom<<4,
76 /** Don't return entries who don't have a business address */
77 DoNotShowWithoutBusinessAddress = FilterCustom<<5,
78 /** Don't return entries which hava any category */
79 DoNotShowWithCategory = FilterCustom << 6
69 }; 80 };
70 81
82 /**
83 * Sort order for sorted()
84 * @see SortOrderBase in OPimBase
85 */
71 enum SortOrder { 86 enum SortOrder {
72 SortTitle = SortCustom, 87 SortTitle = SortCustom,
73 SortFirstName, 88 SortFirstName,
74 SortMiddleName, 89 SortMiddleName,
90 SortLastName,
75 SortSuffix, 91 SortSuffix,
76 SortEmail, 92 SortEmail,
77 SortNickname, 93 SortNickname,
94 SortFileAsName,
78 SortAnniversary, 95 SortAnniversary,
79 SortBirthday, 96 SortBirthday,
80 SortGender 97 SortGender
@@ -99,14 +116,18 @@ class OPimContactAccess: public QObject, public OPimAccessTemplate<OPimContact>
99 ~OPimContactAccess (); 116 ~OPimContactAccess ();
100 117
101 118
102 /** Return all possible settings. 119 /**
120 * Return all possible settings for queryByExample().
103 * @return All settings provided by the current backend 121 * @return All settings provided by the current backend
104 * (i.e.: query_WildCards & query_IgnoreCase) 122 * (i.e.: WildCards & IgnoreCase)
123 * @see QuerySettings in OPimBase for details of the parameter
105 */ 124 */
106 const uint querySettings(); 125 const uint querySettings();
107 126
108 /** Check whether settings are correct. 127 /**
128 * Check whether settings are correct for queryByExample().
109 * @return <i>true</i> if the given settings are correct and possible. 129 * @return <i>true</i> if the given settings are correct and possible.
130 * @see QuerySettings in OPimBase for details of the parameter
110 */ 131 */
111 bool hasQuerySettings ( int querySettings ) const; 132 bool hasQuerySettings ( int querySettings ) const;
112 133
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
@@ -90,16 +90,53 @@ public:
90 virtual T find( UID uid )const; 90 virtual T find( UID uid )const;
91 virtual T find( UID uid, const QArray<int>&, 91 virtual T find( UID uid, const QArray<int>&,
92 uint current, typename OTemplateBase<T>::CacheDirection dir = OTemplateBase<T>::Forward )const; 92 uint current, typename OTemplateBase<T>::CacheDirection dir = OTemplateBase<T>::Forward )const;
93 virtual List sorted( const List&, bool ascending, int sortOrder, 93 //@}
94
95 /**
96 * Get sorted lists..
97 * @see OPimContactAccess, OPimTodoAccess and ODateBookAccess regarding more info for the following params:
98 * @param list of UID's received by allRecords() or others...
99 * @param sortOrder Setting the sort order defined by enum SortOrder
100 * @param ascending Sort in ascending order if true, otherwise descending
101 * @param sortFilter Setting the sort filter defined by enum SortFilter
102 * @param cat number of category.
103 */
104 virtual List sorted( const List& list, bool ascending, int sortOrder,
94 int sortFilter, int cat )const; 105 int sortFilter, int cat )const;
95 virtual List sorted( const List&, bool ascending, int sortOrder, 106
107 /**
108 * Get sorted lists..
109 * @see OPimContactAccess, OPimTodoAccess and ODateBookAccess regarding more info for the following params:
110 * @param list of UID's received by allRecords() or others...
111 * @param sortOrder Setting the sort order defined by enum SortOrder
112 * @param ascending Sort in ascending order if true, otherwise descending
113 * @param sortFilter Setting the sort filter defined by enum SortFilter
114 * @param cats List of categories.
115 */
116 virtual List sorted( const List& list, bool ascending, int sortOrder,
96 int sortFilter, const QArray<UID>& cats )const; 117 int sortFilter, const QArray<UID>& cats )const;
118
119 /**
120 * Get sorted lists..
121 * @see OPimContactAccess, OPimTodoAccess and ODateBookAccess regarding more info for the following params:
122 * @param ascending Sort in ascending order if true, otherwise descending
123 * @param sortOrder Setting the sort order defined by enum SortOrder
124 * @param sortFilter Setting the sort filter defined by enum SortFilter
125 * @param cat number of category.
126 */
97 virtual List sorted( bool ascending, int sortOrder, int sortFilter, int cat )const; 127 virtual List sorted( bool ascending, int sortOrder, int sortFilter, int cat )const;
98 virtual List sorted( bool ascending, int sortOrder, int sortOrder,
99 const QArray<UID>& cats )const;
100 //@}
101 128
102 /** 129 /**
130 * Get sorted lists..
131 * @see OPimContactAccess, OPimTodoAccess and ODateBookAccess regarding more info for the following params:
132 * @param ascending Sort in ascending order if true, otherwise descending
133 * @param sortOrder Setting the sort order defined by enum SortOrder
134 * @param sortFilter Setting the sort filter defined by enum SortFilter
135 * @param cats List of categories.
136 */
137 virtual List sorted( bool ascending, int sortOrder, int sortFilter,
138 const QArray<UID>& cats )const;
139 /**
103 * (Re)Implementation 140 * (Re)Implementation
104 */ 141 */
105 //@{ 142 //@{
@@ -129,7 +166,6 @@ public:
129 //@} 166 //@}
130 167
131 void setReadAhead( uint count ); 168 void setReadAhead( uint count );
132 virtual T cacheFind( int uid )const;
133 void cache( const T& )const; 169 void cache( const T& )const;
134 void setSaneCacheSize( int ); 170 void setSaneCacheSize( int );
135 171
@@ -258,11 +294,6 @@ T OPimAccessTemplate<T>::find( UID uid ) const{
258 return t; 294 return t;
259} 295}
260 296
261template <class T>
262T OPimAccessTemplate<T>::cacheFind( int uid ) const
263{
264 return m_cache.find( uid );
265}
266 297
267/** 298/**
268 * read ahead cache find method ;) 299 * read ahead cache find method ;)
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
@@ -80,6 +80,7 @@ struct OPimBase {
80 80
81 //@{ 81 //@{
82 virtual QArray<UID> records()const = 0; 82 virtual QArray<UID> records()const = 0;
83 //@}
83 84
84 /** Constants for query. 85 /** Constants for query.
85 * Use this constants to set the query parameters. 86 * Use this constants to set the query parameters.
@@ -87,39 +88,57 @@ struct OPimBase {
87 * @see queryByExample() 88 * @see queryByExample()
88 */ 89 */
89 enum QuerySettings { 90 enum QuerySettings {
90 WildCards = 0x0001, /** Use Wildcards */ 91 /** Use Wildcards */
91 IgnoreCase = 0x0002, /** Ignore the Case */ 92 WildCards = 0x0001,
92 RegExp = 0x0004, /** Do a Regular Expression match */ 93 /** Ignore the Case */
93 ExactMatch = 0x0008, /** It needs to exactly match */ 94 IgnoreCase = 0x0002,
94 MatchOne = 0x0010, /** Only one Entry must match */ 95 /** Do a Regular Expression match */
95 DateDiff = 0x0020, /** Find all entries from today until given date */ 96 RegExp = 0x0004,
96 DateYear = 0x0040, /** The year matches */ 97 /** It needs to exactly match */
97 DateMonth = 0x0080, /** The month matches */ 98 ExactMatch = 0x0008,
98 DateDay = 0x0100, /** The day matches */ 99 /** Only one Entry must match */
99 LastItem = 0xffff /** the last possible name */ 100 MatchOne = 0x0010,
101 /** Find all entries from today until given date */
102 DateDiff = 0x0020,
103 /** The year matches */
104 DateYear = 0x0040,
105 /** The month matches */
106 DateMonth = 0x0080,
107 /** The day matches */
108 DateDay = 0x0100,
109 /** The last possible name matches */
110 LastItem = 0xffff
100 }; 111 };
101 112
102 /** 113 /**
103 * Common Attributes for the Sort Order 114 * Common Attributes for the Sort Order
104 */ 115 */
105 enum SortOrderBase { 116 enum SortOrderBase {
106 SortSummary = 0, /** Sort by a Summary of the records */ 117 /** Sort by a Summary of the records */
107 SortByCategory = 1, /** Sort by Category */ 118 SortSummary = 0,
108 SortByDate = 2, /** Sort by Date */ 119 /** Sort by Category */
109 SortCustom = 10, /** The First available sort number for the OPimAccessTemplates */ 120 SortByCategory = 1,
110 LastSortOrderBase = 0xffff /** make this enum 16bit large */ 121 /** Sort by Date */
122 SortByDate = 2,
123 /** The First available sort number for the OPimAccessTemplates */
124 SortCustom = 10,
125 /** make this enum 16bit large */
126 LastSortOrderBase = 0xffff
111 }; 127 };
112 128
113 /** 129 /**
114 * Sort with the help of the \sa sorted function 130 * Sort a list of Items with the help of the sorted() function.
115 * a list of Items.
116 * The Item you provide in SortOrder will be used 131 * The Item you provide in SortOrder will be used
117 * for sorting. 132 * for sorting.
118 * 133 *
119 * @see sorted 134 * @see OPimAccessTemplate<>::sorted()
120 */ 135 */
121 enum SortFilterBase { 136 enum SortFilterBase {
137 /** Do not filter anything. */
138 FilterOff = 0,
139 /** Use given Categories for filter */
122 FilterCategory = 1, 140 FilterCategory = 1,
141 /** The first available custom filter defined in the specialized frontends */
123 FilterCustom = 1024, 142 FilterCustom = 1024,
124 LastSortFilterBase = 0xffffffff 143 LastSortFilterBase = 0xffffffff
125 }; 144 };
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
@@ -4,7 +4,7 @@ DESTDIR = $(OPIEDIR)/lib
4 4
5INTERFACES = 5INTERFACES =
6TARGET = opiepim2 6TARGET = opiepim2
7VERSION = 1.9.1 7VERSION = 1.8.6
8INCLUDEPATH += $(OPIEDIR)/include 8INCLUDEPATH += $(OPIEDIR)/include
9DEPENDPATH += $(OPIEDIR)/include 9DEPENDPATH += $(OPIEDIR)/include
10LIBS += -lopiecore2 10LIBS += -lopiecore2