#pragma once
#include "Common.h"
#include "System/Object.h"
#include "System/String.h"
#include "System/Array.h"
#include "System/SmartPointer.h"
#include "System/IO/Stream.h"
#include "System/Collections/Generic/Dictionary.h"

namespace DotNetDupe {
    namespace System {
        namespace Net {
            namespace Http {

                class HttpContent : public Object {
                public:
                    DOTNETDUPE_API virtual ~HttpContent() = default;

                    DOTNETDUPE_API virtual String ReadAsString() = 0;
                    DOTNETDUPE_API virtual Array<char> ReadAsByteArray() = 0;
                    DOTNETDUPE_API virtual SmartPointer<IO::Stream> ReadAsStream() = 0;

                    DOTNETDUPE_API virtual void CopyTo(const SmartPointer<IO::Stream>& stream);
                    DOTNETDUPE_API virtual long GetLength() const;

                    DOTNETDUPE_API Collections::Generic::Dictionary<String, String>& GetHeaders() { return m_headers; }
                    DOTNETDUPE_API const Collections::Generic::Dictionary<String, String>& GetHeaders() const { return m_headers; }

                protected:
                    DOTNETDUPE_API HttpContent() = default;

                private:
                    Collections::Generic::Dictionary<String, String> m_headers;
                };

                using HttpContentPtr = SmartPointer<HttpContent>;

                class StringContent : public HttpContent {
                public:
                    DOTNETDUPE_API explicit StringContent(const String& content);
                    DOTNETDUPE_API StringContent(const String& content, const String& mediaType);

                    DOTNETDUPE_API String ReadAsString() override;
                    DOTNETDUPE_API Array<char> ReadAsByteArray() override;
                    DOTNETDUPE_API SmartPointer<IO::Stream> ReadAsStream() override;

                    DOTNETDUPE_API void CopyTo(const SmartPointer<IO::Stream>& stream) override;
                    DOTNETDUPE_API long GetLength() const override;

                private:
                    String m_sContent;
                };

                class ByteArrayContent : public HttpContent {
                public:
                    DOTNETDUPE_API explicit ByteArrayContent(const Array<char>& content);
                    DOTNETDUPE_API ByteArrayContent(const Array<char>& content, int offset, int count);

                    DOTNETDUPE_API String ReadAsString() override;
                    DOTNETDUPE_API Array<char> ReadAsByteArray() override;
                    DOTNETDUPE_API SmartPointer<IO::Stream> ReadAsStream() override;

                    DOTNETDUPE_API void CopyTo(const SmartPointer<IO::Stream>& stream) override;
                    DOTNETDUPE_API long GetLength() const override;

                private:
                    Array<char> m_arrContent;
                    int m_iOffset;
                    int m_iCount;
                };

                class StreamContent : public HttpContent {
                public:
                    DOTNETDUPE_API explicit StreamContent(const SmartPointer<IO::Stream>& stream);

                    DOTNETDUPE_API String ReadAsString() override;
                    DOTNETDUPE_API Array<char> ReadAsByteArray() override;
                    DOTNETDUPE_API SmartPointer<IO::Stream> ReadAsStream() override;

                    DOTNETDUPE_API void CopyTo(const SmartPointer<IO::Stream>& stream) override;
                    DOTNETDUPE_API long GetLength() const override;

                private:
                    SmartPointer<IO::Stream> m_pStream;
                };

            }
        }
    }
}

Generated by OpenCppCoverage (Version: 0.9.9.0)