Esempio n. 1
0
 internal void Parse(DynamicContractDescription dynamicMessageDescription)
 {
     if (Data != null)
     {
         if (!dynamicMessageDescription.TryParseContract(Data, out _dynamicMessage))
         {
             _dynamicMessage = null;
         }
     }
     else if (_dynamicMessage != null)
     {
         Data = _dynamicMessage.ToByteArray(dynamicMessageDescription);
     }
 }
Esempio n. 2
0
        public static bool TryParseContract(DynamicContractDescription contract,
                                            Buffer.BitArray buffer, out DynamicContractValue msg)
        {
            msg = new DynamicContractValue(contract);
            foreach (var property in contract.Members)
            {
                if (property.Value.IsConditional)
                {
                    if (!property.Value.Condition.Evaluate(msg.Data))
                    {
                        if (msg.Data.ContainsKey(property.Value.Name))
                        {
                            msg.Data.Remove(property.Value.Name);
                        }
                        continue;
                    }
                }

                if (property.Value.IsContract)
                {
                    if (property.Value.IsArray)
                    {
                        int length      = 0;
                        var arrayLength = property.Value.ArrayLength;
                        if (!Int32.TryParse(arrayLength, out length))
                        {
                            //is reference value
                            length = (int)msg.Data[arrayLength].Value;
                        }
                        object[] temp = new object[length];

                        IDynamicMemberValue propValue = new DynamicMemberValue(property.Value, null);

                        for (int i = 0; i < length; i++)
                        {
                            DynamicContractValue value;

                            if (!TryParseContract(property.Value.ContractDescription, buffer, out value))
                            {
                                return(false);
                            }
                            temp[i] = value;
                        }
                        propValue.Value = temp;
                        msg.Data[property.Value.Name] = propValue;
                    }
                    else
                    {
                        DynamicContractValue value;

                        if (!TryParseContract(property.Value.ContractDescription, buffer, out value))
                        {
                            return(false);
                        }

                        msg.Data[property.Value.Name] = value;
                    }
                }
                else
                {
                    IDynamicMemberValue value;
                    if (!property.Value.TryParseDynamicPropertyValue(buffer, msg, out value))
                    {
                        return(false);
                    }
                    msg.Data[value.Description.Name] = value;
                }
            }
            return(true);
        }