structs.go
changeset 126 367e76b3028e
parent 125 f464f14e39a7
child 127 a8f9a0c07fc8
--- a/structs.go	Mon Sep 02 20:46:23 2013 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,276 +0,0 @@
-// 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.
-
-package xmpp
-
-// This file contains data structures.
-
-import (
-	"bytes"
-	"encoding/xml"
-	"flag"
-	"fmt"
-	// BUG(cjyar): Doesn't use stringprep. Could try the implementation at
-	// "code.google.com/p/go-idn/src/stringprep"
-	"regexp"
-	"strings"
-)
-
-// 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{}
-var _ flag.Value = &JID{}
-
-// XMPP's <stream:stream> XML element
-type stream struct {
-	XMLName xml.Name `xml:"stream=http://etherx.jabber.org/streams stream"`
-	To      string   `xml:"to,attr"`
-	From    string   `xml:"from,attr"`
-	Id      string   `xml:"id,attr"`
-	Lang    string   `xml:"http://www.w3.org/XML/1998/namespace lang,attr"`
-	Version string   `xml:"version,attr"`
-}
-
-var _ fmt.Stringer = &stream{}
-
-// <stream:error>
-type streamError struct {
-	XMLName xml.Name `xml:"http://etherx.jabber.org/streams error"`
-	Any     Generic  `xml:",any"`
-	Text    *errText
-}
-
-type errText struct {
-	XMLName xml.Name `xml:"urn:ietf:params:xml:ns:xmpp-streams text"`
-	Lang    string   `xml:"http://www.w3.org/XML/1998/namespace lang,attr"`
-	Text    string   `xml:",chardata"`
-}
-
-type Features struct {
-	Starttls   *starttls `xml:"urn:ietf:params:xml:ns:xmpp-tls starttls"`
-	Mechanisms mechs     `xml:"urn:ietf:params:xml:ns:xmpp-sasl mechanisms"`
-	Bind       *bindIq
-	Session    *Generic
-	Any        *Generic
-}
-
-type starttls struct {
-	XMLName  xml.Name
-	Required *string
-}
-
-type mechs struct {
-	Mechanism []string `xml:"urn:ietf:params:xml:ns:xmpp-sasl mechanism"`
-}
-
-type auth struct {
-	XMLName   xml.Name
-	Chardata  string `xml:",chardata"`
-	Mechanism string `xml:"mechanism,attr,omitempty"`
-	Any       *Generic
-}
-
-type Stanza interface {
-	GetHeader() *Header
-}
-
-// One of the three core XMPP stanza types: iq, message, presence. See
-// RFC3920, section 9.
-type Header struct {
-	To       string `xml:"to,attr,omitempty"`
-	From     string `xml:"from,attr,omitempty"`
-	Id       string `xml:"id,attr,omitempty"`
-	Type     string `xml:"type,attr,omitempty"`
-	Lang     string `xml:"http://www.w3.org/XML/1998/namespace lang,attr,omitempty"`
-	Innerxml string `xml:",innerxml"`
-	Error    *Error
-	Nested   []interface{}
-}
-
-// message stanza
-type Message struct {
-	XMLName xml.Name `xml:"jabber:client message"`
-	Header
-	Subject *Generic `xml:"jabber:client subject"`
-	Body    *Generic `xml:"jabber:client body"`
-	Thread  *Generic `xml:"jabber:client thread"`
-}
-
-var _ Stanza = &Message{}
-
-// presence stanza
-type Presence struct {
-	XMLName xml.Name `xml:"presence"`
-	Header
-	Show     *Generic `xml:"jabber:client show"`
-	Status   *Generic `xml:"jabber:client status"`
-	Priority *Generic `xml:"jabber:client priority"`
-}
-
-var _ Stanza = &Presence{}
-
-// iq stanza
-type Iq struct {
-	XMLName xml.Name `xml:"iq"`
-	Header
-}
-
-var _ Stanza = &Iq{}
-
-// Describes an XMPP stanza error. See RFC 3920, Section 9.3.
-type Error struct {
-	XMLName xml.Name `xml:"error"`
-	// The error type attribute.
-	Type string `xml:"type,attr"`
-	// Any nested element, if present.
-	Any *Generic
-}
-
-var _ error = &Error{}
-
-// Used for resource binding as a nested element inside <iq/>.
-type bindIq struct {
-	XMLName  xml.Name `xml:"urn:ietf:params:xml:ns:xmpp-bind bind"`
-	Resource *string  `xml:"resource"`
-	Jid      *string  `xml:"jid"`
-}
-
-// Holds an XML element not described by the more specific types.
-type Generic struct {
-	XMLName  xml.Name
-	Any      *Generic `xml:",any"`
-	Chardata string   `xml:",chardata"`
-}
-
-var _ fmt.Stringer = &Generic{}
-
-func (jid *JID) String() string {
-	result := jid.Domain
-	if jid.Node != "" {
-		result = jid.Node + "@" + result
-	}
-	if jid.Resource != "" {
-		result = result + "/" + jid.Resource
-	}
-	return result
-}
-
-// Set implements flag.Value. It returns true if it successfully
-// parses the string.
-func (jid *JID) Set(val string) error {
-	r := regexp.MustCompile("^(([^@/]+)@)?([^@/]+)(/([^@/]+))?$")
-	parts := r.FindStringSubmatch(val)
-	if parts == nil {
-		return fmt.Errorf("%s doesn't match user@domain/resource", val)
-	}
-	// jid.Node = stringprep.Nodeprep(parts[2])
-	// jid.Domain = stringprep.Nodeprep(parts[3])
-	// jid.Resource = stringprep.Resourceprep(parts[5])
-	jid.Node = parts[2]
-	jid.Domain = parts[3]
-	jid.Resource = parts[5]
-	return nil
-}
-
-func (s *stream) String() string {
-	var buf bytes.Buffer
-	buf.WriteString(`<stream:stream xmlns="`)
-	buf.WriteString(NsClient)
-	buf.WriteString(`" xmlns:stream="`)
-	buf.WriteString(NsStream)
-	buf.WriteString(`"`)
-	if s.To != "" {
-		buf.WriteString(` to="`)
-		xml.Escape(&buf, []byte(s.To))
-		buf.WriteString(`"`)
-	}
-	if s.From != "" {
-		buf.WriteString(` from="`)
-		xml.Escape(&buf, []byte(s.From))
-		buf.WriteString(`"`)
-	}
-	if s.Id != "" {
-		buf.WriteString(` id="`)
-		xml.Escape(&buf, []byte(s.Id))
-		buf.WriteString(`"`)
-	}
-	if s.Lang != "" {
-		buf.WriteString(` xml:lang="`)
-		xml.Escape(&buf, []byte(s.Lang))
-		buf.WriteString(`"`)
-	}
-	if s.Version != "" {
-		buf.WriteString(` version="`)
-		xml.Escape(&buf, []byte(s.Version))
-		buf.WriteString(`"`)
-	}
-	buf.WriteString(">")
-	return buf.String()
-}
-
-func parseStream(se xml.StartElement) (*stream, error) {
-	s := &stream{}
-	for _, attr := range se.Attr {
-		switch strings.ToLower(attr.Name.Local) {
-		case "to":
-			s.To = attr.Value
-		case "from":
-			s.From = attr.Value
-		case "id":
-			s.Id = attr.Value
-		case "lang":
-			s.Lang = attr.Value
-		case "version":
-			s.Version = attr.Value
-		}
-	}
-	return s, nil
-}
-
-func (iq *Iq) GetHeader() *Header {
-	return &iq.Header
-}
-
-func (m *Message) GetHeader() *Header {
-	return &m.Header
-}
-
-func (p *Presence) GetHeader() *Header {
-	return &p.Header
-}
-
-func (u *Generic) String() string {
-	if u == nil {
-		return "nil"
-	}
-	var sub string
-	if u.Any != nil {
-		sub = u.Any.String()
-	}
-	return fmt.Sprintf("<%s %s>%s%s</%s %s>", u.XMLName.Space,
-		u.XMLName.Local, sub, u.Chardata, u.XMLName.Space,
-		u.XMLName.Local)
-}
-
-func (er *Error) Error() string {
-	buf, err := xml.Marshal(er)
-	if err != nil {
-		Warn.Log("double bad error: couldn't marshal error")
-		return "unreadable error"
-	}
-	return string(buf)
-}
-
-var bindExt Extension = Extension{StanzaHandlers: map[string]func(*xml.Name) interface{}{NsBind: newBind}}
-
-func newBind(name *xml.Name) interface{} {
-	return &bindIq{}
-}