Использование QTWebKit для отображения сайта, хранящегося в памяти - PullRequest
5 голосов
/ 21 июня 2011

В настоящее время я храню свои HTML, JS, CSS, графику и т. Д. Локально на жестком диске и обращаюсь к ним с помощью QWebFrame::SetUrl( QUrl::fromLocalFile( "appFolder\html\index.html" )). В какой-то момент мне понадобится зашифровать локально сохраненные файлы, поэтому я ищу способ либо расшифровать их по запросу, либо расшифровать их все в памяти и получить к ним доступ таким образом.

Я знаю, что могу использовать QWebFrame::setContent( htmlData ) для загрузки HTML из памяти, чтобы я мог загрузить зашифрованный HTML-файл, расшифровать его в памяти и затем отобразить его таким образом, но как мне поступить с другими данными (JS, CSS) , графика и т. д.), которая в настоящее время хранится в подпапках?

В качестве альтернативы, есть ли способ, которым я могу перехватывать запросы на доступ ко всем файлам HTML, JS, CSS и т. Д. И дешифровать их по мере загрузки?

Используя свой собственный NetworkAccessManager, я могу перехватывать вызовы на createRequest, чтобы видеть, когда загружается каждый файл, но я не понимаю, как использовать это для расшифровки данных на лету. Я также могу подключить функцию слота к сигналу finished(QNetworkReply*), но в этот момент данные уже прочитаны - текущая позиция QIODevice указывает на конец файла.

Буду очень признателен за любые советы или указатели в правильном направлении.

1 Ответ

2 голосов
/ 23 июня 2011

Я думаю, что в вашем случае лучшее решение - это наследовать класс QNetworkReply и использовать этот новый класс в переопределенной функции QNetworkAccessManager::createRequest().

В общем случае вам следует переопределить следующие виртуальные функции QNetworkReply : bytesAvailable(), readData(char *data, qint64 maxSize), close(), abort().

Например, readData должно быть следующим:

qint64 NetworkReplyEx::readData(char *data, qint64 maxSize)
{
    return m_buffer.read(data, maxSize);
}

где m_buffer - это уже дешифрованные данные.

Также вам необходимо добавить всю необходимую логику в этом классе для получения зашифрованных данных, дешифровать эти данные ... В конце вы должны вручную выдать сигнал finished() внутри новогокласс, поэтому QWebView или другой связанный класс получит расшифрованный html.

...