xref: /onnv-gate/usr/src/lib/libzfs_jni/common/libzfs_jni_disk.c (revision 1066:7ebdc59e2074)
1789Sahrens /*
2789Sahrens  * CDDL HEADER START
3789Sahrens  *
4789Sahrens  * The contents of this file are subject to the terms of the
5789Sahrens  * Common Development and Distribution License, Version 1.0 only
6789Sahrens  * (the "License").  You may not use this file except in compliance
7789Sahrens  * with the License.
8789Sahrens  *
9789Sahrens  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10789Sahrens  * or http://www.opensolaris.org/os/licensing.
11789Sahrens  * See the License for the specific language governing permissions
12789Sahrens  * and limitations under the License.
13789Sahrens  *
14789Sahrens  * When distributing Covered Code, include this CDDL HEADER in each
15789Sahrens  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16789Sahrens  * If applicable, add the following below this CDDL HEADER, with the
17789Sahrens  * fields enclosed by brackets "[]" replaced with your own identifying
18789Sahrens  * information: Portions Copyright [yyyy] [name of copyright owner]
19789Sahrens  *
20789Sahrens  * CDDL HEADER END
21789Sahrens  */
22789Sahrens /*
23789Sahrens  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24789Sahrens  * Use is subject to license terms.
25789Sahrens  */
26789Sahrens 
27789Sahrens #pragma ident	"%Z%%M%	%I%	%E% SMI"
28789Sahrens 
29789Sahrens #include "libzfs_jni_disk.h"
30789Sahrens 
31789Sahrens /*
32789Sahrens  * Function prototypes
33789Sahrens  */
34789Sahrens 
35789Sahrens static jobject create_DiskDeviceBean(JNIEnv *, dmgt_disk_t *);
36789Sahrens static jobject get_SliceUsage_Use(JNIEnv *, char *);
37789Sahrens static jobject create_SliceUsage(JNIEnv *env, dmgt_slice_t *sp);
38789Sahrens static jobject create_SliceDeviceBean(JNIEnv *env, dmgt_slice_t *sp);
39789Sahrens static jobjectArray create_SliceDeviceBean_array(JNIEnv *, dmgt_slice_t **);
40789Sahrens 
41789Sahrens /*
42789Sahrens  * Static functions
43789Sahrens  */
44789Sahrens 
45789Sahrens static jobject
create_DiskDeviceBean(JNIEnv * env,dmgt_disk_t * dp)46789Sahrens create_DiskDeviceBean(JNIEnv *env, dmgt_disk_t *dp)
47789Sahrens {
48789Sahrens 	jobject disk = NULL;
49789Sahrens 
50789Sahrens 	int naliases = zjni_count_elements((void **)dp->aliases);
51894Stalley 	jobjectArray aliases = zjni_c_string_array_to_java(
52789Sahrens 	    env, dp->aliases, naliases);
53789Sahrens 	if (aliases != NULL) {
54789Sahrens 		jobjectArray slices = create_SliceDeviceBean_array(env,
55789Sahrens 		    dp->slices);
56789Sahrens 		if (slices != NULL) {
57789Sahrens 			jstring nameUTF = (*env)->NewStringUTF(env, dp->name);
58789Sahrens 
59*1066Stalley 			jboolean in_use = dp->in_use ? JNI_TRUE : JNI_FALSE;
60*1066Stalley 
61789Sahrens 			jclass class_DiskDeviceBean = (*env)->FindClass(
62789Sahrens 			    env, ZFSJNI_PACKAGE_DATA "DiskDeviceBean");
63789Sahrens 
64789Sahrens 			jmethodID constructor =
65789Sahrens 			    (*env)->GetMethodID(env, class_DiskDeviceBean,
66789Sahrens 				"<init>",
67789Sahrens 				"(JLjava/lang/String;[Ljava/lang/String;[L"
68*1066Stalley 				ZFSJNI_PACKAGE_DATA "SliceDeviceBean;Z)V");
69789Sahrens 
70789Sahrens 			disk = (*env)->NewObject(env, class_DiskDeviceBean,
71*1066Stalley 			    constructor, dp->size, nameUTF, aliases, slices,
72*1066Stalley 			    in_use);
73789Sahrens 		}
74789Sahrens 	}
75789Sahrens 
76789Sahrens 	return (disk);
77789Sahrens }
78789Sahrens 
79789Sahrens static jobject
get_SliceUsage_Use(JNIEnv * env,char * dm_usage)80789Sahrens get_SliceUsage_Use(JNIEnv *env, char *dm_usage)
81789Sahrens {
82789Sahrens 	jobject enumVal = NULL;
83789Sahrens 
84789Sahrens 	if (dm_usage != NULL) {
85789Sahrens 		jclass class_SliceUsage_Use = (*env)->FindClass(
86789Sahrens 		    env, ZFSJNI_PACKAGE_DATA "SliceUsage$Use");
87789Sahrens 
88789Sahrens 		jfieldID id = (*env)->GetStaticFieldID(env,
89789Sahrens 		    class_SliceUsage_Use,
90789Sahrens 		    dm_usage, "L" ZFSJNI_PACKAGE_DATA "SliceUsage$Use;");
91789Sahrens 
92789Sahrens 		if (id != NULL) {
93789Sahrens 			/* Retrieve the proper SliceUsage$Use enum value */
94789Sahrens 			enumVal = (*env)->GetStaticObjectField(
95789Sahrens 			    env, class_SliceUsage_Use, id);
96789Sahrens #ifdef	DEBUG
97789Sahrens 		} else {
98789Sahrens 			(void) fprintf(stderr, "Unknown slice usage: %s\n",
99789Sahrens 			    dm_usage);
100789Sahrens #endif /* DEBUG */
101789Sahrens 		}
102789Sahrens 	}
103789Sahrens 
104789Sahrens 	return (enumVal);
105789Sahrens }
106789Sahrens 
107789Sahrens static jobject
create_SliceUsage(JNIEnv * env,dmgt_slice_t * sp)108789Sahrens create_SliceUsage(JNIEnv *env, dmgt_slice_t *sp)
109789Sahrens {
110789Sahrens 	jobject usage = NULL;
111789Sahrens 	if (sp->used_name != NULL) {
112789Sahrens 		jobject use = get_SliceUsage_Use(env, sp->used_name);
113789Sahrens 
114789Sahrens 		if (use != NULL) {
115789Sahrens 			jstring usedByUTF =
116789Sahrens 			    (*env)->NewStringUTF(env, sp->used_by);
117789Sahrens 
118789Sahrens 			jclass class_SliceUsage = (*env)->FindClass(
119789Sahrens 			    env, ZFSJNI_PACKAGE_DATA "SliceUsage");
120789Sahrens 
121789Sahrens 			jmethodID constructor =
122789Sahrens 			    (*env)->GetMethodID(env, class_SliceUsage, "<init>",
123789Sahrens 				"(L" ZFSJNI_PACKAGE_DATA
124789Sahrens 				"SliceUsage$Use;Ljava/lang/String;)V");
125789Sahrens 
126789Sahrens 			usage = (*env)->NewObject(env,
127789Sahrens 			    class_SliceUsage, constructor, use, usedByUTF);
128789Sahrens 		}
129789Sahrens 	}
130789Sahrens 
131789Sahrens 	return (usage);
132789Sahrens }
133789Sahrens 
134789Sahrens static jobject
create_SliceDeviceBean(JNIEnv * env,dmgt_slice_t * sp)135789Sahrens create_SliceDeviceBean(JNIEnv *env, dmgt_slice_t *sp)
136789Sahrens {
137789Sahrens 	jobject slice = NULL;
138789Sahrens 
139789Sahrens 	/* May be NULL if unused */
140789Sahrens 	jobject usage = create_SliceUsage(env, sp);
141789Sahrens 
142789Sahrens 	jstring nameUTF = (*env)->NewStringUTF(env, sp->name);
143789Sahrens 
144789Sahrens 	jclass class_SliceDeviceBean = (*env)->FindClass(
145789Sahrens 	    env, ZFSJNI_PACKAGE_DATA "SliceDeviceBean");
146789Sahrens 
147789Sahrens 	jmethodID constructor =
148789Sahrens 	    (*env)->GetMethodID(env, class_SliceDeviceBean, "<init>",
149789Sahrens 		"(JLjava/lang/String;JL" ZFSJNI_PACKAGE_DATA "SliceUsage;)V");
150789Sahrens 
151789Sahrens 	slice = (*env)->NewObject(env, class_SliceDeviceBean,
152789Sahrens 	    constructor, sp->size, nameUTF, sp->start, usage);
153789Sahrens 
154789Sahrens 	return (slice);
155789Sahrens }
156789Sahrens 
157789Sahrens static jobjectArray
create_SliceDeviceBean_array(JNIEnv * env,dmgt_slice_t ** slices)158789Sahrens create_SliceDeviceBean_array(JNIEnv *env, dmgt_slice_t **slices)
159789Sahrens {
160789Sahrens 	/* Create an array list */
161789Sahrens 	zjni_ArrayList_t list_class = {0};
162789Sahrens 	zjni_ArrayList_t *list_class_p = &list_class;
163789Sahrens 	zjni_new_ArrayList(env, list_class_p);
164789Sahrens 
165789Sahrens 	if (slices != NULL) {
166789Sahrens 		int i;
167789Sahrens 		for (i = 0; slices[i] != NULL; i++) {
168789Sahrens 			dmgt_slice_t *slice = slices[i];
169789Sahrens 			jobject obj;
170789Sahrens 			obj = create_SliceDeviceBean(env, slice);
171789Sahrens 			if (obj != NULL) {
172789Sahrens 				(*env)->CallBooleanMethod(env,
173789Sahrens 				    ((zjni_Object_t *)list_class_p)->object,
174789Sahrens 				    ((zjni_Collection_t *)list_class_p)->
175789Sahrens 				    method_add, obj);
176789Sahrens 			}
177789Sahrens 		}
178789Sahrens 	}
179789Sahrens 
180789Sahrens 	return (zjni_Collection_to_array(
181789Sahrens 	    env, (zjni_Collection_t *)list_class_p,
182789Sahrens 	    ZFSJNI_PACKAGE_DATA "SliceDeviceBean"));
183789Sahrens }
184789Sahrens 
185789Sahrens /*
186789Sahrens  * Package-private functions
187789Sahrens  */
188789Sahrens 
189789Sahrens int
zjni_create_add_DiskDevice(dmgt_disk_t * dp,void * data)190789Sahrens zjni_create_add_DiskDevice(dmgt_disk_t *dp, void *data)
191789Sahrens {
192789Sahrens 	JNIEnv *env = ((zjni_ArrayCallbackData_t *)data)->env;
193789Sahrens 	zjni_Collection_t *list = ((zjni_ArrayCallbackData_t *)data)->list;
194789Sahrens 	jobject disk = create_DiskDeviceBean(env, dp);
195789Sahrens 
196789Sahrens 	/* Add disk to zjni_ArrayList */
197789Sahrens 	(*env)->CallBooleanMethod(env, ((zjni_Object_t *)list)->object,
198789Sahrens 	    ((zjni_Collection_t *)list)->method_add, disk);
199789Sahrens 
200789Sahrens 	return (0);
201789Sahrens }
202