| // Copyright 2019 The ChromiumOS Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef LIBIPP_IPP_PARSER_H_ |
| #define LIBIPP_IPP_PARSER_H_ |
| |
| #include <cstdint> |
| #include <list> |
| #include <memory> |
| #include <string> |
| #include <string_view> |
| #include <utility> |
| #include <vector> |
| |
| #include "errors.h" |
| #include "ipp_attribute.h" |
| #include "ipp_frame.h" |
| #include "parser.h" |
| |
| namespace ipp { |
| |
| // forward declarations |
| class Collection; |
| class Frame; |
| struct RawAttribute; |
| struct RawCollection; |
| |
| class Parser { |
| public: |
| // Constructor, both parameters must not be nullptr. |frame| is used as |
| // internal buffer to store intermediate form of parsed data. All spotted |
| // issues are logged to |log|. |
| Parser(FrameData* frame, ParserLog& log) : frame_(frame), log_(&log) {} |
| |
| // Parses data from given buffer and saves it to internal buffer. |
| bool ReadFrameFromBuffer(const uint8_t* ptr, const uint8_t* const buf_end); |
| |
| // Interpret the content from internal buffer and store it in |package|. |
| bool SaveFrameToPackage(Frame* package); |
| |
| // Resets the state of the object to initial state. It does not modify |
| // objects provided in the constructor (|frame| and |log|). |
| void ResetContent(); |
| |
| private: |
| // Copy/move/assign constructors/operators are forbidden. |
| Parser(const Parser&) = delete; |
| Parser(Parser&&) = delete; |
| Parser& operator=(const Parser&) = delete; |
| Parser& operator=(Parser&&) = delete; |
| |
| // Methods for adding entries to the log. |
| void LogParserError(ParserCode error_code, const uint8_t* position = nullptr); |
| void LogParserErrors(const std::vector<ParserCode>& errors); |
| |
| // Reads single tag_name_value from the buffer (ptr is updated) and append it |
| // to the parameter. Returns false <=> error occurred. |
| bool ReadTNVsFromBuffer(const uint8_t** ptr, |
| const uint8_t* const end_buf, |
| std::list<TagNameValue>*); |
| |
| // Parser helpers. |
| bool ParseRawValue(int coll_level, |
| const TagNameValue& tnv, |
| std::list<TagNameValue>* data_chunks, |
| RawAttribute* attr); |
| bool ParseRawCollection(int coll_level, |
| std::list<TagNameValue>* data_chunks, |
| RawCollection* coll); |
| bool ParseRawGroup(std::list<TagNameValue>* data_chunks, RawCollection* coll); |
| void DecodeCollection(RawCollection* raw, Collection* coll); |
| |
| // Internal buffer. |
| FrameData* frame_; |
| |
| // Internal log: all errors & warnings are logged here. |
| ParserLog* log_; |
| |
| // Temporary copies of begin/end pointers of the current buffer. |
| const uint8_t* buffer_begin_ = nullptr; |
| const uint8_t* buffer_end_ = nullptr; |
| |
| // This is a path to group/collection/attribute being processed currently by |
| // the parser. |
| AttrPath parser_context_ = AttrPath(AttrPath::kHeader); |
| }; |
| |
| } // namespace ipp |
| |
| #endif // LIBIPP_IPP_PARSER_H_ |