[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-pim
Subject:    [Kde-pim] [patch] Akonadi data connection
From:       Kevin Krammer <kevin.krammer () gmx ! at>
Date:       2007-08-17 17:01:54
Message-ID: 200708171902.07552.kevin.krammer () gmx ! at
[Download RAW message or body]

[Attachment #2 (multipart/signed)]

[Attachment #4 (multipart/mixed)]


Hi Akonadi-Devs,

I made another patch regarding Akonadi's data connection, this time making the 
connection paramters (port on Windows, socket directory on Unix) configurable 
through akonadiserverrc

When starting up, akonadiserver will read "Connection/Port" on Windows 
and "Connection/SocketDirectory" on Unix, defaulting to the previously 
hardcoded values.

After it has established its listening, it wil write the respective settings 
into akonadiconnectionrc, which in turn is read by libakonadi/session.
This allows to configure the TCP port to "0", meaning the server will just 
bind to any free port, and this port will then be available in to the clients 
through the connetion config.

The server also adds its D-Bus session address to the akonadiconnectionrc, but 
I am not yet using this on the client side.
Client side code would need to do something like

QDBusConnection::connectToBus(address, "AkonadiDataConnection")

instead of

QDBusConnection::sessionBus()

Cheers,
Kevin

-- 
Kevin Krammer, KDE developer, xdg-utils developer
KDE user support, developer mentoring

["akonadi-connection.diff" (text/x-diff)]

Index: libakonadi/session.cpp
===================================================================
--- libakonadi/session.cpp	(Revision 701208)
+++ libakonadi/session.cpp	(Arbeitskopie)
@@ -49,14 +49,18 @@
 
 void SessionPrivate::reconnect()
 {
+  // should be checking connection method and value validity
 #ifdef Q_OS_WIN
   if ( socket->state() != QAbstractSocket::ConnectedState &&
-       socket->state() != QAbstractSocket::ConnectingState )
-    socket->connectToHost( QHostAddress::LocalHost, 4444 );
+       socket->state() != QAbstractSocket::ConnectingState ) {
+    QString address = mConnectionSettings->value( QLatin1String( "Data/Address" ), \
QHostAddress(QHostAddress::LocalHost).toString() ).toString(); +    int port = \
mConnectionSettings->value( QLatin1String( "Data/Port" ), 4444 ).toInt(); +    \
socket->connectToHost( QHostAddress(address), port ); +  }
 #else
   if ( socket->state() != QAbstractSocket::ConnectedState &&
        socket->state() != QAbstractSocket::ConnectingState ) {
-    QString path = QDir::homePath() + \
QLatin1String("/.akonadi/akonadiserver.socket"); +    QString path = \
mConnectionSettings->value( QLatin1String( "Data/UnixPath" ), QDir::homePath() + \
QLatin1String( "/.akonadi/akonadiserver.socket" ) ).toString();  \
socket->connectToPath( path );  }
 #endif
@@ -137,6 +141,9 @@
   d->currentJob = 0;
   d->jobRunning = false;
 
+  d->mConnectionSettings = new QSettings( QDir::homePath() + \
QLatin1String("/.akonadi/akonadiconnectionrc"), QSettings::IniFormat ); +
+  // should check connection method
 #ifdef Q_OS_WIN
   d->socket = new QTcpSocket( this );
 #else
Index: libakonadi/session_p.h
===================================================================
--- libakonadi/session_p.h	(Revision 701208)
+++ libakonadi/session_p.h	(Arbeitskopie)
@@ -23,6 +23,7 @@
 #include "session.h"
 #include "imapparser.h"
 #include <QQueue>
+#include <QtCore/QSettings>
 #include <QThreadStorage>
 
 #ifdef Q_OS_WIN
@@ -37,7 +38,7 @@
 {
   public:
     SessionPrivate( Session *parent )
-      : mParent( parent )
+      : mParent( parent ), mConnectionSettings( 0 )
     {
       parser = new ImapParser();
     }
@@ -45,6 +46,7 @@
     ~SessionPrivate()
     {
       delete parser;
+      delete mConnectionSettings;
     }
 
     void startNext();
@@ -56,6 +58,7 @@
 
     Session *mParent;
     QByteArray sessionId;
+    QSettings *mConnectionSettings;
 #ifdef Q_OS_WIN
     QTcpSocket* socket;
 #else
Index: server/src/akonadi.cpp
===================================================================
--- server/src/akonadi.cpp	(Revision 701208)
+++ server/src/akonadi.cpp	(Arbeitskopie)
@@ -36,6 +36,7 @@
 #include <QtCore/QTimer>
 
 #include <unistd.h>
+#include <stdlib.h>
 
 using namespace Akonadi;
 
@@ -61,12 +62,30 @@
 
     s_instance = this;
 
+    QSettings connectionSettings( QDir::homePath() + \
QLatin1String("/.akonadi/akonadiconnectionrc"), QSettings::IniFormat ); +
 #ifdef Q_OS_WIN
-    if ( !listen( QHostAddress::LocalHost, 4444 ) )
-      qFatal("Unable to listen on port 4444");
+    int port = settings.value( QLatin1String( "Connection/Port" ), 4444 ).toInt();
+    if ( !listen( QHostAddress::LocalHost, port ) )
+      qFatal("Unable to listen on port %d", port);
+
+    connectionSettings.setValue( QLatin1String( "Data/Method" ), QLatin1String( \
"TCP" ) ); +    connectionSettings.setValue( QLatin1String( "Data/Address" ), \
serverAddress().toString() ); +    connectionSettings.setValue( QLatin1String( \
"Data/Port" ), serverPort() );  #else
-    if ( !listen( QDir::homePath() + QLatin1String("/.akonadi/akonadiserver.socket") \
                ) )
-      qFatal("Unable to listen on Unix socket");
+    QString socketDir = settings.value( QLatin1String( "Connection/SocketDirectory" \
), QLatin1String( ".akonadi" ) ).toString(); +    if ( socketDir[0] != QLatin1Char( \
'/' ) ) +    {
+      homeDir.mkdir( socketDir );
+      socketDir = QDir::homePath() + QLatin1Char( '/' ) + socketDir;
+    }
+
+    QString socketFile = socketDir + QLatin1String( "/akonadiserver.socket" );
+    if ( !listen( socketFile ) )
+      qFatal("Unable to listen on Unix socket '%s'", socketFile.toLocal8Bit().data() \
); +
+    connectionSettings.setValue( QLatin1String( "Data/Method" ), QLatin1String( \
"UnixPath" ) ); +    connectionSettings.setValue( QLatin1String( "Data/UnixPath" ), \
socketFile );  #endif
 
     // initialize the database
@@ -87,6 +106,12 @@
 
     new ServerAdaptor( this );
     QDBusConnection::sessionBus().registerObject( QLatin1String( "/Server" ), this \
); +
+    char* dbusAddress = getenv( "DBUS_SESSION_BUS_ADDRESS" );
+    if (dbusAddress != 0)
+    {
+      connectionSettings.setValue( QLatin1String( "DBUS/Address" ), QLatin1String( \
dbusAddress ) ); +    }
 }
 
 
@@ -114,9 +139,11 @@
       stopDatabaseProcess();
 
 #ifndef Q_OS_WIN
-    if ( !QDir::home().remove( QLatin1String(".akonadi/akonadiserver.socket") ) )
+    if ( !QDir::home().remove( QLatin1String( ".akonadi/akonadiserver.socket" ) ) )
         qWarning("Failed to remove Unix socket");
 #endif
+    if ( !QDir::home().remove( QLatin1String( ".akonadi/akonadiconnectionrc" ) ) )
+        qWarning("Failed to remove runtime connection config file");
 
     QTimer::singleShot( 0, this, SLOT( doQuit() ) );
 }


["signature.asc" (application/pgp-signature)]

_______________________________________________
KDE PIM mailing list kde-pim@kde.org
https://mail.kde.org/mailman/listinfo/kde-pim
KDE PIM home page at http://pim.kde.org/

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic