/*****

static web server over PPP
Once connected, the server will print outs it's IP address on STDIO
You can then access the static page from that address: 'http://x.x.x.x/'

You will need to change the default addresses, and
the send/expect sequence at the beginning of the program

********/

#define PKTDRV "ppp.lib"

//Macros for standard login procedure. You may still need to alter expected strings below
//Don't forget the carriage returns '\r'
#define DIALUP_DIALSTRING "ATDT5558000\r"
#define DIALUP_NAME "name\r"
#define DIALUP_PASSWORD "password\r"

//IP address will be assigned by the ISP
#define MY_IP_ADDRESS "0.0.0.0"

#define MY_NETMASK "255.255.255.255"
#define MY_GATEWAY "10.10.1.1"
#define MY_NAMESERVER "10.10.1.2"

#define CINBUFSIZE 31
#define COUTBUFSIZE 31

#define PPP_RTSPORT PBDR
#define PPP_RTSSHADOW PBDRShadow
#define PPP_RTSPIN 7
#define PPP_CTSPORT PBDR
#define PPP_CTSPIN 0

#define TW_TO 0		//eliminate 2MSL delay
#define HTTP_MAXSERVERS 2
#define MAX_TCP_SOCKET_BUFFERS 2

#memmap xmem
#use "dcrtcp.lib"
#use "modem.lib"
#use "http.lib"


#define TIMEZONE        -8

#define LCP_TIMEOUT 5000



//#define FRAGSUPPORT		//make sure FRAGSUPPORT is on

/*
 *  ximport is a Dynamic C language feature that takes the binary image
 *  of a file, places it in extended memory on the controller, and
 *  associates a symbol with the physical address on the controller of
 *  the image.
 *
 */

#ximport "samples/tcpip/http/pages/static.html"    index_html
#ximport "samples/tcpip/http/pages/rabbit1.gif"    rabbit1_gif

/*
 *  http_types gives the HTTP server hints about handling incoming
 *  requests.  The server compares the extension of the incoming
 *  request with the http_types list and returns the second field
 *  as the Content-Type field.  The third field defines a custom
 *  function to handle that mime type.
 *
 *  You can get a list of mime types from Netscape's browser in:
 *
 *  Edit->Preferences->Navigator->Applications
 *
 */

/* the default mime type for '/' must be first */
const HttpType http_types[] =
{
   { ".html", "text/html", NULL},
   { ".gif", "image/gif", NULL}
};

/*
 *  http_flashspec assocates the file image we brought in with ximport
 *  and associates it with its name on the webserver.  In this example
 *  the file "samples/http/pages/static.html" will be sent to the 
 *  client when they request either "http://yoururl.com/" or
 *  "http://yoururl.com/index.html"
 *
 */

const HttpSpec http_flashspec[] = 
{
   { HTTPSPEC_FILE,  "/",              index_html,    NULL, 0, NULL, NULL},
   { HTTPSPEC_FILE,  "/index.html",    index_html,    NULL, 0, NULL, NULL},
   { HTTPSPEC_FILE,  "/rabbit1.gif",   rabbit1_gif,   NULL, 0, NULL, NULL},
};


void main()
{
	auto unsigned long t;
	auto char buffer[100];


	if(ModemOpen(57600) == 0)
	{
		printf("No modem detected\n");
		exit(-1);
	}
	if(ModemInit())
	{
		printf("Modem Initialized\n");
	}
	else
	{
		printf("Could not init modem\n");
		exit(-1);
	}

	ModemSend(DIALUP_DIALSTRING);
	if(ModemExpect("ONNECT", 30000) == 0)
	{
		printf("Expected 'CONNECT'\n");
		exit(-1);
		
	}

	if(ModemExpect("ogin:", 10000) == 0)
	{
		printf("Expected 'Login:'\n");
		exit(-1);
	}
	ModemSend(DIALUP_NAME);
	if(ModemExpect("word:", 2000) == 0)
	{
		printf("Expected Password\n");
		exit(-1);
	}
	ModemSend(DIALUP_PASSWORD);		//secret password, erase later
	if(ModemExpect("PPP", 5000) == 0)
	{
		printf("Didn't get PPP session\n");
		exit(-1);
	}	
	ModemClose();
	
	sock_init();
	PPPinit(57600);
	PPPflowcontrolOn();

	//PPPnegotiateIP(inet_addr("10.1.10.1"), inet_addr("10.1.10.2"));
	//PPPsetAuthenticator("name", "password");
	//PPPsetAuthenticatee("mageeol", "blah");

		
	if(PPPstart(5000, 3))
	{
		printf("PPP established\n");
	}
	else
	{
		printf("PPP failed\n");
	}
	printf("IP address is %s\n", inet_ntoa( buffer, gethostid()));

	http_init();

/*
 *  tcp_reserveport causes the web server to maintain pending requests
 * whenever there is not a listen socket available
 *
 */

   tcp_reserveport(80);

/*
 *  http_handler needs to be called to handle the active http servers.
 */
   
   while (1) {
      http_handler();
   }

	if(PPPshutdown(2000) == 0)
	{
		printf("PPP terminate failed\n");
	}
	PPPclose();
	ModemOpen(57600);
	ModemHangup();
	ModemClose();		 	  	 	  	
}
