Compare commits

...

5 Commits

5 changed files with 71 additions and 3 deletions

13
src/xmpp/ping.go Normal file
View File

@ -0,0 +1,13 @@
package xmpp
import (
"encoding/xml"
)
const (
NSPing = "urn:xmpp:ping"
)
type Ping struct {
XMLName xml.Name `xml:"urn:xmpp:ping ping"`
}

View File

@ -0,0 +1,21 @@
package xmpp
import (
"encoding/xml"
)
const (
NSRemoteRosterManager = "urn:xmpp:tmp:roster-management:0"
RemoteRosterManagerTypeRequest = "request"
RemoteRosterManagerTypeAllowed = "allowed"
RemoteRosterManagerTypeRejected = "rejected"
)
// XEP-0321: Remote Roster Manager
type RemoteRosterManagerQuery struct {
XMLName xml.Name `xml:"urn:xmpp:tmp:roster-management:0 query"`
Reason string `xml:"reason,attr,omitempty"`
Type string `xml:"type,attr"`
}

26
src/xmpp/roster.go Normal file
View File

@ -0,0 +1,26 @@
package xmpp
import (
"encoding/xml"
)
const (
NSRoster = "jabber:iq:roster"
RosterSubscriptionBoth = "both"
RosterSubscriptionFrom = "from"
RosterSubscriptionTo = "to"
RosterSubscriptionRemove = "remove"
)
type RosterQuery struct {
XMLName xml.Name `xml:"jabber:iq:roster query"`
Items []RosterItem `xml:"item"`
}
type RosterItem struct {
JID string `xml:"jid,attr"`
Name string `xml:"name,attr,omitempty"`
Subscription string `xml:"subscription,attr"`
Groupes []string `xml:"group"`
}

View File

@ -189,4 +189,5 @@ var (
ErrorNotAuthorized = ErrorCondition{nsErrorStanzas, "not-authorized"} ErrorNotAuthorized = ErrorCondition{nsErrorStanzas, "not-authorized"}
ErrorConflict = ErrorCondition{nsErrorStanzas, "conflict"} ErrorConflict = ErrorCondition{nsErrorStanzas, "conflict"}
ErrorNotAcceptable = ErrorCondition{nsErrorStanzas, "not-acceptable"} ErrorNotAcceptable = ErrorCondition{nsErrorStanzas, "not-acceptable"}
ErrorForbidden = ErrorCondition{nsErrorStanzas, "forbidden"}
) )

View File

@ -170,12 +170,16 @@ func (x *XMPP) sender() {
// Close the stream. Note: relies on common element name for all types of // Close the stream. Note: relies on common element name for all types of
// XMPP connection. // XMPP connection.
log.Println("Close XMPP stream") log.Println("Close XMPP stream")
x.stream.SendEnd(&xml.EndElement{xml.Name{"stream", "stream"}}) x.Close()
} }
func (x *XMPP) receiver() { func (x *XMPP) receiver() {
defer close(x.In) defer func() {
log.Println("Close XMPP receiver")
x.Close()
close(x.In)
}()
for { for {
start, err := x.stream.Next() start, err := x.stream.Next()
@ -215,8 +219,11 @@ func (x *XMPP) receiver() {
x.In <- v x.In <- v
} }
} }
}
log.Println("Close XMPP receiver") func (x *XMPP) Close() {
log.Println("Close XMPP")
x.stream.SendEnd(&xml.EndElement{xml.Name{"stream", "stream"}})
} }
// BUG(matt): Filter channels are not closed when the stream is closed. // BUG(matt): Filter channels are not closed when the stream is closed.