Fix utf8 support in tdeabc vCard parser

This resolves bug 2625

Signed-off-by: Emanoil Kotsev <deloptes@gmail.com>
pull/1/head
Emanoil Kotsev 9 years ago committed by Slávek Banko
parent 51efac909d
commit 4ceb2b158b

@ -164,32 +164,44 @@ bool ResourceFile::doOpen()
if ( file.size() == 0 ) { if ( file.size() == 0 ) {
file.close(); 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++) for (int i=0; i!=20; i++)
{ {
TQFile backup( mFileName + "__" + TQString::number(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 ) if ( backup.size() != 0 )
{ {
kdDebug() << "Restoring backup " << i << endl; kdDebug(5700) << "Restoring backup " << i << endl;
const TQString src = mFileName + "__" + TQString::number(i); const TQString src = mFileName + "__" + TQString::number(i);
const TQString dest = mFileName; 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 // remove dest
TQFile::remove( dest ); TQFile::remove( dest );
// copy src to dest TQString text;
if ( backup.open( IO_ReadOnly ) ) { TQTextStream instream( &backup );
const TQByteArray data = backup.readAll(); 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();
TQFile out( dest );
if ( out.open( IO_WriteOnly ) ) {
out.writeBlock( data );
out.close();
}
backup.close();
}
return true; return true;
} }
} }
@ -248,7 +260,7 @@ bool ResourceFile::save( Ticket * )
TQFile file( mFileName + "__0" ); TQFile file( mFileName + "__0" );
if ( file.size() != 0 ) { if ( file.size() != 0 ) {
const TQString last = mFileName + "__20"; const TQString last = mFileName + "__20";
kdDebug() << "deleting " << last << endl; kdDebug(5700) << "deleting " << last << endl;
TQFile::remove( last ); TQFile::remove( last );
@ -260,28 +272,40 @@ bool ResourceFile::save( Ticket * )
// copy src to dest // copy src to dest
TQFile in( src ); TQFile in( src );
if ( in.open( IO_ReadOnly ) ) { if ( ! in.exists() )
const TQByteArray data = in.readAll(); continue;
if ( ! in.open( IO_ReadOnly ) ) {
TQFile out( dest ); // const TQByteArray data = in.readAll();
if ( out.open( IO_WriteOnly ) ) { kdDebug(5700) << "can not open source for reading " << src << endl;
out.writeBlock( data ); return false;
out.close();
}
in.close();
} }
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 // remove src
TQFile::remove( src ); TQFile::remove( src );
} }
} else } else
kdDebug() << "Not starting logrotate __0 is 0 bytes." << endl; kdDebug(5700) << "Not starting logrotate __0 is 0 bytes." << endl;
TQString extension = "__0"; TQString extension = "__0";
(void) KSaveFile::backupFile( mFileName, TQString::null /*directory*/, (void) KSaveFile::backupFile( mFileName, TQString::null /*directory*/,
extension ); extension );
mDirWatch.stopScan(); mDirWatch.stopScan();
KSaveFile saveFile( mFileName ); KSaveFile saveFile( mFileName );

