From 4ceb2b158b3ed1ba1c78ab886b08a0bf40577d51 Mon Sep 17 00:00:00 2001 From: Emanoil Kotsev Date: Sun, 29 May 2016 02:31:06 +0200 Subject: Fix utf8 support in tdeabc vCard parser This resolves bug 2625 Signed-off-by: Emanoil Kotsev --- tdeabc/plugins/file/resourcefile.cpp | 82 ++++++++----- tdeabc/vcardformatplugin.cpp | 16 ++- tdeabc/vcardparser/CMakeLists.txt | 78 +++++++++++++ tdeabc/vcardparser/checkvcard.pl | 73 +++++------- tdeabc/vcardparser/test.sh | 6 + tdeabc/vcardparser/testread.cpp | 4 +- tdeabc/vcardparser/testread2.cpp | 2 + tdeabc/vcardparser/tests/vcard8.vcf | 12 ++ tdeabc/vcardparser/tests/vcard8.vcf.ref | 14 +++ tdeabc/vcardparser/tests/vcard9.vcf | 14 +++ tdeabc/vcardparser/tests/vcard9.vcf.ref | 15 +++ tdeabc/vcardparser/testutils.cpp | 57 ++++++++- tdeabc/vcardparser/testvcardformat.cpp | 178 +++++++++++++++++++++++++++++ tdeabc/vcardparser/testvcardformatimpl.cpp | 174 ++++++++++++++++++++++++++++ tdeabc/vcardparser/testwrite2.cpp | 136 ++++++++++++++++++++++ tdeabc/vcardparser/vcardparser.cpp | 6 +- 16 files changed, 783 insertions(+), 84 deletions(-) create mode 100644 tdeabc/vcardparser/test.sh create mode 100644 tdeabc/vcardparser/tests/vcard8.vcf create mode 100644 tdeabc/vcardparser/tests/vcard8.vcf.ref create mode 100644 tdeabc/vcardparser/tests/vcard9.vcf create mode 100644 tdeabc/vcardparser/tests/vcard9.vcf.ref create mode 100644 tdeabc/vcardparser/testvcardformat.cpp create mode 100644 tdeabc/vcardparser/testvcardformatimpl.cpp create mode 100644 tdeabc/vcardparser/testwrite2.cpp 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( ) { - 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( ) { - 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( ) { - $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 #include -#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()<>>>>>>Addressee from code<<<<<<<<"<>>>>>>Addressee from file<<<<<<<<"< +#include "vcardparser.h" #include #include +#include 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 +#include +#include +// #include +#include + +#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"<>>>>>>Addressee from code<<<<<<<<"<>>>>>>Addressee from file<<<<<<<<"< +#include +#include +// #include +#include + +#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"<>>>>>>Addressee from code<<<<<<<<"<>>>>>>Addressee from file<<<<<<<<"< +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#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 -- cgit v1.2.3