summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmanoil Kotsev <deloptes@gmail.com>2016-05-29 02:31:06 +0200
committerSlávek Banko <slavek.banko@axis.cz>2016-05-29 02:31:06 +0200
commit4ceb2b158b3ed1ba1c78ab886b08a0bf40577d51 (patch)
tree4a848e8523433e697f2172ade0fcc1b845ded1ef
parent51efac909d7b116c8b0ca58fcd4e74ff58f31091 (diff)
downloadtdelibs-4ceb2b15.tar.gz
tdelibs-4ceb2b15.zip
Fix utf8 support in tdeabc vCard parser
This resolves bug 2625 Signed-off-by: Emanoil Kotsev <deloptes@gmail.com>
-rw-r--r--tdeabc/plugins/file/resourcefile.cpp82
-rw-r--r--tdeabc/vcardformatplugin.cpp16
-rw-r--r--tdeabc/vcardparser/CMakeLists.txt78
-rwxr-xr-xtdeabc/vcardparser/checkvcard.pl73
-rw-r--r--tdeabc/vcardparser/test.sh6
-rw-r--r--tdeabc/vcardparser/testread.cpp4
-rw-r--r--tdeabc/vcardparser/testread2.cpp2
-rw-r--r--tdeabc/vcardparser/tests/vcard8.vcf12
-rw-r--r--tdeabc/vcardparser/tests/vcard8.vcf.ref14
-rw-r--r--tdeabc/vcardparser/tests/vcard9.vcf14
-rw-r--r--tdeabc/vcardparser/tests/vcard9.vcf.ref15
-rw-r--r--tdeabc/vcardparser/testutils.cpp57
-rw-r--r--tdeabc/vcardparser/testvcardformat.cpp178
-rw-r--r--tdeabc/vcardparser/testvcardformatimpl.cpp174
-rw-r--r--tdeabc/vcardparser/testwrite2.cpp136
-rw-r--r--tdeabc/vcardparser/vcardparser.cpp6
16 files changed, 783 insertions, 84 deletions
diff --git a/tdeabc/plugins/file/resourcefile.cpp b/tdeabc/plugins/file/resourcefile.cpp
index ad4e8c466..3fa2a9406 100644
--- a/tdeabc/plugins/file/resourcefile.cpp
+++ b/tdeabc/plugins/file/resourcefile.cpp
@@ -164,33 +164,45 @@ bool ResourceFile::doOpen()
if ( file.size() == 0 ) {
file.close();
- kdDebug() << "File size is zero. Evaluating backups" << endl;
+ kdDebug(5700) << "File size is zero. Evaluating backups" << endl;
for (int i=0; i!=20; i++)
{
TQFile backup( mFileName + "__" + TQString::number(i) );
- kdDebug() << "Evaluating" << backup.name() << " size: " << backup.size() << endl;
+ kdDebug(5700) << "Evaluating" << backup.name() << " size: " << backup.size() << endl;
if ( backup.size() != 0 )
{
- kdDebug() << "Restoring backup " << i << endl;
+ kdDebug(5700) << "Restoring backup " << i << endl;
const TQString src = mFileName + "__" + TQString::number(i);
const TQString dest = mFileName;
+ // copy src to dest
+ if ( ! backup.open( IO_ReadOnly ) ) {
+// const TQByteArray data = backup.readAll();
+ kdDebug(5700) << "can not open source for reading " << src << endl;
+ continue;
+ }
+
// remove dest
TQFile::remove( dest );
- // copy src to dest
- if ( backup.open( IO_ReadOnly ) ) {
- const TQByteArray data = backup.readAll();
-
- TQFile out( dest );
- if ( out.open( IO_WriteOnly ) ) {
- out.writeBlock( data );
- out.close();
- }
-
- backup.close();
- }
- return true;
+ TQString text;
+ TQTextStream instream( &backup );
+ instream.setEncoding( TQTextStream::UnicodeUTF8 );
+ text = instream.read();
+ backup.close();
+
+ TQFile out( dest );
+ if ( ! out.open( IO_WriteOnly ) ) {
+// out.writeBlock( data );
+ kdDebug(5700) << "can not open target for writing " << dest << endl;
+ continue;
+ }
+ TQTextStream outstream( &out );
+ outstream.setEncoding( TQTextStream::UnicodeUTF8 );
+ outstream << text;
+ out.close();
+
+ return true;
}
}
return true;
@@ -248,7 +260,7 @@ bool ResourceFile::save( Ticket * )
TQFile file( mFileName + "__0" );
if ( file.size() != 0 ) {
const TQString last = mFileName + "__20";
- kdDebug() << "deleting " << last << endl;
+ kdDebug(5700) << "deleting " << last << endl;
TQFile::remove( last );
@@ -260,28 +272,40 @@ bool ResourceFile::save( Ticket * )
// copy src to dest
TQFile in( src );
- if ( in.open( IO_ReadOnly ) ) {
- const TQByteArray data = in.readAll();
-
- TQFile out( dest );
- if ( out.open( IO_WriteOnly ) ) {
- out.writeBlock( data );
- out.close();
- }
-
- in.close();
+ if ( ! in.exists() )
+ continue;
+ if ( ! in.open( IO_ReadOnly ) ) {
+// const TQByteArray data = in.readAll();
+ kdDebug(5700) << "can not open source for reading " << src << endl;
+ return false;
}
+ TQString text;
+ TQTextStream instream( &in );
+
+ instream.setEncoding( TQTextStream::UnicodeUTF8 );
+ text = instream.read();
+ in.close();
+
+ TQFile out( dest );
+ if ( ! out.open( IO_WriteOnly ) ) {
+// out.writeBlock( data );
+ kdDebug(5700) << "can not open target for writing " << dest << endl;
+ return false;
+ }
+ TQTextStream outstream( &out );
+ outstream.setEncoding( TQTextStream::UnicodeUTF8 );
+ outstream << text;
+ out.close();
// remove src
TQFile::remove( src );
}
} else
- kdDebug() << "Not starting logrotate __0 is 0 bytes." << endl;
+ kdDebug(5700) << "Not starting logrotate __0 is 0 bytes." << endl;
TQString extension = "__0";
(void) KSaveFile::backupFile( mFileName, TQString::null /*directory*/,
extension );
-
mDirWatch.stopScan();
KSaveFile saveFile( mFileName );
diff --git a/tdeabc/vcardformatplugin.cpp b/tdeabc/vcardformatplugin.cpp
index 2adb7e139..7032b3ee6 100644
--- a/tdeabc/vcardformatplugin.cpp
+++ b/tdeabc/vcardformatplugin.cpp
@@ -41,7 +41,7 @@ bool VCardFormatPlugin::load( Addressee &addressee, TQFile *file )
TQString data;
TQTextStream t( file );
- t.setEncoding( TQTextStream::Latin1 );
+ t.setEncoding( TQTextStream::UnicodeUTF8 );
data = t.read();
VCardConverter converter;
@@ -60,7 +60,7 @@ bool VCardFormatPlugin::loadAll( AddressBook*, Resource *resource, TQFile *file
TQString data;
TQTextStream t( file );
- t.setEncoding( TQTextStream::Latin1 );
+ t.setEncoding( TQTextStream::UnicodeUTF8 );
data = t.read();
VCardConverter converter;
@@ -88,7 +88,11 @@ void VCardFormatPlugin::save( const Addressee &addressee, TQFile *file )
TQTextStream t( file );
t.setEncoding( TQTextStream::UnicodeUTF8 );
- t << converter.createVCards( vcardlist );
+ TQString text = converter.createVCards( vcardlist );
+// kdDebug(5700)<< ">>>>>>>>> DEBUG <<<<<<<<<<" << endl;
+// kdDebug(5700)<< text << endl;
+// kdDebug(5700)<< ">>>>>>>>> DEBUG <<<<<<<<<<" << endl;
+ t << text;
}
void VCardFormatPlugin::saveAll( AddressBook*, Resource *resource, TQFile *file )
@@ -104,7 +108,11 @@ void VCardFormatPlugin::saveAll( AddressBook*, Resource *resource, TQFile *file
TQTextStream t( file );
t.setEncoding( TQTextStream::UnicodeUTF8 );
- t << converter.createVCards( vcardlist );
+ TQString text = converter.createVCards( vcardlist );
+// kdDebug(5700)<< ">>>>>>>>> DEBUG <<<<<<<<<<" << endl;
+// kdDebug(5700)<< text << endl;
+// kdDebug(5700)<< ">>>>>>>>> DEBUG <<<<<<<<<<" << endl;
+ t << text;
}
bool VCardFormatPlugin::checkFormat( TQFile *file ) const
diff --git a/tdeabc/vcardparser/CMakeLists.txt b/tdeabc/vcardparser/CMakeLists.txt
index 15a2ce5c8..8e916aa0b 100644
--- a/tdeabc/vcardparser/CMakeLists.txt
+++ b/tdeabc/vcardparser/CMakeLists.txt
@@ -11,14 +11,32 @@
include_directories(
${TQT_INCLUDE_DIRS}
+ ${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}
${CMAKE_BINARY_DIR}/tdecore
${CMAKE_SOURCE_DIR}/tdecore
+ ${CMAKE_BINARY_DIR}/tdeabc
+ ${CMAKE_SOURCE_DIR}/tdeabc
+ ${CMAKE_SOURCE_DIR}/tdeabc/vcard/include
+ ${CMAKE_SOURCE_DIR}/tdeabc/vcard/include/generated
+ ${CMAKE_SOURCE_DIR}/tdeio/tdeio
+ ${CMAKE_SOURCE_DIR}/dcop
)
link_directories(
${TQT_LIBRARY_DIRS}
)
+set( TDEABC_TESTS_LINK
+ ${TQT_LIBRARIES}
+ DCOP-shared
+ tdecore-shared
+ tdeui-shared
+ tdefx-shared
+ tdeio-shared
+ tdetexteditor-shared
+ tdeabc-shared
+)
##### headers ###################################
@@ -38,3 +56,63 @@ set( ${target}_SRCS
tde_add_library( ${target} STATIC_PIC
SOURCES ${${target}_SRCS}
)
+
+
+##### test programs ##############################
+
+tde_add_executable( testread
+ SOURCES testread.cpp AUTOMOC
+ LINK ${TDEABC_TESTS_LINK}
+)
+
+tde_add_executable( testread2
+ SOURCES testread2.cpp testutils.cpp AUTOMOC
+ LINK ${TDEABC_TESTS_LINK}
+)
+
+tde_add_executable( testwrite
+ SOURCES testwrite.cpp AUTOMOC
+ LINK ${TDEABC_TESTS_LINK}
+)
+
+tde_add_executable( testwrite2
+ SOURCES testwrite2.cpp AUTOMOC
+ LINK ${TDEABC_TESTS_LINK}
+)
+
+tde_add_executable( testvcardformat
+ SOURCES testvcardformat.cpp AUTOMOC
+ LINK ${TDEABC_TESTS_LINK}
+)
+
+tde_add_executable( testvcardformatimpl
+ SOURCES testvcardformatimpl.cpp AUTOMOC
+ LINK ${TDEABC_TESTS_LINK}
+)
+
+add_custom_target(testing ALL
+ COMMAND echo "creating test infrastructure"
+ DEPENDS testread
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+)
+
+add_custom_command(
+ TARGET testing PRE_BUILD
+ COMMAND test
+ ARGS -f ${CMAKE_CURRENT_BINARY_DIR}/test.sh || ln -s ${CMAKE_SOURCE_DIR}/tdeabc/vcardparser/test.sh ${CMAKE_CURRENT_BINARY_DIR}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+)
+
+add_custom_command(
+ TARGET testing PRE_BUILD
+ COMMAND test
+ ARGS -f ${CMAKE_CURRENT_BINARY_DIR}/checkvcard.pl || ln -s ${CMAKE_SOURCE_DIR}/tdeabc/vcardparser/checkvcard.pl ${CMAKE_CURRENT_BINARY_DIR}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+)
+
+add_custom_command(
+ TARGET testing PRE_BUILD
+ COMMAND test
+ ARGS -d ${CMAKE_CURRENT_BINARY_DIR}/tests || ln -s ${CMAKE_SOURCE_DIR}/tdeabc/vcardparser/tests ${CMAKE_CURRENT_BINARY_DIR}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+)
diff --git a/tdeabc/vcardparser/checkvcard.pl b/tdeabc/vcardparser/checkvcard.pl
index 67160ea4a..1360972e6 100755
--- a/tdeabc/vcardparser/checkvcard.pl
+++ b/tdeabc/vcardparser/checkvcard.pl
@@ -1,69 +1,58 @@
#!/usr/bin/perl
+use utf8;
+use strict;
+use warnings;
+
if ( @ARGV != 1 ) {
print STDERR "Missing arg: filename\n";
exit 1;
}
-$file = $ARGV[0];
+my $file = $ARGV[0];
+my $ref = "$file.ref";
-if ( !open( IN, "$file" ) ) {
- print STDERR "Unable to open '$file'\n";
- exit 1;
-}
+my $options="";
+my $error=0;
+my @prscont;
+my @refcont;
+open( IN, "<", $file ) || die ("Unable to open $file");
while( <IN> ) {
- if (/^VERSION:(.*)$/ ) {
- $version = $1;
- if ( $version eq "2.1" ) { $options = "--vcard21"; }
- }
+ if (/^VERSION:(.*)$/ ) { my $v = $1; $options = "--vcard21" if $v eq "2.1"; }
}
-
close IN;
-$ref = "$file.ref";
-
-if ( !open( REF, "$ref" ) ) {
- print STDERR "Unable to open $ref\n";
- exit 1;
-}
-
+open( REF, "$ref" ) || die ("Unable to open $ref");
while( <REF> ) {
- push @ref, $_;
+ next if $_ =~ /^UID/;
+ push @refcont , $_ ;
}
-
close REF;
-if ( !open( READ, "./testread $file $options 2> /dev/null |" ) ) {
- print STDERR "Unable to open testread\n";
- exit 1;
-}
-
-print "Checking '$file':\n";
-
-$gotsomething = 0;
-$error = 0;
-$i = 0;
+open( READ, "./testread $file $options 2> /dev/null |" ) || die ("Unable to open testread");
+print "Checking: $file ";
while( <READ> ) {
- $gotsomething = 1;
- $out = $_;
- $ref = @ref[$i++];
-
- if ( $out ne $ref ) {
- if ( $ref =~ /^UID/ && $out =~ /^UID/ ) { next; }
- $error++;
- print " Expected : $ref";
- print " Parser output : $out";
- }
+ next if $_ =~ /^UID/;
+ push @prscont , $_;
}
-
close READ;
-if ( $gotsomething == 0 ) {
- print "\n FAILED: testread didn't output anything\n";
+
+if ( $#refcont != $#prscont ) {
+ print "\n FAILED: ref size and parsed size mismatch.\n";
system "touch FAILED";
exit 1;
}
+
+for (my $i=0; $i<=$#refcont; $i++) {
+ if ( $refcont[$i] ne $prscont[$i] ) {
+ $error++;
+ print "\n Expected : $refcont[$i]";
+ print " Parser output : $prscont[$i]";
+ }
+}
+
if ( $error > 0 ) {
print "\n FAILED: $error errors found.\n";
system "touch FAILED";
diff --git a/tdeabc/vcardparser/test.sh b/tdeabc/vcardparser/test.sh
new file mode 100644
index 000000000..f7855f2d1
--- /dev/null
+++ b/tdeabc/vcardparser/test.sh
@@ -0,0 +1,6 @@
+TESTFILES="vcard1.vcf vcard2.vcf vcard3.vcf vcard4.vcf vcard6.vcf vcard7.vcf vcard8.vcf vcard9.vcf"
+
+test -f FAILED && rm -f FAILED;
+for i in $TESTFILES;
+ do perl ./checkvcard.pl ./tests/$i ;
+done;
diff --git a/tdeabc/vcardparser/testread.cpp b/tdeabc/vcardparser/testread.cpp
index 0b87e6621..0be056edb 100644
--- a/tdeabc/vcardparser/testread.cpp
+++ b/tdeabc/vcardparser/testread.cpp
@@ -30,7 +30,7 @@
#include <tdelocale.h>
#include <tdeaboutdata.h>
-#include "vcardconverter.h"
+#include "tdeabc/vcardconverter.h"
#include "vcard.h"
static const TDECmdLineOptions options[] =
@@ -70,7 +70,7 @@ int main( int argc, char **argv )
TQString text;
TQTextStream s( &file );
- s.setEncoding( TQTextStream::Latin1 );
+ s.setEncoding( TQTextStream::UnicodeUTF8 );
text = s.read();
file.close();
diff --git a/tdeabc/vcardparser/testread2.cpp b/tdeabc/vcardparser/testread2.cpp
index bd0922670..8bc7c8863 100644
--- a/tdeabc/vcardparser/testread2.cpp
+++ b/tdeabc/vcardparser/testread2.cpp
@@ -34,7 +34,9 @@ main()
kdDebug()<<"\t\t"<< (*itr1).fullEmail() << " VS. " << (*itr2).fullEmail()<<endl;
} else {
kdDebug()<<"\tAddressee - FAILED"<<endl;
+ kdDebug()<<">>>>>>>Addressee from code<<<<<<<<"<<endl;
(*itr1).dump();
+ kdDebug()<<">>>>>>>Addressee from file<<<<<<<<"<<endl;
(*itr2).dump();
//kdDebug()<<"\t\t"<< (*itr1).fullEmail() << " VS. " << (*itr2).fullEmail()<<endl;
}
diff --git a/tdeabc/vcardparser/tests/vcard8.vcf b/tdeabc/vcardparser/tests/vcard8.vcf
new file mode 100644
index 000000000..2b6649562
--- /dev/null
+++ b/tdeabc/vcardparser/tests/vcard8.vcf
@@ -0,0 +1,12 @@
+BEGIN:VCARD
+ADR;TYPE=home:;;Müllerstrasse 21;Wörthersee;Kärnten;8400;Österreich;
+ORG:HansWürstel AG
+EMAIL:boehmermann@wuerstel.com
+FN:Jahn Böhmermann
+N:Böhmermann;Jahn;;;
+TITLE:Komödiant
+REV:2016-04-02T23:54:06Z
+TEL;TYPE=VOICE,MSG,WORK:+43 699373419
+VERSION:3.0
+X-GENDER-GENDER:Male
+END:VCARD
diff --git a/tdeabc/vcardparser/tests/vcard8.vcf.ref b/tdeabc/vcardparser/tests/vcard8.vcf.ref
new file mode 100644
index 000000000..8b4749a06
--- /dev/null
+++ b/tdeabc/vcardparser/tests/vcard8.vcf.ref
@@ -0,0 +1,14 @@
+BEGIN:VCARD
+ADR;TYPE=home:;;Müllerstrasse 21;Wörthersee;Kärnten;8400;Österreich
+EMAIL:boehmermann@wuerstel.com
+FN:Jahn Böhmermann
+N:Böhmermann;Jahn;;;
+ORG:HansWürstel AG
+REV:2016-04-02T23:54:06Z
+TEL;TYPE=MSG;TYPE=VOICE;TYPE=WORK:+43 699373419
+TITLE:Komödiant
+UID:vz7nMFMbYE
+VERSION:3.0
+X-GENDER-GENDER:Male
+END:VCARD
+
diff --git a/tdeabc/vcardparser/tests/vcard9.vcf b/tdeabc/vcardparser/tests/vcard9.vcf
new file mode 100644
index 000000000..1435285aa
--- /dev/null
+++ b/tdeabc/vcardparser/tests/vcard9.vcf
@@ -0,0 +1,14 @@
+BEGIN:VCARD
+ADR;TYPE=home:;;Цар Борис III;София;София град;1000;България
+ORG:България ООД
+EMAIL:иван.иванов@българия.com
+FN:Иван Иванов
+NAME:Иван
+N:Иванов;
+TITLE:Др
+REV:2016-04-03T23:54:06Z
+TEL;TYPE=VOICE,MSG,WORK:+359 888 111 222
+VERSION:3.0
+X-GENDER-GENDER:Male
+END:VCARD
+
diff --git a/tdeabc/vcardparser/tests/vcard9.vcf.ref b/tdeabc/vcardparser/tests/vcard9.vcf.ref
new file mode 100644
index 000000000..0e919e371
--- /dev/null
+++ b/tdeabc/vcardparser/tests/vcard9.vcf.ref
@@ -0,0 +1,15 @@
+BEGIN:VCARD
+ADR;TYPE=home:;;Цар Борис III;София;София град;1000;България
+EMAIL:иван.иванов@българия.com
+FN:Иван Иванов
+N:Иванов;;;;
+NAME:Иван
+ORG:България ООД
+REV:2016-04-03T23:54:06Z
+TEL;TYPE=MSG;TYPE=VOICE;TYPE=WORK:+359 888 111 222
+TITLE:Др
+UID:nzIRLdymsP
+VERSION:3.0
+X-GENDER-GENDER:Male
+END:VCARD
+
diff --git a/tdeabc/vcardparser/testutils.cpp b/tdeabc/vcardparser/testutils.cpp
index 6547445e5..21348d341 100644
--- a/tdeabc/vcardparser/testutils.cpp
+++ b/tdeabc/vcardparser/testutils.cpp
@@ -1,6 +1,7 @@
-#include <vcardparser.h>
+#include "vcardparser.h"
#include <tdeabc/addressee.h>
#include <tqfile.h>
+#include <tqstring.h>
using namespace TDEABC;
@@ -60,8 +61,52 @@ vcard3()
return addr;
}
+Addressee
+vcard8()
+{
+ Addressee addr;
+
+ addr.setName( TQString::fromUtf8("Jahn") );
+ addr.setFamilyName( TQString::fromUtf8("Böhmermann") );
+ addr.setFormattedName( TQString::fromUtf8("Jahn Böhmermann") );
+ addr.setOrganization( TQString::fromUtf8("HansWürstel AG") );
+ addr.insertEmail( TQString::fromUtf8("boehmermann@wuerstel.com") );
+ addr.setTitle( TQString::fromUtf8("Komödiant") );
+ addr.insertPhoneNumber( PhoneNumber("+43 699373419",PhoneNumber::Voice|PhoneNumber::Msg|PhoneNumber::Work) );
+ Address a( Address::Work );
+ a.setStreet( TQString::fromUtf8("Müllerstrasse 21") );
+ a.setLocality( TQString::fromUtf8("Wörthersee") );
+ a.setRegion( TQString::fromUtf8("Kärnten") );
+ a.setPostalCode( "8400" );
+ a.setCountry( TQString::fromUtf8("Österreich") );
+ addr.insertAddress( a );
+ return addr;
+}
+
+Addressee
+vcard9()
+{
+ Addressee addr;
+
+ addr.setName( TQString::fromUtf8("Иван") );
+ addr.setFamilyName( TQString::fromUtf8("Иванов") );
+ addr.setFormattedName( TQString::fromUtf8("Иван Иванов") );
+ addr.setOrganization( TQString::fromUtf8("България ООД") );
+ addr.insertEmail( TQString::fromUtf8("иван.иванов@българия.com") );
+ addr.setTitle( TQString::fromUtf8("Др") );
+ addr.insertPhoneNumber( PhoneNumber("+359 888 111 222",PhoneNumber::Voice|PhoneNumber::Msg|PhoneNumber::Work) );
+ Address a( Address::Work );
+ a.setStreet( TQString::fromUtf8("Цар Борис III") );
+ a.setLocality( TQString::fromUtf8("София") );
+ a.setRegion( TQString::fromUtf8("София град") );
+ a.setPostalCode( "1000" );
+ a.setCountry( TQString::fromUtf8("България") );
+ addr.insertAddress( a );
+ return addr;
+}
+
-QString
+TQString
vcardAsText( const TQString& location )
{
TQString line;
@@ -84,16 +129,20 @@ vCardsAsAddresseeList()
l.append( vcard1() );
l.append( vcard2() );
l.append( vcard3() );
+ l.append( vcard8() );
+ l.append( vcard9() );
return l;
}
-QString
-vCardsAsText()
+TQString
+ vCardsAsText()
{
TQString vcards = vcardAsText( "tests/vcard1.vcf" );
vcards += vcardAsText( "tests/vcard2.vcf" );
vcards += vcardAsText( "tests/vcard3.vcf" );
+ vcards += vcardAsText( "tests/vcard8.vcf" );
+ vcards += vcardAsText( "tests/vcard9.vcf" );
return vcards;
}
diff --git a/tdeabc/vcardparser/testvcardformat.cpp b/tdeabc/vcardparser/testvcardformat.cpp
new file mode 100644
index 000000000..b4ea74be4
--- /dev/null
+++ b/tdeabc/vcardparser/testvcardformat.cpp
@@ -0,0 +1,178 @@
+
+/*
+ This file is part of libtdeabc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+#include <tdeapplication.h>
+#include <tdecmdlineargs.h>
+// #include <tdelocale.h>
+#include <tdeaboutdata.h>
+
+#include "vcardformatplugin.h"
+
+using namespace TDEABC;
+
+/**
+ *
+ * @param argc
+ * @param argv
+ * @return
+ */
+int
+main( int argc, char **argv )
+{
+ TDEAboutData aboutData( "testvcardformatplugin", "vCard format plugin", "0.1" );
+
+ TDECmdLineArgs::init( argc, argv, &aboutData );
+
+ TDEApplication app( false, false );
+
+
+ TDEABC::Addressee addressee;
+
+ addressee.setNameFromString( TQString::fromUtf8("Иван Иванов") );
+ addressee.setNickName( TQString::fromUtf8("иванчо") );
+ addressee.setBirthday( TQDate( 1981, 7, 19 ) );
+ addressee.setMailer( "mutt1.2" );
+ addressee.setTimeZone( TDEABC::TimeZone( +2 ) );
+
+ TDEABC::Geo geo;
+ geo.setLatitude( 30 );
+ geo.setLongitude( 51 );
+ addressee.setGeo( geo );
+
+ addressee.setTitle( TQString::fromUtf8("Др") );
+ addressee.setRole( TQString::fromUtf8("Самарянин") );
+ addressee.setOrganization( TQString::fromUtf8("България ООД") );
+ addressee.setNote( TQString::fromUtf8("не\nпипай работеща система") );
+ addressee.setProductId( "testId" );
+ addressee.setRevision( TQDateTime::currentDateTime() );
+ addressee.setSortString( TQString::fromUtf8("сортиране") );
+ addressee.setUrl( KURL( "http://wgess17.dyndns.org") );
+ addressee.setSecrecy( TDEABC::Secrecy( TDEABC::Secrecy::Confidential ) );
+/*
+ TQImage img;
+ img.load( "testimg.png", "PNG" );
+ TDEABC::Picture photo;
+ photo.setData( img );
+ addressee.setPhoto( photo );
+
+ TQImage img2;
+ img2.load( "testimg.png", "PNG" );
+ TDEABC::Picture logo;
+ logo.setData( img2 );
+ addressee.setLogo( logo );
+
+ TQFile soundFile( "testsound.wav" );
+ soundFile.open( IO_ReadOnly );
+ TQByteArray data = soundFile.readAll();
+ soundFile.close();
+ TDEABC::Sound sound;
+ sound.setData( data );
+ addressee.setSound( sound );
+*/
+ addressee.insertEmail( TQString::fromUtf8("иван.иванов@българия.оод"), true );
+ addressee.insertEmail( TQString::fromUtf8("иванчо@yahoo.de"), true );
+
+ TDEABC::PhoneNumber phone1( "029876543", TDEABC::PhoneNumber::Pref | TDEABC::PhoneNumber::Home );
+ TDEABC::PhoneNumber phone2( "+359888111222", TDEABC::PhoneNumber::Work );
+ addressee.insertPhoneNumber( phone1 );
+ addressee.insertPhoneNumber( phone2 );
+
+ TDEABC::Key key( "secret key", TDEABC::Key::X509 );
+ addressee.insertKey( key );
+
+ TQStringList categories;
+ categories << "Friends" << "School" << "KDE";
+ addressee.setCategories( categories );
+
+ TDEABC::Address a( TDEABC::Address::Work | TDEABC::Address::Postal | TDEABC::Address::Parcel );
+ a.setStreet( TQString::fromUtf8("Цар Борис III") );
+ a.setLocality( TQString::fromUtf8("София" ));
+ a.setRegion( TQString::fromUtf8("София град" ));
+ a.setPostalCode( TQString::fromUtf8("1000" ));
+ a.setCountry( TQString::fromUtf8("България" ));
+ addressee.insertAddress( a );
+
+ addressee.insertCustom( "1hsdf", "test1",TQString::fromUtf8( "ежзик" ));
+ addressee.insertCustom( "2hsdf", "test2",TQString::fromUtf8( "ежзик" ));
+ addressee.insertCustom( "3hsdf", "test3",TQString::fromUtf8( "ежзик" ));
+
+ addressee.dump();
+
+// TDEABC::Addressee::List list;
+// for ( int i = 0; i < 20; ++i ) {
+// TDEABC::Addressee addr = addressee;
+// addr.setUid( TQString::number( i ) );
+// list.append( addr );
+// }
+
+// TDEABC::VCardConverter converter;
+// TQString txt = converter.createVCards( list );
+//
+// TQFile file( "out2.vcf" );
+// file.open( IO_WriteOnly );
+//
+// TQTextStream s( &file );
+// s.setEncoding( TQTextStream::UnicodeUTF8 );
+// s << txt;
+// file.close();
+
+ VCardFormatPlugin *vcfplugin = new VCardFormatPlugin();
+ TQFile file( "vfout.vcf" );
+ if ( file.open(IO_WriteOnly) ){
+ vcfplugin->save(addressee, &file);
+ file.close();
+ }
+
+
+ TDEABC::Addressee addressee2;
+
+ if ( file.open(IO_ReadOnly ) ){
+ vcfplugin->load(addressee2, &file);
+ file.close();
+ }
+
+ addressee2.dump();
+
+ return 0;
+
+
+/* Addressee::List::iterator itr1;
+ Addressee::List::iterator itr2;
+ for ( itr1 = l.begin(), itr2 = parsed.begin();
+ itr1 != l.end(); ++itr1, ++itr2 ) {
+ if ( (*itr1).fullEmail() == (*itr2).fullEmail() &&
+ (*itr1).organization() == (*itr2).organization() &&
+ (*itr1).phoneNumbers() == (*itr2).phoneNumbers() &&
+ (*itr1).emails() == (*itr2).emails() &&
+ (*itr1).role() == (*itr2).role() ) {
+ kdDebug()<<"\tAddressee - PASSED"<<endl;
+ kdDebug()<<"\t\t"<< (*itr1).fullEmail() << " VS. " << (*itr2).fullEmail()<<endl;
+ } else {
+ kdDebug()<<"\tAddressee - FAILED"<<endl;
+ kdDebug()<<">>>>>>>Addressee from code<<<<<<<<"<<endl;
+ (*itr1).dump();
+ kdDebug()<<">>>>>>>Addressee from file<<<<<<<<"<<endl;
+ (*itr2).dump();
+ //kdDebug()<<"\t\t"<< (*itr1).fullEmail() << " VS. " << (*itr2).fullEmail()<<endl;
+ }
+ }
+*/
+}
diff --git a/tdeabc/vcardparser/testvcardformatimpl.cpp b/tdeabc/vcardparser/testvcardformatimpl.cpp
new file mode 100644
index 000000000..22e66c41e
--- /dev/null
+++ b/tdeabc/vcardparser/testvcardformatimpl.cpp
@@ -0,0 +1,174 @@
+
+/*
+ This file is part of libtdeabc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+#include <tdeapplication.h>
+#include <tdecmdlineargs.h>
+// #include <tdelocale.h>
+#include <tdeaboutdata.h>
+
+#include "vcardformatimpl.h"
+
+using namespace TDEABC;
+
+int
+main( int argc, char **argv )
+{
+ TDEAboutData aboutData( "testvcardformatimpl", "vCard format plugin", "0.1" );
+
+ TDECmdLineArgs::init( argc, argv, &aboutData );
+
+ TDEApplication app( false, false );
+
+
+ TDEABC::Addressee addressee;
+
+ addressee.setNameFromString( TQString::fromUtf8("Иван Иванов") );
+ addressee.setNickName( TQString::fromUtf8("иванчо") );
+ addressee.setBirthday( TQDate( 1981, 7, 19 ) );
+ addressee.setMailer( "mutt1.2" );
+ addressee.setTimeZone( TDEABC::TimeZone( +2 ) );
+
+ TDEABC::Geo geo;
+ geo.setLatitude( 30 );
+ geo.setLongitude( 51 );
+ addressee.setGeo( geo );
+
+ addressee.setTitle( TQString::fromUtf8("Др") );
+ addressee.setRole( TQString::fromUtf8("Самарянин") );
+ addressee.setOrganization( TQString::fromUtf8("България ООД") );
+ addressee.setNote( TQString::fromUtf8("не\nпипай работеща система") );
+ addressee.setProductId( "testId" );
+ addressee.setRevision( TQDateTime::currentDateTime() );
+ addressee.setSortString( TQString::fromUtf8("сортиране") );
+ addressee.setUrl( KURL( "http://wgess17.dyndns.org") );
+ addressee.setSecrecy( TDEABC::Secrecy( TDEABC::Secrecy::Confidential ) );
+/*
+ TQImage img;
+ img.load( "testimg.png", "PNG" );
+ TDEABC::Picture photo;
+ photo.setData( img );
+ addressee.setPhoto( photo );
+
+ TQImage img2;
+ img2.load( "testimg.png", "PNG" );
+ TDEABC::Picture logo;
+ logo.setData( img2 );
+ addressee.setLogo( logo );
+
+ TQFile soundFile( "testsound.wav" );
+ soundFile.open( IO_ReadOnly );
+ TQByteArray data = soundFile.readAll();
+ soundFile.close();
+ TDEABC::Sound sound;
+ sound.setData( data );
+ addressee.setSound( sound );
+*/
+ addressee.insertEmail( TQString::fromUtf8("иван.иванов@българия.оод"), true );
+ addressee.insertEmail( TQString::fromUtf8("иванчо@yahoo.de"), true );
+
+ TDEABC::PhoneNumber phone1( "029876543", TDEABC::PhoneNumber::Pref | TDEABC::PhoneNumber::Home );
+ TDEABC::PhoneNumber phone2( "+359888111222", TDEABC::PhoneNumber::Work );
+ addressee.insertPhoneNumber( phone1 );
+ addressee.insertPhoneNumber( phone2 );
+
+ TDEABC::Key key( "secret key", TDEABC::Key::X509 );
+ addressee.insertKey( key );
+
+ TQStringList categories;
+ categories << "Friends" << "School" << "KDE";
+ addressee.setCategories( categories );
+
+ TDEABC::Address a( TDEABC::Address::Work | TDEABC::Address::Postal | TDEABC::Address::Parcel );
+ a.setStreet( TQString::fromUtf8("Цар Борис III") );
+ a.setLocality( TQString::fromUtf8("София" ));
+ a.setRegion( TQString::fromUtf8("София град" ));
+ a.setPostalCode( TQString::fromUtf8("1000" ));
+ a.setCountry( TQString::fromUtf8("България" ));
+ addressee.insertAddress( a );
+
+ addressee.insertCustom( "1hsdf", "test1",TQString::fromUtf8( "ежзик" ));
+ addressee.insertCustom( "2hsdf", "test2",TQString::fromUtf8( "ежзик" ));
+ addressee.insertCustom( "3hsdf", "test3",TQString::fromUtf8( "ежзик" ));
+
+ addressee.dump();
+
+ kdDebug() << ">>>>>>>>>>>>>>>>END FIRST ADDRESSEE<<<<<<<<<<<<<<" << endl;
+
+// TDEABC::Addressee::List list;
+// for ( int i = 0; i < 20; ++i ) {
+// TDEABC::Addressee addr = addressee;
+// addr.setUid( TQString::number( i ) );
+// list.append( addr );
+// }
+
+// TDEABC::VCardConverter converter;
+// TQString txt = converter.createVCards( list );
+//
+// TQFile file( "out2.vcf" );
+// file.open( IO_WriteOnly );
+//
+// TQTextStream s( &file );
+// s.setEncoding( TQTextStream::UnicodeUTF8 );
+// s << txt;
+// file.close();
+
+ VCardFormatImpl *vcfImpl = new VCardFormatImpl();
+ TQFile file( "vfimpout.vcf" );
+ if ( file.open(IO_WriteOnly) ){
+ vcfImpl->save(addressee, &file);
+ file.close();
+ }
+
+
+ TDEABC::Addressee addressee2;
+
+ if ( file.open(IO_ReadOnly ) ){
+ vcfImpl->load(addressee2, &file);
+ file.close();
+ }
+
+ addressee2.dump();
+
+ return 0;
+
+
+/* Addressee::List::iterator itr1;
+ Addressee::List::iterator itr2;
+ for ( itr1 = l.begin(), itr2 = parsed.begin();
+ itr1 != l.end(); ++itr1, ++itr2 ) {
+ if ( (*itr1).fullEmail() == (*itr2).fullEmail() &&
+ (*itr1).organization() == (*itr2).organization() &&
+ (*itr1).phoneNumbers() == (*itr2).phoneNumbers() &&
+ (*itr1).emails() == (*itr2).emails() &&
+ (*itr1).role() == (*itr2).role() ) {
+ kdDebug()<<"\tAddressee - PASSED"<<endl;
+ kdDebug()<<"\t\t"<< (*itr1).fullEmail() << " VS. " << (*itr2).fullEmail()<<endl;
+ } else {
+ kdDebug()<<"\tAddressee - FAILED"<<endl;
+ kdDebug()<<">>>>>>>Addressee from code<<<<<<<<"<<endl;
+ (*itr1).dump();
+ kdDebug()<<">>>>>>>Addressee from file<<<<<<<<"<<endl;
+ (*itr2).dump();
+ //kdDebug()<<"\t\t"<< (*itr1).fullEmail() << " VS. " << (*itr2).fullEmail()<<endl;
+ }
+ }
+*/
+}
diff --git a/tdeabc/vcardparser/testwrite2.cpp b/tdeabc/vcardparser/testwrite2.cpp
new file mode 100644
index 000000000..447072aa4
--- /dev/null
+++ b/tdeabc/vcardparser/testwrite2.cpp
@@ -0,0 +1,136 @@
+/*
+ This file is part of libtdeabc.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <tdeabc/addressee.h>
+#include <tdeabc/phonenumber.h>
+#include <tdeabc/address.h>
+#include <tdeabc/key.h>
+#include <tdeabc/picture.h>
+#include <tdeabc/sound.h>
+#include <tdeabc/secrecy.h>
+#include <tdeaboutdata.h>
+#include <tdeapplication.h>
+#include <tdecmdlineargs.h>
+
+#include <tqfile.h>
+#include <tqtextstream.h>
+
+#include "vcardconverter.h"
+
+int main( int argc, char **argv )
+{
+ TDEAboutData aboutData( "testwrite", "vCard test writer", "0.1" );
+
+ TDECmdLineArgs::init( argc, argv, &aboutData );
+
+ TDEApplication app( false, false );
+
+
+ TDEABC::Addressee addressee;
+
+ addressee.setNameFromString( TQString::fromUtf8("Иван Иванов") );
+ addressee.setNickName( TQString::fromUtf8("иванчо") );
+ addressee.setBirthday( TQDate( 1981, 7, 19 ) );
+ addressee.setMailer( "mutt1.2" );
+ addressee.setTimeZone( TDEABC::TimeZone( +2 ) );
+
+ TDEABC::Geo geo;
+ geo.setLatitude( 30 );
+ geo.setLongitude( 51 );
+ addressee.setGeo( geo );
+
+ addressee.setTitle( TQString::fromUtf8("Др") );
+ addressee.setRole( TQString::fromUtf8("Самарянин") );
+ addressee.setOrganization( TQString::fromUtf8("България ООД") );
+ addressee.setNote( TQString::fromUtf8("не\nпипай работеща система") );
+ addressee.setProductId( "testId" );
+ addressee.setRevision( TQDateTime::currentDateTime() );
+ addressee.setSortString( TQString::fromUtf8("сортиране") );
+ addressee.setUrl( KURL( "http://wgess17.dyndns.org") );
+ addressee.setSecrecy( TDEABC::Secrecy( TDEABC::Secrecy::Confidential ) );
+/*
+ TQImage img;
+ img.load( "testimg.png", "PNG" );
+ TDEABC::Picture photo;
+ photo.setData( img );
+ addressee.setPhoto( photo );
+
+ TQImage img2;
+ img2.load( "testimg.png", "PNG" );
+ TDEABC::Picture logo;
+ logo.setData( img2 );
+ addressee.setLogo( logo );
+
+ TQFile soundFile( "testsound.wav" );
+ soundFile.open( IO_ReadOnly );
+ TQByteArray data = soundFile.readAll();
+ soundFile.close();
+ TDEABC::Sound sound;
+ sound.setData( data );
+ addressee.setSound( sound );
+*/
+ addressee.insertEmail( TQString::fromUtf8("иван.иванов@българия.оод"), true );
+ addressee.insertEmail( TQString::fromUtf8("иванчо@yahoo.de"), true );
+
+ TDEABC::PhoneNumber phone1( "029876543", TDEABC::PhoneNumber::Pref | TDEABC::PhoneNumber::Home );
+ TDEABC::PhoneNumber phone2( "+359888111222", TDEABC::PhoneNumber::Work );
+ addressee.insertPhoneNumber( phone1 );
+ addressee.insertPhoneNumber( phone2 );
+
+ TDEABC::Key key( "secret key", TDEABC::Key::X509 );
+ addressee.insertKey( key );
+
+ TQStringList categories;
+ categories << "Friends" << "School" << "KDE";
+ addressee.setCategories( categories );
+
+ TDEABC::Address a( TDEABC::Address::Work | TDEABC::Address::Postal | TDEABC::Address::Parcel );
+ a.setStreet( TQString::fromUtf8("Цар Борис III") );
+ a.setLocality( TQString::fromUtf8("София" ));
+ a.setRegion( TQString::fromUtf8("София град" ));
+ a.setPostalCode( TQString::fromUtf8("1000" ));
+ a.setCountry( TQString::fromUtf8("България" ));
+ addressee.insertAddress( a );
+
+ addressee.insertCustom( "1hsdf", "test1",TQString::fromUtf8( "ежзик" ));
+ addressee.insertCustom( "2hsdf", "test2",TQString::fromUtf8( "ежзик" ));
+ addressee.insertCustom( "3hsdf", "test3",TQString::fromUtf8( "ежзик" ));
+
+ addressee.dump();
+
+ TDEABC::Addressee::List list;
+ for ( int i = 0; i < 20; ++i ) {
+ TDEABC::Addressee addr = addressee;
+ addr.setUid( TQString::number( i ) );
+ list.append( addr );
+ }
+
+ TDEABC::VCardConverter converter;
+ TQString txt = converter.createVCards( list );
+
+ TQFile file( "out2.vcf" );
+ file.open( IO_WriteOnly );
+
+ TQTextStream s( &file );
+ s.setEncoding( TQTextStream::UnicodeUTF8 );
+ s << txt;
+ file.close();
+
+ return 0;
+}
diff --git a/tdeabc/vcardparser/vcardparser.cpp b/tdeabc/vcardparser/vcardparser.cpp
index 7ac07ce22..f8fe63791 100644
--- a/tdeabc/vcardparser/vcardparser.cpp
+++ b/tdeabc/vcardparser/vcardparser.cpp
@@ -151,8 +151,8 @@ VCard::List VCardParser::parseVCards( const TQString& text )
input = TQCString(value.latin1());
KCodecs::quotedPrintableDecode( input, output );
}
- } else {
- output = TQCString(value.latin1());
+ } else { //assume it's in UTF-8 (as used in previous KDE versions)
+ output = TQCString(value.utf8());
}
if ( params.findIndex( "charset" ) != -1 ) { // have to convert the data
@@ -275,7 +275,7 @@ TQString VCardParser::createVCards( const VCard::List& list )
for ( uint i = 0; i <= ( textLine.length() / FOLD_WIDTH ); ++i )
text.append( ( i == 0 ? "" : " " ) + textLine.mid( i * FOLD_WIDTH, FOLD_WIDTH ) + "\r\n" );
} else
- text.append( textLine + "\r\n" );
+ text.append( textLine + "\r\n" );
}
else {
// URIs can be full of weird symbols, etc. so bypass all checks