103 lines
2.2 KiB
ObjectPascal
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.
|