void TestXmlRpc::testInvoke() { const QByteArray xml( "<iq" " id=\"rpc1\"" " to=\"[email protected]/jrpc-server\"" " from=\"[email protected]/jrpc-client\"" " type=\"set\">" "<query xmlns=\"jabber:iq:rpc\">" "<methodCall>" "<methodName>examples.getStateName</methodName>" "<params>" "<param>" "<value><i4>6</i4></value>" "</param>" "</params>" "</methodCall>" "</query>" "</iq>"); QXmppRpcInvokeIq iq; parsePacket(iq, xml); QCOMPARE(iq.method(), QLatin1String("examples.getStateName")); QCOMPARE(iq.arguments(), QVariantList() << int(6)); serializePacket(iq, xml); }
void QXmppClient::invokeInterfaceMethod( const QXmppRpcInvokeIq &iq ) { QXmppStanza::Error error; const QStringList methodBits = iq.method().split('.'); if (methodBits.size() != 2) return; const QString interface = methodBits.first(); const QString method = methodBits.last(); QXmppInvokable *iface = d->interfaces.value(interface); if (iface) { if ( iface->isAuthorized( iq.from() ) ) { if ( iface->interfaces().contains(method) ) { QVariant result = iface->dispatch(method.toLatin1(), iq.arguments() ); QXmppRpcResponseIq resultIq; resultIq.setId(iq.id()); resultIq.setTo(iq.from()); resultIq.setFrom(d->stream->configuration().jid()); resultIq.setValues(QVariantList() << result); d->stream->sendPacket( resultIq ); return; } else { error.setType(QXmppStanza::Error::Cancel); error.setCondition(QXmppStanza::Error::ItemNotFound); } } else { error.setType(QXmppStanza::Error::Auth); error.setCondition(QXmppStanza::Error::Forbidden); } } else { error.setType(QXmppStanza::Error::Cancel); error.setCondition(QXmppStanza::Error::ItemNotFound); } QXmppRpcErrorIq errorIq; errorIq.setId(iq.id()); errorIq.setTo(iq.from()); errorIq.setFrom(d->stream->configuration().jid()); errorIq.setQuery( iq ); errorIq.setError( error ); d->stream->sendPacket( errorIq ); }