//--------------------------------------------------------------------------- #include #pragma hdrstop #include "ResourceHandler.h" //#include "GlobalUnit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- __fastcall TResHandler::TResHandler(const _di_ICefBrowser browser, const _di_ICefFrame frame, const _di_ICefRequest request, HWND wnd, int msg) : TCefResourceHandlerOwn( browser, frame, "ImgHandler", request ) { _size = _offset = 0; _callback = NULL; _response = NULL; _wnd = wnd; _msg = msg; } //--------------------------------------------------------------------------- bool __fastcall TResHandler::ProcessRequest(const _di_ICefRequest request, const _di_ICefCallback callback) { _offset = 0; _callback = callback; TCefUrlRequestFlags flags = request->GetFlags(); flags << UR_FLAG_ALLOW_CACHED_CREDENTIALS << UR_FLAG_SKIP_CACHE; request->SetFlags( flags ); TResRequestClient* client = new TResRequestClient( this ); TCefUrlRequestRef::New( request, *client, NULL/*callback*/ ); return true; } //--------------------------------------------------------------------------- void __fastcall TResHandler::GetResponseHeaders(const _di_ICefResponse response, /* out */ __int64 &responseLength, /* out */ ustring &redirectUrl) { if( _response ){ _di_ICefStringMultimap map = *(new TCefStringMultimapOwn()); _response->GetHeaderMap( map ); response->SetHeaderMap( map ); response->SetMimeType( _response->GetMimeType() ); response->SetStatus( _response->GetStatus() ); response->SetStatusText( _response->GetStatusText() ); } responseLength = _size; } //--------------------------------------------------------------------------- bool __fastcall TResHandler::ReadResponse(const void * dataOut, int bytesToRead, int &bytesRead, const _di_ICefCallback callback) { if( _offset < _size ){ bytesRead = _size - _offset; if( bytesRead > bytesToRead ) bytesRead = bytesToRead; char* pData = (char*)dataOut; memcpy( pData, _data + _offset, bytesRead ); _offset += bytesRead; return true; } return false; } //--------------------------------------------------------------------------- __fastcall TResRequestClient::TResRequestClient(TResHandler* handler) { _resHandler = handler; } //--------------------------------------------------------------------------- void __fastcall TResRequestClient::OnRequestComplete(const _di_ICefUrlRequest request) { _resHandler->_response = request->GetResponse(); TCefResourceType type = request->GetRequest()->GetResourceType(); // String str = _imgHandler->_response->GetMimeType(); // if( str.Pos("image") ) if( type==RT_IMAGE || type==RT_XHR ) SendMessage( _resHandler->_wnd, _resHandler->_msg, _resHandler->_size, (int)_resHandler->_data ); if( _resHandler->_callback ) _resHandler->_callback->Cont(); } //--------------------------------------------------------------------------- void __fastcall TResRequestClient::OnDownloadData(const _di_ICefUrlRequest request, void * data, NativeUInt dataLength) { char* pData = _resHandler->_data; int& nSize = _resHandler->_size; memcpy( pData + nSize, data, dataLength ); nSize += dataLength; } //---------------------------------------------------------------------------