2011-06-21 5 views
5

現在、私はHTML、JS、CSS、グラフィックスなどをローカルにハードディスクに保存し、QWebFrame::SetUrl(QUrl::fromLocalFile("appFolder\html\index.html"))を使ってアクセスしています。ある時点では、ローカルに保存されたファイルを暗号化する必要があります。そのため、要求されたときに復号化する方法や、すべてを復号化してメモリにアクセスしてその方法にアクセスする方法を探しています。QTWebKitを使用してメモリに保存されたウェブサイトを表示

私はQWebFrame::setContent(htmlData)を使用してメモリからHTMLを読み込むことができるので、暗号化されたHTMLファイルを読み込み、メモリで復号化して表示することができますが、他のデータ(JS、CSS、グラフィックスなど)は現在サブフォルダに保存されていますか?

また、HTML、JS、CSSなどのすべてのファイルへのアクセス要求を傍受し、ロードされたときに復号化する方法はありますか?

NetworkAccessManagerを使用すると、createRequestへの呼び出しを傍受して、各ファイルがロードされていることを確認できますが、これを使用してその場でデータを復号化する方法はわかりません。スロット機能をfinished(QNetworkReply*)信号に接続することもできますが、その時点でデータはすでに読み込まれています - QIODeviceの現在位置がファイルの最後を指しています。

正しいアドバイスやアドバイスがあれば、とても感謝しています。

+1

QNetworkReplyクラスを継承し、QNetworkAccesManager :: createRequest()で使用する必要があります。この新しいクラスでは、finished()が発行される前に生データ(あなたの場合はdecrypt html)を変更することができます。 – Johnny

+0

@Johnny:ありがとう - 確かに正しいトラックに私を置く。まだ実装するのはまっすぐではありませんでしたが、正しい方向に向けるのは良いことでした。 QFileNetworkReply.cppを見ると、QNetworkReplyをローカルファイルアクセスでどのように使用しているかを確認するのにも非常に便利でした。あなたが答えにあなたのコメントを少し詳しく説明したいのであれば、それを受け入れたものとしてマークします。もしそうでなければ、コードの概要を答えにします。もう一度感謝します - あなたは間違いなく問題のソートを手伝ってくれました。 – Rok

答えて

2

私はあなたのケースで最適なソリューションをQNetworkReplyクラスを継承し、再実装QNetworkAccessManager::createRequest()機能で、この新しいクラスを使用することだと思います。 bytesAvailable()readData(char *data, qint64 maxSize)close()abort()

一般的には、QNetworkReplyの次の仮想関数を再実装する必要があります。

たとえば、readDataはfolowingをすべきである:

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

m_bufferが既に復号化されたデータ。

また、あなたは、あなたが手動でそうQWebViewまたは他の関連クラスはHTMLを復号化されます、新しいクラス内finished()信号を発するべきで終わりでは ...このデータを復号化、暗号化されたデータを取得するには、このクラスのすべての必要なロジックを追加する必要があります。

関連する問題