+void WsmReader::decodeInvokeInputBody(
+ const String& className,
+ const String& methodName,
+ WsmInstance& instance)
+{
+ XmlEntry entry;
+
+ //
+ // Parse the <s:Body> element. Here is an example:
+ //
+ // <p:Foo_INPUT xmlns:p=
+ // "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/SomeClass">
+ // <p:Arg1>
+ // ...
+ // </p:Arg1>
+ // <p:Arg2>
+ // ...
+ // </p:Arg2>
+ // </p:Foo_INPUT>
+ //
+
+ // Expect <METHODNAME_INPUT>
+ Buffer tagName;
+ tagName.append(methodName.getCString(), methodName.size());
+ tagName.append("_INPUT", 6);
+
+ _parser.setHideEmptyTags(true);
+ int nsType = expectStartTag(entry, tagName.getData());
+
+ // The following elements are input parameter.
+ String name;
+ WsmValue value;
+
+ while (getPropertyElement(nsType, name, value))
+ {
+ instance.addProperty(WsmProperty(name, value));
+ }
+
+ // Expect </METHODNAME_INPUT>
+ expectEndTag(nsType, tagName.getData());
+ _parser.setHideEmptyTags(false);
+}
+
+void WsmReader::decodeFilter(
+ String& queryLanguage,
+ String& query,
+ SharedPtr<WQLSelectStatement>& selectStatement)
+{
+ // Expect "Filter" element.
+ _parser.setHideEmptyTags(true);
+ XmlEntry entry;
+ expectStartTag(entry, WsmNamespaces::WS_MAN, "Filter");
+
+ // Check Filter.Dialect attribute.
+ {
+ const char* value;
+
+ if (!entry.getAttributeValue("Dialect", value))
+ {
+ MessageLoaderParms parms(
+ "WsmServer.WsmReader.MISSING_ATTRIBUTE",
+ "The attribute $0.$1 is missing.", "Filter", "Dialect");
+ throw XmlValidationError(_parser.getLine(), parms);
+ }
+
+ const char* suffix = WsmUtils::skipHostUri(value);
+
+ if (strcmp(suffix, WSMAN_FILTER_DIALECT_WQL_SUFFIX) != 0)
+ {
+ MessageLoaderParms parms(
+ "WsmServer.WsmReader.UNSUPPORTED_FILTER_DIALECT",
+ "Unsupported filter dialect: \"$0\".",
+ value);
+ throw WsmFault(
+ WsmFault::wsen_FilterDialectRequestedUnavailable, parms);
+ }
+
+ // We only support "WQL" so far.
+ queryLanguage = "WQL";
+ }
+
+ // Expect query expression (contains the query text).
+
+ expectContentOrCData(entry);
+ query = entry.text;
+
+ // Compile the query filter.
+
+ try
+ {
+ selectStatement.reset(new WQLSelectStatement);
+ WQLParser::parse(query, *selectStatement.get());
+ }
+ catch (ParseError& e)
+ {
+ MessageLoaderParms parms(
+ "WsmServer.WsmReader.INVALID_FILTER_QUERY_EXPRESSION",
+ "Invalid filter query expression: \"$0\".",
+ entry.text);
+ throw WsmFault(WsmFault::wsen_CannotProcessFilter, parms);
+ }
+
+ // Expect </Filter>
+
+ expectEndTag(WsmNamespaces::WS_MAN, "Filter");
+ _parser.setHideEmptyTags(false);
+}
+