libmaia: XML-RPC with Qt4
So, now that my exams are all done I finally found some time to put up a library you might find useful.
Two semesters ago Karl Glatz and I both needed a XML-RPC library for Trolltechs Qt 4.

We first looked around what was already there:
- QuteXR: a very good lib implementing the server and client side. Sadly only Qt 3. Has many features and so wasn’t easy to port over to Qt4 in the short time we had for our Projects.
- KRPC: only implements the client side. But we could use some code here.
- QxtXmlRpc: I found out about this one only recently. And also only implements the client.
So we had to create something new. Luckily we were able to use some code from KRPC and had some inspiration from QuteXR.
To demonstrate how easy it is to use libmaia: two examples.
Let’s create a Server first using these simple lines of code:
QLineEdit *sometext = new QLineEdit(this);
MaiaXmlRpcServer *server = new MaiaXmlRpcServer(8080, this);
server->addMethod("examples.displaytext", sometext, "setText");
First we create a QLineEdit for demonstration purpose.
Then we start the XmlRpc Server on port 8080.
In line 3 we register the Method “examples.displaytext” to the QLineEdits slot “setText”.
You can now remotely call “examples.displaytext” with a String as parameter and change the content of your LineEdit.
Now create a client:
MaiaXmlRpcClient *rpc = new MaiaXmlRpcClient(QUrl("http://localhost:8080/RPC2"), this);
rpc->call("examples.displaytext", QDateTime::currentDateTime().toString("hh:mm:ss"),
this, SLOT(testResponse(QVariant &)),
this, SLOT(testFault(int, const QString &)));
Here we create the client object by passing the server URL to the constructor.
Calling a Method is as easy as passing its name, the arguments and two slots to the “call” method.
The first of the two slots is used to handle the response, the second can be used to catch errors.
Looks easy to get started with? Right, so checkout directly from subversion here:
svn co https://svn.frubar.net/svn/libmaia/trunk/
You’ll also find further examples there.
Have fun with it
April 24th, 2008 at 10:33 am
The lib is really nice, thx a lot.
but in the spec of xmlrpc the date is not so formated, like qt does!
in libMaia - maiaObject.cpp
} case QVariant::DateTime: {
// QString textValue = arg.toDateTime().toString(Qt::ISODate);
QString textValue = arg.toDateTime().toString(”yyyyMMddThh:mm:ss”);
Best regards
dz
April 25th, 2008 at 1:12 am
Oh, thanks, i’ll fix it
April 25th, 2008 at 2:28 pm
Wie ist es am sinnvollsten mehrere call nacheinander zu machen. zB login -> abfrage -> logout. ohne über die response Funktion das nächste zu triggern. zu ne Art Queue?
dz
May 21st, 2008 at 12:58 am
Hmmm Login->Abfrage->Logout ist glaube ich vom Prinzip her ungeschickt. Besser wäre dafür HTTP Auth zu verwenden (das kann libmaia noch nicht).
Verkettete Calls könnte man aber an sich schon von einer Klasse managen lassen, welche die in einer Queue abarbeitet. Von der Response sollte das ja dann aber trotzdem getriggert werden, sonst braucht man ja keine Queue.
Die Queue Klasse kann auch alle Responses auf einen Slot connecten um dann weiter zu schalten, das ist ja kein Problem.
Falls du so etwas wo implementierst oder Lust hast HTTP Auth für libmaia zu basteln … fände ich interessant
May 23rd, 2008 at 9:22 pm
Thanks for sharing the lib!
Do you plan to publish it somewhere in e.g. code.google.com or any other project tracker?
August 27th, 2008 at 1:53 pm
Nochmal Kompliment, nette lib.
Wenn du libmaia unter lgpl bei sourceforge hostest, wurde ich mich “HTTP Auth” und https annehmen.
September 26th, 2008 at 2:05 pm
Thanks for your work! Great lib! But it has small memory leak. To fix it, edit maiaXmlRpcServerConnection.cpp file to be like
…
MaiaXmlRpcServerConnection::~MaiaXmlRpcServerConnection() {
clientConnection->deleteLater();
delete header; //
September 26th, 2008 at 7:28 pm
thanks, fix committed
November 24th, 2008 at 1:08 am
[…] this we found a nice library: libmaia. Beside a small bug I found (which reminds me I have to report it upstream). This works very well. […]
December 23rd, 2008 at 11:56 pm
I noticed a small error.
You put true/false between the tags. However according to the specs this should just be 0/1
Other than that this is a great lib
March 2nd, 2009 at 10:41 am
Hi wiedi,
you get a good feedback from everywhere. If the library would be LGPL licensed it would be fantastic. ..
March 8th, 2009 at 10:35 pm
@rullrer: thanks for reporting, you’re right. Will fix that soon.
Nice to see it getting integrated into a great project like QtMPC
@dz: I can give you the permission to use it under the LGPL, except for the maiaObject.cpp/.h files.
I think you already tried to contact the original authors - as did I - and did not get any response. :/
So you can either rewrite that part from scratch or use it under the current BSD-style license.
I also have some patches here around for SSL and HTTP-Auth support that I’ll merge when I find the time
March 12th, 2009 at 9:55 am
Hi wiedi,
really nice lib, but this comment is not new for you
I modified the following code in the MaiaXmlRpcClient file in the call function :
QHttpRequestHeader header(”GET”, m_url.toEncoded());
In this case, we can call web service by adding some URL parameters sent by GET. I used your lib with a php server web service. Maybe it could be interesting to have the flexibility to set the method and to add post or get parameter.
thanks again
November 27th, 2009 at 10:00 am
Thanks for the lib!
Just a minor comment though: performance of the lib seems rather slow if there are multiple consecutive calls to the same server. Testing with perl for the same series of calls has a rapid response. In general, with this lib it appears that it seems to wait between 20 and 30 seconds between each call to the same server.
Is this deliberate behaviour, or is there a parameter that can be passed to decrease what appears to be a timeout limit?
Thanks,
L.
December 4th, 2009 at 9:26 am
Just another note.. our XMLRPC responses include some text in UTF-8 encoding from the server (server is not based on libmaia). However, rendering the text on the client side using libmaia has a character encoding issue and cannot be displayed properly.