summaryrefslogtreecommitdiffabout
path: root/kabc
Unidiff
Diffstat (limited to 'kabc') (more/less context) (ignore whitespace changes)
-rw-r--r--kabc/vcard/ContentLine.cpp1
-rw-r--r--kabc/vcardformatimpl.cpp8
-rw-r--r--kabc/vcardparser/vcardparser.cpp2
-rw-r--r--kabc/vcardparser/vcardtool.cpp10
4 files changed, 11 insertions, 10 deletions
diff --git a/kabc/vcard/ContentLine.cpp b/kabc/vcard/ContentLine.cpp
index f7e04a9..c368172 100644
--- a/kabc/vcard/ContentLine.cpp
+++ b/kabc/vcard/ContentLine.cpp
@@ -54,267 +54,268 @@
54#include <VCardTextListValue.h> 54#include <VCardTextListValue.h>
55#include <VCardUTCValue.h> 55#include <VCardUTCValue.h>
56#include <VCardGeoValue.h> 56#include <VCardGeoValue.h>
57 57
58#include <VCardRToken.h> 58#include <VCardRToken.h>
59#include <VCardContentLine.h> 59#include <VCardContentLine.h>
60 60
61#include <VCardEntity.h> 61#include <VCardEntity.h>
62#include <VCardEnum.h> 62#include <VCardEnum.h>
63#include <VCardDefines.h> 63#include <VCardDefines.h>
64 64
65using namespace VCARD; 65using namespace VCARD;
66 66
67ContentLine::ContentLine() 67ContentLine::ContentLine()
68 :Entity(), 68 :Entity(),
69 value_(0), 69 value_(0),
70 paramType_( ParamUnknown ), 70 paramType_( ParamUnknown ),
71 valueType_( ValueUnknown ), 71 valueType_( ValueUnknown ),
72 entityType_( EntityUnknown ) 72 entityType_( EntityUnknown )
73{ 73{
74 paramList_.setAutoDelete( TRUE ); 74 paramList_.setAutoDelete( TRUE );
75} 75}
76 76
77ContentLine::ContentLine(const ContentLine & x) 77ContentLine::ContentLine(const ContentLine & x)
78 :Entity(x), 78 :Entity(x),
79 group_ (x.group_), 79 group_ (x.group_),
80 name_ (x.name_), 80 name_ (x.name_),
81 /*US paramList_(x.paramList_),*/ 81 /*US paramList_(x.paramList_),*/
82 value_(x.value_->clone()), 82 value_(x.value_->clone()),
83 paramType_(x.paramType_), 83 paramType_(x.paramType_),
84 valueType_(x.valueType_), 84 valueType_(x.valueType_),
85 entityType_(x.entityType_) 85 entityType_(x.entityType_)
86{ 86{
87 paramList_.setAutoDelete( TRUE ); 87 paramList_.setAutoDelete( TRUE );
88 88
89 89
90 ParamListIterator it(x.paramList_); 90 ParamListIterator it(x.paramList_);
91 for (; it.current(); ++it) 91 for (; it.current(); ++it)
92 { 92 {
93 Param *p = new Param; 93 Param *p = new Param;
94 p->setName( it.current()->name() ); 94 p->setName( it.current()->name() );
95 p->setValue( it.current()->value() ); 95 p->setValue( it.current()->value() );
96 paramList_.append(p); 96 paramList_.append(p);
97 } 97 }
98 98
99} 99}
100 100
101ContentLine::ContentLine(const QCString & s) 101ContentLine::ContentLine(const QCString & s)
102 :Entity(s), 102 :Entity(s),
103 value_(0), 103 value_(0),
104 paramType_( ParamUnknown ), 104 paramType_( ParamUnknown ),
105 valueType_( ValueUnknown ), 105 valueType_( ValueUnknown ),
106 entityType_( EntityUnknown ) 106 entityType_( EntityUnknown )
107{ 107{
108 paramList_.setAutoDelete( TRUE ); 108 paramList_.setAutoDelete( TRUE );
109} 109}
110 110
111 ContentLine & 111 ContentLine &
112ContentLine::operator = (ContentLine & x) 112ContentLine::operator = (ContentLine & x)
113{ 113{
114 if (*this == x) return *this; 114 if (*this == x) return *this;
115 115
116 ParamListIterator it(x.paramList_); 116 ParamListIterator it(x.paramList_);
117 for (; it.current(); ++it) 117 for (; it.current(); ++it)
118 { 118 {
119 Param *p = new Param; 119 Param *p = new Param;
120 p->setName( it.current()->name() ); 120 p->setName( it.current()->name() );
121 p->setValue( it.current()->value() ); 121 p->setValue( it.current()->value() );
122 paramList_.append(p); 122 paramList_.append(p);
123 } 123 }
124 124
125 value_ = x.value_->clone(); 125 value_ = x.value_->clone();
126 126
127 Entity::operator = (x); 127 Entity::operator = (x);
128 return *this; 128 return *this;
129} 129}
130 130
131 ContentLine & 131 ContentLine &
132ContentLine::operator = (const QCString & s) 132ContentLine::operator = (const QCString & s)
133{ 133{
134 Entity::operator = (s); 134 Entity::operator = (s);
135 delete value_; 135 delete value_;
136 value_ = 0; 136 value_ = 0;
137 return *this; 137 return *this;
138} 138}
139 139
140 bool 140 bool
141ContentLine::operator == (ContentLine & x) 141ContentLine::operator == (ContentLine & x)
142{ 142{
143 x.parse(); 143 x.parse();
144 144
145 QPtrListIterator<Param> it(x.paramList()); 145 QPtrListIterator<Param> it(x.paramList());
146 146
147 if (!paramList_.find(it.current())) 147 if (!paramList_.find(it.current()))
148 return false; 148 return false;
149 149
150 return true; 150 return true;
151} 151}
152 152
153ContentLine::~ContentLine() 153ContentLine::~ContentLine()
154{ 154{
155 delete value_; 155 delete value_;
156 value_ = 0; 156 value_ = 0;
157} 157}
158 158
159 void 159 void
160ContentLine::_parse() 160ContentLine::_parse()
161{ 161{
162 vDebug("parse"); 162 vDebug("parse");
163 163
164 // Unqote newlines 164 // Unqote newlines
165 strRep_ = strRep_.replace( QRegExp( "\\\\n" ), "\n" ); 165 strRep_ = strRep_.replace( QRegExp( "\\\\n" ), "\n" );
166 166
167 int split = strRep_.find(':'); 167 int split = strRep_.find(':');
168 168
169 if (split == -1) { // invalid content line 169 if (split == -1) { // invalid content line
170 vDebug("No ':'"); 170 vDebug("No ':'");
171 return; 171 return;
172 } 172 }
173 173
174 QCString firstPart(strRep_.left(split)); 174 QCString firstPart(strRep_.left(split));
175 QCString valuePart(strRep_.mid(split + 1)); 175 QCString valuePart(strRep_.mid(split + 1));
176 176
177 split = firstPart.find('.'); 177 split = firstPart.find('.');
178 178
179 if (split != -1) { 179 if (split != -1) {
180 group_ = firstPart.left(split); 180 group_ = firstPart.left(split);
181 firstPart= firstPart.mid(split + 1); 181 firstPart= firstPart.mid(split + 1);
182 } 182 }
183 183
184 vDebug("Group == " + group_); 184 vDebug("Group == " + group_);
185 vDebug("firstPart == " + firstPart); 185 vDebug("firstPart == " + firstPart);
186 vDebug("valuePart == " + valuePart); 186 vDebug("valuePart == " + valuePart);
187 187
188 // Now we have the group, the name and param list together and the value. 188 // Now we have the group, the name and param list together and the value.
189 189
190 QStrList l; 190 QStrList l;
191 191
192 RTokenise(firstPart, ";", l); 192 RTokenise(firstPart, ";", l);
193 193
194 if (l.count() == 0) {// invalid - no name ! 194 if (l.count() == 0) {// invalid - no name !
195 vDebug("No name for this content line !"); 195 vDebug("No name for this content line !");
196 return; 196 return;
197 } 197 }
198 198
199 name_ = l.at(0); 199 name_ = l.at(0);
200 200
201 // Now we have the name, so the rest of 'l' is the params. 201 // Now we have the name, so the rest of 'l' is the params.
202 // Remove the name part. 202 // Remove the name part.
203 l.remove(0u); 203 l.remove(0u);
204 204
205 entityType_= EntityNameToEntityType(name_); 205 entityType_= EntityNameToEntityType(name_);
206 paramType_= EntityTypeToParamType(entityType_); 206 paramType_= EntityTypeToParamType(entityType_);
207 207
208 unsigned int i = 0; 208 unsigned int i = 0;
209 209
210 // For each parameter, create a new parameter of the correct type. 210 // For each parameter, create a new parameter of the correct type.
211 211
212 QStrListIterator it(l); 212 QStrListIterator it(l);
213 213
214 for (; it.current(); ++it, i++) { 214 for (; it.current(); ++it, i++) {
215 215
216 QCString str = *it; 216 QCString str = *it;
217 217
218 split = str.find("="); 218 split = str.find("=");
219 if (split < 0 ) { 219 if (split < 0 ) {
220 vDebug("No '=' in paramter."); 220 vDebug("No '=' in paramter.");
221 continue; 221 continue;
222 } 222 }
223 223
224 QCString paraName = str.left(split); 224 QCString paraName = str.left(split);
225 QCString paraValue = str.mid(split + 1); 225 QCString paraValue = str.mid(split + 1);
226 226
227 QStrList paraValues; 227 QStrList paraValues;
228 RTokenise(paraValue, ",", paraValues); 228 RTokenise(paraValue, ",", paraValues);
229 229
230 QStrListIterator it2( paraValues ); 230 QStrListIterator it2( paraValues );
231 231
232 for(; it2.current(); ++it2) { 232 for(; it2.current(); ++it2) {
233 233
234 Param *p = new Param; 234 Param *p = new Param;
235 p->setName( paraName ); 235 p->setName( paraName );
236 p->setValue( *it2 ); 236 p->setValue( *it2 );
237 237
238 paramList_.append(p); 238 paramList_.append(p);
239 } 239 }
240 } 240 }
241 241
242 // Create a new value of the correct type. 242 // Create a new value of the correct type.
243 243
244 valueType_ = EntityTypeToValueType(entityType_); 244 valueType_ = EntityTypeToValueType(entityType_);
245 245
246 //kdDebug(5710) << "valueType: " << valueType_ << endl; 246 //kdDebug(5710) << "valueType: " << valueType_ << endl;
247 247
248 switch (valueType_) { 248 switch (valueType_) {
249 249
250 case ValueSound: value_ = new SoundValue;break; 250 case ValueSound: value_ = new SoundValue;break;
251 case ValueAgent: value_ = new AgentValue;break; 251 case ValueAgent: value_ = new AgentValue;break;
252 case ValueAddress: value_ = new AdrValue; break; 252 case ValueAddress: value_ = new AdrValue; break;
253 case ValueTel: value_ = new TelValue; break; 253 case ValueTel: value_ = new TelValue; break;
254 case ValueTextBin: value_ = new TextBinValue;break; 254 case ValueTextBin: value_ = new TextBinValue;break;
255 case ValueOrg: value_ = new OrgValue; break; 255 case ValueOrg: value_ = new OrgValue; break;
256 case ValueN: value_ = new NValue; break; 256 case ValueN: value_ = new NValue; break;
257 case ValueUTC: value_ = new UTCValue; break; 257 case ValueUTC: value_ = new UTCValue; break;
258 case ValueURI: value_ = new URIValue; break; 258 case ValueURI: value_ = new URIValue; break;
259 case ValueClass: value_ = new ClassValue;break; 259 case ValueClass: value_ = new ClassValue;break;
260 case ValueFloat: value_ = new FloatValue;break; 260 case ValueFloat: value_ = new FloatValue;break;
261 case ValueImage: value_ = new ImageValue;break; 261 case ValueImage: value_ = new ImageValue;break;
262 case ValueDate: value_ = new DateValue; break; 262 case ValueDate: value_ = new DateValue; break;
263 case ValueTextList: value_ = new TextListValue;break; 263 case ValueTextList: value_ = new TextListValue;break;
264 case ValueGeo: value_ = new GeoValue; break; 264 case ValueGeo: value_ = new GeoValue; break;
265 case ValueText: 265 case ValueText:
266 case ValueUnknown: 266 case ValueUnknown:
267 default: value_ = new TextValue; break; 267 default: value_ = new TextValue; break;
268 } 268 }
269 269
270 *value_ = valuePart; 270 *value_ = valuePart;
271} 271}
272 272
273 void 273 void
274ContentLine::_assemble() 274ContentLine::_assemble()
275{ 275{
276 vDebug("Assemble (argl) - my name is \"" + name_ + "\""); 276 vDebug("Assemble (argl) - my name is \"" + name_ + "\"");
277 strRep_.truncate(0); 277 strRep_.truncate(0);
278 278
279 QCString line; 279 QCString line;
280 280
281 if (!group_.isEmpty()) 281 if (!group_.isEmpty())
282 line += group_ + '.'; 282 line += group_ + '.';
283 283
284 line += name_; 284 line += name_;
285 285
286 vDebug("Adding parameters"); 286 vDebug("Adding parameters");
287 ParamListIterator it(paramList_); 287 ParamListIterator it(paramList_);
288 288
289 for (; it.current(); ++it) 289 for (; it.current(); ++it)
290 line += ";" + it.current()->asString(); 290 line += ";" + it.current()->asString();
291 291
292 vDebug("Adding value"); 292 vDebug("Adding value");
293 if (value_ != 0) 293 if (value_ != 0)
294 line += ":" + value_->asString(); 294 line += ":" + value_->asString();
295 else 295 else
296 vDebug("No value"); 296 vDebug("No value");
297 297
298 // Quote newlines 298 // Quote newlines
299 line = line.replace( QRegExp( "\n" ), "\\n" ); 299 line = line.replace( QRegExp( "\n" ), "\\n" );
300 300
301 // Fold lines longer than 72 chars 301 // Fold lines longer than 72 chars
302 const int maxLen = 72; 302 const int maxLen = 72;
303 uint cursor = 0; 303 uint cursor = 0;
304 while( line.length() > ( cursor + 1 ) * maxLen ) { 304 while( line.length() > ( cursor + 1 ) * maxLen ) {
305 strRep_ += line.mid( cursor * maxLen, maxLen ); 305 strRep_ += line.mid( cursor * maxLen, maxLen );
306 strRep_ += "\r\n "; 306 strRep_ += "\r\n ";
307 ++cursor; 307 ++cursor;
308 } 308 }
309 strRep_ += line.mid( cursor * maxLen ); 309 strRep_ += line.mid( cursor * maxLen );
310 //qDebug("ContentLine::_assemble()\n%s*****", strRep_.data());
310} 311}
311 312
312 void 313 void
313ContentLine::clear() 314ContentLine::clear()
314{ 315{
315 group_.truncate(0); 316 group_.truncate(0);
316 name_.truncate(0); 317 name_.truncate(0);
317 paramList_.clear(); 318 paramList_.clear();
318 delete value_; 319 delete value_;
319 value_ = 0; 320 value_ = 0;
320} 321}
diff --git a/kabc/vcardformatimpl.cpp b/kabc/vcardformatimpl.cpp
index ede5773..c31af46 100644
--- a/kabc/vcardformatimpl.cpp
+++ b/kabc/vcardformatimpl.cpp
@@ -595,451 +595,451 @@ void VCardFormatImpl::addTelephoneValue( VCard *v, const PhoneNumber &p )
595 if( p.type() & PhoneNumber::Pref ) params.append( new Param( "TYPE", "pref" ) ); 595 if( p.type() & PhoneNumber::Pref ) params.append( new Param( "TYPE", "pref" ) );
596 if( p.type() & PhoneNumber::Voice ) params.append( new Param( "TYPE", "voice" ) ); 596 if( p.type() & PhoneNumber::Voice ) params.append( new Param( "TYPE", "voice" ) );
597 if( p.type() & PhoneNumber::Fax ) params.append( new Param( "TYPE", "fax" ) ); 597 if( p.type() & PhoneNumber::Fax ) params.append( new Param( "TYPE", "fax" ) );
598 if( p.type() & PhoneNumber::Cell ) params.append( new Param( "TYPE", "cell" ) ); 598 if( p.type() & PhoneNumber::Cell ) params.append( new Param( "TYPE", "cell" ) );
599 if( p.type() & PhoneNumber::Video ) params.append( new Param( "TYPE", "video" ) ); 599 if( p.type() & PhoneNumber::Video ) params.append( new Param( "TYPE", "video" ) );
600 if( p.type() & PhoneNumber::Bbs ) params.append( new Param( "TYPE", "bbs" ) ); 600 if( p.type() & PhoneNumber::Bbs ) params.append( new Param( "TYPE", "bbs" ) );
601 if( p.type() & PhoneNumber::Modem ) params.append( new Param( "TYPE", "modem" ) ); 601 if( p.type() & PhoneNumber::Modem ) params.append( new Param( "TYPE", "modem" ) );
602 if( p.type() & PhoneNumber::Car ) params.append( new Param( "TYPE", "car" ) ); 602 if( p.type() & PhoneNumber::Car ) params.append( new Param( "TYPE", "car" ) );
603 if( p.type() & PhoneNumber::Isdn ) params.append( new Param( "TYPE", "isdn" ) ); 603 if( p.type() & PhoneNumber::Isdn ) params.append( new Param( "TYPE", "isdn" ) );
604 if( p.type() & PhoneNumber::Pcs ) params.append( new Param( "TYPE", "pcs" ) ); 604 if( p.type() & PhoneNumber::Pcs ) params.append( new Param( "TYPE", "pcs" ) );
605 if( p.type() & PhoneNumber::Pager ) params.append( new Param( "TYPE", "pager" ) ); 605 if( p.type() & PhoneNumber::Pager ) params.append( new Param( "TYPE", "pager" ) );
606 if( p.type() & PhoneNumber::Sip ) params.append( new Param( "TYPE", "sip" ) ); 606 if( p.type() & PhoneNumber::Sip ) params.append( new Param( "TYPE", "sip" ) );
607 cl.setParamList( params ); 607 cl.setParamList( params );
608 608
609 v->add(cl); 609 v->add(cl);
610} 610}
611 611
612PhoneNumber VCardFormatImpl::readTelephoneValue( ContentLine *cl ) 612PhoneNumber VCardFormatImpl::readTelephoneValue( ContentLine *cl )
613{ 613{
614 PhoneNumber p; 614 PhoneNumber p;
615 TelValue *value = (TelValue *)cl->value(); 615 TelValue *value = (TelValue *)cl->value();
616 p.setNumber( QString::fromUtf8( value->asString() ) ); 616 p.setNumber( QString::fromUtf8( value->asString() ) );
617 617
618 int type = 0; 618 int type = 0;
619 ParamList params = cl->paramList(); 619 ParamList params = cl->paramList();
620 ParamListIterator it( params ); 620 ParamListIterator it( params );
621 QCString tmpStr; 621 QCString tmpStr;
622 for( ; it.current(); ++it ) { 622 for( ; it.current(); ++it ) {
623 if ( (*it)->name() == "TYPE" ) { 623 if ( (*it)->name() == "TYPE" ) {
624 tmpStr = (*it)->value().lower(); 624 tmpStr = (*it)->value().lower();
625 if ( tmpStr == "home" ) type |= PhoneNumber::Home; 625 if ( tmpStr == "home" ) type |= PhoneNumber::Home;
626 else if ( tmpStr == "work" ) type |= PhoneNumber::Work; 626 else if ( tmpStr == "work" ) type |= PhoneNumber::Work;
627 else if ( tmpStr == "msg" ) type |= PhoneNumber::Msg; 627 else if ( tmpStr == "msg" ) type |= PhoneNumber::Msg;
628 else if ( tmpStr == "pref" ) type |= PhoneNumber::Pref; 628 else if ( tmpStr == "pref" ) type |= PhoneNumber::Pref;
629 else if ( tmpStr == "voice" ) type |= PhoneNumber::Voice; 629 else if ( tmpStr == "voice" ) type |= PhoneNumber::Voice;
630 else if ( tmpStr == "fax" ) type |= PhoneNumber::Fax; 630 else if ( tmpStr == "fax" ) type |= PhoneNumber::Fax;
631 else if ( tmpStr == "cell" ) type |= PhoneNumber::Cell; 631 else if ( tmpStr == "cell" ) type |= PhoneNumber::Cell;
632 else if ( tmpStr == "video" ) type |= PhoneNumber::Video; 632 else if ( tmpStr == "video" ) type |= PhoneNumber::Video;
633 else if ( tmpStr == "bbs" ) type |= PhoneNumber::Bbs; 633 else if ( tmpStr == "bbs" ) type |= PhoneNumber::Bbs;
634 else if ( tmpStr == "modem" ) type |= PhoneNumber::Modem; 634 else if ( tmpStr == "modem" ) type |= PhoneNumber::Modem;
635 else if ( tmpStr == "car" ) type |= PhoneNumber::Car; 635 else if ( tmpStr == "car" ) type |= PhoneNumber::Car;
636 else if ( tmpStr == "isdn" ) type |= PhoneNumber::Isdn; 636 else if ( tmpStr == "isdn" ) type |= PhoneNumber::Isdn;
637 else if ( tmpStr == "pcs" ) type |= PhoneNumber::Pcs; 637 else if ( tmpStr == "pcs" ) type |= PhoneNumber::Pcs;
638 else if ( tmpStr == "pager" ) type |= PhoneNumber::Pager; 638 else if ( tmpStr == "pager" ) type |= PhoneNumber::Pager;
639 else if ( tmpStr == "sip" ) type |= PhoneNumber::Sip; 639 else if ( tmpStr == "sip" ) type |= PhoneNumber::Sip;
640 } 640 }
641 } 641 }
642 p.setType( type ); 642 p.setType( type );
643 643
644 return p; 644 return p;
645} 645}
646 646
647QString VCardFormatImpl::readTextValue( ContentLine *cl ) 647QString VCardFormatImpl::readTextValue( ContentLine *cl )
648{ 648{
649 VCARD::Value *value = cl->value(); 649 VCARD::Value *value = cl->value();
650 if ( value ) { 650 if ( value ) {
651 return QString::fromUtf8( value->asString() ); 651 return QString::fromUtf8( value->asString() );
652 } else { 652 } else {
653 kdDebug(5700) << "No value: " << cl->asString() << endl; 653 kdDebug(5700) << "No value: " << cl->asString() << endl;
654 qDebug("No value: %s", (const char*)(cl->asString())); 654 qDebug("No value: %s", (const char*)(cl->asString()));
655 return QString::null; 655 return QString::null;
656 } 656 }
657} 657}
658 658
659QDate VCardFormatImpl::readDateValue( ContentLine *cl ) 659QDate VCardFormatImpl::readDateValue( ContentLine *cl )
660{ 660{
661 DateValue *dateValue = (DateValue *)cl->value(); 661 DateValue *dateValue = (DateValue *)cl->value();
662 if ( dateValue ) 662 if ( dateValue )
663 return dateValue->qdate(); 663 return dateValue->qdate();
664 else 664 else
665 return QDate(); 665 return QDate();
666} 666}
667 667
668QDateTime VCardFormatImpl::readDateTimeValue( ContentLine *cl ) 668QDateTime VCardFormatImpl::readDateTimeValue( ContentLine *cl )
669{ 669{
670 DateValue *dateValue = (DateValue *)cl->value(); 670 DateValue *dateValue = (DateValue *)cl->value();
671 if ( dateValue ) 671 if ( dateValue )
672 return dateValue->qdt(); 672 return dateValue->qdt();
673 else 673 else
674 return QDateTime(); 674 return QDateTime();
675} 675}
676 676
677Geo VCardFormatImpl::readGeoValue( ContentLine *cl ) 677Geo VCardFormatImpl::readGeoValue( ContentLine *cl )
678{ 678{
679 GeoValue *geoValue = (GeoValue *)cl->value(); 679 GeoValue *geoValue = (GeoValue *)cl->value();
680 if ( geoValue ) { 680 if ( geoValue ) {
681 Geo geo( geoValue->latitude(), geoValue->longitude() ); 681 Geo geo( geoValue->latitude(), geoValue->longitude() );
682 return geo; 682 return geo;
683 } else 683 } else
684 return Geo(); 684 return Geo();
685} 685}
686 686
687TimeZone VCardFormatImpl::readUTCValue( ContentLine *cl ) 687TimeZone VCardFormatImpl::readUTCValue( ContentLine *cl )
688{ 688{
689 UTCValue *utcValue = (UTCValue *)cl->value(); 689 UTCValue *utcValue = (UTCValue *)cl->value();
690 if ( utcValue ) { 690 if ( utcValue ) {
691 TimeZone tz; 691 TimeZone tz;
692 tz.setOffset(((utcValue->hour()*60)+utcValue->minute())*(utcValue->positive() ? 1 : -1)); 692 tz.setOffset(((utcValue->hour()*60)+utcValue->minute())*(utcValue->positive() ? 1 : -1));
693 return tz; 693 return tz;
694 } else 694 } else
695 return TimeZone(); 695 return TimeZone();
696} 696}
697 697
698Secrecy VCardFormatImpl::readClassValue( ContentLine *cl ) 698Secrecy VCardFormatImpl::readClassValue( ContentLine *cl )
699{ 699{
700 ClassValue *classValue = (ClassValue *)cl->value(); 700 ClassValue *classValue = (ClassValue *)cl->value();
701 if ( classValue ) { 701 if ( classValue ) {
702 Secrecy secrecy; 702 Secrecy secrecy;
703 switch ( classValue->type() ) { 703 switch ( classValue->type() ) {
704 case ClassValue::Public: 704 case ClassValue::Public:
705 secrecy.setType( Secrecy::Public ); 705 secrecy.setType( Secrecy::Public );
706 break; 706 break;
707 case ClassValue::Private: 707 case ClassValue::Private:
708 secrecy.setType( Secrecy::Private ); 708 secrecy.setType( Secrecy::Private );
709 break; 709 break;
710 case ClassValue::Confidential: 710 case ClassValue::Confidential:
711 secrecy.setType( Secrecy::Confidential ); 711 secrecy.setType( Secrecy::Confidential );
712 break; 712 break;
713 } 713 }
714 714
715 return secrecy; 715 return secrecy;
716 } else 716 } else
717 return Secrecy(); 717 return Secrecy();
718} 718}
719 719
720void VCardFormatImpl::addKeyValue( VCARD::VCard *vcard, const Key &key ) 720void VCardFormatImpl::addKeyValue( VCARD::VCard *vcard, const Key &key )
721{ 721{
722 ContentLine cl; 722 ContentLine cl;
723 cl.setName( EntityTypeToParamName( EntityKey ) ); 723 cl.setName( EntityTypeToParamName( EntityKey ) );
724 724
725 ParamList params; 725 ParamList params;
726 if ( key.isBinary() ) { 726 if ( key.isBinary() ) {
727 cl.setValue( new TextValue( KCodecs::base64Encode( key.binaryData() ) ) ); 727 cl.setValue( new TextValue( KCodecs::base64Encode( key.binaryData() ) ) );
728 params.append( new Param( "ENCODING", "b" ) ); 728 params.append( new Param( "ENCODING", "b" ) );
729 } else { 729 } else {
730 cl.setValue( new TextValue( key.textData().utf8() ) ); 730 cl.setValue( new TextValue( key.textData().utf8() ) );
731 } 731 }
732 732
733 switch ( key.type() ) { 733 switch ( key.type() ) {
734 case Key::X509: 734 case Key::X509:
735 params.append( new Param( "TYPE", "X509" ) ); 735 params.append( new Param( "TYPE", "X509" ) );
736 break; 736 break;
737 case Key::PGP: 737 case Key::PGP:
738 params.append( new Param( "TYPE", "PGP" ) ); 738 params.append( new Param( "TYPE", "PGP" ) );
739 break; 739 break;
740 case Key::Custom: 740 case Key::Custom:
741 params.append( new Param( "TYPE", key.customTypeString().utf8() ) ); 741 params.append( new Param( "TYPE", key.customTypeString().utf8() ) );
742 break; 742 break;
743 } 743 }
744 744
745 cl.setParamList( params ); 745 cl.setParamList( params );
746 vcard->add( cl ); 746 vcard->add( cl );
747} 747}
748 748
749Key VCardFormatImpl::readKeyValue( VCARD::ContentLine *cl ) 749Key VCardFormatImpl::readKeyValue( VCARD::ContentLine *cl )
750{ 750{
751 Key key; 751 Key key;
752 bool isBinary = false; 752 bool isBinary = false;
753 TextValue *v = (TextValue *)cl->value(); 753 TextValue *v = (TextValue *)cl->value();
754 754
755 ParamList params = cl->paramList(); 755 ParamList params = cl->paramList();
756 ParamListIterator it( params ); 756 ParamListIterator it( params );
757 for( ; it.current(); ++it ) { 757 for( ; it.current(); ++it ) {
758 if ( (*it)->name() == "ENCODING" && (*it)->value() == "b" ) 758 if ( (*it)->name() == "ENCODING" && (*it)->value() == "b" )
759 isBinary = true; 759 isBinary = true;
760 if ( (*it)->name() == "TYPE" ) { 760 if ( (*it)->name() == "TYPE" ) {
761 if ( (*it)->value().isEmpty() ) 761 if ( (*it)->value().isEmpty() )
762 continue; 762 continue;
763 if ( (*it)->value() == "X509" ) 763 if ( (*it)->value() == "X509" )
764 key.setType( Key::X509 ); 764 key.setType( Key::X509 );
765 else if ( (*it)->value() == "PGP" ) 765 else if ( (*it)->value() == "PGP" )
766 key.setType( Key::PGP ); 766 key.setType( Key::PGP );
767 else { 767 else {
768 key.setType( Key::Custom ); 768 key.setType( Key::Custom );
769 key.setCustomTypeString( QString::fromUtf8( (*it)->value() ) ); 769 key.setCustomTypeString( QString::fromUtf8( (*it)->value() ) );
770 } 770 }
771 } 771 }
772 } 772 }
773 773
774 774
775 if ( isBinary ) { 775 if ( isBinary ) {
776 QByteArray data; 776 QByteArray data;
777 KCodecs::base64Decode( v->asString().stripWhiteSpace(), data ); 777 KCodecs::base64Decode( v->asString().stripWhiteSpace(), data );
778 key.setBinaryData( data ); 778 key.setBinaryData( data );
779 } else { 779 } else {
780 key.setTextData( QString::fromUtf8( v->asString() ) ); 780 key.setTextData( QString::fromUtf8( v->asString() ) );
781 } 781 }
782 782
783 return key; 783 return key;
784} 784}
785 785
786 786
787void VCardFormatImpl::addAgentValue( VCARD::VCard *vcard, const Agent &agent ) 787void VCardFormatImpl::addAgentValue( VCARD::VCard *vcard, const Agent &agent )
788{ 788{
789 if ( agent.isIntern() && !agent.addressee() ) 789 if ( agent.isIntern() && !agent.addressee() )
790 return; 790 return;
791 791
792 if ( !agent.isIntern() && agent.url().isEmpty() ) 792 if ( !agent.isIntern() && agent.url().isEmpty() )
793 return; 793 return;
794 794
795 ContentLine cl; 795 ContentLine cl;
796 cl.setName( EntityTypeToParamName( EntityAgent ) ); 796 cl.setName( EntityTypeToParamName( EntityAgent ) );
797 797
798 ParamList params; 798 ParamList params;
799 if ( agent.isIntern() ) { 799 if ( agent.isIntern() ) {
800 QString vstr; 800 QString vstr;
801 Addressee *addr = agent.addressee(); 801 Addressee *addr = agent.addressee();
802 if ( addr ) { 802 if ( addr ) {
803 writeToString( (*addr), vstr ); 803 writeToString( (*addr), vstr );
804 804
805 qDebug("VCardFormatImpl::addAgentValue please verify if replace is correct"); 805 qDebug("VCardFormatImpl::addAgentValue please verify if replace is correct");
806/*US 806/*US
807 vstr.replace( ":", "\\:" ); 807 vstr.replace( ":", "\\:" );
808 vstr.replace( ",", "\\," ); 808 vstr.replace( ",", "\\," );
809 vstr.replace( ";", "\\;" ); 809 vstr.replace( ";", "\\;" );
810 vstr.replace( "\r\n", "\\n" ); 810 vstr.replace( "\r\n", "\\n" );
811*/ 811*/
812 vstr.replace( QRegExp(":"), "\\:" ); 812 vstr.replace( QRegExp(":"), "\\:" );
813 vstr.replace( QRegExp(","), "\\," ); 813 vstr.replace( QRegExp(","), "\\," );
814 vstr.replace( QRegExp(";"), "\\;" ); 814 vstr.replace( QRegExp(";"), "\\;" );
815 vstr.replace( QRegExp("\r\n"), "\\n" ); 815 vstr.replace( QRegExp("\r\n"), "\\n" );
816 816
817 cl.setValue( new TextValue( vstr.utf8() ) ); 817 cl.setValue( new TextValue( vstr.utf8() ) );
818 } else 818 } else
819 return; 819 return;
820 } else { 820 } else {
821 cl.setValue( new TextValue( agent.url().utf8() ) ); 821 cl.setValue( new TextValue( agent.url().utf8() ) );
822 params.append( new Param( "VALUE", "uri" ) ); 822 params.append( new Param( "VALUE", "uri" ) );
823 } 823 }
824 824
825 cl.setParamList( params ); 825 cl.setParamList( params );
826 vcard->add( cl ); 826 vcard->add( cl );
827} 827}
828 828
829Agent VCardFormatImpl::readAgentValue( VCARD::ContentLine *cl ) 829Agent VCardFormatImpl::readAgentValue( VCARD::ContentLine *cl )
830{ 830{
831 Agent agent; 831 Agent agent;
832 bool isIntern = true; 832 bool isIntern = true;
833 TextValue *v = (TextValue *)cl->value(); 833 TextValue *v = (TextValue *)cl->value();
834 834
835 ParamList params = cl->paramList(); 835 ParamList params = cl->paramList();
836 ParamListIterator it( params ); 836 ParamListIterator it( params );
837 for( ; it.current(); ++it ) { 837 for( ; it.current(); ++it ) {
838 if ( (*it)->name() == "VALUE" && (*it)->value() == "uri" ) 838 if ( (*it)->name() == "VALUE" && (*it)->value() == "uri" )
839 isIntern = false; 839 isIntern = false;
840 } 840 }
841 841
842 if ( isIntern ) { 842 if ( isIntern ) {
843 QString vstr = QString::fromUtf8( v->asString() ); 843 QString vstr = QString::fromUtf8( v->asString() );
844 qDebug("VCardFormatImpl::addAgentValue please verify if replace is correct"); 844 qDebug("VCardFormatImpl::addAgentValue please verify if replace is correct");
845/*US 845/*US
846 vstr.replace( "\\n", "\r\n" ); 846 vstr.replace( "\\n", "\r\n" );
847 vstr.replace( "\\:", ":" ); 847 vstr.replace( "\\:", ":" );
848 vstr.replace( "\\,", "," ); 848 vstr.replace( "\\,", "," );
849 vstr.replace( "\\;", ";" ); 849 vstr.replace( "\\;", ";" );
850*/ 850*/
851 vstr.replace( QRegExp("\\n"), "\r\n" ); 851 vstr.replace( QRegExp("\\\\n"), "\r\n" );
852 vstr.replace( QRegExp("\\:"), ":" ); 852 vstr.replace( QRegExp("\\\\:"), ":" );
853 vstr.replace( QRegExp("\\,"), "," ); 853 vstr.replace( QRegExp("\\\\,"), "," );
854 vstr.replace( QRegExp("\\;"), ";" ); 854 vstr.replace( QRegExp("\\\\;"), ";" );
855 855
856 Addressee *addr = new Addressee; 856 Addressee *addr = new Addressee;
857 readFromString( vstr, *addr ); 857 readFromString( vstr, *addr );
858 agent.setAddressee( addr ); 858 agent.setAddressee( addr );
859 } else { 859 } else {
860 agent.setUrl( QString::fromUtf8( v->asString() ) ); 860 agent.setUrl( QString::fromUtf8( v->asString() ) );
861 } 861 }
862 862
863 return agent; 863 return agent;
864} 864}
865 865
866void VCardFormatImpl::addPictureValue( VCARD::VCard *vcard, VCARD::EntityType type, const Picture &pic, const Addressee &addr, bool intern ) 866void VCardFormatImpl::addPictureValue( VCARD::VCard *vcard, VCARD::EntityType type, const Picture &pic, const Addressee &addr, bool intern )
867{ 867{
868 ContentLine cl; 868 ContentLine cl;
869 cl.setName( EntityTypeToParamName( type ) ); 869 cl.setName( EntityTypeToParamName( type ) );
870 870
871 if ( pic.isIntern() && pic.data().isNull() ) 871 if ( pic.isIntern() && pic.data().isNull() )
872 return; 872 return;
873 873
874 if ( !pic.isIntern() && pic.url().isEmpty() ) 874 if ( !pic.isIntern() && pic.url().isEmpty() )
875 return; 875 return;
876 876
877 ParamList params; 877 ParamList params;
878 if ( pic.isIntern() ) { 878 if ( pic.isIntern() ) {
879 QImage img = pic.data(); 879 QImage img = pic.data();
880 if ( intern ) { // only for vCard export we really write the data inline 880 if ( intern ) { // only for vCard export we really write the data inline
881 QByteArray data; 881 QByteArray data;
882 QDataStream s( data, IO_WriteOnly ); 882 QDataStream s( data, IO_WriteOnly );
883 s.setVersion( 4 ); // to produce valid png files 883 s.setVersion( 4 ); // to produce valid png files
884 s << img; 884 s << img;
885 cl.setValue( new TextValue( KCodecs::base64Encode( data ) ) ); 885 cl.setValue( new TextValue( KCodecs::base64Encode( data ) ) );
886 886
887 } else { // save picture in cache 887 } else { // save picture in cache
888 QString dir; 888 QString dir;
889 if ( type == EntityPhoto ) 889 if ( type == EntityPhoto )
890 dir = "photos"; 890 dir = "photos";
891 if ( type == EntityLogo ) 891 if ( type == EntityLogo )
892 dir = "logos"; 892 dir = "logos";
893 893
894 img.save( locateLocal( "data", "kabc/" + dir + "/" + addr.uid() ), pic.type().utf8() ); 894 img.save( locateLocal( "data", "kabc/" + dir + "/" + addr.uid() ), pic.type().utf8() );
895 cl.setValue( new TextValue( "<dummy>" ) ); 895 cl.setValue( new TextValue( "<dummy>" ) );
896 } 896 }
897 params.append( new Param( "ENCODING", "b" ) ); 897 params.append( new Param( "ENCODING", "b" ) );
898 if ( !pic.type().isEmpty() ) 898 if ( !pic.type().isEmpty() )
899 params.append( new Param( "TYPE", pic.type().utf8() ) ); 899 params.append( new Param( "TYPE", pic.type().utf8() ) );
900 } else { 900 } else {
901 901
902 cl.setValue( new TextValue( pic.url().utf8() ) ); 902 cl.setValue( new TextValue( pic.url().utf8() ) );
903 params.append( new Param( "VALUE", "uri" ) ); 903 params.append( new Param( "VALUE", "uri" ) );
904 } 904 }
905 905
906 cl.setParamList( params ); 906 cl.setParamList( params );
907 vcard->add( cl ); 907 vcard->add( cl );
908} 908}
909 909
910Picture VCardFormatImpl::readPictureValue( VCARD::ContentLine *cl, VCARD::EntityType type, const Addressee &addr ) 910Picture VCardFormatImpl::readPictureValue( VCARD::ContentLine *cl, VCARD::EntityType type, const Addressee &addr )
911{ 911{
912 Picture pic; 912 Picture pic;
913 bool isInline = false; 913 bool isInline = false;
914 QString picType; 914 QString picType;
915 TextValue *v = (TextValue *)cl->value(); 915 TextValue *v = (TextValue *)cl->value();
916 916
917 ParamList params = cl->paramList(); 917 ParamList params = cl->paramList();
918 ParamListIterator it( params ); 918 ParamListIterator it( params );
919 for( ; it.current(); ++it ) { 919 for( ; it.current(); ++it ) {
920 if ( (*it)->name() == "ENCODING" && (*it)->value() == "b" ) 920 if ( (*it)->name() == "ENCODING" && (*it)->value() == "b" )
921 isInline = true; 921 isInline = true;
922 if ( (*it)->name() == "TYPE" && !(*it)->value().isEmpty() ) 922 if ( (*it)->name() == "TYPE" && !(*it)->value().isEmpty() )
923 picType = QString::fromUtf8( (*it)->value() ); 923 picType = QString::fromUtf8( (*it)->value() );
924 } 924 }
925 925
926 if ( isInline ) { 926 if ( isInline ) {
927 QImage img; 927 QImage img;
928 if ( v->asString() == "<dummy>" ) { // no picture inline stored => picture is in cache 928 if ( v->asString() == "<dummy>" ) { // no picture inline stored => picture is in cache
929 QString dir; 929 QString dir;
930 if ( type == EntityPhoto ) 930 if ( type == EntityPhoto )
931 dir = "photos"; 931 dir = "photos";
932 if ( type == EntityLogo ) 932 if ( type == EntityLogo )
933 dir = "logos"; 933 dir = "logos";
934 934
935 img.load( locateLocal( "data", "kabc/" + dir + "/" + addr.uid() ) ); 935 img.load( locateLocal( "data", "kabc/" + dir + "/" + addr.uid() ) );
936 } else { 936 } else {
937 QByteArray data; 937 QByteArray data;
938 KCodecs::base64Decode( v->asString(), data ); 938 KCodecs::base64Decode( v->asString(), data );
939 img.loadFromData( data ); 939 img.loadFromData( data );
940 } 940 }
941 pic.setData( img ); 941 pic.setData( img );
942 pic.setType( picType ); 942 pic.setType( picType );
943 } else { 943 } else {
944 pic.setUrl( QString::fromUtf8( v->asString() ) ); 944 pic.setUrl( QString::fromUtf8( v->asString() ) );
945 } 945 }
946 946
947 return pic; 947 return pic;
948} 948}
949 949
950void VCardFormatImpl::addSoundValue( VCARD::VCard *vcard, const Sound &sound, const Addressee &addr, bool intern ) 950void VCardFormatImpl::addSoundValue( VCARD::VCard *vcard, const Sound &sound, const Addressee &addr, bool intern )
951{ 951{
952 ContentLine cl; 952 ContentLine cl;
953 cl.setName( EntityTypeToParamName( EntitySound ) ); 953 cl.setName( EntityTypeToParamName( EntitySound ) );
954 954
955 if ( sound.isIntern() && sound.data().isNull() ) 955 if ( sound.isIntern() && sound.data().isNull() )
956 return; 956 return;
957 957
958 if ( !sound.isIntern() && sound.url().isEmpty() ) 958 if ( !sound.isIntern() && sound.url().isEmpty() )
959 return; 959 return;
960 960
961 ParamList params; 961 ParamList params;
962 if ( sound.isIntern() ) { 962 if ( sound.isIntern() ) {
963 QByteArray data = sound.data(); 963 QByteArray data = sound.data();
964 if ( intern ) { // only for vCard export we really write the data inline 964 if ( intern ) { // only for vCard export we really write the data inline
965 cl.setValue( new TextValue( KCodecs::base64Encode( data ) ) ); 965 cl.setValue( new TextValue( KCodecs::base64Encode( data ) ) );
966 } else { // save sound in cache 966 } else { // save sound in cache
967 QFile file( locateLocal( "data", "kabc/sounds/" + addr.uid() ) ); 967 QFile file( locateLocal( "data", "kabc/sounds/" + addr.uid() ) );
968 if ( file.open( IO_WriteOnly ) ) { 968 if ( file.open( IO_WriteOnly ) ) {
969 file.writeBlock( data ); 969 file.writeBlock( data );
970 } 970 }
971 cl.setValue( new TextValue( "<dummy>" ) ); 971 cl.setValue( new TextValue( "<dummy>" ) );
972 } 972 }
973 params.append( new Param( "ENCODING", "b" ) ); 973 params.append( new Param( "ENCODING", "b" ) );
974 } else { 974 } else {
975 cl.setValue( new TextValue( sound.url().utf8() ) ); 975 cl.setValue( new TextValue( sound.url().utf8() ) );
976 params.append( new Param( "VALUE", "uri" ) ); 976 params.append( new Param( "VALUE", "uri" ) );
977 } 977 }
978 978
979 cl.setParamList( params ); 979 cl.setParamList( params );
980 vcard->add( cl ); 980 vcard->add( cl );
981} 981}
982 982
983Sound VCardFormatImpl::readSoundValue( VCARD::ContentLine *cl, const Addressee &addr ) 983Sound VCardFormatImpl::readSoundValue( VCARD::ContentLine *cl, const Addressee &addr )
984{ 984{
985 Sound sound; 985 Sound sound;
986 bool isInline = false; 986 bool isInline = false;
987 TextValue *v = (TextValue *)cl->value(); 987 TextValue *v = (TextValue *)cl->value();
988 988
989 ParamList params = cl->paramList(); 989 ParamList params = cl->paramList();
990 ParamListIterator it( params ); 990 ParamListIterator it( params );
991 for( ; it.current(); ++it ) { 991 for( ; it.current(); ++it ) {
992 if ( (*it)->name() == "ENCODING" && (*it)->value() == "b" ) 992 if ( (*it)->name() == "ENCODING" && (*it)->value() == "b" )
993 isInline = true; 993 isInline = true;
994 } 994 }
995 995
996 if ( isInline ) { 996 if ( isInline ) {
997 QByteArray data; 997 QByteArray data;
998 if ( v->asString() == "<dummy>" ) { // no sound inline stored => sound is in cache 998 if ( v->asString() == "<dummy>" ) { // no sound inline stored => sound is in cache
999 QFile file( locateLocal( "data", "kabc/sounds/" + addr.uid() ) ); 999 QFile file( locateLocal( "data", "kabc/sounds/" + addr.uid() ) );
1000 if ( file.open( IO_ReadOnly ) ) { 1000 if ( file.open( IO_ReadOnly ) ) {
1001 data = file.readAll(); 1001 data = file.readAll();
1002 file.close(); 1002 file.close();
1003 } 1003 }
1004 } else { 1004 } else {
1005 KCodecs::base64Decode( v->asString(), data ); 1005 KCodecs::base64Decode( v->asString(), data );
1006 } 1006 }
1007 sound.setData( data ); 1007 sound.setData( data );
1008 } else { 1008 } else {
1009 sound.setUrl( QString::fromUtf8( v->asString() ) ); 1009 sound.setUrl( QString::fromUtf8( v->asString() ) );
1010 } 1010 }
1011 1011
1012 return sound; 1012 return sound;
1013} 1013}
1014 1014
1015bool VCardFormatImpl::readFromString( const QString &vcard, Addressee &addressee ) 1015bool VCardFormatImpl::readFromString( const QString &vcard, Addressee &addressee )
1016{ 1016{
1017 VCardEntity e( vcard.utf8() ); 1017 VCardEntity e( vcard.utf8() );
1018 VCardListIterator it( e.cardList() ); 1018 VCardListIterator it( e.cardList() );
1019 1019
1020 if ( it.current() ) { 1020 if ( it.current() ) {
1021//US VCard v(*it.current()); 1021//US VCard v(*it.current());
1022//US loadAddressee( addressee, v ); 1022//US loadAddressee( addressee, v );
1023 loadAddressee( addressee, it.current() ); 1023 loadAddressee( addressee, it.current() );
1024 return true; 1024 return true;
1025 } 1025 }
1026 1026
1027 return false; 1027 return false;
1028} 1028}
1029 1029
1030bool VCardFormatImpl::writeToString( const Addressee &addressee, QString &vcard ) 1030bool VCardFormatImpl::writeToString( const Addressee &addressee, QString &vcard )
1031{ 1031{
1032 VCardEntity vcards; 1032 VCardEntity vcards;
1033 VCardList vcardlist; 1033 VCardList vcardlist;
1034 vcardlist.setAutoDelete( true ); 1034 vcardlist.setAutoDelete( true );
1035 1035
1036 VCard *v = new VCard; 1036 VCard *v = new VCard;
1037 1037
1038 saveAddressee( addressee, v, true ); 1038 saveAddressee( addressee, v, true );
1039 1039
1040 vcardlist.append( v ); 1040 vcardlist.append( v );
1041 vcards.setCardList( vcardlist ); 1041 vcards.setCardList( vcardlist );
1042 vcard = QString::fromUtf8( vcards.asString() ); 1042 vcard = QString::fromUtf8( vcards.asString() );
1043 1043
1044 return true; 1044 return true;
1045} 1045}
diff --git a/kabc/vcardparser/vcardparser.cpp b/kabc/vcardparser/vcardparser.cpp
index 9ea084d..bec2a0c 100644
--- a/kabc/vcardparser/vcardparser.cpp
+++ b/kabc/vcardparser/vcardparser.cpp
@@ -1,233 +1,233 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2003 Tobias Koenig <tokoe@kde.org> 3 Copyright (c) 2003 Tobias Koenig <tokoe@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21#include <qregexp.h> 21#include <qregexp.h>
22 22
23#include <kmdcodec.h> 23#include <kmdcodec.h>
24 24
25#include "vcardparser.h" 25#include "vcardparser.h"
26 26
27#define FOLD_WIDTH 75 27#define FOLD_WIDTH 75
28 28
29using namespace KABC; 29using namespace KABC;
30 30
31VCardParser::VCardParser() 31VCardParser::VCardParser()
32{ 32{
33} 33}
34 34
35VCardParser::~VCardParser() 35VCardParser::~VCardParser()
36{ 36{
37} 37}
38 38
39VCard::List VCardParser::parseVCards( const QString& text ) 39VCard::List VCardParser::parseVCards( const QString& text )
40{ 40{
41 VCard currentVCard; 41 VCard currentVCard;
42 VCard::List vCardList; 42 VCard::List vCardList;
43 QString currentLine; 43 QString currentLine;
44 44
45 QStringList lines = QStringList::split( QRegExp( "[\x0d\x0a]" ), text ); 45 QStringList lines = QStringList::split( QRegExp( "[\x0d\x0a]" ), text );
46 QStringList::Iterator it; 46 QStringList::Iterator it;
47 47
48 bool inVCard = false; 48 bool inVCard = false;
49 for ( it = lines.begin(); it != lines.end(); ++it ) { 49 for ( it = lines.begin(); it != lines.end(); ++it ) {
50 50
51 if ( (*it).isEmpty() ) // empty line 51 if ( (*it).isEmpty() ) // empty line
52 continue; 52 continue;
53 53
54 if ( (*it)[ 0 ] == ' ' || (*it)[ 0 ] == '\t' ) { // folded line => append to previous 54 if ( (*it)[ 0 ] == ' ' || (*it)[ 0 ] == '\t' ) { // folded line => append to previous
55 currentLine += (*it).remove( 0, 1 ); 55 currentLine += (*it).remove( 0, 1 );
56 continue; 56 continue;
57 } else { 57 } else {
58 if ( inVCard && !currentLine.isEmpty() ) { // now parse the line 58 if ( inVCard && !currentLine.isEmpty() ) { // now parse the line
59 int colon = currentLine.find( ':' ); 59 int colon = currentLine.find( ':' );
60 if ( colon == -1 ) { // invalid line 60 if ( colon == -1 ) { // invalid line
61 currentLine = (*it); 61 currentLine = (*it);
62 continue; 62 continue;
63 } 63 }
64 64
65 VCardLine vCardLine; 65 VCardLine vCardLine;
66 QString key = currentLine.left( colon ).stripWhiteSpace(); 66 QString key = currentLine.left( colon ).stripWhiteSpace();
67 QString value = currentLine.mid( colon + 1 ); 67 QString value = currentLine.mid( colon + 1 );
68 68
69 QStringList params = QStringList::split( ';', key ); 69 QStringList params = QStringList::split( ';', key );
70 vCardLine.setIdentifier( params[0] ); 70 vCardLine.setIdentifier( params[0] );
71 if ( params.count() > 1 ) { // find all parameters 71 if ( params.count() > 1 ) { // find all parameters
72 for ( uint i = 1; i < params.count(); ++i ) { 72 for ( uint i = 1; i < params.count(); ++i ) {
73 QStringList pair = QStringList::split( '=', params[i] ); 73 QStringList pair = QStringList::split( '=', params[i] );
74//US if ( pair.size() == 1 ) { 74//US if ( pair.size() == 1 ) {
75 if ( pair.count() == 1 ) { 75 if ( pair.count() == 1 ) {
76 pair.prepend( "type" ); 76 pair.prepend( "type" );
77 } 77 }
78 if ( pair[1].contains( ',' ) ) { // parameter in type=x,y,z format 78 if ( pair[1].contains( ',' ) ) { // parameter in type=x,y,z format
79 QStringList args = QStringList::split( ',', pair[ 1 ] ); 79 QStringList args = QStringList::split( ',', pair[ 1 ] );
80 for ( uint j = 0; j < args.count(); ++j ) 80 for ( uint j = 0; j < args.count(); ++j )
81 vCardLine.addParameter( pair[0].lower(), args[j] ); 81 vCardLine.addParameter( pair[0].lower(), args[j] );
82 } else 82 } else
83 vCardLine.addParameter( pair[0].lower(), pair[1] ); 83 vCardLine.addParameter( pair[0].lower(), pair[1] );
84 } 84 }
85 } 85 }
86 86
87 params = vCardLine.parameterList(); 87 params = vCardLine.parameterList();
88 if ( params.contains( "encoding" ) ) { // have to decode the data 88 if ( params.contains( "encoding" ) ) { // have to decode the data
89#if 0 89#if 0
90 QByteArray input, output; 90 QByteArray input, output;
91 input = value.local8Bit(); 91 input = value.local8Bit();
92 if ( vCardLine.parameter( "encoding" ).lower() == "b" ) 92 if ( vCardLine.parameter( "encoding" ).lower() == "b" )
93 KCodecs::base64Decode( input, output ); 93 KCodecs::base64Decode( input, output );
94 else if ( vCardLine.parameter( "encoding" ).lower() == "quoted-printable" ) 94 else if ( vCardLine.parameter( "encoding" ).lower() == "quoted-printable" )
95 KCodecs::quotedPrintableDecode( input, output ); 95 KCodecs::quotedPrintableDecode( input, output );
96 96
97 //qDebug("VCardParser::parseVCards has to be verified"); 97 //qDebug("VCardParser::parseVCards has to be verified");
98 //US I am not sure if this is correct 98 //US I am not sure if this is correct
99 //US vCardLine.setValue( output ); 99 //US vCardLine.setValue( output );
100 QCString cs(output); 100 QCString cs(output);
101 qDebug("len1 %d len2 %d ",input.size(), output.size( )); 101 qDebug("len1 %d len2 %d ",input.size(), output.size( ));
102#endif 102#endif
103 QCString cs = value.local8Bit(); 103 QCString cs = value.local8Bit();
104 qDebug("****************************************** "); 104 qDebug("****************************************** ");
105 qDebug("************* WARNING ******************** "); 105 qDebug("************* WARNING ******************** ");
106 qDebug("****************************************** "); 106 qDebug("****************************************** ");
107 qDebug("Make sure, the decoding is done after"); 107 qDebug("Make sure, the decoding is done after");
108 qDebug("QVariant conversion!"); 108 qDebug("QVariant conversion!");
109 qDebug("Insert Line DECODING OKAY, where this is implemented"); 109 qDebug("Insert Line DECODING OKAY, where this is implemented");
110 // use for decoding the above code! 110 // use for decoding the above code!
111 vCardLine.setValue( cs ); 111 vCardLine.setValue( cs );
112 } else { 112 } else {
113 113
114 //qDebug("VCardParser::parseVCards has to be verified"); 114 //qDebug("VCardParser::parseVCards has to be verified");
115//US vCardLine.setValue( value.replace( "\\n", "\n" ) ); 115//US vCardLine.setValue( value.replace( "\\n", "\n" ) );
116 vCardLine.setValue( value.replace( QRegExp("\\n"), "\n" ) ); 116 vCardLine.setValue( value.replace( QRegExp("\\\\n"), "\n" ) );
117 } 117 }
118 118
119 currentVCard.addLine( vCardLine ); 119 currentVCard.addLine( vCardLine );
120 } 120 }
121 // we do not save the start and end tag as vcardline 121 // we do not save the start and end tag as vcardline
122 if ( (*it).lower().startsWith( "begin:vcard" ) ) { 122 if ( (*it).lower().startsWith( "begin:vcard" ) ) {
123 inVCard = true; 123 inVCard = true;
124 //qDebug("VCardParser::parseVCards has to be verified"); 124 //qDebug("VCardParser::parseVCards has to be verified");
125//US currentLine.setLength( 0 ); 125//US currentLine.setLength( 0 );
126 currentLine = ""; 126 currentLine = "";
127 currentVCard.clear(); // flush vcard 127 currentVCard.clear(); // flush vcard
128 continue; 128 continue;
129 } 129 }
130 130
131 if ( (*it).lower().startsWith( "end:vcard" ) ) { 131 if ( (*it).lower().startsWith( "end:vcard" ) ) {
132 inVCard = false; 132 inVCard = false;
133 vCardList.append( currentVCard ); 133 vCardList.append( currentVCard );
134 //qDebug("VCardParser::parseVCards has to be verified"); 134 //qDebug("VCardParser::parseVCards has to be verified");
135//US currentLine.setLength( 0 ); 135//US currentLine.setLength( 0 );
136 currentLine = ""; 136 currentLine = "";
137 currentVCard.clear(); // flush vcard 137 currentVCard.clear(); // flush vcard
138 continue; 138 continue;
139 } 139 }
140 140
141 currentLine = (*it); 141 currentLine = (*it);
142 } 142 }
143 } 143 }
144 144
145 return vCardList; 145 return vCardList;
146} 146}
147 147
148QString VCardParser::createVCards( const VCard::List& list ) 148QString VCardParser::createVCards( const VCard::List& list )
149{ 149{
150 QString text; 150 QString text;
151 QString textLine; 151 QString textLine;
152 QString encodingType; 152 QString encodingType;
153 QStringList idents; 153 QStringList idents;
154 QStringList params; 154 QStringList params;
155 QStringList values; 155 QStringList values;
156 QStringList::ConstIterator identIt; 156 QStringList::ConstIterator identIt;
157 QStringList::Iterator paramIt; 157 QStringList::Iterator paramIt;
158 QStringList::Iterator valueIt; 158 QStringList::Iterator valueIt;
159 159
160 VCardLine::List lines; 160 VCardLine::List lines;
161 VCardLine::List::Iterator lineIt; 161 VCardLine::List::Iterator lineIt;
162 VCard::List::ConstIterator cardIt; 162 VCard::List::ConstIterator cardIt;
163 163
164 bool hasEncoding; 164 bool hasEncoding;
165 165
166 166
167 // iterate over the cards 167 // iterate over the cards
168 for ( cardIt = list.begin(); cardIt != list.end(); ++cardIt ) { 168 for ( cardIt = list.begin(); cardIt != list.end(); ++cardIt ) {
169 text.append( "BEGIN:VCARD\r\n" ); 169 text.append( "BEGIN:VCARD\r\n" );
170 170
171 idents = (*cardIt).identifiers(); 171 idents = (*cardIt).identifiers();
172 for ( identIt = idents.begin(); identIt != idents.end(); ++identIt ) { 172 for ( identIt = idents.begin(); identIt != idents.end(); ++identIt ) {
173 VCard card = (*cardIt); 173 VCard card = (*cardIt);
174 lines = card.lines( (*identIt) ); 174 lines = card.lines( (*identIt) );
175 175
176 // iterate over the lines 176 // iterate over the lines
177 for ( lineIt = lines.begin(); lineIt != lines.end(); ++lineIt ) { 177 for ( lineIt = lines.begin(); lineIt != lines.end(); ++lineIt ) {
178 if ( !(*lineIt).value().asString().isEmpty() ) { 178 if ( !(*lineIt).value().asString().isEmpty() ) {
179 textLine = (*lineIt).identifier(); 179 textLine = (*lineIt).identifier();
180 180
181 params = (*lineIt).parameterList(); 181 params = (*lineIt).parameterList();
182 hasEncoding = false; 182 hasEncoding = false;
183 if ( params.count() > 0 ) { // we have parameters 183 if ( params.count() > 0 ) { // we have parameters
184 for ( paramIt = params.begin(); paramIt != params.end(); ++paramIt ) { 184 for ( paramIt = params.begin(); paramIt != params.end(); ++paramIt ) {
185 if ( (*paramIt) == "encoding" ) { 185 if ( (*paramIt) == "encoding" ) {
186 hasEncoding = true; 186 hasEncoding = true;
187 encodingType = (*lineIt).parameter( "encoding" ).lower(); 187 encodingType = (*lineIt).parameter( "encoding" ).lower();
188 } 188 }
189 189
190 values = (*lineIt).parameters( *paramIt ); 190 values = (*lineIt).parameters( *paramIt );
191 for ( valueIt = values.begin(); valueIt != values.end(); ++valueIt ) { 191 for ( valueIt = values.begin(); valueIt != values.end(); ++valueIt ) {
192 textLine.append( ";" + (*paramIt).upper() ); 192 textLine.append( ";" + (*paramIt).upper() );
193 if ( !(*valueIt).isEmpty() ) 193 if ( !(*valueIt).isEmpty() )
194 textLine.append( "=" + (*valueIt) ); 194 textLine.append( "=" + (*valueIt) );
195 } 195 }
196 } 196 }
197 } 197 }
198 198
199 if ( hasEncoding ) { // have to encode the data 199 if ( hasEncoding ) { // have to encode the data
200 QByteArray input, output; 200 QByteArray input, output;
201 201
202 qDebug("VCardParser::createVCards has to be verified"); 202 qDebug("VCardParser::createVCards has to be verified");
203//US input = (*lineIt).value().toByteArray(); 203//US input = (*lineIt).value().toByteArray();
204 204
205//US I am not sure if this is correct 205//US I am not sure if this is correct
206 QCString cs ((*lineIt).value().toCString()); 206 QCString cs ((*lineIt).value().toCString());
207 input = cs; 207 input = cs;
208 208
209 if ( encodingType == "b" ) 209 if ( encodingType == "b" )
210 KCodecs::base64Encode( input, output ); 210 KCodecs::base64Encode( input, output );
211 else if ( encodingType == "quoted-printable" ) 211 else if ( encodingType == "quoted-printable" )
212 KCodecs::quotedPrintableEncode( input, output ); 212 KCodecs::quotedPrintableEncode( input, output );
213 textLine.append( ":" + QString( output ) ); 213 textLine.append( ":" + QString( output ) );
214 } else { 214 } else {
215 qDebug("VCardParser::createVCards has to be verified"); 215 qDebug("VCardParser::createVCards has to be verified");
216//US textLine.append( ":" + (*lineIt).value().asString().replace( "\n", "\\n" ) ); 216//US textLine.append( ":" + (*lineIt).value().asString().replace( "\n", "\\n" ) );
217 textLine.append( ":" + (*lineIt).value().asString().replace( QRegExp("\n"), "\\n" ) ); 217 textLine.append( ":" + (*lineIt).value().asString().replace( QRegExp("\n"), "\\n" ) );
218 } 218 }
219 if ( textLine.length() > FOLD_WIDTH ) { // we have to fold the line 219 if ( textLine.length() > FOLD_WIDTH ) { // we have to fold the line
220 for ( uint i = 0; i <= ( textLine.length() / FOLD_WIDTH ); ++i ) 220 for ( uint i = 0; i <= ( textLine.length() / FOLD_WIDTH ); ++i )
221 text.append( ( i == 0 ? "" : " " ) + textLine.mid( i * FOLD_WIDTH, FOLD_WIDTH ) + "\r\n" ); 221 text.append( ( i == 0 ? "" : " " ) + textLine.mid( i * FOLD_WIDTH, FOLD_WIDTH ) + "\r\n" );
222 } else 222 } else
223 text.append( textLine + "\r\n" ); 223 text.append( textLine + "\r\n" );
224 } 224 }
225 } 225 }
226 } 226 }
227 227
228 text.append( "END:VCARD\r\n" ); 228 text.append( "END:VCARD\r\n" );
229 text.append( "\r\n" ); 229 text.append( "\r\n" );
230 } 230 }
231 231
232 return text; 232 return text;
233} 233}
diff --git a/kabc/vcardparser/vcardtool.cpp b/kabc/vcardparser/vcardtool.cpp
index 3fb212e..d1f823b 100644
--- a/kabc/vcardparser/vcardtool.cpp
+++ b/kabc/vcardparser/vcardtool.cpp
@@ -559,340 +559,340 @@ QDateTime VCardTool::parseDateTime( const QString &str )
559 559
560 if ( str.find( 'T' ) ) // has time information yyyymmddThh:mm:ss 560 if ( str.find( 'T' ) ) // has time information yyyymmddThh:mm:ss
561 dateTime.setTime( QTime( str.mid( 11, 2 ).toInt(), str.mid( 14, 2 ).toInt(), 561 dateTime.setTime( QTime( str.mid( 11, 2 ).toInt(), str.mid( 14, 2 ).toInt(),
562 str.mid( 17, 2 ).toInt() ) ); 562 str.mid( 17, 2 ).toInt() ) );
563 563
564 } else { // is extended format yyyy-mm-dd 564 } else { // is extended format yyyy-mm-dd
565 dateTime.setDate( QDate( str.left( 4 ).toInt(), str.mid( 5, 2 ).toInt(), 565 dateTime.setDate( QDate( str.left( 4 ).toInt(), str.mid( 5, 2 ).toInt(),
566 str.mid( 8, 2 ).toInt() ) ); 566 str.mid( 8, 2 ).toInt() ) );
567 567
568 if ( str.find( 'T' ) ) // has time information yyyy-mm-ddThh:mm:ss 568 if ( str.find( 'T' ) ) // has time information yyyy-mm-ddThh:mm:ss
569 dateTime.setTime( QTime( str.mid( 11, 2 ).toInt(), str.mid( 14, 2 ).toInt(), 569 dateTime.setTime( QTime( str.mid( 11, 2 ).toInt(), str.mid( 14, 2 ).toInt(),
570 str.mid( 17, 2 ).toInt() ) ); 570 str.mid( 17, 2 ).toInt() ) );
571 } 571 }
572 572
573 return dateTime; 573 return dateTime;
574} 574}
575 575
576QString VCardTool::createDateTime( const QDateTime &dateTime ) 576QString VCardTool::createDateTime( const QDateTime &dateTime )
577{ 577{
578 QString str; 578 QString str;
579 579
580 if ( dateTime.date().isValid() ) { 580 if ( dateTime.date().isValid() ) {
581 str.sprintf( "%4d-%02d-%02d", dateTime.date().year(), dateTime.date().month(), 581 str.sprintf( "%4d-%02d-%02d", dateTime.date().year(), dateTime.date().month(),
582 dateTime.date().day() ); 582 dateTime.date().day() );
583 if ( dateTime.time().isValid() ) { 583 if ( dateTime.time().isValid() ) {
584 QString tmp; 584 QString tmp;
585 tmp.sprintf( "T%02d:%02d:%02dZ", dateTime.time().hour(), dateTime.time().minute(), 585 tmp.sprintf( "T%02d:%02d:%02dZ", dateTime.time().hour(), dateTime.time().minute(),
586 dateTime.time().second() ); 586 dateTime.time().second() );
587 str += tmp; 587 str += tmp;
588 } 588 }
589 } 589 }
590 590
591 return str; 591 return str;
592} 592}
593 593
594Picture VCardTool::parsePicture( const VCardLine &line ) 594Picture VCardTool::parsePicture( const VCardLine &line )
595{ 595{
596 Picture pic; 596 Picture pic;
597 597
598 QStringList params = line.parameterList(); 598 QStringList params = line.parameterList();
599 if ( params.contains( "encoding" ) ) { 599 if ( params.contains( "encoding" ) ) {
600 QCString cs(line.value().asCString()); 600 QCString cs(line.value().asCString());
601 QByteArray input, output; 601 QByteArray input, output;
602 input = line.value().asCString(); 602 input = line.value().asCString();
603 if ( line.parameter( "encoding" ).lower() == "b" ) 603 if ( line.parameter( "encoding" ).lower() == "b" )
604 KCodecs::base64Decode( input, output ); 604 KCodecs::base64Decode( input, output );
605 else if ( line.parameter( "encoding" ).lower() == "quoted-printable" ) 605 else if ( line.parameter( "encoding" ).lower() == "quoted-printable" )
606 KCodecs::quotedPrintableDecode( input, output ); 606 KCodecs::quotedPrintableDecode( input, output );
607 607
608 qDebug("********** DECODING OKAY ************** (picture)"); 608 qDebug("********** DECODING OKAY ************** (picture)");
609 pic.setData( QImage(output) ); 609 pic.setData( QImage(output) );
610 610
611 } 611 }
612 else if ( params.contains( "value" ) ) { 612 else if ( params.contains( "value" ) ) {
613 if ( line.parameter( "value" ).lower() == "uri" ) 613 if ( line.parameter( "value" ).lower() == "uri" )
614 pic.setUrl( line.value().asString() ); 614 pic.setUrl( line.value().asString() );
615 } 615 }
616 616
617 if ( params.contains( "type" ) ) 617 if ( params.contains( "type" ) )
618 pic.setType( line.parameter( "type" ) ); 618 pic.setType( line.parameter( "type" ) );
619 619
620 return pic; 620 return pic;
621} 621}
622 622
623VCardLine VCardTool::createPicture( const QString &identifier, const Picture &pic ) 623VCardLine VCardTool::createPicture( const QString &identifier, const Picture &pic )
624{ 624{
625 // LR fixed 625 // LR fixed
626 VCardLine line( identifier ); 626 VCardLine line( identifier );
627 627
628 if ( pic.isIntern() ) { 628 if ( pic.isIntern() ) {
629 if ( !pic.data().isNull() ) { 629 if ( !pic.data().isNull() ) {
630#if 0 630#if 0
631 QByteArray input; 631 QByteArray input;
632 QDataStream s( input, IO_WriteOnly ); 632 QDataStream s( input, IO_WriteOnly );
633 s.setVersion( 4 ); 633 s.setVersion( 4 );
634 s << pic.data(); 634 s << pic.data();
635 line.setValue( input ); 635 line.setValue( input );
636#else 636#else
637 QCString input; 637 QCString input;
638 QDataStream s( input, IO_WriteOnly ); 638 QDataStream s( input, IO_WriteOnly );
639 s.setVersion( 4 ); 639 s.setVersion( 4 );
640 s << pic.data(); 640 s << pic.data();
641 //QCString cs(line.value().asCString()); 641 //QCString cs(line.value().asCString());
642 //QImage qi(cs); 642 //QImage qi(cs);
643 line.setValue( input ); 643 line.setValue( input );
644#endif 644#endif
645 645
646 line.addParameter( "encoding", "b" ); 646 line.addParameter( "encoding", "b" );
647 line.addParameter( "type", "image/png" ); 647 line.addParameter( "type", "image/png" );
648 } 648 }
649 } else if ( !pic.url().isEmpty() ) { 649 } else if ( !pic.url().isEmpty() ) {
650 line.setValue( pic.url() ); 650 line.setValue( pic.url() );
651 line.addParameter( "value", "URI" ); 651 line.addParameter( "value", "URI" );
652 } 652 }
653 653
654 return line; 654 return line;
655} 655}
656 656
657Sound VCardTool::parseSound( const VCardLine &line ) 657Sound VCardTool::parseSound( const VCardLine &line )
658{ 658{
659 Sound snd; 659 Sound snd;
660 660
661 QStringList params = line.parameterList(); 661 QStringList params = line.parameterList();
662 if ( params.contains( "encoding" ) ) { 662 if ( params.contains( "encoding" ) ) {
663 qDebug("VCardTool::parseSound has to be verified"); 663 qDebug("VCardTool::parseSound has to be verified");
664//US snd.setData( line.value().asByteArray() ); 664//US snd.setData( line.value().asByteArray() );
665//US I am not sure if this is correct 665//US I am not sure if this is correct
666 QCString cs(line.value().asCString()); 666 QCString cs(line.value().asCString());
667 snd.setData( cs ); 667 snd.setData( cs );
668 } 668 }
669 else if ( params.contains( "value" ) ) { 669 else if ( params.contains( "value" ) ) {
670 if ( line.parameter( "value" ).lower() == "uri" ) 670 if ( line.parameter( "value" ).lower() == "uri" )
671 snd.setUrl( line.value().asString() ); 671 snd.setUrl( line.value().asString() );
672 } 672 }
673 673
674/* TODO: support sound types 674/* TODO: support sound types
675 if ( params.contains( "type" ) ) 675 if ( params.contains( "type" ) )
676 snd.setType( line.parameter( "type" ) ); 676 snd.setType( line.parameter( "type" ) );
677*/ 677*/
678 678
679 return snd; 679 return snd;
680} 680}
681 681
682VCardLine VCardTool::createSound( const Sound &snd ) 682VCardLine VCardTool::createSound( const Sound &snd )
683{ 683{
684 VCardLine line( "SOUND" ); 684 VCardLine line( "SOUND" );
685 685
686 if ( snd.isIntern() ) { 686 if ( snd.isIntern() ) {
687 if ( !snd.data().isEmpty() ) { 687 if ( !snd.data().isEmpty() ) {
688 qDebug("VCardTool::createSound has to be verified"); 688 qDebug("VCardTool::createSound has to be verified");
689//US line.setValue( snd.data() ); 689//US line.setValue( snd.data() );
690 690
691//US I am not sure if this is correct 691//US I am not sure if this is correct
692 QCString cs(snd.data()); 692 QCString cs(snd.data());
693 line.setValue( cs ); 693 line.setValue( cs );
694 694
695 695
696 line.addParameter( "encoding", "b" ); 696 line.addParameter( "encoding", "b" );
697 // TODO: need to store sound type!!! 697 // TODO: need to store sound type!!!
698 } 698 }
699 } else if ( !snd.url().isEmpty() ) { 699 } else if ( !snd.url().isEmpty() ) {
700 line.setValue( snd.url() ); 700 line.setValue( snd.url() );
701 line.addParameter( "value", "URI" ); 701 line.addParameter( "value", "URI" );
702 } 702 }
703 703
704 return line; 704 return line;
705} 705}
706 706
707Key VCardTool::parseKey( const VCardLine &line ) 707Key VCardTool::parseKey( const VCardLine &line )
708{ 708{
709 Key key; 709 Key key;
710 710
711 QStringList params = line.parameterList(); 711 QStringList params = line.parameterList();
712 if ( params.contains( "encoding" ) ) { 712 if ( params.contains( "encoding" ) ) {
713 qDebug("VCardTool::parseKey has to be verified"); 713 qDebug("VCardTool::parseKey has to be verified");
714//US key.setBinaryData( line.value().asByteArray() ); 714//US key.setBinaryData( line.value().asByteArray() );
715 715
716//US I am not sure if this is correct 716//US I am not sure if this is correct
717 QCString cs( line.value().asCString() ); 717 QCString cs( line.value().asCString() );
718 key.setBinaryData( cs ); 718 key.setBinaryData( cs );
719 } 719 }
720 else 720 else
721 key.setTextData( line.value().asString() ); 721 key.setTextData( line.value().asString() );
722 722
723 if ( params.contains( "type" ) ) { 723 if ( params.contains( "type" ) ) {
724 if ( line.parameter( "type" ).lower() == "x509" ) 724 if ( line.parameter( "type" ).lower() == "x509" )
725 key.setType( Key::X509 ); 725 key.setType( Key::X509 );
726 else if ( line.parameter( "type" ).lower() == "pgp" ) 726 else if ( line.parameter( "type" ).lower() == "pgp" )
727 key.setType( Key::PGP ); 727 key.setType( Key::PGP );
728 else { 728 else {
729 key.setType( Key::Custom ); 729 key.setType( Key::Custom );
730 key.setCustomTypeString( line.parameter( "type" ) ); 730 key.setCustomTypeString( line.parameter( "type" ) );
731 } 731 }
732 } 732 }
733 733
734 return key; 734 return key;
735} 735}
736 736
737VCardLine VCardTool::createKey( const Key &key ) 737VCardLine VCardTool::createKey( const Key &key )
738{ 738{
739 VCardLine line( "KEY" ); 739 VCardLine line( "KEY" );
740 740
741 if ( key.isBinary() ) { 741 if ( key.isBinary() ) {
742 if ( !key.binaryData().isEmpty() ) { 742 if ( !key.binaryData().isEmpty() ) {
743 qDebug("VCardTool::createKey has to be verified"); 743 qDebug("VCardTool::createKey has to be verified");
744//US line.setValue( key.binaryData() ); 744//US line.setValue( key.binaryData() );
745//US I am not sure if this is correct 745//US I am not sure if this is correct
746 QCString cs(key.binaryData()); 746 QCString cs(key.binaryData());
747 line.setValue( cs ); 747 line.setValue( cs );
748 748
749 749
750 line.addParameter( "encoding", "b" ); 750 line.addParameter( "encoding", "b" );
751 } 751 }
752 } else if ( !key.textData().isEmpty() ) 752 } else if ( !key.textData().isEmpty() )
753 line.setValue( key.textData() ); 753 line.setValue( key.textData() );
754 754
755 if ( key.type() == Key::X509 ) 755 if ( key.type() == Key::X509 )
756 line.addParameter( "type", "X509" ); 756 line.addParameter( "type", "X509" );
757 else if ( key.type() == Key::PGP ) 757 else if ( key.type() == Key::PGP )
758 line.addParameter( "type", "PGP" ); 758 line.addParameter( "type", "PGP" );
759 else if ( key.type() == Key::Custom ) 759 else if ( key.type() == Key::Custom )
760 line.addParameter( "type", key.customTypeString() ); 760 line.addParameter( "type", key.customTypeString() );
761 761
762 return line; 762 return line;
763} 763}
764 764
765Secrecy VCardTool::parseSecrecy( const VCardLine &line ) 765Secrecy VCardTool::parseSecrecy( const VCardLine &line )
766{ 766{
767 Secrecy secrecy; 767 Secrecy secrecy;
768 768
769 if ( line.value().asString().lower() == "public" ) 769 if ( line.value().asString().lower() == "public" )
770 secrecy.setType( Secrecy::Public ); 770 secrecy.setType( Secrecy::Public );
771 if ( line.value().asString().lower() == "private" ) 771 if ( line.value().asString().lower() == "private" )
772 secrecy.setType( Secrecy::Private ); 772 secrecy.setType( Secrecy::Private );
773 if ( line.value().asString().lower() == "confidential" ) 773 if ( line.value().asString().lower() == "confidential" )
774 secrecy.setType( Secrecy::Confidential ); 774 secrecy.setType( Secrecy::Confidential );
775 775
776 return secrecy; 776 return secrecy;
777} 777}
778 778
779VCardLine VCardTool::createSecrecy( const Secrecy &secrecy ) 779VCardLine VCardTool::createSecrecy( const Secrecy &secrecy )
780{ 780{
781 VCardLine line( "CLASS" ); 781 VCardLine line( "CLASS" );
782 782
783 int type = secrecy.type(); 783 int type = secrecy.type();
784 784
785 if ( type == Secrecy::Public ) 785 if ( type == Secrecy::Public )
786 line.setValue( "PUBLIC" ); 786 line.setValue( "PUBLIC" );
787 else if ( type == Secrecy::Private ) 787 else if ( type == Secrecy::Private )
788 line.setValue( "PRIVATE" ); 788 line.setValue( "PRIVATE" );
789 else if ( type == Secrecy::Confidential ) 789 else if ( type == Secrecy::Confidential )
790 line.setValue( "CONFIDENTIAL" ); 790 line.setValue( "CONFIDENTIAL" );
791 791
792 return line; 792 return line;
793} 793}
794 794
795Agent VCardTool::parseAgent( const VCardLine &line ) 795Agent VCardTool::parseAgent( const VCardLine &line )
796{ 796{
797 Agent agent; 797 Agent agent;
798 798
799 QStringList params = line.parameterList(); 799 QStringList params = line.parameterList();
800 if ( params.contains( "value" ) ) { 800 if ( params.contains( "value" ) ) {
801 if ( line.parameter( "value" ).lower() == "uri" ) 801 if ( line.parameter( "value" ).lower() == "uri" )
802 agent.setUrl( line.value().asString() ); 802 agent.setUrl( line.value().asString() );
803 } else { 803 } else {
804 QString str = line.value().asString(); 804 QString str = line.value().asString();
805 805
806//US using the old implementation instead 806//US using the old implementation instead
807 qDebug("VCardTool::parseAgent has to be verified"); 807 qDebug("VCardTool::parseAgent has to be verified");
808/*US 808/*US
809 str.replace( "\\n", "\r\n" ); 809 str.replace( "\\n", "\r\n" );
810 str.replace( "\\N", "\r\n" ); 810 str.replace( "\\N", "\r\n" );
811 str.replace( "\\;", ";" ); 811 str.replace( "\\;", ";" );
812 str.replace( "\\:", ":" ); 812 str.replace( "\\:", ":" );
813 str.replace( "\\,", "," ); 813 str.replace( "\\,", "," );
814*/ 814*/
815 str.replace( QRegExp("\\n") , "\r\n" ); 815 str.replace( QRegExp("\\\\n") , "\r\n" );
816 str.replace( QRegExp("\\N") , "\r\n" ); 816 str.replace( QRegExp("\\\\N") , "\r\n" );
817 str.replace( QRegExp("\\;") , ";" ); 817 str.replace( QRegExp("\\\\;") , ";" );
818 str.replace( QRegExp("\\:") , ":" ); 818 str.replace( QRegExp("\\\\:") , ":" );
819 str.replace( QRegExp("\\,") , "," ); 819 str.replace( QRegExp("\\\\,") , "," );
820 820
821 Addressee::List list = parseVCards( str ); 821 Addressee::List list = parseVCards( str );
822 if ( list.count() > 0 ) { 822 if ( list.count() > 0 ) {
823 Addressee *addr = new Addressee; 823 Addressee *addr = new Addressee;
824 *addr = list[ 0 ]; 824 *addr = list[ 0 ];
825 agent.setAddressee( addr ); 825 agent.setAddressee( addr );
826 } 826 }
827 } 827 }
828 828
829 return agent; 829 return agent;
830} 830}
831 831
832VCardLine VCardTool::createAgent( VCard::Version version, const Agent &agent ) 832VCardLine VCardTool::createAgent( VCard::Version version, const Agent &agent )
833{ 833{
834 VCardLine line( "AGENT" ); 834 VCardLine line( "AGENT" );
835 835
836 if ( agent.isIntern() ) { 836 if ( agent.isIntern() ) {
837 if ( agent.addressee() != 0 ) { 837 if ( agent.addressee() != 0 ) {
838 Addressee::List list; 838 Addressee::List list;
839 list.append( *agent.addressee() ); 839 list.append( *agent.addressee() );
840 840
841 QString str = createVCards( list, version ); 841 QString str = createVCards( list, version );
842 842
843//US using the old implementation instead 843//US using the old implementation instead
844 qDebug("VCardTool::createAgent has to be verified"); 844 qDebug("VCardTool::createAgent has to be verified");
845/*US 845/*US
846 str.replace( "\r\n", "\\n" ); 846 str.replace( "\r\n", "\\n" );
847 str.replace( ";", "\\;" ); 847 str.replace( ";", "\\;" );
848 str.replace( ":", "\\:" ); 848 str.replace( ":", "\\:" );
849 str.replace( ",", "\\," ); 849 str.replace( ",", "\\," );
850*/ 850*/
851 str.replace( QRegExp("\r\n"), "\\n" ); 851 str.replace( QRegExp("\r\n"), "\\n" );
852 str.replace( QRegExp(";"), "\\;" ); 852 str.replace( QRegExp(";"), "\\;" );
853 str.replace( QRegExp(":"), "\\:" ); 853 str.replace( QRegExp(":"), "\\:" );
854 str.replace( QRegExp(","), "\\," ); 854 str.replace( QRegExp(","), "\\," );
855 line.setValue( str ); 855 line.setValue( str );
856 } 856 }
857 } else if ( !agent.url().isEmpty() ) { 857 } else if ( !agent.url().isEmpty() ) {
858 line.setValue( agent.url() ); 858 line.setValue( agent.url() );
859 line.addParameter( "value", "URI" ); 859 line.addParameter( "value", "URI" );
860 } 860 }
861 861
862 return line; 862 return line;
863} 863}
864 864
865QStringList VCardTool::splitString( const QChar &sep, const QString &str ) 865QStringList VCardTool::splitString( const QChar &sep, const QString &str )
866{ 866{
867 QStringList list; 867 QStringList list;
868 QString value( str ); 868 QString value( str );
869 869
870 int start = 0; 870 int start = 0;
871 int pos = value.find( sep, start ); 871 int pos = value.find( sep, start );
872 872
873 while ( pos != -1 ) { 873 while ( pos != -1 ) {
874 if ( value[ pos - 1 ] != '\\' ) { 874 if ( value[ pos - 1 ] != '\\' ) {
875 if ( pos > start && pos <= (int)value.length() ) 875 if ( pos > start && pos <= (int)value.length() )
876 list << value.mid( start, pos - start ); 876 list << value.mid( start, pos - start );
877 else 877 else
878 list << QString::null; 878 list << QString::null;
879 879
880 start = pos + 1; 880 start = pos + 1;
881 pos = value.find( sep, start ); 881 pos = value.find( sep, start );
882 } else { 882 } else {
883 if ( pos != 0 ) { 883 if ( pos != 0 ) {
884 value.replace( pos - 1, 2, sep ); 884 value.replace( pos - 1, 2, sep );
885 pos = value.find( sep, pos ); 885 pos = value.find( sep, pos );
886 } else 886 } else
887 pos = value.find( sep, pos + 1 ); 887 pos = value.find( sep, pos + 1 );
888 } 888 }
889 } 889 }
890 890
891 int l = value.length() - 1; 891 int l = value.length() - 1;
892 if ( value.mid( start, l - start + 1 ).length() > 0 ) 892 if ( value.mid( start, l - start + 1 ).length() > 0 )
893 list << value.mid( start, l - start + 1 ); 893 list << value.mid( start, l - start + 1 );
894 else 894 else
895 list << QString::null; 895 list << QString::null;
896 896
897 return list; 897 return list;
898} 898}