/* CHANGES FROM UNIX VERSION                                                   */
/*                                                                             */
/* 1.  Changed header files                                                    */
/* 2.  Added WSAStartUP() and WSACleanUp().                                    */

#include <stdio.h>      /* for printf(), fprintf() */
#include <winsock.h>    /* for socket(),... */
#include <stdlib.h>     /* for exit() */
#include "blimpsrv.h"
#include "winamp.h"


#define RCVBUFSIZE 32  
#define MAXPENDING 5    /* Maximum outstanding connection requests */


void handle_client(int clntSocket)
{
    char buf[ RCVBUFSIZE ];
    int recvMsgSize;
    int res;
    HWND hwnd_winamp;
    char buffer[10] = {'\0'};
    
    if( (recvMsgSize = recv(clntSocket, buf, RCVBUFSIZE, 0)) < 0 ){
	fprintf(stderr,"error receiving message\n");
	exit(1);
    }
   

    while( recvMsgSize > 0 ){
	int input = 0;
	printf("press 1 to start winamp\n");
	scanf("%d",&input);
	if( input == 1 ){
	    printf("telling winamp to start...\n");
	    send(clntSocket,"IPC_STARTPLAY",13,0);
	}

	hwnd_winamp = FindWindow("Winamp v1.x",NULL);

	for( ;; )
	{
	    int res = SendMessage(hwnd_winamp,WM_WA_IPC,0,IPC_GETOUTPUTTIME);
	    itoa(res,buffer,10);
	    printf("position is: %d\n",res);
	    send(clntSocket,buffer,10,0);
	    Sleep( 3000 );
	}
	/*
	if( send( clntSocket, buf, recvMsgSize, 0) != recvMsgSize){
	    fprintf(stderr,"error sending back to client\n");
	    exit(1);
	*/
	if((recvMsgSize = recv(clntSocket,buf,RCVBUFSIZE,0)) < 0 ){
	    fprintf(stderr,"error in receiving\n");
	    exit(1);
	}
    }

    closesocket(clntSocket);
    return;
}

int start_server( )
{
    int servSock;                    /* Socket descriptor for server */
    int clntSock;                    /* Socket descriptor for client */
    struct sockaddr_in echoServAddr; /* Local address */
    struct sockaddr_in echoClntAddr; /* Client address */
    unsigned short echoServPort;     /* Server port */
    int clntLen;            /* Length of client address data structure */
    WSADATA wsaData;                 /* Structure for WinSock setup communication */

    echoServPort = 32379;  

    if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) 
    {
        fprintf(stderr, "WSAStartup() failed");
        exit(1);
    }

    
    if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){
	fprintf(stderr,"socket() failed");
	exit(1);
    }
    
    memset(&echoServAddr, 0, sizeof(echoServAddr));   /* Zero out structure */
    echoServAddr.sin_family = AF_INET;                /* Internet address family */
    echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */
    echoServAddr.sin_port = htons(echoServPort);      /* Local port */

    
    if (bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0){
	fprintf(stderr,"error in bind\n");
	exit(1);
    }
     
   
    if (listen(servSock, MAXPENDING) < 0){
	fprintf(stderr,"listen failed\n");
	exit(1);
    }
    Sleep( 5000 ); 
    for (;;) 
    {
        
        clntLen = sizeof(echoClntAddr);

        
        if ((clntSock = accept(servSock, (struct sockaddr *) &echoClntAddr, &clntLen)) < 0){
	    fprintf(stderr,"error in accept\n");
	    exit(1);
	}
        printf("Handling client %s\n", inet_ntoa(echoClntAddr.sin_addr));
        handle_client(clntSock);
    }
    /* NOT REACHED */
}

