diff -r 000000000000 -r 6dbd969c8f3a xmpp.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xmpp.go Fri Dec 23 22:44:51 2011 -0700 @@ -0,0 +1,113 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This package implements a simple XMPP client according to RFCs 3920 +// and 3921, plus the various XEPs at http://xmpp.org/protocols/. +package xmpp + +import ( + "bytes" + "fmt" + "io" + "os" + "xml" +) + +const ( + // Version of RFC 3920 that we implement. + Version = "1.0" + nsStreams = "urn:ietf:params:xml:ns:xmpp-streams" +) + +// JID represents an entity that can communicate with other +// entities. It looks like node@domain/resource. Node and resource are +// sometimes optional. +type JID struct { + Node *string + Domain string + Resource *string +} +var _ fmt.Stringer = &JID{} + +// XMPP's XML element +type Stream struct { + to string `xml:"attr"` + from string `xml:"attr"` + id string `xml:"attr"` + lang string `xml:"attr"` + version string `xml:"attr"` +} +var _ xml.Marshaler = &Stream{} + +type StreamError struct { + cond definedCondition + text errText +} +var _ xml.Marshaler = &StreamError{} + +type definedCondition struct { + // Must always be in namespace nsStreams + XMLName xml.Name +} + +type errText struct { + XMLName xml.Name + Lang string + text string `xml:"chardata"` +} +var _ xml.Marshaler = &errText{} + +func (jid *JID) String() string { + result := jid.Domain + if jid.Node != nil { + result = *jid.Node + "@" + result + } + if jid.Resource != nil { + result = result + "/" + *jid.Resource + } + return result +} + +func (s *Stream) MarshalXML() ([]byte, os.Error) { + buf := bytes.NewBuffer(nil) + buf.WriteString("") + // We never write + return buf.Bytes(), nil +} + +func (s *StreamError) MarshalXML() ([]byte, os.Error) { + buf := bytes.NewBuffer(nil) + buf.WriteString("") + xml.Marshal(buf, s.cond) + xml.Marshal(buf, s.text) + buf.WriteString("") + return buf.Bytes(), nil +} + +func (e *errText) MarshalXML() ([]byte, os.Error) { + buf := bytes.NewBuffer(nil) + buf.WriteString("") + xml.Escape(buf, []byte(e.text)) + buf.WriteString("") + return buf.Bytes(), nil +} + +func writeField(w io.Writer, field, value string) { + if value != "" { + io.WriteString(w, " ") + io.WriteString(w, field) + io.WriteString(w, `="`) + xml.Escape(w, []byte(value)) + io.WriteString(w, `"`) + } +}