You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

104 lines
2.4 KiB

  1. package worker
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "fmt"
  6. "strconv"
  7. )
  8. // Worker side job
  9. type inPack struct {
  10. dataType uint32
  11. data []byte
  12. handle, uniqueId, fn string
  13. a *agent
  14. }
  15. // Create a new job
  16. func getInPack() *inPack {
  17. return &inPack{}
  18. }
  19. func (inpack *inPack) Data() []byte {
  20. return inpack.data
  21. }
  22. // Send some datas to client.
  23. // Using this in a job's executing.
  24. func (inpack *inPack) SendData(data []byte) {
  25. outpack := getOutPack()
  26. outpack.dataType = WORK_DATA
  27. hl := len(inpack.handle)
  28. l := hl + len(data) + 1
  29. outpack.data = getBuffer(l)
  30. copy(outpack.data, []byte(inpack.handle))
  31. copy(outpack.data[hl+1:], data)
  32. inpack.a.write(outpack)
  33. }
  34. func (inpack *inPack) SendWarning(data []byte) {
  35. outpack := getOutPack()
  36. outpack.dataType = WORK_WARNING
  37. hl := len(inpack.handle)
  38. l := hl + len(data) + 1
  39. outpack.data = getBuffer(l)
  40. copy(outpack.data, []byte(inpack.handle))
  41. copy(outpack.data[hl+1:], data)
  42. inpack.a.write(outpack)
  43. }
  44. // Update status.
  45. // Tall client how many percent job has been executed.
  46. func (inpack *inPack) UpdateStatus(numerator, denominator int) {
  47. n := []byte(strconv.Itoa(numerator))
  48. d := []byte(strconv.Itoa(denominator))
  49. outpack := getOutPack()
  50. outpack.dataType = WORK_STATUS
  51. hl := len(inpack.handle)
  52. nl := len(n)
  53. dl := len(d)
  54. outpack.data = getBuffer(hl + nl + dl + 3)
  55. copy(outpack.data, []byte(inpack.handle))
  56. copy(outpack.data[hl+1:], n)
  57. copy(outpack.data[hl+nl+2:], d)
  58. inpack.a.write(outpack)
  59. }
  60. // Decode job from byte slice
  61. func decodeInPack(data []byte) (inpack *inPack, l int, err error) {
  62. if len(data) < MIN_PACKET_LEN { // valid package should not less 12 bytes
  63. err = fmt.Errorf("Invalid data: %V", data)
  64. return
  65. }
  66. dl := int(binary.BigEndian.Uint32(data[8:12]))
  67. dt := data[MIN_PACKET_LEN : dl+MIN_PACKET_LEN]
  68. if len(dt) != int(dl) { // length not equal
  69. err = fmt.Errorf("Invalid data: %V", data)
  70. return
  71. }
  72. inpack = getInPack()
  73. inpack.dataType = binary.BigEndian.Uint32(data[4:8])
  74. switch inpack.dataType {
  75. case JOB_ASSIGN:
  76. s := bytes.SplitN(dt, []byte{'\x00'}, 3)
  77. if len(s) == 3 {
  78. inpack.handle = string(s[0])
  79. inpack.fn = string(s[1])
  80. inpack.data = s[2]
  81. }
  82. case JOB_ASSIGN_UNIQ:
  83. s := bytes.SplitN(dt, []byte{'\x00'}, 4)
  84. if len(s) == 4 {
  85. inpack.handle = string(s[0])
  86. inpack.fn = string(s[1])
  87. inpack.uniqueId = string(s[2])
  88. inpack.data = s[3]
  89. }
  90. default:
  91. inpack.data = dt
  92. }
  93. l = dl + MIN_PACKET_LEN
  94. return
  95. }