| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- unit BasePacket;
- interface
- uses
- SysUtils, Classes;
- type
- TByte = array of Byte;
- TBasePacket = class
- private
- FBuffer: array of byte;
- public
- class function MajorProto: Byte; virtual;
- class function MinorProto: Byte; virtual;
- class function UnPack(const Data: Array of Byte): TBasePacket; virtual;
- function Pack(var buffer: TByte): Boolean; virtual;
- function Dispose: Boolean; virtual;
- function GetLength: Cardinal;
- end;
- TBasePacketClass = TBasePacket;
- TPacketManager = class(TInterfacedObject)
- private
- FClasses: TList;
- function IndexOf(const AMajor, AMinor: Byte): Integer;
- public
- constructor Create;
- destructor Destroy; override;
- class function Current: TPacketManager;
- function GetPacket(const AMajor, AMinor: Byte): TBasePacket;
- procedure RegisterClass(AClass: TBasePacketClass);
- end;
- implementation
- uses
- LoggerImport, InterfaceLogger;
- var
- APacketManager: TPacketManager;
- { TBasePacket }
- function TBasePacket.Dispose: Boolean;
- begin
- end;
- function TBasePacket.GetLength: Cardinal;
- begin
- Result := Length(FBuffer);
- end;
- class function TBasePacket.MajorProto: Byte;
- begin
- Result := $00;
- end;
- class function TBasePacket.MinorProto: Byte;
- begin
- Result := $00;
- end;
- function TBasePacket.Pack(var buffer: TByte): Boolean;
- begin
- Buffer := TByte(FBuffer);
- end;
- class function TBasePacket.UnPack(const Data: array of Byte): TBasePacket;
- begin
- end;
- { TPacketManager }
- constructor TPacketManager.Create;
- begin
- FClasses := TList.Create;
- end;
- class function TPacketManager.Current: TPacketManager;
- begin
- if APacketManager = nil then
- APacketManager := TPacketManager.Create;
- Result := APacketManager;
- end;
- destructor TPacketManager.Destroy;
- begin
- FreeAndNil(FClasses);
- inherited;
- end;
- function TPacketManager.GetPacket(const AMajor, AMinor: Byte): TBasePacket;
- var
- i: Integer;
- begin
- i := IndexOf(AMajor, AMinor);
- if i < 0 then
- LoggerImport.Error(Format('接收到不能正常解析的数据包!Major:%d Minor: %d',[AMajor, AMinor]), 'TPacketManager.GetPacket');
- Result := TBasePacket(FClasses[i]);
- end;
- function TPacketManager.IndexOf(const AMajor, AMinor: Byte): Integer;
- var
- i: Integer;
- begin
- Result := -1;
- for I := 0 to FClasses.Count - 1 do
- if (TBasePacketClass(FClasses[i]).MajorProto = AMajor) and (TBasePacketClass(FClasses[i]).MajorProto = AMajor) then
- begin
- Result := i;
- Break;
- end;
- end;
- procedure TPacketManager.RegisterClass(AClass: TBasePacketClass);
- var
- i: Integer;
- begin
- i := IndexOf(AClass.MajorProto, AClass.MinorProto);
- if i >= 0 then
- raise Exception.CreateFmt('Major:%d Minor:%d已经被%s注册!', [AClass.MajorProto, AClass.MinorProto, TClass(FClasses[i]).ClassName]);
- i := FClasses.IndexOf(AClass);
- if i < 0 then
- FClasses.Add(AClass);
- end;
- end.
|