1
0
mirror of https://github.com/salvadordf/CEF4Delphi.git synced 2026-05-16 08:38:08 +02:00
Files
CEF4Delphi/source/uCEFWriteHandler.pas
T

343 lines
8.0 KiB
ObjectPascal
Raw Permalink Normal View History

2017-01-27 16:37:51 +01:00
unit uCEFWriteHandler;
{$IFDEF FPC}
{$MODE OBJFPC}{$H+}
{$ENDIF}
2017-02-05 20:56:46 +01:00
{$I cef.inc}
2022-02-19 18:56:41 +01:00
{$IFNDEF TARGET_64BITS}{$ALIGN ON}{$ENDIF}
{$MINENUMSIZE 4}
{$IFNDEF FPC}{$IFNDEF DELPHI12_UP}
// Workaround for "Internal error" in old Delphi versions caused by uint64 handling
{$R-}
{$ENDIF}{$ENDIF}
2017-01-27 16:37:51 +01:00
interface
uses
2019-01-08 19:15:25 +01:00
{$IFDEF MSWINDOWS}
{$IFDEF DELPHI16_UP}
WinApi.Windows,
{$ELSE}
Windows,
{$ENDIF}
2017-07-18 17:50:28 +02:00
{$ENDIF}
2017-03-16 19:09:42 +01:00
uCEFBaseRefCounted, uCEFInterfaces, uCEFTypes;
2017-01-27 16:37:51 +01:00
type
2017-03-16 19:09:42 +01:00
TCefWriteHandlerOwn = class(TCefBaseRefCountedOwn, ICefWriteHandler)
2017-07-18 17:50:28 +02:00
protected
function Write(const ptr: Pointer; size, n: NativeUInt): NativeUInt; virtual;
function Seek(offset: Int64; whence: Integer): Integer; virtual;
function Tell: Int64; virtual;
function Flush: Integer; virtual;
function MayBlock: Boolean; virtual;
public
constructor Create; virtual;
end;
TCefBytesWriteHandler = class(TCefWriteHandlerOwn)
protected
FCriticalSection : TRTLCriticalSection;
FGrow : NativeUInt;
FBuffer : Pointer;
FBufferSize : int64;
FOffset : int64;
2017-07-18 17:50:28 +02:00
function Grow(size : NativeUInt) : NativeUInt;
public
constructor Create(aGrow : NativeUInt); reintroduce;
destructor Destroy; override;
function Write(const ptr: Pointer; size, n: NativeUInt): NativeUInt; override;
function Seek(offset: Int64; whence: Integer): Integer; override;
function Tell: Int64; override;
function Flush: Integer; override;
function MayBlock: Boolean; override;
function GetData : pointer;
function GetDataSize : int64;
2017-01-27 16:37:51 +01:00
end;
implementation
uses
2025-12-29 19:05:51 +01:00
uCEFMiscFunctions;
2017-01-27 16:37:51 +01:00
2017-07-18 17:50:28 +02:00
// *******************************************
// *********** TCefWriteHandlerOwn ***********
// *******************************************
2018-03-29 20:02:04 +02:00
function cef_write_handler_write( self : PCefWriteHandler;
const ptr : Pointer;
size : NativeUInt;
n : NativeUInt): NativeUInt; stdcall;
var
TempObject : TObject;
2017-01-27 16:37:51 +01:00
begin
2018-03-29 20:02:04 +02:00
Result := 0;
TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefWriteHandlerOwn) then
Result:= TCefWriteHandlerOwn(TempObject).Write(ptr,
size,
n);
2017-01-27 16:37:51 +01:00
end;
2018-03-29 20:02:04 +02:00
function cef_write_handler_seek(self : PCefWriteHandler;
offset : Int64;
whence : Integer): Integer; stdcall;
var
TempObject : TObject;
2017-01-27 16:37:51 +01:00
begin
2018-03-29 20:02:04 +02:00
Result := 0;
TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefWriteHandlerOwn) then
Result:= TCefWriteHandlerOwn(TempObject).Seek(offset,
whence);
2017-01-27 16:37:51 +01:00
end;
function cef_write_handler_tell(self: PCefWriteHandler): Int64; stdcall;
2018-03-29 20:02:04 +02:00
var
TempObject : TObject;
2017-01-27 16:37:51 +01:00
begin
2018-03-29 20:02:04 +02:00
Result := 0;
TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefWriteHandlerOwn) then
Result:= TCefWriteHandlerOwn(TempObject).Tell;
2017-01-27 16:37:51 +01:00
end;
function cef_write_handler_flush(self: PCefWriteHandler): Integer; stdcall;
2018-03-29 20:02:04 +02:00
var
TempObject : TObject;
2017-01-27 16:37:51 +01:00
begin
2018-03-29 20:02:04 +02:00
Result := 0;
TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefWriteHandlerOwn) then
Result:= TCefWriteHandlerOwn(TempObject).Flush;
2017-01-27 16:37:51 +01:00
end;
function cef_write_handler_may_block(self: PCefWriteHandler): Integer; stdcall;
2018-03-29 20:02:04 +02:00
var
TempObject : TObject;
TempResult : boolean;
2017-01-27 16:37:51 +01:00
begin
TempResult := False;
2018-03-29 20:02:04 +02:00
TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefWriteHandlerOwn) then
TempResult := TCefWriteHandlerOwn(TempObject).MayBlock;
Result := Ord(TempResult);
2017-01-27 16:37:51 +01:00
end;
constructor TCefWriteHandlerOwn.Create;
begin
inherited CreateData(SizeOf(TCefWriteHandler));
2017-07-18 17:50:28 +02:00
2017-01-27 16:37:51 +01:00
with PCefWriteHandler(FData)^ do
2017-07-18 17:50:28 +02:00
begin
write := {$IFDEF FPC}@{$ENDIF}cef_write_handler_write;
seek := {$IFDEF FPC}@{$ENDIF}cef_write_handler_seek;
tell := {$IFDEF FPC}@{$ENDIF}cef_write_handler_tell;
flush := {$IFDEF FPC}@{$ENDIF}cef_write_handler_flush;
may_block := {$IFDEF FPC}@{$ENDIF}cef_write_handler_may_block;
2017-07-18 17:50:28 +02:00
end;
2017-01-27 16:37:51 +01:00
end;
function TCefWriteHandlerOwn.Flush: Integer;
begin
Result := 0;
end;
function TCefWriteHandlerOwn.MayBlock: Boolean;
begin
Result := False;
end;
function TCefWriteHandlerOwn.Seek(offset: Int64; whence: Integer): Integer;
begin
Result := 0;
end;
function TCefWriteHandlerOwn.Tell: Int64;
begin
Result := 0;
end;
2017-07-18 17:50:28 +02:00
function TCefWriteHandlerOwn.Write(const ptr: Pointer; size, n: NativeUInt): NativeUInt;
2017-01-27 16:37:51 +01:00
begin
Result := 0;
end;
2017-07-18 17:50:28 +02:00
// *******************************************
// ********** TCefBytesWriteHandler **********
// *******************************************
constructor TCefBytesWriteHandler.Create(aGrow : NativeUInt);
begin
inherited Create;
2019-01-08 19:15:25 +01:00
{$IFDEF MSWINDOWS}
2017-07-18 17:50:28 +02:00
InitializeCriticalSection(FCriticalSection);
2019-01-08 19:15:25 +01:00
{$ELSE}
InitCriticalSection(FCriticalSection);
{$ENDIF}
FGrow := aGrow;
FBufferSize := aGrow;
FOffset := 0;
2017-07-18 17:50:28 +02:00
GetMem(FBuffer, aGrow);
2017-07-18 17:50:28 +02:00
end;
destructor TCefBytesWriteHandler.Destroy;
begin
if (FBuffer <> nil) then FreeMem(FBuffer);
2017-07-18 17:50:28 +02:00
2019-01-08 19:15:25 +01:00
{$IFDEF MSWINDOWS}
DeleteCriticalSection(FCriticalSection);
FillChar(FCriticalSection, SizeOf(FCriticalSection), 0);
2019-01-08 19:15:25 +01:00
{$ELSE}
DoneCriticalSection(FCriticalSection);
{$ENDIF}
2017-07-18 17:50:28 +02:00
inherited Destroy;
end;
function TCefBytesWriteHandler.Write(const ptr: Pointer; size, n: NativeUInt): NativeUInt;
var
TempSize : int64;
TempDest : PByte;
2017-07-18 17:50:28 +02:00
begin
EnterCriticalSection(FCriticalSection);
try
TempSize := size * n;
2017-07-18 17:50:28 +02:00
if (n = 0) or (size = 0) or (ptr = nil) or (TempSize > int64(High(NativeUInt))) or
(((FOffset + TempSize) >= FBufferSize) and (Grow(TempSize) = 0)) then
Result := 0
else
begin
{$IF DEFINED(DELPHI12_UP) or DEFINED(FPC)}
TempDest := PByte(FBuffer) + FOffset;
{$ELSE}
{$warnings off}
{$hints off}
TempDest := PByte(cardinal(FBuffer) + FOffset);
{$hints on}
{$warnings on}
{$IFEND}
Move(ptr^, TempDest^, NativeInt(TempSize));
2017-07-18 17:50:28 +02:00
FOffset := FOffset + TempSize;
Result := n;
end;
finally
LeaveCriticalSection(FCriticalSection);
end;
2017-07-18 17:50:28 +02:00
end;
function TCefBytesWriteHandler.Seek(offset: Int64; whence: Integer): Integer;
const
SEEK_SET = 0;
SEEK_CUR = 1;
SEEK_END = 2;
var
TempAbsOffset : int64;
begin
EnterCriticalSection(FCriticalSection);
Result := -1;
case whence of
SEEK_CUR :
if not((FOffset + offset > FBufferSize) or (FOffset + offset < 0)) then
2017-07-18 17:50:28 +02:00
begin
FOffset := FOffset + offset;
Result := 0;
end;
SEEK_END:
begin
TempAbsOffset := abs(offset);
if not(TempAbsOffset > FBufferSize) then
2017-07-18 17:50:28 +02:00
begin
FOffset := FBufferSize - TempAbsOffset;
2017-07-18 17:50:28 +02:00
Result := 0;
end;
end;
SEEK_SET:
if not((offset > FBufferSize) or (offset < 0)) then
2017-07-18 17:50:28 +02:00
begin
FOffset := offset;
Result := 0;
end;
end;
LeaveCriticalSection(FCriticalSection);
end;
function TCefBytesWriteHandler.Tell: Int64;
begin
EnterCriticalSection(FCriticalSection);
Result := FOffset;
LeaveCriticalSection(FCriticalSection);
end;
function TCefBytesWriteHandler.Flush: Integer;
begin
Result := 0;
end;
function TCefBytesWriteHandler.MayBlock: Boolean;
begin
Result := False;
end;
function TCefBytesWriteHandler.GetData : pointer;
begin
Result := FBuffer;
2017-07-18 17:50:28 +02:00
end;
function TCefBytesWriteHandler.GetDataSize : int64;
begin
Result := FBufferSize;
2017-07-18 17:50:28 +02:00
end;
function TCefBytesWriteHandler.Grow(size : NativeUInt) : NativeUInt;
var
TempTotal : int64;
2017-07-18 17:50:28 +02:00
begin
EnterCriticalSection(FCriticalSection);
try
2018-10-04 21:24:59 +02:00
if (size < FGrow) then
TempTotal := FGrow
else
TempTotal := size;
inc(TempTotal, FBufferSize);
2017-07-18 17:50:28 +02:00
ReallocMem(FBuffer, TempTotal);
2017-07-18 17:50:28 +02:00
FBufferSize := TempTotal;
Result := FBufferSize;
finally
LeaveCriticalSection(FCriticalSection);
end;
2017-07-18 17:50:28 +02:00
end;
2017-01-27 16:37:51 +01:00
end.