77 Chardata string `xml:"chardata"` |
79 Chardata string `xml:"chardata"` |
78 Mechanism string `xml:"attr"` |
80 Mechanism string `xml:"attr"` |
79 Any *Unrecognized |
81 Any *Unrecognized |
80 } |
82 } |
81 |
83 |
|
84 type Stanza interface { |
|
85 XName() string |
|
86 XTo() string |
|
87 XFrom() string |
|
88 XId() string |
|
89 XType() string |
|
90 XLang() string |
|
91 XError() *Error |
|
92 XChild() *Unrecognized |
|
93 } |
|
94 |
|
95 type Message struct { |
|
96 To string `xml:"attr"` |
|
97 From string `xml:"attr"` |
|
98 Id string `xml:"attr"` |
|
99 Type string `xml:"attr"` |
|
100 Lang string `xml:"attr"` |
|
101 Error *Error |
|
102 Any *Unrecognized |
|
103 } |
|
104 var _ xml.Marshaler = &Message{} |
|
105 var _ Stanza = &Message{} |
|
106 |
|
107 type Presence struct { |
|
108 To string `xml:"attr"` |
|
109 From string `xml:"attr"` |
|
110 Id string `xml:"attr"` |
|
111 Type string `xml:"attr"` |
|
112 Lang string `xml:"attr"` |
|
113 Error *Error |
|
114 Any *Unrecognized |
|
115 } |
|
116 var _ xml.Marshaler = &Presence{} |
|
117 var _ Stanza = &Presence{} |
|
118 |
|
119 type Iq struct { |
|
120 To string `xml:"attr"` |
|
121 From string `xml:"attr"` |
|
122 Id string `xml:"attr"` |
|
123 Type string `xml:"attr"` |
|
124 Lang string `xml:"attr"` |
|
125 Error *Error |
|
126 Any *Unrecognized |
|
127 } |
|
128 var _ xml.Marshaler = &Iq{} |
|
129 var _ Stanza = &Iq{} |
|
130 |
|
131 type Error struct { |
|
132 Type string `xml:"attr"` |
|
133 Any *Unrecognized |
|
134 } |
|
135 var _ xml.Marshaler = &Error{} |
|
136 |
|
137 // TODO Rename this to something like Generic. |
82 type Unrecognized struct { |
138 type Unrecognized struct { |
83 XMLName xml.Name |
139 XMLName xml.Name |
|
140 Any *Unrecognized |
|
141 Chardata string `xml:"chardata"` |
84 } |
142 } |
85 var _ fmt.Stringer = &Unrecognized{} |
143 var _ fmt.Stringer = &Unrecognized{} |
86 |
144 |
87 func (jid *JID) String() string { |
145 func (jid *JID) String() string { |
88 result := jid.Domain |
146 result := jid.Domain |
89 if jid.Node != nil { |
147 if jid.Node != nil { |
90 result = *jid.Node + "@" + result |
148 result = *jid.Node + "@" + result |
91 } |
149 } |
92 if jid.Resource != nil { |
150 if jid.Resource != "" { |
93 result = result + "/" + *jid.Resource |
151 result = result + "/" + jid.Resource |
94 } |
152 } |
95 return result |
153 return result |
96 } |
154 } |
97 |
155 |
98 func (jid *JID) Set(val string) bool { |
156 func (jid *JID) Set(val string) bool { |
185 io.WriteString(w, `"`) |
239 io.WriteString(w, `"`) |
186 } |
240 } |
187 } |
241 } |
188 |
242 |
189 func (u *Unrecognized) String() string { |
243 func (u *Unrecognized) String() string { |
190 return fmt.Sprintf("unrecognized{%s %s}", u.XMLName.Space, |
244 var sub string |
|
245 if u.Any != nil { |
|
246 sub = u.Any.String() |
|
247 } |
|
248 return fmt.Sprintf("<%s %s>%s%s</%s %s>", u.XMLName.Space, |
|
249 u.XMLName.Local, sub, u.Chardata, u.XMLName.Space, |
191 u.XMLName.Local) |
250 u.XMLName.Local) |
192 } |
251 } |
|
252 |
|
253 func marshalXML(st Stanza) ([]byte, os.Error) { |
|
254 buf := bytes.NewBuffer(nil) |
|
255 buf.WriteString("<") |
|
256 buf.WriteString(st.XName()) |
|
257 if st.XTo() != "" { |
|
258 writeField(buf, "to", st.XTo()) |
|
259 } |
|
260 if st.XFrom() != "" { |
|
261 writeField(buf, "from", st.XFrom()) |
|
262 } |
|
263 if st.XId() != "" { |
|
264 writeField(buf, "id", st.XId()) |
|
265 } |
|
266 if st.XType() != "" { |
|
267 writeField(buf, "type", st.XType()) |
|
268 } |
|
269 if st.XLang() != "" { |
|
270 writeField(buf, "xml:lang", st.XLang()) |
|
271 } |
|
272 buf.WriteString(">") |
|
273 if st.XError() != nil { |
|
274 bytes, _ := st.XError().MarshalXML() |
|
275 buf.WriteString(string(bytes)) |
|
276 } |
|
277 if st.XChild() != nil { |
|
278 xml.Marshal(buf, st.XChild()) |
|
279 } |
|
280 buf.WriteString("</") |
|
281 buf.WriteString(st.XName()) |
|
282 buf.WriteString(">") |
|
283 return buf.Bytes(), nil |
|
284 } |
|
285 |
|
286 func (er *Error) MarshalXML() ([]byte, os.Error) { |
|
287 buf := bytes.NewBuffer(nil) |
|
288 buf.WriteString("<error") |
|
289 writeField(buf, "type", er.Type) |
|
290 buf.WriteString(">") |
|
291 if er.Any != nil { |
|
292 xml.Marshal(buf, er.Any) |
|
293 } |
|
294 buf.WriteString("</error>") |
|
295 return buf.Bytes(), nil |
|
296 } |
|
297 |
|
298 func (m *Message) XName() string { |
|
299 return "message" |
|
300 } |
|
301 |
|
302 func (m *Message) XTo() string { |
|
303 return m.To |
|
304 } |
|
305 |
|
306 func (m *Message) XFrom() string { |
|
307 return m.From |
|
308 } |
|
309 |
|
310 func (m *Message) XId() string { |
|
311 return m.Id |
|
312 } |
|
313 |
|
314 func (m *Message) XType() string { |
|
315 return m.Type |
|
316 } |
|
317 |
|
318 func (m *Message) XLang() string { |
|
319 return m.Lang |
|
320 } |
|
321 |
|
322 func (m *Message) XError() *Error { |
|
323 return m.Error |
|
324 } |
|
325 |
|
326 func (m *Message) XChild() *Unrecognized { |
|
327 return m.Any |
|
328 } |
|
329 |
|
330 func (m *Message) MarshalXML() ([]byte, os.Error) { |
|
331 return marshalXML(m) |
|
332 } |
|
333 |
|
334 func (p *Presence) XName() string { |
|
335 return "presence" |
|
336 } |
|
337 |
|
338 func (p *Presence) XTo() string { |
|
339 return p.To |
|
340 } |
|
341 |
|
342 func (p *Presence) XFrom() string { |
|
343 return p.From |
|
344 } |
|
345 |
|
346 func (p *Presence) XId() string { |
|
347 return p.Id |
|
348 } |
|
349 |
|
350 func (p *Presence) XType() string { |
|
351 return p.Type |
|
352 } |
|
353 |
|
354 func (p *Presence) XLang() string { |
|
355 return p.Lang |
|
356 } |
|
357 |
|
358 func (p *Presence) XError() *Error { |
|
359 return p.Error |
|
360 } |
|
361 |
|
362 func (p *Presence) XChild() *Unrecognized { |
|
363 return p.Any |
|
364 } |
|
365 |
|
366 func (p *Presence) MarshalXML() ([]byte, os.Error) { |
|
367 return marshalXML(p) |
|
368 } |
|
369 |
|
370 func (iq *Iq) XName() string { |
|
371 return "iq" |
|
372 } |
|
373 |
|
374 func (iq *Iq) XTo() string { |
|
375 return iq.To |
|
376 } |
|
377 |
|
378 func (iq *Iq) XFrom() string { |
|
379 return iq.From |
|
380 } |
|
381 |
|
382 func (iq *Iq) XId() string { |
|
383 return iq.Id |
|
384 } |
|
385 |
|
386 func (iq *Iq) XType() string { |
|
387 return iq.Type |
|
388 } |
|
389 |
|
390 func (iq *Iq) XLang() string { |
|
391 return iq.Lang |
|
392 } |
|
393 |
|
394 func (iq *Iq) XError() *Error { |
|
395 return iq.Error |
|
396 } |
|
397 |
|
398 func (iq *Iq) XChild() *Unrecognized { |
|
399 return iq.Any |
|
400 } |
|
401 |
|
402 func (iq *Iq) MarshalXML() ([]byte, os.Error) { |
|
403 return marshalXML(iq) |
|
404 } |