anonymous@RULINUX.NET~# Last login: 2024-11-23 00:35:02
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

Быдлокодерство, Qt, D-Bus, UDisks2 и ненависть

Настиг меня экзистенциальный кризис. Вместо того, чтобы выпить, я решил кое-что написать. По определённым причинам написать то, что хотел, не получилось, потому я пошел писать другое. И кончилось всё на работе с UDisks2 через D-Bus в приложении на Qt.

Так как на цпп я не писал уже очень давно, всё началось с беглого просмотра книжки Страуструпа и туториала по Qt. Ну да ладно, с кем не бывает. В общем, набросал что-то, вот небольшой кривой кусок (кривой - потому что это прототип, который переписывается раз в 10 минут, а не реальный код):

cpp-qt
QTextStream out(stdout);
QDBusInterface *interface = new QDBusInterface("org.freedesktop.UDisks2", "/org/freedesktop/UDisks2", "org.freedesktop.DBus.ObjectManager", bus, this);

QDBusPendingReply<DBusManagerStruct> reply = interface->asyncCall("GetManagedObjects");
reply.waitForFinished();

out << "reply finished" << endl;
if (reply.isError())  { qDebug() << "Error: " << reply.error(); exit(0); }
out << "It works!" << endl;

DBusManagerStruct items = reply.value();
DBusManagerStruct::const_iterator i = items.constBegin();
while (i != items.constEnd())
  {
    QString path = i.key().path();
    if (path.startsWith("/org/freedesktop/UDisks2/block_devices/"))
      {
        QDBusInterface *fsInterface = new QDBusInterface("org.freedesktop.UDisks2", path, "org.freedesktop.UDisks2.Filesystem", bus, this);
        // А тут херня, которую тыкал уже наугад      
        ByteArrayList points = qvariant_cast< ByteArrayList > (fsInterface->property("MountPoints"));
      }
      ++i;
  }
 


После кучи возни с регистрацией типов (не показана) вроде DBusManagerStruct и прочего (спасибо исходникам какой-то программы в интернете), эта штука хотя бы смогла запросить по дбасу список устройств. И нужно было получить MountPoints. Но тут вылезло вот такое:

QDBusAbstractInterface: type QDBusRawType<0x616179>* must be registered with QtDBus before it can be used to read property org.freedesktop.UDisks2.Filesystem.MountPoints


Окей, сейчас зарегистрирую тип через qDBusRegisterMetaType и пойду дальше. Стоп, а что это за хрень вообще? Какой такой QDBusRawType? Что мне регистрировать? Как получить byte array, ведь MountPoints возвращается именно в таком виде, я проверял и в документации, и в мелкой программке на питоне. Ладно, пойдём почитаем умных людей, я-то быдлокодер, особенно на цпп. Расчехляем гугл. Ну есть туториал от КДЕ, которому я следую, и ещё какие-то блоги. Ну да ладно, не первый день в интернете.

В общем, находим такую дискуссию. Что мы видим оттуда, кроме немножко распухшего ЧСВ товарища Macieira? Да вот что:

The problem is that you cannot register this type (it has an ugly and impossible name). Please file a feature request in http://bugreports.qt.nokia.com to have QtDBus handle more gracefully complex properties.


Идём смотреть дальше, и видим баг, висящий с 2011-го года. И тишина. Ну естественно, эт вам не QML на js впиливать, это же не модно совсем.

Хорошо хоть добрый человек в дискуссии выложил свой обходной метод. Но каков метод! Эдак мне, чтобы получить одну сложную структуру по дбасу, надо писать вот такую простыню и закатывать солнце вручную? А если две структуры, ведь мне как раз надо будет доставать ещё кое-что? И это высокоуровневый тулкит, облегчающий работу? И это удобный дбас, являющийся стандартом на линуксовом десктопе? Да они там охренели все.

Пойду пробовать gtkmm и glibmm, хоть гтк и скатывается, но может там всё повеселее.

SystemV(*) (2013-01-19 18:34:56)

Emacs-w3m/1.4.508 w3m/0.5.3

