Russian Qt Forum
Ноябрь 25, 2024, 13:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: как передавать QString по dbus? :)  (Прочитано 6131 раз)
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« : Март 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 Веселый

P.S. Qt 4.4.3, Debian Lenny.
Записан
BRE
Гость
« Ответ #1 : Март 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 Веселый

P.S. Qt 4.4.3, Debian Lenny.
Может проверять isEmpty() и не городить огород?  Подмигивающий

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

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

Сторона А отправляет  null-строку, она преобразуется к dbus-типу строка (""), а на строне B, соответственно преобразуется к пустрой (но не null) строку.
« Последнее редактирование: Март 08, 2009, 22:55 от BRE » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #2 : Март 08, 2009, 23:20 »

На моей серверной стороне есть разница между isEmpty() и isNull() из-за специфики выполняемой задачи, поэтому потеря свойства isNull() для меня оказалось неожиданностью Улыбающийся Посмотрел исходники dbus в Qt - да, QString передаётся не как структура, а как char массив.

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

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

Ладно, видимо надо городить огород Улыбающийся
« Последнее редактирование: Март 08, 2009, 23:22 от Alex Custov » Записан
BRE
Гость
« Ответ #3 : Март 08, 2009, 23:37 »

Это не нормально, QString-и надо сериализовать как структуры, а не как const char*.
Ладно, видимо надо городить огород Улыбающийся
DBus это не модуль Qt, это технология межпроцессного взаимодействия.
Ты пишешь клиент, который будет через dbus предоставлять свой сервис клиентам. Эти клиенты не обязательно будут написаны с использованием Qt. Кто-то может захотель использовать эти сервисы из bash-скриптов, как они будут сериализовать строки как структуры, накой им это? И это только из-за того, что ты разработчик решил, что тебе так удобней. У Dbus есть свои типы, и даже если он предоставялет передачу структур, мне кажется, что этим нужно пользоваться как можно реже.
Все это IMHO.  Подмигивающий
Записан
Winstrol
Гость
« Ответ #4 : Март 09, 2009, 13:26 »

Это не нормально, QString-и надо сериализовать как структуры, а не как const char*.
Может еще capacity тоже сериализовывать надо? Чепуху не говорите. Исправляйте ваш некорректный алгоритм на серверной стороне.
« Последнее редактирование: Март 09, 2009, 13:29 от Winstrol » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #5 : Март 09, 2009, 15:35 »

почему ты решил что алгоритм некорректный? В замешательстве Алгоритм корректный, QString пришлось только в свою структуру обернуть.
Записан
Mixolap
Гость
« Ответ #6 : Март 09, 2009, 15:56 »

А чисто из интереса, что за задача такая, что нельзя isEmpty обойтись?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #7 : Март 09, 2009, 16:40 »

т.к. в моей задаче (что-то типа фонт-енда для wpa_supplicant) есть разница между пустой строкой и отсутствием строки. Если я принимаю на стороне сервера строку с isNull() == true, то считается что этого параметра нет и строка не используется вообще. Иначе она используется даже если isEmpty() == true.

То есть получить на сервере QString() и QString("") - две большие разницы.
Записан
Winstrol
Гость
« Ответ #8 : Март 09, 2009, 18:23 »

почему ты решил что алгоритм некорректный? В замешательстве
Странный вопрос В замешательстве  Я просто знаю, что это так. Так же, как я знаю, что во второй половине IV века до н.э. Александр Македонский совершил поход в Азию.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #9 : Март 09, 2009, 19:55 »

Странный вопрос В замешательстве  Я просто знаю, что это так. Так же, как я знаю, что во второй половине IV века до н.э. Александр Македонский совершил поход в Азию.

Вывод сделанный при недостатке входных данных. "Просто знаю" - это интересно Улыбающийся
Записан
ритт
Гость
« Ответ #10 : Март 09, 2009, 20:08 »

если строка с isNull() не обрабатывается на клиенте, зачем её передавать?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #11 : Март 09, 2009, 20:46 »

строки передаются внутри структуры. Пример с setString() - просто пример для демонстрации, как я и написал.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.103 секунд. Запросов: 22.