author | zecke <zecke> | 2002-12-10 17:01:18 (UTC) |
---|---|---|
committer | zecke <zecke> | 2002-12-10 17:01:18 (UTC) |
commit | 4ecbf7407c19b59fc136c334f9386c53db453930 (patch) (unidiff) | |
tree | 1cba438e2533f7109af169b0b77988cec6664192 /libopie2/opiepim | |
parent | 36375df6ff103e52455823f7afd64c4f4ae7fcb8 (diff) | |
download | opie-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 :)
-rw-r--r-- | libopie2/opiepim/backend/opimaccessbackend.h | 16 | ||||
-rw-r--r-- | libopie2/opiepim/backend/otodoaccessxml.cpp | 43 | ||||
-rw-r--r-- | libopie2/opiepim/core/opimaccesstemplate.h | 25 | ||||
-rw-r--r-- | libopie2/opiepim/core/opimcache.h | 6 | ||||
-rw-r--r-- | libopie2/opiepim/core/opimrecord.cpp | 82 | ||||
-rw-r--r-- | libopie2/opiepim/core/opimrecord.h | 12 | ||||
-rw-r--r-- | libopie2/opiepim/core/opimresolver.cpp | 198 | ||||
-rw-r--r-- | libopie2/opiepim/core/opimresolver.h | 52 | ||||
-rw-r--r-- | libopie2/opiepim/core/otemplatebase.h | 63 | ||||
-rw-r--r-- | libopie2/opiepim/core/otodoaccess.cpp | 32 | ||||
-rw-r--r-- | libopie2/opiepim/core/otodoaccess.h | 13 | ||||
-rw-r--r-- | libopie2/opiepim/ocontact.cpp | 3 | ||||
-rw-r--r-- | libopie2/opiepim/otodo.cpp | 3 | ||||
-rw-r--r-- | libopie2/opiepim/ui/opimmainwindow.cpp | 36 | ||||
-rw-r--r-- | libopie2/opiepim/ui/opimmainwindow.h | 26 |
15 files changed, 532 insertions, 78 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 | |||
@@ -20,5 +20,7 @@ class OPimAccessBackend { | |||
20 | public: | 20 | public: |
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 | ||
@@ -89,4 +91,5 @@ public: | |||
89 | void setReadAhead( uint count ); | 91 | void setReadAhead( uint count ); |
90 | protected: | 92 | protected: |
93 | int access()const; | ||
91 | void cache( const T& t )const; | 94 | void cache( const T& t )const; |
92 | 95 | ||
@@ -99,11 +102,16 @@ protected: | |||
99 | 102 | ||
100 | private: | 103 | private: |
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 | ||
106 | template <class T> | 112 | template <class T> |
107 | OPimAccessBackend<T>::OPimAccessBackend() { | 113 | OPimAccessBackend<T>::OPimAccessBackend(int acc) |
114 | : m_acc( acc ) | ||
115 | { | ||
108 | m_front = 0l; | 116 | m_front = 0l; |
109 | } | 117 | } |
@@ -139,3 +147,7 @@ uint OPimAccessBackend<T>::readAhead()const { | |||
139 | return m_read; | 147 | return m_read; |
140 | } | 148 | } |
149 | template <class T> | ||
150 | int 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,2 +1,12 @@ | |||
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> |
@@ -53,18 +63,34 @@ bool OTodoAccessXML::load() { | |||
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; |
@@ -121,4 +147,5 @@ bool OTodoAccessXML::load() { | |||
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 ); |
@@ -132,4 +159,6 @@ bool OTodoAccessXML::load() { | |||
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; |
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 | |||
@@ -23,4 +23,8 @@ template <class T = OPimRecord > | |||
23 | class OPimAccessTemplate : public OTemplateBase<T> { | 23 | class OPimAccessTemplate : public OTemplateBase<T> { |
24 | public: | 24 | public: |
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; |
@@ -29,6 +33,8 @@ public: | |||
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 | ||
@@ -36,5 +42,5 @@ public: | |||
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. |
@@ -50,5 +56,5 @@ public: | |||
50 | * @return true if successful | 56 | * @return true if successful |
51 | */ | 57 | */ |
52 | virtual bool save(); | 58 | bool save(); |
53 | 59 | ||
54 | /** | 60 | /** |
@@ -86,5 +92,5 @@ public: | |||
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 | /** |
@@ -109,5 +115,6 @@ public: | |||
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 | /** |
@@ -124,4 +131,6 @@ public: | |||
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; | ||
126 | protected: | 135 | protected: |
127 | /** | 136 | /** |
@@ -173,4 +182,8 @@ typename OPimAccessTemplate<T>::List OPimAccessTemplate<T>::allRecords()const { | |||
173 | } | 182 | } |
174 | template <class T> | 183 | template <class T> |
184 | QArray<int> OPimAccessTemplate<T>::records()const { | ||
185 | return m_backEnd->allRecords(); | ||
186 | } | ||
187 | template <class T> | ||
175 | typename OPimAccessTemplate<T>::List | 188 | typename OPimAccessTemplate<T>::List |
176 | OPimAccessTemplate<T>::queryByExample( const T& t, int sortOrder ) { | 189 | OPimAccessTemplate<T>::queryByExample( const T& t, int sortOrder ) { |
@@ -232,4 +245,8 @@ bool OPimAccessTemplate<T>::remove( int uid ) { | |||
232 | } | 245 | } |
233 | template <class T> | 246 | template <class T> |
247 | bool OPimAccessTemplate<T>::remove( const OPimRecord& rec) { | ||
248 | return remove( rec.uid() ); | ||
249 | } | ||
250 | template <class T> | ||
234 | bool OPimAccessTemplate<T>::replace( const T& t ) { | 251 | bool OPimAccessTemplate<T>::replace( const T& t ) { |
235 | m_cache.replace( t ); | 252 | m_cache.replace( t ); |
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 | |||
@@ -10,6 +10,9 @@ class OPimCacheItem { | |||
10 | public: | 10 | public: |
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& ); |
@@ -28,6 +31,9 @@ public: | |||
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(); |
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,2 +1,4 @@ | |||
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> |
@@ -83,2 +85,82 @@ int 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 | */ | ||
96 | bool 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 | } | ||
123 | bool 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 | } | ||
146 | void OPimRecord::flush( const OPimXRefPartner& par, QDataStream& str ) const{ | ||
147 | str << par.service(); | ||
148 | str << par.uid(); | ||
149 | str << par.field(); | ||
150 | } | ||
151 | OPimXRefPartner 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 | |||
@@ -2,4 +2,5 @@ | |||
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> |
@@ -106,4 +107,12 @@ public: | |||
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 | |||
108 | protected: | 117 | protected: |
109 | Qtopia::UidGen &uidGen(); | 118 | Qtopia::UidGen &uidGen(); |
@@ -116,4 +125,7 @@ private: | |||
116 | static Qtopia::UidGen m_uidGen; | 125 | static Qtopia::UidGen m_uidGen; |
117 | 126 | ||
127 | private: | ||
128 | void flush( const OPimXRefPartner&, QDataStream& stream )const; | ||
129 | OPimXRefPartner partner( QDataStream& ); | ||
118 | }; | 130 | }; |
119 | 131 | ||
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 | |||
11 | OPimResolver* OPimResolver::m_self = 0l; | ||
12 | |||
13 | OPimResolver::OPimResolver() { | ||
14 | /* the built in channels */ | ||
15 | m_builtIns << "Todolist" << "Addressbook" << "Datebook"; | ||
16 | } | ||
17 | OPimResolver* 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 | */ | ||
27 | OPimRecord* 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 | } | ||
37 | OPimRecord* OPimResolver::record( const QString& service ) { | ||
38 | return record( serviceId( service ) ); | ||
39 | } | ||
40 | OPimRecord* 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 | } | ||
58 | bool OPimResolver::isBuiltIn( const QString& str) const{ | ||
59 | return m_builtIns.contains( str ); | ||
60 | } | ||
61 | QCString 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 | } | ||
79 | QCString 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 | */ | ||
88 | QCString 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 | } | ||
104 | QCString 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 | } | ||
119 | QStringList OPimResolver::services()const { | ||
120 | return m_builtIns; | ||
121 | } | ||
122 | QString 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 | } | ||
140 | int 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 | */ | ||
154 | bool 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 | } | ||
176 | OPimBase* OPimResolver::backend( const QString& service ) { | ||
177 | return backend( serviceId( service ) ); | ||
178 | } | ||
179 | OPimBase* 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 | |||
@@ -5,4 +5,6 @@ | |||
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 |
@@ -16,5 +18,5 @@ | |||
16 | * USING XML is a waste of memory!!!!! | 18 | * USING XML is a waste of memory!!!!! |
17 | */ | 19 | */ |
18 | class OPimResolver : public QObject { | 20 | class OPimResolver { |
19 | public: | 21 | public: |
20 | enum BuiltIn { TodoList = 0, | 22 | enum BuiltIn { TodoList = 0, |
@@ -25,9 +27,10 @@ public: | |||
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 | /** |
@@ -35,6 +38,12 @@ public: | |||
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 | /** |
@@ -42,5 +51,6 @@ public: | |||
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... ;) |
@@ -48,9 +58,33 @@ public: | |||
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 ); | ||
50 | private: | 74 | private: |
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 | |||
@@ -4,11 +4,41 @@ | |||
4 | #include <qarray.h> | 4 | #include <qarray.h> |
5 | 5 | ||
6 | #include "opimrecord.h" | 6 | #include <opie/opimrecord.h> |
7 | 7 | ||
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 | */ | ||
17 | struct 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 | }; | ||
8 | /** | 37 | /** |
9 | * internal template base | 38 | * internal template base |
39 | * T needs to implement the copy c'tor!!! | ||
10 | */ | 40 | */ |
11 | template <class T = OPimRecord> | 41 | template <class T = OPimRecord> |
12 | class OTemplateBase { | 42 | class OTemplateBase : public OPimBase { |
13 | public: | 43 | public: |
14 | enum CacheDirection { Forward=0, Reverse }; | 44 | enum CacheDirection { Forward=0, Reverse }; |
@@ -27,6 +57,35 @@ public: | |||
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 | */ | ||
69 | template <class T> | ||
70 | int | ||
71 | OTemplateBase<T>::rtti() { | ||
72 | return T::rtti(); | ||
73 | } | ||
74 | template <class T> | ||
75 | OPimRecord* OTemplateBase<T>::record()const { | ||
76 | T* t = new T; | ||
77 | return t; | ||
78 | } | ||
79 | template <class T> | ||
80 | OPimRecord* OTemplateBase<T>::record(int uid )const { | ||
81 | T t2 = find(uid ); | ||
82 | T* t1 = new T(t2); | ||
83 | |||
84 | return t1; | ||
85 | }; | ||
86 | template <class T> | ||
87 | T* 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 | |||
@@ -7,5 +7,5 @@ | |||
7 | #include "obackendfactory.h" | 7 | #include "obackendfactory.h" |
8 | 8 | ||
9 | OTodoAccess::OTodoAccess( OTodoAccessBackend* end ) | 9 | OTodoAccess::OTodoAccess( OTodoAccessBackend* end, enum Access ) |
10 | : QObject(), OPimAccessTemplate<OTodo>( end ), m_todoBackEnd( end ) | 10 | : QObject(), OPimAccessTemplate<OTodo>( end ), m_todoBackEnd( end ) |
11 | { | 11 | { |
@@ -45,34 +45,4 @@ OTodoAccess::List OTodoAccess::overDue() { | |||
45 | return lis; | 45 | return lis; |
46 | } | 46 | } |
47 | void 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 | } | ||
63 | void 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 */ |
78 | OTodoAccess::List OTodoAccess::sorted( bool ascending, int sort,int filter, int cat ) { | 48 | OTodoAccess::List OTodoAccess::sorted( bool ascending, int sort,int filter, int 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 | |||
@@ -30,5 +30,5 @@ public: | |||
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 | ||
@@ -79,15 +79,4 @@ signals: | |||
79 | void signalChanged( const OTodoAccess* ); | 79 | void signalChanged( const OTodoAccess* ); |
80 | private: | 80 | private: |
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; |
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 | |||
@@ -23,4 +23,5 @@ | |||
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> |
@@ -1101,5 +1102,5 @@ void OContact::insertEmails( const QStringList &v ) | |||
1101 | } | 1102 | } |
1102 | int OContact::rtti() { | 1103 | int OContact::rtti() { |
1103 | return 2; | 1104 | return OPimResolver::AddressBook; |
1104 | } | 1105 | } |
1105 | void OContact::setUid( int i ) | 1106 | void OContact::setUid( int i ) |
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 | |||
@@ -17,4 +17,5 @@ | |||
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" |
@@ -418,4 +419,4 @@ QString OTodo::recordField(int /*id*/ )const { | |||
418 | 419 | ||
419 | int OTodo::rtti(){ | 420 | int 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 | |||
@@ -4,9 +4,10 @@ | |||
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 | ||
8 | OPimMainWindow::OPimMainWindow( const QString& service, QWidget* parent, | 9 | OPimMainWindow::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 | /* |
@@ -30,4 +31,7 @@ QCopChannel* OPimMainWindow::channel() { | |||
30 | return m_channel; | 31 | return m_channel; |
31 | } | 32 | } |
33 | void OPimMainWindow::doSetDocument( const QString& ) { | ||
34 | |||
35 | } | ||
32 | void OPimMainWindow::appMessage( const QCString& cmd, const QByteArray& array ) { | 36 | void OPimMainWindow::appMessage( const QCString& cmd, const QByteArray& array ) { |
33 | /* | 37 | /* |
@@ -70,2 +74,32 @@ void OPimMainWindow::appMessage( const QCString& cmd, const QByteArray& array ) | |||
70 | } | 74 | } |
71 | } | 75 | } |
76 | /* implement the url scripting here */ | ||
77 | void 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 | */ | ||
84 | OPimRecord* 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 | */ | ||
100 | int 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 | |||
@@ -33,4 +33,9 @@ public: | |||
33 | 33 | ||
34 | protected slots: | 34 | protected 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; |
@@ -52,16 +57,10 @@ protected slots: | |||
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 | ||
64 | private slots: | 62 | private slots: |
65 | void appMessage( const QCString&, const QByteArray& ); | 63 | void appMessage( const QCString&, const QByteArray& ); |
64 | void setDocument( const QString& ); | ||
66 | 65 | ||
67 | 66 | ||
@@ -70,8 +69,19 @@ 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 | ||