#include "libzfs_jni_disk.h"
static jobject create_DiskDeviceBean(JNIEnv *, dmgt_disk_t *);
static jobject get_SliceUsage_Use(JNIEnv *, char *);
static jobject create_SliceUsage(JNIEnv *env, dmgt_slice_t *sp);
static jobject create_SliceDeviceBean(JNIEnv *env, dmgt_slice_t *sp);
static jobjectArray create_SliceDeviceBean_array(JNIEnv *, dmgt_slice_t **);
static jobject
create_DiskDeviceBean(JNIEnv *env, dmgt_disk_t *dp)
{
jobject disk = NULL;
int naliases = zjni_count_elements((void **)dp->aliases);
jobjectArray aliases = zjni_c_string_array_to_java(
env, dp->aliases, naliases);
if (aliases != NULL) {
jobjectArray slices = create_SliceDeviceBean_array(env,
dp->slices);
if (slices != NULL) {
jstring nameUTF = (*env)->NewStringUTF(env, dp->name);
jboolean in_use = dp->in_use ? JNI_TRUE : JNI_FALSE;
jclass class_DiskDeviceBean = (*env)->FindClass(
env, ZFSJNI_PACKAGE_DATA "DiskDeviceBean");
jmethodID constructor =
(*env)->GetMethodID(env, class_DiskDeviceBean,
"<init>",
"(JLjava/lang/String;[Ljava/lang/String;[L"
ZFSJNI_PACKAGE_DATA "SliceDeviceBean;Z)V");
disk = (*env)->NewObject(env, class_DiskDeviceBean,
constructor, dp->size, nameUTF, aliases, slices,
in_use);
}
}
return (disk);
}
static jobject
get_SliceUsage_Use(JNIEnv *env, char *dm_usage)
{
jobject enumVal = NULL;
if (dm_usage != NULL) {
jclass class_SliceUsage_Use = (*env)->FindClass(
env, ZFSJNI_PACKAGE_DATA "SliceUsage$Use");
jfieldID id = (*env)->GetStaticFieldID(env,
class_SliceUsage_Use,
dm_usage, "L" ZFSJNI_PACKAGE_DATA "SliceUsage$Use;");
if (id != NULL) {
enumVal = (*env)->GetStaticObjectField(
env, class_SliceUsage_Use, id);
#ifdef DEBUG
} else {
(void) fprintf(stderr, "Unknown slice usage: %s\n",
dm_usage);
#endif
}
}
return (enumVal);
}
static jobject
create_SliceUsage(JNIEnv *env, dmgt_slice_t *sp)
{
jobject usage = NULL;
if (sp->used_name != NULL) {
jobject use = get_SliceUsage_Use(env, sp->used_name);
if (use != NULL) {
jstring usedByUTF =
(*env)->NewStringUTF(env, sp->used_by);
jclass class_SliceUsage = (*env)->FindClass(
env, ZFSJNI_PACKAGE_DATA "SliceUsage");
jmethodID constructor =
(*env)->GetMethodID(env, class_SliceUsage, "<init>",
"(L" ZFSJNI_PACKAGE_DATA
"SliceUsage$Use;Ljava/lang/String;)V");
usage = (*env)->NewObject(env,
class_SliceUsage, constructor, use, usedByUTF);
}
}
return (usage);
}
static jobject
create_SliceDeviceBean(JNIEnv *env, dmgt_slice_t *sp)
{
jobject slice = NULL;
jobject usage = create_SliceUsage(env, sp);
jstring nameUTF = (*env)->NewStringUTF(env, sp->name);
jclass class_SliceDeviceBean = (*env)->FindClass(
env, ZFSJNI_PACKAGE_DATA "SliceDeviceBean");
jmethodID constructor =
(*env)->GetMethodID(env, class_SliceDeviceBean, "<init>",
"(JLjava/lang/String;JL" ZFSJNI_PACKAGE_DATA "SliceUsage;)V");
slice = (*env)->NewObject(env, class_SliceDeviceBean,
constructor, sp->size, nameUTF, sp->start, usage);
return (slice);
}
static jobjectArray
create_SliceDeviceBean_array(JNIEnv *env, dmgt_slice_t **slices)
{
zjni_ArrayList_t list_class = {0};
zjni_ArrayList_t *list_class_p = &list_class;
zjni_new_ArrayList(env, list_class_p);
if (slices != NULL) {
int i;
for (i = 0; slices[i] != NULL; i++) {
dmgt_slice_t *slice = slices[i];
jobject obj;
obj = create_SliceDeviceBean(env, slice);
if (obj != NULL) {
(*env)->CallBooleanMethod(env,
((zjni_Object_t *)list_class_p)->object,
((zjni_Collection_t *)list_class_p)->
method_add, obj);
}
}
}
return (zjni_Collection_to_array(
env, (zjni_Collection_t *)list_class_p,
ZFSJNI_PACKAGE_DATA "SliceDeviceBean"));
}
int
zjni_create_add_DiskDevice(dmgt_disk_t *dp, void *data)
{
JNIEnv *env = ((zjni_ArrayCallbackData_t *)data)->env;
zjni_Collection_t *list = ((zjni_ArrayCallbackData_t *)data)->list;
jobject disk = create_DiskDeviceBean(env, dp);
(*env)->CallBooleanMethod(env, ((zjni_Object_t *)list)->object,
((zjni_Collection_t *)list)->method_add, disk);
return (0);
}