unit ucustombrowserloader;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils;

const
  LIBNAME = 'libcustombrowser.so';

type
  TInitializeCEF4DelphiFunc = procedure; cdecl;
  TFinalizeCEF4DelphiFunc   = procedure; cdecl;
  TTakeSnapshotFunc         = procedure; cdecl;

  TCustomBrowserLoader = class
    private
      FInitializeCEF4Delphi : TInitializeCEF4DelphiFunc;
      FFinalizeCEF4Delphi   : TFinalizeCEF4DelphiFunc;
      FTakeSnapshot         : TTakeSnapshotFunc;
      FLibHandle            : TLibHandle;
      FLibLoaded            : boolean;

      function  GetLibPath : string;
      function  LoadCEFLibrary: boolean;
      procedure UnloadCEFLibrary;
      procedure InitializeCEF4Delphi;
      procedure FinalizeCEF4Delphi;

    public
      constructor Create;
      procedure AfterConstruction; override;
      procedure BeforeDestruction; override;
      procedure TakeSnapshot;
  end;

var
  GlobalCustomBrowseLoader : TCustomBrowserLoader = nil;

implementation

constructor TCustomBrowserLoader.Create;
begin
  inherited Create;

  FInitializeCEF4Delphi := nil;
  FFinalizeCEF4Delphi   := nil;
  FTakeSnapshot         := nil;
  FLibHandle            := 0;
  FLibLoaded            := False;
end;

procedure TCustomBrowserLoader.AfterConstruction;
begin
  inherited AfterConstruction;

  if LoadCEFLibrary then
    InitializeCEF4Delphi;
end;

procedure TCustomBrowserLoader.BeforeDestruction;
begin
  FinalizeCEF4Delphi;
  UnloadCEFLibrary;

  inherited BeforeDestruction;
end;

function TCustomBrowserLoader.LoadCEFLibrary: boolean;
begin
  Result     := False;
  FLibHandle := LoadLibrary(GetLibPath());

  if (FLibHandle <> 0) then
    begin
      Pointer(FInitializeCEF4Delphi) := GetProcAddress(FLibHandle, 'InitializeCEF4Delphi');
      Pointer(FFinalizeCEF4Delphi)   := GetProcAddress(FLibHandle, 'FinalizeCEF4Delphi');
      Pointer(FTakeSnapshot)         := GetProcAddress(FLibHandle, 'TakeSnapshot');

      FLibLoaded := assigned(FInitializeCEF4Delphi) and
                    assigned(FFinalizeCEF4Delphi) and
                    assigned(FTakeSnapshot);

      Result := FLibLoaded;
    end;
end;

function TCustomBrowserLoader.GetLibPath : string;
begin
  Result := IncludeTrailingPathDelimiter(ExtractFileDir(ParamStr(0))) + LIBNAME;
end;

procedure TCustomBrowserLoader.UnloadCEFLibrary;
begin
  if FLibLoaded then
    FreeLibrary(FLibHandle);
end;

procedure TCustomBrowserLoader.InitializeCEF4Delphi;
begin
  if FLibLoaded then
    FInitializeCEF4Delphi();
end;

procedure TCustomBrowserLoader.FinalizeCEF4Delphi;
begin
  if FLibLoaded then
    FFinalizeCEF4Delphi();
end;

procedure TCustomBrowserLoader.TakeSnapshot;
begin
  if FLibLoaded then
    FTakeSnapshot();
end;

end.