Russian Qt Forum

Qt => Общие вопросы => Тема начата: Alex Custov от Март 08, 2009, 22:45



Название: как передавать QString по dbus? :)
Отправлено: Alex Custov от Март 08, 2009, 22:45
Столкнулся с тем, что при передаче QString-ов по dbus, они теряют свойство isNull(). Например:

Сервер:

Код:
void DBusAdaptor::setString(const QStrign &s)
{
    // получаем строку, для которой isNull() == false
    myString = s;
    qDebug("\"%s\" %d %d", qPrintable(myString), myString.length(), myString.isNull());
}

Клиент:

Код:
QDBusInterface i("com.test.test",
                "/com/test/test",
                "com.test.test",
                QDBusConnection::sessionBus());

// шлём строку, для которой isNull() == true
i.call("setString", QString());

Это нормально? :) Если ли способы это обойти кроме созданий своих обёрток вокруг QString?

А то ведь надо будет городить структуру, в которой одно поле QString, второе поле - булевский параметр isNull :D

P.S. Qt 4.4.3, Debian Lenny.


Название: Re: как передавать QString по dbus? :)
Отправлено: BRE от Март 08, 2009, 22:47
Столкнулся с тем, что при передаче QString-ов по dbus, они теряют свойство isNull(). Например:

Сервер:

Код:
void DBusAdaptor::setString(const QStrign &s)
{
    // получаем строку, для которой isNull() == false
    myString = s;
    qDebug("\"%s\" %d %d", qPrintable(myString), myString.length(), myString.isNull());
}

Клиент:

Код:
QDBusInterface i("com.test.test",
                "/com/test/test",
                "com.test.test",
                QDBusConnection::sessionBus());

// шлём строку, для которой isNull() == true
i.call("setString", QString());

Это нормально? :) Если ли способы это обойти кроме созданий своих обёрток вокруг QString?

А то ведь надо будет городить структуру, в которой одно поле QString, второе поле - булевский параметр isNull :D

P.S. Qt 4.4.3, Debian Lenny.
Может проверять isEmpty() и не городить огород?  ;)

А вообще это нормально. Смотри:

             dbus
SideA -------------> SideB

Сторона А отправляет  null-строку, она преобразуется к dbus-типу строка (""), а на строне B, соответственно преобразуется к пустрой (но не null) строку.


Название: Re: как передавать QString по dbus? :)
Отправлено: Alex Custov от Март 08, 2009, 23:20
На моей серверной стороне есть разница между isEmpty() и isNull() из-за специфики выполняемой задачи, поэтому потеря свойства isNull() для меня оказалось неожиданностью :) Посмотрел исходники dbus в Qt - да, QString передаётся не как структура, а как char массив.

Цитировать
А вообще это нормально.

Это не нормально, QString-и надо сериализовать как структуры, а не как const char*.

Ладно, видимо надо городить огород :)


Название: Re: как передавать QString по dbus? :)
Отправлено: BRE от Март 08, 2009, 23:37
Это не нормально, QString-и надо сериализовать как структуры, а не как const char*.
Ладно, видимо надо городить огород :)
DBus это не модуль Qt, это технология межпроцессного взаимодействия.
Ты пишешь клиент, который будет через dbus предоставлять свой сервис клиентам. Эти клиенты не обязательно будут написаны с использованием Qt. Кто-то может захотель использовать эти сервисы из bash-скриптов, как они будут сериализовать строки как структуры, накой им это? И это только из-за того, что ты разработчик решил, что тебе так удобней. У Dbus есть свои типы, и даже если он предоставялет передачу структур, мне кажется, что этим нужно пользоваться как можно реже.
Все это IMHO.  ;)


Название: Re: как передавать QString по dbus? :)
Отправлено: Winstrol от Март 09, 2009, 13:26
Это не нормально, QString-и надо сериализовать как структуры, а не как const char*.
Может еще capacity тоже сериализовывать надо? Чепуху не говорите. Исправляйте ваш некорректный алгоритм на серверной стороне.


Название: Re: как передавать QString по dbus? :)
Отправлено: Alex Custov от Март 09, 2009, 15:35
почему ты решил что алгоритм некорректный? :-\ Алгоритм корректный, QString пришлось только в свою структуру обернуть.


Название: Re: как передавать QString по dbus? :)
Отправлено: Mixolap от Март 09, 2009, 15:56
А чисто из интереса, что за задача такая, что нельзя isEmpty обойтись?


Название: Re: как передавать QString по dbus? :)
Отправлено: Alex Custov от Март 09, 2009, 16:40
т.к. в моей задаче (что-то типа фонт-енда для wpa_supplicant) есть разница между пустой строкой и отсутствием строки. Если я принимаю на стороне сервера строку с isNull() == true, то считается что этого параметра нет и строка не используется вообще. Иначе она используется даже если isEmpty() == true.

То есть получить на сервере QString() и QString("") - две большие разницы.


Название: Re: как передавать QString по dbus? :)
Отправлено: Winstrol от Март 09, 2009, 18:23
почему ты решил что алгоритм некорректный? :-\
Странный вопрос :-\  Я просто знаю, что это так. Так же, как я знаю, что во второй половине IV века до н.э. Александр Македонский совершил поход в Азию.


Название: Re: как передавать QString по dbus? :)
Отправлено: Alex Custov от Март 09, 2009, 19:55
Странный вопрос :-\  Я просто знаю, что это так. Так же, как я знаю, что во второй половине IV века до н.э. Александр Македонский совершил поход в Азию.

Вывод сделанный при недостатке входных данных. "Просто знаю" - это интересно :)


Название: Re: как передавать QString по dbus? :)
Отправлено: ритт от Март 09, 2009, 20:08
если строка с isNull() не обрабатывается на клиенте, зачем её передавать?


Название: Re: как передавать QString по dbus? :)
Отправлено: Alex Custov от Март 09, 2009, 20:46
строки передаются внутри структуры. Пример с setString() - просто пример для демонстрации, как я и написал.