blob: c5b73fcd32a10d66b0991699ea3cb89e6f88f128 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build java android
package access
import (
"unsafe"
"v.io/v23/security/access"
"v.io/v23/vom"
jutil "v.io/x/jni/util"
)
// #include "jni.h"
import "C"
// JavaACL converts the provided Go AccessList into a Java AccessList.
// NOTE: Because CGO creates package-local types and because this method may be
// invoked from a different package, Java types are passed in an empty interface
// and then cast into their package local types.
func JavaACL(jEnv interface{}, acl access.AccessList) (unsafe.Pointer, error) {
encoded, err := vom.Encode(acl)
if err != nil {
return nil, err
}
jACL, err := jutil.CallStaticObjectMethod(jEnv, jUtilClass, "decodeACL", []jutil.Sign{jutil.ByteArraySign}, aclSign, encoded)
if err != nil {
return nil, err
}
return jACL, nil
}
// GoACL converts the provided Java AccessList into a Go AccessList.
// NOTE: Because CGO creates package-local types and because this method may be
// invoked from a different package, Java types are passed in an empty interface
// and then cast into their package local types.
func GoACL(jEnv, jACL interface{}) (access.AccessList, error) {
encoded, err := jutil.CallStaticByteArrayMethod(jEnv, jUtilClass, "encodeACL", []jutil.Sign{aclSign}, jACL)
if err != nil {
return access.AccessList{}, err
}
var a access.AccessList
if err := vom.Decode(encoded, &a); err != nil {
return access.AccessList{}, err
}
return a, nil
}
// JavaACLWrapper converts the provided Go AccessList into a Java ACLWrapper object.
// NOTE: Because CGO creates package-local types and because this method may be
// invoked from a different package, Java types are passed in an empty interface
// and then cast into their package local types.
func JavaACLWrapper(jEnv interface{}, acl access.AccessList) (unsafe.Pointer, error) {
jACL, err := JavaACL(jEnv, acl)
if err != nil {
return nil, err
}
jWrapper, err := jutil.NewObject(jEnv, jACLWrapperClass, []jutil.Sign{jutil.LongSign, aclSign}, int64(jutil.PtrValue(&acl)), jACL)
if err != nil {
return nil, err
}
jutil.GoRef(&acl) // Un-refed when the Java ACLWrapper object is finalized.
return jWrapper, nil
}