/// <summary> /// Decode a value of the given type. /// Should not be called directly. This interface is used by service client stubs. /// </summary> public static object Decode(ByteString value, Type type, Connection client) { var stream = new CodedInputStream (value.ToByteArray ()); if (type == typeof(double)) return stream.ReadDouble (); else if (type == typeof(float)) return stream.ReadFloat (); else if (type == typeof(int)) return stream.ReadInt32 (); else if (type == typeof(long)) return stream.ReadInt64 (); else if (type == typeof(uint)) return stream.ReadUInt32 (); else if (type == typeof(ulong)) return stream.ReadUInt64 (); else if (type == typeof(bool)) return stream.ReadBool (); else if (type == typeof(string)) return stream.ReadString (); else if (type == typeof(byte[])) return stream.ReadBytes ().ToByteArray (); else if (type.IsEnum) return stream.ReadInt32 (); else if (typeof(RemoteObject).IsAssignableFrom (type)) { if (client == null) throw new ArgumentException ("Client not passed when decoding remote object"); var id = stream.ReadUInt64 (); if (id == 0) return null; return (RemoteObject)Activator.CreateInstance (type, client, id); } else if (typeof(IMessage).IsAssignableFrom (type)) { IMessage message = (IMessage)Activator.CreateInstance (type); message.MergeFrom (stream); return message; } else if (type.IsGenericType && type.GetGenericTypeDefinition () == typeof(IList<>)) return DecodeList (value, type, client); else if (type.IsGenericType && type.GetGenericTypeDefinition () == typeof(IDictionary<,>)) return DecodeDictionary (value, type, client); else if (type.IsGenericType && type.GetGenericTypeDefinition () == typeof(ISet<>)) return DecodeSet (value, type, client); else if (type.IsGenericType && (type.GetGenericTypeDefinition () == typeof(Tuple<>) || type.GetGenericTypeDefinition () == typeof(Tuple<,>) || type.GetGenericTypeDefinition () == typeof(Tuple<,,>) || type.GetGenericTypeDefinition () == typeof(Tuple<,,,>) || type.GetGenericTypeDefinition () == typeof(Tuple<,,,,>) || type.GetGenericTypeDefinition () == typeof(Tuple<,,,,,>))) return DecodeTuple (value, type, client); // TODO: ugly handing of tuple types throw new ArgumentException (type + " is not a serializable type"); }
/// <summary> /// Parse a single field from <paramref name="input"/> and merge it /// into this set. /// </summary> /// <param name="input">The coded input stream containing the field</param> /// <returns>false if the tag is an "end group" tag, true otherwise</returns> private bool MergeFieldFrom(CodedInputStream input) { uint tag = input.LastTag; int number = WireFormat.GetTagFieldNumber(tag); switch (WireFormat.GetTagWireType(tag)) { case WireFormat.WireType.Varint: { ulong uint64 = input.ReadUInt64(); GetOrAddField(number).AddVarint(uint64); return(true); } case WireFormat.WireType.Fixed32: { uint uint32 = input.ReadFixed32(); GetOrAddField(number).AddFixed32(uint32); return(true); } case WireFormat.WireType.Fixed64: { ulong uint64 = input.ReadFixed64(); GetOrAddField(number).AddFixed64(uint64); return(true); } case WireFormat.WireType.LengthDelimited: { ByteString bytes = input.ReadBytes(); GetOrAddField(number).AddLengthDelimited(bytes); return(true); } case WireFormat.WireType.StartGroup: { uint endTag = WireFormat.MakeTag(number, WireFormat.WireType.EndGroup); UnknownFieldSet set = new UnknownFieldSet(); while (input.ReadTag() != endTag) { set.MergeFieldFrom(input); } GetOrAddField(number).AddGroup(set); return(true); } case WireFormat.WireType.EndGroup: { return(false); } default: throw InvalidProtocolBufferException.InvalidWireType(); } }
/// <summary> /// Parse a single field from <paramref name="input"/> and merge it /// into this set. /// </summary> /// <param name="input">The coded input stream containing the field</param> /// <returns>false if the tag is an "end group" tag, true otherwise</returns> private void MergeFieldFrom(CodedInputStream input) { uint tag = input.LastTag; int number = WireFormat.GetTagFieldNumber(tag); switch (WireFormat.GetTagWireType(tag)) { case WireFormat.WireType.Varint: { ulong uint64 = input.ReadUInt64(); GetOrAddField(number).AddVarint(uint64); return; } case WireFormat.WireType.Fixed32: { uint uint32 = input.ReadFixed32(); GetOrAddField(number).AddFixed32(uint32); return; } case WireFormat.WireType.Fixed64: { ulong uint64 = input.ReadFixed64(); GetOrAddField(number).AddFixed64(uint64); return; } case WireFormat.WireType.LengthDelimited: { ByteString bytes = input.ReadBytes(); GetOrAddField(number).AddLengthDelimited(bytes); return; } case WireFormat.WireType.StartGroup: { input.SkipGroup(tag); return; } case WireFormat.WireType.EndGroup: { throw new InvalidProtocolBufferException("Merge an unknown field of end-group tag, indicating that the corresponding start-group was missing."); } default: throw new InvalidOperationException("Wire Type is invalid."); } }
internal ulong <ForUInt64> b__12_0(CodedInputStream input) { return(input.ReadUInt64()); }
/// <summary> /// Convert a Protocol Buffer value type, encoded as a byte string, to a C# value. /// </summary> public static object ReadValue(ByteString value, Type type) { if (value.Length == 0) throw new ArgumentException ("Value is empty"); var stream = new CodedInputStream (value.ToByteArray ()); if (type == typeof(double)) { return stream.ReadDouble (); } else if (type == typeof(float)) { return stream.ReadFloat (); } else if (type == typeof(int)) { return stream.ReadInt32 (); } else if (type == typeof(long)) { return stream.ReadInt64 (); } else if (type == typeof(uint)) { return stream.ReadUInt32 (); } else if (type == typeof(ulong)) { return stream.ReadUInt64 (); } else if (type == typeof(bool)) { return stream.ReadBool (); } else if (type == typeof(string)) { return stream.ReadString (); } else if (type == typeof(byte[])) { return stream.ReadBytes ().ToByteArray(); } throw new ArgumentException (type + " is not a Protocol Buffer value type"); }