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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QNAM после неудачной попытки загрузки с ftp, следюущие запросы с ошибкой  (Прочитано 2315 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Декабрь 27, 2013, 17:05 »

Привет. Есть ftp сервер, на котором есть файл-описатель, в котором хранится список пар ключ-значение, ключ - название файла xml, значение - его название на русском.
Есть каталог files, в котором располагаются нужные xml.

root
|
+-filelist.json
|
+files (папка)
   |
   - 1.xml
   - 2.xml
   ...
   - n.xml

Клиент сначала с помощью get запроса получает файл filelist.json. после парсинга юзеру отображается окно, в котором он может выбрать нужный файл.
Дальше идет второй запрос get уже с полным путем к файлу.
Так вот, если все файлы на своих местах, все работает.
Если же какой то файл отсюстствует или не найден в папке files, то QNAM возвращает ошибку : couldn't get file size. Правильно.
Но, теперь когда я хочу заново получить список файлов filelist.json (который есть и никуда не девался) я получаю эту ошибку и для этого запроса.
Если файл вернуть на место, все ок. Т.е. ошибка для предыдущего запроса влияет на следующий.

Привожу код:
Код:
//запрос filelist.json
void CRemoteConfigurationManager::requestFileList()
{
    RemoteConfigurationManagerErorr e = checkUrlParts();
    if(e!=noError)
    {
        emit    error(e);
        return;
    }
    static  const   QString fileListRequestTemplate("ftp://%1:%2@%3/filelist.json");
    fcurrentFile.clear();
    QUrl    url(fileListRequestTemplate.arg(fuser).arg(fpassword).arg(fhost));
    QNetworkRequest request(url);
    QNetworkReply   *   reply = fmanager.get(request);
    connect(reply,SIGNAL(finished()),this,SLOT(fileListReplyFinished()));
    connect(reply,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(processReplyError(QNetworkReply::NetworkError)));
}
//filelist parse
void CRemoteConfigurationManager::fileListReplyFinished()
{
    QNetworkReply   *   reply = qobject_cast<QNetworkReply*>(sender());
    Q_ASSERT(reply);
    if(reply->error()==QNetworkReply::NoError)
    {
        QByteArray  data = reply->readAll();

            QJsonParseError jsonError;
            QJsonDocument   doc = doc.fromJson(data,&jsonError);
            if(jsonError.error==QJsonParseError::NoError)
            {
                QJsonObject rootObject = doc.object();
                QJsonObject filelistObject = rootObject.value("filelist").toObject();
                if(!filelistObject.isEmpty())
                {
                    QJsonArray  array = filelistObject.value("files").toArray();
                    QList<CRemoteFileItem> filelist;
                    foreach (const QJsonValue & jsonValue, array)
                    {
                        QJsonObject o = jsonValue.toObject();
                        if(!o.isEmpty())
                        {
                            CRemoteFileItem item;
                            item.setFileName(o.value("filename").toString());
                            item.setDescription(o.value("description").toString());
                            filelist<<item;
                        }
                    }
                    emit    fileListReceived(filelist);
                }
            }
            else
            {
                emit    error(fileListParseError);
            }
        }
    reply->deleteLater();
}
//error process
void CRemoteConfigurationManager::processReplyError(QNetworkReply::NetworkError)
{
    QNetworkReply   *   reply = qobject_cast<QNetworkReply*>(sender());
    Q_ASSERT(reply);
    emit    replyError(reply);
    reply->deleteLater();
}
//скачка нужного файла
void CRemoteConfigurationManager::getFile(const QString &fileName)
{
    RemoteConfigurationManagerErorr e = checkUrlParts();
    if(e!=noError)
    {
        emit    error(e);
        return;
    }
    if(fileName.isEmpty())
    {
        emit    error(fileNameIsEmpty);
        return;
    }
    fcurrentFile = fileName;
    static  const   QString    fileRequestTemplate("ftp://%1:%2@%3/stations/%4");
    QUrl    url(fileRequestTemplate.arg(fuser).arg(fpassword).arg(fhost).arg(fileName));
    QNetworkRequest request(url);
    QNetworkReply   *   downloadReply = fmanager.get(request);
    connect(downloadReply,SIGNAL(finished()),this,SLOT(fileDownloadReplyFinished()));
    connect(downloadReply,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(processReplyError(QNetworkReply::NetworkError)));
    connect(downloadReply,SIGNAL(downloadProgress(qint64,qint64)),this,SIGNAL(fileReceiveProgress(qint64,qint64)));
}
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Декабрь 27, 2013, 18:02 »

PS. При перезапуске приложения, впервый раз filelist скачивается, после ошибки чтения несуществубщего файла картина повторяется до последующего перезапуска.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #2 : Декабрь 27, 2013, 18:22 »

После гугления понял, что если происходит такая ошибка, следующие запросы будут с ошибками. Пришлось размещать QNAM в куче, при ошибке его удалять, и создавать заново - зато работает.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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