Russian Qt Forum

Qt => Работа с сетью => Тема начата: spirits25 от Январь 18, 2013, 15:03



Название: [РЕШЕНО] QDomDocument отрабатывает не всегда=(
Отправлено: spirits25 от Январь 18, 2013, 15:03
Всем привет!

Есть несколько методов в классе. В одном создаётся запрос и посылается:
Код:
    QNetworkRequest request;
    request.setUrl(url);
    request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    request.setRawHeader("Content-Type", "text/xml");

//    networkManager = new QNetworkAccessManager (this); //создаётся в конструкторе
    QNetworkReply* reply = networkManager->get(request);
    connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
            this, SLOT(getError(QNetworkReply::NetworkError)));

Далее сам slotReadyRead:
Код:
    QNetworkReply *reply=qobject_cast<QNetworkReply*>(sender());
    disconnect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
    disconnect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
               this, SLOT(getError(QNetworkReply::NetworkError)));

    int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

    qDebug() << "=================================";
    if (reply->error() == QNetworkReply::NoError)
    {
        qDebug() << "status code: " << statusCode;
        switch (statusCode)
        {
            case 200:
            {
                QByteArray bytes = reply->readAll();
                QString XMLstring(bytes);

                if (!mDocument.setContent(bytes))
                {
                    qDebug() << "Error XML";
                    return ;
                }

                QDomElement  mElement = mDocument.documentElement().firstChildElement("Product");
                while ( !mElement.isNull() )
                {
                    QDomElement de = mElement.firstChildElement("ProductName");
                    productsList << de.text();
                    mElement = mElement.nextSiblingElement("Product");
                }
            }
        }
    }

Примерно вот так. И что получается - если дисконнекты не поставил бы, то метод вызывается 2 раза. Но ладно, дисконнект помог.

Проблема - Когда прогу запускаешь со включенной сетью - всё круто. Если сети не было, а метод вызываешь когда сеть появилась, то отрабатывает условие !mDocument.setContent(bytes), хотя в переменной XMLstring все данные на вид пришли. Что может быть не так? что стоит попробовать? Любые советы=)


Название: Re: QDomDocument отрабатывает не всегда=(
Отправлено: _OLEGator_ от Январь 18, 2013, 15:12
Смотреть какие ошибки (errorMsg, errorLine, errorColumn) возвращает функция:
Код
C++ (Qt)
bool QDomDocument::setContent ( const QByteArray & buffer, QString * errorMsg = 0, int * errorLine = 0, int * errorColumn = 0 )


Название: Re: QDomDocument отрабатывает не всегда=(
Отправлено: spirits25 от Январь 18, 2013, 15:18
Смотреть какие ошибки (errorMsg, errorLine, errorColumn) возвращает функция:
Код
C++ (Qt)
bool QDomDocument::setContent ( const QString & text, QString * errorMsg = 0, int * errorLine = 0, int * errorColumn = 0 )


Код:
         
                qDebug() << "status code: " << statusCode;
                ................
                QDomDocument mDocument;
                bool namespaceProcessing;
                QString * errorMsg;
                int * errorLine;
                int * errorColumn;
                if (!mDocument.setContent(bytes, namespaceProcessing, errorMsg, errorLine, errorColumn))
                {
                    qDebug() << "Error XML";
                    qDebug() << errorMsg;
                    qDebug() << errorLine;
                    qDebug() << errorColumn;
                    return ;
                }

Выдало:
Цитировать
status code:  200
Error XML
0x0
0x0
0x0


Название: Re: QDomDocument отрабатывает не всегда=(
Отправлено: _OLEGator_ от Январь 18, 2013, 15:19
+ еще учить плюсы.
как минимум надо инициализировать и разыменовать указатели errorMsg, errorLine, errorColumn. Я удивлен, что этот код еще и не падает.


Название: Re: QDomDocument отрабатывает не всегда=(
Отправлено: spirits25 от Январь 18, 2013, 15:29
+ еще учить плюсы.
как минимум надо инициализировать и разыменовать указатели errorMsg, errorLine, errorColumn. Я удивлен, что этот код еще и не падает.

Есть такое=) после питона каждый раз долго к сям привыкаю. Спасибо.

Итого я имею
Цитировать
"unexpected end of file"
35
491
И действительно, заметил, что xml неполный, резко обрывается: "...s>false<". Почему такое может быть? ведь при первом соединении с сетью всё нормально.


Название: Re: QDomDocument отрабатывает не всегда=(
Отправлено: _OLEGator_ от Январь 18, 2013, 15:47
Наверняка пришли не все данные, а только их часть.


Название: Re: QDomDocument отрабатывает не всегда=(
Отправлено: Пантер от Январь 18, 2013, 15:49
То, что ты попал в slotReadyRead, еще не значит, что все данные пришли. Юзай буфер.


Название: Re: QDomDocument отрабатывает не всегда=(
Отправлено: spirits25 от Январь 18, 2013, 16:11
То, что ты попал в slotReadyRead, еще не значит, что все данные пришли. Юзай буфер.

reply->readAll() разве не должен подождать всех данных? как заюзать буфер?


Название: Re: QDomDocument отрабатывает не всегда=(
Отправлено: spirits25 от Январь 18, 2013, 16:12
Наверняка пришли не все данные, а только их часть.

Между запросами нет разницы. То есть может быть, что в одной ситуации пришли все данные, а в другой пришла только часть?


Название: Re: QDomDocument отрабатывает не всегда=(
Отправлено: spirits25 от Январь 18, 2013, 16:17
все последующие запросы выводят
Цитировать
"unexpected end of file"
16
1658

То есть ещё меньше данных приходит. Больше значения не изменяются.


Название: Re: QDomDocument отрабатывает не всегда=(
Отправлено: spirits25 от Январь 18, 2013, 16:31
Решил, может кому ещё из новичков пригодится=)
Ответы начали приходить в несколько заходов.
Каждый раз в slotReadyRead я сохранял по кусочку и когда всё собралось mDocument.setContent отработал без ошибок=)

Всем спасибо, кто помогал=)


Название: Re: [РЕШЕНО] QDomDocument отрабатывает не всегда=(
Отправлено: Fregloin от Январь 21, 2013, 12:53
а когда Вы узнали что пришли все данные?