-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclient_bind_feature.go
53 lines (47 loc) · 1.26 KB
/
client_bind_feature.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package xmppcore
import (
"errors"
"github.com/jackal-xmpp/stravaganza/v2"
)
type clientBindFeature struct {
rb ResourceBinder
resource string
IDAble
}
func ClientBindFeature(rb ResourceBinder, resource string) clientBindFeature {
return clientBindFeature{rb: rb, IDAble: CreateIDAble(), resource: resource}
}
func (cbf clientBindFeature) Match(elem stravaganza.Element) bool {
return elem.Name() == "bind" && elem.Attribute("xmlns") == NSBind
}
func (cbf clientBindFeature) Handle(elem stravaganza.Element, part Part) (catched bool, err error) {
if !cbf.Match(elem) {
return false, nil
}
catched = true
var src stravaganza.Element
IqBind{IQ: Stanza{Name: NameIQ, ID: cbf.ID(), Type: TypeSet}, Resource: cbf.resource}.ToElem(&src)
if err = part.Channel().SendElement(src); err != nil {
part.Logger().Printf(LogError, "send bind message error: %s", err.Error())
return
}
if err = part.Channel().NextElement(&elem); err != nil {
return
}
var ie StanzaErr
if e := ie.FromElem(elem, NameIQ); e == nil {
err = ie.Err
}
var ib IqBind
if err = ib.FromElem(elem); err != nil {
return
}
if ib.IQ.ID != cbf.ID() {
err = errors.New("not a bind result")
return
}
var jid JID
ParseJID(ib.JID, &jid)
cbf.rb.BindResource(part, jid.Resource)
return
}