| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
- file Copyright.txt or https://cmake.org/licensing for details. */
- #pragma once
- #include "cmConfigure.h" // IWYU pragma: keep
- #include <cstddef>
- #include <string>
- #include <vector>
- #include <cm/optional>
- /** \class cmProcessOutput
- * \brief Decode text data to internal encoding.
- *
- * cmProcessOutput is used to decode text output from external process
- * using external encoding to our internal encoding.
- */
- class cmProcessOutput
- {
- public:
- enum Encoding
- {
- None,
- Auto,
- UTF8,
- ANSI,
- OEM
- };
- /**
- * Find encoding enum value for given encoding \a name.
- * \param name a encoding name.
- * \return encoding enum value or Auto if \a name was not found.
- */
- static cm::optional<Encoding> FindEncoding(std::string const& name);
- /// The code page that is used as internal encoding to which we will encode.
- static unsigned int defaultCodepage;
- /**
- * A class constructor.
- * \param encoding external process encoding from which we will decode.
- * \param maxSize a maximal size for process output buffer. It should match
- * to KWSYSPE_PIPE_BUFFER_SIZE. If text we decode is same size as \a maxSize
- * then we will check for incomplete character at end of buffer and
- * we will not return last incomplete character. This character will be
- * returned with next DecodeText() call. To disable this behavior specify
- * 0 as \a maxSize.
- */
- cmProcessOutput(Encoding encoding = Auto, unsigned int maxSize = 1024);
- ~cmProcessOutput() = default;
- /**
- * Decode \a raw string using external encoding to internal
- * encoding in \a decoded.
- * \a id specifies which internal buffer to use. This is important when we
- * are decoding both stdout and stderr from process output and we need to
- * keep incomplete characters in separate buffers for each stream.
- * \return true if successfully decoded \a raw to \a decoded or false if not.
- */
- bool DecodeText(std::string raw, std::string& decoded, size_t id = 0);
- /**
- * Decode \a data with \a length from external encoding to internal
- * encoding in \a decoded.
- * \param data a pointer to process output text data.
- * \param length a size of data buffer.
- * \param decoded a string which will contain decoded text.
- * \param id an internal buffer id to use.
- * \return true if successfully decoded \a data to \a decoded or false if
- * not.
- */
- bool DecodeText(const char* data, size_t length, std::string& decoded,
- size_t id = 0);
- /**
- * \overload
- */
- bool DecodeText(std::vector<char> raw, std::vector<char>& decoded,
- size_t id = 0);
- private:
- #if defined(_WIN32)
- unsigned int codepage;
- unsigned int bufferSize;
- std::vector<std::string> rawparts;
- bool DoDecodeText(std::string raw, std::string& decoded, wchar_t* lastChar);
- #endif
- };
|