1fa9e4066Sahrens /*
2fa9e4066Sahrens  * CDDL HEADER START
3fa9e4066Sahrens  *
4fa9e4066Sahrens  * The contents of this file are subject to the terms of the
5fa9e4066Sahrens  * Common Development and Distribution License, Version 1.0 only
6fa9e4066Sahrens  * (the "License").  You may not use this file except in compliance
7fa9e4066Sahrens  * with the License.
8fa9e4066Sahrens  *
9fa9e4066Sahrens  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10fa9e4066Sahrens  * or http://www.opensolaris.org/os/licensing.
11fa9e4066Sahrens  * See the License for the specific language governing permissions
12fa9e4066Sahrens  * and limitations under the License.
13fa9e4066Sahrens  *
14fa9e4066Sahrens  * When distributing Covered Code, include this CDDL HEADER in each
15fa9e4066Sahrens  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16fa9e4066Sahrens  * If applicable, add the following below this CDDL HEADER, with the
17fa9e4066Sahrens  * fields enclosed by brackets "[]" replaced with your own identifying
18fa9e4066Sahrens  * information: Portions Copyright [yyyy] [name of copyright owner]
19fa9e4066Sahrens  *
20fa9e4066Sahrens  * CDDL HEADER END
21fa9e4066Sahrens  */
22fa9e4066Sahrens /*
23fa9e4066Sahrens  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24fa9e4066Sahrens  * Use is subject to license terms.
25fa9e4066Sahrens  */
26fa9e4066Sahrens 
27fa9e4066Sahrens #include "libzfs_jni_disk.h"
28fa9e4066Sahrens 
29fa9e4066Sahrens /*
30fa9e4066Sahrens  * Function prototypes
31fa9e4066Sahrens  */
32fa9e4066Sahrens 
33fa9e4066Sahrens static jobject create_DiskDeviceBean(JNIEnv *, dmgt_disk_t *);
34fa9e4066Sahrens static jobject get_SliceUsage_Use(JNIEnv *, char *);
35fa9e4066Sahrens static jobject create_SliceUsage(JNIEnv *env, dmgt_slice_t *sp);
36fa9e4066Sahrens static jobject create_SliceDeviceBean(JNIEnv *env, dmgt_slice_t *sp);
37fa9e4066Sahrens static jobjectArray create_SliceDeviceBean_array(JNIEnv *, dmgt_slice_t **);
38fa9e4066Sahrens 
39fa9e4066Sahrens /*
40fa9e4066Sahrens  * Static functions
41fa9e4066Sahrens  */
42fa9e4066Sahrens 
43fa9e4066Sahrens static jobject
create_DiskDeviceBean(JNIEnv * env,dmgt_disk_t * dp)44fa9e4066Sahrens create_DiskDeviceBean(JNIEnv *env, dmgt_disk_t *dp)
45fa9e4066Sahrens {
46fa9e4066Sahrens 	jobject disk = NULL;
47fa9e4066Sahrens 
48fa9e4066Sahrens 	int naliases = zjni_count_elements((void **)dp->aliases);
49c8e9ed14Stalley 	jobjectArray aliases = zjni_c_string_array_to_java(
50fa9e4066Sahrens 	    env, dp->aliases, naliases);
51fa9e4066Sahrens 	if (aliases != NULL) {
52fa9e4066Sahrens 		jobjectArray slices = create_SliceDeviceBean_array(env,
53fa9e4066Sahrens 		    dp->slices);
54fa9e4066Sahrens 		if (slices != NULL) {
55fa9e4066Sahrens 			jstring nameUTF = (*env)->NewStringUTF(env, dp->name);
56fa9e4066Sahrens 
57*dc307942Stalley 			jboolean in_use = dp->in_use ? JNI_TRUE : JNI_FALSE;
58*dc307942Stalley 
59fa9e4066Sahrens 			jclass class_DiskDeviceBean = (*env)->FindClass(
60fa9e4066Sahrens 			    env, ZFSJNI_PACKAGE_DATA "DiskDeviceBean");
61fa9e4066Sahrens 
62fa9e4066Sahrens 			jmethodID constructor =
63fa9e4066Sahrens 			    (*env)->GetMethodID(env, class_DiskDeviceBean,
64fa9e4066Sahrens 				"<init>",
65fa9e4066Sahrens 				"(JLjava/lang/String;[Ljava/lang/String;[L"
66*dc307942Stalley 				ZFSJNI_PACKAGE_DATA "SliceDeviceBean;Z)V");
67fa9e4066Sahrens 
68fa9e4066Sahrens 			disk = (*env)->NewObject(env, class_DiskDeviceBean,
69*dc307942Stalley 			    constructor, dp->size, nameUTF, aliases, slices,
70*dc307942Stalley 			    in_use);
71fa9e4066Sahrens 		}
72fa9e4066Sahrens 	}
73fa9e4066Sahrens 
74fa9e4066Sahrens 	return (disk);
75fa9e4066Sahrens }
76fa9e4066Sahrens 
77fa9e4066Sahrens static jobject
get_SliceUsage_Use(JNIEnv * env,char * dm_usage)78fa9e4066Sahrens get_SliceUsage_Use(JNIEnv *env, char *dm_usage)
79fa9e4066Sahrens {
80fa9e4066Sahrens 	jobject enumVal = NULL;
81fa9e4066Sahrens 
82fa9e4066Sahrens 	if (dm_usage != NULL) {
83fa9e4066Sahrens 		jclass class_SliceUsage_Use = (*env)->FindClass(
84fa9e4066Sahrens 		    env, ZFSJNI_PACKAGE_DATA "SliceUsage$Use");
85fa9e4066Sahrens 
86fa9e4066Sahrens 		jfieldID id = (*env)->GetStaticFieldID(env,
87fa9e4066Sahrens 		    class_SliceUsage_Use,
88fa9e4066Sahrens 		    dm_usage, "L" ZFSJNI_PACKAGE_DATA "SliceUsage$Use;");
89fa9e4066Sahrens 
90fa9e4066Sahrens 		if (id != NULL) {
91fa9e4066Sahrens 			/* Retrieve the proper SliceUsage$Use enum value */
92fa9e4066Sahrens 			enumVal = (*env)->GetStaticObjectField(
93fa9e4066Sahrens 			    env, class_SliceUsage_Use, id);
94fa9e4066Sahrens #ifdef	DEBUG
95fa9e4066Sahrens 		} else {
96fa9e4066Sahrens 			(void) fprintf(stderr, "Unknown slice usage: %s\n",
97fa9e4066Sahrens 			    dm_usage);
98fa9e4066Sahrens #endif /* DEBUG */
99fa9e4066Sahrens 		}
100fa9e4066Sahrens 	}
101fa9e4066Sahrens 
102fa9e4066Sahrens 	return (enumVal);
103fa9e4066Sahrens }
104fa9e4066Sahrens 
105fa9e4066Sahrens static jobject
create_SliceUsage(JNIEnv * env,dmgt_slice_t * sp)106fa9e4066Sahrens create_SliceUsage(JNIEnv *env, dmgt_slice_t *sp)
107fa9e4066Sahrens {
108fa9e4066Sahrens 	jobject usage = NULL;
109fa9e4066Sahrens 	if (sp->used_name != NULL) {
110fa9e4066Sahrens 		jobject use = get_SliceUsage_Use(env, sp->used_name);
111fa9e4066Sahrens 
112fa9e4066Sahrens 		if (use != NULL) {
113fa9e4066Sahrens 			jstring usedByUTF =
114fa9e4066Sahrens 			    (*env)->NewStringUTF(env, sp->used_by);
115fa9e4066Sahrens 
116fa9e4066Sahrens 			jclass class_SliceUsage = (*env)->FindClass(
117fa9e4066Sahrens 			    env, ZFSJNI_PACKAGE_DATA "SliceUsage");
118fa9e4066Sahrens 
119fa9e4066Sahrens 			jmethodID constructor =
120fa9e4066Sahrens 			    (*env)->GetMethodID(env, class_SliceUsage, "<init>",
121fa9e4066Sahrens 				"(L" ZFSJNI_PACKAGE_DATA
122fa9e4066Sahrens 				"SliceUsage$Use;Ljava/lang/String;)V");
123fa9e4066Sahrens 
124fa9e4066Sahrens 			usage = (*env)->NewObject(env,
125fa9e4066Sahrens 			    class_SliceUsage, constructor, use, usedByUTF);
126fa9e4066Sahrens 		}
127fa9e4066Sahrens 	}
128fa9e4066Sahrens 
129fa9e4066Sahrens 	return (usage);
130fa9e4066Sahrens }
131fa9e4066Sahrens 
132fa9e4066Sahrens static jobject
create_SliceDeviceBean(JNIEnv * env,dmgt_slice_t * sp)133fa9e4066Sahrens create_SliceDeviceBean(JNIEnv *env, dmgt_slice_t *sp)
134fa9e4066Sahrens {
135fa9e4066Sahrens 	jobject slice = NULL;
136fa9e4066Sahrens 
137fa9e4066Sahrens 	/* May be NULL if unused */
138fa9e4066Sahrens 	jobject usage = create_SliceUsage(env, sp);
139fa9e4066Sahrens 
140fa9e4066Sahrens 	jstring nameUTF = (*env)->NewStringUTF(env, sp->name);
141fa9e4066Sahrens 
142fa9e4066Sahrens 	jclass class_SliceDeviceBean = (*env)->FindClass(
143fa9e4066Sahrens 	    env, ZFSJNI_PACKAGE_DATA "SliceDeviceBean");
144fa9e4066Sahrens 
145fa9e4066Sahrens 	jmethodID constructor =
146fa9e4066Sahrens 	    (*env)->GetMethodID(env, class_SliceDeviceBean, "<init>",
147fa9e4066Sahrens 		"(JLjava/lang/String;JL" ZFSJNI_PACKAGE_DATA "SliceUsage;)V");
148fa9e4066Sahrens 
149fa9e4066Sahrens 	slice = (*env)->NewObject(env, class_SliceDeviceBean,
150fa9e4066Sahrens 	    constructor, sp->size, nameUTF, sp->start, usage);
151fa9e4066Sahrens 
152fa9e4066Sahrens 	return (slice);
153fa9e4066Sahrens }
154fa9e4066Sahrens 
155fa9e4066Sahrens static jobjectArray
create_SliceDeviceBean_array(JNIEnv * env,dmgt_slice_t ** slices)156fa9e4066Sahrens create_SliceDeviceBean_array(JNIEnv *env, dmgt_slice_t **slices)
157fa9e4066Sahrens {
158fa9e4066Sahrens 	/* Create an array list */
159fa9e4066Sahrens 	zjni_ArrayList_t list_class = {0};
160fa9e4066Sahrens 	zjni_ArrayList_t *list_class_p = &list_class;
161fa9e4066Sahrens 	zjni_new_ArrayList(env, list_class_p);
162fa9e4066Sahrens 
163fa9e4066Sahrens 	if (slices != NULL) {
164fa9e4066Sahrens 		int i;
165fa9e4066Sahrens 		for (i = 0; slices[i] != NULL; i++) {
166fa9e4066Sahrens 			dmgt_slice_t *slice = slices[i];
167fa9e4066Sahrens 			jobject obj;
168fa9e4066Sahrens 			obj = create_SliceDeviceBean(env, slice);
169fa9e4066Sahrens 			if (obj != NULL) {
170fa9e4066Sahrens 				(*env)->CallBooleanMethod(env,
171fa9e4066Sahrens 				    ((zjni_Object_t *)list_class_p)->object,
172fa9e4066Sahrens 				    ((zjni_Collection_t *)list_class_p)->
173fa9e4066Sahrens 				    method_add, obj);
174fa9e4066Sahrens 			}
175fa9e4066Sahrens 		}
176fa9e4066Sahrens 	}
177fa9e4066Sahrens 
178fa9e4066Sahrens 	return (zjni_Collection_to_array(
179fa9e4066Sahrens 	    env, (zjni_Collection_t *)list_class_p,
180fa9e4066Sahrens 	    ZFSJNI_PACKAGE_DATA "SliceDeviceBean"));
181fa9e4066Sahrens }
182fa9e4066Sahrens 
183fa9e4066Sahrens /*
184fa9e4066Sahrens  * Package-private functions
185fa9e4066Sahrens  */
186fa9e4066Sahrens 
187fa9e4066Sahrens int
zjni_create_add_DiskDevice(dmgt_disk_t * dp,void * data)188fa9e4066Sahrens zjni_create_add_DiskDevice(dmgt_disk_t *dp, void *data)
189fa9e4066Sahrens {
190fa9e4066Sahrens 	JNIEnv *env = ((zjni_ArrayCallbackData_t *)data)->env;
191fa9e4066Sahrens 	zjni_Collection_t *list = ((zjni_ArrayCallbackData_t *)data)->list;
192fa9e4066Sahrens 	jobject disk = create_DiskDeviceBean(env, dp);
193fa9e4066Sahrens 
194fa9e4066Sahrens 	/* Add disk to zjni_ArrayList */
195fa9e4066Sahrens 	(*env)->CallBooleanMethod(env, ((zjni_Object_t *)list)->object,
196fa9e4066Sahrens 	    ((zjni_Collection_t *)list)->method_add, disk);
197fa9e4066Sahrens 
198fa9e4066Sahrens 	return (0);
199fa9e4066Sahrens }
200