#include <iostream>
#include <cstdlib>
#include <string>
#include "SysPlusPlus"
#include "ComPlusPlus"

#ifdef HAVE_SYS_SOCKET_H
 #include <sys/socket.h>
#else
        #if HAVE_WINSOCK_H
                #include <winsock.h>
        #endif
#endif


int main (int argc, char *argv [] ) {
	
if ( argc < 2 ) {
	std::cout << "Usage " << argv[0] << " [port] <reponsefile>\n";
  	return 1;
}

#if 0
WSADATA wsaData;
if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) {
fprintf (stderr, "WSAStartup(): Kann Winsock nicht initialisieren.\n");
exit (EXIT_FAILURE);
}
#endif

	
int port = std::atoi(argv [1]);

 compp::SocketTcp *srv1 = NULL;
 
try {
 // -> Comment 1
 compp::SocketTcp Server (port);	
 Server.AttachFD();
 Server.SetSockOptReuseAddress ( true);
 Server.SetSockOptTcpNoDelay ( true ) ;
 Server.SetReadTimeout(10000000);
 Server.SetWriteTimeout(10000000);
 Server.SetLingerTime(0);

 // -> Comment 2
 srv1 = Server.Accept( ); 

 srv1->AttachFD();
 srv1->SetSockOptReuseAddress ( true);
 srv1->SetSockOptTcpNoDelay ( true ) ;
 srv1->SetReadTimeout(10000000);
 srv1->SetWriteTimeout(10000000);
 srv1->SetLingerTime(0);

 std::cout << "Connection established. Receiving Data ...\n";
 

 if ( argc == 2) {

   do {
     int i;
     char buf[10000];
     std::memset((void*)buf, 0, sizeof(buf));
     // -> Comment 3
     i = srv1->Read(buf, sizeof(buf)-1);
     if ( i > 0 )
       std::cout << buf;	
     // -> Comment 4
   } while ( ! srv1->IsEOF() );
   
   std::cout << "Connection closed\n";
   // -> Comment 5
   Server.Shutdown(0);
   delete srv1; 
 } else {

     int i;
     char buf[10000];
     std::memset((void*)buf, 0, sizeof(buf));
     // -> Comment 3
     i = srv1->Read(buf, sizeof(buf)-1);
     if ( i > 0 )
       std::cout << buf;	
     else {
       Server.Shutdown(0);
       delete srv1;
       exit(0);
     }

     std::string Reply; 
     if ( ! syspp::Tools::LoadTxtFile ( argv[2], Reply ) ) {
       std::cout << " Cannot load file " << argv[2] << "\n";
       Server.Shutdown(0);
       delete srv1;
       exit(1);
     }
     srv1->Writen ( Reply );
     srv1->Shutdown(0);
     Server.Shutdown(0);
     delete srv1;
 }

} catch ( syspp::ComException e ) {
  delete srv1;
  std::cout << "Exception " << e.what() << "\n" ;
}



 return 0;	
}
