author | zecke <zecke> | 2003-02-16 22:25:46 (UTC) |
---|---|---|
committer | zecke <zecke> | 2003-02-16 22:25:46 (UTC) |
commit | 4d0e8ffd8518fe24ed94cfcf92eeff666b014094 (patch) (unidiff) | |
tree | 86a0bec752418c409cbc9ad95d6479997dfaf909 /libopie2 | |
parent | 8ecc375c803dc57b160bd0335891fcaf4f6de1df (diff) | |
download | opie-4d0e8ffd8518fe24ed94cfcf92eeff666b014094.zip opie-4d0e8ffd8518fe24ed94cfcf92eeff666b014094.tar.gz opie-4d0e8ffd8518fe24ed94cfcf92eeff666b014094.tar.bz2 |
0000276 Fix for that bug.. or better temp workaround
A Preferred Number is HOME|VOICE
A CellPhone is HOME|VOICE|CELL the type & HOME|VOICE test
triggers both
and the cell phone number overrides the other entries..
as a temp I check that it's not equal to HOME|VOICE|CELL before setting the
number
The right and final fix would be to reorder the if statement to make it
if else based and the less common thing put to the bottom
OTodoAccessVcal fix the date for beaming
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp | 82 | ||||
-rw-r--r-- | libopie2/opiepim/backend/otodoaccessvcal.cpp | 7 |
2 files changed, 54 insertions, 35 deletions
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp index 1dc6b48..622d40a 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp +++ b/libopie2/opiepim/backend/ocontactaccessbackend_vcard.cpp | |||
@@ -1,590 +1,606 @@ | |||
1 | /* | 1 | /* |
2 | * VCard Backend for the OPIE-Contact Database. | 2 | * VCard Backend for the OPIE-Contact Database. |
3 | * | 3 | * |
4 | * Copyright (C) 2000 Trolltech AS. All rights reserved. | 4 | * Copyright (C) 2000 Trolltech AS. All rights reserved. |
5 | * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) | 5 | * Copyright (c) 2002 by Stefan Eilers (Eilers.Stefan@epost.de) |
6 | * | 6 | * |
7 | * ===================================================================== | 7 | * ===================================================================== |
8 | *This program is free software; you can redistribute it and/or | 8 | *This program is free software; you can redistribute it and/or |
9 | *modify it under the terms of the GNU Library General Public | 9 | *modify it under the terms of the GNU Library General Public |
10 | * License as published by the Free Software Foundation; either | 10 | * License as published by the Free Software Foundation; either |
11 | * version 2 of the License, or (at your option) any later version. | 11 | * version 2 of the License, or (at your option) any later version. |
12 | * ===================================================================== | 12 | * ===================================================================== |
13 | * ToDo: | 13 | * ToDo: |
14 | * | 14 | * |
15 | * ===================================================================== | 15 | * ===================================================================== |
16 | * Version: $Id$ | 16 | * Version: $Id$ |
17 | * ===================================================================== | 17 | * ===================================================================== |
18 | * History: | 18 | * History: |
19 | * $Log$ | 19 | * $Log$ |
20 | * Revision 1.7 2003/02/16 22:25:46 zecke | ||
21 | * 0000276 Fix for that bug.. or better temp workaround | ||
22 | * A Preferred Number is HOME|VOICE | ||
23 | * A CellPhone is HOME|VOICE|CELL the type & HOME|VOICE test | ||
24 | * triggers both | ||
25 | * and the cell phone number overrides the other entries.. | ||
26 | * | ||
27 | * as a temp I check that it's not equal to HOME|VOICE|CELL before setting the | ||
28 | * number | ||
29 | * | ||
30 | * The right and final fix would be to reorder the if statement to make it | ||
31 | * if else based and the less common thing put to the bottom | ||
32 | * | ||
33 | * OTodoAccessVcal fix the date for beaming | ||
34 | * | ||
20 | * Revision 1.6 2003/01/13 15:49:31 eilers | 35 | * Revision 1.6 2003/01/13 15:49:31 eilers |
21 | * Fixing crash when businesscard.vcf is missing.. | 36 | * Fixing crash when businesscard.vcf is missing.. |
22 | * | 37 | * |
23 | * Revision 1.5 2002/12/07 13:26:22 eilers | 38 | * Revision 1.5 2002/12/07 13:26:22 eilers |
24 | * Fixing bug in storing anniversary.. | 39 | * Fixing bug in storing anniversary.. |
25 | * | 40 | * |
26 | * Revision 1.4 2002/11/13 14:14:51 eilers | 41 | * Revision 1.4 2002/11/13 14:14:51 eilers |
27 | * Added sorted for Contacts.. | 42 | * Added sorted for Contacts.. |
28 | * | 43 | * |
29 | * Revision 1.3 2002/11/11 16:41:09 kergoth | 44 | * Revision 1.3 2002/11/11 16:41:09 kergoth |
30 | * no default arguments in implementation | 45 | * no default arguments in implementation |
31 | * | 46 | * |
32 | * Revision 1.2 2002/11/10 15:41:53 eilers | 47 | * Revision 1.2 2002/11/10 15:41:53 eilers |
33 | * Bugfixes.. | 48 | * Bugfixes.. |
34 | * | 49 | * |
35 | * Revision 1.1 2002/11/09 14:34:52 eilers | 50 | * Revision 1.1 2002/11/09 14:34:52 eilers |
36 | * Added VCard Backend. | 51 | * Added VCard Backend. |
37 | * | 52 | * |
38 | */ | 53 | */ |
39 | #include "ocontactaccessbackend_vcard.h" | 54 | #include "ocontactaccessbackend_vcard.h" |
40 | #include "../../library/backend/vobject_p.h" | 55 | #include "../../library/backend/vobject_p.h" |
41 | #include "../../library/backend/qfiledirect_p.h" | 56 | #include "../../library/backend/qfiledirect_p.h" |
42 | 57 | ||
43 | #include <qpe/timeconversion.h> | 58 | #include <qpe/timeconversion.h> |
44 | 59 | ||
45 | #include <qfile.h> | 60 | #include <qfile.h> |
46 | 61 | ||
47 | OContactAccessBackend_VCard::OContactAccessBackend_VCard ( QString , QString filename ): | 62 | OContactAccessBackend_VCard::OContactAccessBackend_VCard ( QString , QString filename ): |
48 | m_dirty( false ), | 63 | m_dirty( false ), |
49 | m_file( filename ) | 64 | m_file( filename ) |
50 | { | 65 | { |
51 | load(); | 66 | load(); |
52 | } | 67 | } |
53 | 68 | ||
54 | 69 | ||
55 | bool OContactAccessBackend_VCard::load () | 70 | bool OContactAccessBackend_VCard::load () |
56 | { | 71 | { |
57 | m_map.clear(); | 72 | m_map.clear(); |
58 | m_dirty = false; | 73 | m_dirty = false; |
59 | 74 | ||
60 | VObject* obj = 0l; | 75 | VObject* obj = 0l; |
61 | 76 | ||
62 | if ( QFile( m_file ).exists() ){ | 77 | if ( QFile( m_file ).exists() ){ |
63 | obj = Parse_MIME_FromFileName( QFile::encodeName(m_file).data() ); | 78 | obj = Parse_MIME_FromFileName( QFile::encodeName(m_file).data() ); |
64 | if ( !obj ) | 79 | if ( !obj ) |
65 | return false; | 80 | return false; |
66 | }else{ | 81 | }else{ |
67 | qWarning("File \"%s\" not found !", m_file.latin1() ); | 82 | qWarning("File \"%s\" not found !", m_file.latin1() ); |
68 | return false; | 83 | return false; |
69 | } | 84 | } |
70 | 85 | ||
71 | while ( obj ) { | 86 | while ( obj ) { |
72 | OContact con = parseVObject( obj ); | 87 | OContact con = parseVObject( obj ); |
73 | /* | 88 | /* |
74 | * if uid is 0 assign a new one | 89 | * if uid is 0 assign a new one |
75 | * this at least happens on | 90 | * this at least happens on |
76 | * Nokia6210 | 91 | * Nokia6210 |
77 | */ | 92 | */ |
78 | if ( con.uid() == 0 ){ | 93 | if ( con.uid() == 0 ){ |
79 | con.setUid( 1 ); | 94 | con.setUid( 1 ); |
80 | qWarning("assigned new uid %d",con.uid() ); | 95 | qWarning("assigned new uid %d",con.uid() ); |
81 | } | 96 | } |
82 | 97 | ||
83 | m_map.insert( con.uid(), con ); | 98 | m_map.insert( con.uid(), con ); |
84 | 99 | ||
85 | VObject *t = obj; | 100 | VObject *t = obj; |
86 | obj = nextVObjectInList(obj); | 101 | obj = nextVObjectInList(obj); |
87 | cleanVObject( t ); | 102 | cleanVObject( t ); |
88 | } | 103 | } |
89 | 104 | ||
90 | return true; | 105 | return true; |
91 | 106 | ||
92 | } | 107 | } |
93 | bool OContactAccessBackend_VCard::reload() | 108 | bool OContactAccessBackend_VCard::reload() |
94 | { | 109 | { |
95 | return load(); | 110 | return load(); |
96 | } | 111 | } |
97 | bool OContactAccessBackend_VCard::save() | 112 | bool OContactAccessBackend_VCard::save() |
98 | { | 113 | { |
99 | if (!m_dirty ) | 114 | if (!m_dirty ) |
100 | return true; | 115 | return true; |
101 | 116 | ||
102 | QFileDirect file( m_file ); | 117 | QFileDirect file( m_file ); |
103 | if (!file.open(IO_WriteOnly ) ) | 118 | if (!file.open(IO_WriteOnly ) ) |
104 | return false; | 119 | return false; |
105 | 120 | ||
106 | VObject *obj; | 121 | VObject *obj; |
107 | obj = newVObject( VCCalProp ); | 122 | obj = newVObject( VCCalProp ); |
108 | addPropValue( obj, VCVersionProp, "1.0" ); | 123 | addPropValue( obj, VCVersionProp, "1.0" ); |
109 | 124 | ||
110 | VObject *vo; | 125 | VObject *vo; |
111 | for(QMap<int, OContact>::ConstIterator it=m_map.begin(); it !=m_map.end(); ++it ){ | 126 | for(QMap<int, OContact>::ConstIterator it=m_map.begin(); it !=m_map.end(); ++it ){ |
112 | vo = createVObject( *it ); | 127 | vo = createVObject( *it ); |
113 | writeVObject( file.directHandle() , vo ); | 128 | writeVObject( file.directHandle() , vo ); |
114 | cleanVObject( vo ); | 129 | cleanVObject( vo ); |
115 | } | 130 | } |
116 | cleanStrTbl(); | 131 | cleanStrTbl(); |
117 | 132 | ||
118 | m_dirty = false; | 133 | m_dirty = false; |
119 | return true; | 134 | return true; |
120 | 135 | ||
121 | 136 | ||
122 | } | 137 | } |
123 | void OContactAccessBackend_VCard::clear () | 138 | void OContactAccessBackend_VCard::clear () |
124 | { | 139 | { |
125 | m_map.clear(); | 140 | m_map.clear(); |
126 | m_dirty = true; // ??? sure ? (se) | 141 | m_dirty = true; // ??? sure ? (se) |
127 | } | 142 | } |
128 | 143 | ||
129 | bool OContactAccessBackend_VCard::add ( const OContact& newcontact ) | 144 | bool OContactAccessBackend_VCard::add ( const OContact& newcontact ) |
130 | { | 145 | { |
131 | m_map.insert( newcontact.uid(), newcontact ); | 146 | m_map.insert( newcontact.uid(), newcontact ); |
132 | m_dirty = true; | 147 | m_dirty = true; |
133 | return true; | 148 | return true; |
134 | } | 149 | } |
135 | 150 | ||
136 | bool OContactAccessBackend_VCard::remove ( int uid ) | 151 | bool OContactAccessBackend_VCard::remove ( int uid ) |
137 | { | 152 | { |
138 | m_map.remove( uid ); | 153 | m_map.remove( uid ); |
139 | m_dirty = true; | 154 | m_dirty = true; |
140 | return true; | 155 | return true; |
141 | } | 156 | } |
142 | 157 | ||
143 | bool OContactAccessBackend_VCard::replace ( const OContact &contact ) | 158 | bool OContactAccessBackend_VCard::replace ( const OContact &contact ) |
144 | { | 159 | { |
145 | m_map.replace( contact.uid(), contact ); | 160 | m_map.replace( contact.uid(), contact ); |
146 | m_dirty = true; | 161 | m_dirty = true; |
147 | return true; | 162 | return true; |
148 | } | 163 | } |
149 | 164 | ||
150 | OContact OContactAccessBackend_VCard::find ( int uid ) const | 165 | OContact OContactAccessBackend_VCard::find ( int uid ) const |
151 | { | 166 | { |
152 | return m_map[uid]; | 167 | return m_map[uid]; |
153 | } | 168 | } |
154 | 169 | ||
155 | QArray<int> OContactAccessBackend_VCard::allRecords() const | 170 | QArray<int> OContactAccessBackend_VCard::allRecords() const |
156 | { | 171 | { |
157 | QArray<int> ar( m_map.count() ); | 172 | QArray<int> ar( m_map.count() ); |
158 | QMap<int, OContact>::ConstIterator it; | 173 | QMap<int, OContact>::ConstIterator it; |
159 | int i = 0; | 174 | int i = 0; |
160 | for ( it = m_map.begin(); it != m_map.end(); ++it ) { | 175 | for ( it = m_map.begin(); it != m_map.end(); ++it ) { |
161 | ar[i] = it.key(); | 176 | ar[i] = it.key(); |
162 | i++; | 177 | i++; |
163 | } | 178 | } |
164 | return ar; | 179 | return ar; |
165 | } | 180 | } |
166 | 181 | ||
167 | // Not implemented | 182 | // Not implemented |
168 | QArray<int> OContactAccessBackend_VCard::queryByExample ( const OContact&, int ) | 183 | QArray<int> OContactAccessBackend_VCard::queryByExample ( const OContact&, int ) |
169 | { | 184 | { |
170 | QArray<int> ar(0); | 185 | QArray<int> ar(0); |
171 | return ar; | 186 | return ar; |
172 | } | 187 | } |
173 | 188 | ||
174 | // Not implemented | 189 | // Not implemented |
175 | QArray<int> OContactAccessBackend_VCard::matchRegexp( const QRegExp& ) const | 190 | QArray<int> OContactAccessBackend_VCard::matchRegexp( const QRegExp& ) const |
176 | { | 191 | { |
177 | QArray<int> ar(0); | 192 | QArray<int> ar(0); |
178 | return ar; | 193 | return ar; |
179 | } | 194 | } |
180 | 195 | ||
181 | const uint OContactAccessBackend_VCard::querySettings() | 196 | const uint OContactAccessBackend_VCard::querySettings() |
182 | { | 197 | { |
183 | return 0; // No search possible | 198 | return 0; // No search possible |
184 | } | 199 | } |
185 | 200 | ||
186 | bool OContactAccessBackend_VCard::hasQuerySettings (uint ) const | 201 | bool OContactAccessBackend_VCard::hasQuerySettings (uint ) const |
187 | { | 202 | { |
188 | return false; // No search possible, therefore all settings invalid ;) | 203 | return false; // No search possible, therefore all settings invalid ;) |
189 | } | 204 | } |
190 | 205 | ||
191 | bool OContactAccessBackend_VCard::wasChangedExternally() | 206 | bool OContactAccessBackend_VCard::wasChangedExternally() |
192 | { | 207 | { |
193 | return false; // Don't expect concurrent access | 208 | return false; // Don't expect concurrent access |
194 | } | 209 | } |
195 | 210 | ||
196 | // Not implemented | 211 | // Not implemented |
197 | QArray<int> OContactAccessBackend_VCard::sorted( bool , int, int, int ) | 212 | QArray<int> OContactAccessBackend_VCard::sorted( bool , int, int, int ) |
198 | { | 213 | { |
199 | QArray<int> ar(0); | 214 | QArray<int> ar(0); |
200 | return ar; | 215 | return ar; |
201 | } | 216 | } |
202 | 217 | ||
203 | // *** Private stuff *** | 218 | // *** Private stuff *** |
204 | 219 | ||
205 | 220 | ||
206 | OContact OContactAccessBackend_VCard::parseVObject( VObject *obj ) | 221 | OContact OContactAccessBackend_VCard::parseVObject( VObject *obj ) |
207 | { | 222 | { |
208 | OContact c; | 223 | OContact c; |
209 | 224 | ||
210 | VObjectIterator it; | 225 | VObjectIterator it; |
211 | initPropIterator( &it, obj ); | 226 | initPropIterator( &it, obj ); |
212 | while( moreIteration( &it ) ) { | 227 | while( moreIteration( &it ) ) { |
213 | VObject *o = nextVObject( &it ); | 228 | VObject *o = nextVObject( &it ); |
214 | QCString name = vObjectName( o ); | 229 | QCString name = vObjectName( o ); |
215 | QCString value = vObjectStringZValue( o ); | 230 | QCString value = vObjectStringZValue( o ); |
216 | if ( name == VCNameProp ) { | 231 | if ( name == VCNameProp ) { |
217 | VObjectIterator nit; | 232 | VObjectIterator nit; |
218 | initPropIterator( &nit, o ); | 233 | initPropIterator( &nit, o ); |
219 | while( moreIteration( &nit ) ) { | 234 | while( moreIteration( &nit ) ) { |
220 | VObject *o = nextVObject( &nit ); | 235 | VObject *o = nextVObject( &nit ); |
221 | QCString name = vObjectTypeInfo( o ); | 236 | QCString name = vObjectTypeInfo( o ); |
222 | QString value = vObjectStringZValue( o ); | 237 | QString value = vObjectStringZValue( o ); |
223 | if ( name == VCNamePrefixesProp ) | 238 | if ( name == VCNamePrefixesProp ) |
224 | c.setTitle( value ); | 239 | c.setTitle( value ); |
225 | else if ( name == VCNameSuffixesProp ) | 240 | else if ( name == VCNameSuffixesProp ) |
226 | c.setSuffix( value ); | 241 | c.setSuffix( value ); |
227 | else if ( name == VCFamilyNameProp ) | 242 | else if ( name == VCFamilyNameProp ) |
228 | c.setLastName( value ); | 243 | c.setLastName( value ); |
229 | else if ( name == VCGivenNameProp ) | 244 | else if ( name == VCGivenNameProp ) |
230 | c.setFirstName( value ); | 245 | c.setFirstName( value ); |
231 | else if ( name == VCAdditionalNamesProp ) | 246 | else if ( name == VCAdditionalNamesProp ) |
232 | c.setMiddleName( value ); | 247 | c.setMiddleName( value ); |
233 | } | 248 | } |
234 | } | 249 | } |
235 | else if ( name == VCAdrProp ) { | 250 | else if ( name == VCAdrProp ) { |
236 | bool work = TRUE; // default address is work address | 251 | bool work = TRUE; // default address is work address |
237 | QString street; | 252 | QString street; |
238 | QString city; | 253 | QString city; |
239 | QString region; | 254 | QString region; |
240 | QString postal; | 255 | QString postal; |
241 | QString country; | 256 | QString country; |
242 | 257 | ||
243 | VObjectIterator nit; | 258 | VObjectIterator nit; |
244 | initPropIterator( &nit, o ); | 259 | initPropIterator( &nit, o ); |
245 | while( moreIteration( &nit ) ) { | 260 | while( moreIteration( &nit ) ) { |
246 | VObject *o = nextVObject( &nit ); | 261 | VObject *o = nextVObject( &nit ); |
247 | QCString name = vObjectName( o ); | 262 | QCString name = vObjectName( o ); |
248 | QString value = vObjectStringZValue( o ); | 263 | QString value = vObjectStringZValue( o ); |
249 | if ( name == VCHomeProp ) | 264 | if ( name == VCHomeProp ) |
250 | work = FALSE; | 265 | work = FALSE; |
251 | else if ( name == VCWorkProp ) | 266 | else if ( name == VCWorkProp ) |
252 | work = TRUE; | 267 | work = TRUE; |
253 | else if ( name == VCStreetAddressProp ) | 268 | else if ( name == VCStreetAddressProp ) |
254 | street = value; | 269 | street = value; |
255 | else if ( name == VCCityProp ) | 270 | else if ( name == VCCityProp ) |
256 | city = value; | 271 | city = value; |
257 | else if ( name == VCRegionProp ) | 272 | else if ( name == VCRegionProp ) |
258 | region = value; | 273 | region = value; |
259 | else if ( name == VCPostalCodeProp ) | 274 | else if ( name == VCPostalCodeProp ) |
260 | postal = value; | 275 | postal = value; |
261 | else if ( name == VCCountryNameProp ) | 276 | else if ( name == VCCountryNameProp ) |
262 | country = value; | 277 | country = value; |
263 | } | 278 | } |
264 | if ( work ) { | 279 | if ( work ) { |
265 | c.setBusinessStreet( street ); | 280 | c.setBusinessStreet( street ); |
266 | c.setBusinessCity( city ); | 281 | c.setBusinessCity( city ); |
267 | c.setBusinessCountry( country ); | 282 | c.setBusinessCountry( country ); |
268 | c.setBusinessZip( postal ); | 283 | c.setBusinessZip( postal ); |
269 | c.setBusinessState( region ); | 284 | c.setBusinessState( region ); |
270 | } else { | 285 | } else { |
271 | c.setHomeStreet( street ); | 286 | c.setHomeStreet( street ); |
272 | c.setHomeCity( city ); | 287 | c.setHomeCity( city ); |
273 | c.setHomeCountry( country ); | 288 | c.setHomeCountry( country ); |
274 | c.setHomeZip( postal ); | 289 | c.setHomeZip( postal ); |
275 | c.setHomeState( region ); | 290 | c.setHomeState( region ); |
276 | } | 291 | } |
277 | } | 292 | } |
278 | else if ( name == VCTelephoneProp ) { | 293 | else if ( name == VCTelephoneProp ) { |
279 | enum { | 294 | enum { |
280 | HOME = 0x01, | 295 | HOME = 0x01, |
281 | WORK = 0x02, | 296 | WORK = 0x02, |
282 | VOICE = 0x04, | 297 | VOICE = 0x04, |
283 | CELL = 0x08, | 298 | CELL = 0x08, |
284 | FAX = 0x10, | 299 | FAX = 0x10, |
285 | PAGER = 0x20, | 300 | PAGER = 0x20, |
286 | UNKNOWN = 0x80 | 301 | UNKNOWN = 0x80 |
287 | }; | 302 | }; |
288 | int type = 0; | 303 | int type = 0; |
289 | 304 | ||
290 | VObjectIterator nit; | 305 | VObjectIterator nit; |
291 | initPropIterator( &nit, o ); | 306 | initPropIterator( &nit, o ); |
292 | while( moreIteration( &nit ) ) { | 307 | while( moreIteration( &nit ) ) { |
293 | VObject *o = nextVObject( &nit ); | 308 | VObject *o = nextVObject( &nit ); |
294 | QCString name = vObjectTypeInfo( o ); | 309 | QCString name = vObjectTypeInfo( o ); |
295 | if ( name == VCHomeProp ) | 310 | if ( name == VCHomeProp ) |
296 | type |= HOME; | 311 | type |= HOME; |
297 | else if ( name == VCWorkProp ) | 312 | else if ( name == VCWorkProp ) |
298 | type |= WORK; | 313 | type |= WORK; |
299 | else if ( name == VCVoiceProp ) | 314 | else if ( name == VCVoiceProp ) |
300 | type |= VOICE; | 315 | type |= VOICE; |
301 | else if ( name == VCCellularProp ) | 316 | else if ( name == VCCellularProp ) |
302 | type |= CELL; | 317 | type |= CELL; |
303 | else if ( name == VCFaxProp ) | 318 | else if ( name == VCFaxProp ) |
304 | type |= FAX; | 319 | type |= FAX; |
305 | else if ( name == VCPagerProp ) | 320 | else if ( name == VCPagerProp ) |
306 | type |= PAGER; | 321 | type |= PAGER; |
307 | else if ( name == VCPreferredProp ) | 322 | else if ( name == VCPreferredProp ) |
308 | ; | 323 | ; |
309 | else | 324 | else |
310 | type |= UNKNOWN; | 325 | type |= UNKNOWN; |
311 | } | 326 | } |
312 | if ( (type & UNKNOWN) != UNKNOWN ) { | 327 | if ( (type & UNKNOWN) != UNKNOWN ) { |
313 | if ( ( type & (HOME|WORK) ) == 0 ) // default | 328 | if ( ( type & (HOME|WORK) ) == 0 ) // default |
314 | type |= HOME; | 329 | type |= HOME; |
315 | if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default | 330 | if ( ( type & (VOICE|CELL|FAX|PAGER) ) == 0 ) // default |
316 | type |= VOICE; | 331 | type |= VOICE; |
317 | 332 | ||
318 | if ( (type & (VOICE|HOME) ) == (VOICE|HOME) ) | 333 | qWarning("value %s %d", value.data(), type ); |
334 | if ( (type & (VOICE|HOME) ) == (VOICE|HOME) && (type & (CELL|HOME) ) != (CELL|HOME) ) | ||
319 | c.setHomePhone( value ); | 335 | c.setHomePhone( value ); |
320 | if ( ( type & (FAX|HOME) ) == (FAX|HOME) ) | 336 | if ( ( type & (FAX|HOME) ) == (FAX|HOME) ) |
321 | c.setHomeFax( value ); | 337 | c.setHomeFax( value ); |
322 | if ( ( type & (CELL|HOME) ) == (CELL|HOME) ) | 338 | if ( ( type & (CELL|HOME) ) == (CELL|HOME) ) |
323 | c.setHomeMobile( value ); | 339 | c.setHomeMobile( value ); |
324 | if ( ( type & (VOICE|WORK) ) == (VOICE|WORK) ) | 340 | if ( ( type & (VOICE|WORK) ) == (VOICE|WORK) && (type & (CELL|WORK) ) != (CELL|WORK) ) |
325 | c.setBusinessPhone( value ); | 341 | c.setBusinessPhone( value ); |
326 | if ( ( type & (FAX|WORK) ) == (FAX|WORK) ) | 342 | if ( ( type & (FAX|WORK) ) == (FAX|WORK) ) |
327 | c.setBusinessFax( value ); | 343 | c.setBusinessFax( value ); |
328 | if ( ( type & (CELL|WORK) ) == (CELL|WORK) ) | 344 | if ( ( type & (CELL|WORK) ) == (CELL|WORK) ) |
329 | c.setBusinessMobile( value ); | 345 | c.setBusinessMobile( value ); |
330 | if ( ( type & (PAGER|WORK) ) == (PAGER|WORK) ) | 346 | if ( ( type & (PAGER|WORK) ) == (PAGER|WORK) ) |
331 | c.setBusinessPager( value ); | 347 | c.setBusinessPager( value ); |
332 | } | 348 | } |
333 | } | 349 | } |
334 | else if ( name == VCEmailAddressProp ) { | 350 | else if ( name == VCEmailAddressProp ) { |
335 | QString email = vObjectStringZValue( o ); | 351 | QString email = vObjectStringZValue( o ); |
336 | bool valid = TRUE; | 352 | bool valid = TRUE; |
337 | VObjectIterator nit; | 353 | VObjectIterator nit; |
338 | initPropIterator( &nit, o ); | 354 | initPropIterator( &nit, o ); |
339 | while( moreIteration( &nit ) ) { | 355 | while( moreIteration( &nit ) ) { |
340 | VObject *o = nextVObject( &nit ); | 356 | VObject *o = nextVObject( &nit ); |
341 | QCString name = vObjectTypeInfo( o ); | 357 | QCString name = vObjectTypeInfo( o ); |
342 | if ( name != VCInternetProp && name != VCHomeProp && | 358 | if ( name != VCInternetProp && name != VCHomeProp && |
343 | name != VCWorkProp && | 359 | name != VCWorkProp && |
344 | name != VCPreferredProp ) | 360 | name != VCPreferredProp ) |
345 | // ### preffered should map to default email | 361 | // ### preffered should map to default email |
346 | valid = FALSE; | 362 | valid = FALSE; |
347 | } | 363 | } |
348 | if ( valid ) { | 364 | if ( valid ) { |
349 | c.insertEmail( email ); | 365 | c.insertEmail( email ); |
350 | } | 366 | } |
351 | } | 367 | } |
352 | else if ( name == VCURLProp ) { | 368 | else if ( name == VCURLProp ) { |
353 | VObjectIterator nit; | 369 | VObjectIterator nit; |
354 | initPropIterator( &nit, o ); | 370 | initPropIterator( &nit, o ); |
355 | while( moreIteration( &nit ) ) { | 371 | while( moreIteration( &nit ) ) { |
356 | VObject *o = nextVObject( &nit ); | 372 | VObject *o = nextVObject( &nit ); |
357 | QCString name = vObjectTypeInfo( o ); | 373 | QCString name = vObjectTypeInfo( o ); |
358 | if ( name == VCHomeProp ) | 374 | if ( name == VCHomeProp ) |
359 | c.setHomeWebpage( value ); | 375 | c.setHomeWebpage( value ); |
360 | else if ( name == VCWorkProp ) | 376 | else if ( name == VCWorkProp ) |
361 | c.setBusinessWebpage( value ); | 377 | c.setBusinessWebpage( value ); |
362 | } | 378 | } |
363 | } | 379 | } |
364 | else if ( name == VCOrgProp ) { | 380 | else if ( name == VCOrgProp ) { |
365 | VObjectIterator nit; | 381 | VObjectIterator nit; |
366 | initPropIterator( &nit, o ); | 382 | initPropIterator( &nit, o ); |
367 | while( moreIteration( &nit ) ) { | 383 | while( moreIteration( &nit ) ) { |
368 | VObject *o = nextVObject( &nit ); | 384 | VObject *o = nextVObject( &nit ); |
369 | QCString name = vObjectName( o ); | 385 | QCString name = vObjectName( o ); |
370 | QString value = vObjectStringZValue( o ); | 386 | QString value = vObjectStringZValue( o ); |
371 | if ( name == VCOrgNameProp ) | 387 | if ( name == VCOrgNameProp ) |
372 | c.setCompany( value ); | 388 | c.setCompany( value ); |
373 | else if ( name == VCOrgUnitProp ) | 389 | else if ( name == VCOrgUnitProp ) |
374 | c.setDepartment( value ); | 390 | c.setDepartment( value ); |
375 | else if ( name == VCOrgUnit2Prop ) | 391 | else if ( name == VCOrgUnit2Prop ) |
376 | c.setOffice( value ); | 392 | c.setOffice( value ); |
377 | } | 393 | } |
378 | } | 394 | } |
379 | else if ( name == VCTitleProp ) { | 395 | else if ( name == VCTitleProp ) { |
380 | c.setJobTitle( value ); | 396 | c.setJobTitle( value ); |
381 | } | 397 | } |
382 | else if ( name == "X-Qtopia-Profession" ) { | 398 | else if ( name == "X-Qtopia-Profession" ) { |
383 | c.setProfession( value ); | 399 | c.setProfession( value ); |
384 | } | 400 | } |
385 | else if ( name == "X-Qtopia-Manager" ) { | 401 | else if ( name == "X-Qtopia-Manager" ) { |
386 | c.setManager( value ); | 402 | c.setManager( value ); |
387 | } | 403 | } |
388 | else if ( name == "X-Qtopia-Assistant" ) { | 404 | else if ( name == "X-Qtopia-Assistant" ) { |
389 | c.setAssistant( value ); | 405 | c.setAssistant( value ); |
390 | } | 406 | } |
391 | else if ( name == "X-Qtopia-Spouse" ) { | 407 | else if ( name == "X-Qtopia-Spouse" ) { |
392 | c.setSpouse( value ); | 408 | c.setSpouse( value ); |
393 | } | 409 | } |
394 | else if ( name == "X-Qtopia-Gender" ) { | 410 | else if ( name == "X-Qtopia-Gender" ) { |
395 | c.setGender( value ); | 411 | c.setGender( value ); |
396 | } | 412 | } |
397 | else if ( name == "X-Qtopia-Anniversary" ) { | 413 | else if ( name == "X-Qtopia-Anniversary" ) { |
398 | c.setAnniversary( convVCardDateToDate( value ) ); | 414 | c.setAnniversary( convVCardDateToDate( value ) ); |
399 | } | 415 | } |
400 | else if ( name == "X-Qtopia-Nickname" ) { | 416 | else if ( name == "X-Qtopia-Nickname" ) { |
401 | c.setNickname( value ); | 417 | c.setNickname( value ); |
402 | } | 418 | } |
403 | else if ( name == "X-Qtopia-Children" ) { | 419 | else if ( name == "X-Qtopia-Children" ) { |
404 | c.setChildren( value ); | 420 | c.setChildren( value ); |
405 | } | 421 | } |
406 | else if ( name == VCBirthDateProp ) { | 422 | else if ( name == VCBirthDateProp ) { |
407 | // Reading Birthdate regarding RFC 2425 (5.8.4) | 423 | // Reading Birthdate regarding RFC 2425 (5.8.4) |
408 | c.setBirthday( convVCardDateToDate( value ) ); | 424 | c.setBirthday( convVCardDateToDate( value ) ); |
409 | 425 | ||
410 | } | 426 | } |
411 | 427 | ||
412 | #if 0 | 428 | #if 0 |
413 | else { | 429 | else { |
414 | printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) ); | 430 | printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) ); |
415 | VObjectIterator nit; | 431 | VObjectIterator nit; |
416 | initPropIterator( &nit, o ); | 432 | initPropIterator( &nit, o ); |
417 | while( moreIteration( &nit ) ) { | 433 | while( moreIteration( &nit ) ) { |
418 | VObject *o = nextVObject( &nit ); | 434 | VObject *o = nextVObject( &nit ); |
419 | QCString name = vObjectName( o ); | 435 | QCString name = vObjectName( o ); |
420 | QString value = vObjectStringZValue( o ); | 436 | QString value = vObjectStringZValue( o ); |
421 | printf(" subprop: %s = %s\n", name.data(), value.latin1() ); | 437 | printf(" subprop: %s = %s\n", name.data(), value.latin1() ); |
422 | } | 438 | } |
423 | } | 439 | } |
424 | #endif | 440 | #endif |
425 | } | 441 | } |
426 | c.setFileAs(); | 442 | c.setFileAs(); |
427 | return c; | 443 | return c; |
428 | } | 444 | } |
429 | 445 | ||
430 | 446 | ||
431 | VObject* OContactAccessBackend_VCard::createVObject( const OContact &c ) | 447 | VObject* OContactAccessBackend_VCard::createVObject( const OContact &c ) |
432 | { | 448 | { |
433 | VObject *vcard = newVObject( VCCardProp ); | 449 | VObject *vcard = newVObject( VCCardProp ); |
434 | safeAddPropValue( vcard, VCVersionProp, "2.1" ); | 450 | safeAddPropValue( vcard, VCVersionProp, "2.1" ); |
435 | safeAddPropValue( vcard, VCLastRevisedProp, TimeConversion::toISO8601( QDateTime::currentDateTime() ) ); | 451 | safeAddPropValue( vcard, VCLastRevisedProp, TimeConversion::toISO8601( QDateTime::currentDateTime() ) ); |
436 | safeAddPropValue( vcard, VCUniqueStringProp, QString::number(c.uid()) ); | 452 | safeAddPropValue( vcard, VCUniqueStringProp, QString::number(c.uid()) ); |
437 | 453 | ||
438 | // full name | 454 | // full name |
439 | safeAddPropValue( vcard, VCFullNameProp, c.fullName() ); | 455 | safeAddPropValue( vcard, VCFullNameProp, c.fullName() ); |
440 | 456 | ||
441 | // name properties | 457 | // name properties |
442 | VObject *name = safeAddProp( vcard, VCNameProp ); | 458 | VObject *name = safeAddProp( vcard, VCNameProp ); |
443 | safeAddPropValue( name, VCFamilyNameProp, c.lastName() ); | 459 | safeAddPropValue( name, VCFamilyNameProp, c.lastName() ); |
444 | safeAddPropValue( name, VCGivenNameProp, c.firstName() ); | 460 | safeAddPropValue( name, VCGivenNameProp, c.firstName() ); |
445 | safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() ); | 461 | safeAddPropValue( name, VCAdditionalNamesProp, c.middleName() ); |
446 | safeAddPropValue( name, VCNamePrefixesProp, c.title() ); | 462 | safeAddPropValue( name, VCNamePrefixesProp, c.title() ); |
447 | safeAddPropValue( name, VCNameSuffixesProp, c.suffix() ); | 463 | safeAddPropValue( name, VCNameSuffixesProp, c.suffix() ); |
448 | 464 | ||
449 | // home properties | 465 | // home properties |
450 | VObject *home_adr= safeAddProp( vcard, VCAdrProp ); | 466 | VObject *home_adr= safeAddProp( vcard, VCAdrProp ); |
451 | safeAddProp( home_adr, VCHomeProp ); | 467 | safeAddProp( home_adr, VCHomeProp ); |
452 | safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() ); | 468 | safeAddPropValue( home_adr, VCStreetAddressProp, c.homeStreet() ); |
453 | safeAddPropValue( home_adr, VCCityProp, c.homeCity() ); | 469 | safeAddPropValue( home_adr, VCCityProp, c.homeCity() ); |
454 | safeAddPropValue( home_adr, VCRegionProp, c.homeState() ); | 470 | safeAddPropValue( home_adr, VCRegionProp, c.homeState() ); |
455 | safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() ); | 471 | safeAddPropValue( home_adr, VCPostalCodeProp, c.homeZip() ); |
456 | safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() ); | 472 | safeAddPropValue( home_adr, VCCountryNameProp, c.homeCountry() ); |
457 | 473 | ||
458 | VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() ); | 474 | VObject *home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homePhone() ); |
459 | safeAddProp( home_phone, VCHomeProp ); | 475 | safeAddProp( home_phone, VCHomeProp ); |
460 | home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() ); | 476 | home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeMobile() ); |
461 | safeAddProp( home_phone, VCHomeProp ); | 477 | safeAddProp( home_phone, VCHomeProp ); |
462 | safeAddProp( home_phone, VCCellularProp ); | 478 | safeAddProp( home_phone, VCCellularProp ); |
463 | home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() ); | 479 | home_phone = safeAddPropValue( vcard, VCTelephoneProp, c.homeFax() ); |
464 | safeAddProp( home_phone, VCHomeProp ); | 480 | safeAddProp( home_phone, VCHomeProp ); |
465 | safeAddProp( home_phone, VCFaxProp ); | 481 | safeAddProp( home_phone, VCFaxProp ); |
466 | 482 | ||
467 | VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() ); | 483 | VObject *url = safeAddPropValue( vcard, VCURLProp, c.homeWebpage() ); |
468 | safeAddProp( url, VCHomeProp ); | 484 | safeAddProp( url, VCHomeProp ); |
469 | 485 | ||
470 | // work properties | 486 | // work properties |
471 | VObject *work_adr= safeAddProp( vcard, VCAdrProp ); | 487 | VObject *work_adr= safeAddProp( vcard, VCAdrProp ); |
472 | safeAddProp( work_adr, VCWorkProp ); | 488 | safeAddProp( work_adr, VCWorkProp ); |
473 | safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() ); | 489 | safeAddPropValue( work_adr, VCStreetAddressProp, c.businessStreet() ); |
474 | safeAddPropValue( work_adr, VCCityProp, c.businessCity() ); | 490 | safeAddPropValue( work_adr, VCCityProp, c.businessCity() ); |
475 | safeAddPropValue( work_adr, VCRegionProp, c.businessState() ); | 491 | safeAddPropValue( work_adr, VCRegionProp, c.businessState() ); |
476 | safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() ); | 492 | safeAddPropValue( work_adr, VCPostalCodeProp, c.businessZip() ); |
477 | safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() ); | 493 | safeAddPropValue( work_adr, VCCountryNameProp, c.businessCountry() ); |
478 | 494 | ||
479 | VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() ); | 495 | VObject *work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPhone() ); |
480 | safeAddProp( work_phone, VCWorkProp ); | 496 | safeAddProp( work_phone, VCWorkProp ); |
481 | work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() ); | 497 | work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessMobile() ); |
482 | safeAddProp( work_phone, VCWorkProp ); | 498 | safeAddProp( work_phone, VCWorkProp ); |
483 | safeAddProp( work_phone, VCCellularProp ); | 499 | safeAddProp( work_phone, VCCellularProp ); |
484 | work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() ); | 500 | work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessFax() ); |
485 | safeAddProp( work_phone, VCWorkProp ); | 501 | safeAddProp( work_phone, VCWorkProp ); |
486 | safeAddProp( work_phone, VCFaxProp ); | 502 | safeAddProp( work_phone, VCFaxProp ); |
487 | work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() ); | 503 | work_phone = safeAddPropValue( vcard, VCTelephoneProp, c.businessPager() ); |
488 | safeAddProp( work_phone, VCWorkProp ); | 504 | safeAddProp( work_phone, VCWorkProp ); |
489 | safeAddProp( work_phone, VCPagerProp ); | 505 | safeAddProp( work_phone, VCPagerProp ); |
490 | 506 | ||
491 | url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() ); | 507 | url = safeAddPropValue( vcard, VCURLProp, c.businessWebpage() ); |
492 | safeAddProp( url, VCWorkProp ); | 508 | safeAddProp( url, VCWorkProp ); |
493 | 509 | ||
494 | VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() ); | 510 | VObject *title = safeAddPropValue( vcard, VCTitleProp, c.jobTitle() ); |
495 | safeAddProp( title, VCWorkProp ); | 511 | safeAddProp( title, VCWorkProp ); |
496 | 512 | ||
497 | 513 | ||
498 | QStringList emails = c.emailList(); | 514 | QStringList emails = c.emailList(); |
499 | emails.prepend( c.defaultEmail() ); | 515 | emails.prepend( c.defaultEmail() ); |
500 | for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) { | 516 | for( QStringList::Iterator it = emails.begin(); it != emails.end(); ++it ) { |
501 | VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it ); | 517 | VObject *email = safeAddPropValue( vcard, VCEmailAddressProp, *it ); |
502 | safeAddProp( email, VCInternetProp ); | 518 | safeAddProp( email, VCInternetProp ); |
503 | } | 519 | } |
504 | 520 | ||
505 | safeAddPropValue( vcard, VCNoteProp, c.notes() ); | 521 | safeAddPropValue( vcard, VCNoteProp, c.notes() ); |
506 | 522 | ||
507 | // Exporting Birthday regarding RFC 2425 (5.8.4) | 523 | // Exporting Birthday regarding RFC 2425 (5.8.4) |
508 | if ( c.birthday().isValid() ){ | 524 | if ( c.birthday().isValid() ){ |
509 | qWarning("Exporting birthday as: %s", convDateToVCardDate( c.birthday() ).latin1() ); | 525 | qWarning("Exporting birthday as: %s", convDateToVCardDate( c.birthday() ).latin1() ); |
510 | safeAddPropValue( vcard, VCBirthDateProp, convDateToVCardDate( c.birthday() ) ); | 526 | safeAddPropValue( vcard, VCBirthDateProp, convDateToVCardDate( c.birthday() ) ); |
511 | } | 527 | } |
512 | 528 | ||
513 | if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) { | 529 | if ( !c.company().isEmpty() || !c.department().isEmpty() || !c.office().isEmpty() ) { |
514 | VObject *org = safeAddProp( vcard, VCOrgProp ); | 530 | VObject *org = safeAddProp( vcard, VCOrgProp ); |
515 | safeAddPropValue( org, VCOrgNameProp, c.company() ); | 531 | safeAddPropValue( org, VCOrgNameProp, c.company() ); |
516 | safeAddPropValue( org, VCOrgUnitProp, c.department() ); | 532 | safeAddPropValue( org, VCOrgUnitProp, c.department() ); |
517 | safeAddPropValue( org, VCOrgUnit2Prop, c.office() ); | 533 | safeAddPropValue( org, VCOrgUnit2Prop, c.office() ); |
518 | } | 534 | } |
519 | 535 | ||
520 | // some values we have to export as custom fields | 536 | // some values we have to export as custom fields |
521 | safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() ); | 537 | safeAddPropValue( vcard, "X-Qtopia-Profession", c.profession() ); |
522 | safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() ); | 538 | safeAddPropValue( vcard, "X-Qtopia-Manager", c.manager() ); |
523 | safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() ); | 539 | safeAddPropValue( vcard, "X-Qtopia-Assistant", c.assistant() ); |
524 | 540 | ||
525 | safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() ); | 541 | safeAddPropValue( vcard, "X-Qtopia-Spouse", c.spouse() ); |
526 | safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() ); | 542 | safeAddPropValue( vcard, "X-Qtopia-Gender", c.gender() ); |
527 | if ( c.anniversary().isValid() ){ | 543 | if ( c.anniversary().isValid() ){ |
528 | qWarning("Exporting anniversary as: %s", convDateToVCardDate( c.anniversary() ).latin1() ); | 544 | qWarning("Exporting anniversary as: %s", convDateToVCardDate( c.anniversary() ).latin1() ); |
529 | safeAddPropValue( vcard, "X-Qtopia-Anniversary", convDateToVCardDate( c.anniversary() ) ); | 545 | safeAddPropValue( vcard, "X-Qtopia-Anniversary", convDateToVCardDate( c.anniversary() ) ); |
530 | } | 546 | } |
531 | safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() ); | 547 | safeAddPropValue( vcard, "X-Qtopia-Nickname", c.nickname() ); |
532 | safeAddPropValue( vcard, "X-Qtopia-Children", c.children() ); | 548 | safeAddPropValue( vcard, "X-Qtopia-Children", c.children() ); |
533 | 549 | ||
534 | return vcard; | 550 | return vcard; |
535 | } | 551 | } |
536 | 552 | ||
537 | QString OContactAccessBackend_VCard::convDateToVCardDate( const QDate& d ) const | 553 | QString OContactAccessBackend_VCard::convDateToVCardDate( const QDate& d ) const |
538 | { | 554 | { |
539 | QString str_rfc2425 = QString("%1-%2-%3") | 555 | QString str_rfc2425 = QString("%1-%2-%3") |
540 | .arg( d.year() ) | 556 | .arg( d.year() ) |
541 | .arg( d.month(), 2 ) | 557 | .arg( d.month(), 2 ) |
542 | .arg( d.day(), 2 ); | 558 | .arg( d.day(), 2 ); |
543 | // Now replace spaces with "0"... | 559 | // Now replace spaces with "0"... |
544 | int pos = 0; | 560 | int pos = 0; |
545 | while ( ( pos = str_rfc2425.find (' ') ) > 0 ) | 561 | while ( ( pos = str_rfc2425.find (' ') ) > 0 ) |
546 | str_rfc2425.replace( pos, 1, "0" ); | 562 | str_rfc2425.replace( pos, 1, "0" ); |
547 | 563 | ||
548 | return str_rfc2425; | 564 | return str_rfc2425; |
549 | } | 565 | } |
550 | 566 | ||
551 | QDate OContactAccessBackend_VCard::convVCardDateToDate( const QString& datestr ) | 567 | QDate OContactAccessBackend_VCard::convVCardDateToDate( const QString& datestr ) |
552 | { | 568 | { |
553 | int monthPos = datestr.find('-'); | 569 | int monthPos = datestr.find('-'); |
554 | int dayPos = datestr.find('-', monthPos+1 ); | 570 | int dayPos = datestr.find('-', monthPos+1 ); |
555 | int sep_ignore = 1; | 571 | int sep_ignore = 1; |
556 | if ( monthPos == -1 || dayPos == -1 ) { | 572 | if ( monthPos == -1 || dayPos == -1 ) { |
557 | qDebug("fromString didn't find - in str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos ); | 573 | qDebug("fromString didn't find - in str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos ); |
558 | // Ok.. No "-" found, therefore we will try to read other format ( YYYYMMDD ) | 574 | // Ok.. No "-" found, therefore we will try to read other format ( YYYYMMDD ) |
559 | if ( datestr.length() == 8 ){ | 575 | if ( datestr.length() == 8 ){ |
560 | monthPos = 4; | 576 | monthPos = 4; |
561 | dayPos = 6; | 577 | dayPos = 6; |
562 | sep_ignore = 0; | 578 | sep_ignore = 0; |
563 | qDebug("Try with follwing positions str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos ); | 579 | qDebug("Try with follwing positions str = %s; mpos = %d ypos = %d", datestr.latin1(), monthPos, dayPos ); |
564 | } else { | 580 | } else { |
565 | return QDate(); | 581 | return QDate(); |
566 | } | 582 | } |
567 | } | 583 | } |
568 | int y = datestr.left( monthPos ).toInt(); | 584 | int y = datestr.left( monthPos ).toInt(); |
569 | int m = datestr.mid( monthPos + sep_ignore, dayPos - monthPos - sep_ignore ).toInt(); | 585 | int m = datestr.mid( monthPos + sep_ignore, dayPos - monthPos - sep_ignore ).toInt(); |
570 | int d = datestr.mid( dayPos + sep_ignore ).toInt(); | 586 | int d = datestr.mid( dayPos + sep_ignore ).toInt(); |
571 | qDebug("TimeConversion::fromString ymd = %s => %d %d %d; mpos = %d ypos = %d", datestr.latin1(), y, m, d, monthPos, dayPos); | 587 | qDebug("TimeConversion::fromString ymd = %s => %d %d %d; mpos = %d ypos = %d", datestr.latin1(), y, m, d, monthPos, dayPos); |
572 | QDate date ( y,m,d ); | 588 | QDate date ( y,m,d ); |
573 | return date; | 589 | return date; |
574 | } | 590 | } |
575 | 591 | ||
576 | VObject* OContactAccessBackend_VCard::safeAddPropValue( VObject *o, const char *prop, const QString &value ) | 592 | VObject* OContactAccessBackend_VCard::safeAddPropValue( VObject *o, const char *prop, const QString &value ) |
577 | { | 593 | { |
578 | VObject *ret = 0; | 594 | VObject *ret = 0; |
579 | if ( o && !value.isEmpty() ) | 595 | if ( o && !value.isEmpty() ) |
580 | ret = addPropValue( o, prop, value.latin1() ); | 596 | ret = addPropValue( o, prop, value.latin1() ); |
581 | return ret; | 597 | return ret; |
582 | } | 598 | } |
583 | 599 | ||
584 | VObject* OContactAccessBackend_VCard::safeAddProp( VObject *o, const char *prop) | 600 | VObject* OContactAccessBackend_VCard::safeAddProp( VObject *o, const char *prop) |
585 | { | 601 | { |
586 | VObject *ret = 0; | 602 | VObject *ret = 0; |
587 | if ( o ) | 603 | if ( o ) |
588 | ret = addProp( o, prop ); | 604 | ret = addProp( o, prop ); |
589 | return ret; | 605 | return ret; |
590 | } | 606 | } |
diff --git a/libopie2/opiepim/backend/otodoaccessvcal.cpp b/libopie2/opiepim/backend/otodoaccessvcal.cpp index e96cc3c..309f9e1 100644 --- a/libopie2/opiepim/backend/otodoaccessvcal.cpp +++ b/libopie2/opiepim/backend/otodoaccessvcal.cpp | |||
@@ -1,191 +1,194 @@ | |||
1 | #include <qfile.h> | 1 | #include <qfile.h> |
2 | 2 | ||
3 | #include <qtopia/private/vobject_p.h> | 3 | #include <qtopia/private/vobject_p.h> |
4 | #include <qtopia/timeconversion.h> | 4 | #include <qtopia/timeconversion.h> |
5 | #include <qtopia/private/qfiledirect_p.h> | 5 | #include <qtopia/private/qfiledirect_p.h> |
6 | 6 | ||
7 | #include "otodoaccessvcal.h" | 7 | #include "otodoaccessvcal.h" |
8 | 8 | ||
9 | namespace { | 9 | namespace { |
10 | static OTodo eventByVObj( VObject *obj ){ | 10 | static OTodo eventByVObj( VObject *obj ){ |
11 | OTodo event; | 11 | OTodo event; |
12 | VObject *ob; | 12 | VObject *ob; |
13 | QCString name; | 13 | QCString name; |
14 | // no uid, attendees, ... and no fun | 14 | // no uid, attendees, ... and no fun |
15 | // description | 15 | // description |
16 | if( ( ob = isAPropertyOf( obj, VCDescriptionProp )) != 0 ){ | 16 | if( ( ob = isAPropertyOf( obj, VCDescriptionProp )) != 0 ){ |
17 | name = vObjectStringZValue( ob ); | 17 | name = vObjectStringZValue( ob ); |
18 | event.setDescription( name ); | 18 | event.setDescription( name ); |
19 | } | 19 | } |
20 | // summary | 20 | // summary |
21 | if ( ( ob = isAPropertyOf( obj, VCSummaryProp ) ) != 0 ) { | 21 | if ( ( ob = isAPropertyOf( obj, VCSummaryProp ) ) != 0 ) { |
22 | name = vObjectStringZValue( ob ); | 22 | name = vObjectStringZValue( ob ); |
23 | event.setSummary( name ); | 23 | event.setSummary( name ); |
24 | } | 24 | } |
25 | // completed | 25 | // completed |
26 | if( ( ob = isAPropertyOf( obj, VCStatusProp )) != 0 ){ | 26 | if( ( ob = isAPropertyOf( obj, VCStatusProp )) != 0 ){ |
27 | name = vObjectStringZValue( ob ); | 27 | name = vObjectStringZValue( ob ); |
28 | if( name == "COMPLETED" ){ | 28 | if( name == "COMPLETED" ){ |
29 | event.setCompleted( true ); | 29 | event.setCompleted( true ); |
30 | }else{ | 30 | }else{ |
31 | event.setCompleted( false ); | 31 | event.setCompleted( false ); |
32 | } | 32 | } |
33 | }else | 33 | }else |
34 | event.setCompleted( false ); | 34 | event.setCompleted( false ); |
35 | // priority | 35 | // priority |
36 | if ((ob = isAPropertyOf(obj, VCPriorityProp))) { | 36 | if ((ob = isAPropertyOf(obj, VCPriorityProp))) { |
37 | name = vObjectStringZValue( ob ); | 37 | name = vObjectStringZValue( ob ); |
38 | bool ok; | 38 | bool ok; |
39 | event.setPriority(name.toInt(&ok) ); | 39 | event.setPriority(name.toInt(&ok) ); |
40 | } | 40 | } |
41 | //due date | 41 | //due date |
42 | if((ob = isAPropertyOf(obj, VCDueProp)) ){ | 42 | if((ob = isAPropertyOf(obj, VCDueProp)) ){ |
43 | event.setHasDueDate( true ); | 43 | event.setHasDueDate( true ); |
44 | name = vObjectStringZValue( ob ); | 44 | name = vObjectStringZValue( ob ); |
45 | event.setDueDate( TimeConversion::fromISO8601( name).date() ); | 45 | event.setDueDate( TimeConversion::fromISO8601( name).date() ); |
46 | } | 46 | } |
47 | // categories | 47 | // categories |
48 | if((ob = isAPropertyOf( obj, VCCategoriesProp )) != 0 ){ | 48 | if((ob = isAPropertyOf( obj, VCCategoriesProp )) != 0 ){ |
49 | name = vObjectStringZValue( ob ); | 49 | name = vObjectStringZValue( ob ); |
50 | qWarning("Categories:%s", name.data() ); | 50 | qWarning("Categories:%s", name.data() ); |
51 | } | 51 | } |
52 | 52 | ||
53 | event.setUid( 1 ); | 53 | event.setUid( 1 ); |
54 | return event; | 54 | return event; |
55 | }; | 55 | }; |
56 | static VObject *vobjByEvent( const OTodo &event ) { | 56 | static VObject *vobjByEvent( const OTodo &event ) { |
57 | VObject *task = newVObject( VCTodoProp ); | 57 | VObject *task = newVObject( VCTodoProp ); |
58 | if( task == 0 ) | 58 | if( task == 0 ) |
59 | return 0l; | 59 | return 0l; |
60 | 60 | ||
61 | if( event.hasDueDate() ) | 61 | if( event.hasDueDate() ) { |
62 | QTime time(0, 0, 0); | ||
63 | QDateTime date(event.dueDate(), time ); | ||
62 | addPropValue( task, VCDueProp, | 64 | addPropValue( task, VCDueProp, |
63 | TimeConversion::toISO8601( event.dueDate() ) ); | 65 | TimeConversion::toISO8601( date ) ); |
66 | } | ||
64 | 67 | ||
65 | if( event.isCompleted() ) | 68 | if( event.isCompleted() ) |
66 | addPropValue( task, VCStatusProp, "COMPLETED"); | 69 | addPropValue( task, VCStatusProp, "COMPLETED"); |
67 | 70 | ||
68 | QString string = QString::number(event.priority() ); | 71 | QString string = QString::number(event.priority() ); |
69 | addPropValue( task, VCPriorityProp, string.local8Bit() ); | 72 | addPropValue( task, VCPriorityProp, string.local8Bit() ); |
70 | 73 | ||
71 | addPropValue( task, VCCategoriesProp, | 74 | addPropValue( task, VCCategoriesProp, |
72 | event.idsToString( event.categories() ).local8Bit() ); | 75 | event.idsToString( event.categories() ).local8Bit() ); |
73 | 76 | ||
74 | addPropValue( task, VCDescriptionProp, | 77 | addPropValue( task, VCDescriptionProp, |
75 | event.description().local8Bit() ); | 78 | event.description().local8Bit() ); |
76 | 79 | ||
77 | addPropValue( task, VCSummaryProp, | 80 | addPropValue( task, VCSummaryProp, |
78 | event.summary().local8Bit() ); | 81 | event.summary().local8Bit() ); |
79 | return task; | 82 | return task; |
80 | }; | 83 | }; |
81 | } | 84 | } |
82 | 85 | ||
83 | OTodoAccessVCal::OTodoAccessVCal( const QString& path ) | 86 | OTodoAccessVCal::OTodoAccessVCal( const QString& path ) |
84 | : m_dirty(false), m_file( path ) | 87 | : m_dirty(false), m_file( path ) |
85 | { | 88 | { |
86 | } | 89 | } |
87 | OTodoAccessVCal::~OTodoAccessVCal() { | 90 | OTodoAccessVCal::~OTodoAccessVCal() { |
88 | } | 91 | } |
89 | bool OTodoAccessVCal::load() { | 92 | bool OTodoAccessVCal::load() { |
90 | m_map.clear(); | 93 | m_map.clear(); |
91 | m_dirty = false; | 94 | m_dirty = false; |
92 | 95 | ||
93 | VObject* vcal = 0l; | 96 | VObject* vcal = 0l; |
94 | vcal = Parse_MIME_FromFileName( QFile::encodeName(m_file).data() ); | 97 | vcal = Parse_MIME_FromFileName( QFile::encodeName(m_file).data() ); |
95 | if (!vcal ) | 98 | if (!vcal ) |
96 | return false; | 99 | return false; |
97 | 100 | ||
98 | // Iterate over the list | 101 | // Iterate over the list |
99 | VObjectIterator it; | 102 | VObjectIterator it; |
100 | VObject* vobj; | 103 | VObject* vobj; |
101 | 104 | ||
102 | initPropIterator(&it, vcal); | 105 | initPropIterator(&it, vcal); |
103 | 106 | ||
104 | while( moreIteration( &it ) ) { | 107 | while( moreIteration( &it ) ) { |
105 | vobj = ::nextVObject( &it ); | 108 | vobj = ::nextVObject( &it ); |
106 | QCString name = ::vObjectName( vobj ); | 109 | QCString name = ::vObjectName( vobj ); |
107 | if( name == VCTodoProp ){ | 110 | if( name == VCTodoProp ){ |
108 | OTodo to = eventByVObj( vobj ); | 111 | OTodo to = eventByVObj( vobj ); |
109 | m_map.insert( to.uid(), to ); | 112 | m_map.insert( to.uid(), to ); |
110 | } | 113 | } |
111 | } | 114 | } |
112 | 115 | ||
113 | // Should I do a delete vcal? | 116 | // Should I do a delete vcal? |
114 | 117 | ||
115 | return true; | 118 | return true; |
116 | } | 119 | } |
117 | bool OTodoAccessVCal::reload() { | 120 | bool OTodoAccessVCal::reload() { |
118 | return load(); | 121 | return load(); |
119 | } | 122 | } |
120 | bool OTodoAccessVCal::save() { | 123 | bool OTodoAccessVCal::save() { |
121 | if (!m_dirty ) | 124 | if (!m_dirty ) |
122 | return true; | 125 | return true; |
123 | 126 | ||
124 | QFileDirect file( m_file ); | 127 | QFileDirect file( m_file ); |
125 | if (!file.open(IO_WriteOnly ) ) | 128 | if (!file.open(IO_WriteOnly ) ) |
126 | return false; | 129 | return false; |
127 | 130 | ||
128 | VObject *obj; | 131 | VObject *obj; |
129 | obj = newVObject( VCCalProp ); | 132 | obj = newVObject( VCCalProp ); |
130 | addPropValue( obj, VCVersionProp, "1.0" ); | 133 | addPropValue( obj, VCVersionProp, "1.0" ); |
131 | VObject *vo; | 134 | VObject *vo; |
132 | for(QMap<int, OTodo>::ConstIterator it=m_map.begin(); it !=m_map.end(); ++it ){ | 135 | for(QMap<int, OTodo>::ConstIterator it=m_map.begin(); it !=m_map.end(); ++it ){ |
133 | vo = vobjByEvent( it.data() ); | 136 | vo = vobjByEvent( it.data() ); |
134 | addVObjectProp(obj, vo ); | 137 | addVObjectProp(obj, vo ); |
135 | } | 138 | } |
136 | writeVObject( file.directHandle(), obj ); | 139 | writeVObject( file.directHandle(), obj ); |
137 | cleanVObject( obj ); | 140 | cleanVObject( obj ); |
138 | cleanStrTbl(); | 141 | cleanStrTbl(); |
139 | 142 | ||
140 | m_dirty = false; | 143 | m_dirty = false; |
141 | return true; | 144 | return true; |
142 | } | 145 | } |
143 | void OTodoAccessVCal::clear() { | 146 | void OTodoAccessVCal::clear() { |
144 | m_map.clear(); | 147 | m_map.clear(); |
145 | m_dirty = true; | 148 | m_dirty = true; |
146 | } | 149 | } |
147 | bool OTodoAccessVCal::add( const OTodo& to ) { | 150 | bool OTodoAccessVCal::add( const OTodo& to ) { |
148 | m_map.insert( to.uid(), to ); | 151 | m_map.insert( to.uid(), to ); |
149 | m_dirty = true; | 152 | m_dirty = true; |
150 | return true; | 153 | return true; |
151 | } | 154 | } |
152 | bool OTodoAccessVCal::remove( int uid ) { | 155 | bool OTodoAccessVCal::remove( int uid ) { |
153 | m_map.remove( uid ); | 156 | m_map.remove( uid ); |
154 | m_dirty = true; | 157 | m_dirty = true; |
155 | return true; | 158 | return true; |
156 | } | 159 | } |
157 | void OTodoAccessVCal::removeAllCompleted() { | 160 | void OTodoAccessVCal::removeAllCompleted() { |
158 | for ( QMap<int, OTodo>::Iterator it = m_map.begin(); it != m_map.end(); ++it ) { | 161 | for ( QMap<int, OTodo>::Iterator it = m_map.begin(); it != m_map.end(); ++it ) { |
159 | if ( (*it).isCompleted() ) | 162 | if ( (*it).isCompleted() ) |
160 | m_map.remove( it ); | 163 | m_map.remove( it ); |
161 | } | 164 | } |
162 | } | 165 | } |
163 | bool OTodoAccessVCal::replace( const OTodo& to ) { | 166 | bool OTodoAccessVCal::replace( const OTodo& to ) { |
164 | m_map.replace( to.uid(), to ); | 167 | m_map.replace( to.uid(), to ); |
165 | m_dirty = true; | 168 | m_dirty = true; |
166 | return true; | 169 | return true; |
167 | } | 170 | } |
168 | OTodo OTodoAccessVCal::find(int uid )const { | 171 | OTodo OTodoAccessVCal::find(int uid )const { |
169 | return m_map[uid]; | 172 | return m_map[uid]; |
170 | } | 173 | } |
171 | QArray<int> OTodoAccessVCal::sorted( bool, int, int, int ) { | 174 | QArray<int> OTodoAccessVCal::sorted( bool, int, int, int ) { |
172 | QArray<int> ar(0); | 175 | QArray<int> ar(0); |
173 | return ar; | 176 | return ar; |
174 | } | 177 | } |
175 | QArray<int> OTodoAccessVCal::allRecords()const { | 178 | QArray<int> OTodoAccessVCal::allRecords()const { |
176 | QArray<int> ar( m_map.count() ); | 179 | QArray<int> ar( m_map.count() ); |
177 | QMap<int, OTodo>::ConstIterator it; | 180 | QMap<int, OTodo>::ConstIterator it; |
178 | int i = 0; | 181 | int i = 0; |
179 | for ( it = m_map.begin(); it != m_map.end(); ++it ) { | 182 | for ( it = m_map.begin(); it != m_map.end(); ++it ) { |
180 | ar[i] = it.key(); | 183 | ar[i] = it.key(); |
181 | i++; | 184 | i++; |
182 | } | 185 | } |
183 | return ar; | 186 | return ar; |
184 | } | 187 | } |
185 | QArray<int> OTodoAccessVCal::queryByExample( const OTodo&, int ) { | 188 | QArray<int> OTodoAccessVCal::queryByExample( const OTodo&, int ) { |
186 | QArray<int> ar(0); | 189 | QArray<int> ar(0); |
187 | return ar; | 190 | return ar; |
188 | } | 191 | } |
189 | QArray<int> OTodoAccessVCal::effectiveToDos( const QDate& , | 192 | QArray<int> OTodoAccessVCal::effectiveToDos( const QDate& , |
190 | const QDate& , | 193 | const QDate& , |
191 | bool ) { | 194 | bool ) { |