⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msgbaseengine.old.pas

📁 Delphi MsgCommunicator 2-10 component.I ve used, really good job. can be Server-Client message appl
💻 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 + -