author | Chris Jones <christian.jones@sri.com> |
Sat, 07 Sep 2013 11:19:29 -0700 | |
changeset 128 | 8342afcffc92 |
parent 126 | 367e76b3028e |
child 134 | 80b764fa2f08 |
permissions | -rw-r--r-- |
36
9fe022261dcc
Added a capability to use extensions. There are still some bugs with
Chris Jones <chris@cjones.org>
parents:
diff
changeset
|
1 |
// Copyright 2011 The Go Authors. All rights reserved. |
9fe022261dcc
Added a capability to use extensions. There are still some bugs with
Chris Jones <chris@cjones.org>
parents:
diff
changeset
|
2 |
// Use of this source code is governed by a BSD-style |
9fe022261dcc
Added a capability to use extensions. There are still some bugs with
Chris Jones <chris@cjones.org>
parents:
diff
changeset
|
3 |
// license that can be found in the LICENSE file. |
9fe022261dcc
Added a capability to use extensions. There are still some bugs with
Chris Jones <chris@cjones.org>
parents:
diff
changeset
|
4 |
|
9fe022261dcc
Added a capability to use extensions. There are still some bugs with
Chris Jones <chris@cjones.org>
parents:
diff
changeset
|
5 |
package xmpp |
9fe022261dcc
Added a capability to use extensions. There are still some bugs with
Chris Jones <chris@cjones.org>
parents:
diff
changeset
|
6 |
|
121
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
7 |
// This file contains support for roster management, RFC 3921, Section 7. |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
8 |
|
36
9fe022261dcc
Added a capability to use extensions. There are still some bugs with
Chris Jones <chris@cjones.org>
parents:
diff
changeset
|
9 |
import ( |
98
c9cc4eda6dce
Updated for Go 1.0 + upcoming XML fixes.
Chris Jones <chris@cjones.org>
parents:
72
diff
changeset
|
10 |
"encoding/xml" |
128
8342afcffc92
Use reflection instead of constructor functions to create extended stanza structures.
Chris Jones <christian.jones@sri.com>
parents:
126
diff
changeset
|
11 |
"reflect" |
36
9fe022261dcc
Added a capability to use extensions. There are still some bugs with
Chris Jones <chris@cjones.org>
parents:
diff
changeset
|
12 |
) |
9fe022261dcc
Added a capability to use extensions. There are still some bugs with
Chris Jones <chris@cjones.org>
parents:
diff
changeset
|
13 |
|
9fe022261dcc
Added a capability to use extensions. There are still some bugs with
Chris Jones <chris@cjones.org>
parents:
diff
changeset
|
14 |
// Roster query/result |
9fe022261dcc
Added a capability to use extensions. There are still some bugs with
Chris Jones <chris@cjones.org>
parents:
diff
changeset
|
15 |
type RosterQuery struct { |
116 | 16 |
XMLName xml.Name `xml:"jabber:iq:roster query"` |
98
c9cc4eda6dce
Updated for Go 1.0 + upcoming XML fixes.
Chris Jones <chris@cjones.org>
parents:
72
diff
changeset
|
17 |
Item []RosterItem `xml:"item"` |
36
9fe022261dcc
Added a capability to use extensions. There are still some bugs with
Chris Jones <chris@cjones.org>
parents:
diff
changeset
|
18 |
} |
9fe022261dcc
Added a capability to use extensions. There are still some bugs with
Chris Jones <chris@cjones.org>
parents:
diff
changeset
|
19 |
|
9fe022261dcc
Added a capability to use extensions. There are still some bugs with
Chris Jones <chris@cjones.org>
parents:
diff
changeset
|
20 |
// See RFC 3921, Section 7.1. |
9fe022261dcc
Added a capability to use extensions. There are still some bugs with
Chris Jones <chris@cjones.org>
parents:
diff
changeset
|
21 |
type RosterItem struct { |
98
c9cc4eda6dce
Updated for Go 1.0 + upcoming XML fixes.
Chris Jones <chris@cjones.org>
parents:
72
diff
changeset
|
22 |
XMLName xml.Name `xml:"jabber:iq:roster item"` |
c9cc4eda6dce
Updated for Go 1.0 + upcoming XML fixes.
Chris Jones <chris@cjones.org>
parents:
72
diff
changeset
|
23 |
Jid string `xml:"jid,attr"` |
c9cc4eda6dce
Updated for Go 1.0 + upcoming XML fixes.
Chris Jones <chris@cjones.org>
parents:
72
diff
changeset
|
24 |
Subscription string `xml:"subscription,attr"` |
c9cc4eda6dce
Updated for Go 1.0 + upcoming XML fixes.
Chris Jones <chris@cjones.org>
parents:
72
diff
changeset
|
25 |
Name string `xml:"name,attr"` |
72 | 26 |
Group []string |
36
9fe022261dcc
Added a capability to use extensions. There are still some bugs with
Chris Jones <chris@cjones.org>
parents:
diff
changeset
|
27 |
} |
9fe022261dcc
Added a capability to use extensions. There are still some bugs with
Chris Jones <chris@cjones.org>
parents:
diff
changeset
|
28 |
|
121
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
29 |
type rosterCb struct { |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
30 |
id string |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
31 |
cb func() |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
32 |
} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
33 |
|
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
34 |
type Roster struct { |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
35 |
Extension |
128
8342afcffc92
Use reflection instead of constructor functions to create extended stanza structures.
Chris Jones <christian.jones@sri.com>
parents:
126
diff
changeset
|
36 |
get chan []RosterItem |
121
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
37 |
callbacks chan rosterCb |
128
8342afcffc92
Use reflection instead of constructor functions to create extended stanza structures.
Chris Jones <christian.jones@sri.com>
parents:
126
diff
changeset
|
38 |
toServer chan Stanza |
121
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
39 |
} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
40 |
|
57
e6cb3f049137
Revamped how the roster works. We're now using a channel to transmit snapshots
Chris Jones <chris@cjones.org>
parents:
55
diff
changeset
|
41 |
type rosterClient struct { |
72 | 42 |
rosterChan <-chan []RosterItem |
57
e6cb3f049137
Revamped how the roster works. We're now using a channel to transmit snapshots
Chris Jones <chris@cjones.org>
parents:
55
diff
changeset
|
43 |
rosterUpdate chan<- RosterItem |
e6cb3f049137
Revamped how the roster works. We're now using a channel to transmit snapshots
Chris Jones <chris@cjones.org>
parents:
55
diff
changeset
|
44 |
} |
e6cb3f049137
Revamped how the roster works. We're now using a channel to transmit snapshots
Chris Jones <chris@cjones.org>
parents:
55
diff
changeset
|
45 |
|
121
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
46 |
func (r *Roster) rosterMgr(upd <-chan Stanza) { |
72 | 47 |
roster := make(map[string]RosterItem) |
121
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
48 |
waits := make(map[string]func()) |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
49 |
var snapshot []RosterItem |
57
e6cb3f049137
Revamped how the roster works. We're now using a channel to transmit snapshots
Chris Jones <chris@cjones.org>
parents:
55
diff
changeset
|
50 |
for { |
e6cb3f049137
Revamped how the roster works. We're now using a channel to transmit snapshots
Chris Jones <chris@cjones.org>
parents:
55
diff
changeset
|
51 |
select { |
128
8342afcffc92
Use reflection instead of constructor functions to create extended stanza structures.
Chris Jones <christian.jones@sri.com>
parents:
126
diff
changeset
|
52 |
case stan, ok := <-upd: |
121
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
53 |
if !ok { |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
54 |
return |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
55 |
} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
56 |
hdr := stan.GetHeader() |
128
8342afcffc92
Use reflection instead of constructor functions to create extended stanza structures.
Chris Jones <christian.jones@sri.com>
parents:
126
diff
changeset
|
57 |
if f := waits[hdr.Id]; f != nil { |
121
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
58 |
delete(waits, hdr.Id) |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
59 |
f() |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
60 |
} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
61 |
iq, ok := stan.(*Iq) |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
62 |
if iq.Type != "set" { |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
63 |
continue |
57
e6cb3f049137
Revamped how the roster works. We're now using a channel to transmit snapshots
Chris Jones <chris@cjones.org>
parents:
55
diff
changeset
|
64 |
} |
121
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
65 |
var rq *RosterQuery |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
66 |
for _, ele := range iq.Nested { |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
67 |
if q, ok := ele.(*RosterQuery); ok { |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
68 |
rq = q |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
69 |
break |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
70 |
} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
71 |
} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
72 |
if rq == nil { |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
73 |
continue |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
74 |
} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
75 |
for _, item := range rq.Item { |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
76 |
roster[item.Jid] = item |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
77 |
} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
78 |
snapshot = []RosterItem{} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
79 |
for _, ri := range roster { |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
80 |
snapshot = append(snapshot, ri) |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
81 |
} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
82 |
case r.get <- snapshot: |
128
8342afcffc92
Use reflection instead of constructor functions to create extended stanza structures.
Chris Jones <christian.jones@sri.com>
parents:
126
diff
changeset
|
83 |
case cb := <-r.callbacks: |
121
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
84 |
waits[cb.id] = cb.cb |
57
e6cb3f049137
Revamped how the roster works. We're now using a channel to transmit snapshots
Chris Jones <chris@cjones.org>
parents:
55
diff
changeset
|
85 |
} |
e6cb3f049137
Revamped how the roster works. We're now using a channel to transmit snapshots
Chris Jones <chris@cjones.org>
parents:
55
diff
changeset
|
86 |
} |
e6cb3f049137
Revamped how the roster works. We're now using a channel to transmit snapshots
Chris Jones <chris@cjones.org>
parents:
55
diff
changeset
|
87 |
} |
e6cb3f049137
Revamped how the roster works. We're now using a channel to transmit snapshots
Chris Jones <chris@cjones.org>
parents:
55
diff
changeset
|
88 |
|
121
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
89 |
func (r *Roster) makeFilters() (Filter, Filter) { |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
90 |
rosterUpdate := make(chan Stanza) |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
91 |
go r.rosterMgr(rosterUpdate) |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
92 |
recv := func(in <-chan Stanza, out chan<- Stanza) { |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
93 |
defer close(out) |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
94 |
for stan := range in { |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
95 |
rosterUpdate <- stan |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
96 |
out <- stan |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
97 |
} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
98 |
} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
99 |
send := func(in <-chan Stanza, out chan<- Stanza) { |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
100 |
defer close(out) |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
101 |
for { |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
102 |
select { |
128
8342afcffc92
Use reflection instead of constructor functions to create extended stanza structures.
Chris Jones <christian.jones@sri.com>
parents:
126
diff
changeset
|
103 |
case stan, ok := <-in: |
121
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
104 |
if !ok { |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
105 |
return |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
106 |
} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
107 |
out <- stan |
128
8342afcffc92
Use reflection instead of constructor functions to create extended stanza structures.
Chris Jones <christian.jones@sri.com>
parents:
126
diff
changeset
|
108 |
case stan := <-r.toServer: |
121
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
109 |
out <- stan |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
110 |
} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
111 |
} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
112 |
} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
113 |
return recv, send |
57
e6cb3f049137
Revamped how the roster works. We're now using a channel to transmit snapshots
Chris Jones <chris@cjones.org>
parents:
55
diff
changeset
|
114 |
} |
121
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
115 |
|
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
116 |
func newRosterExt() *Roster { |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
117 |
r := Roster{} |
128
8342afcffc92
Use reflection instead of constructor functions to create extended stanza structures.
Chris Jones <christian.jones@sri.com>
parents:
126
diff
changeset
|
118 |
r.StanzaHandlers = make(map[xml.Name]reflect.Type) |
8342afcffc92
Use reflection instead of constructor functions to create extended stanza structures.
Chris Jones <christian.jones@sri.com>
parents:
126
diff
changeset
|
119 |
rName := xml.Name{Space: NsRoster, Local: "query"} |
8342afcffc92
Use reflection instead of constructor functions to create extended stanza structures.
Chris Jones <christian.jones@sri.com>
parents:
126
diff
changeset
|
120 |
r.StanzaHandlers[rName] = reflect.TypeOf(RosterQuery{}) |
121
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
121 |
r.RecvFilter, r.SendFilter = r.makeFilters() |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
122 |
r.get = make(chan []RosterItem) |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
123 |
r.callbacks = make(chan rosterCb) |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
124 |
r.toServer = make(chan Stanza) |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
125 |
return &r |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
126 |
} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
127 |
|
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
128 |
// Return the most recent snapshot of the roster status. This is |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
129 |
// updated automatically as roster updates are received from the |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
130 |
// server, but especially in response to calls to Update(). |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
131 |
func (r *Roster) Get() []RosterItem { |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
132 |
return <-r.get |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
133 |
} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
134 |
|
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
135 |
// Synchronously fetch this entity's roster from the server and cache |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
136 |
// that information. The client can access the roster by watching for |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
137 |
// RosterQuery objects or by calling Get(). |
124
34e917ca6a11
Updated the example to match the new API, and fixed the roster Update to not require a reference to the client.
Chris Jones <christian.jones@sri.com>
parents:
121
diff
changeset
|
138 |
func (r *Roster) Update() { |
34e917ca6a11
Updated the example to match the new API, and fixed the roster Update to not require a reference to the client.
Chris Jones <christian.jones@sri.com>
parents:
121
diff
changeset
|
139 |
iq := &Iq{Header: Header{Type: "get", Id: NextId(), |
34e917ca6a11
Updated the example to match the new API, and fixed the roster Update to not require a reference to the client.
Chris Jones <christian.jones@sri.com>
parents:
121
diff
changeset
|
140 |
Nested: []interface{}{RosterQuery{}}}} |
121
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
141 |
waitchan := make(chan int) |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
142 |
done := func() { |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
143 |
close(waitchan) |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
144 |
} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
145 |
r.waitFor(iq.Id, done) |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
146 |
r.toServer <- iq |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
147 |
<-waitchan |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
148 |
} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
149 |
|
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
150 |
func (r *Roster) waitFor(id string, cb func()) { |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
151 |
r.callbacks <- rosterCb{id: id, cb: cb} |
ebb86cbdd218
Changed the way filters work. They're now symmetrical, consisting of a paired send filter and receive filter.
Chris Jones <christian.jones@sri.com>
parents:
118
diff
changeset
|
152 |
} |