#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;
}