LINUX.ORG.RU

DBus, Qt


0

2

Как при вызове метода передать аргумент типа a{ss}, он же Q_Map_String_String?

QMap<QString,QString> args;

Чтобы не было

error: no matching function for call to 'QDBusMessage::setArguments(QMap<QString, QString>*)'

ну или

error: no matching function for call to 'QDBusInterface::call(const char [26], QMap<QString, QString>&)'

★★★★★

Ответ на: комментарий от yoghurt
QMap<QString,QString> args;
QDBusInterface iface("com.nokia.time", "/com/nokia/time", "com.nokia.time", QDBusConnection::systemBus());
QDBusMessage reply=iface.call("get_cookies_by_attributes", args);

Из консоли это выглядит и работает так:

$ dbus-send --system --type=method_call --print-reply --dest=com.nokia.time /com/nokia/time com.nokia.time.get_cookies_by_attributes dict:string:string:

Описание метода такое:

<method name="get_cookies_by_attributes">
      <arg name="words" type="a{ss}" direction="in"/>
      <annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="Q_Map_String_String"/>
      <arg name="res" type="au" direction="out"/>
      <annotation name="com.trolltech.QtDBus.QtTypeName.Out1" value="Q_List_uint"/>
</method>

vvn_black ★★★★★
() автор топика
Ответ на: комментарий от alex_custov

no way, a{sv} != a{ss}

QDBusMessage(type=Error, service="", error name="org.freedesktop.DBus.Error.UnknownMethod", error message="No such method 'get_cookies_by_attributes' in interface 'com.nokia.time' at object path '/com/nokia/time' (signature 'a{sv}')", signature="", contents=([]) ) 

vvn_black ★★★★★
() автор топика

По логике вещей setArguments принимает const QList<QVariant> &. Получается что нужно преобразовать QMap<QString, QString> в QVariant, после чего сложить его в QList.
Просто так у тебя этого не выйдет, ибо QVariant не поддерживает QMap<QString, QString>. Поддержку можно добавить с помощью Q_DECLARE_METATYPE. Хотя тогда мне не понятно как тогда setArguments будет работать с незнакомым ей типом. Но попробовать стоит.

ЗЫ: С DBus никогда не работал.

com
()
Ответ на: комментарий от com

Если верить сорцам:

	  void get_cookies_by_attributes(const Q_Map_String_String &words, const QDBusMessage &message, Q_List_uint &res)
	  {
	    log_notice("DBUS::com.nokia.time.get_cookies_by_attributes(...) by %s", PEER) ;
	    timed->am->get_cookies_by_attributes(words, res) ;
	  }
Там таки юзается QMap<QString, QString>, который известен за счет:
	typedef QMap<QString,QString> Q_Map_String_String ;
	// ...
	Q_DECLARE_METATYPE(Q_Map_String_String) ;

anonymous
()
Ответ на: комментарий от anonymous

Но с точки зрения MetaObject QMap<QString, QVariant> и QMap<QString, QString> - разные типы, не?

А постом выше ТС уже писал о том что a{sv} != a{ss}. Выходит, что если кормить функции QMap<QString, QVariant>, то результат становится отличным от нужного.

com
()
Ответ на: комментарий от com

Выходит, что если кормить функции QMap<QString, QVariant>, то результат становится отличным от нужного.

Для этого же есть какой-то QDBuxVariant

stack_protector
()
Ответ на: комментарий от anonymous

Хм, странно всё это... Но я думаю что если сделать Q_DECLARE_METATYPE(QMap<QString,QString>) внутри кода ТС, то внутренности Qt этот тип распарсят и всё будет замечательно.

com
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.