internal Object[] WriteArray(Object returnValue, Object[] args, Exception exception, Object callContext, Object[] properties)
{
SerTrace.Log(this, "WriteArray returnValue ",returnValue, "exception ", exception, " callContext ",callContext," properties ", properties);
this.returnValue = returnValue;
this.args = args;
this.exception = exception;
this.callContext = callContext;
this.properties = properties;
int arraySize = 0;
if (args == null || args.Length == 0)
messageEnum = MessageEnum.NoArgs;
else
{
argTypes = new Type[args.Length];
// Check if args are all string or primitives
bArgsPrimitive = true;
for (int i =0; i<args.Length; i++)
{
if (args[i] != null)
{
argTypes[i] = args[i].GetType();
if (!(argTypes[i].IsPrimitive || argTypes[i] == Converter.typeofString))
{
bArgsPrimitive = false;
break;
}
}
}
if (bArgsPrimitive)
messageEnum = MessageEnum.ArgsInline;
else
{
arraySize++;
messageEnum = MessageEnum.ArgsInArray;
}
}
if (returnValue == null)
messageEnum |= MessageEnum.NoReturnValue;
else if (returnValue.GetType() == typeof(void))
messageEnum |= MessageEnum.ReturnValueVoid;
else
{
returnType = returnValue.GetType();
if (returnType.IsPrimitive || returnType == Converter.typeofString)
messageEnum |= MessageEnum.ReturnValueInline;
else
{
arraySize++;
messageEnum |= MessageEnum.ReturnValueInArray;
}
}
if (exception != null)
{
arraySize++;
messageEnum |= MessageEnum.ExceptionInArray;
}
if (callContext == null)
messageEnum |= MessageEnum.NoContext;
else if (callContext is String)
messageEnum |= MessageEnum.ContextInline;
else
{
arraySize++;
messageEnum |= MessageEnum.ContextInArray;
}
if (properties != null)
{
arraySize++;
messageEnum |= MessageEnum.PropertyInArray;
}
if (IOUtil.FlagTest(messageEnum, MessageEnum.ArgsInArray) && (arraySize == 1))
{
messageEnum ^= MessageEnum.ArgsInArray;
messageEnum |= MessageEnum.ArgsIsArray;
return args;
}
if (arraySize > 0)
{
int arrayPosition = 0;
callA = new Object[arraySize];
if (IOUtil.FlagTest(messageEnum, MessageEnum.ArgsInArray))
callA[arrayPosition++] = args;
if (IOUtil.FlagTest(messageEnum, MessageEnum.ReturnValueInArray))
callA[arrayPosition++] = returnValue;
if (IOUtil.FlagTest(messageEnum, MessageEnum.ExceptionInArray))
callA[arrayPosition++] = exception;
if (IOUtil.FlagTest(messageEnum, MessageEnum.ContextInArray))
callA[arrayPosition++] = callContext;
if (IOUtil.FlagTest(messageEnum, MessageEnum.PropertyInArray))
callA[arrayPosition] = properties;
return callA;
}
else
return null;
}