LINUX.ORG.RU

Как через DBus вызвать метод Unmount (IN a{sv} options)


0

2

a{sv} - это вроде как Dictionaries. А вот от sv у меня уже мозги в трубочку сворачиваются. Ну первое значение строка, а дальше variant что-ли? И как это оформить? Пробовал так:

dbus-send --system --dest=org.freedesktop.UDisks2 --type=method_call --print-reply /org/freedesktop/UDisks2/block_devices/sdd1 org.freedesktop.UDisks2.Filesystem.Unmount array:string:variant:"",""

И подругому по-всякому. Получаю ошибку типа:Type of message, `(as)', does not match expected type `(a{sv})'

Или же, что variant неизвестный тип.

sudo umount /dev/sdd1

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

Атлична! Т.е. с помощью dbus-send никак. Интересно, а авторам этого кошмарного поделия под названием DBus не икается каждые пять секунд. Жаль в гугле на это не найдется ответа.

Но вернемся к нашим баранам. Как тогда хотя бы представить структуру этого a{sv}? Что-то типа:

array
{
	string="",
	variant
	{
		string=""
	}
}

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

я тут еще немного за тебя погуглил,
a{sv} это std::map< std::string, ::DBus::Variant > в терминах плюсов.
как это в шеле представить, не имею понятия.

Да, программирование, связанное с дбасом - боль и страдания. Каждый день маюсь на работе.. ;)

aol ★★★★★
()
Ответ на: комментарий от AlexM

Точнее про qdbus подгляжу на работе днём. Точно помню, что уже дожёвывал до этого места;-)

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

Да, с qdbus тоже облом, хотя мне казалось, я это делал.

Значит, остаётся способ через простенький питон-скрипт ( tailgunner - так можно?), наподобие этого. Ключевое слово - dbus.Dictionary(<нужная сигнатура>) в аргументах вызова метода.

AlexM ★★★★★
()
Последнее исправление: AlexM (всего исправлений: 1)

Я пишу на Си. А dbus-send использую, чтобы. перед тем как писать код, разобраться, какое сообщение нужно составить. А с этим variant мало того, что сам черт ногу сломит, так еще и не понятно что туда слать, если реально никаких опций передавать не надо.

Вот, например, для метода Mount из документации UDisks2 можно почерпнуть:

IN a{sv} options: Options - known options (in addition to standard options) includes fstype (of type 's') and options (of type 's').

Выходит нужно сформировать массив, каждый элемент которого должен содержать пару string, variant. В string пихается либо «fstype», либо «options». Для variant в качестве сигнатуры определяем тип string, ну и собственно добавляем итератор, в котором и будет содержимое этой строки. Вроде бы все логично, попробую, когда доберусь до компа с UDisks2 (чтоб им гореть в аду).

Вопрос только остается в том, что никаких опций передавать мне не надо. То ли теперь во всех string передавать пустую строку, то ли нет.

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

никаких опций передавать мне не надо

а может надо передавать пусто массив?

anonymous
()

Ё моё. Я таки нашел, как это сделать. Но это такое иезуитство, что просто нет слов. Самое интересное, что по документации на libdbus я бы до такого вряд ли когда-нибудь допер бы. И еще больше удивляет, как это понял тот, кто выложил в Инет рабочий пример кода. Разве что это был один из авторов libdbus. Но тогда какого же черта этот пример не вставили в официальную доку?

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

Нет. Как выяснилось, из CLI отправить вещи типа a{sv} вообще нельзя. Хоть пустые, хоть полные.

Но и сделать это на СИ через libdbus тоже задачка нетривиальная. Но вот ссылочка с рабочим примером: http://raulherbster.blogspot.ru/2010/11/dbus-how-to-pass-dict-as-parameter.html

Если нужно отправить сообщение с пустыми входными аргументами, то просто после открытия соответствующего контейнера, его нужно сразу закрыть.

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

:-) Нуачо. Открыли контейнер, специфицировали его тип, закрыли контейнер. Уличная магия в действии ;) Впрочем, glib и производные - весь такой, с волками жить, что называется.

Натурально говорю: пускай за это болеют авторы биндингов :) В питоне да и в Qt/dbus весь этот ужас выглядит вполне приемлемо с эстетической точки зрения. Хотя, по-большому счёту - те же яйца, слегка присахаренные.

AlexM ★★★★★
()
Последнее исправление: AlexM (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.