summaryrefslogtreecommitdiff
path: root/libopie2
authorzecke <zecke>2002-12-10 17:01:18 (UTC)
committer zecke <zecke>2002-12-10 17:01:18 (UTC)
commit4ecbf7407c19b59fc136c334f9386c53db453930 (patch) (unidiff)
tree1cba438e2533f7109af169b0b77988cec6664192 /libopie2
parent36375df6ff103e52455823f7afd64c4f4ae7fcb8 (diff)
downloadopie-4ecbf7407c19b59fc136c334f9386c53db453930.zip
opie-4ecbf7407c19b59fc136c334f9386c53db453930.tar.gz
opie-4ecbf7407c19b59fc136c334f9386c53db453930.tar.bz2
get in sync with HEAD again
-OPimBase was added to be used as a default struct inside OPimResolver and to work with DSOs -TodoListXML backend now uses mmap and madvise to load data -OContact added/changed rtti -OTodo added changed rtti OPimAccess* added stuff necessary for the Resolver and a 'state'/'hint' on how to load data OPimResolver which resolves uid + services to Records, rtti to QCOPChannels loads arbitary Service backends ( will work with DSOs soon ) -OPimMainWindow added some setDocument scripting possibility and internal marshalling and demarshalling of Records -OPimRecord added loadDataFromm and saveDataTo for marshalling purposes much more :)
Diffstat (limited to 'libopie2') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiepim/backend/opimaccessbackend.h16
-rw-r--r--libopie2/opiepim/backend/otodoaccessxml.cpp43
-rw-r--r--libopie2/opiepim/core/opimaccesstemplate.h25
-rw-r--r--libopie2/opiepim/core/opimcache.h6
-rw-r--r--libopie2/opiepim/core/opimrecord.cpp82
-rw-r--r--libopie2/opiepim/core/opimrecord.h12
-rw-r--r--libopie2/opiepim/core/opimresolver.cpp198
-rw-r--r--libopie2/opiepim/core/opimresolver.h52
-rw-r--r--libopie2/opiepim/core/otemplatebase.h63
-rw-r--r--libopie2/opiepim/core/otodoaccess.cpp32
-rw-r--r--libopie2/opiepim/core/otodoaccess.h13
-rw-r--r--libopie2/opiepim/ocontact.cpp11
-rw-r--r--libopie2/opiepim/otodo.cpp3
-rw-r--r--libopie2/opiepim/ui/opimmainwindow.cpp36
-rw-r--r--libopie2/opiepim/ui/opimmainwindow.h26
15 files changed, 536 insertions, 82 deletions
diff --git a/libopie2/opiepim/backend/opimaccessbackend.h b/libopie2/opiepim/backend/opimaccessbackend.h
index 4f00bc9..e268f4f 100644
--- a/libopie2/opiepim/backend/opimaccessbackend.h
+++ b/libopie2/opiepim/backend/opimaccessbackend.h
@@ -18,9 +18,11 @@
18template <class T = OPimRecord> 18template <class T = OPimRecord>
19class OPimAccessBackend { 19class OPimAccessBackend {
20public: 20public:
21 typedef OTemplateBase<T> Frontend; 21 typedef OTemplateBase<T> Frontend;
22 OPimAccessBackend(); 22
23 /** The access hint from the frontend */
24 OPimAccessBackend(int access = 0);
23 virtual ~OPimAccessBackend(); 25 virtual ~OPimAccessBackend();
24 26
25 /** 27 /**
26 * load the resource 28 * load the resource
@@ -87,8 +89,9 @@ public:
87 * set the read ahead count 89 * set the read ahead count
88 */ 90 */
89 void setReadAhead( uint count ); 91 void setReadAhead( uint count );
90protected: 92protected:
93 int access()const;
91 void cache( const T& t )const; 94 void cache( const T& t )const;
92 95
93 /** 96 /**
94 * use a prime number here! 97 * use a prime number here!
@@ -97,15 +100,20 @@ protected:
97 100
98 uint readAhead()const; 101 uint readAhead()const;
99 102
100private: 103private:
104 class Private;
105 Private* d;
101 Frontend* m_front; 106 Frontend* m_front;
102 uint m_read; 107 uint m_read;
108 int m_acc;
103 109
104}; 110};
105 111
106template <class T> 112template <class T>
107OPimAccessBackend<T>::OPimAccessBackend() { 113OPimAccessBackend<T>::OPimAccessBackend(int acc)
114 : m_acc( acc )
115{
108 m_front = 0l; 116 m_front = 0l;
109} 117}
110template <class T> 118template <class T>
111OPimAccessBackend<T>::~OPimAccessBackend() { 119OPimAccessBackend<T>::~OPimAccessBackend() {
@@ -137,5 +145,9 @@ void OPimAccessBackend<T>::setReadAhead( uint count ) {
137template <class T> 145template <class T>
138uint OPimAccessBackend<T>::readAhead()const { 146uint OPimAccessBackend<T>::readAhead()const {
139 return m_read; 147 return m_read;
140} 148}
149template <class T>
150int OPimAccessBackend<T>::access()const {
151 return m_acc;
152}
141#endif 153#endif
diff --git a/libopie2/opiepim/backend/otodoaccessxml.cpp b/libopie2/opiepim/backend/otodoaccessxml.cpp
index b2dfe80..21f93a0 100644
--- a/libopie2/opiepim/backend/otodoaccessxml.cpp
+++ b/libopie2/opiepim/backend/otodoaccessxml.cpp
@@ -1,4 +1,14 @@
1#include <errno.h>
2#include <fcntl.h>
3
4#include <sys/mman.h>
5#include <sys/stat.h>
6#include <sys/types.h>
7
8#include <unistd.h>
9
10
1#include <qfile.h> 11#include <qfile.h>
2#include <qvector.h> 12#include <qvector.h>
3 13
4#include <qpe/global.h> 14#include <qpe/global.h>
@@ -51,22 +61,38 @@ bool OTodoAccessXML::load() {
51 dict.insert("Maintainer", new int(OTodo::Maintainer) ); 61 dict.insert("Maintainer", new int(OTodo::Maintainer) );
52 62
53 // here the custom XML parser from TT it's GPL 63 // here the custom XML parser from TT it's GPL
54 // but we want to push OpiePIM... to TT..... 64 // but we want to push OpiePIM... to TT.....
55 QFile f(m_file ); 65 // mmap part from zecke :)
56 if (!f.open(IO_ReadOnly) ) 66 int fd = ::open( QFile::encodeName(m_file).data(), O_RDONLY );
67 struct stat attribut;
68 if ( fd < 0 ) return false;
69
70 if ( fstat(fd, &attribut ) == -1 ) {
71 ::close( fd );
57 return false; 72 return false;
73 }
74 void* map_addr = ::mmap(NULL, attribut.st_size, PROT_READ, MAP_SHARED, fd, 0 );
75 if ( map_addr == ( (caddr_t)-1) ) {
76 ::close(fd );
77 return false;
78 }
79 /* advise the kernel who we want to read it */
80 ::madvise( map_addr, attribut.st_size, MADV_SEQUENTIAL );
81 /* we do not the file any more */
82 ::close( fd );
58 83
59 QByteArray ba = f.readAll(); 84 char* dt = (char*)map_addr;
60 f.close(); 85 int len = attribut.st_size;
61 char* dt = ba.data();
62 int len = ba.size();
63 int i = 0; 86 int i = 0;
64 char *point; 87 char *point;
65 const char* collectionString = "<Task "; 88 const char* collectionString = "<Task ";
89 int strLen = strlen(collectionString);
66 while ( dt+i != 0 && ( point = strstr( dt+i, collectionString ) ) != 0l ) { 90 while ( dt+i != 0 && ( point = strstr( dt+i, collectionString ) ) != 0l ) {
67 i = point -dt; 91 i = point -dt;
68 i+= strlen(collectionString); 92 i+= strLen;
93 qWarning("Found a start at %d %d", i, (point-dt) );
94
69 OTodo ev; 95 OTodo ev;
70 m_year = m_month = m_day = 0; 96 m_year = m_month = m_day = 0;
71 97
72 while ( TRUE ) { 98 while ( TRUE ) {
@@ -119,8 +145,9 @@ bool OTodoAccessXML::load() {
119 } 145 }
120 /* 146 /*
121 * now add it 147 * now add it
122 */ 148 */
149 qWarning("End at %d", i );
123 if (m_events.contains( ev.uid() ) || ev.uid() == 0) { 150 if (m_events.contains( ev.uid() ) || ev.uid() == 0) {
124 ev.setUid( 1 ); 151 ev.setUid( 1 );
125 m_changed = true; 152 m_changed = true;
126 } 153 }
@@ -130,8 +157,10 @@ bool OTodoAccessXML::load() {
130 m_events.insert(ev.uid(), ev ); 157 m_events.insert(ev.uid(), ev );
131 m_year = m_month = m_day = -1; 158 m_year = m_month = m_day = -1;
132 } 159 }
133 160
161 munmap(map_addr, attribut.st_size );
162
134 qWarning("counts %d records loaded!", m_events.count() ); 163 qWarning("counts %d records loaded!", m_events.count() );
135 return true; 164 return true;
136} 165}
137bool OTodoAccessXML::reload() { 166bool OTodoAccessXML::reload() {
diff --git a/libopie2/opiepim/core/opimaccesstemplate.h b/libopie2/opiepim/core/opimaccesstemplate.h
index 8cf81c8..259e2c1 100644
--- a/libopie2/opiepim/core/opimaccesstemplate.h
+++ b/libopie2/opiepim/core/opimaccesstemplate.h
@@ -21,22 +21,28 @@
21 21
22template <class T = OPimRecord > 22template <class T = OPimRecord >
23class OPimAccessTemplate : public OTemplateBase<T> { 23class OPimAccessTemplate : public OTemplateBase<T> {
24public: 24public:
25 enum Access {
26 Random = 0,
27 SortedAccess
28 };
25 typedef ORecordList<T> List; 29 typedef ORecordList<T> List;
26 typedef OPimAccessBackend<T> BackEnd; 30 typedef OPimAccessBackend<T> BackEnd;
27 typedef OPimCache<T> Cache; 31 typedef OPimCache<T> Cache;
28 32
29 /** 33 /**
30 * c'tor BackEnd 34 * c'tor BackEnd
35 * enum Access a small hint on how to handle the backend
31 */ 36 */
32 OPimAccessTemplate( BackEnd* end); 37 OPimAccessTemplate( BackEnd* end);
38
33 virtual ~OPimAccessTemplate(); 39 virtual ~OPimAccessTemplate();
34 40
35 /** 41 /**
36 * load from the backend 42 * load from the backend
37 */ 43 */
38 virtual bool load(); 44 bool load();
39 45
40 /** Reload database. 46 /** Reload database.
41 * You should execute this function if the external database 47 * You should execute this function if the external database
42 * was changed. 48 * was changed.
@@ -48,9 +54,9 @@ public:
48 /** Save contacts database. 54 /** Save contacts database.
49 * Save is more a "commit". After calling this function, all changes are public available. 55 * Save is more a "commit". After calling this function, all changes are public available.
50 * @return true if successful 56 * @return true if successful
51 */ 57 */
52 virtual bool save(); 58 bool save();
53 59
54 /** 60 /**
55 * if the resource was changed externally 61 * if the resource was changed externally
56 * You should use the signal handling instead of polling possible changes ! 62 * You should use the signal handling instead of polling possible changes !
@@ -84,9 +90,9 @@ public:
84 /* invalidate cache here */ 90 /* invalidate cache here */
85 /** 91 /**
86 * clears the backend and invalidates the backend 92 * clears the backend and invalidates the backend
87 */ 93 */
88 virtual void clear() ; 94 void clear() ;
89 95
90 /** 96 /**
91 * add T to the backend 97 * add T to the backend
92 * @param t The item to add. 98 * @param t The item to add.
@@ -107,9 +113,10 @@ public:
107 * remove the OPimRecord with uid 113 * remove the OPimRecord with uid
108 * @param uid The ID of the item to remove 114 * @param uid The ID of the item to remove
109 * @return <i>true</i> if successful. 115 * @return <i>true</i> if successful.
110 */ 116 */
111 virtual bool remove( int uid ); 117 bool remove( int uid );
118 bool remove( const OPimRecord& );
112 119
113 /** 120 /**
114 * replace T from backend 121 * replace T from backend
115 * @param t The item to replace 122 * @param t The item to replace
@@ -122,8 +129,10 @@ public:
122 * @internal 129 * @internal
123 */ 130 */
124 void cache( const T& )const; 131 void cache( const T& )const;
125 void setSaneCacheSize( int ); 132 void setSaneCacheSize( int );
133
134 QArray<int> records()const;
126protected: 135protected:
127 /** 136 /**
128 * invalidate the cache 137 * invalidate the cache
129 */ 138 */
@@ -171,8 +180,12 @@ typename OPimAccessTemplate<T>::List OPimAccessTemplate<T>::allRecords()const {
171 List lis(ints, this ); 180 List lis(ints, this );
172 return lis; 181 return lis;
173} 182}
174template <class T> 183template <class T>
184QArray<int> OPimAccessTemplate<T>::records()const {
185 return m_backEnd->allRecords();
186}
187template <class T>
175typename OPimAccessTemplate<T>::List 188typename OPimAccessTemplate<T>::List
176OPimAccessTemplate<T>::queryByExample( const T& t, int sortOrder ) { 189OPimAccessTemplate<T>::queryByExample( const T& t, int sortOrder ) {
177 QArray<int> ints = m_backEnd->queryByExample( t, sortOrder ); 190 QArray<int> ints = m_backEnd->queryByExample( t, sortOrder );
178 191
@@ -230,8 +243,12 @@ bool OPimAccessTemplate<T>::remove( int uid ) {
230 m_cache.remove( uid ); 243 m_cache.remove( uid );
231 return m_backEnd->remove( uid ); 244 return m_backEnd->remove( uid );
232} 245}
233template <class T> 246template <class T>
247bool OPimAccessTemplate<T>::remove( const OPimRecord& rec) {
248 return remove( rec.uid() );
249}
250template <class T>
234bool OPimAccessTemplate<T>::replace( const T& t ) { 251bool OPimAccessTemplate<T>::replace( const T& t ) {
235 m_cache.replace( t ); 252 m_cache.replace( t );
236 return m_backEnd->replace( t ); 253 return m_backEnd->replace( t );
237} 254}
diff --git a/libopie2/opiepim/core/opimcache.h b/libopie2/opiepim/core/opimcache.h
index 839550c..73414e5 100644
--- a/libopie2/opiepim/core/opimcache.h
+++ b/libopie2/opiepim/core/opimcache.h
@@ -8,10 +8,13 @@
8template <class T = OPimRecord> 8template <class T = OPimRecord>
9class OPimCacheItem { 9class OPimCacheItem {
10public: 10public:
11 OPimCacheItem( const T& t = T() ); 11 OPimCacheItem( const T& t = T() );
12 OPimCacheItem( const OPimCacheItem& );
12 ~OPimCacheItem(); 13 ~OPimCacheItem();
13 14
15 OPimCacheItem &operator=( const OPimCacheItem& );
16
14 T record()const; 17 T record()const;
15 void setRecord( const T& ); 18 void setRecord( const T& );
16private: 19private:
17 T m_t; 20 T m_t;
@@ -26,10 +29,13 @@ template <class T = OPimRecord>
26class OPimCache { 29class OPimCache {
27public: 30public:
28 typedef OPimCacheItem<T> Item; 31 typedef OPimCacheItem<T> Item;
29 OPimCache(); 32 OPimCache();
33 OPimCache( const OPimCache& );
30 ~OPimCache(); 34 ~OPimCache();
31 35
36 OPimCache &operator=( const OPimCache& );
37
32 bool contains(int uid)const; 38 bool contains(int uid)const;
33 void invalidate(); 39 void invalidate();
34 void setSize( int size ); 40 void setSize( int size );
35 41
diff --git a/libopie2/opiepim/core/opimrecord.cpp b/libopie2/opiepim/core/opimrecord.cpp
index 49b5bf9..ac0f4a9 100644
--- a/libopie2/opiepim/core/opimrecord.cpp
+++ b/libopie2/opiepim/core/opimrecord.cpp
@@ -1,4 +1,6 @@
1#include <qarray.h>
2
1#include <qpe/categories.h> 3#include <qpe/categories.h>
2#include <qpe/categoryselect.h> 4#include <qpe/categoryselect.h>
3 5
4#include "opimrecord.h" 6#include "opimrecord.h"
@@ -81,4 +83,84 @@ OPimXRefManager &OPimRecord::xrefmanager() {
81} 83}
82int OPimRecord::rtti(){ 84int OPimRecord::rtti(){
83 return 0; 85 return 0;
84} 86}
87
88/**
89 * now let's put our data into the stream
90 */
91/*
92 * First read UID
93 * Categories
94 * XRef
95 */
96bool OPimRecord::loadFromStream( QDataStream& stream ) {
97 int Int;
98 uint UInt;
99 stream >> Int;
100 setUid(Int);
101
102 /** Categories */
103 stream >> UInt;
104 QArray<int> array(UInt);
105 for (uint i = 0; i < UInt; i++ ) {
106 stream >> array[i];
107 }
108 setCategories( array );
109
110 /*
111 * now we do the X-Ref stuff
112 */
113 OPimXRef xref;
114 stream >> UInt;
115 for ( uint i = 0; i < UInt; i++ ) {
116 xref.setPartner( OPimXRef::One, partner( stream ) );
117 xref.setPartner( OPimXRef::Two, partner( stream ) );
118 m_xrefman.add( xref );
119 }
120
121 return true;
122}
123bool OPimRecord::saveToStream( QDataStream& stream )const {
124 /** UIDs */
125
126 stream << uid();
127
128 /** Categories */
129 stream << categories().count();
130 for ( uint i = 0; i < categories().count(); i++ ) {
131 stream << categories()[i];
132 }
133
134 /*
135 * first the XRef count
136 * then the xrefs
137 */
138 stream << m_xrefman.list().count();
139 for ( OPimXRef::ValueList::ConstIterator it = m_xrefman.list().begin();
140 it != m_xrefman.list().end(); ++it ) {
141 flush( (*it).partner( OPimXRef::One), stream );
142 flush( (*it).partner( OPimXRef::Two), stream );
143 }
144 return true;
145}
146void OPimRecord::flush( const OPimXRefPartner& par, QDataStream& str ) const{
147 str << par.service();
148 str << par.uid();
149 str << par.field();
150}
151OPimXRefPartner OPimRecord::partner( QDataStream& stream ) {
152 OPimXRefPartner par;
153 QString str;
154 int i;
155
156 stream >> str;
157 par.setService( str );
158
159 stream >> i;
160 par.setUid( i );
161
162 stream >> i ;
163 par.setField( i );
164
165 return par;
166}
diff --git a/libopie2/opiepim/core/opimrecord.h b/libopie2/opiepim/core/opimrecord.h
index ec99a13..665530f 100644
--- a/libopie2/opiepim/core/opimrecord.h
+++ b/libopie2/opiepim/core/opimrecord.h
@@ -1,7 +1,8 @@
1#ifndef OPIE_PIM_RECORD_H 1#ifndef OPIE_PIM_RECORD_H
2#define OPIE_PIM_RECORD_H 2#define OPIE_PIM_RECORD_H
3 3
4#include <qdatastream.h>
4#include <qmap.h> 5#include <qmap.h>
5#include <qstring.h> 6#include <qstring.h>
6#include <qstringlist.h> 7#include <qstringlist.h>
7 8
@@ -104,8 +105,16 @@ public:
104 * REIMPLEMENT in your .... 105 * REIMPLEMENT in your ....
105 */ 106 */
106 static int rtti(); 107 static int rtti();
107 108
109 /**
110 * some marshalling and de marshalling code
111 * saves the OPimRecord
112 * to and from a DataStream
113 */
114 virtual bool loadFromStream(QDataStream& );
115 virtual bool saveToStream( QDataStream& stream )const;
116
108protected: 117protected:
109 Qtopia::UidGen &uidGen(); 118 Qtopia::UidGen &uidGen();
110// QString crossToString()const; 119// QString crossToString()const;
111 120
@@ -114,8 +123,11 @@ private:
114 OPimRecordPrivate *d; 123 OPimRecordPrivate *d;
115 OPimXRefManager m_xrefman; 124 OPimXRefManager m_xrefman;
116 static Qtopia::UidGen m_uidGen; 125 static Qtopia::UidGen m_uidGen;
117 126
127private:
128 void flush( const OPimXRefPartner&, QDataStream& stream )const;
129 OPimXRefPartner partner( QDataStream& );
118}; 130};
119 131
120 132
121 133
diff --git a/libopie2/opiepim/core/opimresolver.cpp b/libopie2/opiepim/core/opimresolver.cpp
new file mode 100644
index 0000000..4ebbd6e
--- a/dev/null
+++ b/libopie2/opiepim/core/opimresolver.cpp
@@ -0,0 +1,198 @@
1#include <qcopchannel_qws.h>
2
3#include <qpe/qcopenvelope_qws.h>
4
5#include "otodoaccess.h"
6#include "ocontactaccess.h"
7
8//#include "opimfactory.h"
9#include "opimresolver.h"
10
11OPimResolver* OPimResolver::m_self = 0l;
12
13OPimResolver::OPimResolver() {
14 /* the built in channels */
15 m_builtIns << "Todolist" << "Addressbook" << "Datebook";
16}
17OPimResolver* OPimResolver::self() {
18 if (!m_self)
19 m_self = new OPimResolver();
20
21 return m_self;
22}
23
24/*
25 * FIXME use a cache here too
26 */
27OPimRecord* OPimResolver::record( const QString& service, int uid ) {
28 OPimRecord* rec = 0l;
29 OPimBase* base = backend( service );
30
31 if ( base )
32 rec = base->record( uid );
33 delete base;
34
35 return rec;
36}
37OPimRecord* OPimResolver::record( const QString& service ) {
38 return record( serviceId( service ) );
39}
40OPimRecord* OPimResolver::record( int rtti ) {
41 OPimRecord* rec = 0l;
42 switch( rtti ) {
43 case 1: /* todolist */
44 rec = new OTodo();
45 case 2: /* contact */
46 rec = new OContact();
47 default:
48 break;
49 }
50 /*
51 * FIXME resolve externally
52 */
53 if (!rec ) {
54 ;
55 }
56 return 0l;
57}
58bool OPimResolver::isBuiltIn( const QString& str) const{
59 return m_builtIns.contains( str );
60}
61QCString OPimResolver::qcopChannel( enum BuiltIn& built)const {
62 QCString str("QPE/");
63 switch( built ) {
64 case TodoList:
65 str += "Todolist";
66 break;
67 case DateBook:
68 str += "Datebook";
69 break;
70 case AddressBook:
71 str += "Addressbook";
72 break;
73 default:
74 break;
75 }
76
77 return str;
78}
79QCString OPimResolver::qcopChannel( const QString& service )const {
80 QCString str("QPE/");
81 str += service.latin1();
82 return str;
83}
84/*
85 * Implement services!!
86 * FIXME
87 */
88QCString OPimResolver::applicationChannel( enum BuiltIn& built)const {
89 QCString str("QPE/Application/");
90 switch( built ) {
91 case TodoList:
92 str += "todolist";
93 break;
94 case DateBook:
95 str += "datebook";
96 break;
97 case AddressBook:
98 str += "addressbook";
99 break;
100 }
101
102 return str;
103}
104QCString OPimResolver::applicationChannel( const QString& service )const {
105 QCString str("QPE/Application/");
106
107 if ( isBuiltIn( service ) ) {
108 if ( service == "Todolist" )
109 str += "todolist";
110 else if ( service == "Datebook" )
111 str += "datebook";
112 else if ( service == "Addressbook" )
113 str += "addressbook";
114 }else
115 ; // FIXME for additional stuff
116
117 return str;
118}
119QStringList OPimResolver::services()const {
120 return m_builtIns;
121}
122QString OPimResolver::serviceName( int rtti ) const{
123 QString str;
124 switch ( rtti ) {
125 case TodoList:
126 str = "Todolist";
127 break;
128 case DateBook:
129 str = "Datebook";
130 break;
131 case AddressBook:
132 str = "Addressbook";
133 break;
134 default:
135 break;
136 }
137 return str;
138 // FIXME me for 3rd party
139}
140int OPimResolver::serviceId( const QString& service ) {
141 int rtti = 0;
142 if ( service == "Todolist" )
143 rtti = TodoList;
144 else if ( service == "Datebook" )
145 rtti = DateBook;
146 else if ( service == "Addressbook" )
147 rtti = AddressBook;
148
149 return rtti;
150}
151/**
152 * check if the 'service' is registered and if so we'll
153 */
154bool OPimResolver::add( const QString& service, const OPimRecord& rec) {
155 if ( QCopChannel::isRegistered( applicationChannel( service ) ) ) {
156 QByteArray data;
157 QDataStream arg(data, IO_WriteOnly );
158 if ( rec.saveToStream( arg ) ) {
159 QCopEnvelope env( applicationChannel( service ), "add(int,QByteArray)" );
160 env << rec.rtti();
161 env << data;
162 }else
163 return false;
164 }else{
165 OPimBase* base = backend( service );
166 if (!base ) return false;
167
168 base->load();
169 base->add( rec );
170 base->save();
171 delete base;
172 }
173
174 return true;
175}
176OPimBase* OPimResolver::backend( const QString& service ) {
177 return backend( serviceId( service ) );
178}
179OPimBase* OPimResolver::backend( int rtti ) {
180 OPimBase* base = 0l;
181 switch( rtti ) {
182 case TodoList:
183 base = new OTodoAccess();
184 break;
185 case DateBook:
186 break;
187 case AddressBook:
188 base = new OContactAccess("Resolver");
189 break;
190 default:
191 break;
192 }
193 // FIXME for 3rd party
194 if (!base )
195 ;
196
197 return base;
198}
diff --git a/libopie2/opiepim/core/opimresolver.h b/libopie2/opiepim/core/opimresolver.h
index 86ae3eb..1ce1619 100644
--- a/libopie2/opiepim/core/opimresolver.h
+++ b/libopie2/opiepim/core/opimresolver.h
@@ -3,8 +3,10 @@
3 3
4#include <qstring.h> 4#include <qstring.h>
5#include <qvaluelist.h> 5#include <qvaluelist.h>
6 6
7#include <opie/otemplatebase.h>
8
7/** 9/**
8 * OPimResolver is a MetaClass to access 10 * OPimResolver is a MetaClass to access
9 * available backends read only. 11 * available backends read only.
10 * It will be used to resolve uids + app names 12 * It will be used to resolve uids + app names
@@ -14,43 +16,75 @@
14 * and to more stuff 16 * and to more stuff
15 * THE PERFORMANCE will depend on THE BACKEND 17 * THE PERFORMANCE will depend on THE BACKEND
16 * USING XML is a waste of memory!!!!! 18 * USING XML is a waste of memory!!!!!
17 */ 19 */
18class OPimResolver : public QObject { 20class OPimResolver {
19public: 21public:
20 enum BuiltIn { TodoList = 0, 22 enum BuiltIn { TodoList = 0,
21 DateBook, 23 DateBook,
22 AddressBook 24 AddressBook
23 }; 25 };
24 static OPimResolver* self(); 26 static OPimResolver* self();
25 27
26 28
27 /* 29 /**
28 * return a record for a uid 30 * return a record for a uid
29 * and an app 31 * and an service
32 * You've THE OWNERSHIP NOW!
30 */ 33 */
31 OPimRecord &record( const QString& service, int uid ); 34 OPimRecord *record( const QString& service, int uid );
32 35
33 /** 36 /**
34 * return the QCopChannel for service 37 * return the QCopChannel for service
35 * When we will use Qtopia Services it will be used here 38 * When we will use Qtopia Services it will be used here
36 */ 39 */
37 QString qcopChannel( enum BuiltIn& )const; 40 QCString qcopChannel( enum BuiltIn& )const;
38 QString qcopChannel( const QString& service ); 41 QCString qcopChannel( const QString& service )const;
42
43 /**
44 * The Application channel (QPE/Application/name)
45 */
46 QCString applicationChannel( enum BuiltIn& )const;
47 QCString applicationChannel( const QString& service )const;
39 48
40 /** 49 /**
41 * return a list of available services 50 * return a list of available services
42 */ 51 */
43 QStringList services()const; 52 QStringList services()const;
44 53 inline QString serviceName(int rrti )const;
54 int serviceId( const QString& Service);
45 /** 55 /**
46 * add a record to a service... ;) 56 * add a record to a service... ;)
47 */ 57 */
48 bool add( const QString& service, const OPimRecord& ); 58 bool add( const QString& service, const OPimRecord& );
49 59
60
61 /**
62 * record returns an empty record for a given service.
63 * Be sure to delete it!!!
64 *
65 */
66 OPimRecord* record( const QString& service );
67 OPimRecord* record( int rtti );
68
69 /**
70 * you can cast to your
71 */
72 OPimBase* backend( const QString& service );
73 OPimBase* backend( int rtti );
50private: 74private:
51 OPimResolver(); 75 OPimResolver();
52 OPimRecord *m_last; 76 void loadData();
77 inline bool isBuiltIn( const QString& )const;
78 OPimRecord* recordExtern( const QString&, int );
79 OPimRecord* recordExtern( const QString& );
80
81 static OPimResolver* m_self;
82 struct Data;
83 class Private;
53 84
54}: 85 Data* data;
86 Private* d;
87 QStringList m_builtIns;
88};
55 89
56#endif 90#endif
diff --git a/libopie2/opiepim/core/otemplatebase.h b/libopie2/opiepim/core/otemplatebase.h
index b855919..29fb6ec 100644
--- a/libopie2/opiepim/core/otemplatebase.h
+++ b/libopie2/opiepim/core/otemplatebase.h
@@ -2,15 +2,45 @@
2#define OPIE_TEMPLATE_BASE_H 2#define OPIE_TEMPLATE_BASE_H
3 3
4#include <qarray.h> 4#include <qarray.h>
5 5
6#include "opimrecord.h" 6#include <opie/opimrecord.h>
7
7 8
8/** 9/**
10 * Templates do not have a base class, This is why
11 * we've this class
12 * this is here to give us the possibility
13 * to have a common base class
14 * You may not want to use that interface internaly
15 * POOR mans interface
16 */
17struct OPimBase {
18 /**
19 * return the rtti
20 */
21 virtual int rtti()= 0;
22 virtual OPimRecord* record()const = 0;
23 virtual OPimRecord* record(int uid)const = 0;
24 virtual bool add( const OPimRecord& ) = 0;
25 virtual bool remove( int uid ) = 0;
26 virtual bool remove( const OPimRecord& ) = 0;
27 virtual void clear() = 0;
28 virtual bool load() = 0;
29 virtual bool save() = 0;
30 virtual QArray<int> records()const = 0;
31 /*
32 * ADD editing here?
33 * -zecke
34 */
35
36};
37/**
9 * internal template base 38 * internal template base
39 * T needs to implement the copy c'tor!!!
10 */ 40 */
11template <class T = OPimRecord> 41template <class T = OPimRecord>
12class OTemplateBase { 42class OTemplateBase : public OPimBase {
13public: 43public:
14 enum CacheDirection { Forward=0, Reverse }; 44 enum CacheDirection { Forward=0, Reverse };
15 OTemplateBase() { 45 OTemplateBase() {
16 }; 46 };
@@ -25,8 +55,37 @@ public:
25 uint current, CacheDirection dir = Forward )const = 0; 55 uint current, CacheDirection dir = Forward )const = 0;
26 virtual void cache( const T& )const = 0; 56 virtual void cache( const T& )const = 0;
27 virtual void setSaneCacheSize( int ) = 0; 57 virtual void setSaneCacheSize( int ) = 0;
28 58
59 /* reimplement of OPimBase */
60 int rtti();
61 OPimRecord* record()const;
62 OPimRecord* record(int uid )const;
63 static T* rec();
29}; 64};
30 65
66/*
67 * implementation
68 */
69template <class T>
70int
71OTemplateBase<T>::rtti() {
72 return T::rtti();
73}
74template <class T>
75OPimRecord* OTemplateBase<T>::record()const {
76 T* t = new T;
77 return t;
78}
79template <class T>
80OPimRecord* OTemplateBase<T>::record(int uid )const {
81 T t2 = find(uid );
82 T* t1 = new T(t2);
83
84 return t1;
85};
86template <class T>
87T* OTemplateBase<T>::rec() {
88 return new T;
89}
31 90
32#endif 91#endif
diff --git a/libopie2/opiepim/core/otodoaccess.cpp b/libopie2/opiepim/core/otodoaccess.cpp
index d860411..5e89a1b 100644
--- a/libopie2/opiepim/core/otodoaccess.cpp
+++ b/libopie2/opiepim/core/otodoaccess.cpp
@@ -5,9 +5,9 @@
5// #include "otodoaccesssql.h" 5// #include "otodoaccesssql.h"
6#include "otodoaccess.h" 6#include "otodoaccess.h"
7#include "obackendfactory.h" 7#include "obackendfactory.h"
8 8
9OTodoAccess::OTodoAccess( OTodoAccessBackend* end ) 9OTodoAccess::OTodoAccess( OTodoAccessBackend* end, enum Access )
10 : QObject(), OPimAccessTemplate<OTodo>( end ), m_todoBackEnd( end ) 10 : QObject(), OPimAccessTemplate<OTodo>( end ), m_todoBackEnd( end )
11{ 11{
12// if (end == 0l ) 12// if (end == 0l )
13// m_todoBackEnd = new OTodoAccessBackendSQL( QString::null); 13// m_todoBackEnd = new OTodoAccessBackendSQL( QString::null);
@@ -43,38 +43,8 @@ OTodoAccess::List OTodoAccess::effectiveToDos( const QDate& start,
43OTodoAccess::List OTodoAccess::overDue() { 43OTodoAccess::List OTodoAccess::overDue() {
44 List lis( m_todoBackEnd->overDue(), this ); 44 List lis( m_todoBackEnd->overDue(), this );
45 return lis; 45 return lis;
46} 46}
47void OTodoAccess::addAlarm( const OTodo& event) {
48/* FIXME use the new notifier architecture
49 if (!event.hasAlarmDateTime() )
50 return;
51
52 QDateTime now = QDateTime::currentDateTime();
53 QDateTime schedule = event.alarmDateTime();
54
55 if ( schedule > now ){
56 AlarmServer::addAlarm( schedule,
57 "QPE/Application/todolist",
58 "alarm(QDateTime,int)", event.uid() );
59
60 }
61*/
62}
63void OTodoAccess::delAlarm( int uid) {
64
65 QDateTime schedule; // Create null DateTime
66
67 // I hope this will remove all scheduled alarms
68 // with the given uid !?
69 // If not: I have to rethink how to remove already
70 // scheduled events... (se)
71 // it should be fine -zecke
72// qWarning("Removing alarm for event with uid %d", uid );
73 AlarmServer::deleteAlarm( schedule ,
74 "QPE/Application/todolist",
75 "alarm(QDateTime,int)", uid );
76}
77/* sort order */ 47/* sort order */
78OTodoAccess::List OTodoAccess::sorted( bool ascending, int sort,int filter, int cat ) { 48OTodoAccess::List OTodoAccess::sorted( bool ascending, int sort,int filter, int cat ) {
79 QArray<int> ints = m_todoBackEnd->sorted( ascending, sort, 49 QArray<int> ints = m_todoBackEnd->sorted( ascending, sort,
80 filter, cat ); 50 filter, cat );
diff --git a/libopie2/opiepim/core/otodoaccess.h b/libopie2/opiepim/core/otodoaccess.h
index c079155..2bb87dc 100644
--- a/libopie2/opiepim/core/otodoaccess.h
+++ b/libopie2/opiepim/core/otodoaccess.h
@@ -28,9 +28,9 @@ public:
28 * if you use 0l 28 * if you use 0l
29 * the default resource will be 29 * the default resource will be
30 * picked up 30 * picked up
31 */ 31 */
32 OTodoAccess( OTodoAccessBackend* = 0l); 32 OTodoAccess( OTodoAccessBackend* = 0l, enum Access acc = Random );
33 ~OTodoAccess(); 33 ~OTodoAccess();
34 34
35 35
36 /* our functions here */ 36 /* our functions here */
@@ -77,19 +77,8 @@ signals:
77 * if the OTodoAccess was changed 77 * if the OTodoAccess was changed
78 */ 78 */
79 void signalChanged( const OTodoAccess* ); 79 void signalChanged( const OTodoAccess* );
80private: 80private:
81 /**
82 * add an Alarm to the AlarmServer
83 */
84 void addAlarm( const OTodo& );
85
86 /**
87 * delete an alarm with the uid from
88 * the alarm server
89 */
90 void delAlarm( int uid );
91
92 int m_cat; 81 int m_cat;
93 OTodoAccessBackend* m_todoBackEnd; 82 OTodoAccessBackend* m_todoBackEnd;
94 class OTodoAccessPrivate; 83 class OTodoAccessPrivate;
95 OTodoAccessPrivate* d; 84 OTodoAccessPrivate* d;
diff --git a/libopie2/opiepim/ocontact.cpp b/libopie2/opiepim/ocontact.cpp
index 6aec62e..38cba72 100644
--- a/libopie2/opiepim/ocontact.cpp
+++ b/libopie2/opiepim/ocontact.cpp
@@ -21,8 +21,9 @@
21 21
22#define QTOPIA_INTERNAL_CONTACT_MRE 22#define QTOPIA_INTERNAL_CONTACT_MRE
23 23
24#include "ocontact.h" 24#include "ocontact.h"
25#include "opimresolver.h"
25 26
26#include <qpe/stringutil.h> 27#include <qpe/stringutil.h>
27#include <qpe/timeconversion.h> 28#include <qpe/timeconversion.h>
28#include <qpe/timestring.h> 29#include <qpe/timestring.h>
@@ -828,9 +829,9 @@ void OContact::save( QString &buf ) const
828/*! 829/*!
829 \internal 830 \internal
830 Returns the list of fields belonging to a contact 831 Returns the list of fields belonging to a contact
831 Never change order of this list ! It has to be regarding 832 Never change order of this list ! It has to be regarding
832 enum AddressBookFields !! 833 enum AddressBookFields !!
833*/ 834*/
834QStringList OContact::fields() 835QStringList OContact::fields()
835{ 836{
836 QStringList list; 837 QStringList list;
@@ -1099,11 +1100,11 @@ void OContact::insertEmails( const QStringList &v )
1099 for ( QStringList::ConstIterator it = v.begin(); it != v.end(); ++it ) 1100 for ( QStringList::ConstIterator it = v.begin(); it != v.end(); ++it )
1100 insertEmail( *it ); 1101 insertEmail( *it );
1101} 1102}
1102int OContact::rtti() { 1103int OContact::rtti() {
1103 return 2; 1104 return OPimResolver::AddressBook;
1104} 1105}
1105void OContact::setUid( int i ) 1106void OContact::setUid( int i )
1106{ 1107{
1107 OPimRecord::setUid(i); 1108 OPimRecord::setUid(i);
1108 replace( Qtopia::AddressUid , QString::number(i)); 1109 replace( Qtopia::AddressUid , QString::number(i));
1109} 1110}
diff --git a/libopie2/opiepim/otodo.cpp b/libopie2/opiepim/otodo.cpp
index ece624a..cde2b3d 100644
--- a/libopie2/opiepim/otodo.cpp
+++ b/libopie2/opiepim/otodo.cpp
@@ -15,8 +15,9 @@
15#include "opimstate.h" 15#include "opimstate.h"
16#include "orecur.h" 16#include "orecur.h"
17#include "opimmaintainer.h" 17#include "opimmaintainer.h"
18#include "opimnotifymanager.h" 18#include "opimnotifymanager.h"
19#include "opimresolver.h"
19 20
20#include "otodo.h" 21#include "otodo.h"
21 22
22 23
@@ -416,6 +417,6 @@ QString OTodo::recordField(int /*id*/ )const {
416 return QString::null; 417 return QString::null;
417} 418}
418 419
419int OTodo::rtti(){ 420int OTodo::rtti(){
420 return 1; 421 return OPimResolver::TodoList;
421} 422}
diff --git a/libopie2/opiepim/ui/opimmainwindow.cpp b/libopie2/opiepim/ui/opimmainwindow.cpp
index 92be2fd..7e57f3a 100644
--- a/libopie2/opiepim/ui/opimmainwindow.cpp
+++ b/libopie2/opiepim/ui/opimmainwindow.cpp
@@ -2,13 +2,14 @@
2#include <qcopchannel_qws.h> 2#include <qcopchannel_qws.h>
3 3
4#include <qpe/qcopenvelope_qws.h> 4#include <qpe/qcopenvelope_qws.h>
5 5
6#include "opimresolver.h"
6#include "opimmainwindow.h" 7#include "opimmainwindow.h"
7 8
8OPimMainWindow::OPimMainWindow( const QString& service, QWidget* parent, 9OPimMainWindow::OPimMainWindow( const QString& service, QWidget* parent,
9 const char* name, WFlags flag ) 10 const char* name, WFlags flag )
10 : QMainWindow( parent, name, flag ), m_service( service ), m_fallBack(0l) { 11 : QMainWindow( parent, name, flag ), m_rtti(-1), m_service( service ), m_fallBack(0l) {
11 12
12 /* 13 /*
13 * let's generate our QCopChannel 14 * let's generate our QCopChannel
14 */ 15 */
@@ -28,8 +29,11 @@ OPimMainWindow::~OPimMainWindow() {
28} 29}
29QCopChannel* OPimMainWindow::channel() { 30QCopChannel* OPimMainWindow::channel() {
30 return m_channel; 31 return m_channel;
31} 32}
33void OPimMainWindow::doSetDocument( const QString& ) {
34
35}
32void OPimMainWindow::appMessage( const QCString& cmd, const QByteArray& array ) { 36void OPimMainWindow::appMessage( const QCString& cmd, const QByteArray& array ) {
33 /* 37 /*
34 * create demands to create 38 * create demands to create
35 * a new record... 39 * a new record...
@@ -68,4 +72,34 @@ void OPimMainWindow::appMessage( const QCString& cmd, const QByteArray& array )
68 add( *m_fallBack ); 72 add( *m_fallBack );
69 delete m_fallBack; 73 delete m_fallBack;
70 } 74 }
71} 75}
76/* implement the url scripting here */
77void OPimMainWindow::setDocument( const QString& str) {
78 doSetDocument( str );
79}
80/*
81 * we now try to get the array demarshalled
82 * check if the rtti matches this one
83 */
84OPimRecord* OPimMainWindow::record( int rtti, const QByteArray& array ) {
85 if ( service() != rtti )
86 return 0l;
87
88 OPimRecord* record = OPimResolver::self()->record( rtti );
89 QDataStream str(array, IO_ReadOnly );
90 if ( !record || !record->loadFromStream(str) ) {
91 delete record;
92 record = 0l;
93 }
94
95 return record;
96}
97/*
98 * get the rtti for the service
99 */
100int OPimMainWindow::service() {
101 if ( m_rtti == -1 )
102 m_rtti = OPimResolver::self()->serviceId( m_service );
103
104 return m_rtti;
105}
diff --git a/libopie2/opiepim/ui/opimmainwindow.h b/libopie2/opiepim/ui/opimmainwindow.h
index 94100bd..34b8a71 100644
--- a/libopie2/opiepim/ui/opimmainwindow.h
+++ b/libopie2/opiepim/ui/opimmainwindow.h
@@ -31,8 +31,13 @@ public:
31 virtual ~OPimMainWindow(); 31 virtual ~OPimMainWindow();
32 32
33 33
34protected slots: 34protected slots:
35 /*
36 * called when a setDocument
37 * couldn't be handled by this window
38 */
39 virtual void doSetDocument( const QString& );
35 /* for syncing */ 40 /* for syncing */
36 virtual void flush() = 0; 41 virtual void flush() = 0;
37 virtual void reload() = 0; 42 virtual void reload() = 0;
38 43
@@ -50,30 +55,35 @@ protected slots:
50 55
51 /** make a copy of it! */ 56 /** make a copy of it! */
52 virtual void add( const OPimRecord& ) = 0; 57 virtual void add( const OPimRecord& ) = 0;
53 58
54 /* I would love to do this as a template 59
55 * but can't think of a right way
56 * because I need signal and slots -zecke
57 */
58 /*
59 * the only pointer in the whole PIM API :(
60 */
61 virtual OPimRecord* record( int rtti, const QByteArray& ) = 0;
62 QCopChannel* channel(); 60 QCopChannel* channel();
63 61
64private slots: 62private slots:
65 void appMessage( const QCString&, const QByteArray& ); 63 void appMessage( const QCString&, const QByteArray& );
64 void setDocument( const QString& );
66 65
67 66
68private: 67private:
69 class Private; 68 class Private;
70 Private* d; 69 Private* d;
71 70
71 int m_rtti;
72 QCopChannel* m_channel; 72 QCopChannel* m_channel;
73 QString m_service; 73 QString m_service;
74 QCString m_str; 74 QCString m_str;
75 OPimRecord* m_fallBack; 75 OPimRecord* m_fallBack;
76
77 /* I would love to do this as a template
78 * but can't think of a right way
79 * because I need signal and slots -zecke
80 */
81 /*
82 * the only pointer in the whole PIM API :(
83 */
84 virtual OPimRecord* record( int rtti, const QByteArray& ) ;
85 int service();
76}; 86};
77 87
78 88
79#endif 89#endif