📄 msgbaseengine.old.pas
字号:
unit MsgBaseEngine;
{$I MsgVer.inc}
interface
uses
// MsgCommunicator units
MsgMemory,
MsgCompression,
MsgCrypto,
MsgConst,
MsgTypes;
////////////////////////////////////////////////////////////////////////////////
//
// General functions and procedures
//
////////////////////////////////////////////////////////////////////////////////
// compresses and encrypts buffer
procedure CompressAndEncryptBuffer(
const CryptoInfo: TMsgCryptoInfo;
CompressionAlgorithm: Byte;
CompressionMode: Byte;
var Buffer: PChar;
var BufferSize: Integer
);
// decompresses and decrypts buffer; return true if successful
function DecompressAndDecryptBuffer(
const CryptoInfo: TMsgCryptoInfo;
CompressionAlgorithm: Byte;
CompressionMode: Byte;
var Buffer: PChar;
var BufferSize: Integer
): Boolean;
implementation
//------------------------------------------------------------------------------
// compresses and encrypts buffer
//------------------------------------------------------------------------------
procedure CompressAndEncryptBuffer(
const CryptoInfo: TMsgCryptoInfo;
CompressionAlgorithm: Byte;
CompressionMode: Byte;
var Buffer: PChar;
var BufferSize: Integer
);
var
ca: TMsgCompressionAlgorithm1;
OutBuf: PChar;
OutSize: Integer;
NewSize: Integer;
CRC32: Cardinal;
begin
if (BufferSize <= 0) then
Exit;
ca := TMsgCompressionAlgorithm1(CompressionAlgorithm);
if (ca = acaNone) and (CryptoInfo.CryptoAlgorithm = Msg_Cipher_None) then
Exit;
if (ca <> acaNone) then
begin
// compress buffer
MsgInternalCompressBuffer(ca,CompressionMode,Buffer,BufferSize,OutBuf,OutSize);
MemoryManager.FreeAndNilMem(Buffer);
if (CryptoInfo.CryptoAlgorithm = Msg_Cipher_None) then
begin
NewSize := OutSize+SizeOf(BufferSize);
Buffer := MemoryManager.GetMem(NewSize);
Move(BufferSize,Buffer^,SizeOf(BufferSize));
Move(OutBuf^,PChar(Buffer+SizeOf(BufferSize))^,OutSize);
FreeMem(OutBuf);
BufferSize := NewSize;
end
else
begin
NewSize := OutSize+SizeOf(CRC32)+SizeOf(BufferSize);
Buffer := MemoryManager.GetMem(NewSize);
Move(BufferSize,PChar(Buffer+SizeOf(CRC32))^,SizeOf(BufferSize));
Move(OutBuf^,PChar(Buffer+SizeOf(CRC32)+SizeOf(BufferSize))^,OutSize);
FreeMem(OutBuf);
BufferSize := NewSize;
CRC32 := MsgCountCRC(0,PChar(Buffer+SizeOf(CRC32)),BufferSize-SizeOf(CRC32));
Move(CRC32,Buffer^,SizeOf(CRC32));
MsgEncryptBuffer(CryptoInfo,PChar(Buffer+SizeOf(CRC32)),BufferSize-SizeOf(CRC32));
end;
end // compression
else
begin
CRC32 := MsgCountCRC(0,Buffer,BufferSize);
NewSize := BufferSize+SizeOf(CRC32);
OutBuf := MemoryManager.GetMem(NewSize);
Move(Buffer^,PChar(OutBuf + SizeOf(CRC32))^,BufferSize);
MemoryManager.FreeAndNilMem(Buffer);
Buffer := OutBuf;
BufferSize := NewSize;
Move(CRC32,Buffer^,SizeOf(CRC32));
MsgEncryptBuffer(CryptoInfo,PChar(Buffer+SizeOf(CRC32)),BufferSize-SizeOf(CRC32));
end; // no compression, encryption
end; // CompressAndEncryptBuffer
//------------------------------------------------------------------------------
// decompresses and decrypts buffer; return true if successful
//------------------------------------------------------------------------------
function DecompressAndDecryptBuffer(
const CryptoInfo: TMsgCryptoInfo;
CompressionAlgorithm: Byte;
CompressionMode: Byte;
var Buffer: PChar;
var BufferSize: Integer
): Boolean;
var
ca: TMsgCompressionAlgorithm1;
OutBuf: PChar;
OutSize: Integer;
CRC32: Cardinal;
begin
Result := True;
if (BufferSize <= 0) then
Exit;
ca := TMsgCompressionAlgorithm1(CompressionAlgorithm);
if (CryptoInfo.CryptoAlgorithm = Msg_Cipher_None) then
begin
if (ca = acaNone) then
Exit;
end
else
begin
Move(Buffer^,CRC32,SizeOf(CRC32));
MsgDecryptBuffer(CryptoInfo,PChar(Buffer+SizeOf(CRC32)),BufferSize-SizeOf(CRC32));
if (MsgCountCRC(0,PChar(Buffer+SizeOf(CRC32)),BufferSize-SizeOf(CRC32)) <> CRC32) then
Result := False;
end;
if Result then
begin
if (ca <> acaNone) then
begin
if (CryptoInfo.CryptoAlgorithm <> Msg_Cipher_None) then
begin
Move(PChar(Buffer+SizeOf(CRC32))^,OutSize,SizeOf(OutSize));
MsgInternalDecompressBuffer(ca,PChar(Buffer+SizeOf(CRC32)+SizeOf(OutSize)),BufferSize-SizeOf(CRC32)-SizeOf(OutSize),
OutBuf,OutSize);
end
else
begin
Move(Buffer^,OutSize,SizeOf(OutSize));
MsgInternalDecompressBuffer(ca,PChar(Buffer+SizeOf(OutSize)),BufferSize-SizeOf(OutSize),
OutBuf,OutSize);
end;
MemoryManager.FreeAndNilMem(Buffer);
if (OutSize <= 0) then
Result := False
else
begin
Buffer := MemoryManager.GetMem(OutSize);
Move(OutBuf^,Buffer^,OutSize);
FreeMem(OutBuf);
BufferSize := OutSize;
end;
end
else // ca = acaNone
begin
BufferSize := BufferSize-SizeOf(CRC32);
OutBuf := MemoryManager.GetMem(BufferSize);
Move(PChar(Buffer+SizeOf(CRC32))^,OutBuf^,BufferSize);
MemoryManager.FreeAndNilMem(Buffer);
Buffer := OutBuf;
end;
end;
end; // DecompressAndDecryptBuffer
initialization
{$IFDEF DEBUG_LOG_INIT}
aaWriteToLog('MsgBaseEngine> initialized');
{$ENDIF}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -