|
@@ -18,6 +18,7 @@ namespace Google.ProtocolBuffers {
|
|
|
|
|
|
private readonly StreamProvider streamProvider;
|
|
|
private readonly ExtensionRegistry extensionRegistry;
|
|
|
+ private readonly int sizeLimit;
|
|
|
|
|
|
/// <summary>
|
|
|
/// Delegate created via reflection trickery (once per type) to create a builder
|
|
@@ -103,17 +104,22 @@ namespace Google.ProtocolBuffers {
|
|
|
TBuilder builder = builderBuilder();
|
|
|
input.ReadMessage(builder, registry);
|
|
|
return builder.Build();
|
|
|
- }
|
|
|
+ }
|
|
|
#pragma warning restore 0414
|
|
|
|
|
|
private static readonly uint ExpectedTag = WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited);
|
|
|
|
|
|
- private MessageStreamIterator(StreamProvider streamProvider, ExtensionRegistry extensionRegistry) {
|
|
|
+ private MessageStreamIterator(StreamProvider streamProvider, ExtensionRegistry extensionRegistry, int sizeLimit) {
|
|
|
if (messageReader == null) {
|
|
|
throw typeInitializationException;
|
|
|
}
|
|
|
this.streamProvider = streamProvider;
|
|
|
this.extensionRegistry = extensionRegistry;
|
|
|
+ this.sizeLimit = sizeLimit;
|
|
|
+ }
|
|
|
+
|
|
|
+ private MessageStreamIterator(StreamProvider streamProvider, ExtensionRegistry extensionRegistry)
|
|
|
+ : this (streamProvider, extensionRegistry, CodedInputStream.DefaultSizeLimit) {
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -121,7 +127,16 @@ namespace Google.ProtocolBuffers {
|
|
|
/// but the specified extension registry.
|
|
|
/// </summary>
|
|
|
public MessageStreamIterator<TMessage> WithExtensionRegistry(ExtensionRegistry newRegistry) {
|
|
|
- return new MessageStreamIterator<TMessage>(streamProvider, newRegistry);
|
|
|
+ return new MessageStreamIterator<TMessage>(streamProvider, newRegistry, sizeLimit);
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Creates a new instance which uses the same stream provider and extension registry as this one,
|
|
|
+ /// but with the specified size limit. Note that this must be big enough for the largest message
|
|
|
+ /// and the tag and size preceding it.
|
|
|
+ /// </summary>
|
|
|
+ public MessageStreamIterator<TMessage> WithSizeLimit(int newSizeLimit) {
|
|
|
+ return new MessageStreamIterator<TMessage>(streamProvider, extensionRegistry, newSizeLimit);
|
|
|
}
|
|
|
|
|
|
public static MessageStreamIterator<TMessage> FromFile(string file) {
|
|
@@ -135,12 +150,14 @@ namespace Google.ProtocolBuffers {
|
|
|
public IEnumerator<TMessage> GetEnumerator() {
|
|
|
using (Stream stream = streamProvider()) {
|
|
|
CodedInputStream input = CodedInputStream.CreateInstance(stream);
|
|
|
+ input.SetSizeLimit(sizeLimit);
|
|
|
uint tag;
|
|
|
while ((tag = input.ReadTag()) != 0) {
|
|
|
if (tag != ExpectedTag) {
|
|
|
throw InvalidProtocolBufferException.InvalidMessageStreamTag();
|
|
|
}
|
|
|
yield return messageReader(input, extensionRegistry);
|
|
|
+ input.ResetSizeCounter();
|
|
|
}
|
|
|
}
|
|
|
}
|