Implement XMPP closing.

This commit is contained in:
Matt Goodall 2012-07-18 16:30:44 +01:00
parent 703012bbb5
commit 8bb5c81347
2 changed files with 21 additions and 0 deletions

View File

@ -95,6 +95,18 @@ func (stream *Stream) SendStart(start *xml.StartElement) (*xml.StartElement, err
return rstart, nil
}
// Send the end element that closes the stream.
func (stream *Stream) SendEnd(end *xml.EndElement) error {
buf := new(bytes.Buffer)
if err := writeXMLEndElement(buf, end); err != nil {
return err
}
if err := stream.send(buf.Bytes()); err != nil {
return err
}
return nil
}
// Send a stanza. Used to write a complete, top-level element.
func (stream *Stream) Send(v interface{}) error {
if stream.config.LogStanzas {

View File

@ -1,6 +1,7 @@
package xmpp
import (
"encoding/xml"
"fmt"
"log"
"sync"
@ -8,6 +9,8 @@ import (
// Handles XMPP conversations over a Stream. Use NewClientXMPP or
// NewComponentXMPP to create and configure a XMPP instance.
// Close the conversation by closing the Out channel, the In channel will be
// closed when the remote server closes its stream.
type XMPP struct {
// JID associated with the stream. Note: this may be negotiated with the
@ -158,9 +161,15 @@ func IqResult(id string) Matcher {
}
func (x *XMPP) sender() {
// Send outgoing elements to the stream until the channel is closed.
for v := range x.Out {
x.stream.Send(v)
}
// Close the stream. Note: relies on common element name for all types of
// XMPP connection.
x.stream.SendEnd(&xml.EndElement{xml.Name{"stream", "stream"}})
}
func (x *XMPP) receiver() {