Russian Qt Forum

Qt => Общие вопросы => Тема начата: TukiNov от Апрель 03, 2007, 21:40



Название: Qt 3.3.6 : перенос программы с C++ Builder на Qt
Отправлено: TukiNov от Апрель 03, 2007, 21:40
Так как переписываю прогу которая была написана в C++ Builder, наступил на грабли :) а именно CommaText.
Есть строка вида :
Код:

tuki,123456,48FFE408---1224729608,"11,,52,53,51,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
""Creative 270"",1.1,,""Акустические системы, наушники, микрофоны (Справочник по компьютерной технике ФГУП """"НИИТП"""")"",,,124,,,,,,,ACUSTIK_NIITP,1,1,124011,""Акустические системы"",""Акустические системы"",,,,,,""В неотапливаемом помещении"",,,,,,,,,,,,,,,,,,,,,,,,,"

Я сначало привожу это строку к виду :
Код:

tuki#123456#48FFE408---1224729608#11//2/3/1/////////////////////////////////////////////Creative 270/1.1//Акустические системы, наушники, микрофоны (Справочник по компьютерной технике ФГУП \"НИИТП\")///124///////ACUSTIK_NIITP/1/1/124011/Акустические системы/Акустические системы//////В неотапливаемом помещении////////////////////#

т.е. все внешние запятые заменяю на #, а внутренние которые не заключены в двойные кавычки на / , а потом уже делаю инсерты в QPtrList.
Может есть аналог CommaText  в QT ?
Или может кто то предложет более интересное решение. Если интересно могу выложить ф-ю которую я написал


Название: Qt 3.3.6 : перенос программы с C++ Builder на Qt
Отправлено: SABROG от Апрель 03, 2007, 22:21
QStringList::split(...)

Только врятли он сможет определить что разделять не нужно строку там где запятая в кавычках.


Название: Qt 3.3.6 : перенос программы с C++ Builder на Qt
Отправлено: TukiNov от Апрель 03, 2007, 22:35
Цитата: "SABROG"
QStringList::split(...)

Только врятли он сможет определить что разделять не нужно строку там где запятая в кавычках.

это я знаю, не очень удобная штука.
Я надеюсь просто что кто нить уже написал на подобии этого :)


Название: Qt 3.3.6 : перенос программы с C++ Builder на Qt
Отправлено: TukiNov от Апрель 06, 2007, 21:06
Ладно, с этим вроде разобрался. Теперь такой вопрос. На С++ Builder написан прога которая работает через CGI. Написана с помощью TWebActionItem(TObject *Sender,
      TWebRequest *Request, TWebResponse *Response, bool &Handled), выступающая в роли сервера. Елиент видимо тоже использует эту фигню.
Так вот, если с cgi в QT я более- менее разобрался (нашёл библиотеку), то вот как получать запросы от клиента не могу допереть.
Забыл сказать, что запрос отправляется методом POST, если я не ошибаюсь.
Помогите плиз.


Название: Qt 3.3.6 : перенос программы с C++ Builder на Qt
Отправлено: _govorilka от Апрель 08, 2007, 18:42
Параметры POST-запроса передаются через переменные окружения (для Apache), их можно получить через QProcess::environment(), QProcess::systemEnvironment()


Название: Qt 3.3.6 : перенос программы с C++ Builder на Qt
Отправлено: TukiNov от Апрель 08, 2007, 22:09
вообщем, запрос я получил, изменил чуть пример $QTDIR/examples/network/httpd, вот только странно, получается два запроса а не один :
первый запрос идёт в таком виде :
Код:

POST / HTTP/1.1
Content-Type: text/html
Content-Length: 38
Host: 192.10.0.1:8080
Accept: text/html, */*
User-Agent: Mozilla/3.0 (compatible; Indy Library)


а вторым уже то что мне нужно :
Код:

tuki,123456,æëè›œéîòòòòîèææççæçíìóéîó

допустим, запрос я обработаю, а в каком виде мне обратно результат отправлять ?


Название: Qt 3.3.6 : перенос программы с C++ Builder на Qt
Отправлено: _govorilka от Апрель 09, 2007, 16:17
Цитата: "TukiNov"
вообщем, запрос я получил, изменил чуть пример $QTDIR/examples/network/httpd, вот только странно, получается два запроса а не один :
первый запрос идёт в таком виде :
Код:

POST / HTTP/1.1
Content-Type: text/html
Content-Length: 38
Host: 192.10.0.1:8080
Accept: text/html, */*
User-Agent: Mozilla/3.0 (compatible; Indy Library)


