1#region Copyright notice and license
2// Protocol Buffers - Google's data interchange format
3// Copyright 2008 Google Inc.  All rights reserved.
4// https://developers.google.com/protocol-buffers/
5//
6// Redistribution and use in source and binary forms, with or without
7// modification, are permitted provided that the following conditions are
8// met:
9//
10//     * Redistributions of source code must retain the above copyright
11// notice, this list of conditions and the following disclaimer.
12//     * Redistributions in binary form must reproduce the above
13// copyright notice, this list of conditions and the following disclaimer
14// in the documentation and/or other materials provided with the
15// distribution.
16//     * Neither the name of Google Inc. nor the names of its
17// contributors may be used to endorse or promote products derived from
18// this software without specific prior written permission.
19//
20// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31#endregion
32
33using System;
34using System.IO;
35
36namespace Google.Protobuf
37{
38    /// <summary>
39    /// Thrown when a protocol message being parsed is invalid in some way,
40    /// e.g. it contains a malformed varint or a negative byte length.
41    /// </summary>
42    public sealed class InvalidProtocolBufferException : IOException
43    {
44        internal InvalidProtocolBufferException(string message)
45            : base(message)
46        {
47        }
48
49        internal InvalidProtocolBufferException(string message, Exception innerException)
50            : base(message, innerException)
51        {
52        }
53
54        internal static InvalidProtocolBufferException MoreDataAvailable()
55        {
56            return new InvalidProtocolBufferException(
57                "Completed reading a message while more data was available in the stream.");
58        }
59
60        internal static InvalidProtocolBufferException TruncatedMessage()
61        {
62            return new InvalidProtocolBufferException(
63                "While parsing a protocol message, the input ended unexpectedly " +
64                "in the middle of a field.  This could mean either than the " +
65                "input has been truncated or that an embedded message " +
66                "misreported its own length.");
67        }
68
69        internal static InvalidProtocolBufferException NegativeSize()
70        {
71            return new InvalidProtocolBufferException(
72                "CodedInputStream encountered an embedded string or message " +
73                "which claimed to have negative size.");
74        }
75
76        internal static InvalidProtocolBufferException MalformedVarint()
77        {
78            return new InvalidProtocolBufferException(
79                "CodedInputStream encountered a malformed varint.");
80        }
81
82        /// <summary>
83        /// Creates an exception for an error condition of an invalid tag being encountered.
84        /// </summary>
85        internal static InvalidProtocolBufferException InvalidTag()
86        {
87            return new InvalidProtocolBufferException(
88                "Protocol message contained an invalid tag (zero).");
89        }
90
91        internal static InvalidProtocolBufferException InvalidBase64(Exception innerException)
92        {
93            return new InvalidProtocolBufferException("Invalid base64 data", innerException);
94        }
95
96        internal static InvalidProtocolBufferException InvalidEndTag()
97        {
98            return new InvalidProtocolBufferException(
99                "Protocol message end-group tag did not match expected tag.");
100        }
101
102        internal static InvalidProtocolBufferException RecursionLimitExceeded()
103        {
104            return new InvalidProtocolBufferException(
105                "Protocol message had too many levels of nesting.  May be malicious.  " +
106                "Use CodedInputStream.SetRecursionLimit() to increase the depth limit.");
107        }
108
109        internal static InvalidProtocolBufferException JsonRecursionLimitExceeded()
110        {
111            return new InvalidProtocolBufferException(
112                "Protocol message had too many levels of nesting.  May be malicious.  " +
113                "Use JsonParser.Settings to increase the depth limit.");
114        }
115
116        internal static InvalidProtocolBufferException SizeLimitExceeded()
117        {
118            return new InvalidProtocolBufferException(
119                "Protocol message was too large.  May be malicious.  " +
120                "Use CodedInputStream.SetSizeLimit() to increase the size limit.");
121        }
122
123        internal static InvalidProtocolBufferException InvalidMessageStreamTag()
124        {
125            return new InvalidProtocolBufferException(
126                "Stream of protocol messages had invalid tag. Expected tag is length-delimited field 1.");
127        }
128    }
129}