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

List:       kde-commits
Subject:    Re: [kdelibs/nepomuk/DmsPort] nepomuk: Properly marshall the urls
From:       Sebastian TrĂ¼g <trueg () kde ! org>
Date:       2012-01-02 9:06:43
Message-ID: 4F0173A3.50001 () kde ! org
[Download RAW message or body]

why do we need this? Isn't this handled inside the DMS lib already?

On 12/26/2011 08:49 PM, Vishesh Handa wrote:
> Git commit 3e602f2ed9e114b3a831f2dcba01237eb8f478d8 by Vishesh Handa.
> Committed on 26/12/2011 at 20:48.
> Pushed by vhanda into branch 'nepomuk/DmsPort'.
> 
> Properly marshall the urls into strings
> 
> Copied dbustypes.* from kde-runtime/nepomuk/services/storage/lib/dbustypes.*
> 
> M  +1    -0    nepomuk/CMakeLists.txt
> A  +136  -0    nepomuk/core/dbustypes.cpp     [License: LGPL]
> A  +59   -0    nepomuk/core/dbustypes.h     [License: LGPL]
> M  +7    -10   nepomuk/core/resourcedata.cpp
> M  +3    -0    nepomuk/core/resourcemanager.cpp
> 
> http://commits.kde.org/kdelibs/3e602f2ed9e114b3a831f2dcba01237eb8f478d8
> 
> diff --git a/nepomuk/CMakeLists.txt b/nepomuk/CMakeLists.txt
> index bd0104e..3319b9d 100644
> --- a/nepomuk/CMakeLists.txt
> +++ b/nepomuk/CMakeLists.txt
> @@ -36,6 +36,7 @@ set(nepomuk_core_SRCS
> core/file.cpp
> core/tag.cpp
> core/nepomukservice.cpp
> +  core/dbustypes.cpp
> )
> 
> if(NOT KDE_NO_DEPRECATED)
> diff --git a/nepomuk/core/dbustypes.cpp b/nepomuk/core/dbustypes.cpp
> new file mode 100644
> index 0000000..761ded2
> --- /dev/null
> +++ b/nepomuk/core/dbustypes.cpp
> @@ -0,0 +1,136 @@
> +/*
> +   This file is part of the Nepomuk KDE project.
> +   Copyright (C) 2011 Sebastian Trueg <trueg@kde.org>
> +
> +   This library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) version 3, or any
> +   later version accepted by the membership of KDE e.V. (or its
> +   successor approved by the membership of KDE e.V.), which shall
> +   act as a proxy defined in Section 6 of version 3 of the license.
> +
> +   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
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with this library.  If not, see <http://www.gnu.org/licenses/>.
> +*/
> +
> +#include "dbustypes.h"
> +
> +#include <QtCore/QStringList>
> +#include <QtCore/QDate>
> +#include <QtCore/QTime>
> +#include <QtCore/QDateTime>
> +#include <QtDBus/QDBusMetaType>
> +
> +#include "kurl.h"
> +#include "kdebug.h"
> +
> +QString Nepomuk::DBus::convertUri(const QUrl& uri)
> +{
> +    return KUrl(uri).url();
> +}
> +
> +QStringList Nepomuk::DBus::convertUriList(const QList<QUrl>& uris)
> +{
> +    QStringList uriStrings;
> +    foreach(const QUrl& uri, uris)
> +        uriStrings << convertUri(uri);
> +    return uriStrings;
> +}
> +
> +QVariantList Nepomuk::DBus::normalizeVariantList(const QVariantList& l)
> +{
> +    QVariantList newL;
> +    QListIterator<QVariant> it(l);
> +    while(it.hasNext()) {
> +        QVariant v = it.next();
> +        if(v.userType() == qMetaTypeId<KUrl>()) {
> +            newL.append(QVariant(QUrl(v.value<KUrl>())));
> +        }
> +        else {
> +            newL.append(v);
> +        }
> +    }
> +    return newL;
> +}
> +
> +QVariant Nepomuk::DBus::resolveDBusArguments(const QVariant& v)
> +{
> +    //
> +    // trueg: QDBus does not automatically convert non-basic types but gives us a \
> QDBusArgument in a QVariant. +    // Thus, we need to handle QUrl, QTime, QDate, \
> and QDateTime as a special cases here. They is the only complex types we support. + \
> // +    if(v.userType() == qMetaTypeId<QDBusArgument>()) {
> +        const QDBusArgument arg = v.value<QDBusArgument>();
> +
> +        QVariant v;
> +        if(arg.currentSignature() == QLatin1String("(s)")) {
> +            QUrl url;
> +            arg >> url;
> +            return url;
> +        }
> +        else if(arg.currentSignature() == QLatin1String("(iii)")) {
> +            QDate date;
> +            arg >> date;
> +            return date;
> +        }
> +        else if(arg.currentSignature() == QLatin1String("(iiii)")) {
> +            QTime time;
> +            arg >> time;
> +            return time;
> +        }
> +        else if(arg.currentSignature() == QLatin1String("((iii)(iiii)i)")) {
> +            QDateTime dt;
> +            arg >> dt;
> +            return dt;
> +        }
> +        else {
> +            kDebug() << "Unknown type signature in property hash value:" << \
> arg.currentSignature(); +            return QVariant();
> +        }
> +    }
> +    else {
> +        return v;
> +    }
> +}
> +
> +QVariantList Nepomuk::DBus::resolveDBusArguments(const QVariantList& l)
> +{
> +    QVariantList newL;
> +    QListIterator<QVariant> it(l);
> +    while(it.hasNext()) {
> +        newL.append(resolveDBusArguments(it.next()));
> +    }
> +    return newL;
> +}
> +
> +void Nepomuk::DBus::registerDBusTypes()
> +{
> +    // we need QUrl to be able to pass it in a QVariant
> +    qDBusRegisterMetaType<QUrl>();
> +}
> +
> +// We need the QUrl serialization to be able to pass URIs in variants
> +QDBusArgument& operator<<( QDBusArgument& arg, const QUrl& url )
> +{
> +    arg.beginStructure();
> +    arg << QString::fromAscii(url.toEncoded());
> +    arg.endStructure();
> +    return arg;
> +}
> +
> +// We need the QUrl serialization to be able to pass URIs in variants
> +const QDBusArgument& operator>>( const QDBusArgument& arg, QUrl& url )
> +{
> +    arg.beginStructure();
> +    QString uriString;
> +    arg >> uriString;
> +    url = QUrl::fromEncoded(uriString.toAscii());
> +    arg.endStructure();
> +    return arg;
> +}
> diff --git a/nepomuk/core/dbustypes.h b/nepomuk/core/dbustypes.h
> new file mode 100644
> index 0000000..4a66a20
> --- /dev/null
> +++ b/nepomuk/core/dbustypes.h
> @@ -0,0 +1,59 @@
> +/*
> +   This file is part of the Nepomuk KDE project.
> +   Copyright (C) 2011 Sebastian Trueg <trueg@kde.org>
> +
> +   This library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) version 3, or any
> +   later version accepted by the membership of KDE e.V. (or its
> +   successor approved by the membership of KDE e.V.), which shall
> +   act as a proxy defined in Section 6 of version 3 of the license.
> +
> +   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
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with this library.  If not, see <http://www.gnu.org/licenses/>.
> +*/
> +
> +#ifndef DBUSTYPES_H
> +#define DBUSTYPES_H
> +
> +#include <QtCore/QMetaType>
> +#include <QtCore/QHash>
> +#include <QtCore/QString>
> +#include <QtCore/QUrl>
> +#include <QtDBus/QDBusVariant>
> +#include <QtDBus/QDBusArgument>
> +
> +// #include "simpleresource.h"
> +// #include "nepomukdatamanagement_export.h"
> +#include "nepomuk_export.h"
> +
> +//CAUTION: Q_DECLARE_METATYPE doesn't accept template arguments like QHash<T, T>
> +typedef QHash<QString, QString> __nepomuk_QHashQStringQString;
> +Q_DECLARE_METATYPE( __nepomuk_QHashQStringQString )
> +
> +namespace Nepomuk {
> +    namespace DBus {
> +        QString NEPOMUK_EXPORT convertUri(const QUrl& uri);
> +        QStringList NEPOMUK_EXPORT convertUriList(const QList<QUrl>& uris);
> +
> +        /// Convert QDBusArguments variants into QUrl, QDate, QTime, and QDateTime \
> variants +        NEPOMUK_EXPORT QVariant resolveDBusArguments(const QVariant& v);
> +        NEPOMUK_EXPORT QVariantList resolveDBusArguments(const QVariantList& l);
> +
> +        /// Replaces KUrl with QUrl for DBus marshalling.
> +        QVariantList normalizeVariantList(const QVariantList& l);
> +
> +        NEPOMUK_EXPORT void registerDBusTypes();
> +    }
> +}
> +
> +QDBusArgument& operator<<( QDBusArgument& arg, const QUrl& url );
> +const QDBusArgument& operator>>( const QDBusArgument& arg, QUrl& url );
> +
> +#endif // DBUSTYPES_H
> diff --git a/nepomuk/core/resourcedata.cpp b/nepomuk/core/resourcedata.cpp
> index 023a6b9..1b516b9 100644
> --- a/nepomuk/core/resourcedata.cpp
> +++ b/nepomuk/core/resourcedata.cpp
> @@ -30,6 +30,7 @@
> #include "nepomukmainmodel.h"
> #include "dbusconnectionpool.h"
> #include "class.h"
> +#include "dbustypes.h"
> 
> #include <Soprano/Statement>
> #include <Soprano/StatementIterator>
> @@ -266,13 +267,10 @@ bool Nepomuk::ResourceData::store()
> QLatin1String("org.kde.nepomuk.DataManagement"),
> QLatin1String("createResource") );
> QString app = KGlobal::mainComponent().componentName();
> -        QStringList types;
> -        foreach( const QUrl &type, m_types )
> -            types << type.toString();
> -
> QVariantList arguments;
> +
> //FIXME: Maybe we should be setting the 'label' over here.
> -        arguments << types << QString() << QString() << app;
> +        arguments << DBus::convertUriList(m_types) << QString() << QString() << \
> app; msg.setArguments( arguments );
> 
> QDBusMessage reply = bus.call( msg );
> @@ -442,13 +440,12 @@ void Nepomuk::ResourceData::setProperty( const QUrl& uri, \
> const Nepomuk::Variant QLatin1String("setProperty") );
> QString app = KGlobal::mainComponent().componentName();
> QVariantList arguments;
> -        QStringList resources;
> -        resources << m_uri.url();
> QVariantList varList;
> foreach( const Nepomuk::Variant var, value.toVariantList() )
> varList << var.variant();
> 
> -        arguments << resources << uri.toString() << QVariant(varList) << app;
> +        arguments << DBus::convertUriList(QList<QUrl>() << m_uri) << \
> DBus::convertUri(uri) +                  << \
> QVariant(DBus::normalizeVariantList(varList)) << app; msg.setArguments( arguments \
> ); 
> QDBusMessage reply = bus.call( msg );
> @@ -483,7 +480,7 @@ void Nepomuk::ResourceData::removeProperty( const QUrl& uri )
> QLatin1String("removeProperties") );
> QString app = KGlobal::mainComponent().componentName();
> QVariantList arguments;
> -        arguments << m_uri.url() << uri.toString() << app;
> +        arguments << DBus::convertUri(m_uri) << DBus::convertUri(uri) << app;
> msg.setArguments( arguments );
> 
> QDBusMessage reply = bus.call( msg );
> @@ -516,7 +513,7 @@ void Nepomuk::ResourceData::remove( bool recursive )
> QString app = KGlobal::mainComponent().componentName();
> QVariantList arguments;
> // TODO: Set the flag over here
> -        arguments << m_uri.url() << 0 << app;
> +        arguments << DBus::convertUri(m_uri) << 0 << app;
> msg.setArguments( arguments );
> 
> QDBusMessage reply = bus.call( msg );
> diff --git a/nepomuk/core/resourcemanager.cpp b/nepomuk/core/resourcemanager.cpp
> index e8ce31d..e3ed0bd 100644
> --- a/nepomuk/core/resourcemanager.cpp
> +++ b/nepomuk/core/resourcemanager.cpp
> @@ -27,6 +27,7 @@
> #include "resource.h"
> #include "class.h"
> #include "nie.h"
> +#include "dbustypes.h"
> 
> #include <kglobal.h>
> #include <kdebug.h>
> @@ -47,6 +48,7 @@
> #include <QtDBus/QDBusConnection>
> #include <QtDBus/QDBusConnectionInterface>
> #include <QtDBus/QDBusServiceWatcher>
> +#include <QtDBus/QDBusMetaType>
> 
> using namespace Soprano;
> 
> @@ -59,6 +61,7 @@ Nepomuk::ResourceManagerPrivate::ResourceManagerPrivate( \
> ResourceManager* manage dataCnt( 0 ),
> m_manager( manager )
> {
> +    Nepomuk::DBus::registerDBusTypes();
> }
> 
> 
> 


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

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