BasePacket.pas 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. unit BasePacket;
  2. interface
  3. uses
  4. SysUtils, Classes;
  5. type
  6. TByte = array of Byte;
  7. TBasePacket = class
  8. private
  9. FBuffer: array of byte;
  10. public
  11. class function MajorProto: Byte; virtual;
  12. class function MinorProto: Byte; virtual;
  13. class function UnPack(const Data: Array of Byte): TBasePacket; virtual;
  14. function Pack(var buffer: TByte): Boolean; virtual;
  15. function Dispose: Boolean; virtual;
  16. function GetLength: Cardinal;
  17. end;
  18. TBasePacketClass = TBasePacket;
  19. TPacketManager = class(TInterfacedObject)
  20. private
  21. FClasses: TList;
  22. function IndexOf(const AMajor, AMinor: Byte): Integer;
  23. public
  24. constructor Create;
  25. destructor Destroy; override;
  26. class function Current: TPacketManager;
  27. function GetPacket(const AMajor, AMinor: Byte): TBasePacket;
  28. procedure RegisterClass(AClass: TBasePacketClass);
  29. end;
  30. implementation
  31. uses
  32. LoggerImport, InterfaceLogger;
  33. var
  34. APacketManager: TPacketManager;
  35. { TBasePacket }
  36. function TBasePacket.Dispose: Boolean;
  37. begin
  38. end;
  39. function TBasePacket.GetLength: Cardinal;
  40. begin
  41. Result := Length(FBuffer);
  42. end;
  43. class function TBasePacket.MajorProto: Byte;
  44. begin
  45. Result := $00;
  46. end;
  47. class function TBasePacket.MinorProto: Byte;
  48. begin
  49. Result := $00;
  50. end;
  51. function TBasePacket.Pack(var buffer: TByte): Boolean;
  52. begin
  53. Buffer := TByte(FBuffer);
  54. end;
  55. class function TBasePacket.UnPack(const Data: array of Byte): TBasePacket;
  56. begin
  57. end;
  58. { TPacketManager }
  59. constructor TPacketManager.Create;
  60. begin
  61. FClasses := TList.Create;
  62. end;
  63. class function TPacketManager.Current: TPacketManager;
  64. begin
  65. if APacketManager = nil then
  66. APacketManager := TPacketManager.Create;
  67. Result := APacketManager;
  68. end;
  69. destructor TPacketManager.Destroy;
  70. begin
  71. FreeAndNil(FClasses);
  72. inherited;
  73. end;
  74. function TPacketManager.GetPacket(const AMajor, AMinor: Byte): TBasePacket;
  75. var
  76. i: Integer;
  77. begin
  78. i := IndexOf(AMajor, AMinor);
  79. if i < 0 then
  80. LoggerImport.Error(Format('接收到不能正常解析的数据包!Major:%d Minor: %d',[AMajor, AMinor]), 'TPacketManager.GetPacket');
  81. Result := TBasePacket(FClasses[i]);
  82. end;
  83. function TPacketManager.IndexOf(const AMajor, AMinor: Byte): Integer;
  84. var
  85. i: Integer;
  86. begin
  87. Result := -1;
  88. for I := 0 to FClasses.Count - 1 do
  89. if (TBasePacketClass(FClasses[i]).MajorProto = AMajor) and (TBasePacketClass(FClasses[i]).MajorProto = AMajor) then
  90. begin
  91. Result := i;
  92. Break;
  93. end;
  94. end;
  95. procedure TPacketManager.RegisterClass(AClass: TBasePacketClass);
  96. var
  97. i: Integer;
  98. begin
  99. i := IndexOf(AClass.MajorProto, AClass.MinorProto);
  100. if i >= 0 then
  101. raise Exception.CreateFmt('Major:%d Minor:%d已经被%s注册!', [AClass.MajorProto, AClass.MinorProto, TClass(FClasses[i]).ClassName]);
  102. i := FClasses.IndexOf(AClass);
  103. if i < 0 then
  104. FClasses.Add(AClass);
  105. end;
  106. end.