[Ответить на это сообщение]
[#] [Добавить метку] [Редактировать] Ответ на: Быдлокодерство, Qt, D-Bus, UDisks2 и ненависть от SystemV 2013-01-19 18:34:56
avatar
Скрыть

Re:Быдлокодерство, Qt, D-Bus, UDisks2 и ненависть

Используй lua - это будет православней.

anonymous(*)(2013-01-19 20:22:48)

Mozilla/6.0 (compatible; AppleWebKit/latest; like Gecko/20120405; };-> infernal_edition:goto-hell) Firefox/666
[#] [Добавить метку] [Редактировать] Ответ на: Быдлокодерство, Qt, D-Bus, UDisks2 и ненависть от SystemV 2013-01-19 18:34:56
avatar
Скрыть

Re:Быдлокодерство, Qt, D-Bus, UDisks2 и ненависть

Очевидно, последний годный фреймворк поражён раком. Так что сдохнет скоро, я считаю.

Silvy(*)(2013-01-19 20:33:46)

Mozilla/5.0 (X11; Linux i686; rv:10.0.11) Gecko/20100101 Firefox/10.0.11
[#] [Добавить метку] [Редактировать] Ответ на: Быдлокодерство, Qt, D-Bus, UDisks2 и ненависть от SystemV 2013-01-19 18:34:56
avatar
Скрыть

Re:Быдлокодерство, Qt, D-Bus, UDisks2 и ненависть

>Пойду пробовать gtkmm и glibmm
Попробовал. Ну что сказать. Сам gtkmm мне понравился, у него хорошая документация и приятный на вид API. Почти нет самодельных велосипедов, авторы рекомендуют пользоваться STL-ем, и вся библиотека рассчитана на работу с ним. Нету и аналога moc-а, и сигналы тоже реализованы на цпп. В общем, приятная штука.

Ну а glibmm... на вид тоже ничего, пока не столкнёшься с дбасом. Хотя может это дбас такой? В общем, добиться нормальной работы даже с результатом вызова GetManagedObjects у меня не вышло - вечно какие-то проблемы с типами. Либо я делаю как надо, и glib ругается на то, что у него тип gvariant-а не тот (например так: GLib-CRITICAL **: the GVariant format string `a{sa{sa{sv}}}' has a type of `a{sa{sa{sv}}}' but the given value has a type of `{oa{sa{sv}}}'), либо я вручную силой пытаюсь соблюсти тип, но оно не компилируется. В общем, либо у меня кривые руки (скорее всего), либо у них что-то не то (таки кто-то сталкивался с подобным). А ещё у них дбасовский тип "o" и "s" должны быть одинаковыми, а варнинг всё равно выскакивает, бред какой-то. Плюс полное отсутствие документации на работу с дбасом и glibmm, только справочник по API и пара куцых примеров.

Ну его, в общем.

SystemV(*)(2013-01-20 04:47:50)

Emacs-w3m/1.4.508 w3m/0.5.3
avatar
  • матерные выражения
Скрыть

Re:Быдлокодерство, Qt, D-Bus, UDisks2 и ненависть

На хрена оно тебе, ебани путинки и в прорубь. Так, сейчас, согласно статистики 70% населения этой страны делает, если смотреть гос. каналы.

anonymous(*)(2013-01-20 06:32:12)

Mozilla/5.0 (X11; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0
[#] [Добавить метку] [Редактировать] Ответ на: Быдлокодерство, Qt, D-Bus, UDisks2 и ненависть от SystemV 2013-01-19 18:34:56
avatar
Скрыть

Re:Быдлокодерство, Qt, D-Bus, UDisks2 и ненависть

>Что мне регистрировать? Как получить byte array, ведь MountPoints возвращается именно в таком виде, я проверял и в документации, и в мелкой программке на питоне.
Откуда Qt должна узнать, как это все надо маршаллить?

Вот только сейчас посмотрел qdbusviewer. Он просто показывает 4 числа - не знает как маршаллить. Вот вывод qdbus

bash
$ qdbus --system org.freedesktop.UDisks2 /org/freedesktop/UDisks2/block_devices/sda1 org.freedesktop.UDisks2.Filesystem.MountPoints
qdbus: I don't know how to display an argument of type 'aay', run with --literal.
$ qdbus --system --literal  org.freedesktop.UDisks2 /org/freedesktop/UDisks2/block_devices/sda1 org.freedesktop.UDisks2.Filesystem.MountPoints
[Variant: [Argument: aay {{47, 98, 111, 111, 116, 0}}]]


Так что посмотри исходники qdbus

anonymous(*)(2013-01-20 06:51:07)

Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0
Этот тред читают 1 пользователь:
Анонимных: 1
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!