UPacket.cs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using System;
  2. using System.Runtime.InteropServices;
  3. namespace Base
  4. {
  5. internal sealed class UPacket: IDisposable
  6. {
  7. public UPacket(IntPtr packet)
  8. {
  9. this.PacketPtr = packet;
  10. }
  11. public UPacket(byte[] data, PacketFlags flags = PacketFlags.None)
  12. {
  13. if (data == null)
  14. {
  15. throw new ArgumentNullException(nameof(data));
  16. }
  17. this.PacketPtr = NativeMethods.ENetPacketCreate(data, (uint) data.Length, flags);
  18. if (this.PacketPtr == IntPtr.Zero)
  19. {
  20. throw new Exception("Packet creation call failed");
  21. }
  22. }
  23. ~UPacket()
  24. {
  25. this.Dispose(false);
  26. }
  27. public void Dispose()
  28. {
  29. this.Dispose(true);
  30. }
  31. private void Dispose(bool disposing)
  32. {
  33. if (this.PacketPtr == IntPtr.Zero)
  34. {
  35. return;
  36. }
  37. NativeMethods.ENetPacketDestroy(this.PacketPtr);
  38. this.PacketPtr = IntPtr.Zero;
  39. }
  40. private ENetPacket Struct
  41. {
  42. get
  43. {
  44. return (ENetPacket) Marshal.PtrToStructure(this.PacketPtr, typeof (ENetPacket));
  45. }
  46. set
  47. {
  48. Marshal.StructureToPtr(value, this.PacketPtr, false);
  49. }
  50. }
  51. public IntPtr PacketPtr { get; set; }
  52. public byte[] Bytes
  53. {
  54. get
  55. {
  56. ENetPacket enetPacket = this.Struct;
  57. var bytes = new byte[(long) enetPacket.DataLength];
  58. Marshal.Copy(enetPacket.Data, bytes, 0, (int) enetPacket.DataLength);
  59. return bytes;
  60. }
  61. }
  62. }
  63. }