summaryrefslogtreecommitdiff
path: root/libopie2
authorzecke <zecke>2002-11-15 15:31:47 (UTC)
committer zecke <zecke>2002-11-15 15:31:47 (UTC)
commit5a6e66edad1070f624d54320278d00372f112213 (patch) (unidiff)
treeab1028759194edace4c79cf90d18dc1362a84aa9 /libopie2
parent05f56fbbbe9ea5546f7503f4852fcab9c5b10a00 (diff)
downloadopie-5a6e66edad1070f624d54320278d00372f112213.zip
opie-5a6e66edad1070f624d54320278d00372f112213.tar.gz
opie-5a6e66edad1070f624d54320278d00372f112213.tar.bz2
Add the implementation for the XRef Manager
Add it to libopie.pro Adjust OPimRecord to use the new manager The backends do not support xref yet
Diffstat (limited to 'libopie2') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiepim/backend/otodoaccessxml.cpp18
-rw-r--r--libopie2/opiepim/core/opimrecord.cpp63
-rw-r--r--libopie2/opiepim/core/opimrecord.h33
-rw-r--r--libopie2/opiepim/core/opimxref.cpp47
-rw-r--r--libopie2/opiepim/core/opimxref.h7
-rw-r--r--libopie2/opiepim/core/opimxrefmanager.cpp69
-rw-r--r--libopie2/opiepim/core/opimxrefmanager.h5
-rw-r--r--libopie2/opiepim/core/opimxrefpartner.cpp43
8 files changed, 184 insertions, 101 deletions
diff --git a/libopie2/opiepim/backend/otodoaccessxml.cpp b/libopie2/opiepim/backend/otodoaccessxml.cpp
index 591e467..c1682c6 100644
--- a/libopie2/opiepim/backend/otodoaccessxml.cpp
+++ b/libopie2/opiepim/backend/otodoaccessxml.cpp
@@ -1,634 +1,618 @@
1#include <qfile.h> 1#include <qfile.h>
2#include <qvector.h> 2#include <qvector.h>
3 3
4#include <qpe/global.h> 4#include <qpe/global.h>
5#include <qpe/stringutil.h> 5#include <qpe/stringutil.h>
6#include <qpe/timeconversion.h> 6#include <qpe/timeconversion.h>
7 7
8#include <opie/xmltree.h> 8#include <opie/xmltree.h>
9 9
10#include "otodoaccessxml.h" 10#include "otodoaccessxml.h"
11 11
12OTodoAccessXML::OTodoAccessXML( const QString& appName, 12OTodoAccessXML::OTodoAccessXML( const QString& appName,
13 const QString& fileName ) 13 const QString& fileName )
14 : OTodoAccessBackend(), m_app( appName ), m_opened( false ), m_changed( false ) 14 : OTodoAccessBackend(), m_app( appName ), m_opened( false ), m_changed( false )
15{ 15{
16 if (!fileName.isEmpty() ) 16 if (!fileName.isEmpty() )
17 m_file = fileName; 17 m_file = fileName;
18 else 18 else
19 m_file = Global::applicationFileName( "todolist", "todolist.xml" ); 19 m_file = Global::applicationFileName( "todolist", "todolist.xml" );
20} 20}
21OTodoAccessXML::~OTodoAccessXML() { 21OTodoAccessXML::~OTodoAccessXML() {
22 22
23} 23}
24bool OTodoAccessXML::load() { 24bool OTodoAccessXML::load() {
25 m_opened = true; 25 m_opened = true;
26 m_changed = false; 26 m_changed = false;
27 /* initialize dict */ 27 /* initialize dict */
28 /* 28 /*
29 * UPDATE dict if you change anything!!! 29 * UPDATE dict if you change anything!!!
30 */ 30 */
31 QAsciiDict<int> dict(15); 31 QAsciiDict<int> dict(15);
32 dict.setAutoDelete( TRUE ); 32 dict.setAutoDelete( TRUE );
33 dict.insert("Categories" , new int(OTodo::Category) ); 33 dict.insert("Categories" , new int(OTodo::Category) );
34 dict.insert("Uid" , new int(OTodo::Uid) ); 34 dict.insert("Uid" , new int(OTodo::Uid) );
35 dict.insert("HasDate" , new int(OTodo::HasDate) ); 35 dict.insert("HasDate" , new int(OTodo::HasDate) );
36 dict.insert("Completed" , new int(OTodo::Completed) ); 36 dict.insert("Completed" , new int(OTodo::Completed) );
37 dict.insert("Description" , new int(OTodo::Description) ); 37 dict.insert("Description" , new int(OTodo::Description) );
38 dict.insert("Summary" , new int(OTodo::Summary) ); 38 dict.insert("Summary" , new int(OTodo::Summary) );
39 dict.insert("Priority" , new int(OTodo::Priority) ); 39 dict.insert("Priority" , new int(OTodo::Priority) );
40 dict.insert("DateDay" , new int(OTodo::DateDay) ); 40 dict.insert("DateDay" , new int(OTodo::DateDay) );
41 dict.insert("DateMonth" , new int(OTodo::DateMonth) ); 41 dict.insert("DateMonth" , new int(OTodo::DateMonth) );
42 dict.insert("DateYear" , new int(OTodo::DateYear) ); 42 dict.insert("DateYear" , new int(OTodo::DateYear) );
43 dict.insert("Progress" , new int(OTodo::Progress) ); 43 dict.insert("Progress" , new int(OTodo::Progress) );
44 dict.insert("Completed", new int(OTodo::Completed) ); 44 dict.insert("Completed", new int(OTodo::Completed) );
45 dict.insert("CrossReference", new int(OTodo::CrossReference) ); 45 dict.insert("CrossReference", new int(OTodo::CrossReference) );
46 dict.insert("HasAlarmDateTime",new int(OTodo::HasAlarmDateTime) ); 46 dict.insert("HasAlarmDateTime",new int(OTodo::HasAlarmDateTime) );
47 dict.insert("AlarmDateTime", new int(OTodo::AlarmDateTime) ); 47 dict.insert("AlarmDateTime", new int(OTodo::AlarmDateTime) );
48 48
49 // here the custom XML parser from TT it's GPL 49 // here the custom XML parser from TT it's GPL
50 // but we want to push that to TT..... 50 // but we want to push that to TT.....
51 QFile f(m_file ); 51 QFile f(m_file );
52 if (!f.open(IO_ReadOnly) ) 52 if (!f.open(IO_ReadOnly) )
53 return false; 53 return false;
54 54
55 QByteArray ba = f.readAll(); 55 QByteArray ba = f.readAll();
56 f.close(); 56 f.close();
57 char* dt = ba.data(); 57 char* dt = ba.data();
58 int len = ba.size(); 58 int len = ba.size();
59 int i = 0; 59 int i = 0;
60 char *point; 60 char *point;
61 const char* collectionString = "<Task "; 61 const char* collectionString = "<Task ";
62 while ( dt+i != 0 && ( point = strstr( dt+i, collectionString ) ) != 0l ) { 62 while ( dt+i != 0 && ( point = strstr( dt+i, collectionString ) ) != 0l ) {
63 i = point -dt; 63 i = point -dt;
64 i+= strlen(collectionString); 64 i+= strlen(collectionString);
65 OTodo ev; 65 OTodo ev;
66 m_year = m_month = m_day = 0; 66 m_year = m_month = m_day = 0;
67 67
68 while ( TRUE ) { 68 while ( TRUE ) {
69 while ( i < len && (dt[i] == ' ' || dt[i] == '\n' || dt[i] == '\r') ) 69 while ( i < len && (dt[i] == ' ' || dt[i] == '\n' || dt[i] == '\r') )
70 ++i; 70 ++i;
71 if ( i >= len-2 || (dt[i] == '/' && dt[i+1] == '>') ) 71 if ( i >= len-2 || (dt[i] == '/' && dt[i+1] == '>') )
72 break; 72 break;
73 73
74 // we have another attribute, read it. 74 // we have another attribute, read it.
75 int j = i; 75 int j = i;
76 while ( j < len && dt[j] != '=' ) 76 while ( j < len && dt[j] != '=' )
77 ++j; 77 ++j;
78 QCString attr( dt+i, j-i+1); 78 QCString attr( dt+i, j-i+1);
79 79
80 i = ++j; // skip = 80 i = ++j; // skip =
81 81
82 // find the start of quotes 82 // find the start of quotes
83 while ( i < len && dt[i] != '"' ) 83 while ( i < len && dt[i] != '"' )
84 ++i; 84 ++i;
85 j = ++i; 85 j = ++i;
86 86
87 bool haveUtf = FALSE; 87 bool haveUtf = FALSE;
88 bool haveEnt = FALSE; 88 bool haveEnt = FALSE;
89 while ( j < len && dt[j] != '"' ) { 89 while ( j < len && dt[j] != '"' ) {
90 if ( ((unsigned char)dt[j]) > 0x7f ) 90 if ( ((unsigned char)dt[j]) > 0x7f )
91 haveUtf = TRUE; 91 haveUtf = TRUE;
92 if ( dt[j] == '&' ) 92 if ( dt[j] == '&' )
93 haveEnt = TRUE; 93 haveEnt = TRUE;
94 ++j; 94 ++j;
95 } 95 }
96 if ( i == j ) { 96 if ( i == j ) {
97 // empty value 97 // empty value
98 i = j + 1; 98 i = j + 1;
99 continue; 99 continue;
100 } 100 }
101 101
102 QCString value( dt+i, j-i+1 ); 102 QCString value( dt+i, j-i+1 );
103 i = j + 1; 103 i = j + 1;
104 104
105 QString str = (haveUtf ? QString::fromUtf8( value ) 105 QString str = (haveUtf ? QString::fromUtf8( value )
106 : QString::fromLatin1( value ) ); 106 : QString::fromLatin1( value ) );
107 if ( haveEnt ) 107 if ( haveEnt )
108 str = Qtopia::plainString( str ); 108 str = Qtopia::plainString( str );
109 109
110 /* 110 /*
111 * add key + value 111 * add key + value
112 */ 112 */
113 todo( &dict, ev, attr, str ); 113 todo( &dict, ev, attr, str );
114 114
115 } 115 }
116 /* 116 /*
117 * now add it 117 * now add it
118 */ 118 */
119 if (m_events.contains( ev.uid() ) || ev.uid() == 0) { 119 if (m_events.contains( ev.uid() ) || ev.uid() == 0) {
120 ev.setUid( 1 ); 120 ev.setUid( 1 );
121 m_changed = true; 121 m_changed = true;
122 } 122 }
123 if ( ev.hasDueDate() ) { 123 if ( ev.hasDueDate() ) {
124 ev.setDueDate( QDate(m_year, m_month, m_day) ); 124 ev.setDueDate( QDate(m_year, m_month, m_day) );
125 } 125 }
126 m_events.insert(ev.uid(), ev ); 126 m_events.insert(ev.uid(), ev );
127 m_year = m_month = m_day = -1; 127 m_year = m_month = m_day = -1;
128 } 128 }
129 129
130 qWarning("counts %d records loaded!", m_events.count() ); 130 qWarning("counts %d records loaded!", m_events.count() );
131 return true; 131 return true;
132} 132}
133bool OTodoAccessXML::reload() { 133bool OTodoAccessXML::reload() {
134 return load(); 134 return load();
135} 135}
136bool OTodoAccessXML::save() { 136bool OTodoAccessXML::save() {
137// qWarning("saving"); 137// qWarning("saving");
138 if (!m_opened || !m_changed ) { 138 if (!m_opened || !m_changed ) {
139// qWarning("not saving"); 139// qWarning("not saving");
140 return true; 140 return true;
141 } 141 }
142 QString strNewFile = m_file + ".new"; 142 QString strNewFile = m_file + ".new";
143 QFile f( strNewFile ); 143 QFile f( strNewFile );
144 if (!f.open( IO_WriteOnly|IO_Raw ) ) 144 if (!f.open( IO_WriteOnly|IO_Raw ) )
145 return false; 145 return false;
146 146
147 int written; 147 int written;
148 QString out; 148 QString out;
149 out = "<!DOCTYPE Tasks>\n<Tasks>\n"; 149 out = "<!DOCTYPE Tasks>\n<Tasks>\n";
150 150
151 // for all todos 151 // for all todos
152 QMap<int, OTodo>::Iterator it; 152 QMap<int, OTodo>::Iterator it;
153 for (it = m_events.begin(); it != m_events.end(); ++it ) { 153 for (it = m_events.begin(); it != m_events.end(); ++it ) {
154 out+= "<Task " + toString( (*it) ) + " />\n"; 154 out+= "<Task " + toString( (*it) ) + " />\n";
155 QCString cstr = out.utf8(); 155 QCString cstr = out.utf8();
156 written = f.writeBlock( cstr.data(), cstr.length() ); 156 written = f.writeBlock( cstr.data(), cstr.length() );
157 157
158 /* less written then we wanted */ 158 /* less written then we wanted */
159 if ( written != (int)cstr.length() ) { 159 if ( written != (int)cstr.length() ) {
160 f.close(); 160 f.close();
161 QFile::remove( strNewFile ); 161 QFile::remove( strNewFile );
162 return false; 162 return false;
163 } 163 }
164 out = QString::null; 164 out = QString::null;
165 } 165 }
166 166
167 out += "</Tasks>"; 167 out += "</Tasks>";
168 QCString cstr = out.utf8(); 168 QCString cstr = out.utf8();
169 written = f.writeBlock( cstr.data(), cstr.length() ); 169 written = f.writeBlock( cstr.data(), cstr.length() );
170 170
171 if ( written != (int)cstr.length() ) { 171 if ( written != (int)cstr.length() ) {
172 f.close(); 172 f.close();
173 QFile::remove( strNewFile ); 173 QFile::remove( strNewFile );
174 return false; 174 return false;
175 } 175 }
176 /* flush before renaming */ 176 /* flush before renaming */
177 f.close(); 177 f.close();
178 178
179 if( ::rename( strNewFile.latin1(), m_file.latin1() ) < 0 ) { 179 if( ::rename( strNewFile.latin1(), m_file.latin1() ) < 0 ) {
180// qWarning("error renaming"); 180// qWarning("error renaming");
181 QFile::remove( strNewFile ); 181 QFile::remove( strNewFile );
182 } 182 }
183 183
184 m_changed = false; 184 m_changed = false;
185 return true; 185 return true;
186} 186}
187QArray<int> OTodoAccessXML::allRecords()const { 187QArray<int> OTodoAccessXML::allRecords()const {
188 QArray<int> ids( m_events.count() ); 188 QArray<int> ids( m_events.count() );
189 QMap<int, OTodo>::ConstIterator it; 189 QMap<int, OTodo>::ConstIterator it;
190 int i = 0; 190 int i = 0;
191 191
192 for ( it = m_events.begin(); it != m_events.end(); ++it ) { 192 for ( it = m_events.begin(); it != m_events.end(); ++it ) {
193 ids[i] = it.key(); 193 ids[i] = it.key();
194 i++; 194 i++;
195 } 195 }
196 return ids; 196 return ids;
197} 197}
198QArray<int> OTodoAccessXML::queryByExample( const OTodo&, int ) { 198QArray<int> OTodoAccessXML::queryByExample( const OTodo&, int ) {
199 QArray<int> ids(0); 199 QArray<int> ids(0);
200 return ids; 200 return ids;
201} 201}
202OTodo OTodoAccessXML::find( int uid )const { 202OTodo OTodoAccessXML::find( int uid )const {
203 OTodo todo; 203 OTodo todo;
204 todo.setUid( 0 ); // isEmpty() 204 todo.setUid( 0 ); // isEmpty()
205 QMap<int, OTodo>::ConstIterator it = m_events.find( uid ); 205 QMap<int, OTodo>::ConstIterator it = m_events.find( uid );
206 if ( it != m_events.end() ) 206 if ( it != m_events.end() )
207 todo = it.data(); 207 todo = it.data();
208 208
209 return todo; 209 return todo;
210} 210}
211void OTodoAccessXML::clear() { 211void OTodoAccessXML::clear() {
212 if (m_opened ) 212 if (m_opened )
213 m_changed = true; 213 m_changed = true;
214 214
215 m_events.clear(); 215 m_events.clear();
216} 216}
217bool OTodoAccessXML::add( const OTodo& todo ) { 217bool OTodoAccessXML::add( const OTodo& todo ) {
218// qWarning("add"); 218// qWarning("add");
219 m_changed = true; 219 m_changed = true;
220 m_events.insert( todo.uid(), todo ); 220 m_events.insert( todo.uid(), todo );
221 221
222 return true; 222 return true;
223} 223}
224bool OTodoAccessXML::remove( int uid ) { 224bool OTodoAccessXML::remove( int uid ) {
225 m_changed = true; 225 m_changed = true;
226 m_events.remove( uid ); 226 m_events.remove( uid );
227 227
228 return true; 228 return true;
229} 229}
230bool OTodoAccessXML::replace( const OTodo& todo) { 230bool OTodoAccessXML::replace( const OTodo& todo) {
231 m_changed = true; 231 m_changed = true;
232 m_events.replace( todo.uid(), todo ); 232 m_events.replace( todo.uid(), todo );
233 233
234 return true; 234 return true;
235} 235}
236QArray<int> OTodoAccessXML::effectiveToDos( const QDate& start, 236QArray<int> OTodoAccessXML::effectiveToDos( const QDate& start,
237 const QDate& end, 237 const QDate& end,
238 bool includeNoDates ) { 238 bool includeNoDates ) {
239 QArray<int> ids( m_events.count() ); 239 QArray<int> ids( m_events.count() );
240 QMap<int, OTodo>::Iterator it; 240 QMap<int, OTodo>::Iterator it;
241 241
242 int i = 0; 242 int i = 0;
243 for ( it = m_events.begin(); it != m_events.end(); ++it ) { 243 for ( it = m_events.begin(); it != m_events.end(); ++it ) {
244 if ( !it.data().hasDueDate() ) { 244 if ( !it.data().hasDueDate() ) {
245 if ( includeNoDates ) { 245 if ( includeNoDates ) {
246 ids[i] = it.key(); 246 ids[i] = it.key();
247 i++; 247 i++;
248 } 248 }
249 }else if ( it.data().dueDate() >= start && 249 }else if ( it.data().dueDate() >= start &&
250 it.data().dueDate() <= end ) { 250 it.data().dueDate() <= end ) {
251 ids[i] = it.key(); 251 ids[i] = it.key();
252 i++; 252 i++;
253 } 253 }
254 } 254 }
255 ids.resize( i ); 255 ids.resize( i );
256 return ids; 256 return ids;
257} 257}
258QArray<int> OTodoAccessXML::overDue() { 258QArray<int> OTodoAccessXML::overDue() {
259 QArray<int> ids( m_events.count() ); 259 QArray<int> ids( m_events.count() );
260 int i = 0; 260 int i = 0;
261 261
262 QMap<int, OTodo>::Iterator it; 262 QMap<int, OTodo>::Iterator it;
263 for ( it = m_events.begin(); it != m_events.end(); ++it ) { 263 for ( it = m_events.begin(); it != m_events.end(); ++it ) {
264 if ( it.data().isOverdue() ) { 264 if ( it.data().isOverdue() ) {
265 ids[i] = it.key(); 265 ids[i] = it.key();
266 i++; 266 i++;
267 } 267 }
268 } 268 }
269 ids.resize( i ); 269 ids.resize( i );
270 return ids; 270 return ids;
271} 271}
272 272
273 273
274/* private */ 274/* private */
275void OTodoAccessXML::todo( QAsciiDict<int>* dict, OTodo& ev, 275void OTodoAccessXML::todo( QAsciiDict<int>* dict, OTodo& ev,
276 const QCString& attr, const QString& val) { 276 const QCString& attr, const QString& val) {
277// qWarning("parse to do from XMLElement" ); 277// qWarning("parse to do from XMLElement" );
278 278
279 int *find=0; 279 int *find=0;
280 280
281 find = (*dict)[ attr.data() ]; 281 find = (*dict)[ attr.data() ];
282 if (!find ) { 282 if (!find ) {
283// qWarning("Unknown option" + it.key() ); 283// qWarning("Unknown option" + it.key() );
284 ev.setCustomField( attr, val ); 284 ev.setCustomField( attr, val );
285 return; 285 return;
286 } 286 }
287 287
288 switch( *find ) { 288 switch( *find ) {
289 case OTodo::Uid: 289 case OTodo::Uid:
290 ev.setUid( val.toInt() ); 290 ev.setUid( val.toInt() );
291 break; 291 break;
292 case OTodo::Category: 292 case OTodo::Category:
293 ev.setCategories( ev.idsFromString( val ) ); 293 ev.setCategories( ev.idsFromString( val ) );
294 break; 294 break;
295 case OTodo::HasDate: 295 case OTodo::HasDate:
296 ev.setHasDueDate( val.toInt() ); 296 ev.setHasDueDate( val.toInt() );
297 break; 297 break;
298 case OTodo::Completed: 298 case OTodo::Completed:
299 ev.setCompleted( val.toInt() ); 299 ev.setCompleted( val.toInt() );
300 break; 300 break;
301 case OTodo::Description: 301 case OTodo::Description:
302 ev.setDescription( val ); 302 ev.setDescription( val );
303 break; 303 break;
304 case OTodo::Summary: 304 case OTodo::Summary:
305 ev.setSummary( val ); 305 ev.setSummary( val );
306 break; 306 break;
307 case OTodo::Priority: 307 case OTodo::Priority:
308 ev.setPriority( val.toInt() ); 308 ev.setPriority( val.toInt() );
309 break; 309 break;
310 case OTodo::DateDay: 310 case OTodo::DateDay:
311 m_day = val.toInt(); 311 m_day = val.toInt();
312 break; 312 break;
313 case OTodo::DateMonth: 313 case OTodo::DateMonth:
314 m_month = val.toInt(); 314 m_month = val.toInt();
315 break; 315 break;
316 case OTodo::DateYear: 316 case OTodo::DateYear:
317 m_year = val.toInt(); 317 m_year = val.toInt();
318 break; 318 break;
319 case OTodo::Progress: 319 case OTodo::Progress:
320 ev.setProgress( val.toInt() ); 320 ev.setProgress( val.toInt() );
321 break; 321 break;
322 case OTodo::CrossReference: 322 case OTodo::CrossReference:
323 { 323 {
324 /* 324 /*
325 * A cross refernce looks like 325 * A cross refernce looks like
326 * appname,id;appname,id 326 * appname,id;appname,id
327 * we need to split it up 327 * we need to split it up
328 */ 328 */
329 QStringList refs = QStringList::split(';', val ); 329 QStringList refs = QStringList::split(';', val );
330 QStringList::Iterator strIt; 330 QStringList::Iterator strIt;
331 for (strIt = refs.begin(); strIt != refs.end(); ++strIt ) { 331 for (strIt = refs.begin(); strIt != refs.end(); ++strIt ) {
332 int pos = (*strIt).find(','); 332 int pos = (*strIt).find(',');
333 if ( pos > -1 ) 333 if ( pos > -1 )
334 ev.addRelation( (*strIt).left(pos), (*strIt).mid(pos+1).toInt() ); 334 ; // ev.addRelation( (*strIt).left(pos), (*strIt).mid(pos+1).toInt() );
335 335
336 } 336 }
337 break; 337 break;
338 } 338 }
339 case OTodo::HasAlarmDateTime: 339 case OTodo::HasAlarmDateTime:
340 ev.setHasAlarmDateTime( val.toInt() ); 340 ev.setHasAlarmDateTime( val.toInt() );
341 break; 341 break;
342 case OTodo::AlarmDateTime: { 342 case OTodo::AlarmDateTime: {
343 /* this sounds better ;) zecke */ 343 /* this sounds better ;) zecke */
344 ev.setAlarmDateTime( TimeConversion::fromISO8601( val.local8Bit() ) ); 344 ev.setAlarmDateTime( TimeConversion::fromISO8601( val.local8Bit() ) );
345 break; 345 break;
346 } 346 }
347 default: 347 default:
348 break; 348 break;
349 } 349 }
350} 350}
351QString OTodoAccessXML::toString( const OTodo& ev )const { 351QString OTodoAccessXML::toString( const OTodo& ev )const {
352 QString str; 352 QString str;
353 353
354 str += "Completed=\"" + QString::number( ev.isCompleted() ) + "\" "; 354 str += "Completed=\"" + QString::number( ev.isCompleted() ) + "\" ";
355 str += "HasDate=\"" + QString::number( ev.hasDueDate() ) + "\" "; 355 str += "HasDate=\"" + QString::number( ev.hasDueDate() ) + "\" ";
356 str += "Priority=\"" + QString::number( ev.priority() ) + "\" "; 356 str += "Priority=\"" + QString::number( ev.priority() ) + "\" ";
357 str += "Progress=\"" + QString::number(ev.progress() ) + "\" "; 357 str += "Progress=\"" + QString::number(ev.progress() ) + "\" ";
358 358
359 str += "Categories=\"" + toString( ev.categories() ) + "\" "; 359 str += "Categories=\"" + toString( ev.categories() ) + "\" ";
360 str += "Description=\"" + Qtopia::escapeString( ev.description() ) + "\" "; 360 str += "Description=\"" + Qtopia::escapeString( ev.description() ) + "\" ";
361 str += "Summary=\"" + Qtopia::escapeString( ev.summary() ) + "\" "; 361 str += "Summary=\"" + Qtopia::escapeString( ev.summary() ) + "\" ";
362 362
363 if ( ev.hasDueDate() ) { 363 if ( ev.hasDueDate() ) {
364 str += "DateYear=\"" + QString::number( ev.dueDate().year() ) + "\" "; 364 str += "DateYear=\"" + QString::number( ev.dueDate().year() ) + "\" ";
365 str += "DateMonth=\"" + QString::number( ev.dueDate().month() ) + "\" "; 365 str += "DateMonth=\"" + QString::number( ev.dueDate().month() ) + "\" ";
366 str += "DateDay=\"" + QString::number( ev.dueDate().day() ) + "\" "; 366 str += "DateDay=\"" + QString::number( ev.dueDate().day() ) + "\" ";
367 } 367 }
368// qWarning( "Uid %d", ev.uid() ); 368// qWarning( "Uid %d", ev.uid() );
369 str += "Uid=\"" + QString::number( ev.uid() ) + "\" "; 369 str += "Uid=\"" + QString::number( ev.uid() ) + "\" ";
370 370
371// append the extra options 371// append the extra options
372 /* FIXME Qtopia::Record this is currently not 372 /* FIXME Qtopia::Record this is currently not
373 * possible you can set custom fields 373 * possible you can set custom fields
374 * but don' iterate over the list 374 * but don' iterate over the list
375 * I may do #define private protected 375 * I may do #define private protected
376 * for this case - cough --zecke 376 * for this case - cough --zecke
377 */ 377 */
378 /* 378 /*
379 QMap<QString, QString> extras = ev.extras(); 379 QMap<QString, QString> extras = ev.extras();
380 QMap<QString, QString>::Iterator extIt; 380 QMap<QString, QString>::Iterator extIt;
381 for (extIt = extras.begin(); extIt != extras.end(); ++extIt ) 381 for (extIt = extras.begin(); extIt != extras.end(); ++extIt )
382 str += extIt.key() + "=\"" + extIt.data() + "\" "; 382 str += extIt.key() + "=\"" + extIt.data() + "\" ";
383 */ 383 */
384 // cross refernce 384 // cross refernce
385 QStringList list = ev.relatedApps();
386 QStringList::Iterator listIt;
387 QString refs;
388 str += "CrossReference=\"";
389 bool added = false;
390 for ( listIt = list.begin(); listIt != list.end(); ++listIt ) {
391 added = true;
392 QArray<int> ints = ev.relations( (*listIt) );
393 for ( uint i = 0; i< ints.count(); i++ ) {
394 str += (*listIt) + "," + QString::number( i ) + ";";
395 }
396 }
397 if ( added )
398 str = str.remove( str.length()-1, 1 );
399
400 str += "\" ";
401 385
402 str += "AlarmDateTime=\"" + TimeConversion::toISO8601( ev.alarmDateTime() ) + "\" "; 386 str += "AlarmDateTime=\"" + TimeConversion::toISO8601( ev.alarmDateTime() ) + "\" ";
403 387
404 return str; 388 return str;
405} 389}
406QString OTodoAccessXML::toString( const QArray<int>& ints ) const { 390QString OTodoAccessXML::toString( const QArray<int>& ints ) const {
407 return Qtopia::Record::idsToString( ints ); 391 return Qtopia::Record::idsToString( ints );
408} 392}
409 393
410/* internal class for sorting 394/* internal class for sorting
411 * 395 *
412 * Inspired by todoxmlio.cpp from TT 396 * Inspired by todoxmlio.cpp from TT
413 */ 397 */
414 398
415struct OTodoXMLContainer { 399struct OTodoXMLContainer {
416 OTodo todo; 400 OTodo todo;
417}; 401};
418 402
419namespace { 403namespace {
420 inline QString string( const OTodo& todo) { 404 inline QString string( const OTodo& todo) {
421 return todo.summary().isEmpty() ? 405 return todo.summary().isEmpty() ?
422 todo.description().left(20 ) : 406 todo.description().left(20 ) :
423 todo.summary(); 407 todo.summary();
424 } 408 }
425 inline int completed( const OTodo& todo1, const OTodo& todo2) { 409 inline int completed( const OTodo& todo1, const OTodo& todo2) {
426 int ret = 0; 410 int ret = 0;
427 if ( todo1.isCompleted() ) ret++; 411 if ( todo1.isCompleted() ) ret++;
428 if ( todo2.isCompleted() ) ret--; 412 if ( todo2.isCompleted() ) ret--;
429 return ret; 413 return ret;
430 } 414 }
431 inline int priority( const OTodo& t1, const OTodo& t2) { 415 inline int priority( const OTodo& t1, const OTodo& t2) {
432 return ( t1.priority() - t2.priority() ); 416 return ( t1.priority() - t2.priority() );
433 } 417 }
434 inline int description( const OTodo& t1, const OTodo& t2) { 418 inline int description( const OTodo& t1, const OTodo& t2) {
435 return QString::compare( string(t1), string(t2) ); 419 return QString::compare( string(t1), string(t2) );
436 } 420 }
437 inline int deadline( const OTodo& t1, const OTodo& t2) { 421 inline int deadline( const OTodo& t1, const OTodo& t2) {
438 int ret = 0; 422 int ret = 0;
439 if ( t1.hasDueDate() && 423 if ( t1.hasDueDate() &&
440 t2.hasDueDate() ) 424 t2.hasDueDate() )
441 ret = t2.dueDate().daysTo( t1.dueDate() ); 425 ret = t2.dueDate().daysTo( t1.dueDate() );
442 else if ( t1.hasDueDate() ) 426 else if ( t1.hasDueDate() )
443 ret = -1; 427 ret = -1;
444 else if ( t2.hasDueDate() ) 428 else if ( t2.hasDueDate() )
445 ret = 1; 429 ret = 1;
446 else 430 else
447 ret = 0; 431 ret = 0;
448 432
449 return ret; 433 return ret;
450 } 434 }
451 435
452}; 436};
453 437
454/* 438/*
455 * Returns: 439 * Returns:
456 * 0 if item1 == item2 440 * 0 if item1 == item2
457 * 441 *
458 * non-zero if item1 != item2 442 * non-zero if item1 != item2
459 * 443 *
460 * This function returns int rather than bool so that reimplementations 444 * This function returns int rather than bool so that reimplementations
461 * can return one of three values and use it to sort by: 445 * can return one of three values and use it to sort by:
462 * 446 *
463 * 0 if item1 == item2 447 * 0 if item1 == item2
464 * 448 *
465 * > 0 (positive integer) if item1 > item2 449 * > 0 (positive integer) if item1 > item2
466 * 450 *
467 * < 0 (negative integer) if item1 < item2 451 * < 0 (negative integer) if item1 < item2
468 * 452 *
469 */ 453 */
470class OTodoXMLVector : public QVector<OTodoXMLContainer> { 454class OTodoXMLVector : public QVector<OTodoXMLContainer> {
471public: 455public:
472 OTodoXMLVector(int size, bool asc, int sort) 456 OTodoXMLVector(int size, bool asc, int sort)
473 : QVector<OTodoXMLContainer>( size ) 457 : QVector<OTodoXMLContainer>( size )
474 { 458 {
475 setAutoDelete( true ); 459 setAutoDelete( true );
476 m_asc = asc; 460 m_asc = asc;
477 m_sort = sort; 461 m_sort = sort;
478 } 462 }
479 /* return the summary/description */ 463 /* return the summary/description */
480 QString string( const OTodo& todo) { 464 QString string( const OTodo& todo) {
481 return todo.summary().isEmpty() ? 465 return todo.summary().isEmpty() ?
482 todo.description().left(20 ) : 466 todo.description().left(20 ) :
483 todo.summary(); 467 todo.summary();
484 } 468 }
485 /** 469 /**
486 * we take the sortorder( switch on it ) 470 * we take the sortorder( switch on it )
487 * 471 *
488 */ 472 */
489 int compareItems( Item d1, Item d2 ) { 473 int compareItems( Item d1, Item d2 ) {
490 bool seComp, sePrio, seDesc, seDeadline; 474 bool seComp, sePrio, seDesc, seDeadline;
491 seComp = sePrio = seDeadline = seDesc = false; 475 seComp = sePrio = seDeadline = seDesc = false;
492 int ret =0; 476 int ret =0;
493 OTodoXMLContainer* con1 = (OTodoXMLContainer*)d1; 477 OTodoXMLContainer* con1 = (OTodoXMLContainer*)d1;
494 OTodoXMLContainer* con2 = (OTodoXMLContainer*)d2; 478 OTodoXMLContainer* con2 = (OTodoXMLContainer*)d2;
495 479
496 /* same item */ 480 /* same item */
497 if ( con1->todo.uid() == con2->todo.uid() ) 481 if ( con1->todo.uid() == con2->todo.uid() )
498 return 0; 482 return 0;
499 483
500 switch ( m_sort ) { 484 switch ( m_sort ) {
501 /* completed */ 485 /* completed */
502 case 0: { 486 case 0: {
503 ret = completed( con1->todo, con2->todo ); 487 ret = completed( con1->todo, con2->todo );
504 seComp = TRUE; 488 seComp = TRUE;
505 break; 489 break;
506 } 490 }
507 /* priority */ 491 /* priority */
508 case 1: { 492 case 1: {
509 ret = priority( con1->todo, con2->todo ); 493 ret = priority( con1->todo, con2->todo );
510 sePrio = TRUE; 494 sePrio = TRUE;
511 break; 495 break;
512 } 496 }
513 /* description */ 497 /* description */
514 case 2: { 498 case 2: {
515 ret = description( con1->todo, con2->todo ); 499 ret = description( con1->todo, con2->todo );
516 seDesc = TRUE; 500 seDesc = TRUE;
517 break; 501 break;
518 } 502 }
519 /* deadline */ 503 /* deadline */
520 case 3: { 504 case 3: {
521 ret = deadline( con1->todo, con2->todo ); 505 ret = deadline( con1->todo, con2->todo );
522 seDeadline = TRUE; 506 seDeadline = TRUE;
523 break; 507 break;
524 } 508 }
525 default: 509 default:
526 ret = 0; 510 ret = 0;
527 break; 511 break;
528 }; 512 };
529 /* 513 /*
530 * FIXME do better sorting if the first sort criteria 514 * FIXME do better sorting if the first sort criteria
531 * ret equals 0 start with complete and so on... 515 * ret equals 0 start with complete and so on...
532 */ 516 */
533 517
534 /* twist it we're not ascending*/ 518 /* twist it we're not ascending*/
535 if (!m_asc) 519 if (!m_asc)
536 ret = ret * -1; 520 ret = ret * -1;
537 521
538 if ( ret ) 522 if ( ret )
539 return ret; 523 return ret;
540 524
541 // default did not gave difference let's try it other way around 525 // default did not gave difference let's try it other way around
542 /* 526 /*
543 * General try if already checked if not test 527 * General try if already checked if not test
544 * and return 528 * and return
545 * 1.Completed 529 * 1.Completed
546 * 2.Priority 530 * 2.Priority
547 * 3.Description 531 * 3.Description
548 * 4.DueDate 532 * 4.DueDate
549 */ 533 */
550 if (!seComp ) { 534 if (!seComp ) {
551 if ( (ret = completed( con1->todo, con2->todo ) ) ) { 535 if ( (ret = completed( con1->todo, con2->todo ) ) ) {
552 if (!m_asc ) ret *= -1; 536 if (!m_asc ) ret *= -1;
553 return ret; 537 return ret;
554 } 538 }
555 } 539 }
556 if (!sePrio ) { 540 if (!sePrio ) {
557 if ( (ret = priority( con1->todo, con2->todo ) ) ) { 541 if ( (ret = priority( con1->todo, con2->todo ) ) ) {
558 if (!m_asc ) ret *= -1; 542 if (!m_asc ) ret *= -1;
559 return ret; 543 return ret;
560 } 544 }
561 } 545 }
562 if (!seDesc ) { 546 if (!seDesc ) {
563 if ( (ret = description(con1->todo, con2->todo ) ) ) { 547 if ( (ret = description(con1->todo, con2->todo ) ) ) {
564 if (!m_asc) ret *= -1; 548 if (!m_asc) ret *= -1;
565 return ret; 549 return ret;
566 } 550 }
567 } 551 }
568 if (!seDeadline) { 552 if (!seDeadline) {
569 if ( (ret = deadline( con1->todo, con2->todo ) ) ) { 553 if ( (ret = deadline( con1->todo, con2->todo ) ) ) {
570 if (!m_asc) ret *= -1; 554 if (!m_asc) ret *= -1;
571 return ret; 555 return ret;
572 } 556 }
573 } 557 }
574 558
575 return 0; 559 return 0;
576 } 560 }
577 private: 561 private:
578 bool m_asc; 562 bool m_asc;
579 int m_sort; 563 int m_sort;
580 564
581}; 565};
582 566
583QArray<int> OTodoAccessXML::sorted( bool asc, int sortOrder, 567QArray<int> OTodoAccessXML::sorted( bool asc, int sortOrder,
584 int sortFilter, int cat ) { 568 int sortFilter, int cat ) {
585 qWarning("sorted! %d cat", cat); 569 qWarning("sorted! %d cat", cat);
586 OTodoXMLVector vector(m_events.count(), asc,sortOrder ); 570 OTodoXMLVector vector(m_events.count(), asc,sortOrder );
587 QMap<int, OTodo>::Iterator it; 571 QMap<int, OTodo>::Iterator it;
588 int item = 0; 572 int item = 0;
589 573
590 bool bCat = sortFilter & 1 ? true : false; 574 bool bCat = sortFilter & 1 ? true : false;
591 bool bOnly = sortFilter & 2 ? true : false; 575 bool bOnly = sortFilter & 2 ? true : false;
592 bool comp = sortFilter & 4 ? true : false; 576 bool comp = sortFilter & 4 ? true : false;
593 for ( it = m_events.begin(); it != m_events.end(); ++it ) { 577 for ( it = m_events.begin(); it != m_events.end(); ++it ) {
594 578
595 /* show category */ 579 /* show category */
596 if ( bCat && cat != 0) 580 if ( bCat && cat != 0)
597 if (!(*it).categories().contains( cat ) ) { 581 if (!(*it).categories().contains( cat ) ) {
598 qWarning("category mis match"); 582 qWarning("category mis match");
599 continue; 583 continue;
600 } 584 }
601 /* isOverdue but we should not show overdue - why?*/ 585 /* isOverdue but we should not show overdue - why?*/
602/* if ( (*it).isOverdue() && !bOnly ) { 586/* if ( (*it).isOverdue() && !bOnly ) {
603 qWarning("item is overdue but !bOnly"); 587 qWarning("item is overdue but !bOnly");
604 continue; 588 continue;
605 } 589 }
606*/ 590*/
607 if ( !(*it).isOverdue() && bOnly ) { 591 if ( !(*it).isOverdue() && bOnly ) {
608 qWarning("item is not overdue but bOnly checked"); 592 qWarning("item is not overdue but bOnly checked");
609 continue; 593 continue;
610 } 594 }
611 595
612 if ((*it).isCompleted() && comp ) { 596 if ((*it).isCompleted() && comp ) {
613 qWarning("completed continue!"); 597 qWarning("completed continue!");
614 continue; 598 continue;
615 } 599 }
616 600
617 601
618 OTodoXMLContainer* con = new OTodoXMLContainer(); 602 OTodoXMLContainer* con = new OTodoXMLContainer();
619 con->todo = (*it); 603 con->todo = (*it);
620 vector.insert(item, con ); 604 vector.insert(item, con );
621 item++; 605 item++;
622 } 606 }
623 qWarning("XXX %d Items added", item); 607 qWarning("XXX %d Items added", item);
624 vector.resize( item ); 608 vector.resize( item );
625 /* sort it now */ 609 /* sort it now */
626 vector.sort(); 610 vector.sort();
627 /* now get the uids */ 611 /* now get the uids */
628 QArray<int> array( vector.count() ); 612 QArray<int> array( vector.count() );
629 for (uint i= 0; i < vector.count(); i++ ) { 613 for (uint i= 0; i < vector.count(); i++ ) {
630 array[i] = ( vector.at(i) )->todo.uid(); 614 array[i] = ( vector.at(i) )->todo.uid();
631 } 615 }
632 qWarning("array count = %d %d", array.count(), vector.count() ); 616 qWarning("array count = %d %d", array.count(), vector.count() );
633 return array; 617 return array;
634}; 618};
diff --git a/libopie2/opiepim/core/opimrecord.cpp b/libopie2/opiepim/core/opimrecord.cpp
index 21cf131..0e3be9d 100644
--- a/libopie2/opiepim/core/opimrecord.cpp
+++ b/libopie2/opiepim/core/opimrecord.cpp
@@ -1,132 +1,81 @@
1#include <qpe/categories.h> 1#include <qpe/categories.h>
2#include <qpe/categoryselect.h> 2#include <qpe/categoryselect.h>
3 3
4#include "opimrecord.h" 4#include "opimrecord.h"
5 5
6Qtopia::UidGen OPimRecord::m_uidGen( Qtopia::UidGen::Qtopia ); 6Qtopia::UidGen OPimRecord::m_uidGen( Qtopia::UidGen::Qtopia );
7 7
8 8
9OPimRecord::OPimRecord( int uid ) 9OPimRecord::OPimRecord( int uid )
10 : Qtopia::Record() { 10 : Qtopia::Record() {
11 11
12 setUid( uid ); 12 setUid( uid );
13} 13}
14OPimRecord::~OPimRecord() { 14OPimRecord::~OPimRecord() {
15} 15}
16OPimRecord::OPimRecord( const OPimRecord& rec ) 16OPimRecord::OPimRecord( const OPimRecord& rec )
17 : Qtopia::Record( rec ) 17 : Qtopia::Record( rec )
18{ 18{
19 (*this) = rec; 19 (*this) = rec;
20} 20}
21 21
22OPimRecord &OPimRecord::operator=( const OPimRecord& rec) { 22OPimRecord &OPimRecord::operator=( const OPimRecord& rec) {
23 Qtopia::Record::operator=( rec ); 23 Qtopia::Record::operator=( rec );
24 m_relations = rec.m_relations; 24 m_xrefman = rec.m_xrefman;
25 25
26 return *this; 26 return *this;
27} 27}
28/* 28/*
29 * category names 29 * category names
30 */ 30 */
31QStringList OPimRecord::categoryNames()const { 31QStringList OPimRecord::categoryNames()const {
32 QStringList list; 32 QStringList list;
33 QArray<int> cats = categories(); 33 QArray<int> cats = categories();
34 Categories catDB; 34 Categories catDB;
35 catDB.load( categoryFileName() ); 35 catDB.load( categoryFileName() );
36 36
37 for (uint i = 0; i < cats.count(); i++ ) { 37 for (uint i = 0; i < cats.count(); i++ ) {
38 list << catDB.label("Todo List", cats[i] ); 38 list << catDB.label("Todo List", cats[i] );
39 } 39 }
40 40
41 return list; 41 return list;
42} 42}
43void OPimRecord::setCategoryNames( const QStringList& ) { 43void OPimRecord::setCategoryNames( const QStringList& ) {
44 44
45} 45}
46void OPimRecord::addCategoryName( const QString& ) { 46void OPimRecord::addCategoryName( const QString& ) {
47 Categories catDB; 47 Categories catDB;
48 catDB.load( categoryFileName() ); 48 catDB.load( categoryFileName() );
49 49
50 50
51} 51}
52bool OPimRecord::isEmpty()const { 52bool OPimRecord::isEmpty()const {
53 return ( uid() == 0 ); 53 return ( uid() == 0 );
54} 54}
55QStringList OPimRecord::relatedApps()const{ 55/*QString OPimRecord::crossToString()const {
56 QStringList list;
57 QMap<QString, QArray<int> >::ConstIterator it;
58 for ( it = m_relations.begin(); it != m_relations.end(); ++it ) {
59 list << it.key();
60 }
61 return list;
62}
63QArray<int> OPimRecord::relations(const QString& app )const {
64 QArray<int> tmp;
65 QMap<QString, QArray<int> >::ConstIterator it;
66 it = m_relations.find( app);
67 if ( it != m_relations.end() )
68 tmp = it.data();
69 return tmp;
70}
71void OPimRecord::clearRelation( const QString& app ) {
72 m_relations.remove( app );
73}
74void OPimRecord::addRelation( const QString& app, int id ) {
75
76 QMap<QString, QArray<int> >::Iterator it;
77 QArray<int> tmp;
78
79 it = m_relations.find( app );
80 if ( it == m_relations.end() ) {
81 tmp.resize(1 );
82 tmp[0] = id;
83 }else{
84 tmp = it.data();
85 tmp.resize( tmp.size() + 1 );
86 tmp[tmp.size() - 1] = id;
87 }
88 m_relations.replace( app, tmp );
89}
90void OPimRecord::setRelations( const QString& app, QArray<int> ids ) {
91
92 QMap<QString, QArray<int> >::Iterator it;
93 QArray<int> tmp;
94
95 it = m_relations.find( app);
96 if ( it == m_relations.end() ) {
97 tmp = ids;
98 }else{
99 tmp = it.data();
100 int offset = tmp.size()-1;
101 tmp.resize( tmp.size() + ids.size() );
102 for (uint i = 0; i < ids.size(); i++ ) {
103 tmp[offset+i] = ids[i];
104 }
105
106 }
107 m_relations.replace( app, tmp );
108}
109QString OPimRecord::crossToString()const {
110 QString str; 56 QString str;
111 QMap<QString, QArray<int> >::ConstIterator it; 57 QMap<QString, QArray<int> >::ConstIterator it;
112 for (it = m_relations.begin(); it != m_relations.end(); ++it ) { 58 for (it = m_relations.begin(); it != m_relations.end(); ++it ) {
113 QArray<int> id = it.data(); 59 QArray<int> id = it.data();
114 for ( uint i = 0; i < id.size(); ++i ) { 60 for ( uint i = 0; i < id.size(); ++i ) {
115 str += it.key() + "," + QString::number( i ) + ";"; 61 str += it.key() + "," + QString::number( i ) + ";";
116 } 62 }
117 } 63 }
118 str = str.remove( str.length()-1, 1); // strip the ; 64 str = str.remove( str.length()-1, 1); // strip the ;
119 //qWarning("IDS " + str ); 65 //qWarning("IDS " + str );
120 66
121 return str; 67 return str;
122} 68 }*/
123/* if uid = 1 assign a new one */ 69/* if uid = 1 assign a new one */
124void OPimRecord::setUid( int uid ) { 70void OPimRecord::setUid( int uid ) {
125 if ( uid == 1) 71 if ( uid == 1)
126 uid = uidGen().generate(); 72 uid = uidGen().generate();
127 73
128 Qtopia::Record::setUid( uid ); 74 Qtopia::Record::setUid( uid );
129}; 75};
130Qtopia::UidGen &OPimRecord::uidGen() { 76Qtopia::UidGen &OPimRecord::uidGen() {
131 return m_uidGen; 77 return m_uidGen;
132} 78}
79OPimXRefManager &OPimRecord::xrefmanager() {
80 return m_xrefman;
81}
diff --git a/libopie2/opiepim/core/opimrecord.h b/libopie2/opiepim/core/opimrecord.h
index d9ccad4..1642a5e 100644
--- a/libopie2/opiepim/core/opimrecord.h
+++ b/libopie2/opiepim/core/opimrecord.h
@@ -1,133 +1,116 @@
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 <qmap.h> 4#include <qmap.h>
5#include <qstring.h> 5#include <qstring.h>
6#include <qstringlist.h> 6#include <qstringlist.h>
7 7
8#include <qpe/palmtoprecord.h> 8#include <qpe/palmtoprecord.h>
9 9
10#include <opie/opimxrefmanager.h>
10 11
11/** 12/**
12 * This is the base class for 13 * This is the base class for
13 * all PIM Records 14 * all PIM Records
14 * 15 *
15 */ 16 */
16class OPimRecord : public Qtopia::Record { 17class OPimRecord : public Qtopia::Record {
17public: 18public:
18 /** 19 /**
19 * c'tor 20 * c'tor
20 * uid of 0 isEmpty 21 * uid of 0 isEmpty
21 * uid of 1 will be assigned a new one 22 * uid of 1 will be assigned a new one
22 */ 23 */
23 OPimRecord(int uid = 0); 24 OPimRecord(int uid = 0);
24 ~OPimRecord(); 25 ~OPimRecord();
25 26
26 /** 27 /**
27 * copy c'tor 28 * copy c'tor
28 */ 29 */
29 OPimRecord( const OPimRecord& rec ); 30 OPimRecord( const OPimRecord& rec );
30 31
31 /** 32 /**
32 * copy operator 33 * copy operator
33 */ 34 */
34 OPimRecord &operator=( const OPimRecord& ); 35 OPimRecord &operator=( const OPimRecord& );
35 36
36 /** 37 /**
37 * category names resolved 38 * category names resolved
38 */ 39 */
39 QStringList categoryNames()const; 40 QStringList categoryNames()const;
40 41
41 /** 42 /**
42 * set category names they will be resolved 43 * set category names they will be resolved
43 */ 44 */
44 void setCategoryNames( const QStringList& ); 45 void setCategoryNames( const QStringList& );
45 46
46 /** 47 /**
47 * addCategoryName adds a name 48 * addCategoryName adds a name
48 * to the internal category list 49 * to the internal category list
49 */ 50 */
50 void addCategoryName( const QString& ); 51 void addCategoryName( const QString& );
51 52
52 /** 53 /**
53 * if a Record isEmpty 54 * if a Record isEmpty
54 * it's empty if it's 0 55 * it's empty if it's 0
55 */ 56 */
56 virtual bool isEmpty()const; 57 virtual bool isEmpty()const;
57 58
58 /** 59 /**
59 * toRichText summary 60 * toRichText summary
60 */ 61 */
61 virtual QString toRichText()const = 0; 62 virtual QString toRichText()const = 0;
62 63
63 /** 64 /**
64 * a small one line summary 65 * a small one line summary
65 */ 66 */
66 virtual QString toShortText()const = 0; 67 virtual QString toShortText()const = 0;
67 68
68 /** 69 /**
69 * the name of the Record 70 * the name of the Record
70 */ 71 */
71 virtual QString type()const = 0; 72 virtual QString type()const = 0;
72 73
73 /** 74 /**
74 * converts the internal structure to a map 75 * converts the internal structure to a map
75 */ 76 */
76 virtual QMap<int, QString> toMap()const = 0; 77 virtual QMap<int, QString> toMap()const = 0;
77 78
78 /** 79 /**
79 * key value representation of extra items 80 * key value representation of extra items
80 */ 81 */
81 virtual QMap<QString, QString> toExtraMap()const = 0; 82 virtual QMap<QString, QString> toExtraMap()const = 0;
82 83
83 /** 84 /**
84 * the name for a recordField 85 * the name for a recordField
85 */ 86 */
86 virtual QString recordField(int)const = 0; 87 virtual QString recordField(int)const = 0;
87 88
88 /** 89 /**
89 * the related apps names 90 * returns a reference of the
91 * Cross Reference Manager
92 * Partner One is THIS PIM RECORD!
93 * Two is the Partner where we link to
90 */ 94 */
91 QStringList relatedApps()const; 95 OPimXRefManager& xrefmanager();
92
93 /**
94 * the realtions between an app
95 */
96 QArray<int> relations( const QString& app )const;
97
98 /**
99 * clear the relations for all relations
100 * with app
101 */
102 void clearRelation( const QString& app );
103
104 /**
105 * add a relation
106 */
107 void addRelation( const QString& app, int id );
108
109 /**
110 * set the relations for an app
111 */
112 void setRelations( const QString&, QArray<int> ids );
113 96
114 /** 97 /**
115 * set the uid 98 * set the uid
116 */ 99 */
117 virtual void setUid( int uid ); 100 virtual void setUid( int uid );
118 101
119protected: 102protected:
120 Qtopia::UidGen &uidGen(); 103 Qtopia::UidGen &uidGen();
121 QString crossToString()const; 104// QString crossToString()const;
122 105
123private: 106private:
124 class OPimRecordPrivate; 107 class OPimRecordPrivate;
125 OPimRecordPrivate *d; 108 OPimRecordPrivate *d;
126 QMap<QString, QArray<int> > m_relations; 109 OPimXRefManager m_xrefman;
127 static Qtopia::UidGen m_uidGen; 110 static Qtopia::UidGen m_uidGen;
128 111
129}; 112};
130 113
131 114
132 115
133#endif 116#endif
diff --git a/libopie2/opiepim/core/opimxref.cpp b/libopie2/opiepim/core/opimxref.cpp
new file mode 100644
index 0000000..5cae871
--- a/dev/null
+++ b/libopie2/opiepim/core/opimxref.cpp
@@ -0,0 +1,47 @@
1#include "opimxref.h"
2
3OPimXRef::OPimXRef( const OPimXRefPartner& one, const OPimXRefPartner& two )
4 : m_partners(2)
5{
6 m_partners[0] = one;
7 m_partners[1] = two;
8}
9OPimXRef::OPimXRef()
10 : m_partners(2)
11{
12
13}
14OPimXRef::OPimXRef( const OPimXRef& ref) {
15 *this = ref;
16}
17OPimXRef::~OPimXRef() {
18}
19OPimXRef &OPimXRef::operator=( const OPimXRef& ref) {
20 m_partners = ref.m_partners;
21 m_partners.detach();
22
23 return* this;
24}
25bool OPimXRef::operator==( const OPimXRef& oper ) {
26 if ( m_partners == oper.m_partners ) return true;
27
28 return false;
29}
30OPimXRefPartner OPimXRef::partner( enum Partners par) const{
31 return m_partners[par];
32}
33void OPimXRef::setPartner( enum Partners par, const OPimXRefPartner& part) {
34 m_partners[par] = part;
35}
36bool OPimXRef::containsString( const QString& string ) const{
37 if ( m_partners[One].appName() == string ||
38 m_partners[Two].appName() == string ) return true;
39
40 return false;
41}
42bool OPimXRef::containsUid( int uid ) const{
43 if ( m_partners[One].uid() == uid ||
44 m_partners[Two].uid() == uid ) return true;
45
46 return false;
47}
diff --git a/libopie2/opiepim/core/opimxref.h b/libopie2/opiepim/core/opimxref.h
index 72154ac..354739a 100644
--- a/libopie2/opiepim/core/opimxref.h
+++ b/libopie2/opiepim/core/opimxref.h
@@ -1,36 +1,39 @@
1#ifndef OPIM_XREF_H 1#ifndef OPIM_XREF_H
2#define OPIM_XREF_H 2#define OPIM_XREF_H
3 3
4#include <qarray.h> 4#include <qarray.h>
5#include <qvaluelist.h> 5#include <qvaluelist.h>
6 6
7#include <opie/opimxrefpartner.h> 7#include <opie/opimxrefpartner.h>
8 8
9/** 9/**
10 * this is a Cross Referecne between 10 * this is a Cross Referecne between
11 * two Cross Reference Partners 11 * two Cross Reference Partners
12 */ 12 */
13class OPimXRef { 13class OPimXRef {
14public: 14public:
15 typedef QValueList<OPimXRef> ValueList; 15 typedef QValueList<OPimXRef> ValueList;
16 enum Partners { One, Two }; 16 enum Partners { One, Two };
17 OPimXRef( const OPimXRefPartner& ONE, const OPimXRefPartner& ); 17 OPimXRef( const OPimXRefPartner& ONE, const OPimXRefPartner& );
18 OPimXRef(); 18 OPimXRef();
19 OPimXRef( const OPimXRef& ); 19 OPimXRef( const OPimXRef& );
20 ~OPimXRef(); 20 ~OPimXRef();
21 21
22 OPimXRef &operator=( const OPimXRef& ); 22 OPimXRef &operator=( const OPimXRef& );
23 bool operator==( const OPimXRef ); 23 bool operator==( const OPimXRef& );
24 24
25 OPimXRefPartner partner( enum Partners ); 25 OPimXRefPartner partner( enum Partners )const;
26 26
27 void setPartner( enum Partners, const OPimXRefPartner& ); 27 void setPartner( enum Partners, const OPimXRefPartner& );
28 28
29 bool containsString( const QString& appName)const;
30 bool containsUid( int uid )const;
31
29private: 32private:
30 QArray<OPimXRefPartner> m_partners; 33 QArray<OPimXRefPartner> m_partners;
31 34
32 class Private; 35 class Private;
33 Private *d; 36 Private *d;
34}; 37};
35 38
36#endif 39#endif
diff --git a/libopie2/opiepim/core/opimxrefmanager.cpp b/libopie2/opiepim/core/opimxrefmanager.cpp
new file mode 100644
index 0000000..d49f5f5
--- a/dev/null
+++ b/libopie2/opiepim/core/opimxrefmanager.cpp
@@ -0,0 +1,69 @@
1#include "opimxrefmanager.h"
2
3
4OPimXRefManager::OPimXRefManager() {
5}
6OPimXRefManager::OPimXRefManager( const OPimXRefManager& ref) {
7 m_list = ref.m_list;
8}
9OPimXRefManager &OPimXRefManager::operator=( const OPimXRefManager& ref) {
10 m_list = ref.m_list;
11 return *this;
12}
13bool OPimXRefManager::operator==( const OPimXRefManager& /*ref*/) {
14 // if ( m_list == ref.m_list ) return true;
15
16 return false;
17}
18void OPimXRefManager::add( const OPimXRef& ref) {
19 m_list.append( ref );
20}
21void OPimXRefManager::remove( const OPimXRef& ref) {
22 m_list.remove( ref );
23}
24void OPimXRefManager::replace( const OPimXRef& ref) {
25 m_list.remove( ref );
26 m_list.append( ref );
27}
28void OPimXRefManager::clear() {
29 m_list.clear();
30}
31QStringList OPimXRefManager::apps()const {
32 OPimXRef::ValueList::ConstIterator it;
33 QStringList list;
34
35 QString str;
36 for ( it = m_list.begin(); it != m_list.end(); ++it ) {
37 str = (*it).partner( OPimXRef::One ).appName();
38 if ( !list.contains( str ) ) list << str;
39
40 str = (*it).partner( OPimXRef::Two ).appName();
41 if ( !list.contains( str ) ) list << str;
42 }
43 return list;
44}
45OPimXRef::ValueList OPimXRefManager::list()const {
46 return m_list;
47}
48OPimXRef::ValueList OPimXRefManager::list( const QString& appName )const{
49 OPimXRef::ValueList list;
50 OPimXRef::ValueList::ConstIterator it;
51
52 for ( it = m_list.begin(); it != m_list.end(); ++it ) {
53 if ( (*it).containsString( appName ) )
54 list.append( (*it) );
55 }
56
57 return list;
58}
59OPimXRef::ValueList OPimXRefManager::list( int uid )const {
60 OPimXRef::ValueList list;
61 OPimXRef::ValueList::ConstIterator it;
62
63 for ( it = m_list.begin(); it != m_list.end(); ++it ) {
64 if ( (*it).containsUid( uid ) )
65 list.append( (*it) );
66 }
67
68 return list;
69}
diff --git a/libopie2/opiepim/core/opimxrefmanager.h b/libopie2/opiepim/core/opimxrefmanager.h
index 147895d..9b003a3 100644
--- a/libopie2/opiepim/core/opimxrefmanager.h
+++ b/libopie2/opiepim/core/opimxrefmanager.h
@@ -1,36 +1,41 @@
1#ifndef OPIM_XREF_MANAGER_H 1#ifndef OPIM_XREF_MANAGER_H
2#define OPIM_XREF_MANAGER_H 2#define OPIM_XREF_MANAGER_H
3 3
4#include <qstringlist.h>
5
4#include <opie/opimxref.h> 6#include <opie/opimxref.h>
5 7
6/** 8/**
7 * This is a simple manager for 9 * This is a simple manager for
8 * OPimXRefs. 10 * OPimXRefs.
9 * It allows addition, removing, replacing 11 * It allows addition, removing, replacing
10 * clearing and 'querying' the XRef... 12 * clearing and 'querying' the XRef...
11 */ 13 */
12class OPimXRefManager { 14class OPimXRefManager {
13public: 15public:
14 OPimXRefManager(); 16 OPimXRefManager();
15 OPimXRefManager( const OPimXRefManager& ); 17 OPimXRefManager( const OPimXRefManager& );
16 ~OPimXRefManager(); 18 ~OPimXRefManager();
17 19
18 OPimXRefManager& operator=( const OPimXRefManager& ); 20 OPimXRefManager& operator=( const OPimXRefManager& );
19 bool operator==( const OPimXRefManager& ); 21 bool operator==( const OPimXRefManager& );
20 22
21 void add( const OPimXRef& ); 23 void add( const OPimXRef& );
22 void remove( const OPimXRef& ); 24 void remove( const OPimXRef& );
23 void replace( const OPimXRef& ); 25 void replace( const OPimXRef& );
24 26
25 void clear(); 27 void clear();
26 28
27 /** 29 /**
28 * apps participating 30 * apps participating
29 */ 31 */
30 QStringList apps()const; 32 QStringList apps()const;
31 OPimXRef::ValueList list()const; 33 OPimXRef::ValueList list()const;
32 OPimXRef::ValueList list( const QString& appName )const; 34 OPimXRef::ValueList list( const QString& appName )const;
33 OPimXRef::ValueList list( int uid )const; 35 OPimXRef::ValueList list( int uid )const;
36
37private:
38 OPimXRef::ValueList m_list;
34}; 39};
35 40
36#endif 41#endif
diff --git a/libopie2/opiepim/core/opimxrefpartner.cpp b/libopie2/opiepim/core/opimxrefpartner.cpp
new file mode 100644
index 0000000..028f4e6
--- a/dev/null
+++ b/libopie2/opiepim/core/opimxrefpartner.cpp
@@ -0,0 +1,43 @@
1#include "opimxrefpartner.h"
2
3OPimXRefPartner::OPimXRefPartner( const QString& appName,
4 int uid, int field )
5 : m_app(appName), m_uid(uid), m_field( field ) {
6}
7OPimXRefPartner::OPimXRefPartner( const OPimXRefPartner& ref ) {
8 *this = ref;
9}
10OPimXRefPartner::~OPimXRefPartner() {
11}
12OPimXRefPartner &OPimXRefPartner::operator=( const OPimXRefPartner& par ) {
13 m_app = par.m_app;
14 m_uid = par.m_uid;
15 m_field = par.m_field;
16
17 return *this;
18}
19bool OPimXRefPartner::operator==( const OPimXRefPartner& par ) {
20 if ( m_app != par.m_app ) return false;
21 if ( m_uid != par.m_uid ) return false;
22 if ( m_field != par.m_field ) return false;
23
24 return true;
25}
26QString OPimXRefPartner::appName()const {
27 return m_app;
28}
29int OPimXRefPartner::uid()const {
30 return m_uid;
31}
32int OPimXRefPartner::field()const {
33 return m_field;
34}
35void OPimXRefPartner::setAppName( const QString& appName ) {
36 m_app = appName;
37}
38void OPimXRefPartner::setUid( int uid ) {
39 m_uid = uid;
40}
41void OPimXRefPartner::setField( int field ) {
42 m_field = field;
43}