private static void EncodeKeys(Stream outStream, ISet<Key> keys) { using (BinWriter w = new BinWriter(outStream)) { w.Write(keys.Count); } foreach (Key key in keys) XdrCoding.putBytes(outStream, key.Data); }
/// <summary> /// Write a length-delimted array of strings. /// </summary> /// <param name="outStream"></param> /// <param name="strings"></param> public static void putStringArray(Stream outStream, String[] strings) { using (BinWriter w = new BinWriter(outStream)) { w.Write(strings.Length); } foreach (String s in strings) putString(outStream, s); }
public void Encode(Stream outStream) { // number of key schemes in the list using (BinWriter w = new BinWriter(outStream)) { w.Write(keySets.Count); } foreach (var entry in keySets) { KeyScheme scheme = entry.Key; IKeySet keySet = entry.Value; // scheme ID using (BinWriter w = new BinWriter(outStream)) { w.Write(scheme.Id); } if (scheme.IsDual()) { DualKeySet dualKeySet = (DualKeySet)keySet; using (BinWriter w = new BinWriter(outStream)) { w.Write(2); } EncodeKeys(outStream, dualKeySet.ProducerKeys); EncodeKeys(outStream, dualKeySet.ConsumerKeys); } else { using (BinWriter w = new BinWriter(outStream)) { w.Write(1); } EncodeKeys(outStream, (SingleKeySet)keySet); } } }
public static void putObjects(Stream outStream, Object[] objects) { using (BinWriter w = new BinWriter(outStream)) { w.Write(objects.Length); } foreach (Object o in objects) putObject(outStream, o); }
/// <summary> /// Write a length-delimited 4-byte-aligned UTF-8 string. /// </summary> /// <param name="outStream"></param> /// <param name="s"></param> public static void putString(Stream outStream, String s) { try { if (s.Length == 0) { using (BinWriter w = new BinWriter(outStream)) { w.Write(0); } } else { byte[] b = Encoding.UTF8.GetBytes(s); using (BinWriter w = new BinWriter(outStream)) { // write length w.Write(b.Length); // write string w.Write(b); } putPadding(outStream, b.Length); } } catch (Exception ex) { // shouldn't be possible to get an error encoding from UTF-16 to UTF-8. throw new Exception("Internal error", ex); } }
/// <summary> /// Put an object value in type_id/value format. /// </summary> /// <param name="outStream"></param> /// <param name="value"></param> public static void putObject(Stream outStream, Object value) { using (BinWriter w = new BinWriter(outStream)) { if (value is String) { w.Write(TYPE_STRING); putString(outStream, (String)value); } else if (value is int) { w.Write(TYPE_INT32); w.Write((int)value); } else if (value is long) { w.Write(TYPE_INT64); w.Write((long)value); } else if (value is double) { w.Write(TYPE_REAL64); w.Write((double)value); } else if (value is byte[]) { w.Write(TYPE_OPAQUE); putBytes(outStream, (byte[])value); } else if (value == null) { throw new ArgumentException("Value cannot be null"); } else { throw new ArgumentException ("Don't know how to encode " + value.GetType().Name); } } }
/// <summary> /// Write a name/value set. /// </summary> /// <param name="?"></param> public static void putNameValues(Stream outStream, Dictionary<String, Object> nameValues) { using (BinWriter w = new BinWriter(outStream)) { w.Write(nameValues.Count); foreach (var entry in nameValues) { putString(outStream, entry.Key); putObject(outStream, entry.Value); } } }
/// <summary> /// Write a length-delimted array of longs. /// </summary> /// <param name="outStream"></param> /// <param name="longs"></param> public static void putLongArray(Stream outStream, long[] longs) { using (BinWriter w = new BinWriter(outStream)) { w.Write(longs.Length); foreach (long l in longs) w.Write(l); } }
/// <summary> /// Write a length-delimited, 4-byte-aligned byte array. /// </summary> /// <param name="outStream"></param> /// <param name="bytes"></param> public static void putBytes(Stream outStream, byte[] bytes) { using (BinWriter w = new BinWriter(outStream)) { w.Write(bytes.Length); w.Write(bytes); } putPadding(outStream, bytes.Length); }
public static void putBool(Stream outStream, bool value) { using (BinWriter w = new BinWriter(outStream)) { w.Write(value ? 1 : 0); } }