/// <summary> /// Reads a BSON document from the specified EasyReader. /// </summary> /// <param name="reader">The reader that will be used to read this document.</param> /// <returns>The document that was read.</returns> internal static BsonDocument Read(EasyReader reader, BsonDocument parent = null, bool inArray = false) { var stringTableMode = BsonStringTableMode.None; Dictionary <int, string> stringTable = null; if (parent == null) { var includesStringTable = reader.ReadBoolean(); if (includesStringTable) { stringTable = new Dictionary <int, string>(); stringTableMode = (BsonStringTableMode)reader.ReadByte(); var version = reader.ReadByte(); if (version != STRING_TABLE_VERSION) { throw new InvalidDataException("Unsupported string table version: " + version); } var tableLength = reader.ReadInt32(); var tableEntries = reader.ReadInt32(); for (var i = 0; i < tableEntries; i++) { var num = reader.ReadInt32(); var val = reader.ReadString(Encoding.UTF8); stringTable[num] = val; } } } else { stringTable = parent.ReverseStringTable; stringTableMode = parent.StringTableMode; } var document = new BsonDocument(stringTableMode, stringTable); var length = reader.ReadInt32(); while (!reader.EndOfStream) { var code = reader.ReadByte(); if (code == 0x00) // end of document { break; } var name = reader.ReadCString(); if (!inArray && document.StringTableMode != BsonStringTableMode.None) { name = document.ReverseStringTable[int.Parse(name)]; } var data = ReadItem(code, document, reader); document.Top[name] = data; } return(document); }
protected override IEnumerator <DeserializeRequest> Deserialize(EasyReader input) { var iterMain = base.Deserialize(input); while (iterMain.MoveNext()) { yield return(iterMain.Current); } int pCount = input.ReadInt32(); if (Parameters == null) { Parameters = new Dictionary <string, SubroutineParameterType>(pCount); } for (int i = 0; i < pCount; i++) { string key = input.ReadString(); Parameters[key] = (SubroutineParameterType)input.ReadByte(); } }
protected override IEnumerator <DeserializeRequest> Deserialize(EasyReader input) { var iterMain = base.Deserialize(input); while (iterMain.MoveNext()) { yield return(iterMain.Current); } int pCount = input.ReadInt32(); if (Parameters == null) { Parameters = new List <SubroutineParameter>(); } for (int i = 0; i < pCount; i++) { string paramName = input.ReadString(); var paramType = (SubroutineParameterType)input.ReadByte(); Parameters.Add(new SubroutineParameter(paramName, paramType)); } }
private static BsonItem ReadItem(byte code, BsonDocument document, EasyReader reader) { object val = null; switch (code) { case 0x01: // double val = reader.ReadDouble(); break; case 0x02: // string val = reader.ReadString(Encoding.UTF8).TrimEnd('\x00'); if (document.StringTableMode == BsonStringTableMode.KeysAndValues) val = document.ReverseStringTable[int.Parse((string)val)]; break; case 0x03: // document val = Read(reader, document).Top; break; case 0x04: // array val = Read(reader, document, true).Top; break; case 0x05: // binary var length = reader.ReadInt32(); var subtype = reader.ReadByte(); if (subtype != 0x00) throw new NotSupportedException("BSON subtypes other than 'generic binary data' are not supported."); val = reader.ReadBytes(length); break; case 0x06: // undefined break; case 0x07: // ObjectId // why does this parser support ObjectIds and not other binary data? // shhhhh val = Encoding.ASCII.GetString(reader.ReadBytes(12)); break; case 0x08: // boolean val = reader.ReadBoolean(); break; case 0x09: // UTC datetime val = reader.ReadInt64(); break; case 0x0A: // null break; case 0x0B: // regex // why are you using regex in a Rant package? throw new NotSupportedException("Regular expressions are not supported."); case 0x0C: // db pointer throw new NotSupportedException("DB pointers are not supported."); case 0x0D: // Javascript code case 0x0F: // JS code with scope throw new NotSupportedException("Javascript in BSON is not supported."); case 0x0E: // depreceated val = reader.ReadString(Encoding.UTF8); break; case 0x10: // 32 bit integer val = reader.ReadInt32(); break; case 0x11: // timestamp case 0x12: // 64 bit integer val = reader.ReadInt64(); break; case 0xFF: // min key case 0x7F: // max key // we don't care about these so let's just skip em break; } if (!(val is BsonItem)) return new BsonItem(val) { Type = code }; var i = (BsonItem)val; i.Type = code; return i; }
/// <summary> /// Reads a BSON document from the specified EasyReader. /// </summary> /// <param name="reader">The reader that will be used to read this document.</param> /// <returns>The document that was read.</returns> internal static BsonDocument Read(EasyReader reader, BsonDocument parent = null, bool inArray = false) { var stringTableMode = BsonStringTableMode.None; Dictionary<int, string> stringTable = null; if (parent == null) { var includesStringTable = reader.ReadBoolean(); if (includesStringTable) { stringTable = new Dictionary<int, string>(); stringTableMode = (BsonStringTableMode)reader.ReadByte(); var version = reader.ReadByte(); if (version != STRING_TABLE_VERSION) throw new InvalidDataException("Unsupported string table version: " + version); var tableLength = reader.ReadInt32(); var tableEntries = reader.ReadInt32(); for (var i = 0; i < tableEntries; i++) { var num = reader.ReadInt32(); var val = reader.ReadString(Encoding.UTF8); stringTable[num] = val; } } } else { stringTable = parent.ReverseStringTable; stringTableMode = parent.StringTableMode; } var document = new BsonDocument(stringTableMode, stringTable); var length = reader.ReadInt32(); while(!reader.EndOfStream) { var code = reader.ReadByte(); if (code == 0x00) // end of document break; var name = reader.ReadCString(); if (!inArray && document.StringTableMode != BsonStringTableMode.None) name = document.ReverseStringTable[int.Parse(name)]; var data = ReadItem(code, document, reader); document.Top[name] = data; } return document; }
private static BsonItem ReadItem(byte code, BsonDocument document, EasyReader reader) { object val = null; switch (code) { case 0x01: // double val = reader.ReadDouble(); break; case 0x02: // string val = reader.ReadString(Encoding.UTF8).TrimEnd('\x00'); if (document.StringTableMode == BsonStringTableMode.KeysAndValues) { val = document.ReverseStringTable[int.Parse((string)val)]; } break; case 0x03: // document val = Read(reader, document).Top; break; case 0x04: // array val = Read(reader, document, true).Top; break; case 0x05: // binary var length = reader.ReadInt32(); var subtype = reader.ReadByte(); if (subtype != 0x00) { throw new NotSupportedException("BSON subtypes other than 'generic binary data' are not supported."); } val = reader.ReadBytes(length); break; case 0x06: // undefined break; case 0x07: // ObjectId // why does this parser support ObjectIds and not other binary data? // shhhhh val = Encoding.ASCII.GetString(reader.ReadBytes(12)); break; case 0x08: // boolean val = reader.ReadBoolean(); break; case 0x09: // UTC datetime val = reader.ReadInt64(); break; case 0x0A: // null break; case 0x0B: // regex // why are you using regex in a Rant package? throw new NotSupportedException("Regular expressions are not supported."); case 0x0C: // db pointer throw new NotSupportedException("DB pointers are not supported."); case 0x0D: // Javascript code case 0x0F: // JS code with scope throw new NotSupportedException("Javascript in BSON is not supported."); case 0x0E: // depreceated val = reader.ReadString(Encoding.UTF8); break; case 0x10: // 32 bit integer val = reader.ReadInt32(); break; case 0x11: // timestamp case 0x12: // 64 bit integer val = reader.ReadInt64(); break; case 0xFF: // min key case 0x7F: // max key // we don't care about these so let's just skip em break; } if (!(val is BsonItem)) { return new BsonItem(val) { Type = code } } ; var i = (BsonItem)val; i.Type = code; return(i); } }