cimoperationresponsedecoder.cpp
来自「Pegasus is an open-source implementation」· C++ 代码 · 共 1,785 行 · 第 1/4 页
CPP
1,785 行
}void CIMOperationResponseDecoder::_handleMethodResponse( char* content, const ContentLanguageList& contentLanguages, Boolean cimReconnect){ Message* response = 0; // // Create and initialize XML parser: // XmlParser parser((char*)content); XmlEntry entry; try { // // Process <?xml ... > // const char* xmlVersion = 0; const char* xmlEncoding = 0; XmlReader::getXmlDeclaration(parser, xmlVersion, xmlEncoding); // // Process <CIM ... > // const char* cimVersion = 0; const char* dtdVersion = 0; // ATTN-RK-P3-20020416: Need to validate these versions? XmlReader::getCimStartTag(parser, cimVersion, dtdVersion); // // Expect <MESSAGE ... > // String messageId; String protocolVersion; if (!XmlReader::getMessageStartTag(parser, messageId, protocolVersion)) { MessageLoaderParms mlParms( "Client.CIMOperationResponseDecoder.EXPECTED_MESSAGE_ELEMENT", "expected MESSAGE element"); throw XmlValidationError(parser.getLine(), mlParms); } // // This code for checking the protocol version was taken from the // server code. // Boolean protocolVersionAccepted = false; if ((protocolVersion.size() >= 3) && (protocolVersion[0] == '1') && (protocolVersion[1] == '.')) { // Verify that all characters after the '.' are digits Uint32 index = 2; while ((index < protocolVersion.size()) && (protocolVersion[index] >= '0') && (protocolVersion[index] <= '9')) { index++; } if (index == protocolVersion.size()) { protocolVersionAccepted = true; } } if (!protocolVersionAccepted) { MessageLoaderParms mlParms( "Client.CIMOperationResponseDecoder.UNSUPPORTED_PROTOCOL", "Received unsupported protocol version \"$0\", expected " "\"$1\"", protocolVersion, "1.[0-9]+"); String mlString(MessageLoader::getMessage(mlParms)); CIMClientResponseException* responseException = new CIMClientResponseException(mlString); ClientExceptionMessage * response = new ClientExceptionMessage(responseException); response->setCloseConnect(cimReconnect); _outputQueue->enqueue(response); return; } // // Expect <SIMPLERSP ... > // XmlReader::expectStartTag(parser, entry, "SIMPLERSP"); // // Expect <IMETHODRESPONSE ... > // const char* iMethodResponseName = 0; Boolean isEmptyTag = false; if (XmlReader::getIMethodResponseStartTag( parser, iMethodResponseName, isEmptyTag)) { // // Dispatch the method: // if (System::strcasecmp(iMethodResponseName, "GetClass") == 0) response = _decodeGetClassResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName, "GetInstance") == 0) response = _decodeGetInstanceResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName, "EnumerateClassNames") == 0) response = _decodeEnumerateClassNamesResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName, "References") == 0) response = _decodeReferencesResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName, "ReferenceNames") == 0) response = _decodeReferenceNamesResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName, "AssociatorNames") == 0) response = _decodeAssociatorNamesResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName, "Associators") == 0) response = _decodeAssociatorsResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName, "CreateInstance") == 0) response = _decodeCreateInstanceResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName,"EnumerateInstanceNames") == 0) response = _decodeEnumerateInstanceNamesResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName,"EnumerateInstances") == 0) response = _decodeEnumerateInstancesResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName, "GetProperty") == 0) response = _decodeGetPropertyResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName, "SetProperty") == 0) response = _decodeSetPropertyResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName, "DeleteQualifier") == 0) response = _decodeDeleteQualifierResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName, "GetQualifier") == 0) response = _decodeGetQualifierResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName, "SetQualifier") == 0) response = _decodeSetQualifierResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName, "EnumerateQualifiers") == 0) response = _decodeEnumerateQualifiersResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName, "EnumerateClasses") == 0) response = _decodeEnumerateClassesResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName, "CreateClass") == 0) response = _decodeCreateClassResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName, "ModifyClass") == 0) response = _decodeModifyClassResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName, "ModifyInstance") == 0) response = _decodeModifyInstanceResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName, "DeleteClass") == 0) response = _decodeDeleteClassResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp( iMethodResponseName, "DeleteInstance") == 0) response = _decodeDeleteInstanceResponse( parser, messageId, isEmptyTag); else if (System::strcasecmp(iMethodResponseName, "ExecQuery") == 0) response = _decodeExecQueryResponse( parser, messageId, isEmptyTag); else { MessageLoaderParms mlParms( "Client.CIMOperationResponseDecoder.UNRECOGNIZED_NAME", "Unrecognized IMethodResponse name \"$0\"", iMethodResponseName); throw XmlValidationError(parser.getLine(), mlParms); } // // Handle end tag: // if (!isEmptyTag) { XmlReader::expectEndTag(parser, "IMETHODRESPONSE"); } } else if (XmlReader::getMethodResponseStartTag( parser, iMethodResponseName, isEmptyTag)) { response = _decodeInvokeMethodResponse( parser, messageId, iMethodResponseName, isEmptyTag); // // Handle end tag: // if (!isEmptyTag) { XmlReader::expectEndTag(parser, "METHODRESPONSE"); } } else { MessageLoaderParms mlParms( "Client.CIMOperationResponseDecoder." "EXPECTED_METHODRESPONSE_OR_IMETHODRESPONSE_ELEMENT", "expected METHODRESPONSE or IMETHODRESPONSE element"); throw XmlValidationError(parser.getLine(), mlParms); } // // Handle end tags: // XmlReader::expectEndTag(parser, "SIMPLERSP"); XmlReader::expectEndTag(parser, "MESSAGE"); XmlReader::expectEndTag(parser, "CIM"); } catch (XmlException& x) { Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::TRACE, "CIMOperationResponseDecoder::_handleMethodResponse - " "XmlException has occurred. Message: $0", x.getMessage()); if (response) {//#ifdef PEGASUS_SNIA_INTEROP_TEST// httpMessage->printAll(cout);//#endif delete response; } response = new ClientExceptionMessage( new CIMClientXmlException(x.getMessage())); } catch (Exception& x) { // Might get MalformedObjectNameException, InvalidNameException, etc. if (response) { delete response; } response = new ClientExceptionMessage( new CIMClientResponseException(x.getMessage())); }//l10n start// l10n TODO - might want to move A-L and C-L to Message// to make this more maintainable // Add the language header to the request CIMMessage * cimmsg = dynamic_cast<CIMMessage *>(response); if (cimmsg != NULL) { cimmsg->operationContext.set( ContentLanguageListContainer(contentLanguages)); } else { ; // l10n TODO - error back to client here }// l10n end response->setCloseConnect(cimReconnect); _outputQueue->enqueue(response);}CIMCreateClassResponseMessage* CIMOperationResponseDecoder::_decodeCreateClassResponse( XmlParser& parser, const String& messageId, Boolean isEmptyImethodresponseTag){ XmlEntry entry; CIMException cimException; if (!isEmptyImethodresponseTag) { if (XmlReader::getErrorElement(parser, cimException)) { return new CIMCreateClassResponseMessage( messageId, cimException, QueueIdStack()); } if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE")) { if (entry.type != XmlEntry::EMPTY_TAG) { XmlReader::expectEndTag(parser, "IRETURNVALUE"); } } } return new CIMCreateClassResponseMessage( messageId, cimException, QueueIdStack());}CIMGetClassResponseMessage* CIMOperationResponseDecoder::_decodeGetClassResponse( XmlParser& parser, const String& messageId, Boolean isEmptyImethodresponseTag){ XmlEntry entry; CIMException cimException; if (isEmptyImethodresponseTag) { MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_OPEN", "Expected open of $0 element", "IMETHODRESPONSE"); throw XmlValidationError(parser.getLine(), mlParms); } else if (XmlReader::getErrorElement(parser, cimException)) { return new CIMGetClassResponseMessage( messageId, cimException, QueueIdStack(), CIMClass()); } else if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE")) { CIMClass cimClass; if ((entry.type == XmlEntry::EMPTY_TAG) || !XmlReader::getClassElement(parser, cimClass)) { MessageLoaderParms mlParms( "Client.CIMOperationResponseDecoder.EXPECTED_CLASS_ELEMENT", "expected CLASS element"); throw XmlValidationError(parser.getLine(), mlParms); } XmlReader::expectEndTag(parser, "IRETURNVALUE"); return new CIMGetClassResponseMessage( messageId, cimException, QueueIdStack(), cimClass); } else { MessageLoaderParms mlParms( "Client.CIMOperationResponseDecoder." "EXPECTED_ERROR_OR_IRETURNVALUE_ELEMENT", "expected ERROR or IRETURNVALUE element"); throw XmlValidationError(parser.getLine(), mlParms); }}CIMModifyClassResponseMessage* CIMOperationResponseDecoder::_decodeModifyClassResponse( XmlParser& parser, const String& messageId, Boolean isEmptyImethodresponseTag){ XmlEntry entry; CIMException cimException; if (!isEmptyImethodresponseTag) { if (XmlReader::getErrorElement(parser, cimException)) { return new CIMModifyClassResponseMessage( messageId, cimException, QueueIdStack()); } if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE")) { if (entry.type != XmlEntry::EMPTY_TAG) { XmlReader::expectEndTag(parser, "IRETURNVALUE"); } } } return new CIMModifyClassResponseMessage( messageId, cimException, QueueIdStack());}CIMEnumerateClassNamesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateClassNamesResponse( XmlParser& parser, const String& messageId, Boolean isEmptyImethodresponseTag){ XmlEntry entry; CIMException cimException; Array<CIMName> classNames; if (!isEmptyImethodresponseTag) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?