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 + -
显示快捷键?