--- a/xmpp.go Sun Jan 08 12:20:21 2012 -0700
+++ b/xmpp.go Sun Jan 08 12:43:50 2012 -0700
@@ -189,7 +189,7 @@
return cl, nil
}
-func (cl *Client) startTransport() (io.Reader, io.Writer) {
+func (cl *Client) startTransport() (io.Reader, io.WriteCloser) {
inr, inw := io.Pipe()
outr, outw := io.Pipe()
go cl.readTransport(inw)
@@ -204,7 +204,7 @@
return ch
}
-func startXmlWriter(w io.Writer) chan<- interface{} {
+func startXmlWriter(w io.WriteCloser) chan<- interface{} {
ch := make(chan interface{})
go writeXml(w, ch)
return ch
@@ -223,19 +223,23 @@
}
func (cl *Client) startFilter(srvIn <-chan Stanza) <-chan Stanza {
- cliOut := make(chan Stanza)
+ cliIn := make(chan Stanza)
filterOut := make(chan (<-chan Stanza))
filterIn := make(chan (<-chan Stanza))
nullFilter := make(chan Stanza)
go filterBottom(srvIn, nullFilter)
- go filterTop(filterOut, filterIn, nullFilter, cliOut)
+ go filterTop(filterOut, filterIn, nullFilter, cliIn)
cl.filterOut = filterOut
cl.filterIn = filterIn
- return cliOut
+ return cliIn
}
func tee(r io.Reader, w io.Writer, prefix string) {
- defer tryClose(r, w)
+ defer func(w io.Writer) {
+ if c, ok := w.(io.Closer) ; ok {
+ c.Close()
+ }
+ }(w)
buf := bytes.NewBuffer([]uint8(prefix))
for {
@@ -260,31 +264,6 @@
}
}
-func tryClose(xs ...interface{}) {
- f1 := func(ch chan<- interface{}) {
- defer func() {
- recover()
- }()
- close(ch)
- }
- f2 := func(ch <-chan interface{}) {
- defer func() {
- recover()
- }()
- close(ch)
- }
-
- for _, x := range xs {
- if c, ok := x.(io.Closer) ; ok {
- c.Close()
- } else if ch, ok := x.(chan<- interface{}) ; ok {
- f1(ch)
- } else if ch, ok := x.(<-chan interface{}) ; ok {
- f2(ch)
- }
- }
-}
-
// bindDone is called when we've finished resource binding (and all
// the negotiations that precede it). Now we can start accepting
// traffic from the app.