#include <string.h> #include <jni.h> #include "org_clearsilver_CS.h" #include "cs_config.h" #include "util/neo_err.h" #include "util/neo_misc.h" #include "util/neo_str.h" #include "util/neo_hdf.h" #include "cgi/cgi.h" #include "cgi/cgiwrap.h" #include "cgi/date.h" #include "cgi/html.h" #include "cs/cs.h" #include "j_neo_util.h" jfieldID _csobjFldID = NULL; static void jErr(JNIEnv *env, char *error_string) { jclass newExcCls = (*env)->FindClass(env, "java/lang/RuntimeException"); if (newExcCls == 0) { // unable to find proper class! return; } (*env)->ThrowNew(env, newExcCls, error_string); } int jNeoErr (JNIEnv *env, NEOERR *err); JNIEXPORT jlong JNICALL Java_org_clearsilver_CS__1init (JNIEnv *env, jobject obj, jlong hdf_obj_ptr) { HDF *hdf = (HDF *)hdf_obj_ptr; CSPARSE *cs = NULL; NEOERR *err; // if (!_hdfobjFldID) { // jclass objClass = (*env)->GetObjectClass(env,obj); // _hdfobjFldID = (*env)->GetFieldID(env,objClass,"hdfptr","i"); // } err = cs_init(&cs, hdf); if (err != STATUS_OK) return jNeoErr(env,err); err = cgi_register_strfuncs(cs); if (err != STATUS_OK) return jNeoErr(env,err); return (jlong) cs; } JNIEXPORT void JNICALL Java_org_clearsilver_CS__1dealloc (JNIEnv *env, jclass objClass, jlong cs_obj_ptr) { CSPARSE *cs = (CSPARSE *)cs_obj_ptr; cs_destroy(&cs); } JNIEXPORT void JNICALL Java_org_clearsilver_CS__1parseFile(JNIEnv *env, jobject objCS, jlong cs_obj_ptr, jstring j_filename, jboolean use_cb) { CSPARSE *cs = (CSPARSE *)cs_obj_ptr; NEOERR *err; const char *filename; FILELOAD_INFO fl_info; if (!j_filename) { return; } // throw if (use_cb == JNI_TRUE) { jclass csClass; csClass = (*env)->GetObjectClass(env, objCS); if (csClass == NULL) return; fl_info.env = env; fl_info.fl_obj = objCS; fl_info.hdf = cs->hdf; fl_info.fl_method = (*env)->GetMethodID(env, csClass, "fileLoad", "(Ljava/lang/String;)Ljava/lang/String;"); if (fl_info.fl_method == NULL) return; cs_register_fileload(cs, &fl_info, jni_fileload_cb); } filename = (*env)->GetStringUTFChars(env,j_filename,0); err = cs_parse_file(cs,(char *)filename); if (use_cb == JNI_TRUE) cs_register_fileload(cs, NULL, NULL); if (err != STATUS_OK) { jNeoErr(env,err); return; } (*env)->ReleaseStringUTFChars(env,j_filename,filename); } JNIEXPORT void JNICALL Java_org_clearsilver_CS__1parseStr (JNIEnv *env, jclass objClass, jlong cs_obj_ptr, jstring j_contentstring) { CSPARSE *cs = (CSPARSE *)cs_obj_ptr; NEOERR *err; char *ms; int len; const char *contentstring; if (!j_contentstring) { return; } // throw contentstring = (*env)->GetStringUTFChars(env,j_contentstring,0); ms = strdup(contentstring); if (ms == NULL) { jErr(env, "parseStr failed"); return; } // throw error no memory len = strlen(ms); err = cs_parse_string(cs,ms,len); if (err) { jNeoErr(env,err); return; } (*env)->ReleaseStringUTFChars(env,j_contentstring,contentstring); } static NEOERR *render_cb (void *ctx, char *buf) { STRING *str= (STRING *)ctx; return nerr_pass(string_append(str, buf)); } JNIEXPORT jstring JNICALL Java_org_clearsilver_CS__1render (JNIEnv *env, jclass objClass, jlong cs_obj_ptr) { CSPARSE *cs = (CSPARSE *)cs_obj_ptr; STRING str; NEOERR *err; jstring retval; int ws_strip_level = 0; int do_debug = 0; // TODO: perhaps we should pass in whether this is html as well... do_debug = hdf_get_int_value(cs->hdf, "ClearSilver.DisplayDebug", 0); ws_strip_level = hdf_get_int_value(cs->hdf, "ClearSilver.WhiteSpaceStrip", 0); string_init(&str); err = cs_render(cs, &str, render_cb); if (err) { string_clear(&str); jNeoErr(env,err); return NULL; } if (ws_strip_level) { cgi_html_ws_strip(&str, ws_strip_level); } if (do_debug) { do { err = string_append (&str, "<hr>"); if (err != STATUS_OK) break; err = string_append (&str, "<pre>"); if (err != STATUS_OK) break; err = hdf_dump_str (cs->hdf, NULL, 0, &str); if (err != STATUS_OK) break; err = string_append (&str, "</pre>"); if (err != STATUS_OK) break; } while (0); if (err) { string_clear(&str); jNeoErr(env,err); return NULL; } } retval = (*env)->NewStringUTF(env, str.buf); string_clear(&str); return retval; } // Change global HDF JNIEXPORT void JNICALL Java_org_clearsilver_CS__1setGlobalHdf (JNIEnv *env, jobject objclass, jlong cs_obj_ptr, jlong hdf_obj_ptr) { HDF *hdf = (HDF *)hdf_obj_ptr; CSPARSE *cs = (CSPARSE *)cs_obj_ptr; cs->global_hdf = hdf; }