25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

50 lines
1.2 KiB

  1. package gearman
  2. import (
  3. "os"
  4. )
  5. type ClientJob struct {
  6. Data []byte
  7. Handle string
  8. UniqueId string
  9. magicCode, dataType uint32
  10. }
  11. func NewClientJob(magiccode, datatype uint32, data []byte) (job *ClientJob) {
  12. return &ClientJob{magicCode:magiccode,
  13. dataType:datatype,
  14. Data:data}
  15. }
  16. func DecodeClientJob(data []byte) (job * ClientJob, err os.Error) {
  17. if len(data) < 12 {
  18. err = os.NewError("Data length is too small.")
  19. return
  20. }
  21. datatype := byteToUint32([4]byte{data[4], data[5], data[6], data[7]})
  22. l := byteToUint32([4]byte{data[8], data[9], data[10], data[11]})
  23. if len(data[12:]) != int(l) {
  24. err = os.NewError("Invalid data length.")
  25. return
  26. }
  27. data = data[12:]
  28. job = NewClientJob(RES, datatype, data)
  29. return
  30. }
  31. func (job *ClientJob) Encode() (data []byte) {
  32. magiccode := uint32ToByte(job.magicCode)
  33. datatype := uint32ToByte(job.dataType)
  34. data = make([]byte, 0, 1024 * 64)
  35. data = append(data, magiccode[:] ...)
  36. data = append(data, datatype[:] ...)
  37. data = append(data, []byte{0, 0, 0, 0} ...)
  38. l := len(job.Data)
  39. data = append(data, job.Data ...)
  40. datalength := uint32ToByte(uint32(l))
  41. copy(data[8:12], datalength[:])
  42. return
  43. }