Files
common/Global/ResourceHandler.cpp
2026-06-12 23:18:12 +08:00

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;
}
//---------------------------------------------------------------------------