home *** CD-ROM | disk | FTP | other *** search
/ Tools / WinSN5.0Ver.iso / NETSCAP.50 / WIN1998.ZIP / ns / modules / rdf / src / rdfjava.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  18.6 KB  |  533 lines

  1. /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2.  *
  3.  * The contents of this file are subject to the Netscape Public License
  4.  * Version 1.0 (the "NPL"); you may not use this file except in
  5.  * compliance with the NPL.  You may obtain a copy of the NPL at
  6.  * http://www.mozilla.org/NPL/
  7.  *
  8.  * Software distributed under the NPL is distributed on an "AS IS" basis,
  9.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
  10.  * for the specific language governing rights and limitations under the
  11.  * NPL.
  12.  *
  13.  * The Initial Developer of this code under the NPL is Netscape
  14.  * Communications Corporation.  Portions created by Netscape are
  15.  * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
  16.  * Reserved.
  17.  */
  18.  
  19. /*
  20.  *
  21.  *  $RCSfile: rdfjava.c,v $ $Revision: 3.1 $
  22.  *    Copyright ⌐ 1997 Netscape Communications Corporation, All Rights Reserved.
  23.  */
  24.  
  25. #ifdef XP_WIN32
  26.  
  27. /* this is win32 only for now until the JNI issue is resolved
  28. for other platforms.  it may well be that this needs to become JRI code */
  29.  
  30. #include <jni.h>
  31. #include "netscape_rdf_core_NativeRDF.h"
  32. #include "netscape_rdf_core_NativeRDFEnumeration.h"
  33.  
  34. #include "prtypes.h"
  35. #include "prmem.h"
  36. #include "rdf.h"
  37. #include "rdf-int.h"            /* XXX bad */
  38.  
  39.  
  40. static RDF db;                    /* there can only be one */
  41.  
  42. #define pr2jnibool(v) ((v == PR_TRUE) ? JNI_TRUE : JNI_FALSE)
  43. #define jni2prbool(v) ((v == JNI_TRUE) ? PR_TRUE : PR_FALSE)
  44.  
  45. #define RDF_ERROR NULL            /* XXX need error resource here */
  46.  
  47. static RDF_Resource 
  48. native_resource(JNIEnv *ee, jobject resource) 
  49. {
  50.     static jfieldID fid = NULL;
  51.     jstring jstr;
  52.     RDF_Resource nresource = NULL;
  53.  
  54.     if (fid == NULL) {
  55.       /* only do this once since its a well known class */
  56.       jclass cls = (*ee)->GetObjectClass(ee, resource);
  57.       fid = (*ee)->GetFieldID(ee, cls, "resourceID", "Ljava/lang/String;");
  58.       if(fid == NULL)
  59.           return NULL;
  60.     }
  61.  
  62.     jstr = (*ee)->GetObjectField(ee, resource, fid);
  63.     if (jstr) {
  64.         const char *str;
  65.         str = (*ee)->GetStringUTFChars(ee, jstr, 0);
  66.         /* XXX no RDF_GetResource */
  67.         nresource = RDF_GetResource(NULL, (char *)str, PR_TRUE);
  68.         (*ee)->ReleaseStringUTFChars(ee, jstr, str);
  69.     }
  70.     return nresource;
  71. }
  72.  
  73.  
  74. /* XXX this needs to be real */
  75. static jchar *
  76. char2unicode(char *str, int32 len)
  77. {
  78.     char *r;
  79.     if (r = PR_Calloc(len, sizeof(jchar))) {
  80.         while (*str && --len >= 0) {
  81.             *r++ = (char)0xff;
  82.             *r++ = *str++;
  83.         }
  84.     }
  85.     return (jchar *)r;
  86. }
  87.  
  88. static jobject
  89. java_resource(JNIEnv *ee, RDF_Resource resource)
  90. {
  91.     jobject jresource = NULL;
  92.     jclass cls = (*ee)->FindClass(ee, "netscape.rdf.Resource");
  93.     if (cls) {
  94.         jmethodID mid = (*ee)->GetStaticMethodID(ee, cls, "getResource", 
  95.                                                  "(Ljava/lang/String;)Lnetscape/rdf/Resource;");
  96.         if (mid != NULL) {
  97.             jchar *ustring;
  98.             int32 len = strlen(resource->id);
  99.             if (ustring = char2unicode(resource->id, len)) {
  100.                 jstring jid = (*ee)->NewString(ee, ustring, len);
  101.                 if (jid != NULL) {
  102.                     jresource = (*ee)->CallStaticObjectMethod(ee, cls, mid, jid);
  103.                 }
  104.             }
  105.         }
  106.     }
  107.     return jresource;
  108. }
  109.  
  110.  
  111. JNIEXPORT void JNICALL
  112. Java_netscape_rdf_core_NativeRDF_NativeRDF0
  113.     /* ([Ljava/lang/String;)V */
  114. (JNIEnv *ee, jobject this, jobjectArray array) 
  115. {
  116.     /* allow only one instance of the db for now */
  117.     if(!db) {
  118.         jsize i, len;
  119.         const char **dbs;
  120.         jobject obj;
  121.  
  122.         len = (*ee)->GetArrayLength(ee, array);
  123.         dbs = PR_Calloc(len, sizeof(char *));
  124.         if (dbs) {
  125.             for (i=0; i<len; i++) {
  126.                 obj = (*ee)->GetObjectArrayElement(ee, array, i);
  127.                 /* XXX check for a string */
  128.                 dbs[i] = (*ee)->GetStringUTFChars(ee, obj, 0);
  129.             }
  130.             /* XXX API should take const */
  131.             db = RDF_GetDB((char **)dbs);
  132.             for (i=0; i<len; i++) {
  133.                 obj = (*ee)->GetObjectArrayElement(ee, array, i);
  134.                 (*ee)->ReleaseStringUTFChars(ee, obj, dbs[i]);
  135.             }
  136.        }
  137.     }
  138.     return;
  139. }
  140.  
  141. static jobject 
  142. native_assert(JNIEnv *ee, jobject this, jobject src, jobject arcLabel, RDF_ValueType targetType, void *nTarget)
  143. {
  144.     PRBool v;
  145.     RDF_Resource nSrc, narcLabel;
  146.  
  147.     nSrc = native_resource(ee, src);
  148.     narcLabel = native_resource(ee, arcLabel);
  149.     if(!(nSrc && narcLabel && nTarget)) {
  150.         return RDF_ERROR;
  151.     }
  152.     v = RDF_Assert(db, nSrc, narcLabel, nTarget, targetType);
  153.     return (v == PR_TRUE)? NULL : RDF_ERROR;
  154. }
  155.  
  156. JNIEXPORT jobject JNICALL 
  157. Java_netscape_rdf_core_NativeRDF_assert__Lnetscape_rdf_Resource_2Lnetscape_rdf_Resource_2Lnetscape_rdf_Resource_2
  158.     /* (Lnetscape/rdf/Resource;Lnetscape/rdf/Resource;Lnetscape/rdf/Resource;)Lnetscape/rdf/Resource */
  159. (JNIEnv *ee, jobject this, jobject src, jobject arcLabel, jobject target) 
  160. {
  161.     void *nTarget = (void *)native_resource(ee, target);
  162.     return native_assert(ee, this, src, arcLabel, RDF_RESOURCE_TYPE, nTarget);
  163. }
  164.  
  165. JNIEXPORT jobject JNICALL 
  166. Java_netscape_rdf_core_NativeRDF_assert__Lnetscape_rdf_Resource_2Lnetscape_rdf_Resource_2Ljava_lang_String_2
  167.     /* (Lnetscape/rdf/Resource;Lnetscape/rdf/Resource;Ljava/lang/String;)Lnetscape/rdf/Resource */
  168. (JNIEnv *ee, jobject this, jobject src, jobject arcLabel, jstring target) 
  169. {
  170.     jobject v;
  171.     const char *nTarget = (*ee)->GetStringUTFChars(ee, target, 0);
  172.     v =  native_assert(ee, this, src, arcLabel, RDF_STRING_TYPE, (void *)nTarget);
  173.     (*ee)->ReleaseStringUTFChars(ee, target, nTarget);
  174.     return v;
  175. }
  176.  
  177. JNIEXPORT jobject JNICALL 
  178. Java_netscape_rdf_core_NativeRDF_assert__Lnetscape_rdf_Resource_2Lnetscape_rdf_Resource_2I
  179.       /* (Lnetscape/rdf/Resource;Lnetscape/rdf/Resource;I)Lnetscape/rdf/Resource */
  180. (JNIEnv *ee, jobject this, jobject src, jobject arcLabel, jint target) 
  181. {
  182.     void *nTarget = (void *)⌖
  183.     return native_assert(ee, this, src, arcLabel, RDF_INT_TYPE, nTarget);
  184. }
  185.  
  186. static jobject 
  187. native_assert_false(JNIEnv *ee, jobject this, jobject src, jobject arcLabel, RDF_ValueType targetType, void *nTarget)
  188. {
  189.     PRBool v;
  190.     RDF_Resource nSrc, narcLabel;
  191.  
  192.     nSrc = native_resource(ee, src);
  193.     narcLabel = native_resource(ee, arcLabel);
  194.     if(!(nSrc && narcLabel && nTarget)) {
  195.         return RDF_ERROR;
  196.     }
  197.     v = RDF_AssertFalse(db, nSrc, narcLabel, nTarget, targetType);
  198.     return (v == PR_TRUE)? NULL : RDF_ERROR;
  199. }
  200.  
  201. JNIEXPORT jobject JNICALL 
  202. Java_netscape_rdf_core_NativeRDF_assertFalse__Lnetscape_rdf_Resource_2Lnetscape_rdf_Resource_2Lnetscape_rdf_Resource_2
  203.     /* (Lnetscape/rdf/Resource;Lnetscape/rdf/Resource;Lnetscape/rdf/Resource;)Lnetscape/rdf/Resource */
  204. (JNIEnv *ee, jobject this, jobject src, jobject arcLabel, jobject target) 
  205. {
  206.     void *nTarget = (void *)native_resource(ee, target);
  207.     return native_assert_false(ee, this, src, arcLabel, RDF_RESOURCE_TYPE, nTarget);
  208. }
  209.  
  210. JNIEXPORT jobject JNICALL 
  211. Java_netscape_rdf_core_NativeRDF_assertFalse__Lnetscape_rdf_Resource_2Lnetscape_rdf_Resource_2I
  212.     /* (Lnetscape/rdf/Resource;Lnetscape/rdf/Resource;I)Lnetscape/rdf/Resource */
  213. (JNIEnv *ee, jobject this, jobject src, jobject arcLabel, jint target) 
  214. {
  215.     void *nTarget = (void *)⌖
  216.     return native_assert_false(ee, this, src, arcLabel, RDF_INT_TYPE, nTarget);
  217. }
  218.  
  219. JNIEXPORT jobject JNICALL 
  220. Java_netscape_rdf_core_NativeRDF_assertFalse__Lnetscape_rdf_Resource_2Lnetscape_rdf_Resource_2Ljava_lang_String_2
  221.     /* (Lnetscape/rdf/Resource;Lnetscape/rdf/Resource;Ljava/lang/String;)Lnetscape/rdf/Resource */
  222. (JNIEnv *ee, jobject this, jobject src, jobject arcLabel, jstring target) 
  223. {
  224.     jobject v;
  225.     const char *nTarget = (*ee)->GetStringUTFChars(ee, target, 0);
  226.     v =  native_assert_false(ee, this, src, arcLabel, RDF_STRING_TYPE, (void *)nTarget);
  227.     (*ee)->ReleaseStringUTFChars(ee, target, nTarget);
  228.     return v;
  229. }
  230.  
  231. static jobject 
  232. native_unassert(JNIEnv *ee, jobject this, jobject src, jobject arcLabel, RDF_ValueType targetType, void *nTarget)
  233. {
  234.     PRBool v;
  235.     RDF_Resource nSrc, narcLabel;
  236.  
  237.     nSrc = native_resource(ee, src);
  238.     narcLabel = native_resource(ee, arcLabel);
  239.     if(!(nSrc && narcLabel && nTarget)) {
  240.         return RDF_ERROR;
  241.     }
  242.     v = RDF_Unassert(db, nSrc, narcLabel, nTarget, targetType);
  243.     return (v == PR_TRUE)? NULL : RDF_ERROR;
  244. }
  245.  
  246. JNIEXPORT jobject JNICALL 
  247. Java_netscape_rdf_core_NativeRDF_unassert__Lnetscape_rdf_Resource_2Lnetscape_rdf_Resource_2Lnetscape_rdf_Resource_2
  248.     /* (Lnetscape/rdf/Resource;Lnetscape/rdf/Resource;Lnetscape/rdf/Resource;)Lnetscape/rdf/Resource */
  249. (JNIEnv *ee, jobject this, jobject src, jobject arcLabel, jobject target) 
  250. {
  251.     void *nTarget = (void *)native_resource(ee, target);
  252.     return native_unassert(ee, this, src, arcLabel, RDF_RESOURCE_TYPE, nTarget);
  253. }
  254.  
  255. JNIEXPORT jobject JNICALL 
  256. Java_netscape_rdf_core_NativeRDF_unassert__Lnetscape_rdf_Resource_2Lnetscape_rdf_Resource_2I
  257.     /* (Lnetscape/rdf/Resource;Lnetscape/rdf/Resource;I)Lnetscape/rdf/Resource */
  258. (JNIEnv *ee, jobject this, jobject src, jobject arcLabel, jint target) 
  259. {
  260.     void *nTarget = (void *)⌖
  261.     return native_unassert(ee, this, src, arcLabel, RDF_INT_TYPE, nTarget);
  262. }
  263.  
  264. JNIEXPORT jobject JNICALL 
  265. Java_netscape_rdf_core_NativeRDF_unassert__Lnetscape_rdf_Resource_2Lnetscape_rdf_Resource_2Ljava_lang_String_2
  266.     /* (Lnetscape/rdf/Resource;Lnetscape/rdf/Resource;Ljava/lang/String;)Lnetscape/rdf/Resource */
  267. (JNIEnv *ee, jobject this, jobject src, jobject arcLabel, jstring target) 
  268. {
  269.     jobject v;
  270.     const char *nTarget = (*ee)->GetStringUTFChars(ee, target, 0);
  271.     v =  native_unassert(ee, this, src, arcLabel, RDF_STRING_TYPE, (void *)nTarget);
  272.     (*ee)->ReleaseStringUTFChars(ee, target, nTarget);
  273.     return v;
  274. }
  275.  
  276. static jboolean 
  277. native_has_assertion(JNIEnv *ee, jobject this, jobject src, jobject arcLabel, RDF_ValueType targetType, 
  278.                      void *nTarget, jboolean isTrue)
  279. {
  280.     PRBool v;
  281.     RDF_Resource nSrc, narcLabel;
  282.  
  283.     nSrc = native_resource(ee, src);
  284.     narcLabel = native_resource(ee, arcLabel);
  285.     if(!(nSrc && narcLabel && nTarget)) {
  286.         return JNI_FALSE;
  287.     }
  288.     v = RDF_HasAssertion(db, nSrc, narcLabel, nTarget, targetType, jni2prbool(isTrue));
  289.     return pr2jnibool(v);
  290. }
  291.  
  292. JNIEXPORT jboolean JNICALL 
  293. Java_netscape_rdf_core_NativeRDF_hasAssertion__Lnetscape_rdf_Resource_2Lnetscape_rdf_Resource_2Lnetscape_rdf_Resource_2Z
  294.     /* (Lnetscape/rdf/Resource;Lnetscape/rdf/Resource;Lnetscape/rdf/Resource;Z) */
  295. (JNIEnv *ee, jobject this, jobject src, jobject arcLabel, jobject target, jboolean isTrue)
  296. {
  297.     void *nTarget = (void *)native_resource(ee, target);
  298.     return native_has_assertion(ee, this, src, arcLabel, RDF_RESOURCE_TYPE, nTarget, isTrue);
  299. }
  300.  
  301. JNIEXPORT jboolean JNICALL 
  302. Java_netscape_rdf_core_NativeRDF_hasAssertion__Lnetscape_rdf_Resource_2Lnetscape_rdf_Resource_2Ljava_lang_String_2Z
  303.     /* (Lnetscape/rdf/Resource;Lnetscape/rdf/Resource;Ljava/lang/String;Z) */
  304. (JNIEnv *ee, jobject this, jobject src, jobject arcLabel, jstring target, jboolean isTrue) 
  305. {
  306.     jboolean v;
  307.     const char *nTarget = (*ee)->GetStringUTFChars(ee, target, 0);
  308.     v = native_has_assertion(ee, this, src, arcLabel, RDF_STRING_TYPE, (void *)nTarget, isTrue);
  309.     (*ee)->ReleaseStringUTFChars(ee, target, nTarget);
  310.     return v;
  311. }
  312.  
  313. JNIEXPORT jboolean JNICALL 
  314. Java_netscape_rdf_core_NativeRDF_hasAssertion__Lnetscape_rdf_Resource_2Lnetscape_rdf_Resource_2IZ
  315.     /* (Lnetscape/rdf/Resource;Lnetscape/rdf/Resource;IZ)Z */
  316. (JNIEnv *ee, jobject this, jobject src, jobject arcLabel, jint target, jboolean isTrue) 
  317. {
  318.     void *nTarget = (void *)⌖
  319.     return native_has_assertion(ee, this, src, arcLabel, RDF_INT_TYPE, nTarget, isTrue);
  320. }
  321.  
  322. static jfieldID cursor_fid(JNIEnv *ee, jclass class)
  323. {
  324.     static jfieldID fid = NULL;
  325.     /* its ok to cache this, but not the class itself */
  326.     if (fid==NULL && class != NULL) {
  327.         fid = (*ee)->GetFieldID(ee, class, "cursor", "Ljava/lang/Double;");
  328.     }
  329.     return fid;
  330. }
  331.  
  332. static jobject new_enumeration(JNIEnv *ee, RDF_Cursor cursor)
  333. {
  334.     jobject enumeration = NULL;
  335.     jclass class = (*ee)->FindClass(ee, "netscape.rdf.core.NativeRDFEnumeration");
  336.  
  337.     if (class != NULL) {
  338.         enumeration = (*ee)->AllocObject(ee, class);
  339.         if (enumeration != NULL) {
  340.             jfieldID fid = cursor_fid(ee, class);
  341.             if (fid != NULL) {
  342.                 jdouble jhack;
  343.                 memcpy(&jhack, cursor, sizeof(jdouble));
  344.                 (*ee)->SetDoubleField(ee, enumeration, fid, jhack);
  345.             }
  346.         }
  347.     }
  348.     return enumeration;
  349. }
  350.  
  351. JNIEXPORT jobject JNICALL 
  352. Java_netscape_rdf_core_NativeRDF_getTargets
  353.     /* (Lnetscape/rdf/Resource;Lnetscape/rdf/Resource;Z)Ljava/util/Enumeration */
  354. (JNIEnv *ee, jobject this, jobject src, jobject arcLabel, jboolean isTrue) 
  355. {
  356.     RDF_Resource nSrc, narcLabel;
  357.     RDF_Cursor cursor;
  358.     jobject enumeration = NULL;
  359.  
  360.     nSrc = native_resource(ee, src);
  361.     narcLabel = native_resource(ee, arcLabel);
  362.  
  363.     /* XXX API mismatch */
  364.     cursor = RDF_GetTargets (db, nSrc, narcLabel, RDF_RESOURCE_TYPE, jni2prbool(isTrue));
  365.     if (cursor != NULL) {
  366.         enumeration = new_enumeration(ee, cursor);
  367.     }
  368.     return enumeration;
  369. }
  370.  
  371. JNIEXPORT jobject JNICALL 
  372. Java_netscape_rdf_core_NativeRDF_getTarget
  373.     /* (Lnetscape/rdf/Resource;Lnetscape/rdf/Resource;Z)Ljava/lang/Object */
  374. (JNIEnv *ee, jobject this, jobject src, jobject arcLabel, jboolean isTrue) 
  375. {
  376.     /* XXX API mismatch */
  377.     return NULL;
  378. }
  379.  
  380. static jobject 
  381. native_get_sources(JNIEnv *ee, jobject this, jobject arcLabel, RDF_ValueType targetType, void *nTarget, jboolean isTrue)
  382. {
  383.     RDF_Resource narcLabel;
  384.     RDF_Cursor cursor;
  385.     jobject enumeration = NULL;
  386.     
  387.     narcLabel = native_resource(ee, arcLabel);
  388.     if(narcLabel && nTarget) {
  389.         cursor = RDF_GetSources(db, nTarget, narcLabel, targetType, jni2prbool(isTrue));
  390.         if (cursor != NULL) {
  391.             enumeration = new_enumeration(ee, cursor);
  392.         }
  393.     }    
  394.     return enumeration;
  395. }
  396.  
  397. JNIEXPORT jobject JNICALL 
  398. Java_netscape_rdf_core_NativeRDF_getSources__Lnetscape_rdf_Resource_2Lnetscape_rdf_Resource_2Z
  399.     /* (Lnetscape/rdf/Resource;Lnetscape/rdf/Resource;Z)Ljava/util/Enumeration */
  400. (JNIEnv *ee, jobject this, jobject arcLabel, jobject target, jboolean isTrue) 
  401. {
  402.     void *nTarget = (void *)native_resource(ee, target);
  403.     return native_get_sources(ee, this, arcLabel, RDF_RESOURCE_TYPE, nTarget, isTrue);
  404. }
  405.  
  406. JNIEXPORT jobject JNICALL 
  407. Java_netscape_rdf_core_NativeRDF_getSources__Lnetscape_rdf_Resource_2IZ
  408.     /* (Lnetscape/rdf/Resource;IZ)Ljava/util/Enumeration */
  409. (JNIEnv *ee, jobject this, jobject arcLabel, jint target, jboolean isTrue) 
  410. {
  411.     void *nTarget = (void *)⌖
  412.     return native_get_sources(ee, this, arcLabel, RDF_INT_TYPE, nTarget, isTrue);
  413. }
  414.  
  415. JNIEXPORT jobject JNICALL 
  416. Java_netscape_rdf_core_NativeRDF_getSources__Lnetscape_rdf_Resource_2Ljava_lang_String_2Z
  417.     /* (Lnetscape/rdf/Resource;Ljava/lang/String;Z)Ljava/util/Enumeration */
  418. (JNIEnv *ee, jobject this, jobject arcLabel, jstring target, jboolean isTrue) 
  419. {
  420.     jobject v;
  421.     const char *nTarget = (*ee)->GetStringUTFChars(ee, target, 0);
  422.     v =  native_get_sources(ee, this, arcLabel, RDF_STRING_TYPE, (void *)nTarget, isTrue);
  423.     (*ee)->ReleaseStringUTFChars(ee, target, nTarget);
  424.     return v;
  425. }
  426.  
  427. static jobject 
  428. native_get_source(JNIEnv *ee, jobject this, jobject arcLabel, RDF_ValueType targetType, void *nTarget, jboolean isTrue)
  429. {
  430.     RDF_Resource narcLabel;
  431.     jobject resource = NULL;
  432.     
  433.     narcLabel = native_resource(ee, arcLabel);
  434.     if(narcLabel && nTarget) {
  435.         /* XXX API mismatch */
  436.         RDF_Cursor cursor = RDF_GetSources(db, nTarget, narcLabel, targetType, jni2prbool(isTrue));
  437.         if (cursor != NULL) {
  438.             /* XXX no constraint */
  439.             RDF_Resource first = RDF_NextValue(cursor);
  440.             if (first != NULL) {
  441.                 resource = java_resource(ee, first);
  442.             }
  443.             RDF_DisposeCursor(cursor);
  444.         }
  445.     }
  446.     return resource;
  447. }
  448.  
  449. JNIEXPORT jobject JNICALL 
  450. Java_netscape_rdf_core_NativeRDF_getSource__Lnetscape_rdf_Resource_2Lnetscape_rdf_Resource_2Z
  451.     /* (Lnetscape/rdf/Resource;Lnetscape/rdf/Resource;Z)Lnetscape/rdf/Resource */
  452. (JNIEnv *ee, jobject this, jobject arcLabel, jobject target, jboolean isTrue) 
  453. {
  454.     void *nTarget = (void *)native_resource(ee, target);
  455.     return native_get_source(ee, this, arcLabel, RDF_RESOURCE_TYPE, nTarget, isTrue);
  456. }
  457.  
  458. JNIEXPORT jobject JNICALL 
  459. Java_netscape_rdf_core_NativeRDF_getSource__Lnetscape_rdf_Resource_2IZ
  460.     /* (Lnetscape/rdf/Resource;IZ)Lnetscape/rdf/Resource */
  461. (JNIEnv *ee, jobject this, jobject arcLabel, jint target, jboolean isTrue) 
  462. {
  463.     void *nTarget = (void *)⌖
  464.     return native_get_source(ee, this, arcLabel, RDF_INT_TYPE, nTarget, isTrue);
  465. }
  466.  
  467. JNIEXPORT jobject JNICALL 
  468. Java_netscape_rdf_core_NativeRDF_getSource__Lnetscape_rdf_Resource_2Ljava_lang_String_2Z
  469.     /* (Lnetscape/rdf/Resource;Ljava/lang/String;Z)Lnetscape/rdf/Resource */
  470. (JNIEnv *ee, jobject this, jobject arcLabel, jstring target, jboolean isTrue) 
  471. {
  472.     jobject v;
  473.     const char *nTarget = (*ee)->GetStringUTFChars(ee, target, 0);
  474.     v =  native_get_source(ee, this, arcLabel, RDF_STRING_TYPE, (void *)nTarget, isTrue);
  475.     (*ee)->ReleaseStringUTFChars(ee, target, nTarget);
  476.     return v;
  477. }
  478.  
  479. JNIEXPORT jboolean JNICALL 
  480. Java_netscape_rdf_core_NativeRDF_addNotifiable
  481.     /* (Lnetscape/rdf/IRDFNotifiable;Lnetscape/rdf/RDFEvent;) */
  482. (JNIEnv *ee, jobject this, jobject observer, jobject event) 
  483. {
  484.     /* XXX not implemented yet */
  485.     return JNI_FALSE;
  486. }
  487.  
  488. JNIEXPORT void JNICALL 
  489. Java_netscape_rdf_core_NativeRDF_deleteNotifiable
  490.     /* (Lnetscape/rdf/IRDFNotifiable;Lnetscape/rdf/RDFEvent;) */
  491. (JNIEnv *ee, jobject this, jobject observer, jobject event) 
  492. {
  493.     /* XXX not implemented yet */
  494.     return;
  495. }
  496.  
  497. JNIEXPORT jboolean JNICALL 
  498. Java_netscape_rdf_core_NativeRDFEnumeration_hasMoreElements
  499.     /* ()Z */
  500. (JNIEnv *ee, jobject this) 
  501. {
  502.     RDF_Cursor cursor = NULL;
  503.     /* the fid has to exist because the enumeration was constructed already */
  504.     jfieldID fid = cursor_fid(ee, NULL);
  505.     if (fid != NULL) {
  506.         cursor = (RDF_Cursor)(*ee)->GetObjectField(ee, this, fid);
  507.     }
  508.     /* XXX need to know for sure */
  509.     return JNI_TRUE;
  510. }
  511.  
  512. JNIEXPORT jobject JNICALL 
  513. Java_netscape_rdf_core_NativeRDFEnumeration_nextElement
  514.     /* ()Ljava/lang/Object */
  515. (JNIEnv *ee, jobject this)
  516. {
  517.     jobject resource = NULL;
  518.     RDF_Cursor cursor = NULL;
  519.     /* the fid has to exist because the enumeration was constructed already */
  520.     jfieldID fid = cursor_fid(ee, NULL);
  521.     if (fid != NULL) {
  522.         cursor = (RDF_Cursor)(*ee)->GetObjectField(ee, this, fid);
  523.         if (cursor != NULL) {
  524.             /* XXX cursor is not constrained */
  525.             void *datum = RDF_NextValue(cursor);
  526.         }
  527.     }
  528.     /* XXX RDF_DisposeCursor? */
  529.     return resource;
  530. }
  531.  
  532. #endif
  533.