rpc/bt: fix bt socket read
* Fix BT socket read() to read until the specified number of bytes are
read or fails.
* Change GattReader to use AUTO for all device type since it doesn't
seem to help.
MultiPart: 2/2
Change-Id: Ifea86fe11e82cdeb7e8e7b799025b35939aeedf3
diff --git a/impl/google/rpc/protocols/bt/bt_android.go b/impl/google/rpc/protocols/bt/bt_android.go
index 148a914..4e4b7fc 100644
--- a/impl/google/rpc/protocols/bt/bt_android.go
+++ b/impl/google/rpc/protocols/bt/bt_android.go
@@ -47,18 +47,20 @@
func (btProtocol) Dial(ctx *context.T, protocol, address string, timeout time.Duration) (flow.Conn, error) {
env, freeFunc := jutil.GetEnv()
+ defer freeFunc()
+
jContext, err := jcontext.JavaContext(env, ctx, nil)
if err != nil {
- freeFunc()
return nil, err
}
- // This method will invoke the freeFunc().
- jStream, err := jutil.CallStaticCallbackMethod(env, freeFunc, jBluetoothClass, "dial", []jutil.Sign{contextSign, jutil.StringSign, jutil.DurationSign}, jContext, address, timeout)
+ jStream, err := jutil.CallStaticObjectMethod(env, jBluetoothClass, "dial", []jutil.Sign{contextSign, jutil.StringSign, jutil.DurationSign}, streamSign, jContext, address, timeout)
if err != nil {
return nil, err
}
- env, freeFunc = jutil.GetEnv()
- defer freeFunc()
+ // Reference Java Stream; it will be de-referenced when the Go connection
+ // created below is garbage-collected (through the finalizer callback we
+ // setup just below).
+ jStream = jutil.NewGlobalRef(env, jStream)
return newConnection(env, jStream), nil
}
@@ -100,13 +102,16 @@
func (l *btListener) Accept(ctx *context.T) (flow.Conn, error) {
env, freeFunc := jutil.GetEnv()
- // This method will invoke the freeFunc().
- jStream, err := jutil.CallCallbackMethod(env, freeFunc, l.jListener, "accept", nil)
+ defer freeFunc()
+
+ jStream, err := jutil.CallObjectMethod(env, l.jListener, "accept", nil, streamSign)
if err != nil {
return nil, err
}
- env, freeFunc = jutil.GetEnv()
- defer freeFunc()
+ // Reference Java Stream; it will be de-referenced when the Go connection
+ // created below is garbage-collected (through the finalizer callback we
+ // setup just below).
+ jStream = jutil.NewGlobalRef(env, jStream)
return newConnection(env, jStream), nil
}
@@ -155,22 +160,20 @@
func (c *btReadWriteCloser) Read(b []byte) (n int, err error) {
env, freeFunc := jutil.GetEnv()
- // This method will invoke the freeFunc().
- jResult, err := jutil.CallCallbackMethod(env, freeFunc, c.jStream, "read", []jutil.Sign{jutil.IntSign}, len(b))
+ defer freeFunc()
+
+ data, err := jutil.CallByteArrayMethod(env, c.jStream, "read", []jutil.Sign{jutil.IntSign}, len(b))
if err != nil {
return 0, err
}
- env, freeFunc = jutil.GetEnv()
- defer freeFunc()
- defer jutil.DeleteGlobalRef(env, jResult)
- data := jutil.GoByteArray(env, jResult)
return copy(b, data), nil
}
func (c *btReadWriteCloser) Write(b []byte) (n int, err error) {
env, freeFunc := jutil.GetEnv()
- // This method will invoke the freeFunc().
- if _, err := jutil.CallCallbackMethod(env, freeFunc, c.jStream, "write", []jutil.Sign{jutil.ByteArraySign}, b); err != nil {
+ defer freeFunc()
+
+ if err := jutil.CallVoidMethod(env, c.jStream, "write", []jutil.Sign{jutil.ByteArraySign}, b); err != nil {
return 0, err
}
return len(b), nil