You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tde-packaging/opensuse/core/tdelibs/bug-382959_kabc_fix_vcardpa...

563 lines
19 KiB

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 <tqcstring.h>
#include <tqregexp.h>
#include <tqtextcodec.h>
+#include <tqvaluelist.h>
#include <kmdcodec.h>
+#include <kdebug.h>
#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<TQCString> TQCStringList;
-static void addEscapes( TQString &str )
+QValueList<TQCString> splitCString( const TQCString &str, char sep )
{
- str.replace( '\\', backslash );
- str.replace( ',', comma );
- str.replace( '\r', cr );
- str.replace( '\n', newline );
+ TQValueList<TQCString> 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<TQCString> splitCString( const TQCString &str, const TQRegExp &exp )
+{
+ TQValueList<TQCString> 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.