2011-06-21 11 views
5

Obecnie mam mój HTML, JS, CSS, grafikę itp. Przechowywany lokalnie na dysku twardym i dostęp do nich za pomocą QWebFrame::SetUrl(QUrl::fromLocalFile("appFolder\html\index.html")). W pewnym momencie będę musiał zaszyfrować lokalnie przechowywane pliki, więc szukam sposobu, aby je odszyfrować, gdy ich zażądano, lub odszyfrować je wszystkie do pamięci i uzyskać do nich dostęp w ten sposób.Używanie QTWebKit do wyświetlania strony internetowej przechowywanej w pamięci

Wiem, że mogę użyć kodu QWebFrame::setContent(htmlData) do załadowania kodu HTML z pamięci, aby załadować zaszyfrowany plik HTML, odszyfrować go w pamięci, a następnie wyświetlić go w ten sposób, ale w jaki sposób mogę przejść do innych danych (JS, CSS, grafika itp.), która jest obecnie przechowywana w podfolderach?

Czy istnieje sposób, w jaki mogę przechwytywać żądania dostępu do wszystkich plików HTML, JS, CSS itp. I odszyfrowywać je podczas ich ładowania?

Korzystając z mojego własnego NetworkAccessManager mogę przechwytywać połączenia do createRequest, dzięki czemu mogę zobaczyć, kiedy każdy plik jest ładowany, ale nie widzę, jak użyć tego do odszyfrowania danych w locie. Mogę również podłączyć funkcję gniazda do sygnału finished(QNetworkReply*), ale w tym momencie dane zostały już odczytane - aktualna pozycja QIODevice wskazuje koniec pliku.

Byłbym bardzo wdzięczny za porady i wskazówki we właściwym kierunku.

+1

Powinieneś dziedziczyć klasę QNetworkReply i używać jej w QNetworkAccesManager :: createRequest(). W tej nowej klasie możesz modyfikować surowe dane (w twoim przypadku odszyfrowad html) przed zakończeniem(). – Johnny

+0

@Johnny: Dzięki - to z pewnością postawiło mnie na właściwych torach. Wciąż nie było to łatwe do wdrożenia, ale dobrze było wskazać właściwy kierunek. Przyglądanie się QFileNetworkReply.cpp było również bardzo przydatne, aby zobaczyć, jak wykorzystali QNetworkReply z lokalnym dostępem do plików. Jeśli chcesz nieco dopracować swój komentarz w odpowiedzi, zaznaczę go jako zaakceptowany. Jeśli nie, podaję zarys kodu jako odpowiedź. Jeszcze raz dziękuję - zdecydowanie pomogłeś mi rozwiązać problem. – Rok

Odpowiedz

2

Myślę, że w twoim przypadku najlepszym rozwiązaniem jest dziedziczenie klasy QNetworkReply i użycie tej nowej klasy w reimplementowanej funkcji QNetworkAccessManager::createRequest().

Generalnie należy reimplement następujące funkcje wirtualne z QNetworkReply: bytesAvailable(), readData(char *data, qint64 maxSize), close(), abort().

Na przykład readData powinna być folowing:

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

gdzie m_buffer już odszyfrowane dane.

Ponadto trzeba dodać wszystkie niezbędne logiki w tej klasie, aby uzyskać dane zaszyfrowane, odszyfrować te dane ... W końcu trzeba ręcznie emitują finished() sygnału wewnątrz nowej klasy, więc QWebView lub innych związanych klasa dostanie rozszyfrował html .

Powiązane problemy