Major KAddressbook carddav fixes and improvements (should now work with Zimbra once Zimbra fixes a standards compliance issue with contact creation mimetypes)

Fixed handling of close events and save interaction with Kontact and Korganizer

git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1141613 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
v3.5.13-sru
tpearson 14 years ago
parent 23f5d4229c
commit 672beaaffc

@ -212,6 +212,12 @@ void KOrganizerPlugin::processDropEvent( QDropEvent *event )
.arg( event->format() ) ); .arg( event->format() ) );
} }
bool KOrganizerPlugin::queryClose() const {
KOrganizerIface_stub stub( kapp->dcopClient(), "korganizer", "KOrganizerIface" );
bool canClose=stub.canQueryClose();
return canClose;
}
void KOrganizerPlugin::loadProfile( const QString& directory ) void KOrganizerPlugin::loadProfile( const QString& directory )
{ {
DCOPRef ref( "korganizer", "KOrganizerIface" ); DCOPRef ref( "korganizer", "KOrganizerIface" );

@ -29,6 +29,7 @@
#include <kparts/part.h> #include <kparts/part.h>
#include "kcalendariface_stub.h" #include "kcalendariface_stub.h"
#include "korganizeriface_stub.h"
#include "plugin.h" #include "plugin.h"
#include "uniqueapphandler.h" #include "uniqueapphandler.h"
@ -44,6 +45,8 @@ class KOrganizerPlugin : public Kontact::Plugin
virtual bool isRunningStandalone(); virtual bool isRunningStandalone();
int weight() const { return 400; } int weight() const { return 400; }
virtual bool queryClose() const;
bool canDecodeDrag( QMimeSource * ); bool canDecodeDrag( QMimeSource * );
void processDropEvent( QDropEvent * ); void processDropEvent( QDropEvent * );

@ -123,7 +123,7 @@ int KontactApp::newInstance()
int main( int argc, char **argv ) int main( int argc, char **argv )
{ {
KAboutData about( "kontact", I18N_NOOP( "Kontact" ), version, description, KAboutData about( "kontact", I18N_NOOP( "Kontact" ), version, description,
KAboutData::License_GPL, I18N_NOOP("(C) 2001-2008 The Kontact developers"), 0, "http://kontact.org" ); KAboutData::License_GPL, I18N_NOOP("(C) 2008-2010 The Trinity Desktop Project\n(C) 2001-2008 The Kontact developers"), 0, "http://trinity.pearsoncomputing.net" );
about.addAuthor( "Daniel Molkentin", 0, "molkentin@kde.org" ); about.addAuthor( "Daniel Molkentin", 0, "molkentin@kde.org" );
about.addAuthor( "Don Sanders", 0, "sanders@kde.org" ); about.addAuthor( "Don Sanders", 0, "sanders@kde.org" );
about.addAuthor( "Cornelius Schumacher", 0, "schumacher@kde.org" ); about.addAuthor( "Cornelius Schumacher", 0, "schumacher@kde.org" );

@ -1026,7 +1026,8 @@ void MainWindow::saveProperties( KConfig *config )
bool MainWindow::queryClose() bool MainWindow::queryClose()
{ {
if ( kapp->sessionSaving() || mReallyClose ) //if ( kapp->sessionSaving() || mReallyClose )
if ( kapp->sessionSaving() )
return true; return true;
bool localClose = true; bool localClose = true;

@ -31,6 +31,7 @@ class KOrganizerIface : virtual public DCOPObject
virtual bool mergeURL(const QString &url) = 0; virtual bool mergeURL(const QString &url) = 0;
virtual void closeURL() = 0; virtual void closeURL() = 0;
virtual bool saveURL() = 0; virtual bool saveURL() = 0;
virtual bool canQueryClose() = 0;
virtual bool saveAsURL(const QString &url) = 0; virtual bool saveAsURL(const QString &url) = 0;
virtual QString getCurrentURLasString() const = 0; virtual QString getCurrentURLasString() const = 0;
virtual bool editIncidence(const QString &uid) = 0; virtual bool editIncidence(const QString &uid) = 0;

@ -90,6 +90,11 @@ bool KOrganizerIfaceImpl::addIncidence( const QString &ical )
return mActionManager->addIncidence( ical ); return mActionManager->addIncidence( ical );
} }
bool KOrganizerIfaceImpl::canQueryClose()
{
return mActionManager->queryClose();
}
void KOrganizerIfaceImpl::loadProfile( const QString& path ) void KOrganizerIfaceImpl::loadProfile( const QString& path )
{ {
mActionManager->loadProfile( path ); mActionManager->loadProfile( path );

@ -49,6 +49,7 @@ public:
bool mergeURL( const QString &url ); bool mergeURL( const QString &url );
void closeURL(); void closeURL();
bool saveURL(); bool saveURL();
bool canQueryClose();
bool saveAsURL( const QString &url ); bool saveAsURL( const QString &url );
QString getCurrentURLasString() const; QString getCurrentURLasString() const;

@ -87,6 +87,7 @@ void ResourceCardDavConfig::loadSettings( KRES::Resource *resource ) {
mUsername->setText(p->username()); mUsername->setText(p->username());
mRememberPassword->setChecked(p->rememberPassword()); mRememberPassword->setChecked(p->rememberPassword());
mPassword->setText(p->password()); mPassword->setText(p->password());
mUseUriNotUID->setChecked(p->useURI());
mReloadConfig->loadSettings(res); mReloadConfig->loadSettings(res);
mSaveConfig->loadSettings(res); mSaveConfig->loadSettings(res);
@ -105,6 +106,7 @@ void ResourceCardDavConfig::saveSettings( KRES::Resource *resource ) {
p->setUsername(mUsername->text()); p->setUsername(mUsername->text());
p->setRememberPassword(mRememberPassword->isChecked()); p->setRememberPassword(mRememberPassword->isChecked());
p->setPassword(mPassword->text()); p->setPassword(mPassword->text());
p->setUseURI(mUseUriNotUID->isChecked());
} }
} }
} }
@ -137,6 +139,9 @@ void ResourceCardDavConfig::setupUI() {
mRememberPassword = new QCheckBox( i18n("Remember password"), this ); mRememberPassword = new QCheckBox( i18n("Remember password"), this );
mainLayout->addWidget(mRememberPassword, 4, 1); mainLayout->addWidget(mRememberPassword, 4, 1);
mUseUriNotUID = new QCheckBox( i18n( "Use URI instead of UID when modifying existing contacts" ), this );
mainLayout->addWidget( mUseUriNotUID, 5, 1 );
// configs // configs
QHBoxLayout* horizontal = new QHBoxLayout(this); QHBoxLayout* horizontal = new QHBoxLayout(this);

@ -59,6 +59,7 @@ private:
QLineEdit *mUsername; QLineEdit *mUsername;
QLineEdit *mPassword; QLineEdit *mPassword;
QCheckBox *mRememberPassword; QCheckBox *mRememberPassword;
QCheckBox *mUseUriNotUID;
CardDavReloadConfig* mReloadConfig; CardDavReloadConfig* mReloadConfig;
CardDavSaveConfig* mSaveConfig; CardDavSaveConfig* mSaveConfig;

@ -35,7 +35,7 @@ using namespace KABC;
| CONSTRUCTOR AND DESTRUCTOR | CONSTRUCTOR AND DESTRUCTOR
========================================================================*/ ========================================================================*/
CardDavJob::CardDavJob(const QString& url) { CardDavJob::CardDavJob(const QString& url) : mUseURI(false) {
cleanJob(); cleanJob();
setUrl(url); setUrl(url);
} }

@ -52,6 +52,13 @@ public:
mUrl = s; mUrl = s;
} }
/**
* Sets whether to use UID (false) or URI (true) as an object's unique identifier
*/
virtual void setUseURI(bool b) {
mUseURI = b;
}
/** /**
* Sets the parent qobject. * Sets the parent qobject.
*/ */
@ -73,6 +80,13 @@ public:
return mUrl; return mUrl;
} }
/**
* @return whether to use UID (false) or URI (true) as an object's unique identifier
*/
virtual bool getUseURI() {
return mUseURI;
}
/** /**
* @return parent object * @return parent object
*/ */
@ -151,6 +165,7 @@ private:
long mErrorNumber; long mErrorNumber;
QObject *mParent; QObject *mParent;
int mType; int mType;
bool mUseURI;
void enableCarddavDebug(runtime_info*); void enableCarddavDebug(runtime_info*);
}; };

