Index: kabc/vcardconverter.cpp =================================================================== --- kabc/vcardconverter.cpp.orig +++ kabc/vcardconverter.cpp @@ -51,6 +51,14 @@ TQString VCardConverter::createVCard( co return createVCards( list, version ); } +TQCString VCardConverter::createVCardRaw( const Addressee &addr, Version version ) +{ + Addressee::List list; + list.append( addr ); + + return createVCardsRaw( list, version ); +} + TQString VCardConverter::createVCards( Addressee::List list, Version version ) { VCardTool tool; @@ -58,6 +66,13 @@ TQString VCardConverter::createVCards( A return tool.createVCards( list, ( version == v3_0 ? VCard::v3_0 : VCard::v2_1 ) ); } +TQCString VCardConverter::createVCardsRaw( Addressee::List list, Version version ) +{ + VCardTool tool; + + return tool.createVCardsRaw( list, ( version == v3_0 ? VCard::v3_0 : VCard::v2_1 ) ); +} + Addressee VCardConverter::parseVCard( const TQString& vcard ) { Addressee::List list = parseVCards( vcard ); @@ -65,6 +80,13 @@ Addressee VCardConverter::parseVCard( co return list[ 0 ]; } +Addressee VCardConverter::parseVCardRaw( const TQCString& vcard ) +{ + Addressee::List list = parseVCardsRaw( vcard ); + + return list[ 0 ]; +} + Addressee::List VCardConverter::parseVCards( const TQString& vcard ) { VCardTool tool; @@ -72,6 +94,13 @@ Addressee::List VCardConverter::parseVCa return tool.parseVCards( vcard ); } +Addressee::List VCardConverter::parseVCardsRaw( const TQCString& vcard ) +{ + VCardTool tool; + + return tool.parseVCardsRaw( vcard ); +} + // ---------------------------- deprecated stuff ---------------------------- // bool VCardConverter::vCardToAddressee( const TQString &str, Addressee &addr, Version version ) Index: kabc/vcardconverter.h =================================================================== --- kabc/vcardconverter.h.orig +++ kabc/vcardconverter.h @@ -82,6 +82,7 @@ class KABC_EXPORT VCardConverter @param version The version of the generated vCard format */ TQString createVCard( const Addressee &addr, Version version = v3_0 ); + TQCString createVCardRaw( const Addressee &addr, Version version = v3_0 ); /** Creates a string in vCard format which contains the given @@ -92,6 +93,7 @@ class KABC_EXPORT VCardConverter */ // FIXME: Add error handling TQString createVCards( Addressee::List list, Version version = v3_0 ); + TQCString createVCardsRaw( Addressee::List list, Version version = v3_0 ); // FIXME: Add "createVCards( AddressBook * )" @@ -99,12 +101,14 @@ class KABC_EXPORT VCardConverter Parses a string in vCard format and returns the first contact. */ Addressee parseVCard( const TQString& vcard ); + Addressee parseVCardRaw( const TQCString& vcard ); /** Parses a string in vCard format and returns a list of contact objects. */ // FIXME: Add error handling Addressee::List parseVCards( const TQString& vcard ); + Addressee::List parseVCardsRaw( const TQCString& vcard ); // FIXME: Add "bool parseVCards( AddressBook *, const TQString &vcard )" Index: kabc/vcardformatplugin.cpp =================================================================== --- kabc/vcardformatplugin.cpp.orig +++ kabc/vcardformatplugin.cpp @@ -38,14 +38,11 @@ VCardFormatPlugin::~VCardFormatPlugin() bool VCardFormatPlugin::load( Addressee &addressee, TQFile *file ) { - TQString data; - - TQTextStream t( file ); - t.setEncoding( TQTextStream::Latin1 ); - data = t.read(); + const TQByteArray rawData = file->readAll(); + const TQCString data( rawData.data(), rawData.size() ); VCardConverter converter; - Addressee::List l = converter.parseVCards( data ); + Addressee::List l = converter.parseVCardsRaw( data ); if ( ! l.first().isEmpty() ) { addressee = l.first(); @@ -57,15 +54,11 @@ bool VCardFormatPlugin::load( Addressee bool VCardFormatPlugin::loadAll( AddressBook*, Resource *resource, TQFile *file ) { - TQString data; - - TQTextStream t( file ); - t.setEncoding( TQTextStream::Latin1 ); - data = t.read(); + const TQByteArray rawData = file->readAll(); + const TQCString data( rawData.data(), rawData.size() ); VCardConverter converter; - - Addressee::List l = converter.parseVCards( data ); + Addressee::List l = converter.parseVCardsRaw( data ); Addressee::List::iterator itr; for ( itr = l.begin(); itr != l.end(); ++itr) { @@ -86,9 +79,8 @@ void VCardFormatPlugin::save( const Addr vcardlist.append( addressee ); - TQTextStream t( file ); - t.setEncoding( TQTextStream::UnicodeUTF8 ); - t << converter.createVCards( vcardlist ); + const TQCString data = converter.createVCardsRaw( vcardlist ); + file->writeBlock( data, data.length() ); } void VCardFormatPlugin::saveAll( AddressBook*, Resource *resource, TQFile *file ) @@ -102,9 +94,8 @@ void VCardFormatPlugin::saveAll( Address vcardlist.append( *it ); } - TQTextStream t( file ); - t.setEncoding( TQTextStream::UnicodeUTF8 ); - t << converter.createVCards( vcardlist ); + const TQCString data = converter.createVCardsRaw( vcardlist ); + file->writeBlock( data, data.length() ); } bool VCardFormatPlugin::checkFormat( TQFile *file ) const Index: kabc/vcardparser/vcardparser.cpp =================================================================== --- kabc/vcardparser/vcardparser.cpp.orig +++ kabc/vcardparser/vcardparser.cpp @@ -18,10 +18,13 @@ Boston, MA 02110-1301, USA. */ +#include #include #include +#include #include +#include #include "vcardparser.h" @@ -29,25 +32,60 @@ using namespace KABC; -static TQString backslash( "\\\\" ); -static TQString comma( "\\," ); -static TQString newline( "\\n" ); -static TQString cr( "\\r" ); +typedef TQValueList TQCStringList; -static void addEscapes( TQString &str ) +QValueList splitCString( const TQCString &str, char sep ) { - str.replace( '\\', backslash ); - str.replace( ',', comma ); - str.replace( '\r', cr ); - str.replace( '\n', newline ); + TQValueList list; + int start = 0; + int end; + while ((end = str.find(sep, start)) != -1) { + list.append(str.mid(start, end - start)); + start = end + 1; + } + list.append(str.mid(start)); + + return list; +} + +TQValueList splitCString( const TQCString &str, const TQRegExp &exp ) +{ + TQValueList list; + int start = 0; + int end; + while ((end = str.find(exp, start)) != -1) { + list.append(str.mid(start, end - start)); + start = end + 1; + } + list.append(str.mid(start)); + + return list; +} + +bool cStringStartsWith( const TQCString &str, const TQCString &pattern ) +{ + const int length = pattern.length(); + if ( length == 0 ) + return true; + + const TQCString part = str.left( length ); + return (pattern == part); } -static void removeEscapes( TQString &str ) +static void addEscapes( TQCString &str ) { - str.replace( cr, "\\r" ); - str.replace( newline, "\n" ); - str.replace( comma, "," ); - str.replace( backslash, "\\" ); + str.replace( '\\', "\\\\" ); + str.replace( ',', "\\," ); + str.replace( '\r', "\\r" ); + str.replace( '\n', "\\n" ); +} + +static void removeEscapes( TQCString &str ) +{ + str.replace( "\\r", "\r" ); + str.replace( "\\n", "\n" ); + str.replace( "\\,", "," ); + str.replace( "\\\\", "\\" ); } VCardParser::VCardParser() @@ -60,24 +98,29 @@ VCardParser::~VCardParser() VCard::List VCardParser::parseVCards( const TQString& text ) { + return parseVCardsRaw( text.utf8() ); +} + +VCard::List VCardParser::parseVCardsRaw( const TQCString& text ) +{ static TQRegExp sep( "[\x0d\x0a]" ); VCard currentVCard; VCard::List vCardList; - TQString currentLine; + TQCString currentLine; - const TQStringList lines = TQStringList::split( sep, text ); - TQStringList::ConstIterator it; + const TQCStringList lines = splitCString( text, sep ); + TQCStringList::ConstIterator it; bool inVCard = false; - TQStringList::ConstIterator linesEnd( lines.end() ); + TQCStringList::ConstIterator linesEnd( lines.end() ); for ( it = lines.begin(); it != linesEnd; ++it ) { if ( (*it).isEmpty() ) // empty line continue; if ( (*it)[ 0 ] == ' ' || (*it)[ 0 ] == '\t' ) { // folded line => append to previous - currentLine += TQString( *it ).remove( 0, 1 ); + currentLine.append( (*it).mid( 1 ) ); continue; } else { if ( inVCard && !currentLine.isEmpty() ) { // now parse the line @@ -88,23 +131,23 @@ VCard::List VCardParser::parseVCards( co } VCardLine vCardLine; - const TQString key = currentLine.left( colon ).stripWhiteSpace(); - TQString value = currentLine.mid( colon + 1 ); + const TQCString key = currentLine.left( colon ).stripWhiteSpace(); + TQCString value = currentLine.mid( colon + 1 ); - TQStringList params = TQStringList::split( ';', key ); + TQCStringList params = splitCString( key, ';' ); // check for group if ( params[0].find( '.' ) != -1 ) { - const TQStringList groupList = TQStringList::split( '.', params[0] ); - vCardLine.setGroup( groupList[0] ); - vCardLine.setIdentifier( groupList[1] ); + const TQCStringList groupList = splitCString( params[0], '.' ); + vCardLine.setGroup( TQString::tqfromLatin1( groupList[0] ) ); + vCardLine.setIdentifier( TQString::tqfromLatin1( groupList[1] ) ); } else - vCardLine.setIdentifier( params[0] ); + vCardLine.setIdentifier( TQString::tqfromLatin1( params[0] ) ); if ( params.count() > 1 ) { // find all parameters - TQStringList::ConstIterator paramIt = params.begin(); + TQCStringList::ConstIterator paramIt = params.begin(); for ( ++paramIt; paramIt != params.end(); ++paramIt ) { - TQStringList pair = TQStringList::split( '=', *paramIt ); + TQCStringList pair = splitCString( *paramIt, '=' ); if ( pair.size() == 1 ) { // correct the fucking 2.1 'standard' if ( pair[0].lower() == "quoted-printable" ) { @@ -119,12 +162,12 @@ VCard::List VCardParser::parseVCards( co } // This is pretty much a faster pair[1].contains( ',' )... if ( pair[1].find( ',' ) != -1 ) { // parameter in type=x,y,z format - const TQStringList args = TQStringList::split( ',', pair[ 1 ] ); - TQStringList::ConstIterator argIt; + const TQCStringList args = splitCString( pair[ 1 ], ',' ); + TQCStringList::ConstIterator argIt; for ( argIt = args.begin(); argIt != args.end(); ++argIt ) - vCardLine.addParameter( pair[0].lower(), *argIt ); + vCardLine.addParameter( TQString::tqfromLatin1( pair[0].lower() ), TQString::tqfromLatin1( *argIt ) ); } else - vCardLine.addParameter( pair[0].lower(), pair[1] ); + vCardLine.addParameter( TQString::tqfromLatin1( pair[0].lower() ), TQString::tqfromLatin1( pair[1] ) ); } } @@ -133,10 +176,8 @@ VCard::List VCardParser::parseVCards( co TQByteArray output; bool wasBase64Encoded = false; - params = vCardLine.parameterList(); - if ( params.findIndex( "encoding" ) != -1 ) { // have to decode the data - TQByteArray input; - input = TQCString(value.latin1()); + if ( vCardLine.parameterList().findIndex( "encoding" ) != -1 ) { // have to decode the data + TQByteArray input = value; if ( vCardLine.parameter( "encoding" ).lower() == "b" || vCardLine.parameter( "encoding" ).lower() == "base64" ) { KCodecs::base64Decode( input, output ); @@ -148,14 +189,14 @@ VCard::List VCardParser::parseVCards( co value = value.remove( value.length() - 1, 1 ) + (*it); ++it; } - input = TQCString(value.latin1()); + input = value; KCodecs::quotedPrintableDecode( input, output ); } } else { - output = TQCString(value.latin1()); + output = value; } - if ( params.findIndex( "charset" ) != -1 ) { // have to convert the data + if ( vCardLine.parameterList().findIndex( "charset" ) != -1 ) { // have to convert the data TQTextCodec *codec = TQTextCodec::codecForName( vCardLine.parameter( "charset" ).latin1() ); if ( codec ) { @@ -173,17 +214,17 @@ VCard::List VCardParser::parseVCards( co } // we do not save the start and end tag as vcardline - if ( (*it).lower().startsWith( "begin:vcard" ) ) { + if ( cStringStartsWith( (*it).lower(), TQCString( "begin:vcard" ) ) ) { inVCard = true; - currentLine.setLength( 0 ); + currentLine = TQCString(); currentVCard.clear(); // flush vcard continue; } - if ( (*it).lower().startsWith( "end:vcard" ) ) { + if ( cStringStartsWith( (*it).lower(), TQCString( "end:vcard" ) ) ) { inVCard = false; vCardList.append( currentVCard ); - currentLine.setLength( 0 ); + currentLine = TQCString(); currentVCard.clear(); // flush vcard continue; } @@ -197,8 +238,13 @@ VCard::List VCardParser::parseVCards( co TQString VCardParser::createVCards( const VCard::List& list ) { - TQString text; - TQString textLine; + return TQString::fromUtf8( createVCardsRaw( list ) ); +} + +TQCString VCardParser::createVCardsRaw( const VCard::List& list ) +{ + TQCString text; + TQCString textLine; TQString encodingType; TQStringList idents; TQStringList params; @@ -213,7 +259,7 @@ TQString VCardParser::createVCards( cons bool hasEncoding; - text.reserve( list.size() * 300 ); // reserve memory to be more efficient +// text.reserve( list.size() * 300 ); // reserve memory to be more efficient // iterate over the cards VCard::List::ConstIterator listEnd( list.end() ); @@ -229,9 +275,9 @@ TQString VCardParser::createVCards( cons if ( !(*lineIt).value().asString().isEmpty() ) { if ((*lineIt).identifier() != TQString("URI")) { if ( (*lineIt).hasGroup() ) - textLine = (*lineIt).group() + "." + (*lineIt).identifier(); + textLine = (*lineIt).group().latin1() + TQCString( "." ) + (*lineIt).identifier().latin1(); else - textLine = (*lineIt).identifier(); + textLine = (*lineIt).identifier().latin1(); params = (*lineIt).parameterList(); hasEncoding = false; @@ -244,9 +290,9 @@ TQString VCardParser::createVCards( cons values = (*lineIt).parameters( *paramIt ); for ( valueIt = values.constBegin(); valueIt != values.constEnd(); ++valueIt ) { - textLine.append( ";" + (*paramIt).upper() ); + textLine.append( TQCString( ";" ) + (*paramIt).upper().latin1() ); if ( !(*valueIt).isEmpty() ) - textLine.append( "=" + (*valueIt) ); + textLine.append( TQCString( "=" ) + (*valueIt).latin1() ); } } } @@ -262,11 +308,11 @@ TQString VCardParser::createVCards( cons KCodecs::quotedPrintableEncode( input, output, false ); } - TQString value( output ); + TQCString value( output ); addEscapes( value ); textLine.append( ":" + value ); } else { - TQString value( (*lineIt).value().asString() ); + TQCString value( (*lineIt).value().toString().utf8() ); addEscapes( value ); textLine.append( ":" + value ); } Index: kabc/vcardparser/vcardparser.h =================================================================== --- kabc/vcardparser/vcardparser.h.orig +++ kabc/vcardparser/vcardparser.h @@ -34,6 +34,9 @@ class VCardParser static VCard::List parseVCards( const TQString& text ); static TQString createVCards( const VCard::List& list ); + static VCard::List parseVCardsRaw( const TQCString& text ); + static TQCString createVCardsRaw( const VCard::List& list ); + private: class VCardParserPrivate; VCardParserPrivate *d; Index: kabc/vcardtool.cpp =================================================================== --- kabc/vcardtool.cpp.orig +++ kabc/vcardtool.cpp @@ -74,15 +74,28 @@ VCardTool::~VCardTool() { } -// TODO: make list a const& +TQCString VCardTool::createVCardsRaw( Addressee::List list, VCard::Version version ) +{ + const VCard::List vCardList = createVCardsInternal( list, version ); + + return VCardParser::createVCardsRaw( vCardList ); +} + TQString VCardTool::createVCards( Addressee::List list, VCard::Version version ) { - VCard::List vCardList; + const VCard::List vCardList = createVCardsInternal( list, version ); + + return VCardParser::createVCards( vCardList ); +} + +KABC::VCard::List VCardTool::createVCardsInternal( Addressee::List list, KABC::VCard::Version version ) +{ + KABC::VCard::List vCardList; Addressee::List::ConstIterator addrIt; Addressee::List::ConstIterator listEnd( list.constEnd() ); for ( addrIt = list.constBegin(); addrIt != listEnd; ++addrIt ) { - VCard card; + KABC::VCard card; TQStringList::ConstIterator strIt; // ADR + LABEL @@ -351,17 +364,30 @@ QString VCardTool::createVCards( Address vCardList.append( card ); } - return VCardParser::createVCards( vCardList ); + return vCardList; +} + +Addressee::List VCardTool::parseVCardsRaw( const TQCString& vcard ) +{ + const VCard::List vCardList = VCardParser::parseVCardsRaw( vcard ); + + return parseVCardsInternal( vCardList ); } Addressee::List VCardTool::parseVCards( const TQString& vcard ) { + const VCard::List vCardList = VCardParser::parseVCards( vcard ); + + return parseVCardsInternal( vCardList ); +} + +Addressee::List VCardTool::parseVCardsInternal( const VCard::List &vCardList ) +{ static const TQChar semicolonSep( ';' ); static const TQChar commaSep( ',' ); TQString identifier; Addressee::List addrList; - const VCard::List vCardList = VCardParser::parseVCards( vcard ); VCard::List::ConstIterator cardIt; VCard::List::ConstIterator listEnd( vCardList.end() ); Index: kabc/vcardtool.h =================================================================== --- kabc/vcardtool.h.orig +++ kabc/vcardtool.h @@ -46,12 +46,19 @@ class KABC_EXPORT VCardTool */ TQString createVCards( Addressee::List list, VCard::Version version = VCard::v3_0 ); + TQCString createVCardsRaw( Addressee::List list, VCard::Version version = VCard::v3_0 ); + /** Parses the string and returns a list of addressee objects. */ Addressee::List parseVCards( const TQString& vcard ); + Addressee::List parseVCardsRaw( const TQCString& vcard ); + private: + VCard::List createVCardsInternal( Addressee::List list, VCard::Version version ); + Addressee::List parseVCardsInternal( const VCard::List &vCardList ); + /** Split a string and replaces escaped separators on the fly with unescaped ones.