author | Chris Jones <christian.jones@sri.com> |
Sat, 07 Sep 2013 11:19:29 -0700 | |
changeset 128 | 8342afcffc92 |
parent 126 | 367e76b3028e |
child 133 | c4e0b897db83 |
permissions | -rw-r--r-- |
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:
diff
changeset
|
1 |
package xmpp |
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:
diff
changeset
|
2 |
|
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:
diff
changeset
|
3 |
// Manages the stack of filters that can read and modify stanzas on |
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:
diff
changeset
|
4 |
// their way from the remote to the application. |
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:
diff
changeset
|
5 |
|
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:
diff
changeset
|
6 |
// Receive new filters on filterAdd; those new filters get added to |
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:
diff
changeset
|
7 |
// the top of the stack. Receive stanzas at the bottom of the stack on |
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:
diff
changeset
|
8 |
// input. Send stanzas out the top of the stack on output. |
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:
diff
changeset
|
9 |
func filterMgr(filterAdd <-chan Filter, input <-chan Stanza, output 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:
diff
changeset
|
10 |
botFiltIn := output |
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:
diff
changeset
|
11 |
topFiltOut := input |
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:
diff
changeset
|
12 |
|
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:
diff
changeset
|
13 |
loop: |
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:
diff
changeset
|
14 |
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:
diff
changeset
|
15 |
select { |
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:
diff
changeset
|
16 |
case stan, ok := <-input: |
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:
diff
changeset
|
17 |
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:
diff
changeset
|
18 |
break loop |
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:
diff
changeset
|
19 |
} |
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:
diff
changeset
|
20 |
botFiltIn <- 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:
diff
changeset
|
21 |
|
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:
diff
changeset
|
22 |
case stan, ok := <-topFiltOut: |
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:
diff
changeset
|
23 |
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:
diff
changeset
|
24 |
break loop |
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:
diff
changeset
|
25 |
} |
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:
diff
changeset
|
26 |
output <- 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:
diff
changeset
|
27 |
|
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:
diff
changeset
|
28 |
case filt := <-filterAdd: |
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:
diff
changeset
|
29 |
newTop := 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:
diff
changeset
|
30 |
go filt(topFiltOut, newTop) |
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:
diff
changeset
|
31 |
topFiltOut = newTop |
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:
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:
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:
diff
changeset
|
34 |
close(botFiltIn) |
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:
diff
changeset
|
35 |
} |
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:
diff
changeset
|
36 |
|
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:
diff
changeset
|
37 |
// Starts the filter chain. Filters will all interpose themselves |
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:
diff
changeset
|
38 |
// between srvIn and cliOut. |
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:
diff
changeset
|
39 |
func (cl *Client) startFilters(srvIn, cliIn <-chan Stanza) (<-chan Stanza, <-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:
diff
changeset
|
40 |
cliOut := 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:
diff
changeset
|
41 |
srvOut := 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:
diff
changeset
|
42 |
go filterMgr(cl.sendFilterAdd, srvIn, cliOut) |
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:
diff
changeset
|
43 |
go filterMgr(cl.recvFilterAdd, cliIn, srvOut) |
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:
diff
changeset
|
44 |
return cliOut, srvOut |
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:
diff
changeset
|
45 |
} |
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:
diff
changeset
|
46 |
|
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:
diff
changeset
|
47 |
// AddRecvFilter adds a new filter to the top of the stack through which |
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:
diff
changeset
|
48 |
// incoming stanzas travel on their way up to the client. |
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:
diff
changeset
|
49 |
func (cl *Client) AddRecvFilter(filt 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:
diff
changeset
|
50 |
if filt == 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:
diff
changeset
|
51 |
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:
diff
changeset
|
52 |
} |
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:
diff
changeset
|
53 |
cl.recvFilterAdd <- filt |
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:
diff
changeset
|
54 |
} |
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:
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:
diff
changeset
|
56 |
// AddSendFilter adds a new filter to the top of the stack through |
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:
diff
changeset
|
57 |
// which outgoing stanzas travel on their way down from the client to |
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:
diff
changeset
|
58 |
// the network. |
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:
diff
changeset
|
59 |
func (cl *Client) AddSendFilter(filt 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:
diff
changeset
|
60 |
if filt == 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:
diff
changeset
|
61 |
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:
diff
changeset
|
62 |
} |
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:
diff
changeset
|
63 |
cl.sendFilterAdd <- filt |
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:
diff
changeset
|
64 |
} |