| // Copyright 2023 The ChromiumOS Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "parser.h" | |
| #include <string> | |
| #include <string_view> | |
| #include <vector> | |
| #include "errors.h" | |
| #include "frame.h" | |
| #include "ipp_frame.h" | |
| #include "ipp_parser.h" | |
| namespace ipp { | |
| std::string_view ToStrView(ParserCode code) { | |
| switch (code) { | |
| case ParserCode::kBooleanValueOutOfRange: | |
| return "BooleanValueOutOfRange"; | |
| case ParserCode::kValueMismatchTagConverted: | |
| return "ValueMismatchTagConverted"; | |
| case ParserCode::kOutOfBandValueWithNonEmptyData: | |
| return "OutOfBandValueWithNonEmptyData"; | |
| case ParserCode::kOutOfBandAttributeWithManyValues: | |
| return "OutOfBandAttributeWithManyValues"; | |
| case ParserCode::kValueMismatchTagOmitted: | |
| return "ValueMismatchTagOmitted"; | |
| case ParserCode::kUnsupportedValueTag: | |
| return "UnsupportedValueTag"; | |
| case ParserCode::kValueInvalidSize: | |
| return "ValueInvalidSize"; | |
| case ParserCode::kAttributeNoValues: | |
| return "AttributeNoValues"; | |
| case ParserCode::kAttributeNameConflict: | |
| return "AttributeNameConflict"; | |
| case ParserCode::kErrorWhenAddingAttribute: | |
| return "ErrorWhenAddingAttribute"; | |
| case ParserCode::kErrorWhenAddingGroup: | |
| return "ErrorWhenAddingGroup"; | |
| case ParserCode::kAttributeNameIsEmpty: | |
| return "AttributeNameIsEmpty"; | |
| case ParserCode::kUnexpectedEndOfFrame: | |
| return "UnexpectedEndOfFrame"; | |
| case ParserCode::kGroupTagWasExpected: | |
| return "GroupTagWasExpected"; | |
| case ParserCode::kEmptyNameExpectedInTNV: | |
| return "EmptyNameExpectedInTNV"; | |
| case ParserCode::kEmptyValueExpectedInTNV: | |
| return "EmptyValueExpectedInTNV"; | |
| case ParserCode::kNegativeNameLengthInTNV: | |
| return "NegativeNameLengthInTNV"; | |
| case ParserCode::kNegativeValueLengthInTNV: | |
| return "NegativeValueLengthInTNV"; | |
| case ParserCode::kTNVWithUnexpectedValueTag: | |
| return "TNVWithUnexpectedValueTag"; | |
| case ParserCode::kUnexpectedEndOfGroup: | |
| return "UnexpectedEndOfGroup"; | |
| case ParserCode::kLimitOnCollectionsLevelExceeded: | |
| return "LimitOnCollectionsLevelExceeded"; | |
| case ParserCode::kLimitOnGroupsCountExceeded: | |
| return "LimitOnGroupsCountExceeded"; | |
| } | |
| return "UnknownParserCode"; | |
| } | |
| std::string ToString(const ParserError& error) { | |
| std::string msg = error.path.AsString(); | |
| msg += "; "; | |
| msg += ToStrView(error.code); | |
| return msg; | |
| } | |
| void SimpleParserLog::AddParserError(const ParserError& error) { | |
| const bool critical = IsCritical(error.code); | |
| if (errors_.size() < max_entries_count_) { | |
| errors_.emplace_back(error); | |
| } | |
| if (critical) { | |
| critical_errors_.emplace_back(error); | |
| } | |
| } | |
| Frame Parse(const uint8_t* buffer, size_t size, ParserLog& log) { | |
| Frame frame; | |
| if (buffer == nullptr) { | |
| size = 0; | |
| } | |
| FrameData frame_data; | |
| Parser parser(&frame_data, log); | |
| parser.ReadFrameFromBuffer(buffer, buffer + size); | |
| parser.SaveFrameToPackage(&frame); | |
| frame.VersionNumber() = static_cast<Version>(frame_data.version_); | |
| frame.OperationIdOrStatusCode() = frame_data.operation_id_or_status_code_; | |
| frame.RequestId() = frame_data.request_id_; | |
| return frame; | |
| } | |
| } // namespace ipp |