3 * Common wire marshalling code.
10 "goprotobuf.googlecode.com/hg/proto"
14 ErrUnknownType = os.NewError("Unknown Type in Encode request")
15 ErrObjectTooLarge = os.NewError("Encoded Object exceeds maximum encoding size")
18 /* ugh ugh ugh. As much as I love protocol buffers, not having maps
19 * as a native type is a PAIN IN THE ASS.
21 * Here's some common code to convert my K/V format in protocol
22 * buffers to and from native Go structures.
24 func MapFromProtoJobParameters(parray []*ProtoJobParameter) (mapparam map[string]string) {
25 mapparam = make(map[string]string)
27 for p := range parray {
28 mapparam[*(parray[p].Key)] = *(parray[p].Value)
34 func ProtoJobParametersFromMap(mapparam map[string]string) (parray []*ProtoJobParameter) {
35 parray = make([]*ProtoJobParameter, len(mapparam))
37 for k,v := range mapparam {
38 arg := new(ProtoJobParameter)
39 arg.Key = proto.String(k)
40 arg.Value = proto.String(v)
50 func (p *WirePkt) Decode() (obj interface{}, err os.Error) {
54 /* throw error later... */
55 return nil, ErrMalformedMessage;
58 case TypeIdentifyClient:
59 ic := new(IdentifyClient)
60 err := proto.Unmarshal(p.Payload[0:p.Length], ic)
65 case TypeReadyForTask:
67 /* throw error later... */
68 return nil, ErrMalformedMessage;
72 tr := new(ProtoTaskRequest)
73 err := proto.Unmarshal(p.Payload[0:p.Length], tr)
78 case TypeTaskResponse:
79 tr := new(ProtoTaskResponse)
80 err := proto.Unmarshal(p.Payload[0:p.Length], tr)
85 case TypeAcknowledgement:
86 tr := new(ProtoAcknowledgement)
87 err := proto.Unmarshal(p.Payload[0:p.Length], tr)
93 return nil, ErrUnknownMessage
96 func Encode(obj interface{}) (p *WirePkt, err os.Error) {
100 p.Type = TypeIdentifyClient
101 case *ProtoTaskRequest:
102 p.Type = TypeTaskRequest
103 case *ProtoTaskResponse:
104 p.Type = TypeTaskResponse
105 case *ProtoAcknowledgement:
106 p.Type = TypeAcknowledgement
108 Warn("Encoding unknown type!")
109 return nil, ErrUnknownType
111 p.Payload, err = proto.Marshal(obj)
115 if len(p.Payload) >= 0x10000 {
116 return nil, ErrObjectTooLarge
118 p.Length = uint16(len(p.Payload))
124 func MakeNop() (p *WirePkt) {
133 func MakeIdentifyClient(hostname string) (p *WirePkt) {
134 s := new(IdentifyClient)
135 s.Hostname = proto.String(hostname)
142 func MakeReadyForTask() (p *WirePkt){
144 p.Type = TypeReadyForTask
151 /* We use the failure code for negative acknowledgements */
152 func MakeNack(id uint64) (p *WirePkt) {
153 a := new(ProtoAcknowledgement)
154 a.Id = proto.Uint64(id)
155 a.Response = new(ProtoAcknowledgement_AckType)
156 *(a.Response) = ProtoAcknowledgement_ACK_ERROR
163 // Construct a positive ACK for transmission
164 func MakeAck(id uint64) (p *WirePkt) {
165 a := new(ProtoAcknowledgement)
166 a.Id = proto.Uint64(id)
167 a.Response = new(ProtoAcknowledgement_AckType)
168 *(a.Response) = ProtoAcknowledgement_ACK_OK