/*
 *  IXSocketSChannel.cpp
 *  Author: Benjamin Sergeant
 *  Copyright (c) 2018 Machine Zone, Inc. All rights reserved.
 *
 *  See https://docs.microsoft.com/en-us/windows/desktop/WinSock/using-secure-socket-extensions
 *
 *  https://github.com/pauldotknopf/WindowsSDK7-Samples/blob/master/netds/winsock/securesocket/stcpclient/tcpclient.c
 *
 *  This is the right example to look at:
 *  https://www.codeproject.com/Articles/1000189/A-Working-TCP-Client-and-Server-With-SSL
 *
 *  Similar code is available from this git repo
 *  https://github.com/david-maw/StreamSSL
 */
#include "IXSocketSChannel.h"

#ifdef _WIN32
#include <WS2tcpip.h>
#include <WinSock2.h>
#include <basetsd.h>
#include <io.h>
#include <schannel.h>
#include <ws2def.h>

#define WIN32_LEAN_AND_MEAN

#ifndef UNICODE
#define UNICODE
#endif

#include <mstcpip.h>
#include <ntdsapi.h>
#include <rpc.h>
#include <stdio.h>
#include <tchar.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#include <windows.h>

#define RECV_DATA_BUF_SIZE 256

// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")

// link with fwpuclnt.lib for Winsock secure socket extensions
#pragma comment(lib, "fwpuclnt.lib")

// link with ntdsapi.lib for DsMakeSpn function
#pragma comment(lib, "ntdsapi.lib")

// The following function assumes that Winsock
// has already been initialized


#else
#error("This file should only be built on Windows")
#endif

namespace ix
{
    SocketSChannel::SocketSChannel()
    {
        ;
    }

    SocketSChannel::~SocketSChannel()
    {
    }

    bool SocketSChannel::connect(const std::string& host, int port, std::string& errMsg)
    {
        return Socket::connect(host, port, errMsg, nullptr);
    }


    void SocketSChannel::secureSocket()
    {
        // there will be a lot to do here ...
    }

    void SocketSChannel::close()
    {
        Socket::close();
    }

    ssize_t SocketSChannel::send(char* buf, size_t nbyte)
    {
        return Socket::send(buf, nbyte);
    }

    ssize_t SocketSChannel::send(const std::string& buffer)
    {
        return Socket::send(buffer);
    }

    ssize_t SocketSChannel::recv(void* buf, size_t nbyte)
    {
        return Socket::recv(buf, nbyte);
    }

} // namespace ix
