v.io/x/jni: support for android fixes
MultiPart: 2/2
Change-Id: I6d940e504287d2fc0de55f46de0fbad7190a88a0
diff --git a/impl/google/rpc/protocols/bt/bt_android.go b/impl/google/rpc/protocols/bt/bt_android.go
index eb4a360..b91090e 100644
--- a/impl/google/rpc/protocols/bt/bt_android.go
+++ b/impl/google/rpc/protocols/bt/bt_android.go
@@ -7,13 +7,12 @@
package bt
import (
- "fmt"
"net"
"runtime"
"time"
"v.io/v23/context"
- "v.io/v23/rpc"
+ "v.io/v23/flow"
jutil "v.io/x/jni/util"
)
@@ -37,11 +36,13 @@
if err != nil {
return err
}
- rpc.RegisterProtocol("bt", dialFunc, resolveFunc, listenFunc)
+ flow.RegisterProtocol("bt", btProtocol{})
return nil
}
-func dialFunc(ctx *context.T, protocol, address string, timeout time.Duration) (net.Conn, error) {
+type btProtocol struct{}
+
+func (btProtocol) Dial(ctx *context.T, protocol, address string, timeout time.Duration) (flow.Conn, error) {
env, freeFunc := jutil.GetEnv()
defer freeFunc()
jConnection, err := jutil.CallStaticObjectMethod(env, jBluetoothClass, "dial", []jutil.Sign{jutil.StringSign, jutil.DurationSign}, connectionSign, address, timeout)
@@ -51,11 +52,11 @@
return newConnection(env, jConnection), nil
}
-func resolveFunc(ctx *context.T, protocol, address string) (string, string, error) {
+func (btProtocol) Resolve(ctx *context.T, protocol, address string) (string, string, error) {
return protocol, address, nil
}
-func listenFunc(ctx *context.T, protocol, address string) (net.Listener, error) {
+func (btProtocol) Listen(ctx *context.T, protocol, address string) (flow.Listener, error) {
env, freeFunc := jutil.GetEnv()
defer freeFunc()
jListener, err := jutil.CallStaticObjectMethod(env, jBluetoothClass, "listen", []jutil.Sign{jutil.StringSign}, listenerSign, address)
@@ -65,8 +66,8 @@
return newListener(env, jListener), nil
}
-func newListener(env jutil.Env, jListener jutil.Object) net.Listener {
- // Reference Java Listener; it will be de-referenced when the Go net.Listener
+func newListener(env jutil.Env, jListener jutil.Object) flow.Listener {
+ // Reference Java Listener; it will be de-referenced when the Go Listener
// created below is garbage-collected (through the finalizer callback we
// setup just below).
jListener = jutil.NewGlobalRef(env, jListener)
@@ -83,7 +84,7 @@
jListener jutil.Object
}
-func (l *btListener) Accept() (net.Conn, error) {
+func (l *btListener) Accept(ctx *context.T) (flow.Conn, error) {
env, freeFunc := jutil.GetEnv()
defer freeFunc()
jConn, err := jutil.CallObjectMethod(env, l.jListener, "accept", nil, connectionSign)
@@ -109,8 +110,8 @@
return jutil.CallVoidMethod(env, l.jListener, "close", nil)
}
-func newConnection(env jutil.Env, jConnection jutil.Object) net.Conn {
- // Reference Java Connection; it will be de-referenced when the Go net.Conn
+func newConnection(env jutil.Env, jConnection jutil.Object) flow.Conn {
+ // Reference Java Connection; it will be de-referenced when the Go Conn
// created below is garbage-collected (through the finalizer callback we
// setup just below).
jConnection = jutil.NewGlobalRef(env, jConnection)
@@ -127,23 +128,23 @@
jConnection jutil.Object
}
-func (c *btConn) Read(b []byte) (n int, err error) {
+func (c *btConn) ReadMsg() ([]byte, error) {
env, freeFunc := jutil.GetEnv()
defer freeFunc()
- data, err := jutil.CallByteArrayMethod(env, c.jConnection, "read", []jutil.Sign{jutil.IntSign}, len(b))
- if err != nil {
- return 0, err
- }
- return copy(b, data), nil
+ return jutil.CallByteArrayMethod(env, c.jConnection, "read", nil)
}
-func (c *btConn) Write(b []byte) (n int, err error) {
+func (c *btConn) WriteMsg(bs ...[]byte) (n int, err error) {
env, freeFunc := jutil.GetEnv()
defer freeFunc()
- if err := jutil.CallVoidMethod(env, c.jConnection, "write", []jutil.Sign{jutil.ByteArraySign}, b); err != nil {
- return 0, err
+ total := 0
+ for _, b := range bs {
+ if err := jutil.CallVoidMethod(env, c.jConnection, "write", []jutil.Sign{jutil.ByteArraySign}, b); err != nil {
+ return 0, err
+ }
+ total += len(b)
}
- return len(b), nil
+ return total, nil
}
func (c *btConn) Close() error {
@@ -162,28 +163,6 @@
return &btAddr{addr}
}
-func (c *btConn) RemoteAddr() net.Addr {
- env, freeFunc := jutil.GetEnv()
- defer freeFunc()
- addr, err := jutil.CallStringMethod(env, c.jConnection, "localAddress", nil)
- if err != nil {
- return &btAddr{""}
- }
- return &btAddr{addr}
-}
-
-func (*btConn) SetDeadline(t time.Time) error {
- return fmt.Errorf("SetDeadline() not implemented for bluetooth connections.")
-}
-
-func (*btConn) SetReadDeadline(t time.Time) error {
- return fmt.Errorf("SetReadDeadline() not implemented for bluetooth connections.")
-}
-
-func (*btConn) SetWriteDeadline(t time.Time) error {
- return fmt.Errorf("SetWriteDeadline() not implemented for bluetooth connections.")
-}
-
type btAddr struct {
addr string
}