telebit/rvpn/genericlistener/conn_wedge.go

69 lines
1.4 KiB
Go

package genericlistener
import (
"bufio"
"net"
)
//WedgeConn -- A buffered IO infront of a connection allowing peeking, and switching connections.
type WedgeConn struct {
reader *bufio.Reader
net.Conn
}
//NewWedgeConn -- Constructor
func NewWedgeConn(c net.Conn) (p *WedgeConn) {
p = new(WedgeConn)
p.reader = bufio.NewReader(c)
p.Conn = c
return
}
//NewWedgeConnSize -- Constructor
func NewWedgeConnSize(c net.Conn, size int) (p *WedgeConn) {
p = new(WedgeConn)
p.reader = bufio.NewReaderSize(c, size)
p.Conn = c
return
}
//Discard - discard a number of bytes, perhaps after peeking at the
func (w *WedgeConn) Discard(n int) (discarded int, err error) {
return w.reader.Discard(n)
}
//Peek - Get a number of bytes outof the buffer, but allow the buffer to be replayed once read
func (w *WedgeConn) Peek(n int) ([]byte, error) {
return w.reader.Peek(n)
}
//ReadByte -- A normal reader.
func (w *WedgeConn) ReadByte() (byte, error) {
return w.reader.ReadByte()
}
//Read -- A normal reader.
func (w *WedgeConn) Read(p []byte) (int, error) {
cnt, err := w.reader.Read(p)
return cnt, err
}
//Buffered --
func (w *WedgeConn) Buffered() int {
return w.reader.Buffered()
}
//PeekAll --
// - get all the chars available
// - pass then back
func (w *WedgeConn) PeekAll() (buf []byte, err error) {
_, err = w.Peek(1)
if err != nil {
return nil, err
}
buf, err = w.Peek(w.Buffered())
return
}