protocol.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package protocol
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "sparrow/pkg/tlv"
  6. )
  7. type Payload interface {
  8. Marshal() ([]byte, error)
  9. UnMarshal([]byte) error
  10. }
  11. func (c *Command) Marshal() ([]byte, error) {
  12. buffer := new(bytes.Buffer)
  13. err := binary.Write(buffer, binary.BigEndian, c.Head)
  14. if err != nil {
  15. return nil, err
  16. }
  17. for _, param := range c.Params {
  18. err = binary.Write(buffer, binary.BigEndian, param.ToBinary())
  19. if err != nil {
  20. return nil, err
  21. }
  22. }
  23. return buffer.Bytes(), nil
  24. }
  25. func (c *Command) UnMarshal(buf []byte) error {
  26. n := len(buf)
  27. r := bytes.NewReader(buf)
  28. err := binary.Read(r, binary.BigEndian, &c.Head)
  29. if err != nil {
  30. return err
  31. }
  32. c.Params = []tlv.TLV{}
  33. for i := binary.Size(c.Head); i < n; {
  34. tlv := tlv.TLV{}
  35. tlv.FromBinary(r)
  36. i += int(tlv.Length())
  37. c.Params = append(c.Params, tlv)
  38. }
  39. return nil
  40. }
  41. func (e *Event) Marshal() ([]byte, error) {
  42. buffer := new(bytes.Buffer)
  43. err := binary.Write(buffer, binary.BigEndian, e.Head)
  44. if err != nil {
  45. return nil, err
  46. }
  47. for _, param := range e.Params {
  48. err = binary.Write(buffer, binary.BigEndian, param.ToBinary())
  49. if err != nil {
  50. return nil, err
  51. }
  52. }
  53. return buffer.Bytes(), nil
  54. }
  55. func (e *Event) UnMarshal(buf []byte) error {
  56. n := len(buf)
  57. r := bytes.NewReader(buf)
  58. err := binary.Read(r, binary.BigEndian, &e.Head)
  59. if err != nil {
  60. return err
  61. }
  62. e.Params = []tlv.TLV{}
  63. for i := binary.Size(e.Head); i < n; {
  64. tlv := tlv.TLV{}
  65. tlv.FromBinary(r)
  66. i += int(tlv.Length())
  67. e.Params = append(e.Params, tlv)
  68. }
  69. return nil
  70. }
  71. func (d *Data) Marshal() ([]byte, error) {
  72. buffer := new(bytes.Buffer)
  73. err := binary.Write(buffer, binary.BigEndian, d.Head)
  74. if err != nil {
  75. return nil, err
  76. }
  77. for _, sub := range d.SubData {
  78. err = binary.Write(buffer, binary.BigEndian, sub.Head)
  79. if err != nil {
  80. return nil, err
  81. }
  82. for _, param := range sub.Params {
  83. err = binary.Write(buffer, binary.BigEndian, param.ToBinary())
  84. if err != nil {
  85. return nil, err
  86. }
  87. }
  88. }
  89. return buffer.Bytes(), nil
  90. }
  91. func (d *Data) UnMarshal(buf []byte) error {
  92. n := len(buf)
  93. r := bytes.NewReader(buf)
  94. err := binary.Read(r, binary.BigEndian, &d.Head)
  95. if err != nil {
  96. return err
  97. }
  98. d.SubData = []SubData{}
  99. for i := binary.Size(d.Head); i < n; {
  100. sub := SubData{}
  101. err = binary.Read(r, binary.BigEndian, &sub.Head)
  102. if err != nil {
  103. return err
  104. }
  105. i += int(binary.Size(sub.Head))
  106. sub.Params = []tlv.TLV{}
  107. for j := 0; j < int(sub.Head.ParamsCount); j++ {
  108. param := tlv.TLV{}
  109. param.FromBinary(r)
  110. i += int(param.Length())
  111. sub.Params = append(sub.Params, param)
  112. }
  113. d.SubData = append(d.SubData, sub)
  114. }
  115. return nil
  116. }