blob: 52abd3876fec0c1b45ae80a5fc8f193b366c004b [file] [log] [blame]
// Copyright (c) 2016 The WebM project authors. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the LICENSE file in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS. All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.
#ifndef INCLUDE_WEBM_STATUS_H_
#define INCLUDE_WEBM_STATUS_H_
#include <cstdint>
/**
\file
Status information that represents success, failure, etc. for operations
throughout the API.
*/
namespace webm {
/**
\addtogroup PUBLIC_API
@{
*/
/**
An object used to represent the resulting status of various operations,
indicating success, failure, or some other result.
*/
struct Status {
/**
A list of generic status codes used by the parser. Users are encouraged to
reuse these values as needed in the derivations of `Callback`. These values
will always be <= 0.
*/
enum Code : std::int32_t {
// General status codes. Range: 0 to -1024.
/**
The operation successfully completed.
*/
kOkCompleted = 0,
/**
The operation was successful but only partially completed (for example, a
read that resulted in fewer bytes than requested).
*/
kOkPartial = -1,
/**
The operation would block, and should be tried again later.
*/
kWouldBlock = -2,
/**
More data was requested but the file has ended.
*/
kEndOfFile = -3,
// Parsing errors. Range: -1025 to -2048.
/**
An element's ID is malformed.
*/
kInvalidElementId = -1025,
/**
An element's size is malformed.
*/
kInvalidElementSize = -1026,
/**
An unknown element has unknown size.
*/
kIndefiniteUnknownElement = -1027,
/**
A child element overflowed the parent element's bounds.
*/
kElementOverflow = -1028,
/**
An element's size exceeds the system's memory limits.
*/
kNotEnoughMemory = -1029,
/**
An element's value is illegal/malformed.
*/
kInvalidElementValue = -1030,
/**
A recursive element was so deeply nested that exceeded the parser's limit.
*/
kExceededRecursionDepthLimit = -1031,
// The following codes are internal-only and should not be used by users.
// Additionally, these codes should never be returned to the user; doing so
// is considered a bug.
// Parsing should switch from reading to skipping elements (internal-only
// use; .
kSwitchToSkip = -2147483648,
};
/**
Status codes <= 0 are reserved by the parsing library. User error codes
should be positive (> 0). Users are encouraged to use codes from the `Code`
enum, but may use a positive error code if some application-specific error is
encountered.
*/
std::int32_t code;
Status() = default;
Status(const Status&) = default;
Status(Status&&) = default;
Status& operator=(const Status&) = default;
Status& operator=(Status&&) = default;
/**
Creates a new `Status` object with the given status code.
\param code The status code which will be used to set the `code` member.
*/
constexpr explicit Status(Code code) : code(code) {}
/**
Creates a new `Status` object with the given status code.
\param code The status code which will be used to set the `code` member.
*/
constexpr explicit Status(std::int32_t code) : code(code) {}
/**
Returns true if the status code is either `kOkCompleted` or `kOkPartial`.
Provided for convenience.
*/
constexpr bool ok() const {
return code == kOkCompleted || code == kOkPartial;
}
/**
Returns true if the status code is `kOkCompleted`. Provided for convenience.
*/
constexpr bool completed_ok() const { return code == kOkCompleted; }
/**
Returns true if the status is considered a parsing error. Parsing errors
represent unrecoverable errors due to malformed data. Only status codes in
the range -2048 to -1025 (inclusive) are considered parsing errors.
*/
constexpr bool is_parsing_error() const {
return -2048 <= code && code <= -1025;
}
};
/**
@}
*/
} // namespace webm
#endif // INCLUDE_WEBM_STATUS_H_