| // Copyright 2019 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef LIBIPP_IPP_BASE_H_ |
| #define LIBIPP_IPP_BASE_H_ |
| |
| #include <cstddef> |
| #include <cstdint> |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "ipp_enums.h" |
| #include "ipp_export.h" |
| #include "ipp_package.h" |
| |
| // This is part of libipp. See ipp.h for general information about this |
| // library. |
| |
| namespace ipp { |
| |
| // represents operation id |
| typedef E_operations_supported Operation; |
| |
| // represents status-code [rfc8010] |
| typedef E_status_code Status; |
| |
| // represents the version of IPP protocol |
| // The first byte (MSB) of this value correspond to major version number, the |
| // second one to minor version number. |
| typedef E_ipp_versions_supported Version; |
| |
| // This class represents IPP request. |
| class IPP_EXPORT Request : public Package { |
| public: |
| // It creates new Request object using class from predefined schema in |
| // ipp_operations.h. It returns nullptr if schema for given operation is |
| // not known. |
| static std::unique_ptr<Request> NewRequest(Operation); |
| |
| // Constructor. |
| explicit Request(Operation operation_id) : operation_id_(operation_id) {} |
| |
| // Returns operation id set in the constructor. |
| Operation GetOperationId() const { return operation_id_; } |
| |
| private: |
| const Operation operation_id_; |
| }; |
| |
| // This class represents IPP response. |
| class IPP_EXPORT Response : public Package { |
| public: |
| // It creates new Response object using class from predefined schema in |
| // ipp_operations.h. It returns nullptr if schema for given operation is |
| // not known. |
| static std::unique_ptr<Response> NewResponse(Operation); |
| |
| // Constructor. |
| explicit Response(Operation operation_id) : operation_id_(operation_id) {} |
| |
| // Returns operation id set in the constructor. |
| Operation GetOperationId() const { return operation_id_; } |
| |
| // Returns reference to status code of the response. |
| Status& StatusCode() { return status_code_; } |
| Status StatusCode() const { return status_code_; } |
| |
| private: |
| const Operation operation_id_; |
| Status status_code_ = Status::successful_ok; |
| }; |
| |
| // Single entry in error logs used by Client and Server classes defined below. |
| struct Log { |
| // Description of the error, it is always non-empty string. |
| std::string message; |
| // Position in the input buffer, set to 0 if unknown. |
| std::size_t buf_offset = 0; |
| // String with hex representation of part of the frame corresponding to |
| // position given in buf_offset. Empty string if buf_offset == 0. |
| std::string frame_context; |
| // Attribute/Group names where the error occurred. Empty string if |
| // unknown. |
| std::string parser_context; |
| }; |
| |
| // Forward declaration of internal structure. |
| struct Protocol; |
| |
| // This is a main class to build/parse frames from the client side. |
| class IPP_EXPORT Client { |
| public: |
| // Constructor. Parameter version and request_id are initial values for |
| // variables used in frame header, they are both stored in the Client object. |
| // The value of request_id is incremented each time the method |
| // BuildRequestFrom() is called. When (request_id == 0), the first |
| // constructed request will have (request_id == 1). |
| explicit Client(Version version = Version::_1_1, int32_t request_id = 0); |
| // Destructor |
| ~Client(); |
| |
| // Get/Set current version number of the IPP protocol. |
| Version GetVersionNumber() const; |
| void SetVersionNumber(Version); |
| |
| // Clears internal buffer and error log and increments request_id by 1. |
| // Then fills internal buffer with the content defined in given |
| // Request object. The given object may be modified by the method, |
| // the following attributes are set automatically if their state is |
| // AttrState::unset: attributes-charset, attributes-natural-language. |
| void BuildRequestFrom(Request* request); |
| |
| // Returns the length of the frame constructed with BuildRequestFrom() |
| // method or read with ReadResponseFrameFrom() method. |
| std::size_t GetFrameLength() const; |
| |
| // Writes the frame from internal buffer to |buf|. The given vector is |
| // resized to frame's size that equals the value returned by |
| // GetFrameLength(). |
| // Fails when some values provided in BuildRequestFrom() are incorrect. |
| // In that case, the given buffer may be partially written. The reason of |
| // the failure is saved to the error log (see GetErrorLog() method). |
| bool WriteRequestFrameTo(std::vector<uint8_t>* buf) const; |
| |
| // Clears internal buffer and error log. |
| // Then fills internal buffer with the content extracted from a given |
| // frame with response. |
| // Returns true <=> whole frame was parsed. Even if the method returns |
| // true, there still may be some errors and/or warnings in the error log |
| // (see GetErrorLog() method). In this case, some attributes/groups may |
| // be missing in the final output. |
| // Returns false <=> the parser has spotted an error it cannot recover from. |
| // In this case the internal buffer will contain incorrect data. The last |
| // entry in the error log contains a reason of the failure. |
| bool ReadResponseFrameFrom(const uint8_t* ptr, const uint8_t* const buf_end); |
| bool ReadResponseFrameFrom(const std::vector<uint8_t>&); |
| |
| // Parses the content of the response loaded with ReadResponseFrameFrom |
| // method and stores it in given the Response object. |
| // When the parameter log_unknown_values is true, this method adds to the |
| // error log info about all unknown attributes and groups extracted from |
| // the frame and not known by given Response object. |
| // Returns true <=> whole frame was parsed. Even if the method returns |
| // true, there still may be some errors and/or warnings in the error log |
| // (see GetErrorLog() method). In this case, some attributes/groups may |
| // be missing in the final output. |
| // Returns false <=> the parser has spotted an error it cannot recover from. |
| // In this case the given Response object will contain incorrect data. The |
| // last entry in the error log contains a reason of the failure. |
| bool ParseResponseAndSaveTo(Response* response, |
| bool log_unknown_values = false); |
| |
| // Returns the error log. |
| const std::vector<Log>& GetErrorLog() const; |
| |
| private: |
| std::unique_ptr<Protocol> protocol_; |
| }; |
| |
| // This is a main class to build/parse frames from the server side. |
| class IPP_EXPORT Server { |
| public: |
| // Constructor. Parameter version and request_id are initial values for |
| // variables used in frame header, they are both stored in the Server object. |
| // These two parameters are updated in ReadRequestFrameFrom method by |
| // replacing them with values contained in a received request. The only |
| // reason to set these values in the constructor is to build a response frame |
| // without prior parsing of any request. |
| explicit Server(Version version = Version::_1_1, int32_t request_id = 1); |
| // Destructor |
| ~Server(); |
| |
| // Clears internal buffer and error log. |
| // Then fills internal buffer with the content extracted from a given |
| // frame with request. The internal fields with version and request_id are |
| // set to values read from the given frame. |
| // Returns true <=> whole frame was parsed. Even if the method returns |
| // true, there still may be some errors and/or warnings in the error log |
| // (see GetErrorLog() method). In this case, some attributes/groups may |
| // be missing in the final output. |
| // Returns false <=> the parser has spotted an error it cannot recover from. |
| // In this case the internal buffer will contain incorrect data. The last |
| // entry in the error log contains a reason of the failure. |
| bool ReadRequestFrameFrom(const uint8_t* ptr, const uint8_t* const buf_end); |
| bool ReadRequestFrameFrom(const std::vector<uint8_t>&); |
| |
| // This method returns operation id after successful run of |
| // ReadRequestFrameFrom(). |
| Operation GetOperationId() const; |
| |
| // Get/Set current version number of the IPP protocol. |
| Version GetVersionNumber() const; |
| void SetVersionNumber(Version); |
| |
| // Parses the content of the request loaded with ReadRequestFrameFrom |
| // method and stores it in given the Request object. |
| // When the parameter log_unknown_values is true, this method adds to the |
| // error log info about all unknown attributes and groups extracted from |
| // the frame and not known by given Request object. |
| // Returns true <=> whole frame was parsed. Even if the method returns |
| // true, there still may be some errors and/or warnings in the error log |
| // (see GetErrorLog() method). In this case, some attributes/groups may |
| // be missing in the final output. |
| // Returns false <=> the parser has spotted an error it cannot recover from. |
| // In this case the given Request object will contain incorrect data. The |
| // last entry in the error log contains a reason of the failure. |
| bool ParseRequestAndSaveTo(Request* request, bool log_unknown_values = false); |
| |
| // Clears internal buffer and error log, fields with the protocol version |
| // and request_id is left untouched. |
| // Then fills internal buffer with the content defined in the given |
| // Response object. The given object may be modified by the method, |
| // the following attributes are set automatically if their state is |
| // AttrState::unset: attributes-charset, attributes-natural-language, |
| // status-message. |
| void BuildResponseFrom(Response* response); |
| |
| // Returns the length of the frame constructed with BuildResponseFrom() |
| // method or read with ReadRequestFrameFrom() method. |
| std::size_t GetFrameLength() const; |
| |
| // Writes the frame from internal buffer to |buf|. The given vector is |
| // resized to frame's size that equals the value returned by |
| // GetFrameLength(). |
| // Fails when some values provided in BuildResponseFrom() are incorrect. |
| // In that case, the given buffer may be partially written. The reason |
| // of the failure is saved to the error log (see GetErrorLog() method). |
| bool WriteResponseFrameTo(std::vector<uint8_t>* buf) const; |
| |
| // Returns the error log. |
| const std::vector<Log>& GetErrorLog() const; |
| |
| private: |
| std::unique_ptr<Protocol> protocol_; |
| }; |
| } // namespace ipp |
| |
| #endif // LIBIPP_IPP_BASE_H_ |