// AmpCaddy
// Copyright (C) 2002, David Koenig

#include <windows.h>
#include <process.h>

#include <winsock.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "gen.h"


BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
{
	return TRUE;
}



//Networking
WSADATA wsaData;
SOCKET listeningSocket;
SOCKADDR_IN saServer;
int nRet;
DWORD nThreadID;
DWORD newThreadID;

char* readLine(void);
void config();
void quit();
int init();
char szAppName[] = "AmpCaddy Server";

winampGeneralPurposePlugin plugin =
{
	GPPHDR_VER,
	"",
	init,
	config,
	quit,
};

void config()
{
//	DialogBox(plugin.hDllInstance,MAKEINTRESOURCE(IDD_DIALOG1),plugin.hwndParent,ConfigProc);
}

void quit()
{

  WSACleanup();

}

int StartWinsock(void)
{
    int nCode = 0;
    if ((nCode = WSAStartup(MAKEWORD(1, 1), &wsaData)) != 0) 
    {
      //cerr << "WSAStartup() returned error code " << nCode << "." <<	endl;
      //printf("WSAStartup() returned error code: %d\n", nCode);
      return 1;
    }
      
    return 0;
}

int SetupSocket()
{

	listeningSocket = socket(AF_INET,		// Go over TCP/IP
				             SOCK_STREAM,   	// Socket type
				             IPPROTO_TCP);	  // Protocol
	if (listeningSocket == INVALID_SOCKET) 
  {
		//printf("Error at socket()");
		return 1;
	}


  // Fill a SOCKADDR_IN struct with address information:
  saServer.sin_family = AF_INET;
	saServer.sin_addr.s_addr = INADDR_ANY;	// Since this is a server, any address will do
	saServer.sin_port = htons(8005);		// Convert int 8888 to a value for the port field



	// Bind the socket to the local server address
  nRet = bind(listeningSocket, (LPSOCKADDR)&saServer, sizeof(struct sockaddr));
	if (nRet == SOCKET_ERROR)
    return 1;


	// Begin listening
	nRet = listen(listeningSocket, 10);		// Up to 10 clients may be queued
 	if (nRet == SOCKET_ERROR)
		return 1;
	
//else return normal

  return 0;
}


void HandleCommand(char *command)
{

  if(!strcmp("/vol+\n", command))
  {
    SendMessage(plugin.hwndParent,WM_COMMAND,40058,0);
  }else
  if(!strcmp("/vol-\n", command))
  {
    SendMessage(plugin.hwndParent,WM_COMMAND,40059,0);
  }else
  if(!strcmp("/play\n", command))
  {
    SendMessage(plugin.hwndParent,WM_COMMAND,40045,0);
  }else
  if(!strcmp("/pause\n", command))
  {
    SendMessage(plugin.hwndParent,WM_COMMAND,40046,0);
  }else
  if(!strcmp("/stop\n", command))
  {
    SendMessage(plugin.hwndParent,WM_COMMAND,40047,0);
  }else
  if(!strcmp("/prev\n", command))
  {
    SendMessage(plugin.hwndParent,WM_COMMAND,40044,0);
  }else
  if(!strcmp("/next\n", command))
  {
    SendMessage(plugin.hwndParent,WM_COMMAND,40048,0);
  }


}


DWORD WINAPI HandleConnection( LPVOID lpParam )
{

  SOCKET socket = *(SOCKET*)lpParam;
  char myBuf[16];
  int nRet = 0;
  while(1)
  {
  memset(myBuf, 0, 15);

  nRet = recv(socket,		      // Connected socket
	                myBuf,		      // Receive buffer
	                sizeof(myBuf),	// Size of the buffer
	                0);			        // More flags
  if ((nRet == SOCKET_ERROR) || (nRet == 0)) // || (nRet == 0)
  {
    
      //MessageBox( NULL, "Socket Error", "Error", MB_OK );
      closesocket(socket);

      //break;
  	  return 1;
  }
  
  //test.. send stuff back to the client.
  /*
  nRet = send(socket,	
                 myBuf,	// Our string buffer
         strlen(myBuf), 	// Length of the data in the buffer
                    0);  // Most often is 0, but see end of tutorial for options
  if (nRet == SOCKET_ERROR)
   	return 1;
  */
  
  if(strlen(myBuf) > 0)
    HandleCommand(myBuf);

  }
  


return 0;
}

DWORD WINAPI AcceptConnections( LPVOID lpParam )
{

  while(1)
  {
	SOCKET theClient;

	theClient = accept(listeningSocket,
                       NULL,			    // Wait for a specific address to connect; here there is none
                       NULL);
	if (theClient == INVALID_SOCKET) 
  {
   // MessageBox( NULL, "Invalid Socket", "Error", MB_OK );
		return 1;
	}

    CreateThread(0, 0, HandleConnection, &theClient, 0, &nThreadID);
  }

  return 0;
}

int init()
{

		static char c[512];
		char filename[512],*p;
		GetModuleFileName(plugin.hDllInstance,filename,sizeof(filename));
		p = filename+lstrlen(filename);
		while (p >= filename && *p != '\\') p--;
		wsprintf((plugin.description=c),"%s Plug-In v0.1 (%s)",szAppName,p+1);


    //Start Winsock
    if(StartWinsock())
      return 1;

    //SETUP sockets/threads ..etc...
    if(SetupSocket())
      return 1;

    CreateThread(0, 0, AcceptConnections, 0, 0, &nThreadID);  

	return 0;
}

__declspec( dllexport ) winampGeneralPurposePlugin * winampGetGeneralPurposePlugin()
{
	return &plugin;
}