@ -41,7 +41,7 @@ bool VCardFormatPlugin::load( Addressee &addressee, TQFile *file )
TQString data; TQString data;
TQTextStream t( file ); TQTextStream t( file );
t.setEncoding( TQTextStream::Latin1 ); t.setEncoding( TQTextStream::UnicodeUTF8 );
data = t.read(); data = t.read();
VCardConverter converter; VCardConverter converter;
@ -60,7 +60,7 @@ bool VCardFormatPlugin::loadAll( AddressBook*, Resource *resource, TQFile *file
TQString data; TQString data;
TQTextStream t( file ); TQTextStream t( file );
t.setEncoding( TQTextStream::Latin1 ); t.setEncoding( TQTextStream::UnicodeUTF8 );
data = t.read(); data = t.read();
VCardConverter converter; VCardConverter converter;
@ -88,7 +88,11 @@ void VCardFormatPlugin::save( const Addressee &addressee, TQFile *file )
TQTextStream t( file ); TQTextStream t( file );
t.setEncoding( TQTextStream::UnicodeUTF8 ); 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 ) void VCardFormatPlugin::saveAll( AddressBook*, Resource *resource, TQFile *file )
@ -104,7 +108,11 @@ void VCardFormatPlugin::saveAll( AddressBook*, Resource *resource, TQFile *file
TQTextStream t( file ); TQTextStream t( file );
t.setEncoding( TQTextStream::UnicodeUTF8 ); 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 bool VCardFormatPlugin::checkFormat( TQFile *file ) const

@ -11,14 +11,32 @@
include_directories( include_directories(
${TQT_INCLUDE_DIRS} ${TQT_INCLUDE_DIRS}
${CMAKE_BINARY_DIR}
${CMAKE_SOURCE_DIR}
${CMAKE_BINARY_DIR}/tdecore ${CMAKE_BINARY_DIR}/tdecore
${CMAKE_SOURCE_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( link_directories(
${TQT_LIBRARY_DIRS} ${TQT_LIBRARY_DIRS}
) )
set( TDEABC_TESTS_LINK
${TQT_LIBRARIES}
DCOP-shared
tdecore-shared
tdeui-shared
tdefx-shared
tdeio-shared
tdetexteditor-shared
tdeabc-shared
)
##### headers ################################### ##### headers ###################################
@ -38,3 +56,63 @@ set( ${target}_SRCS
tde_add_library( ${target} STATIC_PIC tde_add_library( ${target} STATIC_PIC
SOURCES ${${target}_SRCS} 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}
)

@ -1,69 +1,58 @@
#!/usr/bin/perl #!/usr/bin/perl
use utf8;
use strict;
use warnings;
if ( @ARGV != 1 ) { if ( @ARGV != 1 ) {
print STDERR "Missing arg: filename\n"; print STDERR "Missing arg: filename\n";
exit 1; exit 1;
} }
$file = $ARGV[0]; my $file = $ARGV[0];
my $ref = "$file.ref";
if ( !open( IN, "$file" ) ) { my $options="";
print STDERR "Unable to open '$file'\n"; my $error=0;
exit 1; my @prscont;
} my @refcont;
open( IN, "<", $file ) || die ("Unable to open $file");
while( <IN> ) { while( <IN> ) {
if (/^VERSION:(.*)$/ ) { if (/^VERSION:(.*)$/ ) { my $v = $1; $options = "--vcard21" if $v eq "2.1"; }
$version = $1;
if ( $version eq "2.1" ) { $options = "--vcard21"; }
}
} }
close IN; close IN;
$ref = "$file.ref"; open( REF, "$ref" ) || die ("Unable to open $ref");
if ( !open( REF, "$ref" ) ) {
print STDERR "Unable to open $ref\n";
exit 1;
}
while( <REF> ) { while( <REF> ) {
push @ref, $_; next if $_ =~ /^UID/;
push @refcont , $_ ;
} }
close REF; close REF;
if ( !open( READ, "./testread $file $options 2> /dev/null |" ) ) { open( READ, "./testread $file $options 2> /dev/null |" ) || die ("Unable to open testread");
print STDERR "Unable to open testread\n"; print "Checking: $file ";
exit 1;
}
print "Checking '$file':\n";
$gotsomething = 0;
$error = 0;
$i = 0;
while( <READ> ) { while( <READ> ) {
$gotsomething = 1; next if $_ =~ /^UID/;
$out = $_; push @prscont , $_;
$ref = @ref[$i++];
if ( $out ne $ref ) {
if ( $ref =~ /^UID/ && $out =~ /^UID/ ) { next; }
$error++;
print " Expected : $ref";
print " Parser output : $out";
}
} }
close READ; 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"; system "touch FAILED";
exit 1; 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 ) { if ( $error > 0 ) {
print "\n FAILED: $error errors found.\n"; print "\n FAILED: $error errors found.\n";
system "touch FAILED"; system "touch FAILED";

@ -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;

@ -30,7 +30,7 @@
#include <tdelocale.h> #include <tdelocale.h>
#include <tdeaboutdata.h> #include <tdeaboutdata.h>
#include "vcardconverter.h" #include "tdeabc/vcardconverter.h"
#include "vcard.h" #include "vcard.h"
static const TDECmdLineOptions options[] = static const TDECmdLineOptions options[] =
@ -70,7 +70,7 @@ int main( int argc, char **argv )
TQString text; TQString text;
TQTextStream s( &file ); TQTextStream s( &file );
s.setEncoding( TQTextStream::Latin1 ); s.setEncoding( TQTextStream::UnicodeUTF8 );
text = s.read(); text = s.read();
file.close(); file.close();

@ -34,7 +34,9 @@ main()
kdDebug()<<"\t\t"<< (*itr1).fullEmail() << " VS. " << (*itr2).fullEmail()<<endl; kdDebug()<<"\t\t"<< (*itr1).fullEmail() << " VS. " << (*itr2).fullEmail()<<endl;
} else { } else {
kdDebug()<<"\tAddressee - FAILED"<<endl; kdDebug()<<"\tAddressee - FAILED"<<endl;
kdDebug()<<">>>>>>>Addressee from code<<<<<<<<"<<endl;
(*itr1).dump(); (*itr1).dump();
kdDebug()<<">>>>>>>Addressee from file<<<<<<<<"<<endl;
(*itr2).dump(); (*itr2).dump();
//kdDebug()<<"\t\t"<< (*itr1).fullEmail() << " VS. " << (*itr2).fullEmail()<<endl; //kdDebug()<<"\t\t"<< (*itr1).fullEmail() << " VS. " << (*itr2).fullEmail()<<endl;
} }

@ -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

@ -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

@ -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

@ -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

@ -1,6 +1,7 @@
#include <vcardparser.h> #include "vcardparser.h"
#include <tdeabc/addressee.h> #include <tdeabc/addressee.h>
#include <tqfile.h> #include <tqfile.h>
#include <tqstring.h>
using namespace TDEABC; using namespace TDEABC;
@ -60,8 +61,52 @@ vcard3()
return addr; 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 ) vcardAsText( const TQString& location )
{ {
TQString line; TQString line;
@ -84,16 +129,20 @@ vCardsAsAddresseeList()
l.append( vcard1() ); l.append( vcard1() );
l.append( vcard2() ); l.append( vcard2() );
l.append( vcard3() ); l.append( vcard3() );
l.append( vcard8() );
l.append( vcard9() );
return l; return l;
} }
QString TQString
vCardsAsText() vCardsAsText()
{ {
TQString vcards = vcardAsText( "tests/vcard1.vcf" ); TQString vcards = vcardAsText( "tests/vcard1.vcf" );
vcards += vcardAsText( "tests/vcard2.vcf" ); vcards += vcardAsText( "tests/vcard2.vcf" );
vcards += vcardAsText( "tests/vcard3.vcf" ); vcards += vcardAsText( "tests/vcard3.vcf" );
vcards += vcardAsText( "tests/vcard8.vcf" );
vcards += vcardAsText( "tests/vcard9.vcf" );
return vcards; return vcards;
} }

@ -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;
}
}
*/
}

@ -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;
}
}
*/
}

@ -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;
}

@ -151,8 +151,8 @@ VCard::List VCardParser::parseVCards( const TQString& text )
input = TQCString(value.latin1()); input = TQCString(value.latin1());
KCodecs::quotedPrintableDecode( input, output ); KCodecs::quotedPrintableDecode( input, output );
} }
} else { } else { //assume it's in UTF-8 (as used in previous KDE versions)
output = TQCString(value.latin1()); output = TQCString(value.utf8());
} }
if ( params.findIndex( "charset" ) != -1 ) { // have to convert the data 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 ) for ( uint i = 0; i <= ( textLine.length() / FOLD_WIDTH ); ++i )
text.append( ( i == 0 ? "" : " " ) + textLine.mid( i * FOLD_WIDTH, FOLD_WIDTH ) + "\r\n" ); text.append( ( i == 0 ? "" : " " ) + textLine.mid( i * FOLD_WIDTH, FOLD_WIDTH ) + "\r\n" );
} else } else
text.append( textLine + "\r\n" ); text.append( textLine + "\r\n" );
} }
else { else {
// URIs can be full of weird symbols, etc. so bypass all checks // URIs can be full of weird symbols, etc. so bypass all checks

Loading…
Cancel
Save