2013-08-30 12:36:57 +08:00
|
|
|
// Copyright 2011 Xing Xing <mikespook@gmail.com>
|
|
|
|
// All rights reserved.
|
|
|
|
// Use of this source code is governed by a MIT
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package worker
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
2013-08-30 18:01:10 +08:00
|
|
|
"fmt"
|
|
|
|
"encoding/binary"
|
2013-08-30 12:36:57 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
// Worker side job
|
2013-12-20 15:24:22 +08:00
|
|
|
type InPack struct {
|
2013-08-30 18:01:10 +08:00
|
|
|
DataType uint32
|
2013-08-30 12:36:57 +08:00
|
|
|
Data []byte
|
|
|
|
Handle, UniqueId, Fn string
|
2013-12-20 15:24:22 +08:00
|
|
|
a *agent
|
2013-08-30 12:36:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Create a new job
|
2013-12-20 15:24:22 +08:00
|
|
|
func getInPack() (resp *InPack) {
|
|
|
|
return &InPack{}
|
2013-08-30 12:36:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Decode job from byte slice
|
2013-12-20 15:24:22 +08:00
|
|
|
func decodeInPack(data []byte) (resp *InPack, l int, err error) {
|
2013-08-30 18:01:10 +08:00
|
|
|
if len(data) < MIN_PACKET_LEN { // valid package should not less 12 bytes
|
|
|
|
err = fmt.Errorf("Invalid data: %V", data)
|
|
|
|
return
|
2013-08-30 12:36:57 +08:00
|
|
|
}
|
2013-08-30 18:01:10 +08:00
|
|
|
dl := int(binary.BigEndian.Uint32(data[8:12]))
|
|
|
|
dt := data[MIN_PACKET_LEN : dl+MIN_PACKET_LEN]
|
|
|
|
if len(dt) != int(dl) { // length not equal
|
|
|
|
err = fmt.Errorf("Invalid data: %V", data)
|
|
|
|
return
|
2013-08-30 12:36:57 +08:00
|
|
|
}
|
2013-12-20 15:24:22 +08:00
|
|
|
resp = getInPack()
|
2013-08-30 18:01:10 +08:00
|
|
|
resp.DataType = binary.BigEndian.Uint32(data[4:8])
|
|
|
|
switch resp.DataType {
|
|
|
|
case JOB_ASSIGN:
|
|
|
|
s := bytes.SplitN(dt, []byte{'\x00'}, 3)
|
2013-08-30 12:36:57 +08:00
|
|
|
if len(s) == 3 {
|
2013-08-30 18:01:10 +08:00
|
|
|
resp.Handle = string(s[0])
|
|
|
|
resp.Fn = string(s[1])
|
|
|
|
resp.Data = s[2]
|
2013-08-30 12:36:57 +08:00
|
|
|
}
|
2013-08-30 18:01:10 +08:00
|
|
|
case JOB_ASSIGN_UNIQ:
|
|
|
|
s := bytes.SplitN(dt, []byte{'\x00'}, 4)
|
2013-08-30 12:36:57 +08:00
|
|
|
if len(s) == 4 {
|
2013-08-30 18:01:10 +08:00
|
|
|
resp.Handle = string(s[0])
|
|
|
|
resp.Fn = string(s[1])
|
|
|
|
resp.UniqueId = string(s[2])
|
|
|
|
resp.Data = s[3]
|
2013-08-30 12:36:57 +08:00
|
|
|
}
|
2013-08-30 18:01:10 +08:00
|
|
|
default:
|
|
|
|
resp.Data = dt
|
2013-08-30 12:36:57 +08:00
|
|
|
}
|
2013-08-30 18:01:10 +08:00
|
|
|
l = dl + MIN_PACKET_LEN
|
2013-08-30 12:36:57 +08:00
|
|
|
return
|
|
|
|
}
|