2011-06-21 50 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()中使用它。在完成()之前,您可以在這個新類中修改原始數據(在您的情況下解密html)。 – Johnny

+0

@約翰尼:謝謝 - 這當然會讓我走上正軌。實施起來還很遙遙無期,但指出正確的方向是件好事。查看QFileNetworkReply.cpp對於查看他們如何將QNetworkReply用於本地文件訪問也非常有用。如果您想在回答中對您的評論進行一點說明,我會將其標記爲已接受。如果不是的話,我會把代碼的大綱作爲答案。再次感謝 - 你肯定幫我解決了問題。 – Rok

回答

2

我覺得你的情況最好的解決辦法是要繼承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 。

相關問題