@ -206,6 +206,10 @@ void CardDavPrefs::readConfig() {
}*/ }*/
} }
bool CardDavPrefs::getUseURI() {
return useURI();
}
QString CardDavPrefs::getFullUrl() { QString CardDavPrefs::getFullUrl() {
QUrl t(url()); QUrl t(url());

@ -86,6 +86,8 @@ public:
*/ */
QString getFullUrl(); QString getFullUrl();
bool getUseURI();
protected: protected:
/** /**

@ -22,5 +22,9 @@
<label>Remember password</label> <label>Remember password</label>
</entry> </entry>
<entry key="UseURI" type="Bool" >
<label>Use URI instead of UID</label>
</entry>
</group> </group>
</kcfg> </kcfg>

@ -38,13 +38,11 @@ int CardDavReader::runJob(runtime_info* RT) {
response* result = carddav_get_response(); response* result = carddav_get_response();
CARDDAV_RESPONSE res = OK; CARDDAV_RESPONSE res = OK;
if (mGetAll) { kdDebug() << "getting all objects";
kdDebug() << "getting all objects"; if (getUseURI() == false)
res = carddav_getall_object(result, std::string(url().ascii()).c_str(), RT); res = carddav_getall_object(result, std::string(url().ascii()).c_str(), RT);
} else { else
kdDebug() << "getting object from the specified time range"; res = carddav_getall_object_by_uri(result, std::string(url().ascii()).c_str(), RT);
res = carddav_get_object(result, mTimeStart.toTime_t(), mTimeEnd.toTime_t(), std::string(url().ascii()).c_str(), RT);
}
if (OK == res) { if (OK == res) {
kdDebug() << "success"; kdDebug() << "success";

@ -333,6 +333,7 @@ void ResourceCardDav::loadingQueuePop() {
mLoader->setUrl(t->url); mLoader->setUrl(t->url);
mLoader->setParent(this); mLoader->setParent(this);
mLoader->setType(0); mLoader->setType(0);
mLoader->setUseURI(mPrefs->getUseURI());
//QDateTime dt(QDate::currentDate()); //QDateTime dt(QDate::currentDate());
//mLoader->setRange(dt.addDays(-CACHE_DAYS), dt.addDays(CACHE_DAYS)); //mLoader->setRange(dt.addDays(-CACHE_DAYS), dt.addDays(CACHE_DAYS));
@ -394,17 +395,11 @@ void ResourceCardDav::loadFinished() {
QString data = loader->data(); QString data = loader->data();
if (!data.isNull() && !data.isEmpty()) { if (!data.isNull() && !data.isEmpty()) {
// TODO: I don't know why, but some schedules on http://carddav-test.ioda.net/ (I used it for testing)
// have some lines separated by single \r rather than \n or \r\n.
// ICalFormat fails to parse that.
data.replace("\r\n", "\n"); // to avoid \r\n becomes \n\n after the next line data.replace("\r\n", "\n"); // to avoid \r\n becomes \n\n after the next line
data.replace('\r', '\n'); data.replace('\r', '\n');
log("trying to parse..."); log("trying to parse...");
//printf("PARSING:\n\r%s\n\r", data.ascii());
if (parseData(data)) { if (parseData(data)) {
// FIXME: The agenda view can crash when a change is
// made on a remote server and a reload is requested!
log("... parsing is ok"); log("... parsing is ok");
log("clearing changes"); log("clearing changes");
//enableChangeNotification(); //enableChangeNotification();
@ -550,6 +545,7 @@ void ResourceCardDav::writingQueuePop() {
mWriter->setUrl(t->url); mWriter->setUrl(t->url);
mWriter->setParent(this); mWriter->setParent(this);
mWriter->setType(1); mWriter->setType(1);
mWriter->setUseURI(mPrefs->getUseURI());
#ifdef KCARDDAV_DEBUG #ifdef KCARDDAV_DEBUG
const QString fout_path = "/tmp/kcarddav_upload_" + identifier() + ".tmp"; const QString fout_path = "/tmp/kcarddav_upload_" + identifier() + ".tmp";
@ -673,6 +669,11 @@ void ResourceCardDav::writingFinished() {
mWritingQueueReady = true; mWritingQueueReady = true;
updateProgressBar(1); updateProgressBar(1);
writingQueuePop(); writingQueuePop();
// If a URI is required we will need to retrieve it from the server after the new record is committed...
if (mPrefs->getUseURI() == true) {
startLoading(mPrefs->getFullUrl());
}
} }
// EOF ======================================================================== // EOF ========================================================================

@ -24,9 +24,9 @@
// Use carddav_modify_object() function. // Use carddav_modify_object() function.
// If it's not set, a pair of carddav_delete_object/carddav_add_object // If it's not set, a pair of carddav_delete_object/carddav_add_object
// is used for modifying objects. // is used for modifying objects.
// It's done, because, for some reason, SOGo server returns an error // It's done, because, for some reason, Zimbra returns an error
// on carddav_modify_object. DAViCAL works fine both ways. // on carddav_modify_object.
#define USE_CARDDAV_MODIFY //#define USE_CARDDAV_MODIFY
/*========================================================================= /*=========================================================================
| NAMESPACE | NAMESPACE
@ -52,20 +52,35 @@ int CardDavWriter::runJob(runtime_info* RT) {
if (OK == res) { if (OK == res) {
#ifdef USE_CARDDAV_MODIFY #ifdef USE_CARDDAV_MODIFY
kdDebug() << "pushing changed objects"; kdDebug() << "pushing changed objects";
res = pushObjects(mChanged, carddav_modify_object, OK, RT); if (getUseURI() == false)
res = pushObjects(mChanged, carddav_modify_object, OK, RT);
else
res = pushObjects(mChanged, carddav_modify_object_by_uri, OK, RT);
if (OK == res) { if (OK == res) {
kdDebug() << "pushing deleted objects"; kdDebug() << "pushing deleted objects";
res = pushObjects(mDeleted, carddav_delete_object, OK, RT); if (getUseURI() == false)
res = pushObjects(mDeleted, carddav_delete_object, OK, RT);
else
res = pushObjects(mDeleted, carddav_delete_object_by_uri, OK, RT);
} }
#else // if USE_CARDDAV_MODIFY #else // if USE_CARDDAV_MODIFY
kdDebug() << "pushing changed objects (delete)"; kdDebug() << "pushing changed objects (delete)";
res = pushObjects(mChanged, carddav_delete_object, OK, RT); if (getUseURI() == false)
res = pushObjects(mChanged, carddav_delete_object, OK, RT);
else
res = pushObjects(mChanged, carddav_delete_object_by_uri, OK, RT);
if (OK == res) { if (OK == res) {
kdDebug() << "pushing changed objects (add)"; kdDebug() << "pushing changed objects (add)";
res = pushObjects(mChanged, carddav_add_object, OK, RT); if (getUseURI() == false)
res = pushObjects(mChanged, carddav_add_object, OK, RT);
else
res = pushObjects(mChanged, carddav_add_object, OK, RT);
if (OK == res) { if (OK == res) {
kdDebug() << "pushing deleted objects"; kdDebug() << "pushing deleted objects";
res = pushObjects(mDeleted, carddav_delete_object, OK, RT); if (getUseURI() == false)
res = pushObjects(mDeleted, carddav_delete_object, OK, RT);
else
res = pushObjects(mDeleted, carddav_delete_object_by_uri, OK, RT);
} }
} }
#endif // if USE_CARDDAV_MODIFY #endif // if USE_CARDDAV_MODIFY

Loading…
Cancel
Save