]> andersk Git - moira.git/blame - webmoira/moirai.c
Change default of winconsoleshell to something real so old clients don't
[moira.git] / webmoira / moirai.c
CommitLineData
bde1652c 1#include "mit_moira_MoiraConnectInternal.h"
2#include <moira.h>
3#include <mr_et.h>
4#include <malloc.h>
5#include <string.h>
6#include <stdio.h>
7
8static void throwMoiraException(JNIEnv *env, int code)
9{
10 char buffer[1024];
11 jmethodID mid;
12 jobject tothrow;
13 jclass IOE;
14 jstring jmess;
15
16 IOE = (*env)->FindClass(env, "mit/moira/MoiraException");
17 if (IOE == NULL) {
18 fprintf(stderr, "moirai: No Class\n");
19 goto die;
20 }
21 mid = (*env)->GetMethodID(env, IOE, "<init>", "(Ljava/lang/String;I)V");
22 if (mid == NULL) {
23 fprintf(stderr, "moirai: No Method\n");
24 goto die;
25 }
26 sprintf(buffer, "%s", error_message(code));
27 jmess = (*env)->NewStringUTF(env, buffer);
28 if (jmess == NULL) {
29 fprintf(stderr, "Cannot get new string\n");
30 goto die;
31 }
32 tothrow = (*env)->NewObject(env, IOE, mid, jmess, (jint) code);
33 if (tothrow == NULL) {
34 fprintf(stderr, "moirai: No Throw\n");
35 goto die;
36 }
37 (*env)->Throw(env, (jthrowable) tothrow);
38 return;
39 die:
40 abort();
41 return;
42}
43
44static void throwMoiraExceptionMess(JNIEnv *env, char *mess)
45{
46 jclass IOE = (*env)->FindClass(env, "mit/moira/MoiraException");
47 if (IOE == NULL) abort();
48 (*env)->ThrowNew(env, IOE, mess);
49 return;
50}
51
52JNIEXPORT void JNICALL Java_mit_moira_MoiraConnectInternal_connect(JNIEnv *env,
53 jclass Class, jstring server) {
54 int status;
55 char buffer[1024];
56 const char *aserver = (*env)->GetStringUTFChars(env, server, 0);
57 if (strlen(aserver) > sizeof(buffer)) abort();
58 strcpy(buffer, aserver);
59 (*env)->ReleaseStringUTFChars(env, server, aserver);
60 status = mr_connect(buffer);
61 if (status != MR_SUCCESS) throwMoiraException(env, status);
62 status = mr_version(2);
63 if (status != MR_SUCCESS) {
64 if (status == MR_VERSION_LOW) return; /* This is OK */
65 else {
66 mr_disconnect();
67 throwMoiraException(env, status);
68 }
69 }
70 return;
71}
72
73JNIEXPORT void JNICALL Java_mit_moira_MoiraConnectInternal_proxy(JNIEnv *env,
74 jclass Class,
75 jstring jUser) {
76 int status;
77 char buffer[1024];
78 const char *user = (*env)->GetStringUTFChars(env, jUser, 0);
79 if (strlen(user) > sizeof(buffer)) abort();
80 strcpy(buffer, user);
81 (*env)->ReleaseStringUTFChars(env, jUser, user);
82 status = mr_proxy(buffer, "Java");
83 if (status != MR_SUCCESS) throwMoiraException(env, status);
84 return;
85}
86
87
88JNIEXPORT void JNICALL Java_mit_moira_MoiraConnectInternal_auth(JNIEnv *env,
89 jclass Class) {
90 int status;
91 status = mr_auth("JavaInterface");
92 if (status != MR_SUCCESS) throwMoiraException(env, status);
93 return;
94}
95
96JNIEXPORT void JNICALL Java_mit_moira_MoiraConnectInternal_disconnect
97 (JNIEnv *env, jclass Class) {
98 mr_disconnect();
99 return;
100}
101
102typedef struct ArgBlock {
103 int alloccount;
104 int count;
105 char **stringval;
106} ArgBlock;
107
108typedef struct ListBlock {
109 int alloccount;
110 int count;
111 ArgBlock **Args;
112} ListBlock;
113
114static jobjectArray ArgBlockToJavaArray(JNIEnv *env, ArgBlock *argb);
115static jobjectArray ListBlockToJavaArray(JNIEnv *env, ListBlock *lb);
116
117extern int mr_query(char *name, int argc, char **argv,
118 int (*proc)(int, char **, void *), void *hint);
119static ListBlock *NewListBlock();
120static ArgBlock *NewArgBlock();
121static void FreeListBlock(ListBlock *);
122static int StashResults(int argc, char **argv, void *callback);
123static char **ConvertJavaArgs(JNIEnv *env, jobjectArray jargs);
124static void FreeArgs(char **args);
125
126JNIEXPORT jobjectArray JNICALL Java_mit_moira_MoiraConnectInternal_mr_1query
127 (JNIEnv *env, jclass Class, jstring jcommand, jobjectArray jargs) {
128 ListBlock *listblock = NewListBlock();
129 jobjectArray retval;
130 int status;
131 const char *command;
132 char icommand[1024];
133 char **args = ConvertJavaArgs(env, jargs);
134 if (args == NULL) return (NULL); /* It probably thru an exception */
135 command = (*env)->GetStringUTFChars(env, jcommand, 0);
136 strncpy(icommand, command, sizeof(icommand));
137
138 status = mr_query(icommand, (*env)->GetArrayLength(env, jargs), args,
139 StashResults, listblock);
140 FreeArgs(args); /* Don't need them anymore */
141 if (status != MR_SUCCESS) {
142 FreeListBlock(listblock);
143 throwMoiraException(env, status);
144 return (0);
145 }
146 /* if (listblock->count == 0) { / * No such list or empty list * /
147 FreeListBlock(listblock);
148 throwMoiraExceptionMess(env, "No Such List or Empty List");
149 return(0);
150 } */
151
152 if (listblock->count == 0) return (0);
153
154 retval = ListBlockToJavaArray(env, listblock);
155 FreeListBlock(listblock);
156 return (retval);
157
158}
159
160static ArgBlock *NewArgBlock() {
161 ArgBlock *argb = (ArgBlock *)malloc(sizeof(ArgBlock));
162 argb->alloccount = 10;
163 argb->stringval = (char **) malloc(10 * sizeof(char *));
164 argb->count = 0;
165 return (argb);
166}
167
168static void AddArg(ArgBlock *argb, char *arg) {
169 int i;
170 if (argb->alloccount <= (argb->count + 1)) {
171 char **st = malloc((2 * argb->alloccount) * sizeof(char *));
172 argb->alloccount *= 2;
173 for (i = 0; i < argb->count; i++)
174 st[i] = argb->stringval[i];
175 free(argb->stringval);
176 argb->stringval = st;
177 }
178 argb->stringval[argb->count++] = arg;
179}
180
181static ListBlock *NewListBlock() {
182 ListBlock *list = (ListBlock *)malloc(sizeof(ListBlock));
183 list->alloccount = 10;
184 list->Args = (ArgBlock **) malloc(10 * sizeof(ArgBlock *));
185 list->count = 0;
186 return (list);
187}
188
189static void FreeArgBlock(ArgBlock *argb) {
190 int i;
191 for (i = 0; i < argb->count; i++) free(argb->stringval[i]);
192 free(argb->stringval);
193 free(argb);
194}
195
196static void FreeListBlock(ListBlock *list) {
197 int i;
198 for (i = 0; i < list->count; i++) FreeArgBlock(list->Args[i]);
199 free(list->Args);
200 free(list);
201}
202
203static jobjectArray ArgBlockToJavaArray(JNIEnv *env, ArgBlock *argb) {
204 jobjectArray retval;
205 int i;
206 retval = (*env)->NewObjectArray(env, argb->count,
207 (*env)->FindClass(env, "java/lang/String"),
208 NULL);
209 for (i = 0; i < argb->count; i++) {
210 (*env)->SetObjectArrayElement(env, retval, i,
211 (*env)->NewStringUTF(env, argb->stringval[i]));
212 }
213 return (retval);
214}
215
216static jobjectArray ListBlockToJavaArray(JNIEnv *env, ListBlock *lb) {
217 jobjectArray retval;
218 int i;
219 retval = (*env)->NewObjectArray(env, lb->count,
220 (*env)->FindClass(env, "java/lang/Object"),
221 NULL);
222 for (i = 0; i < lb->count; i++)
223 (*env)->SetObjectArrayElement(env, retval, i,
224 ArgBlockToJavaArray(env, lb->Args[i]));
225 return (retval);
226}
227
228static int StashResults(int argc, char **argv, void *callback) {
229 ListBlock *list = (ListBlock *) callback;
230 ArgBlock *argb;
231 char *arg;
232 int i;
233
234 /* printf("DEBUG: StashResults argc = %d\n", argc);
235 * for (i = 0; i < argc; i++)
236 * printf("DEBUG: StashResults argv[%d] = %s\n", i, argv[i]);
237 */
238
239 while (list->alloccount <= (list->count + 1)) {
240 ArgBlock **args = (ArgBlock **) malloc(list->alloccount * 2 * sizeof(char *));
241 list->alloccount = list->alloccount * 2;
242 for(i = 0; i < list->count; i++) {
243 args[i] = list->Args[i];
244 }
245 free(list->Args);
246 list->Args = args;
247 }
248
249 argb = NewArgBlock();
250
251 for (i = 0; i < argc; i++) {
252 arg = (char *) malloc(strlen(argv[i]) + 1);
253 strcpy(arg, argv[i]);
254 AddArg(argb, arg);
255 }
256 list->Args[list->count++] = argb;
257 return (0);
258}
259
260static char **ConvertJavaArgs(JNIEnv *env, jobjectArray jargs) {
261 char **retval;
262 int i, j;
263 const char *iarg;
264 int length = (*env)->GetArrayLength(env, jargs);
265 if (length == 0) { /* Does this happen in a non-error situation? */
266 retval = (char **) malloc(sizeof (char *));
267 retval[0] = NULL;
268 return(retval);
269 }
270 retval = (char **) malloc((length + 1) * sizeof(char *));
271 for (i = 0; i < length; i++) {
272 jobject jarg = (*env)->GetObjectArrayElement(env, jargs, i);
273 if ((*env)->ExceptionOccurred(env)) {
274 for (j = 0; j < i; j++) free(retval[j]);
275 free (retval);
276 return (NULL);
277 }
278 iarg = (*env)->GetStringUTFChars(env, jarg, 0);
279 if ((*env)->ExceptionOccurred(env)) {
280 for (j = 0; j < i; j++) free(retval[j]);
281 free (retval);
282 return (NULL);
283 }
284 retval[i] = malloc(strlen(iarg) + 1);
285 strcpy(retval[i], iarg);
286 (*env)->ReleaseStringUTFChars(env, jarg, iarg);
287 }
288 retval[length] = NULL;
289 return (retval);
290}
291
292static void FreeArgs(char **args) {
293 int i;
294 i = 0;
295 while (args[i] != NULL) free(args[i++]);
296 free(args);
297}
298
This page took 0.082795 seconds and 5 git commands to generate.