пользовательская реализация QAbstractNetworkCache; Устройство QAbstractNetworkCache :: insert (устройство QIODevice *) не имеет данных

Я пытаюсь создать свой собственный обычай QAbstractNetworkCache реализация для использования с QNetworkAccessManager,

У меня проблемы с QAbstractNetworkCache::insert(QIODevice *device); внутри этого метода устройство всегда приходит с 0 байтами для чтения.

Как я понимаю, QIODevice* что возвращается из QAbstractNetworkCache::prepare(const QNetworkCacheMetaData &metaData) будет заполнен данными и использоваться в качестве параметра для QAbstractNetworkCache::insert(QIODevice *device) метод один раз QNetworkAccessManager заканчивает загрузку

Итак, я подготовил QBuffer быть этим контейнером, но всякий раз, когда QAbstractNetworkCache::insert(QIODevice *device) вызывается, всегда прибывает ни с чем (device->bytesAvailable() == 0)

QIODevice* NetworkCachePrivate::prepare(const QNetworkCacheMetaData &metaData) {

if (!metaData.isValid() || !metaData.url().isValid() || cacheDir.isEmpty()) return 0;

QIODevice* device = 0;

QString hash = hexMD5(metaData.url().toString());

QScopedPointer<QBuffer> buffer(new QBuffer);

if (buffer->open(QIODevice::ReadWrite))
{
qDebug() << "BUFFER READY";
device = buffer.take();
deviceMapping[device] = qMakePair(hash, metaData);
}

return device;
}

void NetworkCachePrivate::insert(QIODevice *device) {
if (deviceMapping.contains(device))
{
QPair<QString, QNetworkCacheMetaData> pair = deviceMapping[device];
QString fileName;
fileName += cacheDir;
fileName += QLatin1String("/");
fileName += pair.first;

qDebug() << "DEVICE BYTES" << device->bytesAvailable(); //ALWAYS 0!!!! :(
QFile file(fileName);
if (file.open(QIODevice::WriteOnly))
{
qint64 size = file.write(device->readAll());
if (size <= 0)
{
file.remove();
}
else
{
qDebug() << "FILE WROTE " << size;
cacheSize += size;
}
}
deviceMapping.remove(device);
delete device;
}
}

QNetworkCacheMetaData NetworkCachePrivate::metaData (const QUrl &url ) {
QString fileName;
fileName += cacheDir;
fileName += QLatin1String("/");
fileName += hexMD5(url.toString());

QNetworkCacheMetaData data;

if (!QFile::exists(fileName))
return data;

data.setUrl(url);
data.setExpirationDate(QDateTime::currentDateTime().addYears(1));
return data;
}

2

Решение

Как Пеппе также указал в комментарии, вам нужно искать QBuffer в начале после записи и до чтения в соответствии с документация:

QBuffer позволяет вам получить доступ к QByteArray, используя интерфейс QIODevice. QByteArray обрабатывается просто как стандартный файл с произвольным доступом. Пример:

QBuffer buffer;
char ch;

buffer.open(QBuffer::ReadWrite);
buffer.write("Qt rocks!");
*** buffer.seek(0); ***
buffer.getChar(&ch);  // ch == 'Q'
buffer.getChar(&ch);  // ch == 't'
buffer.getChar(&ch);  // ch == ' '
buffer.getChar(&ch);  // ch == 'r'

Чтобы быть более конкретным для вашего кода, вам нужно вставить следующую инструкцию:

...
device.seek(0);
qDebug() << "DEVICE BYTES" << device->bytesAvailable(); //NOT 0 ANYMORE!!!! :)
...
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]