Blob Blame History Raw
/*
 * wsman-filter.i
 *
 * filter declarations for openwsman swig bindings
 *
 */

 
%rename(Filter) filter_t;
%nodefault filter_t;
typedef struct {
    char *resultClass;
    char *assocClass;
} filter_t;

#if defined(SWIGRUBY)
%{
  /*
   * Build associators (type == 0) or references (type == 1) filter
   *
   */
  static int associators_references( void *filter, int type, VALUE epr_v, VALUE assocClass_v, VALUE resultClass_v, VALUE role_v, VALUE resultRole_v, VALUE resultProp_v, VALUE propNum_v)
  {
    epr_t *epr = NULL;
    const char *assocClass = as_string(assocClass_v);
    const char *resultClass = as_string(resultClass_v);
    const char *role = as_string(role_v);
    const char *resultRole = as_string(resultRole_v);
    char **resultProp = NULL;
    int propNum = 0;
    int res;
    KLASS_DECL(SwigClassEndPointReference,SWIGTYPE_p_epr_t);

    if (CLASS_OF(epr_v) == KLASS_OF(SwigClassEndPointReference)) {
      SWIG_ConvertPtr(epr_v, (void **)&epr, SWIGTYPE_p_epr_t, 0);
    }
    else {
      epr = epr_from_string(as_string(epr_v));
    }
    if (!NIL_P(resultProp_v)) {
      int i;
      if (TYPE(resultProp_v) != T_ARRAY) {
        SWIG_exception( SWIG_ArgError(resultProp_v), Ruby_Format_TypeError( "", "Array", "resultProp", 6, resultProp_v ) );
      }
      resultProp = (char **)calloc(RARRAY_LEN(resultProp_v), sizeof(char *));
      for (i = 0; i < RARRAY_LEN(resultProp_v); ++i) {
        resultProp[i] = (char *)as_string(rb_ary_entry(resultProp_v, i));
        ++propNum;
      }
    }
    res = filter_set_assoc((filter_t *)filter, epr, type, assocClass, resultClass, role, resultRole, resultProp, propNum);
    if (resultProp) free(resultProp);
    return res;
  }
%}
#endif

/*
 * Document-class: Filter
 *
 * Filter are evaluated on the server side and help to reduce the amount
 * of processing and information transport.
 *
 * There are five basic ways to filter
 * * associations
 * * references
 * * XPath
 * * CQL (CIM query language)
 * * WQL (WS-Management query language)
 *
 * Openwsman does not do any filter processing by itself but passes it
 * to the backend CIMOM. Support for filters and query languages thus
 * depends on the used CIMOM.
 *
 */
%extend filter_t {
  /*
   * Create empty filter
   *
   */
  filter_t() {
    return filter_initialize();
  }
  ~filter_t() {
    filter_destroy( $self );
  }
#if defined(SWIGJAVA)
  %typemap(in) (char **resultProp, const int propNum) {
	  int i = 0;
	  $2 = (*jenv)->GetArrayLength(jenv, $input);
	  $1 = (char **) malloc(($2+1)*sizeof(char *));
	  /* make a copy of each string */
	  for (i = 0; i<$2; i++) {
		  jstring j_string = (jstring)(*jenv)->GetObjectArrayElement(jenv, $input, i);
		  const char * c_string = (*jenv)->GetStringUTFChars(jenv, j_string, 0);
		  $1[i] = malloc((strlen(c_string)+1)*sizeof(char));
		  strcpy($1[i], c_string);
		  (*jenv)->ReleaseStringUTFChars(jenv, j_string, c_string);
		  (*jenv)->DeleteLocalRef(jenv, j_string);
	  }
	  $1[i] = 0;
  }
/* This cleans up the memory we malloc'd before the function call */
  %typemap(freearg) (char **resultProp, const int propNum) {
	  int i;
	  for (i=0; i<$2-1; i++)
		  free($1[i]);
	  free($1);
  }
  %typemap(jni) (char **resultProp, const int propNum) "jobjectArray"
  %typemap(jtype) (char **resultProp, const int propNum) "String[]"
  %typemap(jstype) (char **resultProp, const int propNum) "String[]"
  %typemap(javain) (char **resultProp, const int propNum) "$javainput"
#endif
#if defined(SWIGRUBY)
  /*
   * Set associators filter
   * call-seq:
   *   filter.associators(end_point_reference, assoc_class_name, result_class_name, role, result_role, result_prop[], prop_num)
   *
   */
  int associators( VALUE epr_v = Qnil, VALUE assocClass_v = Qnil, VALUE resultClass_v = Qnil, VALUE role_v = Qnil, VALUE resultRole_v = Qnil, VALUE resultProp_v = Qnil, VALUE propNum_v = Qnil)
  {
    return associators_references( $self, 0, epr_v, assocClass_v, resultClass_v, role_v, resultRole_v, resultProp_v, propNum_v);
  }
#else
  int associators( epr_t *epr, const char *assocClass, const char *resultClass,
        const char *role, const char *resultRole, char **resultProp, const int propNum)
  {
    return filter_set_assoc($self, epr, 0, assocClass, resultClass, role, resultRole, resultProp, propNum);
  }
#endif
#if defined(SWIGRUBY)
  /*
   * Set references filter
   *
   * call-seq:
   *   filter.references(end_point_reference, assoc_class_name, result_class_name, role, result_role, result_prop[], prop_num)
   *
   */
  int references( VALUE epr_v = Qnil, VALUE assocClass_v = Qnil, VALUE resultClass_v = Qnil, VALUE role_v = Qnil, VALUE resultRole_v = Qnil, VALUE resultProp_v = Qnil, VALUE propNum_v = Qnil)
  {
    return associators_references( $self, 1, epr_v, assocClass_v, resultClass_v, role_v, resultRole_v, resultProp_v, propNum_v);
  }
#else
  int references( epr_t *epr, const char *assocClass,
    const char *resultClass, const char *role, const char *resultRole, char **resultProp, const int propNum)
  {
    return filter_set_assoc($self, epr, 1, assocClass, resultClass, role, resultRole, resultProp, propNum);
  }
#endif

  /*
   * Set simple dialect/query filter
   * call-seq:
   *   filter.simple(dialect, query)
   *
   */
  int simple(const char *dialect, const char *query) {
    return filter_set_simple($self, dialect, query );
  }
  /*
   * Set XPath filter
   * call-seq:
   *   filter.xpath(query)
   *
   */
  int xpath(const char *query) {
    return filter_set_simple($self, WSM_XPATH_FILTER_DIALECT, query );
  }
  /*
   * Set CQL (CIM query language) filter
   * call-seq:
   *   filter.cql(query)
   *
   */
  int cql(const char *query) {
    return filter_set_simple($self, WSM_CQL_FILTER_DIALECT, query );
  }
  /*
   * Set WQL (WS-Management query language) filter
   * call-seq:
   *   filter.wql(query)
   *
   */
  int wql(const char *query) {
    return filter_set_simple($self, WSM_WQL_FILTER_DIALECT, query );
  }

}