#include "errorutil.h"
#include "OMI_Error.h"
#include "omierror.h"
#include
#include
#include
/*
**==============================================================================
**
** Helper to create PostResultMsg
**
**==============================================================================
*/
_Use_decl_annotations_
PostResultMsg* PostResultMsg_NewAndSerialize(
Message* req,
const MI_Instance* err,
const MI_Char* errmsg,
const MI_Char *errorType,
MI_Uint32 r)
{
PostResultMsg* msg = NULL;
const MI_Instance* error = err;
MI_Result result = MI_RESULT_OK;
DEBUG_ASSERT( req );
msg = PostResultMsg_New(req->operationId);
if (!msg)
{
return NULL;
}
if (!error)
{
OMI_ErrorFromErrorCode(
msg->base.batch,
r,
errorType,
errmsg,
(OMI_Error**)&error);
}
if (error)
{
MI_Value value;
MI_Type type;
MI_Result result;
result = MI_Instance_GetElement(error, MI_T("CIMStatusCode"), &value, &type, NULL, NULL);
if ((MI_RESULT_OK == result) && (type == MI_UINT32))
{
r = value.uint32;
}
else
{
/* failed to get real status code so assume failed */
r = MI_RESULT_FAILED;
}
}
else if (Tcscmp(errorType, MI_RESULT_TYPE_MI) != 0)
{
/* convert non-MI result to an MI result */
r = MI_RESULT_FAILED;
}
/* create final result message */
do
{
if (error && (errmsg == NULL))
{
MI_Value messageValue;
MI_Type messageType;
result = MI_Instance_GetElement(error, MI_T("Message"), &messageValue, &messageType, NULL, NULL);
if ((MI_RESULT_OK == result) && (MI_STRING == messageType))
{
errmsg = Batch_Tcsdup(msg->base.batch, messageValue.string);
}
}
msg->result = (MI_Result)r;
if (errmsg)
{
msg->errorMessage = Batch_Tcsdup(msg->base.batch, errmsg);
}
else
{
msg->errorMessage = NULL;
}
msg->cimError = error;
msg->packedInstancePtr = NULL;
msg->packedInstanceSize = 0;
msg->cimErrorClassName = NULL;
if (error)
{
if (req->flags & WSMANFlag)
{
/* This puts a pretty bad dependency on a bunch of stuff so we are removing this from
* from minimum size build and relying on default WSman IF and ONLY if that is needed.
* The results will have default values for the error case in that case.
*/
result = WSBuf_InstanceToBuf(
USERAGENT_UNKNOWN,
error,
NULL, /* filterProperty */
NULL, /* filterPropertyData */
error->classDecl,
msg->base.batch,
WSMAN_ObjectFlag | WSMAN_IsCimError,
&msg->packedInstancePtr,
&msg->packedInstanceSize);
if (result != MI_RESULT_OK)
break;
msg->base.flags |= req->flags;
}
else /* Binary protocol */
{
result = InstanceToBatch(
error,
NULL,
NULL,
msg->base.batch,
&msg->packedInstancePtr,
&msg->packedInstanceSize);
if (result != MI_RESULT_OK)
break;
msg->base.flags |= BinaryProtocolFlag;
}
msg->cimErrorClassName = Batch_Tcsdup(msg->base.batch, error->classDecl->name);
}
}
while(0);
if ((result != MI_RESULT_OK) && (NULL != msg))
{
/* TODO: Trace message */
PostResultMsg_Release(msg);
msg = NULL;
}
return msg;
}