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