xtool/common/CLS.pas

103 lines
2.2 KiB
ObjectPascal

unit CLS;
interface
uses
System.SysUtils, System.Classes;
type
CLS_CALLBACK = function(Instance: Pointer; callback_operation: Integer;
ptr: Pointer; n: Integer): Integer; cdecl;
CLS_MAIN = function(operation: Integer; Callback: CLS_CALLBACK;
Instance: Pointer): Integer; cdecl;
const
CLS_INIT = 1;
CLS_DONE = 2;
CLS_FLUSH = 6;
CLS_COMPRESS = 3;
CLS_DECOMPRESS = 4;
CLS_PREPARE_METHOD = 5;
CLS_FULL_READ = 4096;
CLS_PARTIAL_READ = 5120;
CLS_FULL_WRITE = 6144;
CLS_PARTIAL_WRITE = 7168;
CLS_MALLOC = 1;
CLS_FREE = 2;
CLS_GET_PARAMSTR = 3;
CLS_SET_PARAMSTR = 4;
CLS_THREADS = 5;
CLS_MEMORY = 6;
CLS_DECOMPRESSION_MEMORY = 7;
CLS_DECOMPRESSOR_VERSION = 8;
CLS_BLOCK = 9;
CLS_EXPAND_DATA = 10;
CLS_ID = 101;
CLS_VERSION = 102;
CLS_THREAD_SAFE = 103;
CLS_OK = 0;
CLS_ERROR_GENERAL = -1;
CLS_ERROR_NOT_IMPLEMENTED = -2;
CLS_ERROR_NOT_ENOUGH_MEMORY = -3;
CLS_ERROR_READ = -4;
CLS_ERROR_WRITE = -5;
CLS_ERROR_ONLY_DECOMPRESS = -6;
CLS_ERROR_INVALID_COMPRESSOR = -7;
CLS_ERROR_BAD_COMPRESSED_DATA = -8;
CLS_ERROR_NO_MORE_DATA_REQUIRED = -9;
CLS_ERROR_OUTBLOCK_TOO_SMALL = -10;
CLS_PARAM_INT = -1;
CLS_PARAM_STRING = -2;
CLS_PARAM_MEMORY_MB = -3;
CLS_MAX_PARAMSTR_SIZE = 256;
CLS_MAX_ERROR_MSG = 256;
type
TCLSStream = class(TStream)
protected
FInstance: Pointer;
FCallback: CLS_CALLBACK;
FDone: Boolean;
public
constructor Create(Callback: CLS_CALLBACK; Instance: Pointer);
function Read(var Buffer; Count: Longint): Longint; override;
function Write(const Buffer; Count: Longint): Longint; override;
end;
implementation
constructor TCLSStream.Create(Callback: CLS_CALLBACK; Instance: Pointer);
begin
inherited Create;
FCallback := Callback;
FInstance := Instance;
FDone := False;
end;
function TCLSStream.Read(var Buffer; Count: Longint): Longint;
begin
Result := FCallback(FInstance, CLS_FULL_READ, @Buffer, Count);
end;
function TCLSStream.Write(const Buffer; Count: Longint): Longint;
begin
Result := FCallback(FInstance, CLS_PARTIAL_WRITE, @Buffer, Count);
if (Result = CLS_ERROR_NO_MORE_DATA_REQUIRED) and (FDone = False) then
begin
Result := Count;
FDone := True;
end
else if Result < 0 then
Result := 0;
end;
end.