1*103e46e4SHarish Mahendrakar // Copyright (c) 2016 The WebM project authors. All Rights Reserved. 2*103e46e4SHarish Mahendrakar // 3*103e46e4SHarish Mahendrakar // Use of this source code is governed by a BSD-style license 4*103e46e4SHarish Mahendrakar // that can be found in the LICENSE file in the root of the source 5*103e46e4SHarish Mahendrakar // tree. An additional intellectual property rights grant can be found 6*103e46e4SHarish Mahendrakar // in the file PATENTS. All contributing project authors may 7*103e46e4SHarish Mahendrakar // be found in the AUTHORS file in the root of the source tree. 8*103e46e4SHarish Mahendrakar #ifndef INCLUDE_WEBM_STATUS_H_ 9*103e46e4SHarish Mahendrakar #define INCLUDE_WEBM_STATUS_H_ 10*103e46e4SHarish Mahendrakar 11*103e46e4SHarish Mahendrakar #include <cstdint> 12*103e46e4SHarish Mahendrakar 13*103e46e4SHarish Mahendrakar /** 14*103e46e4SHarish Mahendrakar \file 15*103e46e4SHarish Mahendrakar Status information that represents success, failure, etc. for operations 16*103e46e4SHarish Mahendrakar throughout the API. 17*103e46e4SHarish Mahendrakar */ 18*103e46e4SHarish Mahendrakar 19*103e46e4SHarish Mahendrakar namespace webm { 20*103e46e4SHarish Mahendrakar 21*103e46e4SHarish Mahendrakar /** 22*103e46e4SHarish Mahendrakar \addtogroup PUBLIC_API 23*103e46e4SHarish Mahendrakar @{ 24*103e46e4SHarish Mahendrakar */ 25*103e46e4SHarish Mahendrakar 26*103e46e4SHarish Mahendrakar /** 27*103e46e4SHarish Mahendrakar An object used to represent the resulting status of various operations, 28*103e46e4SHarish Mahendrakar indicating success, failure, or some other result. 29*103e46e4SHarish Mahendrakar */ 30*103e46e4SHarish Mahendrakar struct Status { 31*103e46e4SHarish Mahendrakar /** 32*103e46e4SHarish Mahendrakar A list of generic status codes used by the parser. Users are encouraged to 33*103e46e4SHarish Mahendrakar reuse these values as needed in the derivations of `Callback`. These values 34*103e46e4SHarish Mahendrakar will always be <= 0. 35*103e46e4SHarish Mahendrakar */ 36*103e46e4SHarish Mahendrakar enum Code : std::int32_t { 37*103e46e4SHarish Mahendrakar // General status codes. Range: 0 to -1024. 38*103e46e4SHarish Mahendrakar /** 39*103e46e4SHarish Mahendrakar The operation successfully completed. 40*103e46e4SHarish Mahendrakar */ 41*103e46e4SHarish Mahendrakar kOkCompleted = 0, 42*103e46e4SHarish Mahendrakar 43*103e46e4SHarish Mahendrakar /** 44*103e46e4SHarish Mahendrakar The operation was successful but only partially completed (for example, a 45*103e46e4SHarish Mahendrakar read that resulted in fewer bytes than requested). 46*103e46e4SHarish Mahendrakar */ 47*103e46e4SHarish Mahendrakar kOkPartial = -1, 48*103e46e4SHarish Mahendrakar 49*103e46e4SHarish Mahendrakar /** 50*103e46e4SHarish Mahendrakar The operation would block, and should be tried again later. 51*103e46e4SHarish Mahendrakar */ 52*103e46e4SHarish Mahendrakar kWouldBlock = -2, 53*103e46e4SHarish Mahendrakar 54*103e46e4SHarish Mahendrakar /** 55*103e46e4SHarish Mahendrakar More data was requested but the file has ended. 56*103e46e4SHarish Mahendrakar */ 57*103e46e4SHarish Mahendrakar kEndOfFile = -3, 58*103e46e4SHarish Mahendrakar 59*103e46e4SHarish Mahendrakar /** 60*103e46e4SHarish Mahendrakar The reader was unable to seek to the requested location. 61*103e46e4SHarish Mahendrakar */ 62*103e46e4SHarish Mahendrakar kSeekFailed = -4, 63*103e46e4SHarish Mahendrakar 64*103e46e4SHarish Mahendrakar // Parsing errors. Range: -1025 to -2048. 65*103e46e4SHarish Mahendrakar /** 66*103e46e4SHarish Mahendrakar An element's ID is malformed. 67*103e46e4SHarish Mahendrakar */ 68*103e46e4SHarish Mahendrakar kInvalidElementId = -1025, 69*103e46e4SHarish Mahendrakar 70*103e46e4SHarish Mahendrakar /** 71*103e46e4SHarish Mahendrakar An element's size is malformed. 72*103e46e4SHarish Mahendrakar */ 73*103e46e4SHarish Mahendrakar kInvalidElementSize = -1026, 74*103e46e4SHarish Mahendrakar 75*103e46e4SHarish Mahendrakar /** 76*103e46e4SHarish Mahendrakar An unknown element has unknown size. 77*103e46e4SHarish Mahendrakar */ 78*103e46e4SHarish Mahendrakar kIndefiniteUnknownElement = -1027, 79*103e46e4SHarish Mahendrakar 80*103e46e4SHarish Mahendrakar /** 81*103e46e4SHarish Mahendrakar A child element overflowed the parent element's bounds. 82*103e46e4SHarish Mahendrakar */ 83*103e46e4SHarish Mahendrakar kElementOverflow = -1028, 84*103e46e4SHarish Mahendrakar 85*103e46e4SHarish Mahendrakar /** 86*103e46e4SHarish Mahendrakar An element's size exceeds the system's memory limits. 87*103e46e4SHarish Mahendrakar */ 88*103e46e4SHarish Mahendrakar kNotEnoughMemory = -1029, 89*103e46e4SHarish Mahendrakar 90*103e46e4SHarish Mahendrakar /** 91*103e46e4SHarish Mahendrakar An element's value is illegal/malformed. 92*103e46e4SHarish Mahendrakar */ 93*103e46e4SHarish Mahendrakar kInvalidElementValue = -1030, 94*103e46e4SHarish Mahendrakar 95*103e46e4SHarish Mahendrakar /** 96*103e46e4SHarish Mahendrakar A recursive element was so deeply nested that exceeded the parser's limit. 97*103e46e4SHarish Mahendrakar */ 98*103e46e4SHarish Mahendrakar kExceededRecursionDepthLimit = -1031, 99*103e46e4SHarish Mahendrakar 100*103e46e4SHarish Mahendrakar // The following codes are internal-only and should not be used by users. 101*103e46e4SHarish Mahendrakar // Additionally, these codes should never be returned to the user; doing so 102*103e46e4SHarish Mahendrakar // is considered a bug. 103*103e46e4SHarish Mahendrakar /** 104*103e46e4SHarish Mahendrakar \internal Parsing should switch from reading to skipping elements. 105*103e46e4SHarish Mahendrakar */ 106*103e46e4SHarish Mahendrakar kSwitchToSkip = INT32_MIN, 107*103e46e4SHarish Mahendrakar }; 108*103e46e4SHarish Mahendrakar 109*103e46e4SHarish Mahendrakar /** 110*103e46e4SHarish Mahendrakar Status codes <= 0 are reserved by the parsing library. User error codes 111*103e46e4SHarish Mahendrakar should be positive (> 0). Users are encouraged to use codes from the `Code` 112*103e46e4SHarish Mahendrakar enum, but may use a positive error code if some application-specific error is 113*103e46e4SHarish Mahendrakar encountered. 114*103e46e4SHarish Mahendrakar */ 115*103e46e4SHarish Mahendrakar std::int32_t code; 116*103e46e4SHarish Mahendrakar 117*103e46e4SHarish Mahendrakar Status() = default; 118*103e46e4SHarish Mahendrakar Status(const Status&) = default; 119*103e46e4SHarish Mahendrakar Status(Status&&) = default; 120*103e46e4SHarish Mahendrakar Status& operator=(const Status&) = default; 121*103e46e4SHarish Mahendrakar Status& operator=(Status&&) = default; 122*103e46e4SHarish Mahendrakar 123*103e46e4SHarish Mahendrakar /** 124*103e46e4SHarish Mahendrakar Creates a new `Status` object with the given status code. 125*103e46e4SHarish Mahendrakar 126*103e46e4SHarish Mahendrakar \param code The status code which will be used to set the `code` member. 127*103e46e4SHarish Mahendrakar */ StatusStatus128*103e46e4SHarish Mahendrakar constexpr explicit Status(Code code) : code(code) {} 129*103e46e4SHarish Mahendrakar 130*103e46e4SHarish Mahendrakar /** 131*103e46e4SHarish Mahendrakar Creates a new `Status` object with the given status code. 132*103e46e4SHarish Mahendrakar 133*103e46e4SHarish Mahendrakar \param code The status code which will be used to set the `code` member. 134*103e46e4SHarish Mahendrakar */ StatusStatus135*103e46e4SHarish Mahendrakar constexpr explicit Status(std::int32_t code) : code(code) {} 136*103e46e4SHarish Mahendrakar 137*103e46e4SHarish Mahendrakar /** 138*103e46e4SHarish Mahendrakar Returns true if the status code is either `kOkCompleted` or `kOkPartial`. 139*103e46e4SHarish Mahendrakar Provided for convenience. 140*103e46e4SHarish Mahendrakar */ okStatus141*103e46e4SHarish Mahendrakar constexpr bool ok() const { 142*103e46e4SHarish Mahendrakar return code == kOkCompleted || code == kOkPartial; 143*103e46e4SHarish Mahendrakar } 144*103e46e4SHarish Mahendrakar 145*103e46e4SHarish Mahendrakar /** 146*103e46e4SHarish Mahendrakar Returns true if the status code is `kOkCompleted`. Provided for convenience. 147*103e46e4SHarish Mahendrakar */ completed_okStatus148*103e46e4SHarish Mahendrakar constexpr bool completed_ok() const { return code == kOkCompleted; } 149*103e46e4SHarish Mahendrakar 150*103e46e4SHarish Mahendrakar /** 151*103e46e4SHarish Mahendrakar Returns true if the status is considered a parsing error. Parsing errors 152*103e46e4SHarish Mahendrakar represent unrecoverable errors due to malformed data. Only status codes in 153*103e46e4SHarish Mahendrakar the range -2048 to -1025 (inclusive) are considered parsing errors. 154*103e46e4SHarish Mahendrakar */ is_parsing_errorStatus155*103e46e4SHarish Mahendrakar constexpr bool is_parsing_error() const { 156*103e46e4SHarish Mahendrakar return -2048 <= code && code <= -1025; 157*103e46e4SHarish Mahendrakar } 158*103e46e4SHarish Mahendrakar }; 159*103e46e4SHarish Mahendrakar 160*103e46e4SHarish Mahendrakar /** 161*103e46e4SHarish Mahendrakar @} 162*103e46e4SHarish Mahendrakar */ 163*103e46e4SHarish Mahendrakar 164*103e46e4SHarish Mahendrakar } // namespace webm 165*103e46e4SHarish Mahendrakar 166*103e46e4SHarish Mahendrakar #endif // INCLUDE_WEBM_STATUS_H_ 167