| // 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 namespace |
| |
| import ( |
| "log" |
| |
| "v.io/v23/namespace" |
| "v.io/v23/security/access" |
| jchannel "v.io/x/jni/impl/google/channel" |
| jutil "v.io/x/jni/util" |
| jcontext "v.io/x/jni/v23/context" |
| ) |
| |
| // #include "jni.h" |
| import "C" |
| |
| var ( |
| // Global reference for io.v.impl.google.namespace.NamespaceImpl class. |
| jNamespaceImplClass C.jclass |
| // Global reference for io.v.v23.naming.GlobReply class. |
| jGlobReplyClass C.jclass |
| // Global reference for io.v.v23.naming.MountEntry class. |
| jMountEntryClass C.jclass |
| // Global reference for io.v.v23.security.access.Permissions |
| jPermissionsClass C.jclass |
| ) |
| |
| // Init initializes the JNI code with the given Java environment. This method |
| // must be called from the main Java thread. |
| // NOTE: Because CGO creates package-local types and because this method may be |
| // invoked from a different package, Java environment is passed in an empty |
| // interface and then cast into the package-local environment type. |
| func Init(jEnv interface{}) error { |
| class, err := jutil.JFindClass(jEnv, "io/v/impl/google/namespace/NamespaceImpl") |
| if err != nil { |
| return err |
| } |
| jNamespaceImplClass = C.jclass(class) |
| class, err = jutil.JFindClass(jEnv, "io/v/v23/naming/GlobReply") |
| if err != nil { |
| return err |
| } |
| jGlobReplyClass = C.jclass(class) |
| class, err = jutil.JFindClass(jEnv, "io/v/v23/naming/MountEntry") |
| if err != nil { |
| return err |
| } |
| jMountEntryClass = C.jclass(class) |
| class, err = jutil.JFindClass(jEnv, "io/v/v23/security/access/Permissions") |
| if err != nil { |
| return err |
| } |
| jPermissionsClass = C.jclass(class) |
| return nil |
| } |
| |
| //export Java_io_v_impl_google_namespace_NamespaceImpl_nativeGlob |
| func Java_io_v_impl_google_namespace_NamespaceImpl_nativeGlob(env *C.JNIEnv, jNamespaceClass C.jclass, goNamespacePtr C.jlong, jContext C.jobject, pattern C.jstring, jOptions C.jobject) C.jobject { |
| n := *(*namespace.T)(jutil.Ptr(goNamespacePtr)) |
| context, err := jcontext.GoContext(env, jContext) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return nil |
| } |
| opts, err := namespaceOptions(env, jOptions) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return nil |
| } |
| entryChan, err := n.Glob(context, jutil.GoString(env, pattern), opts...) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return nil |
| } |
| |
| retChan := make(chan C.jobject, 100) |
| go func() { |
| jEnv, freeFunc := jutil.GetEnv() |
| env := (*C.JNIEnv)(jEnv) |
| defer freeFunc() |
| |
| for globReply := range entryChan { |
| jGlobReply, err := jutil.JVomCopy(env, globReply, jGlobReplyClass) |
| if err != nil { |
| log.Printf("Couldn't convert Go glob result %v to Java\n", globReply) |
| continue |
| } |
| // The other side of the channel is responsible |
| // for deleting this global reference. |
| jGlobalGlobReply := C.jobject(jutil.NewGlobalRef(env, jGlobReply)) |
| retChan <- jGlobalGlobReply |
| } |
| close(retChan) |
| }() |
| jInputChannel, err := jchannel.JavaInputChannel(env, &retChan, &entryChan) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return nil |
| } |
| return C.jobject(jInputChannel) |
| } |
| |
| //export Java_io_v_impl_google_namespace_NamespaceImpl_nativeMount |
| func Java_io_v_impl_google_namespace_NamespaceImpl_nativeMount(env *C.JNIEnv, jNamespaceClass C.jclass, goNamespacePtr C.jlong, jContext C.jobject, jName C.jstring, jServer C.jstring, jDuration C.jobject, jOptions C.jobject) { |
| n := *(*namespace.T)(jutil.Ptr(goNamespacePtr)) |
| context, err := jcontext.GoContext(env, jContext) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return |
| } |
| duration, err := jutil.GoDuration(env, jDuration) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return |
| } |
| options, err := namespaceOptions(env, jOptions) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return |
| } |
| if err := n.Mount(context, jutil.GoString(env, jName), jutil.GoString(env, jServer), duration, options...); err != nil { |
| jutil.JThrowV(env, err) |
| } |
| } |
| |
| //export Java_io_v_impl_google_namespace_NamespaceImpl_nativeUnmount |
| func Java_io_v_impl_google_namespace_NamespaceImpl_nativeUnmount(env *C.JNIEnv, jNamespaceClass C.jclass, goNamespacePtr C.jlong, jContext C.jobject, jName C.jstring, jServer C.jstring, jOptions C.jobject) { |
| n := *(*namespace.T)(jutil.Ptr(goNamespacePtr)) |
| context, err := jcontext.GoContext(env, jContext) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return |
| } |
| options, err := namespaceOptions(env, jOptions) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return |
| } |
| if err := n.Unmount(context, jutil.GoString(env, jName), jutil.GoString(env, jServer), options...); err != nil { |
| jutil.JThrowV(env, err) |
| } |
| } |
| |
| //export Java_io_v_impl_google_namespace_NamespaceImpl_nativeDelete |
| func Java_io_v_impl_google_namespace_NamespaceImpl_nativeDelete(env *C.JNIEnv, jNamespaceClass C.jclass, goNamespacePtr C.jlong, jContext C.jobject, jName C.jstring, jDeleteSubtree C.jboolean, jOptions C.jobject) { |
| n := *(*namespace.T)(jutil.Ptr(goNamespacePtr)) |
| context, err := jcontext.GoContext(env, jContext) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return |
| } |
| options, err := namespaceOptions(env, jOptions) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return |
| } |
| if err := n.Delete(context, jutil.GoString(env, jName), jDeleteSubtree == C.JNI_TRUE, options...); err != nil { |
| jutil.JThrowV(env, err) |
| } |
| } |
| |
| //export Java_io_v_impl_google_namespace_NamespaceImpl_nativeResolve |
| func Java_io_v_impl_google_namespace_NamespaceImpl_nativeResolve(env *C.JNIEnv, jNamespaceClass C.jclass, goNamespacePtr C.jlong, jContext C.jobject, jName C.jstring, jOptions C.jobject) C.jobject { |
| n := *(*namespace.T)(jutil.Ptr(goNamespacePtr)) |
| context, err := jcontext.GoContext(env, jContext) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return nil |
| } |
| options, err := namespaceOptions(env, jOptions) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return nil |
| } |
| entry, err := n.Resolve(context, jutil.GoString(env, jName), options...) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return nil |
| } |
| jEntry, err := jutil.JVomCopy(env, entry, jMountEntryClass) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return nil |
| } |
| return C.jobject(jEntry) |
| } |
| |
| //export Java_io_v_impl_google_namespace_NamespaceImpl_nativeResolveToMountTable |
| func Java_io_v_impl_google_namespace_NamespaceImpl_nativeResolveToMountTable(env *C.JNIEnv, jNamespaceClass C.jclass, goNamespacePtr C.jlong, jContext C.jobject, jName C.jstring, jOptions C.jobject) C.jobject { |
| n := *(*namespace.T)(jutil.Ptr(goNamespacePtr)) |
| context, err := jcontext.GoContext(env, jContext) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return nil |
| } |
| options, err := namespaceOptions(env, jOptions) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return nil |
| } |
| entry, err := n.ResolveToMountTable(context, jutil.GoString(env, jName), options...) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return nil |
| } |
| jEntry, err := jutil.JVomCopy(env, entry, jMountEntryClass) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return nil |
| } |
| return C.jobject(jEntry) |
| } |
| |
| //export Java_io_v_impl_google_namespace_NamespaceImpl_nativeFlushCacheEntry |
| func Java_io_v_impl_google_namespace_NamespaceImpl_nativeFlushCacheEntry(env *C.JNIEnv, jNamespaceClass C.jclass, goNamespacePtr C.jlong, jName string) C.jboolean { |
| n := *(*namespace.T)(jutil.Ptr(goNamespacePtr)) |
| result := n.FlushCacheEntry(jutil.GoString(env, jName)) |
| if result { |
| return C.JNI_TRUE |
| } else { |
| return C.JNI_FALSE |
| } |
| } |
| |
| //export Java_io_v_impl_google_namespace_NamespaceImpl_nativeSetRoots |
| func Java_io_v_impl_google_namespace_NamespaceImpl_nativeSetRoots(env *C.JNIEnv, jNamespaceClass C.jclass, goNamespacePtr C.jlong, jNames C.jobject) { |
| n := *(*namespace.T)(jutil.Ptr(goNamespacePtr)) |
| names, err := jutil.GoStringList(env, jNames) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return |
| } |
| err = n.SetRoots(names...) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| } |
| } |
| |
| //export Java_io_v_impl_google_namespace_NamespaceImpl_nativeSetPermissions |
| func Java_io_v_impl_google_namespace_NamespaceImpl_nativeSetPermissions(env *C.JNIEnv, jNamespaceClass C.jclass, goNamespacePtr C.jlong, jContext C.jobject, jName C.jstring, jPermissions C.jobject, jVersion C.jstring, jOptions C.jobject) { |
| n := *(*namespace.T)(jutil.Ptr(goNamespacePtr)) |
| context, err := jcontext.GoContext(env, jContext) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return |
| } |
| var permissions access.Permissions |
| err = jutil.GoVomCopy(env, jPermissions, jPermissionsClass, &permissions) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return |
| } |
| options, err := namespaceOptions(env, jOptions) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return |
| } |
| if err := n.SetPermissions(context, jutil.GoString(env, jName), permissions, jutil.GoString(env, jVersion), options...); err != nil { |
| jutil.JThrowV(env, err) |
| } |
| } |
| |
| //export Java_io_v_impl_google_namespace_NamespaceImpl_nativeGetPermissions |
| func Java_io_v_impl_google_namespace_NamespaceImpl_nativeGetPermissions(env *C.JNIEnv, jNamespaceClass C.jclass, goNamespacePtr C.jlong, jContext C.jobject, jName C.jstring, jOptions C.jobject) C.jobject { |
| n := *(*namespace.T)(jutil.Ptr(goNamespacePtr)) |
| context, err := jcontext.GoContext(env, jContext) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return nil |
| } |
| options, err := namespaceOptions(env, jOptions) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return nil |
| } |
| permissions, version, err := n.GetPermissions(context, jutil.GoString(env, jName), options...) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return nil |
| } |
| jPermissions, err := jutil.JVomCopy(env, permissions, jPermissionsClass) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return nil |
| } |
| result := make(map[interface{}]interface{}) |
| result[C.jstring(jutil.JString(env, version))] = jPermissions |
| jResult, err := jutil.JObjectMap(env, result) |
| if err != nil { |
| jutil.JThrowV(env, err) |
| return nil |
| } |
| return C.jobject(jResult) |
| } |
| |
| //export Java_io_v_impl_google_namespace_NamespaceImpl_nativeFinalize |
| func Java_io_v_impl_google_namespace_NamespaceImpl_nativeFinalize(env *C.JNIEnv, jNamespace C.jobject, goNamespacePtr C.jlong) { |
| jutil.GoUnref(jutil.Ptr(goNamespacePtr)) |
| } |