//
// Copyright © 2020 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//

#include "common/include/NetworkSockets.hpp"

#if defined(__unix__) || defined(__APPLE__)
#include <unistd.h>
#include <fcntl.h>
#include <armnn/Conversion.hpp>

#endif

namespace armnnUtils
{
namespace Sockets
{

bool Initialize()
{
#if defined(__unix__) || defined(__APPLE__)
    return true;
#elif defined(_MSC_VER)
    WSADATA wsaData;
    return WSAStartup(MAKEWORD(2, 2), &wsaData) == 0;
#endif
}

int Close(Socket s)
{
#if defined(__unix__) || defined(__APPLE__)
    return close(s);
#elif defined(_MSC_VER)
    return closesocket(s);
#endif
}


bool SetNonBlocking(Socket s)
{
#if defined(__unix__) || defined(__APPLE__)
    const int currentFlags = fcntl(s, F_GETFL);
    return fcntl(s, F_SETFL, currentFlags | O_NONBLOCK) == 0;
#elif defined(_MSC_VER)
    u_long mode = 1;
    return ioctlsocket(s, FIONBIO, &mode) == 0;
#endif
}


long Write(Socket s, const void* buf, size_t len)
{
#if defined(__unix__) || defined(__APPLE__)
    return write(s, buf, len);
#elif defined(_MSC_VER)
    return send(s, static_cast<const char*>(buf), static_cast<int>(len), 0);
#endif
}


long Read(Socket s, void* buf, size_t len)
{
#if defined(__unix__) || defined(__APPLE__)
    return read(s, buf, len);
#elif defined(_MSC_VER)
    return recv(s, static_cast<char*>(buf), static_cast<int>(len), 0);
#endif
}

int Ioctl(Socket s, unsigned long int cmd, void* arg)
{
#if defined(__unix__) || defined(__APPLE__)
    ARMNN_NO_CONVERSION_WARN_BEGIN
    return ioctl(s, static_cast<int>(cmd), arg);
    ARMNN_NO_CONVERSION_WARN_END
#elif defined(_MSC_VER)
    return ioctlsocket(s, cmd, static_cast<u_long*>(arg));
#endif
}


int Poll(PollFd* fds, nfds_t numFds, int timeout)
{
#if defined(__unix__) || defined(__APPLE__)
    return poll(fds, numFds, timeout);
#elif defined(_MSC_VER)
    return WSAPoll(fds, numFds, timeout);
#endif
}


armnnUtils::Sockets::Socket Accept(Socket s, sockaddr* addr, socklen_t* addrlen, int flags)
{
#if defined(__unix__)
    return accept4(s, addr, addrlen, flags);
#elif defined(__APPLE__)
    return accept(s, addr, addrlen);
#elif defined(_MSC_VER)
    return accept(s, addr, reinterpret_cast<int*>(addrlen));
#endif
}

}
}
