📄 xmlj_transform.c
字号:
xmlHashScan (stylesheet->cdataSection, cdataSectionScanner, &info); { jstring result = (jstring) (*env)->CallObjectMethod (env, info.stringBuffer, toStringMethodID); jstring nameString = (*env)->NewStringUTF (env, "cdata-section-elements"); jobject prevValue = (*env)->CallObjectMethod (env, outputProperties, setPropertyMethod, nameString, result); if (NULL != prevValue) { (*env)->DeleteLocalRef (env, prevValue); } (*env)->DeleteLocalRef (env, nameString); } (*env)->DeleteLocalRef (env, info.stringBuffer); }}/* * Returns the parameter array for the given GnomeTransformer. */jobjectArrayxmljGetParameterArray (JNIEnv *env, jobject transformer){ jclass cls; jmethodID method; cls = (*env)->GetObjectClass (env, transformer); if (cls == NULL) { return NULL; } method = (*env)->GetMethodID (env, cls, "getParameterArray", "()[Ljava/lang/String;"); if (method == NULL) { return NULL; } return (jobjectArray) (*env)->CallObjectMethod (env, transformer, method);}/* Convert parameter array to xmlChar ** */const char **xmljGetParameters (JNIEnv *env, jobjectArray pa){ int i, len; const char **parameters; len = (*env)->GetArrayLength (env, pa); parameters = (const char **) malloc ((len + 2) * sizeof (const char *)); if (parameters == NULL) { return NULL; } for (i = 0; i < len; i++) { jstring string = (jstring) (*env)->GetObjectArrayElement (env, pa, i); if (string != NULL) { parameters[i] = (*env)->GetStringUTFChars (env, string, NULL); } else { parameters[i] = NULL; } } parameters[len] = 0; parameters[len + 1] = 0; return parameters;} /* Release parameter strings */voidxmljFreeParameters (JNIEnv *env, jobjectArray pa, const char **parameters){ int i, len; len = (*env)->GetArrayLength (env, pa); for (i = 0; i < len; i++) { jstring string = (jstring) (*env)->GetObjectArrayElement (env, pa, i); if (string != NULL) { (*env)->ReleaseStringUTFChars (env, string, parameters[i]); } } free (parameters);}xmlDocPtrxmljTransform (JNIEnv *env, jobject transformer, xmlDocPtr source){ xsltStylesheetPtr stylesheet; xmlDocPtr result; jobjectArray pa; const char **parameters; stylesheet = xmljGetStylesheetID (env, transformer); pa = xmljGetParameterArray (env, transformer); parameters = xmljGetParameters (env, pa); if (parameters == NULL) { xmljThrowException (env, "javax/xml/transform/TransformerException", "Couldn't allocate memory for parameters"); return NULL; } result = xsltApplyStylesheet (stylesheet, source, parameters); xmljFreeParameters (env, pa, parameters); if (result == NULL) { xmljThrowException (env, "javax/xml/transform/TransformerException", "XSLT transformation failed"); } return result;}voidxmljTransformToSAX (JNIEnv *env, jobject transformer, xmlDocPtr source, jobject callback){ xsltStylesheetPtr stylesheet; int ret; jobjectArray pa; const char **parameters; xmlSAXHandlerPtr sax; stylesheet = xmljGetStylesheetID (env, transformer); pa = xmljGetParameterArray (env, transformer); parameters = xmljGetParameters (env, pa); if (parameters == NULL) { xmljThrowException (env, "javax/xml/transform/TransformerException", "Couldn't allocate memory for parameters"); return; } sax = NULL; /* TODO link up sax and callback */ ret = xsltRunStylesheet (stylesheet, source, parameters, NULL, sax, NULL); xmljFreeParameters (env, pa, parameters); if (ret == -1) { xmljThrowException (env, "javax/xml/transform/TransformerException", "XSLT transformation failed"); }}xmlDocPtrxmljDocLoader (const xmlChar *uri, xmlDictPtr dict, int options, void *ctxt, xsltLoadType type){ JNIEnv *env; jclass xmljClass; jclass inputStreamClass; jmethodID getInputStream; jmethodID getDetectBuffer; jstring systemId; jobject inputStream; jbyteArray detectBuffer; fflush(stdout); env = xmljGetJNIEnv (); if (!env) { return NULL; } xmljClass = (*env)->FindClass (env, "gnu/xml/libxmlj/util/XMLJ"); if (!xmljClass) { return NULL; } getInputStream = (*env)->GetStaticMethodID (env, xmljClass, "xmljGetInputStream", "(Ljava/lang/String;Ljava/lang/String;)Lgnu/xml/libxmlj/util/NamedInputStream;"); if (!getInputStream) { return NULL; } systemId = xmljNewString (env, uri); inputStream = (*env)->CallStaticObjectMethod (env, xmljClass, getInputStream, stylesheetURL, systemId); if (!inputStream) { return NULL; } inputStreamClass = (*env)->GetObjectClass (env, inputStream); if (!inputStreamClass) { return NULL; } getDetectBuffer = (*env)->GetMethodID (env, inputStreamClass, "getDetectBuffer", "()[B"); if (!getDetectBuffer) { return NULL; } detectBuffer = (*env)->CallObjectMethod (env, inputStream, getDetectBuffer); if (!detectBuffer) { return NULL; } return xmljParseDocument (env, NULL, inputStream, detectBuffer, NULL, systemId, stylesheetURL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2);}/* GnomeTransformer.newStylesheet */JNIEXPORT jobject JNICALLJava_gnu_xml_libxmlj_transform_GnomeTransformer_newStylesheet (JNIEnv *env, jobject self){ xsltStylesheetPtr stylesheet; jobject ret; stylesheetURL = NULL; xsltSetLoaderFunc (xmljDocLoader); stylesheet = xsltNewStylesheet (); xmljSetOutputProperties (env, self, stylesheet); ret = xmljAsField (env, stylesheet); if (ret == NULL) { xmljThrowException (env, "javax/xml/transform/TransformerConfigurationException", "Can't create Java object for stylesheet"); } return ret;}/* GnomeTransformer.newStylesheetFromStream */JNIEXPORT jobject JNICALLJava_gnu_xml_libxmlj_transform_GnomeTransformer_newStylesheetFromStream(JNIEnv *env, jobject self, jobject in, jbyteArray detectBuffer, jstring publicId, jstring systemId, jstring base, jboolean entityResolver, jboolean errorHandler){ xmlDocPtr doc; xsltStylesheetPtr stylesheet; jobject ret; doc = xmljParseDocument (env, self, in, detectBuffer, publicId, systemId, base, 0, 0, 0, 0, 0, entityResolver, errorHandler, 0, 0, 2); if (doc == NULL) { return NULL; } stylesheetURL = systemId; xsltSetLoaderFunc (xmljDocLoader); stylesheet = xsltParseStylesheetDoc (doc); if (stylesheet == NULL) { xmljThrowException (env, "javax/xml/transform/TransformerConfigurationException", "Error parsing XSLT stylesheet"); return NULL; } xmljSetOutputProperties (env, self, stylesheet); ret = xmljAsField (env, stylesheet); if (ret == NULL) { xmljThrowException (env, "javax/xml/transform/TransformerConfigurationException", "Can't create Java object for stylesheet"); } return ret;}/* GnomeTransformer.newStylesheetFromDoc */JNIEXPORT jobject JNICALLJava_gnu_xml_libxmlj_transform_GnomeTransformer_newStylesheetFromDoc(JNIEnv *env, jobject self, jobject in){ xmlDocPtr doc; xsltStylesheetPtr stylesheet; jobject ret; doc = (xmlDocPtr) xmljGetNodeID (env, in); if (doc == NULL) { return NULL; } stylesheetURL = xmljNewString (env, doc->URL); xsltSetLoaderFunc (xmljDocLoader); stylesheet = xsltParseStylesheetDoc (doc); if (stylesheet == NULL) { xmljThrowException (env, "javax/xml/transform/TransformerConfigurationException", "Error parsing XSLT stylesheet"); } xmljSetOutputProperties (env, self, stylesheet); ret = xmljAsField (env, stylesheet); if (ret == NULL) { xmljThrowException (env, "javax/xml/transform/TransformerConfigurationException", "Can't create Java object for stylesheet"); } return ret;}/* GnomeTransformer.transformStreamToStream */JNIEXPORT void JNICALLJava_gnu_xml_libxmlj_transform_GnomeTransformer_transformStreamToStream(JNIEnv *env, jobject self, jobject in, jbyteArray detectBuffer, jstring publicId, jstring systemId, jstring base, jboolean entityResolver, jboolean errorHandler, jobject out){ xmlDocPtr source; xmlDocPtr result; source = xmljParseDocument (env, self, in, detectBuffer, publicId, systemId, base, 0, 0, 0, 0, 0, entityResolver, errorHandler, 0, 0, 2); result = xmljTransform (env, self, source); xmljSaveFileToJavaOutputStream (env, out, result, (const char*) result->encoding); xmlFreeDoc (result);}/* GnomeTransformer.transformStreamToDoc */JNIEXPORT jobject JNICALLJava_gnu_xml_libxmlj_transform_GnomeTransformer_transformStreamToDoc(JNIEnv *env, jobject self, jobject in, jbyteArray detectBuffer, jstring publicId, jstring systemId, jstring base, jboolean entityResolver, jboolean errorHandler){ xmlDocPtr source; xmlDocPtr result; source = xmljParseDocument (env, self, in, detectBuffer, publicId, systemId, base, 0, 0, 0, 0, 0, entityResolver, errorHandler, 0, 0, 2); result = xmljTransform (env, self, source); return xmljGetNodeInstance (env, (xmlNodePtr) result);}/* GnomeTransformer.transformStreamToSAX */JNIEXPORT void JNICALLJava_gnu_xml_libxmlj_transform_GnomeTransformer_transformStreamToSAX(JNIEnv *env, jobject self, jobject in, jbyteArray detectBuffer, jstring publicId, jstring systemId, jstring base, jboolean entityResolver, jboolean errorHandler, jobject callback){ xmlDocPtr source; source = xmljParseDocument (env, self, in, detectBuffer, publicId, systemId, base, 0, 0, 0, 0, 0, entityResolver, errorHandler, 0, 0, 2); xmljTransformToSAX (env, self, source, callback);}/* GnomeTransformer.transformDocToStream */JNIEXPORT void JNICALLJava_gnu_xml_libxmlj_transform_GnomeTransformer_transformDocToStream(JNIEnv *env, jobject self, jobject doc, jobject out){ xmlDocPtr source; xmlDocPtr result; source = (xmlDocPtr) xmljGetNodeID (env, doc); result = xmljTransform (env, self, source); xmljSaveFileToJavaOutputStream (env, out, result, (const char*) result->encoding); xmlFreeDoc (result);}/* GnomeTransformer.transformDocToDoc */JNIEXPORT jobject JNICALLJava_gnu_xml_libxmlj_transform_GnomeTransformer_transformDocToDoc(JNIEnv *env, jobject self, jobject doc){ xmlDocPtr source; xmlDocPtr result; source = (xmlDocPtr) xmljGetNodeID (env, doc); result = xmljTransform (env, self, source); return xmljGetNodeInstance (env, (xmlNodePtr) result);}/* GnomeTransformer.transformDocToSAX */JNIEXPORT void JNICALLJava_gnu_xml_libxmlj_transform_GnomeTransformer_transformDocToSAX(JNIEnv *env, jobject self, jobject doc, jobject callback){ xmlDocPtr source; source = (xmlDocPtr) xmljGetNodeID (env, doc); xmljTransformToSAX (env, self, source, callback);}/* GnomeTransformer.free */JNIEXPORT void JNICALLJava_gnu_xml_libxmlj_transform_GnomeTransformer_free (JNIEnv *env, jobject self){ xsltStylesheetPtr stylesheet; stylesheet = xmljGetStylesheetID (env, self); xsltFreeStylesheet (stylesheet);}/* * -------------------------------------------------------------------------- * Native implementation for class * gnu.xml.libxmlj.transform.GnomeTransformerFactory follows. *//* GnomeTransformerFactory.freeLibxsltGlobal */JNIEXPORT void JNICALLJava_gnu_xml_libxmlj_transform_GnomeTransformerFactory_freeLibxsltGlobal ( JNIEnv *env __attribute__((__unused__)), jclass clazz __attribute__((__unused__))){ xsltCleanupGlobals (); xmlCleanupParser ();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -