packet.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package cli
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "git.nspix.com/golang/micro/helper/unsafestr"
  6. "io"
  7. )
  8. var (
  9. feature = []byte{67, 76, 73}
  10. )
  11. const (
  12. PacketTypeCompleter byte = 0x01
  13. PacketTypeData = 0x02
  14. PacketTypeEcho = 0x03
  15. )
  16. type Frame struct {
  17. Feature []byte
  18. Type byte `json:"type"`
  19. Data []byte `json:"data"`
  20. Error string `json:"error"`
  21. Timestamp int64 `json:"timestamp"`
  22. }
  23. func readFrame(r io.Reader) (frame *Frame, err error) {
  24. var (
  25. n int
  26. dataLength int16
  27. errorLength int16
  28. errBuf []byte
  29. )
  30. frame = &Frame{Feature: make([]byte, 3)}
  31. if _, err = io.ReadFull(r, frame.Feature); err != nil {
  32. return
  33. }
  34. if !bytes.Equal(frame.Feature, feature) {
  35. err = io.ErrUnexpectedEOF
  36. return
  37. }
  38. if err = binary.Read(r, binary.LittleEndian, &frame.Type); err != nil {
  39. return
  40. }
  41. if err = binary.Read(r, binary.LittleEndian, &frame.Timestamp); err != nil {
  42. return
  43. }
  44. if err = binary.Read(r, binary.LittleEndian, &dataLength); err != nil {
  45. return
  46. }
  47. if err = binary.Read(r, binary.LittleEndian, &errorLength); err != nil {
  48. return
  49. }
  50. if dataLength > 0 {
  51. frame.Data = make([]byte, dataLength)
  52. if n, err = io.ReadFull(r, frame.Data); err == nil {
  53. if n < int(dataLength) {
  54. err = io.ErrShortBuffer
  55. }
  56. }
  57. }
  58. if errorLength > 0 {
  59. errBuf = make([]byte, errorLength)
  60. if n, err = io.ReadFull(r, errBuf); err == nil {
  61. if n < int(dataLength) {
  62. err = io.ErrShortBuffer
  63. } else {
  64. frame.Error = unsafestr.BytesToString(errBuf)
  65. }
  66. }
  67. }
  68. return
  69. }
  70. func writeFrame(w io.Writer, frame *Frame) (err error) {
  71. var (
  72. n int
  73. dataLength int16
  74. errorLength int16
  75. errBuf []byte
  76. )
  77. if _, err = w.Write(feature); err != nil {
  78. return
  79. }
  80. if frame.Data != nil {
  81. dataLength = int16(len(frame.Data))
  82. }
  83. if frame.Error != "" {
  84. errBuf = unsafestr.StringToBytes(frame.Error)
  85. errorLength = int16(len(errBuf))
  86. }
  87. if err = binary.Write(w, binary.LittleEndian, frame.Type); err != nil {
  88. return
  89. }
  90. if err = binary.Write(w, binary.LittleEndian, frame.Timestamp); err != nil {
  91. return
  92. }
  93. if err = binary.Write(w, binary.LittleEndian, dataLength); err != nil {
  94. return
  95. }
  96. if err = binary.Write(w, binary.LittleEndian, errorLength); err != nil {
  97. return
  98. }
  99. if dataLength > 0 {
  100. if n, err = w.Write(frame.Data); err == nil {
  101. if n < int(dataLength) {
  102. err = io.ErrShortWrite
  103. }
  104. }
  105. }
  106. if errorLength > 0 {
  107. if n, err = w.Write(errBuf); err == nil {
  108. if n < int(errorLength) {
  109. err = io.ErrShortWrite
  110. }
  111. }
  112. }
  113. return
  114. }