summaryrefslogtreecommitdiff
path: root/decorators/libdecorator/mrmiserver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'decorators/libdecorator/mrmiserver.cpp')
-rw-r--r--decorators/libdecorator/mrmiserver.cpp318
1 files changed, 318 insertions, 0 deletions
diff --git a/decorators/libdecorator/mrmiserver.cpp b/decorators/libdecorator/mrmiserver.cpp
new file mode 100644
index 0000000..af830a4
--- /dev/null
+++ b/decorators/libdecorator/mrmiserver.cpp
@@ -0,0 +1,318 @@
+/***************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (directui@nokia.com)
+**
+** This file is part of duicompositor.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at directui@nokia.com.
+**
+** This library is free software; you can redistribute it and/or
+** modify it under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation
+** and appearing in the file LICENSE.LGPL included in the packaging
+** of this file.
+**
+****************************************************************************/
+#include "mrmiserver.h"
+#include "mrmiserver_p.h"
+
+#include <QLocalSocket>
+#include <QDataStream>
+#include <QMetaObject>
+#include <QGenericArgument>
+#include <QFile>
+#include <QTextStream>
+#include <MDebug>
+
+QGenericArgument unmarshall(const char*name, const void* data)
+{
+ return QGenericArgument(name, data);
+}
+
+MRmiServerPrivate::MRmiServerPrivate(const QString& key)
+ : _key(key), _obj(0)
+{
+}
+
+MRmiServerPrivate::~MRmiServerPrivate()
+{
+}
+
+void MRmiServerPrivate::exportObject(QObject* p)
+{
+ _obj = p;
+}
+
+// TODO object selection from multiple sources
+QObject* MRmiServerPrivate::currentObject()
+{
+ return _obj;
+}
+
+QString MRmiServerPrivate::key() const
+{
+ return _key;
+}
+
+MRmiServerPrivateSocket::MRmiServerPrivateSocket(const QString& key)
+ : MRmiServerPrivate(key), method_size(0)
+{
+}
+
+void MRmiServerPrivateSocket::exportObject(QObject* p)
+{
+ Q_Q(MRmiServer);
+ MRmiServerPrivate::exportObject(p);
+
+ q->connect(&_serv, SIGNAL(newConnection()), q, SLOT(_q_incoming()));
+
+ if (QFile::exists("/tmp/" + key()))
+ QFile::remove("/tmp/" + key());
+
+ if (!_serv.listen(key()))
+ mDebug("MRmiServerPrivateSocket") << "system error, can't listen to local socket";
+}
+
+void MRmiServerPrivateSocket::_q_incoming()
+{
+ Q_Q(MRmiServer);
+ QLocalSocket* s = _serv.nextPendingConnection();
+ q->connect(s, SIGNAL(disconnected()), s, SLOT(deleteLater()));
+ if (!s)
+ return;
+ _sock = s;
+ q->connect(_sock, SIGNAL(readyRead()), q, SLOT(_q_readData()));
+}
+
+void MRmiServerPrivateSocket::_q_readData()
+{
+ uint sz = _sock->bytesAvailable();
+
+ QDataStream stream(_sock);
+ stream.setVersion(QDataStream::Qt_4_0);
+
+ if (method_size == 0) {
+ if (sz < (int)sizeof(quint16))
+ return;
+ stream >> method_size;
+ }
+
+ if (sz < method_size)
+ return;
+
+ invoke(stream);
+}
+
+void MRmiServerPrivateSocket::invoke(QDataStream& stream)
+{
+ char* className = 0;
+ char* methodName = 0;
+ quint16 arglength = 0;
+
+ QVariant arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9;
+
+ stream >> arglength >> className >> methodName;
+ switch (arglength) {
+ case 0:
+ QMetaObject::invokeMethod(currentObject(),
+ methodName);
+ break;
+ case 1:
+ stream >> arg0;
+ QMetaObject::invokeMethod(currentObject(),
+ methodName,
+ unmarshall(arg0.typeName(),
+ arg0.data()));
+
+ break;
+ case 2:
+ stream >> arg0 >> arg1;
+ QMetaObject::invokeMethod(currentObject(),
+ methodName,
+ unmarshall(arg0.typeName(),
+ arg0.data()),
+ unmarshall(arg1.typeName(),
+ arg1.data()));
+ break;
+ case 3:
+ stream >> arg0 >> arg1 >> arg2;
+ QMetaObject::invokeMethod(currentObject(),
+ methodName,
+ unmarshall(arg0.typeName(),
+ arg0.data()),
+ unmarshall(arg1.typeName(),
+ arg1.data()),
+ unmarshall(arg2.typeName(),
+ arg2.data()));
+ break;
+ case 4:
+ stream >> arg0 >> arg1 >> arg2 >> arg3;
+ QMetaObject::invokeMethod(currentObject(),
+ methodName,
+ unmarshall(arg0.typeName(),
+ arg0.data()),
+ unmarshall(arg1.typeName(),
+ arg1.data()),
+ unmarshall(arg2.typeName(),
+ arg2.data()),
+ unmarshall(arg3.typeName(),
+ arg3.data()));
+ break;
+ case 5:
+ stream >> arg0 >> arg1 >> arg2 >> arg3 >> arg4;
+ QMetaObject::invokeMethod(currentObject(),
+ methodName,
+ unmarshall(arg0.typeName(),
+ arg0.data()),
+ unmarshall(arg1.typeName(),
+ arg1.data()),
+ unmarshall(arg2.typeName(),
+ arg2.data()),
+ unmarshall(arg3.typeName(),
+ arg3.data()),
+ unmarshall(arg4.typeName(),
+ arg4.data()));
+ break;
+ case 6:
+ stream >> arg0 >> arg1 >> arg2 >> arg3 >> arg4 >> arg5;
+ QMetaObject::invokeMethod(currentObject(),
+ methodName,
+ unmarshall(arg0.typeName(),
+ arg0.data()),
+ unmarshall(arg1.typeName(),
+ arg1.data()),
+ unmarshall(arg2.typeName(),
+ arg2.data()),
+ unmarshall(arg3.typeName(),
+ arg3.data()),
+ unmarshall(arg4.typeName(),
+ arg4.data()),
+ unmarshall(arg5.typeName(),
+ arg5.data()));
+ break;
+ case 7:
+ stream >> arg0 >> arg1 >> arg2 >> arg3 >> arg4 >> arg5 >> arg6;
+ QMetaObject::invokeMethod(currentObject(),
+ methodName,
+ unmarshall(arg0.typeName(),
+ arg0.data()),
+ unmarshall(arg1.typeName(),
+ arg1.data()),
+ unmarshall(arg2.typeName(),
+ arg2.data()),
+ unmarshall(arg3.typeName(),
+ arg3.data()),
+ unmarshall(arg4.typeName(),
+ arg4.data()),
+ unmarshall(arg5.typeName(),
+ arg5.data()),
+ unmarshall(arg6.typeName(),
+ arg6.data()));
+ break;
+ case 8:
+ stream >> arg0 >> arg1 >> arg2 >> arg3 >> arg4 >> arg5 >> arg6 >> arg7;
+ QMetaObject::invokeMethod(currentObject(),
+ methodName,
+ unmarshall(arg0.typeName(),
+ arg0.data()),
+ unmarshall(arg1.typeName(),
+ arg1.data()),
+ unmarshall(arg2.typeName(),
+ arg2.data()),
+ unmarshall(arg3.typeName(),
+ arg3.data()),
+ unmarshall(arg4.typeName(),
+ arg4.data()),
+ unmarshall(arg5.typeName(),
+ arg5.data()),
+ unmarshall(arg6.typeName(),
+ arg6.data()),
+ unmarshall(arg7.typeName(),
+ arg7.data()));
+ break;
+ case 9:
+ stream >> arg0 >> arg1 >> arg2 >> arg3 >> arg4 >> arg5 >> arg6 >> arg7
+ >> arg8;
+ QMetaObject::invokeMethod(currentObject(),
+ methodName,
+ unmarshall(arg0.typeName(),
+ arg0.data()),
+ unmarshall(arg1.typeName(),
+ arg1.data()),
+ unmarshall(arg2.typeName(),
+ arg2.data()),
+ unmarshall(arg3.typeName(),
+ arg3.data()),
+ unmarshall(arg4.typeName(),
+ arg4.data()),
+ unmarshall(arg5.typeName(),
+ arg5.data()),
+ unmarshall(arg6.typeName(),
+ arg6.data()),
+ unmarshall(arg7.typeName(),
+ arg7.data()),
+ unmarshall(arg8.typeName(),
+ arg8.data()));
+ break;
+ case 10:
+ stream >> arg0 >> arg1 >> arg2 >> arg3 >> arg4 >> arg5 >> arg6 >> arg7
+ >> arg8 >> arg9;
+ QMetaObject::invokeMethod(currentObject(),
+ methodName,
+ unmarshall(arg0.typeName(),
+ arg0.data()),
+ unmarshall(arg1.typeName(),
+ arg1.data()),
+ unmarshall(arg2.typeName(),
+ arg2.data()),
+ unmarshall(arg3.typeName(),
+ arg3.data()),
+ unmarshall(arg4.typeName(),
+ arg4.data()),
+ unmarshall(arg5.typeName(),
+ arg5.data()),
+ unmarshall(arg6.typeName(),
+ arg6.data()),
+ unmarshall(arg7.typeName(),
+ arg7.data()),
+ unmarshall(arg8.typeName(),
+ arg8.data()),
+ unmarshall(arg9.typeName(),
+ arg9.data()));
+ break;
+ default:
+ break;
+
+ }
+
+ delete[] className;
+ delete[] methodName;
+ method_size = 0;
+}
+
+
+MRmiServer::MRmiServer(const QString& key, QObject* p)
+ : QObject(p),
+ d_ptr(new MRmiServerPrivateSocket(key))
+{
+ d_ptr->q_ptr = this;
+}
+
+
+MRmiServer::~MRmiServer()
+{
+ delete d_ptr;
+}
+
+
+void MRmiServer::exportObject(QObject* obj)
+{
+ Q_D(MRmiServer);
+ d->exportObject(obj);
+}
+
+#include "moc_mrmiserver.cpp"
+