-rw-r--r-- | kabc/plugins/qtopia/resourceqtopia.cpp | 2 | ||||
-rw-r--r-- | kaddressbook/xxport/qtopia_xxport.cpp | 16 | ||||
-rw-r--r-- | kaddressbook/xxportobject.cpp | 9 |
3 files changed, 19 insertions, 8 deletions
diff --git a/kabc/plugins/qtopia/resourceqtopia.cpp b/kabc/plugins/qtopia/resourceqtopia.cpp index d6df981..cf6b11a 100644 --- a/kabc/plugins/qtopia/resourceqtopia.cpp +++ b/kabc/plugins/qtopia/resourceqtopia.cpp @@ -1,336 +1,336 @@ /* This file is part of libkabc. Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Enhanced Version of the file for platform independent KDE tools. Copyright (c) 2004 Ulf Schenk $Id$ */ #include <sys/types.h> #include <sys/stat.h> #ifndef _WIN32_ #include <unistd.h> #endif #include <qdir.h> #include <qfile.h> #include <qtextstream.h> #include <qfileinfo.h> #include <qregexp.h> //US #include <qtimer.h> #include <kapplication.h> #include <kconfig.h> #include <kdebug.h> #include <klocale.h> //US #include <ksavefile.h> #include <kstandarddirs.h> #include <kmessagebox.h> #include "resourceqtopiaconfig.h" #include "stdaddressbook.h" #include "qtopiaconverter.h" #include "resourceqtopia.h" using namespace KABC; extern "C" #ifdef _WIN32_ __declspec(dllexport) #else { #endif void *init_microkabc_qtopia() { return new KRES::PluginFactory<ResourceQtopia,ResourceQtopiaConfig>(); } #ifndef _WIN32_ } #endif ResourceQtopia::ResourceQtopia( const KConfig *config ) : Resource( config ), mConverter (0) { // we can not choose the filename. Therefore use the default to display QString fileName = QDir::homeDirPath() + "/Applications/addressbook/addressbook.xml"; init( fileName ); } ResourceQtopia::ResourceQtopia( const QString &fileName ) : Resource( 0 ) { init( fileName ); } void ResourceQtopia::init( const QString &fileName ) { #ifdef _USE_DIRWATCH_ connect( &mDirWatch, SIGNAL( dirty(const QString&) ), SLOT( fileChanged() ) ); connect( &mDirWatch, SIGNAL( created(const QString&) ), SLOT( fileChanged() ) ); connect( &mDirWatch, SIGNAL( deleted(const QString&) ), SLOT( fileChanged() ) ); #endif setFileName( fileName ); } ResourceQtopia::~ResourceQtopia() { if (mConverter != 0) delete mConverter; } void ResourceQtopia::writeConfig( KConfig *config ) { Resource::writeConfig( config ); } Ticket *ResourceQtopia::requestSaveTicket() { kdDebug(5700) << "ResourceQtopia::requestSaveTicket()" << endl; qDebug("ResourceQtopia::requestSaveTicket: %s", fileName().latin1()); if ( !addressBook() ) return 0; if ( !lock( fileName() ) ) { kdDebug(5700) << "ResourceQtopia::requestSaveTicket(): Unable to lock file '" << fileName() << "'" << endl; return 0; } return createTicket( this ); } bool ResourceQtopia::doOpen() { qDebug("ResourceQtopia::doOpen(): %s", fileName().latin1()); if (mConverter == 0) { mConverter = new QtopiaConverter(); bool res = mConverter->init(); if ( !res ) { QString msg("Unable to initialize qtopia converter. Most likely a problem with the category file"); qDebug(msg); return false; } } return true; } void ResourceQtopia::doClose() { qDebug("ResourceQtopia::doClose: %s", fileName().latin1()); // it seems so, that deletion of access deletes backend as well //delete backend; return; } bool ResourceQtopia::load() { QFile file( fileName() ); if ( !file.open(IO_ReadOnly ) ) { return false; } QDomDocument doc("mydocument" ); if ( !doc.setContent( &file ) ) { file.close(); - return false; + return true; } bool res; QDomElement docElem = doc.documentElement( ); QDomNode n = docElem.firstChild(); while ( !n.isNull() ) { QDomElement e = n.toElement(); if ( !e.isNull() ) { if ( e.tagName() == QString::fromLatin1( "Contacts" ) ) { QDomNode no = e.firstChild(); while ( !no.isNull() ) { QDomElement el = no.toElement(); if ( !el.isNull() ) { KABC::Addressee addressee; res = mConverter->qtopiaToAddressee( el, addressee ); if ( !addressee.isEmpty() && res ) { addressee.setResource( this ); addressBook()->insertAddressee( addressee ); } } no = no.nextSibling(); } } } n = n.nextSibling(); } return true; } bool ResourceQtopia::save( Ticket *ticket ) { #ifdef _USE_DIRWATCH_ mDirWatch.stopScan(); #endif KABC::AddressBook::Iterator it; bool res; QFile file( fileName() ); if (!file.open( IO_WriteOnly ) ) { return false; } QTextStream ts( &file ); QTextStream *stream = &ts; stream->setEncoding( QTextStream::UnicodeUTF8 ); *stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE Addressbook ><AddressBook>" << endl; *stream << " <Groups>" << endl; *stream << " </Groups>" << endl; *stream << " <Contacts> " << endl; // for all entries KABC::Addressee ab; for ( it = addressBook()->begin(); it != addressBook()->end(); ++it ) { KABC::Addressee addressee = (*it); res = mConverter->addresseeToQtopia( addressee, stream ); if (!res == true) { qDebug("Unable to convert Addressee %s", addressee.formattedName().latin1()); } } *stream << "</Contacts>" << endl; *stream << "</AddressBook>" << endl; file.close(); #ifdef _USE_DIRWATCH_ mDirWatch.startScan(); #endif delete ticket; unlock( fileName() ); return true; } bool ResourceQtopia::lock( const QString &lockfileName ) { //disabled return true; qDebug("ResourceQtopia::lock: %s", fileName().latin1()); QString fn = lockfileName; KURL url(fn); QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); if (QFile::exists( lockName )) { qDebug("ResourceOpie::lock: lockfile %s already exists. (Delete it before continuing if nobody else is accessing the resourcefile %s)", lockName.latin1(), fileName().latin1()); return false; } QString lockUniqueName; lockUniqueName = fn + KApplication::randomString( 8 ); url = lockUniqueName; //US mLockUniqueName = locateLocal( "data", "kabc/lock/" + lockUniqueName ); mLockUniqueName = locateLocal( "data", "kabc/lock/" + url.fileName() ); kdDebug(5700) << "-- lock unique name: " << mLockUniqueName << endl; // Create unique file QFile file( mLockUniqueName ); file.open( IO_WriteOnly ); file.close(); // Create lock file int result = 0; #ifndef _WIN32_ result = ::link( QFile::encodeName( mLockUniqueName ), QFile::encodeName( lockName ) ); #endif if ( result == 0 ) { addressBook()->emitAddressBookLocked(); return true; } // TODO: check stat return false; } void ResourceQtopia::unlock( const QString &fileName ) { //disabled return; qDebug("ResourceQtopia::unlock() %s", fileName.latin1()); QString fn = fileName; KURL url(fn); QString lockName = locateLocal( "data", "kabc/lock/" + url.fileName() + ".lock" ); QFile::remove( lockName ); QFile::remove( mLockUniqueName ); addressBook()->emitAddressBookUnlocked(); } void ResourceQtopia::setFileName( const QString &newFileName ) { #ifdef _USE_DIRWATCH_ mDirWatch.stopScan(); #endif mDirWatch.removeFile( fileName() ); Resource::setFileName( newFileName ); mDirWatch.addFile( fileName() ); #ifdef _USE_DIRWATCH_ mDirWatch.startScan(); #endif } void ResourceQtopia::fileChanged() { // There is a small theoretical chance that KDirWatch calls us before // we are fully constructed if (!addressBook()) return; QString text( i18n( "Qtopia resource '%1'<br> has been changed by third party.<br>Do you want to reload?").arg( fileName() ) ); if ( readOnly() || KMessageBox::questionYesNo( 0, text ) == KMessageBox::Yes ) { load(); addressBook()->emitAddressBookChanged(); } } void ResourceQtopia::removeAddressee( const Addressee &addr ) { } void ResourceQtopia::cleanUp() { unlock( fileName() ); } //US #include "resourceqtopia.moc" diff --git a/kaddressbook/xxport/qtopia_xxport.cpp b/kaddressbook/xxport/qtopia_xxport.cpp index 0cf6546..fc4abbb 100644 --- a/kaddressbook/xxport/qtopia_xxport.cpp +++ b/kaddressbook/xxport/qtopia_xxport.cpp @@ -1,78 +1,86 @@ /* This file is part of KAddressbook. Copyright (c) 2003 Tobias Koenig <tokoe@kde.org> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. As a special exception, permission is given to link this program with any edition of Qt, and distribute the resulting executable, without including the source code for Qt in the source distribution. */ /* Enhanced Version of the file for platform independent KDE tools. Copyright (c) 2004 Ulf Schenk $Id$ */ #include <qdir.h> #include "addressee.h" #include "xxportmanager.h" #include "qtopia_xxport.h" +#include <kfiledialog.h> /*US class QtopiaXXPortFactory : public XXPortFactory { public: XXPortObject *xxportObject( KABC::AddressBook *ab, QWidget *parent, const char *name ) { return new QtopiaXXPort( ab, parent, name ); } }; */ extern "C" { void *init_microkaddrbk_qtopia_xxport() { return ( new QtopiaXXPortFactory() ); } } QtopiaXXPort::QtopiaXXPort( KABC::AddressBook *ab, QWidget *parent, const char *name ) : XXPortResourceObject( ab, parent, name ) { defaultFileName = QDir::homeDirPath() + "/Applications/addressbook/addressbook.xml"; if ( mFactory && !mFactory->typeName( "qtopia" ).isEmpty() ) { - createImportAction( i18n( "Import Qtopia..." ) ); - createExportAction( i18n( "Export Qtopia..." ) ); + createImportAction( i18n( "Import xml (Qtopia)..." ) ); + createExportAction( i18n( "Export xml (Qtopia)..." ) ); } } bool QtopiaXXPort::exportContacts( const KABC::AddresseeList &list, const QString &identifier ) { - return _exportContacts( list, identifier, defaultFileName ); + QString fn =KFileDialog::getSaveFileName( defaultFileName, i18n("Import xml file"), 0 ); + if ( fn == "" ) + return false; + + return _exportContacts( list, identifier, fn ); } KABC::AddresseeList QtopiaXXPort::importContacts( const QString &identifier ) const { - return _importContacts( identifier, defaultFileName ); + QString fn =KFileDialog::getOpenFileName( defaultFileName, i18n("Import xml file"), 0 ); + if ( fn == "" ) + return KABC::AddresseeList() ; + return _importContacts( identifier, fn ); } diff --git a/kaddressbook/xxportobject.cpp b/kaddressbook/xxportobject.cpp index 67e8406..bd9d986 100644 --- a/kaddressbook/xxportobject.cpp +++ b/kaddressbook/xxportobject.cpp @@ -1,273 +1,276 @@ /* This file is part of KAddressbook. Copyright (c) 2003 Tobias Koenig <tokoe@kde.org> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. As a special exception, permission is given to link this program with any edition of Qt, and distribute the resulting executable, without including the source code for Qt in the source distribution. */ /* Enhanced Version of the file for platform independent KDE tools. Copyright (c) 2004 Ulf Schenk $Id$ */ #include <qmap.h> +#include <qfile.h> #include <qsignalmapper.h> #include <kaction.h> #include <kmessagebox.h> #include <factory.h> #include "kabcore.h" #include "addressee.h" #include "tmpaddressbook.h" #include "xxportobject.h" class XXPortObject::XXPortObjectPrivate { public: QSignalMapper *mExportMapper; QSignalMapper *mImportMapper; }; XXPortObject::XXPortObject( KABC::AddressBook *ab, QWidget *parent, const char *name ) : QObject( parent, name ), mAddressBook( ab ), mParentWidget( parent ), d( new XXPortObjectPrivate ) { d->mExportMapper = new QSignalMapper( this ); d->mImportMapper = new QSignalMapper( this ); connect( d->mExportMapper, SIGNAL( mapped( const QString& ) ), SLOT( slotExportActivated( const QString& ) ) ); connect( d->mImportMapper, SIGNAL( mapped( const QString& ) ), SLOT( slotImportActivated( const QString& ) ) ); } XXPortObject::~XXPortObject() { delete d; d = 0; } bool XXPortObject::exportContacts( const KABC::AddresseeList&, const QString& ) { // do nothing return false; } KABC::AddresseeList XXPortObject::importContacts( const QString& ) const { // do nothing return KABC::AddresseeList(); } void XXPortObject::createImportAction( const QString &label, const QString &data ) { #ifdef KAB_EMBEDDED KABCore* kabcore = (KABCore*)mParentWidget; #endif //KAB_EMBEDDED QString id = "file_import_" + identifier() + ( data.isEmpty() ? QString( "" ) : "_" + data ); #ifndef KAB_EMBEDDED KAction *action = new KAction( label, 0, d->mImportMapper, SLOT( map() ), actionCollection(), id.latin1() ); #else //KAB_EMBEDDED KAction *action = new KAction( label, 0, d->mImportMapper, SLOT( map() ), kabcore->actionCollection(), id.latin1() ); #endif //KAB_EMBEDDED d->mImportMapper->setMapping( action, ( data.isEmpty() ? QString( "<empty>" ) : data ) ); #ifndef KAB_EMBEDDED setXMLFile( identifier() + "_xxportui.rc" ); #endif //KAB_EMBEDDED #ifdef KAB_EMBEDDED action->plug((QWidget*)kabcore->getImportMenu()); #endif //KAB_EMBEDDED } void XXPortObject::createExportAction( const QString &label, const QString &data ) { #ifdef KAB_EMBEDDED KABCore* kabcore = (KABCore*)mParentWidget; #endif //KAB_EMBEDDED QString id = "file_export_" + identifier() + ( data.isEmpty() ? QString( "" ) : "_" + data ); #ifndef KAB_EMBEDDED KAction *action = new KAction( label, 0, d->mExportMapper, SLOT( map() ), actionCollection(), id.latin1() ); #else //KAB_EMBEDDED KAction *action = new KAction( label, 0, d->mExportMapper, SLOT( map() ), kabcore->actionCollection(), id.latin1() ); #endif //KAB_EMBEDDED d->mExportMapper->setMapping( action, ( data.isEmpty() ? QString( "<empty>" ) : data ) ); #ifndef KAB_EMBEDDED setXMLFile( identifier() + "_xxportui.rc" ); #endif //KAB_EMBEDDED #ifdef KAB_EMBEDDED action->plug((QWidget*)kabcore->getExportMenu()); #endif //KAB_EMBEDDED } KABC::AddressBook *XXPortObject::addressBook() const { return mAddressBook; } QWidget *XXPortObject::parentWidget() const { return mParentWidget; } void XXPortObject::slotExportActivated( const QString &data ) { emit exportActivated( identifier(), ( data == "<empty>" ? QString::null : data ) ); } void XXPortObject::slotImportActivated( const QString &data ) { emit importActivated( identifier(), ( data == "<empty>" ? QString::null : data ) ); } /******************************************************************** * *******************************************************************/ XXPortResourceObject::XXPortResourceObject( KABC::AddressBook *ab, QWidget *parent, const char *name ) : XXPortObject( ab, parent, name ), mFactory(0) { mFactory = KRES::Factory::self( "tmpcontact" ); } XXPortResourceObject::~XXPortResourceObject() { //do not delete the factory. It is a singleton, and selfcontained } bool XXPortResourceObject::isAvailable() { return (mFactory != 0); } bool XXPortResourceObject::_exportContacts( const KABC::AddresseeList &list, const QString& identifier, const QString& fileName ) { //create new resource KABC::Resource* mResource = (KABC::Resource*)(mFactory->resource( this->identifier(), 0 )); if (mResource == 0) return false; - if (fileName != QString::null) + if (fileName != QString::null) { mResource->setFileName( fileName ); + } else + return false; KABC::TmpAddressBook tmpAB; bool res = tmpAB.addResource( mResource ); if (res == false) { delete mResource; return false; } - + if ( QFile::exists ( fileName ) ) { res = tmpAB.load(); if (res == false) { //removeResource deletes also the resource object, if the linkcount is 0 tmpAB.removeResource( mResource ); return false; } //Now check if the file has already entries, and ask the user if he wants to delete them first. if (tmpAB.begin() != tmpAB.end()) { QString text( i18n( "Do you want to remove<br>all existing entries from<br>%1<br>before exporting.?" ) ); if ( KMessageBox::questionYesNo( parentWidget(), text.arg( fileName ) ) == KMessageBox::Yes ) { // Clean the database.. tmpAB.clear(); } } - + } KABC::Addressee::List::ConstIterator it; for ( it = list.begin(); it != list.end(); ++it ) { tmpAB.insertAddressee(*it); } KABC::Ticket * ticket = tmpAB.requestSaveTicket(mResource); res = false; if (ticket != 0) res = tmpAB.save( ticket ); //removeResource deletes also the resource object, if the linkcount is 0 tmpAB.removeResource( mResource ); return res; } KABC::AddresseeList XXPortResourceObject::_importContacts( const QString& identifier, const QString& fileName ) const { KABC::Resource* mResource = (KABC::Resource*)(mFactory->resource( this->identifier(), 0 )); if (mResource == 0) return KABC::AddresseeList(); KABC::AddresseeList adrlst; if (fileName != QString::null) mResource->setFileName( fileName ); KABC::TmpAddressBook tmpAB; bool res = tmpAB.addResource( mResource ); if (res == false) { delete mResource; return KABC::AddresseeList(); } res = tmpAB.load(); adrlst = tmpAB.allAddressees(); //remove resource deletes also the Resourceobject, if the linkcount is 0 tmpAB.removeResource( mResource ); return adrlst; } #ifndef KAB_EMBEDDED #include "xxportobject.moc" #endif //KAB_EMBEDDED |