#include #include #include #include #include #include #include #include #include "ruby.h" extern "C" VALUE jaxp_parse(VALUE self, VALUE filename) { using namespace java::io; using namespace java::lang; using namespace javax::xml::parsers; using namespace org::w3c::dom; VALUE result = Qnil; JvCreateJavaVM(NULL); JvAttachCurrentThread(NULL, NULL); JvInitClass(&System::class$); JvInitClass(&DocumentBuilderFactory::class$); DocumentBuilderFactory *factory = DocumentBuilderFactory::newInstance(); DocumentBuilder *parser = factory->newDocumentBuilder(); try { String *name = JvNewStringUTF(RSTRING(filename)->ptr); InputStream *in = new FileInputStream(name); Document *doc = parser->parse(in); String *encoding = doc->getXmlEncoding(); jint len = JvGetStringUTFLength(encoding); char buf[len+1]; JvGetStringUTFRegion(encoding, 0, len, buf); buf[len] = '\0'; result = rb_str_new2(buf); } catch (java::lang::Throwable *ex) { ex->printStackTrace(); } JvDetachCurrentThread(); return result; } typedef VALUE (ruby_method)(...); extern "C" void Init_jaxp() { VALUE jaxp = rb_define_module("Jaxp"); rb_define_method(jaxp, "parse", (ruby_method*)&jaxp_parse, 1); }