text: /*
   *  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
   */
  #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
  