/* upd-server.c
 *
 * Copyright (c) 2000 Sean Walton and Macmillan Publishers.  Use may be in
 * whole or in part in accordance to the General Public License (GPL).
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
*/
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <resolv.h>

#include <sys/stat.h>

#include <aalib.h>


#define DEFAULT_PORT	1313
#define VWBUFFER_SIZE	60000
int sd;

struct vwdata {
	int flags;
	int flags1; 
	int flags2; 	
	int cwidth,cheight;	
	int scrsize;
	char buffer[VWBUFFER_SIZE];
} vwdata;
	struct vwdata vw;
        	                    	                

void initsocket(int port) {
	struct sockaddr_in addr;

	printf("Starting to listen\n");
	sd = socket(PF_INET, SOCK_DGRAM, 0);
	bzero(&addr, sizeof(addr));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(port);
	addr.sin_addr.s_addr = INADDR_ANY;
	if ( bind(sd, (struct sockaddr*)&addr, sizeof(addr)) != 0 )
		perror("bind");

//	if ( connect(sd, (struct sockaddr*)&addr, sizeof(addr)) != 0 )
//			perror("connect 2");
//printf ("aaaaaaaaaaaa\n");
printf ("UDP listen socket listening on port %i\n", port);
}

aa_context *c;

int resizeaa()
{
	aa_resize(c);
}

int initaa() 
{
	char * hidis = NULL;
	struct stat sbuf;
	int fd, vt, major, minor;
	FILE * fp;
	char fname[12];
	extern aa_linkedlist *aa_displayrecommended;

	hidis=aa_getfirst(&aa_displayrecommended);
	if ( hidis==NULL ){
	    /* check /dev/vcsa<vt> */
	    /* check only, if no driver is explicit set */
	    fd = dup (fileno (stderr));
	    fstat (fd, &sbuf);
	    major = sbuf.st_rdev >> 8;
	    vt = minor = sbuf.st_rdev & 0xff;
	    close (fd);
	    sprintf (fname, "/dev/vcsa%i", vt);
	    fp = fopen (fname, "w+");
	    if (fp==NULL){
	        fprintf(stderr,"VO: [aa] cannot open %s for writing,"
	                    "so we'll not use linux driver\n", fname);
	        aa_recommendlowdisplay("linux");
	        aa_recommendhidisplay("curses");
	        aa_recommendhidisplay("X11");   
	    }else fclose(fp);
	} else aa_recommendhidisplay(hidis);
	c = aa_autoinit(&aa_defparams);
	if (c == NULL) {
		perror("Cannot initialize aalib\n");
        	return -1;
	}   
	resizeaa();
	aa_resizehandler(c, (void *)resizeaa);
	aa_hidecursor(c);
	printf("\033[9;0]");
	        
	printf("\nAAlib initialized\n");
	
}

void writeout() {
	int mywidth=aa_scrwidth(c);
	int myheight=aa_scrheight(c);
	int cwidth=vw.cwidth;
	int cheight=vw.cheight;
	
	int x=MIN(mywidth,cwidth);
	int y=MIN(myheight,cheight);
	int i,j;
	char *s=vw.buffer;
	char *d=c->textbuffer;
	for (j=0;j<y;j++) {
		memcpy(d,s,x);
		d+=mywidth;
		s+=cwidth;
	}
	memset(c->attrbuffer, cwidth*cheight, AA_BOLD);
	aa_flush(c);
}

int main(int count, char *strings[])
{	
	printf("Started\n");
	int novport=DEFAULT_PORT;
	if ( count != 2 )
		printf("uporaba: %s <port>\n... Uporabljam privzeta vrata %d.\n", strings[0], novport);
	else
		novport = atoi(strings[1]);

	printf("Opening socket\n");
	
	initsocket(novport);
	printf("Opening Inicializiram AA\n");
	initaa();
	printf("AA inicializiran\n");
	
	while (1)
	{	int bytes;
//		printf ("sd %i\n",sd);
		bytes = recv(sd, (char *)&vw, sizeof(vw),0);
		writeout();		
//		printf("msg from (%d bytes) Width: %i, Height: %i\n%s\n", bytes, vw.cwidth, vw.cheight,vw.buffer);
//		sendto(sd, buffer, bytes, 0);
	}
	close(sd);
}

