-
Notifications
You must be signed in to change notification settings - Fork 53
/
Copy pathwsman-epr.i
286 lines (266 loc) · 6.61 KB
/
wsman-epr.i
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
/*
* wsman-epr.i
*
* end point reference declarations for openwsman swig bindings
*
* EndPointReference
*
*/
%rename(EndPointReference) epr_t;
%nodefault epr_t;
/*struct epr_t {}; without empty struct, the %rename isn't executed. */
typedef struct {} epr_t;
/*
* Document-class: EndPointReference
*
* The EndPointReference is a stub to proxy server-side operations
*
* Each WS-Management operation (Get, Enumerate, Invoke, ...) has an
* associated end point reference, providing the actual implementation of
* the operation.
*
*/
%extend epr_t {
#if defined(SWIGRUBY)
/*
* Create EndPointReference from URI (String) or XML (XmlNode or XmlDoc)
*
* call-seq:
* EndPointReference.new(uri, address, { key=>value, ...})
* EndPointReference.new(uri)
* EndPointReference.new(xml)
*
*/
epr_t( VALUE uri, VALUE address = Qnil, VALUE selectors = Qnil) {
KLASS_DECL(SwigClassXmlNode,SWIGTYPE_p___WsXmlNode);
KLASS_DECL(SwigClassXmlDoc,SWIGTYPE_p__WsXmlDoc);
if (!NIL_P(address) || !NIL_P(selectors)) {
const char *uri_s = as_string(uri);
const char *address_s = as_string(address);
return epr_create(uri_s, value2hash(NULL,selectors,1), address_s);
}
else if (CLASS_OF(uri) == KLASS_OF(SwigClassXmlNode)) {
WsXmlNodeH node;
SWIG_ConvertPtr(uri, (void **)&node, SWIGTYPE_p___WsXmlNode, 0);
return my_epr_deserialize(node);
}
else if (CLASS_OF(uri) == KLASS_OF(SwigClassXmlDoc)) {
WsXmlDocH doc;
WsXmlNodeH node;
SWIG_ConvertPtr(uri, (void **)&doc, SWIGTYPE_p__WsXmlDoc, 0);
node = ws_xml_get_soap_body(doc);
if (node == NULL)
node = ws_xml_get_doc_root(doc);
return my_epr_deserialize(node);
}
else {
return epr_from_string(as_string(uri));
}
}
#else
epr_t( const char *uri, const char *address) {
return epr_create( uri, NULL, address);
}
epr_t( const char *uri ) {
return epr_from_string( uri );
}
#endif
~epr_t() {
epr_destroy( $self );
}
#if defined(SWIGRUBY)
%newobject clone;
/*
* clone the EndPointReference instance
*
*/
epr_t *clone(const epr_t *epr) {
return epr_copy(epr);
}
#endif
/*
* Add selector as key/value pair
*
*/
void add_selector(const char *name, const char *text) {
epr_add_selector_text($self, name, text);
}
/*
* Serialization
*
* XML-serialize EndPointReference as child (with namespace and name) of node
*
*/
int serialize( WsXmlNodeH node, const char *ns, const char *epr_node_name, int embedded) {
return epr_serialize(node, ns, epr_node_name, $self, embedded);
}
#if defined(SWIGRUBY)
%alias cmp "==";
%typemap(out) int cmp
"$result = ($1 == 0) ? Qtrue : Qfalse;";
#endif
/*
* Compare two EndPointReferences
*
*/
int cmp(const epr_t *epr2) {
return epr_cmp($self, epr2);
}
/*
* String representation (XML syntax)
*
*/
char *to_xml( const char *ns = NULL, const char *epr_node_name = NULL) {
return epr_to_txt($self, ns?ns:XML_NS_ADDRESSING, epr_node_name?epr_node_name:WSA_EPR);
}
#if defined(SWIGJAVA)
%rename("toString") string();
#endif
#if defined(SWIGRUBY)
%rename("to_s") string();
#endif
%newobject string;
/*
* String representation (<uri>?<selector>,<selector>,...)
*
*/
char *string() {
return epr_to_string($self);
}
/*
* Number of selectors
*/
int selector_count(void) {
return epr_selector_count($self);
}
/*
* The resource URI associated to this EndPointReference
*
*/
char *resource_uri(void) {
return epr_get_resource_uri($self);
}
#if defined(SWIGRUBY)
/*
* Get value of selector by name
* epr#selector converts any value passed to String
*
* ==== Shortcut
* epr.selector("name") can also be abbreviated as epr.name
*
* ==== Examples
* epr.selector("name")
* epr.selector(value)
* epr.name
*/
char *selector(VALUE v) {
const char *name = as_string(v);
#else
/*
* get value of selector by name
*
*/
char *selector(const char* name) {
#endif
return wsman_epr_selector_by_name($self, name);
}
#if !defined(SWIGJAVA) /* Target_* undefined for Java in openwsman.i */
/*
* Return list of selector names
*/
#if defined(SWIGRUBY)
VALUE selector_names(void) {
#endif
#if defined(SWIGPYTHON)
PyObject *selector_names(void) {
#endif
#if defined(SWIGPERL)
AV *selector_names(void) {
#endif
int i;
Target_Type ary = Target_SizedArray($self->refparams.selectorset.count);
key_value_t *p = $self->refparams.selectorset.selectors;
for (i = 0; i < $self->refparams.selectorset.count; i++) {
Target_ListSet(ary, i, SWIG_FromCharPtr(p->key));
++p;
}
#if defined(SWIGPERL)
return (AV *)ary;
#else
return ary;
#endif
}
#endif
#if defined(SWIGRUBY)
/*
* enumerate over selectors as key,value pairs
*
* call-seq:
* epr.each { |key,value| ... }
*
*/
void each() {
int i;
key_value_t *p = NULL;
VALUE value, ary;
p = $self->refparams.selectorset.selectors;
for (i = 0; i < $self->refparams.selectorset.count; i++) {
ary = rb_ary_new2(2);
rb_ary_store(ary, 0, SWIG_FromCharPtr(p->key));
if (p->type == 0) {
value = SWIG_FromCharPtr(p->v.text);
} else {
value = SWIG_NewPointerObj((void*) p->v.epr, SWIGTYPE_p_epr_t, 0);
}
rb_ary_store(ary, 1, value);
rb_yield(ary);
p++;
}
}
#endif
%newobject classname;
/*
* Classname of EPR
*/
char *classname(void) {
return uri_classname($self->refparams.uri);
}
%newobject namespace;
/*
* Namespace of EPR
*/
char *namespace(void) {
char *classname;
int classnamelen, namespacelen;
const char *prefix;
const char *uri;
/* try to get namespace from selectors (WS-Management style) */
char *ns = get_cimnamespace_from_selectorset(&($self->refparams.selectorset));
if (ns) {
return strdup(ns);
}
/* WMI style? - extract namespace from uri */
uri = $self->refparams.uri;
prefix = epr_prefix(uri);
if (prefix == NULL) {
return NULL; /* bad classname in URI */
}
classname = uri_classname(uri);
if (classname == NULL)
return NULL; /* bad URI */
classnamelen = strlen(classname);
free(classname);
namespacelen = strlen(uri) - classnamelen - strlen(prefix) - 2; /* drop enclosing slashes */
if (namespacelen <= 0)
return strdup("");
/* copy after prefix slash (+ 1) */
return strndup(uri + strlen(prefix) + 1, namespacelen);
}
%newobject prefix;
/*
* Prefix of EPR
*/
char *prefix(void) {
return epr_prefix($self->refparams.uri);
}
}