goadb/wire/conn.go
2015-07-12 00:37:58 -07:00

79 lines
2 KiB
Go

package wire
import "github.com/zach-klippenstein/goadb/util"
const (
// The official implementation of adb imposes an undocumented 255-byte limit
// on messages.
MaxMessageLength = 255
)
/*
Conn is a normal connection to an adb server.
For most cases, usage looks something like:
conn := wire.Dial()
conn.SendMessage(data)
conn.ReadStatus() == StatusSuccess || StatusFailure
conn.ReadMessage()
conn.Close()
For some messages, the server will return more than one message (but still a single
status). Generally, after calling ReadStatus once, you should call ReadMessage until
it returns an io.EOF error.
For most commands, the server will close the connection after sending the response.
You should still always call Close() when you're done with the connection.
*/
type Conn struct {
Scanner
Sender
}
func NewConn(scanner Scanner, sender Sender) *Conn {
return &Conn{scanner, sender}
}
// NewSyncConn returns connection that can operate in sync mode.
// The connection must already have been switched (by sending the sync command
// to a specific device), or the return connection will return an error.
func (c *Conn) NewSyncConn() *SyncConn {
return &SyncConn{
SyncScanner: c.Scanner.NewSyncScanner(),
SyncSender: c.Sender.NewSyncSender(),
}
}
// RoundTripSingleResponse sends a message to the server, and reads a single
// message response. If the reponse has a failure status code, returns it as an error.
func (conn *Conn) RoundTripSingleResponse(req []byte) (resp []byte, err error) {
if err = conn.SendMessage(req); err != nil {
return nil, err
}
if err = ReadStatusFailureAsError(conn, string(req)); err != nil {
return nil, err
}
return conn.ReadMessage()
}
func (conn *Conn) Close() error {
errs := struct {
SenderErr error
ScannerErr error
}{
SenderErr: conn.Sender.Close(),
ScannerErr: conn.Scanner.Close(),
}
if errs.ScannerErr != nil || errs.SenderErr != nil {
return &util.Err{
Code: util.NetworkError,
Message: "error closing connection",
Details: errs,
}
}
return nil
}