summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/pim/ocontact.h4
-rw-r--r--libopie/pim/ocontactaccess.cpp8
-rw-r--r--libopie/pim/ocontactaccess.h8
-rw-r--r--libopie/pim/ocontactaccessbackend.h7
-rw-r--r--libopie/pim/ocontactaccessbackend_xml.h20
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend.h7
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_xml.h20
-rw-r--r--libopie2/opiepim/core/ocontactaccess.cpp8
-rw-r--r--libopie2/opiepim/core/ocontactaccess.h8
-rw-r--r--libopie2/opiepim/ocontact.h4
10 files changed, 86 insertions, 8 deletions
diff --git a/libopie/pim/ocontact.h b/libopie/pim/ocontact.h
index 382ab94..038a59f 100644
--- a/libopie/pim/ocontact.h
+++ b/libopie/pim/ocontact.h
@@ -62,101 +62,97 @@ public:
62 // inserts email to list and ensure's doesn't already exist 62 // inserts email to list and ensure's doesn't already exist
63 void insertEmail( const QString &v ); 63 void insertEmail( const QString &v );
64 void removeEmail( const QString &v ); 64 void removeEmail( const QString &v );
65 void clearEmails(); 65 void clearEmails();
66 void insertEmails( const QStringList &v ); 66 void insertEmails( const QStringList &v );
67 67
68 // home 68 // home
69 void setHomeStreet( const QString &v ) { replace( Qtopia::HomeStreet, v ); } 69 void setHomeStreet( const QString &v ) { replace( Qtopia::HomeStreet, v ); }
70 void setHomeCity( const QString &v ) { replace( Qtopia::HomeCity, v ); } 70 void setHomeCity( const QString &v ) { replace( Qtopia::HomeCity, v ); }
71 void setHomeState( const QString &v ) { replace( Qtopia::HomeState, v ); } 71 void setHomeState( const QString &v ) { replace( Qtopia::HomeState, v ); }
72 void setHomeZip( const QString &v ) { replace( Qtopia::HomeZip, v ); } 72 void setHomeZip( const QString &v ) { replace( Qtopia::HomeZip, v ); }
73 void setHomeCountry( const QString &v ) { replace( Qtopia::HomeCountry, v ); } 73 void setHomeCountry( const QString &v ) { replace( Qtopia::HomeCountry, v ); }
74 void setHomePhone( const QString &v ) { replace( Qtopia::HomePhone, v ); } 74 void setHomePhone( const QString &v ) { replace( Qtopia::HomePhone, v ); }
75 void setHomeFax( const QString &v ) { replace( Qtopia::HomeFax, v ); } 75 void setHomeFax( const QString &v ) { replace( Qtopia::HomeFax, v ); }
76 void setHomeMobile( const QString &v ) { replace( Qtopia::HomeMobile, v ); } 76 void setHomeMobile( const QString &v ) { replace( Qtopia::HomeMobile, v ); }
77 void setHomeWebpage( const QString &v ) { replace( Qtopia::HomeWebPage, v ); } 77 void setHomeWebpage( const QString &v ) { replace( Qtopia::HomeWebPage, v ); }
78 78
79 // business 79 // business
80 void setCompany( const QString &v ) { replace( Qtopia::Company, v ); } 80 void setCompany( const QString &v ) { replace( Qtopia::Company, v ); }
81 void setBusinessStreet( const QString &v ) { replace( Qtopia::BusinessStreet, v ); } 81 void setBusinessStreet( const QString &v ) { replace( Qtopia::BusinessStreet, v ); }
82 void setBusinessCity( const QString &v ) { replace( Qtopia::BusinessCity, v ); } 82 void setBusinessCity( const QString &v ) { replace( Qtopia::BusinessCity, v ); }
83 void setBusinessState( const QString &v ) { replace( Qtopia::BusinessState, v ); } 83 void setBusinessState( const QString &v ) { replace( Qtopia::BusinessState, v ); }
84 void setBusinessZip( const QString &v ) { replace( Qtopia::BusinessZip, v ); } 84 void setBusinessZip( const QString &v ) { replace( Qtopia::BusinessZip, v ); }
85 void setBusinessCountry( const QString &v ) { replace( Qtopia::BusinessCountry, v ); } 85 void setBusinessCountry( const QString &v ) { replace( Qtopia::BusinessCountry, v ); }
86 void setBusinessWebpage( const QString &v ) { replace( Qtopia::BusinessWebPage, v ); } 86 void setBusinessWebpage( const QString &v ) { replace( Qtopia::BusinessWebPage, v ); }
87 void setJobTitle( const QString &v ) { replace( Qtopia::JobTitle, v ); } 87 void setJobTitle( const QString &v ) { replace( Qtopia::JobTitle, v ); }
88 void setDepartment( const QString &v ) { replace( Qtopia::Department, v ); } 88 void setDepartment( const QString &v ) { replace( Qtopia::Department, v ); }
89 void setOffice( const QString &v ) { replace( Qtopia::Office, v ); } 89 void setOffice( const QString &v ) { replace( Qtopia::Office, v ); }
90 void setBusinessPhone( const QString &v ) { replace( Qtopia::BusinessPhone, v ); } 90 void setBusinessPhone( const QString &v ) { replace( Qtopia::BusinessPhone, v ); }
91 void setBusinessFax( const QString &v ) { replace( Qtopia::BusinessFax, v ); } 91 void setBusinessFax( const QString &v ) { replace( Qtopia::BusinessFax, v ); }
92 void setBusinessMobile( const QString &v ) { replace( Qtopia::BusinessMobile, v ); } 92 void setBusinessMobile( const QString &v ) { replace( Qtopia::BusinessMobile, v ); }
93 void setBusinessPager( const QString &v ) { replace( Qtopia::BusinessPager, v ); } 93 void setBusinessPager( const QString &v ) { replace( Qtopia::BusinessPager, v ); }
94 void setProfession( const QString &v ) { replace( Qtopia::Profession, v ); } 94 void setProfession( const QString &v ) { replace( Qtopia::Profession, v ); }
95 void setAssistant( const QString &v ) { replace( Qtopia::Assistant, v ); } 95 void setAssistant( const QString &v ) { replace( Qtopia::Assistant, v ); }
96 void setManager( const QString &v ) { replace( Qtopia::Manager, v ); } 96 void setManager( const QString &v ) { replace( Qtopia::Manager, v ); }
97 97
98 // personal 98 // personal
99 void setSpouse( const QString &v ) { replace( Qtopia::Spouse, v ); } 99 void setSpouse( const QString &v ) { replace( Qtopia::Spouse, v ); }
100 void setGender( const QString &v ) { replace( Qtopia::Gender, v ); } 100 void setGender( const QString &v ) { replace( Qtopia::Gender, v ); }
101 void setBirthday( const QDate &v ); 101 void setBirthday( const QDate &v );
102 void setAnniversary( const QDate &v ); 102 void setAnniversary( const QDate &v );
103 void setNickname( const QString &v ) { replace( Qtopia::Nickname, v ); } 103 void setNickname( const QString &v ) { replace( Qtopia::Nickname, v ); }
104 void setChildren( const QString &v ); 104 void setChildren( const QString &v );
105 105
106 // other 106 // other
107 void setNotes( const QString &v ) { replace( Qtopia::Notes, v); } 107 void setNotes( const QString &v ) { replace( Qtopia::Notes, v); }
108 108
109 bool match( const QString &regexp ) const; 109 bool match( const QString &regexp ) const;
110
111// DON'T ATTEMPT TO USE THIS
112#ifdef QTOPIA_INTERNAL_CONTACT_MRE
113 bool match( const QRegExp &regexp ) const; 110 bool match( const QRegExp &regexp ) const;
114#endif
115 111
116// // custom 112// // custom
117// void setCustomField( const QString &key, const QString &v ) 113// void setCustomField( const QString &key, const QString &v )
118// { replace(Custom- + key, v ); } 114// { replace(Custom- + key, v ); }
119 115
120 // name 116 // name
121 QString fullName() const; 117 QString fullName() const;
122 QString title() const { return find( Qtopia::Title ); } 118 QString title() const { return find( Qtopia::Title ); }
123 QString firstName() const { return find( Qtopia::FirstName ); } 119 QString firstName() const { return find( Qtopia::FirstName ); }
124 QString middleName() const { return find( Qtopia::MiddleName ); } 120 QString middleName() const { return find( Qtopia::MiddleName ); }
125 QString lastName() const { return find( Qtopia::LastName ); } 121 QString lastName() const { return find( Qtopia::LastName ); }
126 QString suffix() const { return find( Qtopia::Suffix ); } 122 QString suffix() const { return find( Qtopia::Suffix ); }
127 QString fileAs() const { return find( Qtopia::FileAs ); } 123 QString fileAs() const { return find( Qtopia::FileAs ); }
128 124
129 // email 125 // email
130 QString defaultEmail() const { return find( Qtopia::DefaultEmail ); } 126 QString defaultEmail() const { return find( Qtopia::DefaultEmail ); }
131 QStringList emailList() const; 127 QStringList emailList() const;
132 128
133 // home 129 // home
134 QString homeStreet() const { return find( Qtopia::HomeStreet ); } 130 QString homeStreet() const { return find( Qtopia::HomeStreet ); }
135 QString homeCity() const { return find( Qtopia::HomeCity ); } 131 QString homeCity() const { return find( Qtopia::HomeCity ); }
136 QString homeState() const { return find( Qtopia::HomeState ); } 132 QString homeState() const { return find( Qtopia::HomeState ); }
137 QString homeZip() const { return find( Qtopia::HomeZip ); } 133 QString homeZip() const { return find( Qtopia::HomeZip ); }
138 QString homeCountry() const { return find( Qtopia::HomeCountry ); } 134 QString homeCountry() const { return find( Qtopia::HomeCountry ); }
139 QString homePhone() const { return find( Qtopia::HomePhone ); } 135 QString homePhone() const { return find( Qtopia::HomePhone ); }
140 QString homeFax() const { return find( Qtopia::HomeFax ); } 136 QString homeFax() const { return find( Qtopia::HomeFax ); }
141 QString homeMobile() const { return find( Qtopia::HomeMobile ); } 137 QString homeMobile() const { return find( Qtopia::HomeMobile ); }
142 QString homeWebpage() const { return find( Qtopia::HomeWebPage ); } 138 QString homeWebpage() const { return find( Qtopia::HomeWebPage ); }
143 /** Multi line string containing all non-empty address info in the form 139 /** Multi line string containing all non-empty address info in the form
144 * Street 140 * Street
145 * City, State Zip 141 * City, State Zip
146 * Country 142 * Country
147 */ 143 */
148 QString displayHomeAddress() const; 144 QString displayHomeAddress() const;
149 145
150 // business 146 // business
151 QString company() const { return find( Qtopia::Company ); } 147 QString company() const { return find( Qtopia::Company ); }
152 QString businessStreet() const { return find( Qtopia::BusinessStreet ); } 148 QString businessStreet() const { return find( Qtopia::BusinessStreet ); }
153 QString businessCity() const { return find( Qtopia::BusinessCity ); } 149 QString businessCity() const { return find( Qtopia::BusinessCity ); }
154 QString businessState() const { return find( Qtopia::BusinessState ); } 150 QString businessState() const { return find( Qtopia::BusinessState ); }
155 QString businessZip() const { return find( Qtopia::BusinessZip ); } 151 QString businessZip() const { return find( Qtopia::BusinessZip ); }
156 QString businessCountry() const { return find( Qtopia::BusinessCountry ); } 152 QString businessCountry() const { return find( Qtopia::BusinessCountry ); }
157 QString businessWebpage() const { return find( Qtopia::BusinessWebPage ); } 153 QString businessWebpage() const { return find( Qtopia::BusinessWebPage ); }
158 QString jobTitle() const { return find( Qtopia::JobTitle ); } 154 QString jobTitle() const { return find( Qtopia::JobTitle ); }
159 QString department() const { return find( Qtopia::Department ); } 155 QString department() const { return find( Qtopia::Department ); }
160 QString office() const { return find( Qtopia::Office ); } 156 QString office() const { return find( Qtopia::Office ); }
161 QString businessPhone() const { return find( Qtopia::BusinessPhone ); } 157 QString businessPhone() const { return find( Qtopia::BusinessPhone ); }
162 QString businessFax() const { return find( Qtopia::BusinessFax ); } 158 QString businessFax() const { return find( Qtopia::BusinessFax ); }
diff --git a/libopie/pim/ocontactaccess.cpp b/libopie/pim/ocontactaccess.cpp
index 2ca0283..f868b53 100644
--- a/libopie/pim/ocontactaccess.cpp
+++ b/libopie/pim/ocontactaccess.cpp
@@ -1,71 +1,74 @@
1/* 1/*
2 * Class to manage the Contacts. 2 * Class to manage the Contacts.
3 * 3 *
4 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) 4 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de)
5 * 5 *
6 * ===================================================================== 6 * =====================================================================
7 *This program is free software; you can redistribute it and/or 7 *This program is free software; you can redistribute it and/or
8 *modify it under the terms of the GNU Library General Public 8 *modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version. 10 * version 2 of the License, or (at your option) any later version.
11 * ===================================================================== 11 * =====================================================================
12 * Info: This class could just work with a change in the header-file 12 * Info: This class could just work with a change in the header-file
13 * of the Contact class ! Therefore our libopie only compiles 13 * of the Contact class ! Therefore our libopie only compiles
14 * with our version of libqpe 14 * with our version of libqpe
15 * ===================================================================== 15 * =====================================================================
16 * ToDo: XML-Backend: Automatic reload if something was changed... 16 * ToDo: XML-Backend: Automatic reload if something was changed...
17 * 17 *
18 * 18 *
19 * ===================================================================== 19 * =====================================================================
20 * Version: $Id$ 20 * Version: $Id$
21 * ===================================================================== 21 * =====================================================================
22 * History: 22 * History:
23 * $Log$ 23 * $Log$
24 * Revision 1.6 2002/11/01 15:10:42 eilers
25 * Added regExp-search in database for all fields in a contact.
26 *
24 * Revision 1.5 2002/10/16 10:52:40 eilers 27 * Revision 1.5 2002/10/16 10:52:40 eilers
25 * Added some docu to the interface and now using the cache infrastucture by zecke.. :) 28 * Added some docu to the interface and now using the cache infrastucture by zecke.. :)
26 * 29 *
27 * Revision 1.4 2002/10/14 16:21:54 eilers 30 * Revision 1.4 2002/10/14 16:21:54 eilers
28 * Some minor interface updates 31 * Some minor interface updates
29 * 32 *
30 * Revision 1.3 2002/10/07 17:34:24 eilers 33 * Revision 1.3 2002/10/07 17:34:24 eilers
31 * added OBackendFactory for advanced backend access 34 * added OBackendFactory for advanced backend access
32 * 35 *
33 * Revision 1.2 2002/10/02 16:18:11 eilers 36 * Revision 1.2 2002/10/02 16:18:11 eilers
34 * debugged and seems to work almost perfectly .. 37 * debugged and seems to work almost perfectly ..
35 * 38 *
36 * Revision 1.1 2002/09/27 17:11:44 eilers 39 * Revision 1.1 2002/09/27 17:11:44 eilers
37 * Added API for accessing the Contact-Database ! It is compiling, but 40 * Added API for accessing the Contact-Database ! It is compiling, but
38 * please do not expect that anything is working ! 41 * please do not expect that anything is working !
39 * I will debug that stuff in the next time .. 42 * I will debug that stuff in the next time ..
40 * Please read README_COMPILE for compiling ! 43 * Please read README_COMPILE for compiling !
41 * 44 *
42 * 45 *
43 */ 46 */
44 47
45#include "ocontactaccess.h" 48#include "ocontactaccess.h"
46#include "obackendfactory.h" 49#include "obackendfactory.h"
47 50
48#include <qasciidict.h> 51#include <qasciidict.h>
49#include <qdatetime.h> 52#include <qdatetime.h>
50#include <qfile.h> 53#include <qfile.h>
51#include <qregexp.h> 54#include <qregexp.h>
52#include <qlist.h> 55#include <qlist.h>
53#include <qcopchannel_qws.h> 56#include <qcopchannel_qws.h>
54 57
55//#include <qpe/qcopenvelope_qws.h> 58//#include <qpe/qcopenvelope_qws.h>
56#include <qpe/global.h> 59#include <qpe/global.h>
57 60
58#include <errno.h> 61#include <errno.h>
59#include <fcntl.h> 62#include <fcntl.h>
60#include <unistd.h> 63#include <unistd.h>
61#include <stdlib.h> 64#include <stdlib.h>
62 65
63#include "ocontactaccessbackend_xml.h" 66#include "ocontactaccessbackend_xml.h"
64 67
65 68
66OContactAccess::OContactAccess ( const QString appname, const QString , 69OContactAccess::OContactAccess ( const QString appname, const QString ,
67 OContactAccessBackend* end, bool autosync ): 70 OContactAccessBackend* end, bool autosync ):
68 OPimAccessTemplate<OContact>( end ) 71 OPimAccessTemplate<OContact>( end )
69{ 72{
70 /* take care of the backend. If there is no one defined, we 73 /* take care of the backend. If there is no one defined, we
71 * will use the XML-Backend as default (until we have a cute SQL-Backend..). 74 * will use the XML-Backend as default (until we have a cute SQL-Backend..).
@@ -75,79 +78,84 @@ OContactAccess::OContactAccess ( const QString appname, const QString ,
75 end = OBackendFactory<OContactAccessBackend>::Default( "contact", appname ); 78 end = OBackendFactory<OContactAccessBackend>::Default( "contact", appname );
76 } 79 }
77 // Set backend locally and in template 80 // Set backend locally and in template
78 m_backEnd = end; 81 m_backEnd = end;
79 OPimAccessTemplate<OContact>::setBackEnd (end); 82 OPimAccessTemplate<OContact>::setBackEnd (end);
80 83
81 84
82 /* Connect signal of external db change to function */ 85 /* Connect signal of external db change to function */
83 QCopChannel *dbchannel = new QCopChannel( "QPE/PIM", this ); 86 QCopChannel *dbchannel = new QCopChannel( "QPE/PIM", this );
84 connect( dbchannel, SIGNAL(received(const QCString &, const QByteArray &)), 87 connect( dbchannel, SIGNAL(received(const QCString &, const QByteArray &)),
85 this, SLOT(copMessage( const QCString &, const QByteArray &)) ); 88 this, SLOT(copMessage( const QCString &, const QByteArray &)) );
86 if ( autosync ){ 89 if ( autosync ){
87 QCopChannel *syncchannel = new QCopChannel( "QPE/Sync", this ); 90 QCopChannel *syncchannel = new QCopChannel( "QPE/Sync", this );
88 connect( syncchannel, SIGNAL(received(const QCString &, const QByteArray &)), 91 connect( syncchannel, SIGNAL(received(const QCString &, const QByteArray &)),
89 this, SLOT(copMessage( const QCString &, const QByteArray &)) ); 92 this, SLOT(copMessage( const QCString &, const QByteArray &)) );
90 } 93 }
91 94
92 95
93} 96}
94OContactAccess::~OContactAccess () 97OContactAccess::~OContactAccess ()
95{ 98{
96 /* The user may forget to save the changed database, therefore try to 99 /* The user may forget to save the changed database, therefore try to
97 * do it for him.. 100 * do it for him..
98 */ 101 */
99 save(); 102 save();
100 // delete m_backEnd; is done by template.. 103 // delete m_backEnd; is done by template..
101} 104}
102 105
103 106
104bool OContactAccess::save () 107bool OContactAccess::save ()
105{ 108{
106 /* If the database was changed externally, we could not save the 109 /* If the database was changed externally, we could not save the
107 * Data. This will remove added items which is unacceptable ! 110 * Data. This will remove added items which is unacceptable !
108 * Therefore: Reload database and merge the data... 111 * Therefore: Reload database and merge the data...
109 */ 112 */
110 if ( OPimAccessTemplate<OContact>::wasChangedExternally() ) 113 if ( OPimAccessTemplate<OContact>::wasChangedExternally() )
111 reload(); 114 reload();
112 115
113 bool status = OPimAccessTemplate<OContact>::save(); 116 bool status = OPimAccessTemplate<OContact>::save();
114 if ( !status ) return false; 117 if ( !status ) return false;
115 118
116 /* Now tell everyone that new data is available. 119 /* Now tell everyone that new data is available.
117 */ 120 */
118 QCopEnvelope e( "QPE/PIM", "addressbookUpdated()" ); 121 QCopEnvelope e( "QPE/PIM", "addressbookUpdated()" );
119 122
120 return true; 123 return true;
121} 124}
122 125
126ORecordList<OContact> OContactAccess::matchRegexp( const QRegExp &r ) const{
127 QArray<int> matchingContacts = m_backEnd -> matchRegexp( r );
128 return ( ORecordList<OContact>(matchingContacts, this) );
129}
130
123const uint OContactAccess::querySettings() 131const uint OContactAccess::querySettings()
124{ 132{
125 return ( m_backEnd->querySettings() ); 133 return ( m_backEnd->querySettings() );
126} 134}
127 135
128bool OContactAccess::hasQuerySettings ( int querySettings ) const 136bool OContactAccess::hasQuerySettings ( int querySettings ) const
129{ 137{
130 return ( m_backEnd->hasQuerySettings ( querySettings ) ); 138 return ( m_backEnd->hasQuerySettings ( querySettings ) );
131} 139}
132 140
133 141
134bool OContactAccess::wasChangedExternally()const 142bool OContactAccess::wasChangedExternally()const
135{ 143{
136 return ( m_backEnd->wasChangedExternally() ); 144 return ( m_backEnd->wasChangedExternally() );
137} 145}
138 146
139 147
140void OContactAccess::copMessage( const QCString &msg, const QByteArray & ) 148void OContactAccess::copMessage( const QCString &msg, const QByteArray & )
141{ 149{
142 if ( msg == "addressbookUpdated()" ){ 150 if ( msg == "addressbookUpdated()" ){
143 qWarning ("OContactAccess: Received addressbokUpdated()"); 151 qWarning ("OContactAccess: Received addressbokUpdated()");
144 emit signalChanged ( this ); 152 emit signalChanged ( this );
145 } else if ( msg == "flush()" ) { 153 } else if ( msg == "flush()" ) {
146 qWarning ("OContactAccess: Received flush()"); 154 qWarning ("OContactAccess: Received flush()");
147 save (); 155 save ();
148 } else if ( msg == "reload()" ) { 156 } else if ( msg == "reload()" ) {
149 qWarning ("OContactAccess: Received reload()"); 157 qWarning ("OContactAccess: Received reload()");
150 reload (); 158 reload ();
151 emit signalChanged ( this ); 159 emit signalChanged ( this );
152 } 160 }
153} 161}
diff --git a/libopie/pim/ocontactaccess.h b/libopie/pim/ocontactaccess.h
index da9c942..b4921d5 100644
--- a/libopie/pim/ocontactaccess.h
+++ b/libopie/pim/ocontactaccess.h
@@ -1,131 +1,139 @@
1/* 1/*
2 * Class to manage the Contacts. 2 * Class to manage the Contacts.
3 * 3 *
4 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) 4 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de)
5 * Copyright (c) 2002 by Holger Freyther (zecke@handhelds.org) 5 * Copyright (c) 2002 by Holger Freyther (zecke@handhelds.org)
6 * 6 *
7 * ===================================================================== 7 * =====================================================================
8 *This program is free software; you can redistribute it and/or 8 *This program is free software; you can redistribute it and/or
9 *modify it under the terms of the GNU Library General Public 9 *modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; 10 * License as published by the Free Software Foundation;
11 * either version 2 of the License, or (at your option) any later 11 * either version 2 of the License, or (at your option) any later
12 * version. 12 * version.
13 * ===================================================================== 13 * =====================================================================
14 * ToDo: Define enum for query settings 14 * ToDo: Define enum for query settings
15 * ===================================================================== 15 * =====================================================================
16 * Version: $Id$ 16 * Version: $Id$
17 * ===================================================================== 17 * =====================================================================
18 * History: 18 * History:
19 * $Log$ 19 * $Log$
20 * Revision 1.4 2002/11/01 15:10:42 eilers
21 * Added regExp-search in database for all fields in a contact.
22 *
20 * Revision 1.3 2002/10/16 10:52:40 eilers 23 * Revision 1.3 2002/10/16 10:52:40 eilers
21 * Added some docu to the interface and now using the cache infrastucture by zecke.. :) 24 * Added some docu to the interface and now using the cache infrastucture by zecke.. :)
22 * 25 *
23 * Revision 1.2 2002/10/14 16:21:54 eilers 26 * Revision 1.2 2002/10/14 16:21:54 eilers
24 * Some minor interface updates 27 * Some minor interface updates
25 * 28 *
26 * Revision 1.1 2002/09/27 17:11:44 eilers 29 * Revision 1.1 2002/09/27 17:11:44 eilers
27 * Added API for accessing the Contact-Database ! It is compiling, but 30 * Added API for accessing the Contact-Database ! It is compiling, but
28 * please do not expect that anything is working ! 31 * please do not expect that anything is working !
29 * I will debug that stuff in the next time .. 32 * I will debug that stuff in the next time ..
30 * Please read README_COMPILE for compiling ! 33 * Please read README_COMPILE for compiling !
31 * 34 *
32 * ===================================================================== 35 * =====================================================================
33 */ 36 */
34#ifndef _OCONTACTACCESS_H 37#ifndef _OCONTACTACCESS_H
35#define _OCONTACTACCESS_H 38#define _OCONTACTACCESS_H
36 39
37#include <qobject.h> 40#include <qobject.h>
38 41
39#include <qpe/qcopenvelope_qws.h> 42#include <qpe/qcopenvelope_qws.h>
40 43
41#include <qvaluelist.h> 44#include <qvaluelist.h>
42#include <qfileinfo.h> 45#include <qfileinfo.h>
43 46
44#include "ocontact.h" 47#include "ocontact.h"
45#include "ocontactaccessbackend.h" 48#include "ocontactaccessbackend.h"
46#include "opimaccesstemplate.h" 49#include "opimaccesstemplate.h"
47 50
48/** Class to access the contacts database. 51/** Class to access the contacts database.
49 * This is just a frontend for the real database handling which is 52 * This is just a frontend for the real database handling which is
50 * done by the backend. 53 * done by the backend.
54 * @see OPimAccessTemplate
51 */ 55 */
52class OContactAccess: public QObject, public OPimAccessTemplate<OContact> 56class OContactAccess: public QObject, public OPimAccessTemplate<OContact>
53{ 57{
54 Q_OBJECT 58 Q_OBJECT
55 59
56 public: 60 public:
57 /** Create Database with contacts (addressbook). 61 /** Create Database with contacts (addressbook).
58 * @param appname Name of application which wants access to the database 62 * @param appname Name of application which wants access to the database
59 * (i.e. "todolist") 63 * (i.e. "todolist")
60 * @param filename The name of the database file. If not set, the default one 64 * @param filename The name of the database file. If not set, the default one
61 * is used. 65 * is used.
62 * @param backend Pointer to an alternative Backend. If not set, we will use 66 * @param backend Pointer to an alternative Backend. If not set, we will use
63 * the default backend. 67 * the default backend.
64 * @param handlesync If <b>true</b> the database stores the current state 68 * @param handlesync If <b>true</b> the database stores the current state
65 * automatically if it receives the signals <i>flush()</i> and <i>reload()</i> 69 * automatically if it receives the signals <i>flush()</i> and <i>reload()</i>
66 * which are used before and after synchronisation. If the application wants 70 * which are used before and after synchronisation. If the application wants
67 * to react itself, it should be disabled by setting it to <b>false</b> 71 * to react itself, it should be disabled by setting it to <b>false</b>
68 * @see OContactAccessBackend 72 * @see OContactAccessBackend
69 */ 73 */
70 OContactAccess (const QString appname, const QString filename = 0l, 74 OContactAccess (const QString appname, const QString filename = 0l,
71 OContactAccessBackend* backend = 0l, bool handlesync = true); 75 OContactAccessBackend* backend = 0l, bool handlesync = true);
72 ~OContactAccess (); 76 ~OContactAccess ();
73 77
74 /** Constants for query. 78 /** Constants for query.
75 * Use this constants to set the query parameters. 79 * Use this constants to set the query parameters.
76 * Note: <i>query_IgnoreCase</i> just make sense with one of the other attributes ! 80 * Note: <i>query_IgnoreCase</i> just make sense with one of the other attributes !
77 * @see queryByExample() 81 * @see queryByExample()
78 */ 82 */
79 enum QuerySettings { 83 enum QuerySettings {
80 WildCards = 0x0001, 84 WildCards = 0x0001,
81 IgnoreCase = 0x0002, 85 IgnoreCase = 0x0002,
82 RegExp = 0x0004, 86 RegExp = 0x0004,
83 ExactMatch = 0x0008, 87 ExactMatch = 0x0008,
88 MatchOne = 0x0010 // Only one Entry must match
84 }; 89 };
85 90
91
92 ORecordList<OContact> matchRegexp( const QRegExp &r )const;
93
86 /** Return all possible settings. 94 /** Return all possible settings.
87 * @return All settings provided by the current backend 95 * @return All settings provided by the current backend
88 * (i.e.: query_WildCards & query_IgnoreCase) 96 * (i.e.: query_WildCards & query_IgnoreCase)
89 */ 97 */
90 const uint querySettings(); 98 const uint querySettings();
91 99
92 /** Check whether settings are correct. 100 /** Check whether settings are correct.
93 * @return <i>true</i> if the given settings are correct and possible. 101 * @return <i>true</i> if the given settings are correct and possible.
94 */ 102 */
95 bool hasQuerySettings ( int querySettings ) const; 103 bool hasQuerySettings ( int querySettings ) const;
96 104
97 /** 105 /**
98 * if the resource was changed externally. 106 * if the resource was changed externally.
99 * You should use the signal instead of polling possible changes ! 107 * You should use the signal instead of polling possible changes !
100 */ 108 */
101 bool wasChangedExternally()const; 109 bool wasChangedExternally()const;
102 110
103 111
104 /** Save contacts database. 112 /** Save contacts database.
105 * Save is more a "commit". After calling this function, all changes are public available. 113 * Save is more a "commit". After calling this function, all changes are public available.
106 * @return true if successful 114 * @return true if successful
107 */ 115 */
108 bool save(); 116 bool save();
109 117
110 signals: 118 signals:
111 /* Signal is emitted if the database was changed. Therefore 119 /* Signal is emitted if the database was changed. Therefore
112 * we may need to reload to stay consistent. 120 * we may need to reload to stay consistent.
113 * @param which Pointer to the database who created this event. This pointer 121 * @param which Pointer to the database who created this event. This pointer
114 * is useful if an application has to handle multiple databases at the same time. 122 * is useful if an application has to handle multiple databases at the same time.
115 * @see reload() 123 * @see reload()
116 */ 124 */
117 void signalChanged ( const OContactAccess *which ); 125 void signalChanged ( const OContactAccess *which );
118 126
119 127
120 private: 128 private:
121 // class OContactAccessPrivate; 129 // class OContactAccessPrivate;
122 // OContactAccessPrivate* d; 130 // OContactAccessPrivate* d;
123 OContactAccessBackend *m_backEnd; 131 OContactAccessBackend *m_backEnd;
124 bool m_loading:1; 132 bool m_loading:1;
125 133
126 private slots: 134 private slots:
127 void copMessage( const QCString &msg, const QByteArray &data ); 135 void copMessage( const QCString &msg, const QByteArray &data );
128 136
129 137
130}; 138};
131#endif 139#endif
diff --git a/libopie/pim/ocontactaccessbackend.h b/libopie/pim/ocontactaccessbackend.h
index a651477..c898f61 100644
--- a/libopie/pim/ocontactaccessbackend.h
+++ b/libopie/pim/ocontactaccessbackend.h
@@ -1,74 +1,81 @@
1/** 1/**
2 * The class responsible for managing a backend. 2 * The class responsible for managing a backend.
3 * The implementation of this abstract class contains 3 * The implementation of this abstract class contains
4 * the complete database handling. 4 * the complete database handling.
5 * 5 *
6 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) 6 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de)
7 * Copyright (c) 2002 by Holger Freyther (zecke@handhelds.org) 7 * Copyright (c) 2002 by Holger Freyther (zecke@handhelds.org)
8 * 8 *
9 * ===================================================================== 9 * =====================================================================
10 *This program is free software; you can redistribute it and/or 10 *This program is free software; you can redistribute it and/or
11 *modify it under the terms of the GNU Library General Public 11 *modify it under the terms of the GNU Library General Public
12 * License as published by the Free Software Foundation; 12 * License as published by the Free Software Foundation;
13 * either version 2 of the License, or (at your option) any later 13 * either version 2 of the License, or (at your option) any later
14 * version. 14 * version.
15 * ===================================================================== 15 * =====================================================================
16 * ToDo: Define enum for query settings 16 * ToDo: Define enum for query settings
17 * ===================================================================== 17 * =====================================================================
18 * Version: $Id$ 18 * Version: $Id$
19 * ===================================================================== 19 * =====================================================================
20 * History: 20 * History:
21 * $Log$ 21 * $Log$
22 * Revision 1.3 2002/11/01 15:10:42 eilers
23 * Added regExp-search in database for all fields in a contact.
24 *
22 * Revision 1.2 2002/10/07 17:34:24 eilers 25 * Revision 1.2 2002/10/07 17:34:24 eilers
23 * added OBackendFactory for advanced backend access 26 * added OBackendFactory for advanced backend access
24 * 27 *
25 * Revision 1.1 2002/09/27 17:11:44 eilers 28 * Revision 1.1 2002/09/27 17:11:44 eilers
26 * Added API for accessing the Contact-Database ! It is compiling, but 29 * Added API for accessing the Contact-Database ! It is compiling, but
27 * please do not expect that anything is working ! 30 * please do not expect that anything is working !
28 * I will debug that stuff in the next time .. 31 * I will debug that stuff in the next time ..
29 * Please read README_COMPILE for compiling ! 32 * Please read README_COMPILE for compiling !
30 * 33 *
31 * ===================================================================== 34 * =====================================================================
32 * 35 *
33 */ 36 */
34 37
35#ifndef _OCONTACTACCESSBACKEND_H_ 38#ifndef _OCONTACTACCESSBACKEND_H_
36#define _OCONTACTACCESSBACKEND_H_ 39#define _OCONTACTACCESSBACKEND_H_
37 40
38#include "ocontact.h" 41#include "ocontact.h"
39#include "opimaccessbackend.h" 42#include "opimaccessbackend.h"
40 43
44#include "qregexp.h"
45
41class OContactAccessBackend: public OPimAccessBackend<OContact> { 46class OContactAccessBackend: public OPimAccessBackend<OContact> {
42 public: 47 public:
43 OContactAccessBackend() {} 48 OContactAccessBackend() {}
44 virtual ~OContactAccessBackend() {} 49 virtual ~OContactAccessBackend() {}
45 50
46 51
47 /** Return if database was changed externally. 52 /** Return if database was changed externally.
48 * This may just make sense on file based databases like a XML-File. 53 * This may just make sense on file based databases like a XML-File.
49 * It is used to prevent to overwrite the current database content 54 * It is used to prevent to overwrite the current database content
50 * if the file was already changed by something else ! 55 * if the file was already changed by something else !
51 * If this happens, we have to reload before save our data. 56 * If this happens, we have to reload before save our data.
52 * If we use real databases, this should be handled by the database 57 * If we use real databases, this should be handled by the database
53 * management system themselve, therefore this function should always return false in 58 * management system themselve, therefore this function should always return false in
54 * this case. It is not our problem to handle this conflict ... 59 * this case. It is not our problem to handle this conflict ...
55 * @return <i>true</i> if the database was changed and if save without reload will 60 * @return <i>true</i> if the database was changed and if save without reload will
56 * be dangerous. <i>false</i> if the database was not changed or it is save to write 61 * be dangerous. <i>false</i> if the database was not changed or it is save to write
57 * in this situation. 62 * in this situation.
58 */ 63 */
59 virtual bool wasChangedExternally() = 0; 64 virtual bool wasChangedExternally() = 0;
60 65
66 virtual QArray<int> matchRegexp( const QRegExp &r ) const = 0;
67
61 /** Return all possible settings. 68 /** Return all possible settings.
62 * @return All settings provided by the current backend 69 * @return All settings provided by the current backend
63 * (i.e.: query_WildCards & query_IgnoreCase) 70 * (i.e.: query_WildCards & query_IgnoreCase)
64 */ 71 */
65 virtual const uint querySettings() = 0; 72 virtual const uint querySettings() = 0;
66 73
67 /** Check whether settings are correct. 74 /** Check whether settings are correct.
68 * @return <i>true</i> if the given settings are correct and possible. 75 * @return <i>true</i> if the given settings are correct and possible.
69 */ 76 */
70 virtual bool hasQuerySettings (uint querySettings) const = 0; 77 virtual bool hasQuerySettings (uint querySettings) const = 0;
71 78
72 79
73}; 80};
74#endif 81#endif
diff --git a/libopie/pim/ocontactaccessbackend_xml.h b/libopie/pim/ocontactaccessbackend_xml.h
index 12a75ba..f7e8207 100644
--- a/libopie/pim/ocontactaccessbackend_xml.h
+++ b/libopie/pim/ocontactaccessbackend_xml.h
@@ -1,67 +1,70 @@
1/* 1/*
2 * XML Backend for the OPIE-Contact Database. 2 * XML Backend for the OPIE-Contact Database.
3 * 3 *
4 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) 4 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de)
5 * 5 *
6 * ===================================================================== 6 * =====================================================================
7 *This program is free software; you can redistribute it and/or 7 *This program is free software; you can redistribute it and/or
8 *modify it under the terms of the GNU Library General Public 8 *modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version. 10 * version 2 of the License, or (at your option) any later version.
11 * ===================================================================== 11 * =====================================================================
12 * ToDo: XML-Backend: Automatic reload if something was changed... 12 * ToDo: XML-Backend: Automatic reload if something was changed...
13 * 13 *
14 * 14 *
15 * ===================================================================== 15 * =====================================================================
16 * Version: $Id$ 16 * Version: $Id$
17 * ===================================================================== 17 * =====================================================================
18 * History: 18 * History:
19 * $Log$ 19 * $Log$
20 * Revision 1.5 2002/11/01 15:10:42 eilers
21 * Added regExp-search in database for all fields in a contact.
22 *
20 * Revision 1.4 2002/10/16 10:52:40 eilers 23 * Revision 1.4 2002/10/16 10:52:40 eilers
21 * Added some docu to the interface and now using the cache infrastucture by zecke.. :) 24 * Added some docu to the interface and now using the cache infrastucture by zecke.. :)
22 * 25 *
23 * Revision 1.3 2002/10/14 16:21:54 eilers 26 * Revision 1.3 2002/10/14 16:21:54 eilers
24 * Some minor interface updates 27 * Some minor interface updates
25 * 28 *
26 * Revision 1.2 2002/10/07 17:34:24 eilers 29 * Revision 1.2 2002/10/07 17:34:24 eilers
27 * added OBackendFactory for advanced backend access 30 * added OBackendFactory for advanced backend access
28 * 31 *
29 * Revision 1.1 2002/09/27 17:11:44 eilers 32 * Revision 1.1 2002/09/27 17:11:44 eilers
30 * Added API for accessing the Contact-Database ! It is compiling, but 33 * Added API for accessing the Contact-Database ! It is compiling, but
31 * please do not expect that anything is working ! 34 * please do not expect that anything is working !
32 * I will debug that stuff in the next time .. 35 * I will debug that stuff in the next time ..
33 * Please read README_COMPILE for compiling ! 36 * Please read README_COMPILE for compiling !
34 * 37 *
35 * 38 *
36 */ 39 */
37 40
38#ifndef _OContactAccessBackend_XML_ 41#ifndef _OContactAccessBackend_XML_
39#define _OContactAccessBackend_XML_ 42#define _OContactAccessBackend_XML_
40 43
41#include <qasciidict.h> 44#include <qasciidict.h>
42#include <qdatetime.h> 45#include <qdatetime.h>
43#include <qfile.h> 46#include <qfile.h>
44#include <qfileinfo.h> 47#include <qfileinfo.h>
45#include <qregexp.h> 48#include <qregexp.h>
46#include <qarray.h> 49#include <qarray.h>
47 50
48#include <qpe/global.h> 51#include <qpe/global.h>
49 52
50#include <opie/xmltree.h> 53#include <opie/xmltree.h>
51#include "ocontactaccessbackend.h" 54#include "ocontactaccessbackend.h"
52#include "ocontactaccess.h" 55#include "ocontactaccess.h"
53 56
54#include <stdlib.h> 57#include <stdlib.h>
55#include <errno.h> 58#include <errno.h>
56 59
57using namespace Opie; 60using namespace Opie;
58 61
59/* the default xml implementation */ 62/* the default xml implementation */
60class OContactAccessBackend_XML : public OContactAccessBackend { 63class OContactAccessBackend_XML : public OContactAccessBackend {
61 public: 64 public:
62 OContactAccessBackend_XML ( QString appname, QString filename = 0l ): 65 OContactAccessBackend_XML ( QString appname, QString filename = 0l ):
63 m_changed( false ) 66 m_changed( false )
64 { 67 {
65 m_appName = appname; 68 m_appName = appname;
66 69
67 /* Set journalfile name ... */ 70 /* Set journalfile name ... */
@@ -209,96 +212,113 @@ class OContactAccessBackend_XML : public OContactAccessBackend {
209 /* Search all fields and compare them with query object. Store them into list 212 /* Search all fields and compare them with query object. Store them into list
210 * if all fields matches. 213 * if all fields matches.
211 */ 214 */
212 bool allcorrect = true; 215 bool allcorrect = true;
213 for ( int i = 0; i < Qtopia::rid; i++ ) { 216 for ( int i = 0; i < Qtopia::rid; i++ ) {
214 /* Just compare fields which are not empty in the query object */ 217 /* Just compare fields which are not empty in the query object */
215 if ( !query.field(i).isEmpty() ){ 218 if ( !query.field(i).isEmpty() ){
216 switch ( settings & ~OContactAccess::IgnoreCase ){ 219 switch ( settings & ~OContactAccess::IgnoreCase ){
217 case OContactAccess::RegExp:{ 220 case OContactAccess::RegExp:{
218 QRegExp expr ( query.field(i), 221 QRegExp expr ( query.field(i),
219 !(settings & OContactAccess::IgnoreCase), 222 !(settings & OContactAccess::IgnoreCase),
220 false ); 223 false );
221 if ( expr.find ( (*it).field(i), 0 ) == -1 ) 224 if ( expr.find ( (*it).field(i), 0 ) == -1 )
222 allcorrect = false; 225 allcorrect = false;
223 } 226 }
224 break; 227 break;
225 case OContactAccess::WildCards:{ 228 case OContactAccess::WildCards:{
226 QRegExp expr ( query.field(i), 229 QRegExp expr ( query.field(i),
227 !(settings & OContactAccess::IgnoreCase), 230 !(settings & OContactAccess::IgnoreCase),
228 true ); 231 true );
229 if ( expr.find ( (*it).field(i), 0 ) == -1 ) 232 if ( expr.find ( (*it).field(i), 0 ) == -1 )
230 allcorrect = false; 233 allcorrect = false;
231 } 234 }
232 break; 235 break;
233 case OContactAccess::ExactMatch:{ 236 case OContactAccess::ExactMatch:{
234 if (settings & OContactAccess::IgnoreCase){ 237 if (settings & OContactAccess::IgnoreCase){
235 if ( query.field(i).upper() != 238 if ( query.field(i).upper() !=
236 (*it).field(i).upper() ) 239 (*it).field(i).upper() )
237 allcorrect = false; 240 allcorrect = false;
238 }else{ 241 }else{
239 if ( query.field(i) != (*it).field(i) ) 242 if ( query.field(i) != (*it).field(i) )
240 allcorrect = false; 243 allcorrect = false;
241 } 244 }
242 } 245 }
243 break; 246 break;
244 } 247 }
245 } 248 }
246 } 249 }
247 if ( allcorrect ){ 250 if ( allcorrect ){
248 m_currentQuery[arraycounter++] = (*it).uid(); 251 m_currentQuery[arraycounter++] = (*it).uid();
249 } 252 }
250 } 253 }
251 254
252 // Shrink to fit.. 255 // Shrink to fit..
253 m_currentQuery.resize(arraycounter); 256 m_currentQuery.resize(arraycounter);
254 257
255 return m_currentQuery; 258 return m_currentQuery;
256 } 259 }
260
261 QArray<int> matchRegexp( const QRegExp &r ) const{
262 QArray<int> m_currentQuery( m_contactList.count() );
263 QValueListConstIterator<OContact> it;
264 uint arraycounter = 0;
265
266 for( it = m_contactList.begin(); it != m_contactList.end(); ++it ){
267 if ( (*it).match( r ) ){
268 m_currentQuery[arraycounter++] = (*it).uid();
269 }
270
271 }
272 // Shrink to fit..
273 m_currentQuery.resize(arraycounter);
274
275 return m_currentQuery;
276 }
257 277
258 const uint querySettings() 278 const uint querySettings()
259 { 279 {
260 return ( OContactAccess::WildCards 280 return ( OContactAccess::WildCards
261 & OContactAccess::IgnoreCase 281 & OContactAccess::IgnoreCase
262 & OContactAccess::RegExp 282 & OContactAccess::RegExp
263 & OContactAccess::ExactMatch ); 283 & OContactAccess::ExactMatch );
264 } 284 }
265 285
266 bool hasQuerySettings (uint querySettings) const 286 bool hasQuerySettings (uint querySettings) const
267 { 287 {
268 /* OContactAccess::IgnoreCase may be added with one 288 /* OContactAccess::IgnoreCase may be added with one
269 * of the other settings, but never used alone. 289 * of the other settings, but never used alone.
270 * The other settings are just valid alone... 290 * The other settings are just valid alone...
271 */ 291 */
272 switch ( querySettings & ~OContactAccess::IgnoreCase ){ 292 switch ( querySettings & ~OContactAccess::IgnoreCase ){
273 case OContactAccess::RegExp: 293 case OContactAccess::RegExp:
274 return ( true ); 294 return ( true );
275 case OContactAccess::WildCards: 295 case OContactAccess::WildCards:
276 return ( true ); 296 return ( true );
277 case OContactAccess::ExactMatch: 297 case OContactAccess::ExactMatch:
278 return ( true ); 298 return ( true );
279 default: 299 default:
280 return ( false ); 300 return ( false );
281 } 301 }
282 } 302 }
283 303
284 bool add ( const OContact &newcontact ) 304 bool add ( const OContact &newcontact )
285 { 305 {
286 //qWarning("odefaultbackend: ACTION::ADD"); 306 //qWarning("odefaultbackend: ACTION::ADD");
287 updateJournal (newcontact, OContact::ACTION_ADD); 307 updateJournal (newcontact, OContact::ACTION_ADD);
288 addContact_p( newcontact ); 308 addContact_p( newcontact );
289 309
290 m_changed = true; 310 m_changed = true;
291 311
292 return true; 312 return true;
293 } 313 }
294 314
295 bool replace ( const OContact &contact ) 315 bool replace ( const OContact &contact )
296 { 316 {
297 m_changed = true; 317 m_changed = true;
298 318
299 bool found = false; 319 bool found = false;
300 320
301 QValueListIterator<OContact> it; 321 QValueListIterator<OContact> it;
302 for( it = m_contactList.begin(); it != m_contactList.end(); ++it ){ 322 for( it = m_contactList.begin(); it != m_contactList.end(); ++it ){
303 if ( (*it).uid() == contact.uid() ){ 323 if ( (*it).uid() == contact.uid() ){
304 found = true; 324 found = true;
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend.h b/libopie2/opiepim/backend/ocontactaccessbackend.h
index a651477..c898f61 100644
--- a/libopie2/opiepim/backend/ocontactaccessbackend.h
+++ b/libopie2/opiepim/backend/ocontactaccessbackend.h
@@ -1,74 +1,81 @@
1/** 1/**
2 * The class responsible for managing a backend. 2 * The class responsible for managing a backend.
3 * The implementation of this abstract class contains 3 * The implementation of this abstract class contains
4 * the complete database handling. 4 * the complete database handling.
5 * 5 *
6 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) 6 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de)
7 * Copyright (c) 2002 by Holger Freyther (zecke@handhelds.org) 7 * Copyright (c) 2002 by Holger Freyther (zecke@handhelds.org)
8 * 8 *
9 * ===================================================================== 9 * =====================================================================
10 *This program is free software; you can redistribute it and/or 10 *This program is free software; you can redistribute it and/or
11 *modify it under the terms of the GNU Library General Public 11 *modify it under the terms of the GNU Library General Public
12 * License as published by the Free Software Foundation; 12 * License as published by the Free Software Foundation;
13 * either version 2 of the License, or (at your option) any later 13 * either version 2 of the License, or (at your option) any later
14 * version. 14 * version.
15 * ===================================================================== 15 * =====================================================================
16 * ToDo: Define enum for query settings 16 * ToDo: Define enum for query settings
17 * ===================================================================== 17 * =====================================================================
18 * Version: $Id$ 18 * Version: $Id$
19 * ===================================================================== 19 * =====================================================================
20 * History: 20 * History:
21 * $Log$ 21 * $Log$
22 * Revision 1.3 2002/11/01 15:10:42 eilers
23 * Added regExp-search in database for all fields in a contact.
24 *
22 * Revision 1.2 2002/10/07 17:34:24 eilers 25 * Revision 1.2 2002/10/07 17:34:24 eilers
23 * added OBackendFactory for advanced backend access 26 * added OBackendFactory for advanced backend access
24 * 27 *
25 * Revision 1.1 2002/09/27 17:11:44 eilers 28 * Revision 1.1 2002/09/27 17:11:44 eilers
26 * Added API for accessing the Contact-Database ! It is compiling, but 29 * Added API for accessing the Contact-Database ! It is compiling, but
27 * please do not expect that anything is working ! 30 * please do not expect that anything is working !
28 * I will debug that stuff in the next time .. 31 * I will debug that stuff in the next time ..
29 * Please read README_COMPILE for compiling ! 32 * Please read README_COMPILE for compiling !
30 * 33 *
31 * ===================================================================== 34 * =====================================================================
32 * 35 *
33 */ 36 */
34 37
35#ifndef _OCONTACTACCESSBACKEND_H_ 38#ifndef _OCONTACTACCESSBACKEND_H_
36#define _OCONTACTACCESSBACKEND_H_ 39#define _OCONTACTACCESSBACKEND_H_
37 40
38#include "ocontact.h" 41#include "ocontact.h"
39#include "opimaccessbackend.h" 42#include "opimaccessbackend.h"
40 43
44#include "qregexp.h"
45
41class OContactAccessBackend: public OPimAccessBackend<OContact> { 46class OContactAccessBackend: public OPimAccessBackend<OContact> {
42 public: 47 public:
43 OContactAccessBackend() {} 48 OContactAccessBackend() {}
44 virtual ~OContactAccessBackend() {} 49 virtual ~OContactAccessBackend() {}
45 50
46 51
47 /** Return if database was changed externally. 52 /** Return if database was changed externally.
48 * This may just make sense on file based databases like a XML-File. 53 * This may just make sense on file based databases like a XML-File.
49 * It is used to prevent to overwrite the current database content 54 * It is used to prevent to overwrite the current database content
50 * if the file was already changed by something else ! 55 * if the file was already changed by something else !
51 * If this happens, we have to reload before save our data. 56 * If this happens, we have to reload before save our data.
52 * If we use real databases, this should be handled by the database 57 * If we use real databases, this should be handled by the database
53 * management system themselve, therefore this function should always return false in 58 * management system themselve, therefore this function should always return false in
54 * this case. It is not our problem to handle this conflict ... 59 * this case. It is not our problem to handle this conflict ...
55 * @return <i>true</i> if the database was changed and if save without reload will 60 * @return <i>true</i> if the database was changed and if save without reload will
56 * be dangerous. <i>false</i> if the database was not changed or it is save to write 61 * be dangerous. <i>false</i> if the database was not changed or it is save to write
57 * in this situation. 62 * in this situation.
58 */ 63 */
59 virtual bool wasChangedExternally() = 0; 64 virtual bool wasChangedExternally() = 0;
60 65
66 virtual QArray<int> matchRegexp( const QRegExp &r ) const = 0;
67
61 /** Return all possible settings. 68 /** Return all possible settings.
62 * @return All settings provided by the current backend 69 * @return All settings provided by the current backend
63 * (i.e.: query_WildCards & query_IgnoreCase) 70 * (i.e.: query_WildCards & query_IgnoreCase)
64 */ 71 */
65 virtual const uint querySettings() = 0; 72 virtual const uint querySettings() = 0;
66 73
67 /** Check whether settings are correct. 74 /** Check whether settings are correct.
68 * @return <i>true</i> if the given settings are correct and possible. 75 * @return <i>true</i> if the given settings are correct and possible.
69 */ 76 */
70 virtual bool hasQuerySettings (uint querySettings) const = 0; 77 virtual bool hasQuerySettings (uint querySettings) const = 0;
71 78
72 79
73}; 80};
74#endif 81#endif
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_xml.h b/libopie2/opiepim/backend/ocontactaccessbackend_xml.h
index 12a75ba..f7e8207 100644
--- a/libopie2/opiepim/backend/ocontactaccessbackend_xml.h
+++ b/libopie2/opiepim/backend/ocontactaccessbackend_xml.h
@@ -1,67 +1,70 @@
1/* 1/*
2 * XML Backend for the OPIE-Contact Database. 2 * XML Backend for the OPIE-Contact Database.
3 * 3 *
4 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) 4 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de)
5 * 5 *
6 * ===================================================================== 6 * =====================================================================
7 *This program is free software; you can redistribute it and/or 7 *This program is free software; you can redistribute it and/or
8 *modify it under the terms of the GNU Library General Public 8 *modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version. 10 * version 2 of the License, or (at your option) any later version.
11 * ===================================================================== 11 * =====================================================================
12 * ToDo: XML-Backend: Automatic reload if something was changed... 12 * ToDo: XML-Backend: Automatic reload if something was changed...
13 * 13 *
14 * 14 *
15 * ===================================================================== 15 * =====================================================================
16 * Version: $Id$ 16 * Version: $Id$
17 * ===================================================================== 17 * =====================================================================
18 * History: 18 * History:
19 * $Log$ 19 * $Log$
20 * Revision 1.5 2002/11/01 15:10:42 eilers
21 * Added regExp-search in database for all fields in a contact.
22 *
20 * Revision 1.4 2002/10/16 10:52:40 eilers 23 * Revision 1.4 2002/10/16 10:52:40 eilers
21 * Added some docu to the interface and now using the cache infrastucture by zecke.. :) 24 * Added some docu to the interface and now using the cache infrastucture by zecke.. :)
22 * 25 *
23 * Revision 1.3 2002/10/14 16:21:54 eilers 26 * Revision 1.3 2002/10/14 16:21:54 eilers
24 * Some minor interface updates 27 * Some minor interface updates
25 * 28 *
26 * Revision 1.2 2002/10/07 17:34:24 eilers 29 * Revision 1.2 2002/10/07 17:34:24 eilers
27 * added OBackendFactory for advanced backend access 30 * added OBackendFactory for advanced backend access
28 * 31 *
29 * Revision 1.1 2002/09/27 17:11:44 eilers 32 * Revision 1.1 2002/09/27 17:11:44 eilers
30 * Added API for accessing the Contact-Database ! It is compiling, but 33 * Added API for accessing the Contact-Database ! It is compiling, but
31 * please do not expect that anything is working ! 34 * please do not expect that anything is working !
32 * I will debug that stuff in the next time .. 35 * I will debug that stuff in the next time ..
33 * Please read README_COMPILE for compiling ! 36 * Please read README_COMPILE for compiling !
34 * 37 *
35 * 38 *
36 */ 39 */
37 40
38#ifndef _OContactAccessBackend_XML_ 41#ifndef _OContactAccessBackend_XML_
39#define _OContactAccessBackend_XML_ 42#define _OContactAccessBackend_XML_
40 43
41#include <qasciidict.h> 44#include <qasciidict.h>
42#include <qdatetime.h> 45#include <qdatetime.h>
43#include <qfile.h> 46#include <qfile.h>
44#include <qfileinfo.h> 47#include <qfileinfo.h>
45#include <qregexp.h> 48#include <qregexp.h>
46#include <qarray.h> 49#include <qarray.h>
47 50
48#include <qpe/global.h> 51#include <qpe/global.h>
49 52
50#include <opie/xmltree.h> 53#include <opie/xmltree.h>
51#include "ocontactaccessbackend.h" 54#include "ocontactaccessbackend.h"
52#include "ocontactaccess.h" 55#include "ocontactaccess.h"
53 56
54#include <stdlib.h> 57#include <stdlib.h>
55#include <errno.h> 58#include <errno.h>
56 59
57using namespace Opie; 60using namespace Opie;
58 61
59/* the default xml implementation */ 62/* the default xml implementation */
60class OContactAccessBackend_XML : public OContactAccessBackend { 63class OContactAccessBackend_XML : public OContactAccessBackend {
61 public: 64 public:
62 OContactAccessBackend_XML ( QString appname, QString filename = 0l ): 65 OContactAccessBackend_XML ( QString appname, QString filename = 0l ):
63 m_changed( false ) 66 m_changed( false )
64 { 67 {
65 m_appName = appname; 68 m_appName = appname;
66 69
67 /* Set journalfile name ... */ 70 /* Set journalfile name ... */
@@ -209,96 +212,113 @@ class OContactAccessBackend_XML : public OContactAccessBackend {
209 /* Search all fields and compare them with query object. Store them into list 212 /* Search all fields and compare them with query object. Store them into list
210 * if all fields matches. 213 * if all fields matches.
211 */ 214 */
212 bool allcorrect = true; 215 bool allcorrect = true;
213 for ( int i = 0; i < Qtopia::rid; i++ ) { 216 for ( int i = 0; i < Qtopia::rid; i++ ) {
214 /* Just compare fields which are not empty in the query object */ 217 /* Just compare fields which are not empty in the query object */
215 if ( !query.field(i).isEmpty() ){ 218 if ( !query.field(i).isEmpty() ){
216 switch ( settings & ~OContactAccess::IgnoreCase ){ 219 switch ( settings & ~OContactAccess::IgnoreCase ){
217 case OContactAccess::RegExp:{ 220 case OContactAccess::RegExp:{
218 QRegExp expr ( query.field(i), 221 QRegExp expr ( query.field(i),
219 !(settings & OContactAccess::IgnoreCase), 222 !(settings & OContactAccess::IgnoreCase),
220 false ); 223 false );
221 if ( expr.find ( (*it).field(i), 0 ) == -1 ) 224 if ( expr.find ( (*it).field(i), 0 ) == -1 )
222 allcorrect = false; 225 allcorrect = false;
223 } 226 }
224 break; 227 break;
225 case OContactAccess::WildCards:{ 228 case OContactAccess::WildCards:{
226 QRegExp expr ( query.field(i), 229 QRegExp expr ( query.field(i),
227 !(settings & OContactAccess::IgnoreCase), 230 !(settings & OContactAccess::IgnoreCase),
228 true ); 231 true );
229 if ( expr.find ( (*it).field(i), 0 ) == -1 ) 232 if ( expr.find ( (*it).field(i), 0 ) == -1 )
230 allcorrect = false; 233 allcorrect = false;
231 } 234 }
232 break; 235 break;
233 case OContactAccess::ExactMatch:{ 236 case OContactAccess::ExactMatch:{
234 if (settings & OContactAccess::IgnoreCase){ 237 if (settings & OContactAccess::IgnoreCase){
235 if ( query.field(i).upper() != 238 if ( query.field(i).upper() !=
236 (*it).field(i).upper() ) 239 (*it).field(i).upper() )
237 allcorrect = false; 240 allcorrect = false;
238 }else{ 241 }else{
239 if ( query.field(i) != (*it).field(i) ) 242 if ( query.field(i) != (*it).field(i) )
240 allcorrect = false; 243 allcorrect = false;
241 } 244 }
242 } 245 }
243 break; 246 break;
244 } 247 }
245 } 248 }
246 } 249 }
247 if ( allcorrect ){ 250 if ( allcorrect ){
248 m_currentQuery[arraycounter++] = (*it).uid(); 251 m_currentQuery[arraycounter++] = (*it).uid();
249 } 252 }
250 } 253 }
251 254
252 // Shrink to fit.. 255 // Shrink to fit..
253 m_currentQuery.resize(arraycounter); 256 m_currentQuery.resize(arraycounter);
254 257
255 return m_currentQuery; 258 return m_currentQuery;
256 } 259 }
260
261 QArray<int> matchRegexp( const QRegExp &r ) const{
262 QArray<int> m_currentQuery( m_contactList.count() );
263 QValueListConstIterator<OContact> it;
264 uint arraycounter = 0;
265
266 for( it = m_contactList.begin(); it != m_contactList.end(); ++it ){
267 if ( (*it).match( r ) ){
268 m_currentQuery[arraycounter++] = (*it).uid();
269 }
270
271 }
272 // Shrink to fit..
273 m_currentQuery.resize(arraycounter);
274
275 return m_currentQuery;
276 }
257 277
258 const uint querySettings() 278 const uint querySettings()
259 { 279 {
260 return ( OContactAccess::WildCards 280 return ( OContactAccess::WildCards
261 & OContactAccess::IgnoreCase 281 & OContactAccess::IgnoreCase
262 & OContactAccess::RegExp 282 & OContactAccess::RegExp
263 & OContactAccess::ExactMatch ); 283 & OContactAccess::ExactMatch );
264 } 284 }
265 285
266 bool hasQuerySettings (uint querySettings) const 286 bool hasQuerySettings (uint querySettings) const
267 { 287 {
268 /* OContactAccess::IgnoreCase may be added with one 288 /* OContactAccess::IgnoreCase may be added with one
269 * of the other settings, but never used alone. 289 * of the other settings, but never used alone.
270 * The other settings are just valid alone... 290 * The other settings are just valid alone...
271 */ 291 */
272 switch ( querySettings & ~OContactAccess::IgnoreCase ){ 292 switch ( querySettings & ~OContactAccess::IgnoreCase ){
273 case OContactAccess::RegExp: 293 case OContactAccess::RegExp:
274 return ( true ); 294 return ( true );
275 case OContactAccess::WildCards: 295 case OContactAccess::WildCards:
276 return ( true ); 296 return ( true );
277 case OContactAccess::ExactMatch: 297 case OContactAccess::ExactMatch:
278 return ( true ); 298 return ( true );
279 default: 299 default:
280 return ( false ); 300 return ( false );
281 } 301 }
282 } 302 }
283 303
284 bool add ( const OContact &newcontact ) 304 bool add ( const OContact &newcontact )
285 { 305 {
286 //qWarning("odefaultbackend: ACTION::ADD"); 306 //qWarning("odefaultbackend: ACTION::ADD");
287 updateJournal (newcontact, OContact::ACTION_ADD); 307 updateJournal (newcontact, OContact::ACTION_ADD);
288 addContact_p( newcontact ); 308 addContact_p( newcontact );
289 309
290 m_changed = true; 310 m_changed = true;
291 311
292 return true; 312 return true;
293 } 313 }
294 314
295 bool replace ( const OContact &contact ) 315 bool replace ( const OContact &contact )
296 { 316 {
297 m_changed = true; 317 m_changed = true;
298 318
299 bool found = false; 319 bool found = false;
300 320
301 QValueListIterator<OContact> it; 321 QValueListIterator<OContact> it;
302 for( it = m_contactList.begin(); it != m_contactList.end(); ++it ){ 322 for( it = m_contactList.begin(); it != m_contactList.end(); ++it ){
303 if ( (*it).uid() == contact.uid() ){ 323 if ( (*it).uid() == contact.uid() ){
304 found = true; 324 found = true;
diff --git a/libopie2/opiepim/core/ocontactaccess.cpp b/libopie2/opiepim/core/ocontactaccess.cpp
index 2ca0283..f868b53 100644
--- a/libopie2/opiepim/core/ocontactaccess.cpp
+++ b/libopie2/opiepim/core/ocontactaccess.cpp
@@ -1,71 +1,74 @@
1/* 1/*
2 * Class to manage the Contacts. 2 * Class to manage the Contacts.
3 * 3 *
4 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) 4 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de)
5 * 5 *
6 * ===================================================================== 6 * =====================================================================
7 *This program is free software; you can redistribute it and/or 7 *This program is free software; you can redistribute it and/or
8 *modify it under the terms of the GNU Library General Public 8 *modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version. 10 * version 2 of the License, or (at your option) any later version.
11 * ===================================================================== 11 * =====================================================================
12 * Info: This class could just work with a change in the header-file 12 * Info: This class could just work with a change in the header-file
13 * of the Contact class ! Therefore our libopie only compiles 13 * of the Contact class ! Therefore our libopie only compiles
14 * with our version of libqpe 14 * with our version of libqpe
15 * ===================================================================== 15 * =====================================================================
16 * ToDo: XML-Backend: Automatic reload if something was changed... 16 * ToDo: XML-Backend: Automatic reload if something was changed...
17 * 17 *
18 * 18 *
19 * ===================================================================== 19 * =====================================================================
20 * Version: $Id$ 20 * Version: $Id$
21 * ===================================================================== 21 * =====================================================================
22 * History: 22 * History:
23 * $Log$ 23 * $Log$
24 * Revision 1.6 2002/11/01 15:10:42 eilers
25 * Added regExp-search in database for all fields in a contact.
26 *
24 * Revision 1.5 2002/10/16 10:52:40 eilers 27 * Revision 1.5 2002/10/16 10:52:40 eilers
25 * Added some docu to the interface and now using the cache infrastucture by zecke.. :) 28 * Added some docu to the interface and now using the cache infrastucture by zecke.. :)
26 * 29 *
27 * Revision 1.4 2002/10/14 16:21:54 eilers 30 * Revision 1.4 2002/10/14 16:21:54 eilers
28 * Some minor interface updates 31 * Some minor interface updates
29 * 32 *
30 * Revision 1.3 2002/10/07 17:34:24 eilers 33 * Revision 1.3 2002/10/07 17:34:24 eilers
31 * added OBackendFactory for advanced backend access 34 * added OBackendFactory for advanced backend access
32 * 35 *
33 * Revision 1.2 2002/10/02 16:18:11 eilers 36 * Revision 1.2 2002/10/02 16:18:11 eilers
34 * debugged and seems to work almost perfectly .. 37 * debugged and seems to work almost perfectly ..
35 * 38 *
36 * Revision 1.1 2002/09/27 17:11:44 eilers 39 * Revision 1.1 2002/09/27 17:11:44 eilers
37 * Added API for accessing the Contact-Database ! It is compiling, but 40 * Added API for accessing the Contact-Database ! It is compiling, but
38 * please do not expect that anything is working ! 41 * please do not expect that anything is working !
39 * I will debug that stuff in the next time .. 42 * I will debug that stuff in the next time ..
40 * Please read README_COMPILE for compiling ! 43 * Please read README_COMPILE for compiling !
41 * 44 *
42 * 45 *
43 */ 46 */
44 47
45#include "ocontactaccess.h" 48#include "ocontactaccess.h"
46#include "obackendfactory.h" 49#include "obackendfactory.h"
47 50
48#include <qasciidict.h> 51#include <qasciidict.h>
49#include <qdatetime.h> 52#include <qdatetime.h>
50#include <qfile.h> 53#include <qfile.h>
51#include <qregexp.h> 54#include <qregexp.h>
52#include <qlist.h> 55#include <qlist.h>
53#include <qcopchannel_qws.h> 56#include <qcopchannel_qws.h>
54 57
55//#include <qpe/qcopenvelope_qws.h> 58//#include <qpe/qcopenvelope_qws.h>
56#include <qpe/global.h> 59#include <qpe/global.h>
57 60
58#include <errno.h> 61#include <errno.h>
59#include <fcntl.h> 62#include <fcntl.h>
60#include <unistd.h> 63#include <unistd.h>
61#include <stdlib.h> 64#include <stdlib.h>
62 65
63#include "ocontactaccessbackend_xml.h" 66#include "ocontactaccessbackend_xml.h"
64 67
65 68
66OContactAccess::OContactAccess ( const QString appname, const QString , 69OContactAccess::OContactAccess ( const QString appname, const QString ,
67 OContactAccessBackend* end, bool autosync ): 70 OContactAccessBackend* end, bool autosync ):
68 OPimAccessTemplate<OContact>( end ) 71 OPimAccessTemplate<OContact>( end )
69{ 72{
70 /* take care of the backend. If there is no one defined, we 73 /* take care of the backend. If there is no one defined, we
71 * will use the XML-Backend as default (until we have a cute SQL-Backend..). 74 * will use the XML-Backend as default (until we have a cute SQL-Backend..).
@@ -75,79 +78,84 @@ OContactAccess::OContactAccess ( const QString appname, const QString ,
75 end = OBackendFactory<OContactAccessBackend>::Default( "contact", appname ); 78 end = OBackendFactory<OContactAccessBackend>::Default( "contact", appname );
76 } 79 }
77 // Set backend locally and in template 80 // Set backend locally and in template
78 m_backEnd = end; 81 m_backEnd = end;
79 OPimAccessTemplate<OContact>::setBackEnd (end); 82 OPimAccessTemplate<OContact>::setBackEnd (end);
80 83
81 84
82 /* Connect signal of external db change to function */ 85 /* Connect signal of external db change to function */
83 QCopChannel *dbchannel = new QCopChannel( "QPE/PIM", this ); 86 QCopChannel *dbchannel = new QCopChannel( "QPE/PIM", this );
84 connect( dbchannel, SIGNAL(received(const QCString &, const QByteArray &)), 87 connect( dbchannel, SIGNAL(received(const QCString &, const QByteArray &)),
85 this, SLOT(copMessage( const QCString &, const QByteArray &)) ); 88 this, SLOT(copMessage( const QCString &, const QByteArray &)) );
86 if ( autosync ){ 89 if ( autosync ){
87 QCopChannel *syncchannel = new QCopChannel( "QPE/Sync", this ); 90 QCopChannel *syncchannel = new QCopChannel( "QPE/Sync", this );
88 connect( syncchannel, SIGNAL(received(const QCString &, const QByteArray &)), 91 connect( syncchannel, SIGNAL(received(const QCString &, const QByteArray &)),
89 this, SLOT(copMessage( const QCString &, const QByteArray &)) ); 92 this, SLOT(copMessage( const QCString &, const QByteArray &)) );
90 } 93 }
91 94
92 95
93} 96}
94OContactAccess::~OContactAccess () 97OContactAccess::~OContactAccess ()
95{ 98{
96 /* The user may forget to save the changed database, therefore try to 99 /* The user may forget to save the changed database, therefore try to
97 * do it for him.. 100 * do it for him..
98 */ 101 */
99 save(); 102 save();
100 // delete m_backEnd; is done by template.. 103 // delete m_backEnd; is done by template..
101} 104}
102 105
103 106
104bool OContactAccess::save () 107bool OContactAccess::save ()
105{ 108{
106 /* If the database was changed externally, we could not save the 109 /* If the database was changed externally, we could not save the
107 * Data. This will remove added items which is unacceptable ! 110 * Data. This will remove added items which is unacceptable !
108 * Therefore: Reload database and merge the data... 111 * Therefore: Reload database and merge the data...
109 */ 112 */
110 if ( OPimAccessTemplate<OContact>::wasChangedExternally() ) 113 if ( OPimAccessTemplate<OContact>::wasChangedExternally() )
111 reload(); 114 reload();
112 115
113 bool status = OPimAccessTemplate<OContact>::save(); 116 bool status = OPimAccessTemplate<OContact>::save();
114 if ( !status ) return false; 117 if ( !status ) return false;
115 118
116 /* Now tell everyone that new data is available. 119 /* Now tell everyone that new data is available.
117 */ 120 */
118 QCopEnvelope e( "QPE/PIM", "addressbookUpdated()" ); 121 QCopEnvelope e( "QPE/PIM", "addressbookUpdated()" );
119 122
120 return true; 123 return true;
121} 124}
122 125
126ORecordList<OContact> OContactAccess::matchRegexp( const QRegExp &r ) const{
127 QArray<int> matchingContacts = m_backEnd -> matchRegexp( r );
128 return ( ORecordList<OContact>(matchingContacts, this) );
129}
130
123const uint OContactAccess::querySettings() 131const uint OContactAccess::querySettings()
124{ 132{
125 return ( m_backEnd->querySettings() ); 133 return ( m_backEnd->querySettings() );
126} 134}
127 135
128bool OContactAccess::hasQuerySettings ( int querySettings ) const 136bool OContactAccess::hasQuerySettings ( int querySettings ) const
129{ 137{
130 return ( m_backEnd->hasQuerySettings ( querySettings ) ); 138 return ( m_backEnd->hasQuerySettings ( querySettings ) );
131} 139}
132 140
133 141
134bool OContactAccess::wasChangedExternally()const 142bool OContactAccess::wasChangedExternally()const
135{ 143{
136 return ( m_backEnd->wasChangedExternally() ); 144 return ( m_backEnd->wasChangedExternally() );
137} 145}
138 146
139 147
140void OContactAccess::copMessage( const QCString &msg, const QByteArray & ) 148void OContactAccess::copMessage( const QCString &msg, const QByteArray & )
141{ 149{
142 if ( msg == "addressbookUpdated()" ){ 150 if ( msg == "addressbookUpdated()" ){
143 qWarning ("OContactAccess: Received addressbokUpdated()"); 151 qWarning ("OContactAccess: Received addressbokUpdated()");
144 emit signalChanged ( this ); 152 emit signalChanged ( this );
145 } else if ( msg == "flush()" ) { 153 } else if ( msg == "flush()" ) {
146 qWarning ("OContactAccess: Received flush()"); 154 qWarning ("OContactAccess: Received flush()");
147 save (); 155 save ();
148 } else if ( msg == "reload()" ) { 156 } else if ( msg == "reload()" ) {
149 qWarning ("OContactAccess: Received reload()"); 157 qWarning ("OContactAccess: Received reload()");
150 reload (); 158 reload ();
151 emit signalChanged ( this ); 159 emit signalChanged ( this );
152 } 160 }
153} 161}
diff --git a/libopie2/opiepim/core/ocontactaccess.h b/libopie2/opiepim/core/ocontactaccess.h
index da9c942..b4921d5 100644
--- a/libopie2/opiepim/core/ocontactaccess.h
+++ b/libopie2/opiepim/core/ocontactaccess.h
@@ -1,131 +1,139 @@
1/* 1/*
2 * Class to manage the Contacts. 2 * Class to manage the Contacts.
3 * 3 *
4 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) 4 * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de)
5 * Copyright (c) 2002 by Holger Freyther (zecke@handhelds.org) 5 * Copyright (c) 2002 by Holger Freyther (zecke@handhelds.org)
6 * 6 *
7 * ===================================================================== 7 * =====================================================================
8 *This program is free software; you can redistribute it and/or 8 *This program is free software; you can redistribute it and/or
9 *modify it under the terms of the GNU Library General Public 9 *modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; 10 * License as published by the Free Software Foundation;
11 * either version 2 of the License, or (at your option) any later 11 * either version 2 of the License, or (at your option) any later
12 * version. 12 * version.
13 * ===================================================================== 13 * =====================================================================
14 * ToDo: Define enum for query settings 14 * ToDo: Define enum for query settings
15 * ===================================================================== 15 * =====================================================================
16 * Version: $Id$ 16 * Version: $Id$
17 * ===================================================================== 17 * =====================================================================
18 * History: 18 * History:
19 * $Log$ 19 * $Log$
20 * Revision 1.4 2002/11/01 15:10:42 eilers
21 * Added regExp-search in database for all fields in a contact.
22 *
20 * Revision 1.3 2002/10/16 10:52:40 eilers 23 * Revision 1.3 2002/10/16 10:52:40 eilers
21 * Added some docu to the interface and now using the cache infrastucture by zecke.. :) 24 * Added some docu to the interface and now using the cache infrastucture by zecke.. :)
22 * 25 *
23 * Revision 1.2 2002/10/14 16:21:54 eilers 26 * Revision 1.2 2002/10/14 16:21:54 eilers
24 * Some minor interface updates 27 * Some minor interface updates
25 * 28 *
26 * Revision 1.1 2002/09/27 17:11:44 eilers 29 * Revision 1.1 2002/09/27 17:11:44 eilers
27 * Added API for accessing the Contact-Database ! It is compiling, but 30 * Added API for accessing the Contact-Database ! It is compiling, but
28 * please do not expect that anything is working ! 31 * please do not expect that anything is working !
29 * I will debug that stuff in the next time .. 32 * I will debug that stuff in the next time ..
30 * Please read README_COMPILE for compiling ! 33 * Please read README_COMPILE for compiling !
31 * 34 *
32 * ===================================================================== 35 * =====================================================================
33 */ 36 */
34#ifndef _OCONTACTACCESS_H 37#ifndef _OCONTACTACCESS_H
35#define _OCONTACTACCESS_H 38#define _OCONTACTACCESS_H
36 39
37#include <qobject.h> 40#include <qobject.h>
38 41
39#include <qpe/qcopenvelope_qws.h> 42#include <qpe/qcopenvelope_qws.h>
40 43
41#include <qvaluelist.h> 44#include <qvaluelist.h>
42#include <qfileinfo.h> 45#include <qfileinfo.h>
43 46
44#include "ocontact.h" 47#include "ocontact.h"
45#include "ocontactaccessbackend.h" 48#include "ocontactaccessbackend.h"
46#include "opimaccesstemplate.h" 49#include "opimaccesstemplate.h"
47 50
48/** Class to access the contacts database. 51/** Class to access the contacts database.
49 * This is just a frontend for the real database handling which is 52 * This is just a frontend for the real database handling which is
50 * done by the backend. 53 * done by the backend.
54 * @see OPimAccessTemplate
51 */ 55 */
52class OContactAccess: public QObject, public OPimAccessTemplate<OContact> 56class OContactAccess: public QObject, public OPimAccessTemplate<OContact>
53{ 57{
54 Q_OBJECT 58 Q_OBJECT
55 59
56 public: 60 public:
57 /** Create Database with contacts (addressbook). 61 /** Create Database with contacts (addressbook).
58 * @param appname Name of application which wants access to the database 62 * @param appname Name of application which wants access to the database
59 * (i.e. "todolist") 63 * (i.e. "todolist")
60 * @param filename The name of the database file. If not set, the default one 64 * @param filename The name of the database file. If not set, the default one
61 * is used. 65 * is used.
62 * @param backend Pointer to an alternative Backend. If not set, we will use 66 * @param backend Pointer to an alternative Backend. If not set, we will use
63 * the default backend. 67 * the default backend.
64 * @param handlesync If <b>true</b> the database stores the current state 68 * @param handlesync If <b>true</b> the database stores the current state
65 * automatically if it receives the signals <i>flush()</i> and <i>reload()</i> 69 * automatically if it receives the signals <i>flush()</i> and <i>reload()</i>
66 * which are used before and after synchronisation. If the application wants 70 * which are used before and after synchronisation. If the application wants
67 * to react itself, it should be disabled by setting it to <b>false</b> 71 * to react itself, it should be disabled by setting it to <b>false</b>
68 * @see OContactAccessBackend 72 * @see OContactAccessBackend
69 */ 73 */
70 OContactAccess (const QString appname, const QString filename = 0l, 74 OContactAccess (const QString appname, const QString filename = 0l,
71 OContactAccessBackend* backend = 0l, bool handlesync = true); 75 OContactAccessBackend* backend = 0l, bool handlesync = true);
72 ~OContactAccess (); 76 ~OContactAccess ();
73 77
74 /** Constants for query. 78 /** Constants for query.
75 * Use this constants to set the query parameters. 79 * Use this constants to set the query parameters.
76 * Note: <i>query_IgnoreCase</i> just make sense with one of the other attributes ! 80 * Note: <i>query_IgnoreCase</i> just make sense with one of the other attributes !
77 * @see queryByExample() 81 * @see queryByExample()
78 */ 82 */
79 enum QuerySettings { 83 enum QuerySettings {
80 WildCards = 0x0001, 84 WildCards = 0x0001,
81 IgnoreCase = 0x0002, 85 IgnoreCase = 0x0002,
82 RegExp = 0x0004, 86 RegExp = 0x0004,
83 ExactMatch = 0x0008, 87 ExactMatch = 0x0008,
88 MatchOne = 0x0010 // Only one Entry must match
84 }; 89 };
85 90
91
92 ORecordList<OContact> matchRegexp( const QRegExp &r )const;
93
86 /** Return all possible settings. 94 /** Return all possible settings.
87 * @return All settings provided by the current backend 95 * @return All settings provided by the current backend
88 * (i.e.: query_WildCards & query_IgnoreCase) 96 * (i.e.: query_WildCards & query_IgnoreCase)
89 */ 97 */
90 const uint querySettings(); 98 const uint querySettings();
91 99
92 /** Check whether settings are correct. 100 /** Check whether settings are correct.
93 * @return <i>true</i> if the given settings are correct and possible. 101 * @return <i>true</i> if the given settings are correct and possible.
94 */ 102 */
95 bool hasQuerySettings ( int querySettings ) const; 103 bool hasQuerySettings ( int querySettings ) const;
96 104
97 /** 105 /**
98 * if the resource was changed externally. 106 * if the resource was changed externally.
99 * You should use the signal instead of polling possible changes ! 107 * You should use the signal instead of polling possible changes !
100 */ 108 */
101 bool wasChangedExternally()const; 109 bool wasChangedExternally()const;
102 110
103 111
104 /** Save contacts database. 112 /** Save contacts database.
105 * Save is more a "commit". After calling this function, all changes are public available. 113 * Save is more a "commit". After calling this function, all changes are public available.
106 * @return true if successful 114 * @return true if successful
107 */ 115 */
108 bool save(); 116 bool save();
109 117
110 signals: 118 signals:
111 /* Signal is emitted if the database was changed. Therefore 119 /* Signal is emitted if the database was changed. Therefore
112 * we may need to reload to stay consistent. 120 * we may need to reload to stay consistent.
113 * @param which Pointer to the database who created this event. This pointer 121 * @param which Pointer to the database who created this event. This pointer
114 * is useful if an application has to handle multiple databases at the same time. 122 * is useful if an application has to handle multiple databases at the same time.
115 * @see reload() 123 * @see reload()
116 */ 124 */
117 void signalChanged ( const OContactAccess *which ); 125 void signalChanged ( const OContactAccess *which );
118 126
119 127
120 private: 128 private:
121 // class OContactAccessPrivate; 129 // class OContactAccessPrivate;
122 // OContactAccessPrivate* d; 130 // OContactAccessPrivate* d;
123 OContactAccessBackend *m_backEnd; 131 OContactAccessBackend *m_backEnd;
124 bool m_loading:1; 132 bool m_loading:1;
125 133
126 private slots: 134 private slots:
127 void copMessage( const QCString &msg, const QByteArray &data ); 135 void copMessage( const QCString &msg, const QByteArray &data );
128 136
129 137
130}; 138};
131#endif 139#endif
diff --git a/libopie2/opiepim/ocontact.h b/libopie2/opiepim/ocontact.h
index 382ab94..038a59f 100644
--- a/libopie2/opiepim/ocontact.h
+++ b/libopie2/opiepim/ocontact.h
@@ -62,101 +62,97 @@ public:
62 // inserts email to list and ensure's doesn't already exist 62 // inserts email to list and ensure's doesn't already exist
63 void insertEmail( const QString &v ); 63 void insertEmail( const QString &v );
64 void removeEmail( const QString &v ); 64 void removeEmail( const QString &v );
65 void clearEmails(); 65 void clearEmails();
66 void insertEmails( const QStringList &v ); 66 void insertEmails( const QStringList &v );
67 67
68 // home 68 // home
69 void setHomeStreet( const QString &v ) { replace( Qtopia::HomeStreet, v ); } 69 void setHomeStreet( const QString &v ) { replace( Qtopia::HomeStreet, v ); }
70 void setHomeCity( const QString &v ) { replace( Qtopia::HomeCity, v ); } 70 void setHomeCity( const QString &v ) { replace( Qtopia::HomeCity, v ); }
71 void setHomeState( const QString &v ) { replace( Qtopia::HomeState, v ); } 71 void setHomeState( const QString &v ) { replace( Qtopia::HomeState, v ); }
72 void setHomeZip( const QString &v ) { replace( Qtopia::HomeZip, v ); } 72 void setHomeZip( const QString &v ) { replace( Qtopia::HomeZip, v ); }
73 void setHomeCountry( const QString &v ) { replace( Qtopia::HomeCountry, v ); } 73 void setHomeCountry( const QString &v ) { replace( Qtopia::HomeCountry, v ); }
74 void setHomePhone( const QString &v ) { replace( Qtopia::HomePhone, v ); } 74 void setHomePhone( const QString &v ) { replace( Qtopia::HomePhone, v ); }
75 void setHomeFax( const QString &v ) { replace( Qtopia::HomeFax, v ); } 75 void setHomeFax( const QString &v ) { replace( Qtopia::HomeFax, v ); }
76 void setHomeMobile( const QString &v ) { replace( Qtopia::HomeMobile, v ); } 76 void setHomeMobile( const QString &v ) { replace( Qtopia::HomeMobile, v ); }
77 void setHomeWebpage( const QString &v ) { replace( Qtopia::HomeWebPage, v ); } 77 void setHomeWebpage( const QString &v ) { replace( Qtopia::HomeWebPage, v ); }
78 78
79 // business 79 // business
80 void setCompany( const QString &v ) { replace( Qtopia::Company, v ); } 80 void setCompany( const QString &v ) { replace( Qtopia::Company, v ); }
81 void setBusinessStreet( const QString &v ) { replace( Qtopia::BusinessStreet, v ); } 81 void setBusinessStreet( const QString &v ) { replace( Qtopia::BusinessStreet, v ); }
82 void setBusinessCity( const QString &v ) { replace( Qtopia::BusinessCity, v ); } 82 void setBusinessCity( const QString &v ) { replace( Qtopia::BusinessCity, v ); }
83 void setBusinessState( const QString &v ) { replace( Qtopia::BusinessState, v ); } 83 void setBusinessState( const QString &v ) { replace( Qtopia::BusinessState, v ); }
84 void setBusinessZip( const QString &v ) { replace( Qtopia::BusinessZip, v ); } 84 void setBusinessZip( const QString &v ) { replace( Qtopia::BusinessZip, v ); }
85 void setBusinessCountry( const QString &v ) { replace( Qtopia::BusinessCountry, v ); } 85 void setBusinessCountry( const QString &v ) { replace( Qtopia::BusinessCountry, v ); }
86 void setBusinessWebpage( const QString &v ) { replace( Qtopia::BusinessWebPage, v ); } 86 void setBusinessWebpage( const QString &v ) { replace( Qtopia::BusinessWebPage, v ); }
87 void setJobTitle( const QString &v ) { replace( Qtopia::JobTitle, v ); } 87 void setJobTitle( const QString &v ) { replace( Qtopia::JobTitle, v ); }
88 void setDepartment( const QString &v ) { replace( Qtopia::Department, v ); } 88 void setDepartment( const QString &v ) { replace( Qtopia::Department, v ); }
89 void setOffice( const QString &v ) { replace( Qtopia::Office, v ); } 89 void setOffice( const QString &v ) { replace( Qtopia::Office, v ); }
90 void setBusinessPhone( const QString &v ) { replace( Qtopia::BusinessPhone, v ); } 90 void setBusinessPhone( const QString &v ) { replace( Qtopia::BusinessPhone, v ); }
91 void setBusinessFax( const QString &v ) { replace( Qtopia::BusinessFax, v ); } 91 void setBusinessFax( const QString &v ) { replace( Qtopia::BusinessFax, v ); }
92 void setBusinessMobile( const QString &v ) { replace( Qtopia::BusinessMobile, v ); } 92 void setBusinessMobile( const QString &v ) { replace( Qtopia::BusinessMobile, v ); }
93 void setBusinessPager( const QString &v ) { replace( Qtopia::BusinessPager, v ); } 93 void setBusinessPager( const QString &v ) { replace( Qtopia::BusinessPager, v ); }
94 void setProfession( const QString &v ) { replace( Qtopia::Profession, v ); } 94 void setProfession( const QString &v ) { replace( Qtopia::Profession, v ); }
95 void setAssistant( const QString &v ) { replace( Qtopia::Assistant, v ); } 95 void setAssistant( const QString &v ) { replace( Qtopia::Assistant, v ); }
96 void setManager( const QString &v ) { replace( Qtopia::Manager, v ); } 96 void setManager( const QString &v ) { replace( Qtopia::Manager, v ); }
97 97
98 // personal 98 // personal
99 void setSpouse( const QString &v ) { replace( Qtopia::Spouse, v ); } 99 void setSpouse( const QString &v ) { replace( Qtopia::Spouse, v ); }
100 void setGender( const QString &v ) { replace( Qtopia::Gender, v ); } 100 void setGender( const QString &v ) { replace( Qtopia::Gender, v ); }
101 void setBirthday( const QDate &v ); 101 void setBirthday( const QDate &v );
102 void setAnniversary( const QDate &v ); 102 void setAnniversary( const QDate &v );
103 void setNickname( const QString &v ) { replace( Qtopia::Nickname, v ); } 103 void setNickname( const QString &v ) { replace( Qtopia::Nickname, v ); }
104 void setChildren( const QString &v ); 104 void setChildren( const QString &v );
105 105
106 // other 106 // other
107 void setNotes( const QString &v ) { replace( Qtopia::Notes, v); } 107 void setNotes( const QString &v ) { replace( Qtopia::Notes, v); }
108 108
109 bool match( const QString &regexp ) const; 109 bool match( const QString &regexp ) const;
110
111// DON'T ATTEMPT TO USE THIS
112#ifdef QTOPIA_INTERNAL_CONTACT_MRE
113 bool match( const QRegExp &regexp ) const; 110 bool match( const QRegExp &regexp ) const;
114#endif
115 111
116// // custom 112// // custom
117// void setCustomField( const QString &key, const QString &v ) 113// void setCustomField( const QString &key, const QString &v )
118// { replace(Custom- + key, v ); } 114// { replace(Custom- + key, v ); }
119 115
120 // name 116 // name
121 QString fullName() const; 117 QString fullName() const;
122 QString title() const { return find( Qtopia::Title ); } 118 QString title() const { return find( Qtopia::Title ); }
123 QString firstName() const { return find( Qtopia::FirstName ); } 119 QString firstName() const { return find( Qtopia::FirstName ); }
124 QString middleName() const { return find( Qtopia::MiddleName ); } 120 QString middleName() const { return find( Qtopia::MiddleName ); }
125 QString lastName() const { return find( Qtopia::LastName ); } 121 QString lastName() const { return find( Qtopia::LastName ); }
126 QString suffix() const { return find( Qtopia::Suffix ); } 122 QString suffix() const { return find( Qtopia::Suffix ); }
127 QString fileAs() const { return find( Qtopia::FileAs ); } 123 QString fileAs() const { return find( Qtopia::FileAs ); }
128 124
129 // email 125 // email
130 QString defaultEmail() const { return find( Qtopia::DefaultEmail ); } 126 QString defaultEmail() const { return find( Qtopia::DefaultEmail ); }
131 QStringList emailList() const; 127 QStringList emailList() const;
132 128
133 // home 129 // home
134 QString homeStreet() const { return find( Qtopia::HomeStreet ); } 130 QString homeStreet() const { return find( Qtopia::HomeStreet ); }
135 QString homeCity() const { return find( Qtopia::HomeCity ); } 131 QString homeCity() const { return find( Qtopia::HomeCity ); }
136 QString homeState() const { return find( Qtopia::HomeState ); } 132 QString homeState() const { return find( Qtopia::HomeState ); }
137 QString homeZip() const { return find( Qtopia::HomeZip ); } 133 QString homeZip() const { return find( Qtopia::HomeZip ); }
138 QString homeCountry() const { return find( Qtopia::HomeCountry ); } 134 QString homeCountry() const { return find( Qtopia::HomeCountry ); }
139 QString homePhone() const { return find( Qtopia::HomePhone ); } 135 QString homePhone() const { return find( Qtopia::HomePhone ); }
140 QString homeFax() const { return find( Qtopia::HomeFax ); } 136 QString homeFax() const { return find( Qtopia::HomeFax ); }
141 QString homeMobile() const { return find( Qtopia::HomeMobile ); } 137 QString homeMobile() const { return find( Qtopia::HomeMobile ); }
142 QString homeWebpage() const { return find( Qtopia::HomeWebPage ); } 138 QString homeWebpage() const { return find( Qtopia::HomeWebPage ); }
143 /** Multi line string containing all non-empty address info in the form 139 /** Multi line string containing all non-empty address info in the form
144 * Street 140 * Street
145 * City, State Zip 141 * City, State Zip
146 * Country 142 * Country
147 */ 143 */
148 QString displayHomeAddress() const; 144 QString displayHomeAddress() const;
149 145
150 // business 146 // business
151 QString company() const { return find( Qtopia::Company ); } 147 QString company() const { return find( Qtopia::Company ); }
152 QString businessStreet() const { return find( Qtopia::BusinessStreet ); } 148 QString businessStreet() const { return find( Qtopia::BusinessStreet ); }
153 QString businessCity() const { return find( Qtopia::BusinessCity ); } 149 QString businessCity() const { return find( Qtopia::BusinessCity ); }
154 QString businessState() const { return find( Qtopia::BusinessState ); } 150 QString businessState() const { return find( Qtopia::BusinessState ); }
155 QString businessZip() const { return find( Qtopia::BusinessZip ); } 151 QString businessZip() const { return find( Qtopia::BusinessZip ); }
156 QString businessCountry() const { return find( Qtopia::BusinessCountry ); } 152 QString businessCountry() const { return find( Qtopia::BusinessCountry ); }
157 QString businessWebpage() const { return find( Qtopia::BusinessWebPage ); } 153 QString businessWebpage() const { return find( Qtopia::BusinessWebPage ); }
158 QString jobTitle() const { return find( Qtopia::JobTitle ); } 154 QString jobTitle() const { return find( Qtopia::JobTitle ); }
159 QString department() const { return find( Qtopia::Department ); } 155 QString department() const { return find( Qtopia::Department ); }
160 QString office() const { return find( Qtopia::Office ); } 156 QString office() const { return find( Qtopia::Office ); }
161 QString businessPhone() const { return find( Qtopia::BusinessPhone ); } 157 QString businessPhone() const { return find( Qtopia::BusinessPhone ); }
162 QString businessFax() const { return find( Qtopia::BusinessFax ); } 158 QString businessFax() const { return find( Qtopia::BusinessFax ); }