Esempio n. 1
0
void *
_gda_xslt_extension_init (xsltTransformContextPtr ctxt, const xmlChar * URI)
{
	int res;
	GdaXsltIntCont *data;
#ifdef GDA_DEBUG_NO
	g_print ("_gda_xslt_extension_init");
#endif
	if (!URI || strcmp ((gchar*) URI, GDA_XSLT_EXTENSION_URI)) {
#ifdef GDA_DEBUG_NO
		g_print ("called for another URI, exit");
#endif
		return NULL;
	}

	data = calloc (1, sizeof (GdaXsltIntCont));
	if (data == NULL) {
#ifdef GDA_DEBUG_NO
		g_print ("no memory");
#endif
		return NULL;
	}
#ifdef GDA_DEBUG_NO
	g_print ("initialize result_sets hash");
#endif
	data->result_sets =
		g_hash_table_new_full (g_str_hash, g_str_equal,
				       g_free,
				       NULL);

	res = xsltRegisterExtFunction (ctxt,
				       (const xmlChar *)
				       GDA_XSLT_FUNC_GETVALUE, URI,
				       gda_xslt_getvalue_function);
	res = xsltRegisterExtFunction (ctxt,
				       (const xmlChar *)
				       GDA_XSLT_FUNC_GETXMLVALUE, URI,
				       gda_xslt_getxmlvalue_function);
	res |= xsltRegisterExtFunction (ctxt,
					(const xmlChar *)
					GDA_XSLT_FUNC_CHECKIF, URI,
					gda_xslt_checkif_function);
	res |= xsltRegisterExtFunction (ctxt,
					(const xmlChar *)
					GDA_XSLT_FUNC_GETNODESET, URI,
					gda_xslt_getnodeset_function);
	if (res != 0) {
		g_error ("failed to xsltRegisterExtFunction = [%d]", res);
	}

	res = xsltRegisterExtElement (ctxt,
				      (const xmlChar *) GDA_XSLT_ELEM_SECTION,
				      URI,
				      (xsltTransformFunction)
				      gda_xslt_section_element);
	if (res != 0) {
		g_error ("failed to xsltRegisterExtElement = [%d]", res);
	}
	return data;
}
Esempio n. 2
0
/*
 * exsltFuncRegisterImportFunc
 * @data:    the exsltFuncFunctionData for the function
 * @ch:	     structure containing context and hash table
 * @URI:     the function namespace URI
 * @name:    the function name
 *
 * Checks if imported function is already registered in top-level
 * stylesheet.  If not, copies function data and registers function
 */
static void
exsltFuncRegisterImportFunc (exsltFuncFunctionData *data,
			     exsltFuncImportRegData *ch,
			     const xmlChar *URI, const xmlChar *name,
			     ATTRIBUTE_UNUSED const xmlChar *ignored) {
    exsltFuncFunctionData *func=NULL;

    if ((data == NULL) || (ch == NULL) || (URI == NULL) || (name == NULL))
            return;

    if (ch->ctxt == NULL || ch->hash == NULL)
    	return;

    /* Check if already present */
    func = (exsltFuncFunctionData*)xmlHashLookup2(ch->hash, URI, name);
    if (func == NULL) {		/* Not yet present - copy it in */
    	func = exsltFuncNewFunctionData();
	memcpy(func, data, sizeof(exsltFuncFunctionData));
	if (xmlHashAddEntry2(ch->hash, URI, name, func) < 0) {
	    xsltGenericError(xsltGenericErrorContext,
	    	    "Failed to register function {%s}%s\n",
		    URI, name);
	} else {		/* Do the registration */
	    xsltGenericDebug(xsltGenericDebugContext,
	            "exsltFuncRegisterImportFunc: register {%s}%s\n",
		    URI, name);
	    xsltRegisterExtFunction(ch->ctxt, name, URI,
		    exsltFuncFunctionFunction);
	}
    }
}
Esempio n. 3
0
/**
 * exsltFuncRegisterFunc:
 * @func:  the #exsltFuncFunctionData for the function
 * @ctxt:  an XSLT transformation context
 * @URI:  the function namespace URI
 * @name: the function name
 *
 * Registers a function declared by a func:function element
 */
