Russian Qt Forum
Июля 05, 2025, 02:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: как передавать QString по dbus? :)  (Прочитано 6349 раз)
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.034 секунд. Запросов: 23.