Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

11 роки тому
11 роки тому
10 роки тому
11 роки тому
10 роки тому
10 роки тому
11 роки тому
11 роки тому
10 роки тому
10 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
11 роки тому
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. }