static void
exsltFuncRegisterFunc (exsltFuncFunctionData *data,
		       xsltTransformContextPtr ctxt,
		       const xmlChar *URI, const xmlChar *name,
		       ATTRIBUTE_UNUSED const xmlChar *ignored) {
    if ((data == NULL) || (ctxt == NULL) || (URI == NULL) || (name == NULL))
	return;

    xsltGenericDebug(xsltGenericDebugContext,
		     "exsltFuncRegisterFunc: register {%s}%s\n",
		     URI, name);
    xsltRegisterExtFunction(ctxt, name, URI,
			    exsltFuncFunctionFunction);
}
Esempio n. 4
0
int
registerBasicFunctions(xsltTransformContextPtr ctxt, const xmlChar *URI, int fromR)
{

struct Entries {
    const char *name;
    xmlXPathEvalFunc fun;
};

 struct Entries entries[] = {
     {"init", RXSLT_init},
     {"call", RXSLT_call},
     {"callI", RXSLT_callI},
     {"eval", RXSLT_eval},
     {"source", RXSLT_source},
     {"register", RXSLT_register},
     {"exists", RXSLT_exists},
     {"library", RXSLT_library},
     {"nullEval", RXSLT_nullEval},
     {"evalWithOutput", RXSLT_evalWithOutput},
     {"length", RXSLT_length},
     {"as", RXSLT_as},
     {"class", RXSLT_class}
  };
 int n = sizeof(entries)/sizeof(entries[0]), i;

 if(fromR || R_alreadyInitialized)
	 entries[0].fun = RXSLT_noop;

#ifdef XSLT_DEBUG
    fprintf(stderr, "registering %d functions for %s\n", (fromR ? n-1 : n), R_URI);fflush(stderr);
#endif

 for(i = 0 ; i < n; i++) {
#ifdef XSLT_DEBUG
    fprintf(stderr, "registering %s\n", entries[i].name);fflush(stderr);
#endif

    if(ctxt)
	xsltRegisterExtFunction(ctxt, entries[i].name, R_URI, entries[i].fun);
    else
        xsltRegisterExtModuleFunction((const xmlChar *) entries[i].name,
                                      (const xmlChar *) R_URI, entries[i].fun);
 }


 xsltRegisterExtElement(ctxt, "eval", R_URI, REvalFunctionDefn);

 return(n);
}
Esempio n. 5
0
void
RXSLT_init(xmlXPathParserContextPtr ctxt, int nargs)
{
    const char *defaultArgs[] = {"Rxsltproc", "--silent"};
    char **args;
    int argc, i;
    int mustFree;

    if(R_alreadyInitialized)
      return;

#ifdef XSLT_DEBUG
    fprintf(stderr, "in RXSLT_init %d\n", nargs);fflush(stderr);
#endif
    if(nargs == 0) {
       argc = sizeof(defaultArgs)/sizeof(defaultArgs[0]);   
       args = (char **)defaultArgs;
    } else {
	args = (char **) malloc((nargs+1) * sizeof(char*));
        args[0] = strdup("Rxsltproc");
        argc = nargs+1;
        for(i = 0; i < nargs; i++) {
            xmlXPathObjectPtr obj = valuePop(ctxt); 
            if(obj->type) {
		args[i+1] = strdup(xmlXPathCastToString(obj));
	    }
	}
        mustFree = TRUE;
    }

    Rf_initEmbeddedR(argc, args);
    loadXSLPackage();
    valuePush(ctxt, xmlXPathNewBoolean(1));
    if(mustFree) {
        for(i = 0; i < nargs+1; i++) {
	    free(args[i]);
	}      
        free(args);
    }


#if DEBUG_REGISTRATION
 xsltRegisterExtFunction(getTransformCtxt(), "foo", R_URI, RXSLT_genericFunctionCall);
 RXSLT_addFunction("foo", NULL_USER_OBJECT);
#endif

    R_alreadyInitialized = 1;
    return;
}
Esempio n. 6
0
static void * initFunc(xsltTransformContextPtr ctxt, const xmlChar *uri)
{
    VALUE modules = rb_iv_get(xslt, "@modules");
    VALUE obj = rb_hash_aref(modules, rb_str_new2((const char *)uri));
    VALUE args = { Qfalse };
    VALUE methods = rb_funcall(obj, rb_intern("instance_methods"), 1, args);
    int i;

    for(i = 0; i < RARRAY_LEN(methods); i++) {
	xsltRegisterExtFunction(ctxt,
          (unsigned char *)StringValuePtr(RARRAY_PTR(methods)[i]), uri, method_caller);
    }

    return (void *)rb_class_new_instance(0, NULL, obj);
}
Esempio n. 7
0
void
yelp_transform_start (YelpTransform *transform,
		      xmlDocPtr      document,
		      gchar        **params)
{
    transform->inputDoc = document;

    transform->context = xsltNewTransformContext (transform->stylesheet,
						  transform->inputDoc);
    if (!transform->context) {
	YelpError *error = 
	    yelp_error_new (_("Broken Transformation"),
			    _("An unknown error occurred while attempting to "
			      "transform the document."));
	transform_set_error (transform, error);
	return;
    }

    transform->params = g_strdupv (params);

    transform->context->_private = transform;
    if (!exslt_registered) {
	exsltRegisterAll ();
	exslt_registered = TRUE;
    }
    xsltRegisterExtElement (transform->context,
			    BAD_CAST "document",
			    BAD_CAST YELP_NAMESPACE,
			    (xsltTransformFunction) xslt_yelp_document);
    xsltRegisterExtElement (transform->context,
			    BAD_CAST "cache",
			    BAD_CAST YELP_NAMESPACE,
			    (xsltTransformFunction) xslt_yelp_cache);
    xsltRegisterExtFunction (transform->context,
			     BAD_CAST "input",
			     BAD_CAST YELP_NAMESPACE,
			     (xmlXPathFunction) xslt_yelp_input);

    transform->mutex = g_mutex_new ();
    g_mutex_lock (transform->mutex);
    transform->running = TRUE;
    transform->thread = g_thread_create ((GThreadFunc) transform_run,
					 transform, FALSE, NULL);
    g_mutex_unlock (transform->mutex);
}
Esempio n. 8
0
USER_OBJECT_
RXSLT_registerFunction(USER_OBJECT_ name, USER_OBJECT_ fun, USER_OBJECT_ uri, USER_OBJECT_ symbol, 
                        USER_OBJECT_ context)
{
    xsltTransformContextPtr ctxt = NULL;
    xmlXPathEvalFunc sym;

    if(GET_LENGTH(context)) {
	ctxt = (xsltTransformContextPtr)  R_ExternalPtrAddr(context);
    } 

    if(!ctxt)
      ctxt  = getTransformCtxt();

    if(!ctxt) {
         PROBLEM "NULL value for xslTransformContext. One cannot register an R function with XSLT when not applying an XSL style sheet."
	 ERROR;
    }


    if(GET_LENGTH(symbol) < 1) {
	sym = RXSLT_genericFunctionCall;
    } else {
        sym = (xmlXPathEvalFunc) R_ExternalPtrAddr(symbol);
    }

    RXSLT_addFunction(CHAR_DEREF(STRING_ELT(name, 0)), fun); /* XXX check for memory leaks */
    /* Register the S function in a hashtable with this name and function. */
#ifdef XSLT_DEBUG
    fprintf(stderr, "Registering function (%s) %s with context %p\n",
               CHAR_DEREF(STRING_ELT(uri, 0)), CHAR_DEREF(STRING_ELT(name, 0)), ctxt);fflush(stderr);
#endif
    if(ctxt)
        xsltRegisterExtFunction(ctxt, CHAR_DEREF(STRING_ELT(name, 0)),
	   	  	           CHAR_DEREF(STRING_ELT(uri, 0)), 
                                   sym);
    else
        xsltRegisterExtModuleFunction((const xmlChar *) CHAR_DEREF(STRING_ELT(name, 0)),
                                      (const xmlChar *) CHAR_DEREF(STRING_ELT(uri, 0)), sym);

    return(NULL_USER_OBJECT);
}
static void * initFunc(xsltTransformContextPtr ctxt, const xmlChar *uri)
{
    VALUE modules = rb_iv_get(xslt, "@modules");
    VALUE obj = rb_hash_aref(modules, rb_str_new2((const char *)uri));
    VALUE args = { Qfalse };
    VALUE methods = rb_funcall(obj, rb_intern("instance_methods"), 1, args);
    VALUE inst;
    nokogiriXsltStylesheetTuple *wrapper;
    int i;

    for(i = 0; i < RARRAY_LEN(methods); i++) {
	VALUE method_name = rb_obj_as_string(RARRAY_PTR(methods)[i]);
	xsltRegisterExtFunction(ctxt,
          (unsigned char *)StringValuePtr(method_name), uri, method_caller);
    }

    Data_Get_Struct(ctxt->style->_private, nokogiriXsltStylesheetTuple,
                    wrapper);
    inst = rb_class_new_instance(0, NULL, obj);
    rb_ary_push(wrapper->func_instances, inst);

    return (void *)inst;
}
void registerXSLTExtensions(xsltTransformContextPtr ctxt)
{
    ASSERT(RuntimeEnabledFeatures::xsltEnabled());
    xsltRegisterExtFunction(ctxt, (const xmlChar*)"node-set", (const xmlChar*)"http://exslt.org/common", exsltNodeSetFunction);
}
void registerXSLTExtensions(xsltTransformContextPtr ctxt)
{
    xsltRegisterExtFunction(ctxt, (const xmlChar*)"node-set", (const xmlChar*)"http://exslt.org/common", exsltNodeSetFunction);
}
Esempio n. 12
0
xmlDocPtr c_XSLTProcessor::apply_stylesheet() {
  SYNC_VM_REGS_SCOPED();

  if (m_stylesheet == nullptr || m_doc == nullptr) {
    raise_error("Unable to apply stylesheet");
    return nullptr;
  }

  xsltTransformContextPtr ctxt = xsltNewTransformContext (m_stylesheet, m_doc);
  if (ctxt == nullptr) {
    raise_error("Unable to apply stylesheet");
    return nullptr;
  }

  ctxt->_private = this;

  xsltSecurityPrefsPtr prefs = nullptr;
  if (m_secprefs != k_XSL_SECPREF_NONE) {
    prefs = xsltNewSecurityPrefs();
    int error = 0;

    if (m_secprefs & k_XSL_SECPREF_READ_FILE) {
      if (xsltSetSecurityPrefs(prefs,
                               XSLT_SECPREF_READ_FILE,
                               xsltSecurityForbid) != 0) {
        error = 1;
      }
    }

    if (m_secprefs & k_XSL_SECPREF_WRITE_FILE) {
      if (xsltSetSecurityPrefs(prefs,
                               XSLT_SECPREF_WRITE_FILE,
                               xsltSecurityForbid) != 0) {
        error = 1;
      }
    }

    if (m_secprefs & k_XSL_SECPREF_CREATE_DIRECTORY) {
      if (xsltSetSecurityPrefs(prefs,
                               XSLT_SECPREF_CREATE_DIRECTORY,
                               xsltSecurityForbid) != 0) {
        error = 1;
      }
    }

    if (m_secprefs & k_XSL_SECPREF_READ_NETWORK) {
      if (xsltSetSecurityPrefs(prefs,
                               XSLT_SECPREF_READ_NETWORK,
                               xsltSecurityForbid) != 0) {
        error = 1;
      }
    }

    if (m_secprefs & k_XSL_SECPREF_WRITE_NETWORK) {
      if (xsltSetSecurityPrefs(prefs,
                               XSLT_SECPREF_WRITE_NETWORK,
                               xsltSecurityForbid) != 0) {
        error = 1;
      }
    }

    if (xsltSetCtxtSecurityPrefs(prefs, ctxt) != 0) {
      error = 1;
    }

    if (error == 1) {
      raise_error("Can't set libxslt security properties, not doing "
                  "transformation for security reasons");
      return nullptr;
    }
  }

  xsltRegisterExtFunction(ctxt,
    (const xmlChar*) "functionString",
    (const xmlChar*) "http://php.net/xsl",
    xslt_ext_function_string_php
  );

  xsltRegisterExtFunction(ctxt,
    (const xmlChar*) "function",
    (const xmlChar*) "http://php.net/xsl",
    xslt_ext_function_object_php
  );

  for (ArrayIter iter(m_params); iter; ++iter) {
    assert(iter.first().isString());
    assert(iter.second().isString());

    xmlChar *value = xslt_string_to_xpathexpr(iter.second().toString().c_str());
    if (value) {
      xsltEvalOneUserParam(ctxt,
        (const xmlChar*)iter.first().toString().c_str(),
        (const xmlChar*)value
      );

      xmlFree(value);
    }
  }

  FILE *profile = nullptr;
  if (m_profile) {
    profile = fopen(m_profile.data(), "w");
  }

  xmlDocPtr res = xsltApplyStylesheetUser(m_stylesheet,
                                          m_doc,
                                          nullptr,
                                          nullptr,
                                          profile,
                                          ctxt);

  if (profile) {
    fclose(profile);
  }

  xsltFreeTransformContext(ctxt);

  if (prefs) {
    xsltFreeSecurityPrefs(prefs);
  }

  return res;
}
Esempio n. 13
0
static void
transform_run (YelpTransform *transform)
{
    YelpTransformPrivate *priv = GET_PRIV (transform);

    debug_print (DB_FUNCTION, "entering\n");

    priv->stylesheet = xsltParseStylesheetFile (BAD_CAST (priv->stylesheet_file));
    if (priv->stylesheet == NULL) {
        g_mutex_lock (&priv->mutex);
        if (priv->error)
            g_error_free (priv->error);
        priv->error = g_error_new (YELP_ERROR, YELP_ERROR_PROCESSING,
                                   _("The XSLT stylesheet ‘%s’ is either missing or not valid."),
                                   priv->stylesheet_file);
        g_object_ref (transform);
        g_idle_add ((GSourceFunc) transform_error, transform);
        g_mutex_unlock (&priv->mutex);
        return;
    }

    priv->context = xsltNewTransformContext (priv->stylesheet,
                                             priv->input);
    if (priv->context == NULL) {
        g_mutex_lock (&priv->mutex);
        if (priv->error)
            g_error_free (priv->error);
        priv->error = g_error_new (YELP_ERROR, YELP_ERROR_PROCESSING,
                                   _("The XSLT stylesheet ‘%s’ is either missing or not valid."),
                                   priv->stylesheet_file);
        g_object_ref (transform);
        g_idle_add ((GSourceFunc) transform_error, transform);
        g_mutex_unlock (&priv->mutex);
        return;
    }

    priv->context->_private = transform;
    xsltRegisterExtElement (priv->context,
                            BAD_CAST "document",
                            BAD_CAST YELP_NAMESPACE,
                            (xsltTransformFunction) xslt_yelp_document);
    xsltRegisterExtElement (priv->context,
                            BAD_CAST "cache",
                            BAD_CAST YELP_NAMESPACE,
                            (xsltTransformFunction) xslt_yelp_cache);
    xsltRegisterExtFunction (priv->context,
                             BAD_CAST "input",
                             BAD_CAST YELP_NAMESPACE,
                             (xmlXPathFunction) xslt_yelp_aux);

    priv->output = xsltApplyStylesheetUser (priv->stylesheet,
                                            priv->input,
                                            (const char **) priv->params,
                                            NULL, NULL,
                                            priv->context);
    g_mutex_lock (&priv->mutex);
    priv->running = FALSE;
    if (!priv->cancelled) {
        g_idle_add ((GSourceFunc) transform_final, transform);
        g_mutex_unlock (&priv->mutex);
    }
    else {
        g_mutex_unlock (&priv->mutex);
        g_object_unref (transform);
    }
}