4
* © Copyright IBM Corp. 2007
6
* THIS FILE IS PROVIDED UNDER THE TERMS OF THE ECLIPSE PUBLIC LICENSE
7
* ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE
8
* CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT.
10
* You can obtain a current copy of the Eclipse Public License from
11
* http://www.opensource.org/licenses/eclipse-1.0.php
13
* Author: Sven Schuetz <sven@de.ibm.com> (created file)
14
* all content by Adrian Schuur
18
* CIM XML parser helper functions
26
#include "parserUtil.h"
27
#include "cimXmlParser.h"
28
#include "sfcUtil/utilft.h"
31
static int dontLex = 0;
33
extern CMPIConstClass * native_new_CMPIConstClass ( char *cn, CMPIStatus * rc );
34
extern int addClassProperty( CMPIConstClass * ccls, char * name,
35
CMPIValue * value, CMPIType type,
36
CMPIValueState state);
37
extern CMPIType guessType(char *val);
38
extern int addInstPropertyQualifier( CMPIInstance* ci, char * pname,
39
char *qname, CMPIValue * value,
41
extern int addClassPropertyQualifier( CMPIConstClass* cc, char * pname,
42
char *qname, CMPIValue * value,
44
extern int addClassQualifier( CMPIConstClass* cc, char * name,
47
extern char *XmlToAsciiStr(char *XmlStr);
53
static inline int isBoolean(CMPIData data)
55
if (data.type == CMPI_chars) {
56
if (strcasecmp(data.value.chars,"true") == 0) return 0xffff;
57
if (strcasecmp(data.value.chars,"false") == 0) return 0;
62
void createPath(CMPIObjectPath **op, XtokInstanceName *p)
69
*op = newCMPIObjectPath(NULL, p->className, NULL);
70
for (b = p->bindings.first; b; b = b->next) {
71
valp = getKeyValueTypePtr(b->type,
72
b->val.keyValue.value,
75
CMAddKey(*op, b->name, valp, type);
76
if (type == CMPI_ref) {
82
void setInstProperties(CMPIInstance *ci, XtokProperties *ps)
84
XtokProperty *np = NULL,*p = ps ? ps->first : NULL;
89
XtokQualifier *nq = NULL,*q;
95
switch (p->propType) {
96
case typeProperty_Value:
98
if (p->val.value.data.value != NULL && p->val.null==0) {
99
if (type == CMPI_string || type == CMPI_chars) {
100
char *charsStr = XmlToAsciiStr(p->val.value.data.value);
101
val = str2CMPIValue(type, charsStr, NULL);
105
val = str2CMPIValue(type, p->val.value.data.value, NULL);
106
CMSetProperty(ci, p->name, &val, type);
107
native_release_CMPIValue(type, &val);
110
CMSetProperty(ci, p->name, NULL, type);
114
case typeProperty_Reference:
115
val=str2CMPIValue(CMPI_ref, NULL, &p->val.ref);
116
CMSetProperty(ci, p->name, &val.ref, CMPI_ref);
119
case typeProperty_Array:
121
if (p->val.array.next > 0) {
122
CMPIArray *arr = newCMPIArray(0, type, &status);
123
if (p->val.array.max > 0) {
125
for (i = 0; i < p->val.array.next; ++i)
127
char *valStr = p->val.array.values[i];
128
if (type == CMPI_string || type == CMPI_chars) {
129
char *charsStr = XmlToAsciiStr(valStr);
130
val = str2CMPIValue(type, charsStr, NULL);
134
val = str2CMPIValue(type, valStr, NULL);
135
CMSetArrayElementAt(arr, i, &val, type);
136
native_release_CMPIValue(type, &val);
140
CMSetProperty(ci, p->name, &val, type | CMPI_ARRAY);
141
CMRelease(arr); /* cloned in property */
144
CMSetProperty(ci, p->name, NULL, p->valueType | CMPI_ARRAY);
151
qs=&p->val.qualifiers;
152
q=qs ? qs->first : NULL;
155
if (q->type & CMPI_ARRAY) {
156
CMPIArray *arr = NULL;
157
arr = newCMPIArray(0, type, NULL);
158
type = q->type & ~CMPI_ARRAY;
160
if (q->data.array.max) {
161
for (i = 0; i < q->data.array.next; ++i) {
162
val = str2CMPIValue(type, q->data.array.values[i], NULL);
163
CMSetArrayElementAt(arr, i, &val, type);
164
native_release_CMPIValue(type,&val);
167
rc = addInstPropertyQualifier(ci, p->name, q->name,
168
(CMPIValue *)&arr, q->type);
169
native_release_CMPIValue(q->type,(CMPIValue*)&arr);
172
val = str2CMPIValue(q->type, q->data.value.data.value, NULL);
173
rc= addInstPropertyQualifier(ci, p->name, q->name, &val, q->type);
174
native_release_CMPIValue(q->type,&val);
187
ps->first = ps->last = NULL;
190
void setInstQualifiers(CMPIInstance *ci, XtokQualifiers *qs)
192
XtokQualifier *nq = NULL,*q = qs ? qs->first : NULL;
197
if (q->type & CMPI_ARRAY) {
198
CMPIType type=q->type&~CMPI_ARRAY;
199
CMPIArray *arr = newCMPIArray(0, type, NULL);
201
if (q->data.array.max) {
202
for (i = 0; i < q->data.array.next; ++i) {
203
val = str2CMPIValue(type, q->data.array.values[i], NULL);
204
CMSetArrayElementAt(arr, i, &val, type);
205
native_release_CMPIValue(type,&val);
207
rc = addInstQualifier(ci, q->name, (CMPIValue*)&arr, q->type);
208
native_release_CMPIValue(q->type,(CMPIValue*)&arr);
212
val = str2CMPIValue(q->type, q->data.value.data.value, NULL);
213
rc = addInstQualifier(ci, q->name, &val, q->type);
214
native_release_CMPIValue( q->type,&val);
220
qs->first = qs->last = NULL;
224
void setClassProperties(CMPIConstClass *cls, XtokProperties *ps)
226
XtokProperty *np = NULL,*p = ps ? ps->first : NULL;
229
XtokQualifier *nq,*q;
235
switch (p->propType) {
236
case typeProperty_Value:
237
addClassProperty(cls, p->name, &val, p->valueType, CMPI_nullValue);
239
case typeProperty_Reference:
240
addClassProperty(cls, p->name, &val, CMPI_ref, CMPI_nullValue);
242
case typeProperty_Array:
244
addClassProperty(cls, p->name, &val,
245
p->valueType | CMPI_ARRAY, CMPI_nullValue);
249
qs=&p->val.qualifiers;
250
q=qs ? qs->first : NULL;
253
if (q->type & CMPI_ARRAY) {
254
CMPIType type=q->type&~CMPI_ARRAY;
255
arr = newCMPIArray(0, type, NULL);
257
if (q->data.array.max) {
258
for (i = 0; i < q->data.array.next; ++i) {
259
val = str2CMPIValue(type, q->data.array.values[i], NULL);
260
CMSetArrayElementAt(arr, i, &val, type);
261
native_release_CMPIValue(type,&val);
265
rc = addClassPropertyQualifier(cls, p->name, q->name, &val, q->type);
266
native_release_CMPIValue(q->type,(CMPIValue*)&arr);
269
val = str2CMPIValue(q->type, q->data.value.data.value, NULL);
270
rc= addClassPropertyQualifier(cls, p->name, q->name, &val, q->type);
271
native_release_CMPIValue(q->type,&val);
280
if (ps) ps->first = ps->last = NULL;
283
void setClassQualifiers(CMPIConstClass *cls, XtokQualifiers *qs)
285
XtokQualifier *nq = NULL,*q = qs ? qs->first : NULL;
290
if (q->type & CMPI_ARRAY) {
291
CMPIType type=q->type&~CMPI_ARRAY;
292
CMPIArray *arr = newCMPIArray(0, type, NULL);
294
if (q->data.array.max > 0) {
295
for (i = 0; i < q->data.array.next; ++i) {
296
char *valStr = q->data.array.values[i];
297
if (type == CMPI_string || type == CMPI_chars)
299
char *charsStr = XmlToAsciiStr(valStr);
300
val = str2CMPIValue(type, charsStr, NULL);
304
val = str2CMPIValue(type, valStr, NULL);
305
CMSetArrayElementAt(arr, i, &val, type);
306
native_release_CMPIValue(type,&val);
308
rc = addClassQualifier(cls, q->name, (CMPIValue*)&arr, q->type);
309
native_release_CMPIValue(q->type,(CMPIValue*)&arr);
313
char *valStr = q->data.value.data.value;
314
if (q->type == CMPI_string || q->type == CMPI_chars)
316
char *charsStr = XmlToAsciiStr(valStr);
317
val = str2CMPIValue(q->type, charsStr, NULL);
321
val = str2CMPIValue(q->type, valStr, NULL);
322
rc = addClassQualifier(cls, q->name, &val, q->type);
323
native_release_CMPIValue( q->type,&val);
329
qs->first = qs->last = NULL;
334
void addProperty(ParserControl *parm, XtokProperties *ps, XtokProperty *p)
337
np = (XtokProperty*)PARSER_MALLOC(sizeof(XtokProperty));
338
memcpy(np, p, sizeof(XtokProperty));
340
if (ps->last) ps->last->next = np;
345
void addParamValue(ParserControl *parm, XtokParamValues *vs, XtokParamValue *v)
348
nv = (XtokParamValue*)PARSER_MALLOC(sizeof(XtokParamValue));
349
memcpy(nv, v, sizeof(XtokParamValue));
358
void addKeyBinding(ParserControl *parm, XtokKeyBindings *ks, XtokKeyBinding *k)
361
nk = (XtokKeyBinding*)PARSER_MALLOC(sizeof(XtokKeyBinding));
362
memcpy(nk, k, sizeof(XtokKeyBinding));
364
if (ks->last) ks->last->next = nk;
369
void addQualifier(ParserControl *parm, XtokQualifiers *qs, XtokQualifier *q)
372
nq = (XtokQualifier*)PARSER_MALLOC(sizeof(XtokQualifier));
373
memcpy(nq, q, sizeof(XtokQualifier));
375
if (qs->last) qs->last->next = nq;
380
void addMethod(ParserControl *parm, XtokMethods *ms, XtokMethod *m)
383
nm = (XtokMethod*)PARSER_MALLOC(sizeof(XtokMethod));
384
memcpy(nm, m, sizeof(XtokMethod));
393
void addParam(ParserControl *parm, XtokParams *ps, XtokParam *p)
396
np = (XtokParam*)PARSER_MALLOC(sizeof(XtokParam));
397
memcpy(np, p, sizeof(XtokParam));
406
void setError(ParserControl *parm, XtokErrorResp *e)
410
fprintf(stderr, "error:: code:%s description:%s\n",
411
e->code, e->description);
413
parm->respHdr.errCode = atoi(e->code);
414
parm->respHdr.description = XmlToAsciiStr(e->description);
417
void setReturnArgs(ParserControl *parm, XtokParamValues *ps)
420
XtokParamValue *outParam=NULL;
421
CMPIArgs *args = NULL;
423
/* Process OUT parameters */
424
outParam = ps->first;
427
args = newCMPIArgs(NULL);
430
value = str2CMPIValue(outParam->type, outParam->data.value.data.value, &outParam->data.valueRef);
432
/* Add it to the args list */
433
args->ft->addArg ( args, outParam->name, &value, outParam->type);
434
native_release_CMPIValue(outParam->type,&value);
435
outParam = outParam->next;
437
parm->respHdr.outArgs = args;
438
/* Note : Freeing of list will be done by
439
* parser_heap_term() routine.