-rw-r--r-- | kabc/vcardformatimpl.cpp | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/kabc/vcardformatimpl.cpp b/kabc/vcardformatimpl.cpp index 26fd4f0..580c28b 100644 --- a/kabc/vcardformatimpl.cpp +++ b/kabc/vcardformatimpl.cpp @@ -472,564 +472,568 @@ void VCardFormatImpl::addUTCValue( VCard *vcard, const TimeZone &tz ) { if ( !tz.isValid() ) return; ContentLine cl; cl.setName( EntityTypeToParamName( EntityTimeZone ) ); UTCValue *v = new UTCValue; v->setPositive( tz.offset() >= 0 ); v->setHour( (tz.offset() / 60) * ( tz.offset() >= 0 ? 1 : -1 ) ); v->setMinute( (tz.offset() % 60) * ( tz.offset() >= 0 ? 1 : -1 ) ); cl.setValue( v ); vcard->add(cl); } void VCardFormatImpl::addClassValue( VCard *vcard, const Secrecy &secrecy ) { ContentLine cl; cl.setName( EntityTypeToParamName( EntityClass ) ); ClassValue *v = new ClassValue; switch ( secrecy.type() ) { case Secrecy::Public: v->setType( (int)ClassValue::Public ); break; case Secrecy::Private: v->setType( (int)ClassValue::Private ); break; case Secrecy::Confidential: v->setType( (int)ClassValue::Confidential ); break; } cl.setValue( v ); vcard->add(cl); } Address VCardFormatImpl::readAddressValue( ContentLine *cl ) { Address a; AdrValue *v = (AdrValue *)cl->value(); a.setPostOfficeBox( QString::fromUtf8( v->poBox() ) ); a.setExtended( QString::fromUtf8( v->extAddress() ) ); a.setStreet( QString::fromUtf8( v->street() ) ); a.setLocality( QString::fromUtf8( v->locality() ) ); a.setRegion( QString::fromUtf8( v->region() ) ); a.setPostalCode( QString::fromUtf8( v->postCode() ) ); a.setCountry( QString::fromUtf8( v->countryName() ) ); a.setType( readAddressParam( cl ) ); return a; } int VCardFormatImpl::readAddressParam( ContentLine *cl ) { int type = 0; ParamList params = cl->paramList(); ParamListIterator it( params ); QCString tmpStr; for( ; it.current(); ++it ) { if ( (*it)->name().upper() == "TYPE" ) { tmpStr = (*it)->value().lower(); if ( tmpStr == "dom" ) type |= Address::Dom; else if ( tmpStr == "intl" ) type |= Address::Intl; else if ( tmpStr == "parcel" ) type |= Address::Parcel; else if ( tmpStr == "postal" ) type |= Address::Postal; else if ( tmpStr == "work" ) type |= Address::Work; else if ( tmpStr == "home" ) type |= Address::Home; else if ( tmpStr == "pref" ) type |= Address::Pref; } } return type; } void VCardFormatImpl::addNValue( VCard *vcard, const Addressee &a ) { ContentLine cl; cl.setName(EntityTypeToParamName( EntityN ) ); NValue *v = new NValue; v->setFamily( a.familyName().utf8() ); v->setGiven( a.givenName().utf8() ); v->setMiddle( a.additionalName().utf8() ); v->setPrefix( a.prefix().utf8() ); v->setSuffix( a.suffix().utf8() ); cl.setValue( v ); vcard->add(cl); } void VCardFormatImpl::readNValue( ContentLine *cl, Addressee &a ) { NValue *v = (NValue *)cl->value(); a.setFamilyName( QString::fromUtf8( v->family() ) ); a.setGivenName( QString::fromUtf8( v->given() ) ); a.setAdditionalName( QString::fromUtf8( v->middle() ) ); a.setPrefix( QString::fromUtf8( v->prefix() ) ); a.setSuffix( QString::fromUtf8( v->suffix() ) ); } void VCardFormatImpl::addTelephoneValue( VCard *v, const PhoneNumber &p ) { if ( p.number().isEmpty() ) return; ContentLine cl; cl.setName(EntityTypeToParamName(EntityTelephone)); cl.setValue(new TelValue( p.number().utf8() )); ParamList params; if( p.type() & PhoneNumber::Home ) params.append( new Param( "TYPE", "home" ) ); if( p.type() & PhoneNumber::Work ) params.append( new Param( "TYPE", "work" ) ); if( p.type() & PhoneNumber::Msg ) params.append( new Param( "TYPE", "msg" ) ); if( p.type() & PhoneNumber::Pref ) params.append( new Param( "TYPE", "pref" ) ); if( p.type() & PhoneNumber::Voice ) params.append( new Param( "TYPE", "voice" ) ); if( p.type() & PhoneNumber::Fax ) params.append( new Param( "TYPE", "fax" ) ); if( p.type() & PhoneNumber::Cell ) params.append( new Param( "TYPE", "cell" ) ); if( p.type() & PhoneNumber::Video ) params.append( new Param( "TYPE", "video" ) ); if( p.type() & PhoneNumber::Bbs ) params.append( new Param( "TYPE", "bbs" ) ); if( p.type() & PhoneNumber::Modem ) params.append( new Param( "TYPE", "modem" ) ); if( p.type() & PhoneNumber::Car ) params.append( new Param( "TYPE", "car" ) ); if( p.type() & PhoneNumber::Isdn ) params.append( new Param( "TYPE", "isdn" ) ); if( p.type() & PhoneNumber::Pcs ) params.append( new Param( "TYPE", "pcs" ) ); if( p.type() & PhoneNumber::Pager ) params.append( new Param( "TYPE", "pager" ) ); cl.setParamList( params ); v->add(cl); } PhoneNumber VCardFormatImpl::readTelephoneValue( ContentLine *cl ) { PhoneNumber p; TelValue *value = (TelValue *)cl->value(); p.setNumber( QString::fromUtf8( value->asString() ) ); int type = 0; ParamList params = cl->paramList(); ParamListIterator it( params ); QCString tmpStr; for( ; it.current(); ++it ) { if ( (*it)->name() == "TYPE" ) { tmpStr = (*it)->value().lower(); if ( tmpStr == "home" ) type |= PhoneNumber::Home; else if ( tmpStr == "work" ) type |= PhoneNumber::Work; else if ( tmpStr == "msg" ) type |= PhoneNumber::Msg; else if ( tmpStr == "pref" ) type |= PhoneNumber::Pref; else if ( tmpStr == "voice" ) type |= PhoneNumber::Voice; else if ( tmpStr == "fax" ) type |= PhoneNumber::Fax; else if ( tmpStr == "cell" ) type |= PhoneNumber::Cell; else if ( tmpStr == "video" ) type |= PhoneNumber::Video; else if ( tmpStr == "bbs" ) type |= PhoneNumber::Bbs; else if ( tmpStr == "modem" ) type |= PhoneNumber::Modem; else if ( tmpStr == "car" ) type |= PhoneNumber::Car; else if ( tmpStr == "isdn" ) type |= PhoneNumber::Isdn; else if ( tmpStr == "pcs" ) type |= PhoneNumber::Pcs; else if ( tmpStr == "pager" ) type |= PhoneNumber::Pager; } } p.setType( type ); return p; } QString VCardFormatImpl::readTextValue( ContentLine *cl ) { VCARD::Value *value = cl->value(); if ( value ) { return QString::fromUtf8( value->asString() ); } else { kdDebug(5700) << "No value: " << cl->asString() << endl; qDebug("No value: %s", (const char*)(cl->asString())); return QString::null; } } QDate VCardFormatImpl::readDateValue( ContentLine *cl ) { DateValue *dateValue = (DateValue *)cl->value(); if ( dateValue ) return dateValue->qdate(); else return QDate(); } QDateTime VCardFormatImpl::readDateTimeValue( ContentLine *cl ) { DateValue *dateValue = (DateValue *)cl->value(); if ( dateValue ) return dateValue->qdt(); else return QDateTime(); } Geo VCardFormatImpl::readGeoValue( ContentLine *cl ) { GeoValue *geoValue = (GeoValue *)cl->value(); if ( geoValue ) { Geo geo( geoValue->latitude(), geoValue->longitude() ); return geo; } else return Geo(); } TimeZone VCardFormatImpl::readUTCValue( ContentLine *cl ) { UTCValue *utcValue = (UTCValue *)cl->value(); if ( utcValue ) { TimeZone tz; tz.setOffset(((utcValue->hour()*60)+utcValue->minute())*(utcValue->positive() ? 1 : -1)); return tz; } else return TimeZone(); } Secrecy VCardFormatImpl::readClassValue( ContentLine *cl ) { ClassValue *classValue = (ClassValue *)cl->value(); if ( classValue ) { Secrecy secrecy; switch ( classValue->type() ) { case ClassValue::Public: secrecy.setType( Secrecy::Public ); break; case ClassValue::Private: secrecy.setType( Secrecy::Private ); break; case ClassValue::Confidential: secrecy.setType( Secrecy::Confidential ); break; } return secrecy; } else return Secrecy(); } void VCardFormatImpl::addKeyValue( VCARD::VCard *vcard, const Key &key ) { ContentLine cl; cl.setName( EntityTypeToParamName( EntityKey ) ); ParamList params; if ( key.isBinary() ) { cl.setValue( new TextValue( KCodecs::base64Encode( key.binaryData() ) ) ); params.append( new Param( "ENCODING", "b" ) ); } else { cl.setValue( new TextValue( key.textData().utf8() ) ); } switch ( key.type() ) { case Key::X509: params.append( new Param( "TYPE", "X509" ) ); break; case Key::PGP: params.append( new Param( "TYPE", "PGP" ) ); break; case Key::Custom: params.append( new Param( "TYPE", key.customTypeString().utf8() ) ); break; } cl.setParamList( params ); vcard->add( cl ); } Key VCardFormatImpl::readKeyValue( VCARD::ContentLine *cl ) { Key key; bool isBinary = false; TextValue *v = (TextValue *)cl->value(); ParamList params = cl->paramList(); ParamListIterator it( params ); for( ; it.current(); ++it ) { if ( (*it)->name() == "ENCODING" && (*it)->value() == "b" ) isBinary = true; if ( (*it)->name() == "TYPE" ) { if ( (*it)->value().isEmpty() ) continue; if ( (*it)->value() == "X509" ) key.setType( Key::X509 ); else if ( (*it)->value() == "PGP" ) key.setType( Key::PGP ); else { key.setType( Key::Custom ); key.setCustomTypeString( QString::fromUtf8( (*it)->value() ) ); } } } if ( isBinary ) { QByteArray data; KCodecs::base64Decode( v->asString().stripWhiteSpace(), data ); key.setBinaryData( data ); } else { key.setTextData( QString::fromUtf8( v->asString() ) ); } return key; } void VCardFormatImpl::addAgentValue( VCARD::VCard *vcard, const Agent &agent ) { if ( agent.isIntern() && !agent.addressee() ) return; if ( !agent.isIntern() && agent.url().isEmpty() ) return; ContentLine cl; cl.setName( EntityTypeToParamName( EntityAgent ) ); ParamList params; if ( agent.isIntern() ) { QString vstr; Addressee *addr = agent.addressee(); if ( addr ) { writeToString( (*addr), vstr ); qDebug("VCardFormatImpl::addAgentValue please verify if replace is correct"); /*US vstr.replace( ":", "\\:" ); vstr.replace( ",", "\\," ); vstr.replace( ";", "\\;" ); vstr.replace( "\r\n", "\\n" ); */ vstr.replace( QRegExp(":"), "\\:" ); vstr.replace( QRegExp(","), "\\," ); vstr.replace( QRegExp(";"), "\\;" ); vstr.replace( QRegExp("\r\n"), "\\n" ); cl.setValue( new TextValue( vstr.utf8() ) ); } else return; } else { cl.setValue( new TextValue( agent.url().utf8() ) ); params.append( new Param( "VALUE", "uri" ) ); } cl.setParamList( params ); vcard->add( cl ); } Agent VCardFormatImpl::readAgentValue( VCARD::ContentLine *cl ) { Agent agent; bool isIntern = true; TextValue *v = (TextValue *)cl->value(); ParamList params = cl->paramList(); ParamListIterator it( params ); for( ; it.current(); ++it ) { if ( (*it)->name() == "VALUE" && (*it)->value() == "uri" ) isIntern = false; } if ( isIntern ) { QString vstr = QString::fromUtf8( v->asString() ); qDebug("VCardFormatImpl::addAgentValue please verify if replace is correct"); /*US vstr.replace( "\\n", "\r\n" ); vstr.replace( "\\:", ":" ); vstr.replace( "\\,", "," ); vstr.replace( "\\;", ";" ); */ vstr.replace( QRegExp("\\\\n"), "\r\n" ); vstr.replace( QRegExp("\\\\:"), ":" ); vstr.replace( QRegExp("\\\\,"), "," ); vstr.replace( QRegExp("\\\\;"), ";" ); Addressee *addr = new Addressee; readFromString( vstr, *addr ); agent.setAddressee( addr ); } else { agent.setUrl( QString::fromUtf8( v->asString() ) ); } return agent; } +#include <qstringlist.h> void VCardFormatImpl::addPictureValue( VCARD::VCard *vcard, VCARD::EntityType type, const Picture &pic, const Addressee &addr, bool intern ) { ContentLine cl; cl.setName( EntityTypeToParamName( type ) ); - + // qDebug( "IIIMMMMM %s",QImage::outputFormatList ().join("-").latin1() ); if ( pic.isIntern() && pic.data().isNull() ) return; if ( !pic.isIntern() && pic.url().isEmpty() ) return; ParamList params; if ( pic.isIntern() ) { QImage img = pic.data(); if ( intern ) { // only for vCard export we really write the data inline QByteArray data; QDataStream s( data, IO_WriteOnly ); s.setVersion( 4 ); // to produce valid png files s << img; cl.setValue( new TextValue( KCodecs::base64Encode( data ) ) ); - + params.append( new Param( "ENCODING", "b" ) ); + if ( !pic.type().isEmpty() ) + params.append( new Param( "TYPE", pic.type().utf8() ) ); } else { // save picture in cache QString dir; if ( type == EntityPhoto ) dir = "photos"; if ( type == EntityLogo ) dir = "logos"; - - img.save( locateLocal( "data", "kabc/" + dir + "/" + addr.uid() ), pic.type().utf8() ); - cl.setValue( new TextValue( "<dummy>" ) ); + QString imUrl = locateLocal( "data", "kabc/" + dir + "/" + addr.uid() ); + KABC::Picture* ppic =(KABC::Picture*) &pic; + ppic->setUrl( imUrl ); + img.save(imUrl, "PNG" ); + cl.setValue( new TextValue( pic.url().utf8() ) ); + params.append( new Param( "VALUE", "uri" ) ); } - params.append( new Param( "ENCODING", "b" ) ); - if ( !pic.type().isEmpty() ) - params.append( new Param( "TYPE", pic.type().utf8() ) ); + } else { cl.setValue( new TextValue( pic.url().utf8() ) ); params.append( new Param( "VALUE", "uri" ) ); } cl.setParamList( params ); vcard->add( cl ); } Picture VCardFormatImpl::readPictureValue( VCARD::ContentLine *cl, VCARD::EntityType type, const Addressee &addr ) { Picture pic; bool isInline = false; QString picType; TextValue *v = (TextValue *)cl->value(); ParamList params = cl->paramList(); ParamListIterator it( params ); for( ; it.current(); ++it ) { if ( (*it)->name() == "ENCODING" && (*it)->value() == "b" ) isInline = true; if ( (*it)->name() == "TYPE" && !(*it)->value().isEmpty() ) picType = QString::fromUtf8( (*it)->value() ); } if ( isInline ) { QImage img; if ( v->asString() == "<dummy>" ) { // no picture inline stored => picture is in cache QString dir; if ( type == EntityPhoto ) dir = "photos"; if ( type == EntityLogo ) dir = "logos"; img.load( locateLocal( "data", "kabc/" + dir + "/" + addr.uid() ) ); } else { QByteArray data; KCodecs::base64Decode( v->asString(), data ); img.loadFromData( data ); } pic.setData( img ); pic.setType( picType ); } else { pic.setUrl( QString::fromUtf8( v->asString() ) ); } return pic; } void VCardFormatImpl::addSoundValue( VCARD::VCard *vcard, const Sound &sound, const Addressee &addr, bool intern ) { ContentLine cl; cl.setName( EntityTypeToParamName( EntitySound ) ); if ( sound.isIntern() && sound.data().isNull() ) return; if ( !sound.isIntern() && sound.url().isEmpty() ) return; ParamList params; if ( sound.isIntern() ) { QByteArray data = sound.data(); if ( intern ) { // only for vCard export we really write the data inline cl.setValue( new TextValue( KCodecs::base64Encode( data ) ) ); } else { // save sound in cache QFile file( locateLocal( "data", "kabc/sounds/" + addr.uid() ) ); if ( file.open( IO_WriteOnly ) ) { file.writeBlock( data ); } cl.setValue( new TextValue( "<dummy>" ) ); } params.append( new Param( "ENCODING", "b" ) ); } else { cl.setValue( new TextValue( sound.url().utf8() ) ); params.append( new Param( "VALUE", "uri" ) ); } cl.setParamList( params ); vcard->add( cl ); } Sound VCardFormatImpl::readSoundValue( VCARD::ContentLine *cl, const Addressee &addr ) { Sound sound; bool isInline = false; TextValue *v = (TextValue *)cl->value(); ParamList params = cl->paramList(); ParamListIterator it( params ); for( ; it.current(); ++it ) { if ( (*it)->name() == "ENCODING" && (*it)->value() == "b" ) isInline = true; } if ( isInline ) { QByteArray data; if ( v->asString() == "<dummy>" ) { // no sound inline stored => sound is in cache QFile file( locateLocal( "data", "kabc/sounds/" + addr.uid() ) ); if ( file.open( IO_ReadOnly ) ) { data = file.readAll(); file.close(); } } else { KCodecs::base64Decode( v->asString(), data ); } sound.setData( data ); } else { sound.setUrl( QString::fromUtf8( v->asString() ) ); } return sound; } bool VCardFormatImpl::readFromString( const QString &vcard, Addressee &addressee ) { VCardEntity e( vcard.utf8() ); VCardListIterator it( e.cardList() ); if ( it.current() ) { //US VCard v(*it.current()); //US loadAddressee( addressee, v ); loadAddressee( addressee, it.current() ); return true; } return false; } bool VCardFormatImpl::writeToString( const Addressee &addressee, QString &vcard ) { VCardEntity vcards; VCardList vcardlist; vcardlist.setAutoDelete( true ); VCard *v = new VCard; saveAddressee( addressee, v, true ); vcardlist.append( v ); vcards.setCardList( vcardlist ); vcard = QString::fromUtf8( vcards.asString() ); return true; } |