Exemple #1
0
        public IEnumerable GetContents()
        {
            var chars        = TypeTag.ToArray();
            var activeArrays = new Stack <ArrayList>();

            using (var reader = new BigEndianReader(GetContentStream()))
            {
                for (int i = 1; i < chars.Length; i++)
                {
                    object content;
                    switch (chars[i])
                    {
                    case Osc.TypeTag.Int32:
                        content = reader.ReadInt32();
                        break;

                    case Osc.TypeTag.Float:
                        content = reader.ReadSingle();
                        break;

                    case Osc.TypeTag.String:
                    case Osc.TypeTag.Alternate:
                        content = MessageParser.ReadString(reader);
                        break;

                    case Osc.TypeTag.Blob:
                        content = MessageParser.ReadBlob(reader);
                        break;

                    case Osc.TypeTag.Int64:
                        content = reader.ReadInt64();
                        break;

                    case Osc.TypeTag.TimeTag:
                        content = MessageParser.ReadTimeTag(reader);
                        break;

                    case Osc.TypeTag.Double:
                        content = reader.ReadDouble();
                        break;

                    case Osc.TypeTag.Char:
                        content = MessageParser.ReadChar(reader);
                        break;

                    case Osc.TypeTag.True:
                        content = true;
                        break;

                    case Osc.TypeTag.False:
                        content = false;
                        break;

                    case Osc.TypeTag.Infinitum:
                        content = float.PositiveInfinity;
                        break;

                    case Osc.TypeTag.ArrayBegin:
                        activeArrays.Push(new ArrayList());
                        continue;

                    case Osc.TypeTag.ArrayEnd:
                        var array = activeArrays.Pop();
                        content = array.ToArray();
                        break;

                    default:
                    case Osc.TypeTag.Nil:
                        content = null;
                        break;
                    }

                    if (activeArrays.Count > 0)
                    {
                        var array = activeArrays.Peek();
                        array.Add(content);
                    }
                    else
                    {
                        yield return(content);
                    }
                }
            }
        }