79 lines
2 KiB
Go
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
|
|
}
|