107 lines
3.3 KiB
C++
107 lines
3.3 KiB
C++
//---------------------------------------------------------------------------
|
|
#include <vcl.h>
|
|
#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;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
|