/*
 * Copyright (C) 2020-2021 Aloysius Indrayanto
 *
 * This file is part of the eCxx library, see LICENSE file for the license details.
 */

/*
 * ----------------------------------------------------------------------------------
 * The code in this file is copied (with a slight modifications) from:
 *     Client.h - a base class that provides client
 * ----------------------------------------------------------------------------------
 * Copyright (C) 2011 Adrian McEwen. All right reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under the
 * terms of the GNU Lesser General Public License as published by the Free Software
 * Foundation; either version 2.1 of the License, or (at your option) any later
 * version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License along
 * with this library; if not, write to the Free Software Foundation, Inc., 51
 * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 * ----------------------------------------------------------------------------------
 */


#ifndef ECXX_PLATFORM_NODEMCU_CLIENT_H
#define ECXX_PLATFORM_NODEMCU_CLIENT_H


#include "IPAddress.h"
#include "Stream.h"


namespace eCxx {

namespace NodeMCU {


class Client : public Stream {

    public:
        virtual int32_t connect(IPAddress ip, uint16_t port) = 0;
        virtual int32_t connect(const char* host, uint16_t port) = 0;
        virtual void stop() = 0;

        virtual uint8_t connected() = 0;
        virtual operator bool() = 0;

        virtual int32_t available() = 0;
        virtual int32_t read() = 0;
        virtual int32_t read(uint8_t* buf, size_t size) = 0;
        virtual int32_t peek() = 0;

        virtual size_t write(uint8_t c) = 0;
        virtual size_t write(const uint8_t* buf, size_t size) = 0;
        virtual void flush() = 0;

    protected:
        inline uint8_t* rawIPAddress(IPAddress& addr)
        { return addr.raw_address(); }

        inline const uint8_t* rawIPAddress(const IPAddress& addr)
        { return addr.raw_address(); }
};


} // namespace NodeMCU

} // namespace eCxx


//
// For compatibility with the Arduino library part
//
typedef eCxx::NodeMCU::Client Client;


#endif
