public IntermediateNodeObject Build(List<ObjectGroupDataElementData> objectGroupList, ObjectGroupObjectData dataObj, ExGuid intermediateGuid)
{
IntermediateNodeObject node = null;
RootNodeObject rootNode = null;
int index = 0;
if (StreamObject.TryGetCurrent<IntermediateNodeObject>(dataObj.Data.Content.ToArray(), ref index, out node))
{
if (dataObj.ObjectExGUIDArray == null)
{
throw new InvalidOperationException("Failed to build intermediate node because the object extend GUID array does not exist.");
}
node.ExGuid = intermediateGuid;
// Contain a single Data Node Object.
if (dataObj.ObjectExGUIDArray.Count.DecodedValue == 1u)
{
ObjectGroupObjectDeclare dataNodeDeclare;
ObjectGroupObjectData dataNodeData = this.FindByExGuid(objectGroupList, dataObj.ObjectExGUIDArray.Content[0], out dataNodeDeclare);
BinaryItem data = dataNodeData.Data;
node.DataNodeObjectData = new DataNodeObjectData(data.Content.ToArray(), 0, (int)data.Length.DecodedValue);
node.DataNodeObjectData.ExGuid = dataObj.ObjectExGUIDArray.Content[0];
node.IntermediateNodeObjectList = null;
if (SharedContext.Current.IsMsFsshttpRequirementsCaptured)
{
MsfsshttpdCapture.VerifyObjectGroupObjectDataForDataNodeObject(dataNodeData, dataNodeDeclare, objectGroupList, SharedContext.Current.Site);
}
}
else
{
// Contain a list of IntermediateNodeObject
node.IntermediateNodeObjectList = new List<IntermediateNodeObject>();
node.DataNodeObjectData = null;
foreach (ExGuid extGuid in dataObj.ObjectExGUIDArray.Content)
{
ObjectGroupObjectDeclare intermediateDeclare;
ObjectGroupObjectData intermediateData = this.FindByExGuid(objectGroupList, extGuid, out intermediateDeclare);
node.IntermediateNodeObjectList.Add(new IntermediateNodeObjectBuilder().Build(objectGroupList, intermediateData, extGuid));
if (SharedContext.Current.IsMsFsshttpRequirementsCaptured)
{
MsfsshttpdCapture.VerifyObjectGroupObjectDataForIntermediateNode(intermediateData, intermediateDeclare, objectGroupList, SharedContext.Current.Site);
}
}
}
}
else if (StreamObject.TryGetCurrent<RootNodeObject>(dataObj.Data.Content.ToArray(), ref index, out rootNode))
{
// In Sub chunking for larger than 1MB zip file, MOSS2010 could return RootNodeObject.
// For easy further process, the rootNode will be replaced by intermediate node instead.
node = new IntermediateNodeObject();
node.IntermediateNodeObjectList = new List<IntermediateNodeObject>();
node.DataSize = rootNode.DataSize;
node.ExGuid = rootNode.ExGuid;
node.Signature = rootNode.Signature;
node.DataNodeObjectData = null;
foreach (ExGuid extGuid in dataObj.ObjectExGUIDArray.Content)
{
ObjectGroupObjectDeclare intermediateDeclare;
ObjectGroupObjectData intermediateData = this.FindByExGuid(objectGroupList, extGuid, out intermediateDeclare);
node.IntermediateNodeObjectList.Add(new IntermediateNodeObjectBuilder().Build(objectGroupList, intermediateData, extGuid));
if (SharedContext.Current.IsMsFsshttpRequirementsCaptured)
{
MsfsshttpdCapture.VerifyObjectGroupObjectDataForIntermediateNode(intermediateData, intermediateDeclare, objectGroupList, SharedContext.Current.Site);
}
}
}
else
{
throw new InvalidOperationException("In the ObjectGroupDataElement cannot only contain the RootNodeObject or IntermediateNodeOBject.");
}
return node;
}