а вторым уже то что мне нужно :
Код:

tuki,123456,æë�蛜éîòòòòîèææççæçíìóéîó

допустим, запрос я обработаю, а в каком виде мне обратно результат отправлять ?


Это не два запроса - это заголовок и данные, разделанные между собой пустой строкой. После данных, кстати идет еще одна пустая строка, она означает конец запроса

добавлено спустя 1 час 2 минуты:

 Скачай вот эту книжку, я думаю, она тебе поможет:
http://zipsites.ru/books/kruglinski_progr_na_visual_c_6/[/url]


Название: Qt 3.3.6 : перенос программы с C++ Builder на Qt
Отправлено: TukiNov от Апрель 11, 2007, 12:55
Цитата: "_govorilka"
Цитата: "TukiNov"
вообщем, запрос я получил, изменил чуть пример $QTDIR/examples/network/httpd, вот только странно, получается два запроса а не один :
первый запрос идёт в таком виде :
Код:

POST / HTTP/1.1
Content-Type: text/html
Content-Length: 38
Host: 192.10.0.1:8080
Accept: text/html, */*
User-Agent: Mozilla/3.0 (compatible; Indy Library)


а вторым уже то что мне нужно :
Код:

tuki,123456,æë�蛜éîòòòòîèææççæçíìóéîó

допустим, запрос я обработаю, а в каком виде мне обратно результат отправлять ?


Это не два запроса - это заголовок и данные, разделанные между собой пустой строкой. После данных, кстати идет еще одна пустая строка, она означает конец запроса

добавлено спустя 1 час 2 минуты:

 Скачай вот эту книжку, я думаю, она тебе поможет:
http://zipsites.ru/books/kruglinski_progr_na_visual_c_6/[/url]

спасибо, прочитал, ответ составил, но мне всё равно не понятно почему httpd разбивает запрос на два запроса.
Пример :
Код:

void HttpDaemon::newConnection( int socket )
{
    QSocket* s = new QSocket( this );
    connect( s, SIGNAL(readyRead()), this, SLOT(readClient()) );
    connect( s, SIGNAL(delayedCloseFinished()), this, SLOT(discardClient()) );
    s->setSocket( socket );
    emit newConnect();
}

Первый раз readyRead() срабатывает на заголовок :
Код:

POST / HTTP/1.1
Content-Type: text/html
Content-Length: 38
Host: 192.10.0.1:8080
Accept: text/html, */*
User-Agent: Mozilla/3.0 (compatible; Indy Library)


и второй раз на :
Код:

tuki,123456,æë�蛜éîòòòòîèææççæçíìóéîó



Название: Qt 3.3.6 : перенос программы с C++ Builder на Qt
Отправлено: TukiNov от Апрель 15, 2007, 02:08
Ладно, этим тоже разобрался.
Теперь другой вопрос.
Так как клиент находится в винде, мне ему нужно нужно отправить строку через сокет в кодировке utf8. Через QTextCodec::setCodecForTr( QTextCodec::codecForName("utf8"));, и заключения ответа в tr() не проходит. Все перепробовал. Есть идеи ? :)
проблема в том что ответ кодируется через ассемблер :) и я не могу поставить кодек на QTextStream, так как клиент тогда его не расшифрует, мне нада до этого(до кодирования) перевести простую строку в ср1251, пока есть только идея, использую поток записать строчку в файл в кодировке ср1251, а потом считать её.

добавлено спустя 44 минуты:

 тоже не получилось :( Жду ваших идей ...


Название: Qt 3.3.6 : перенос программы с C++ Builder на Qt
Отправлено: TukiNov от Апрель 16, 2007, 01:41
поискав на форуме, подошло вот что :
Код:

QString qStr = QString::fromUtf8(final) ;
QCString res = QTextCodec::codecForName("utf8")->fromUnicode( qStr );


Название: Qt 3.3.6 : перенос программы с C++ Builder на Qt
Отправлено: Разуев Максим от Май 08, 2007, 15:29
По идее должно работатьеще и QString::fromLocal8Bit(text).