////////////////////////////////////////////////////////
// RemoteLog
//
// This implements RemoteLogIF
//
// It acts a simple UDP message broadcaster to get 
// write information to the topside module
//
///////////////////////////////////////////////////////

#include "RemoteLog.h"

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

#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>

#include <arpa/inet.h>
#include <net/if.h>

#include "Syslog.h"

#define PORT_NUM 2390
#define DEFAULT_DEBUG 1

RemoteLog::RemoteLog()
    : RemoteLogIF_SK()
{

    //setting default debug level
    _debugLevel = DEFAULT_DEBUG;

    if ((_sockNum = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
	Syslog::write("RemoteLog -- Error creating socket. Exiting...");
	exit (1);
    }
    int on = 1;
    if (ioctl(_sockNum, FIONBIO, &on) < 0) {
        Syslog::write("RemoteLog -- Error setting non-blocking. Exiting...");
        exit(1);
    }
    
    on = 1;
    if ((setsockopt(_sockNum, SOL_SOCKET, SO_BROADCAST, (void *)&on, sizeof (on))) != 0) {
	Syslog::write("Remote Log -- Error setting broadcast. Exiting...");
	exit (1);
    }
    
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = htonl(INADDR_BROADCAST);
    sin.sin_port = htons(PORT_NUM);
}

RemoteLog::~RemoteLog()
{
}

void RemoteLog::remoteWrite(short debug, RemoteLogIF::MessageString mes)
{
    
    char* form;
   
    Syslog::write("RemoteLog -- sending message << %s >>", mes);

    //malloc occurs in the function
    form = formatString(mes);

    if(debug >= _debugLevel) {
	if ( (errno = sendto(_sockNum, form, strlen(form), 0, (struct sockaddr *)&sin, sizeof(struct sockaddr))) == -1) {
	    fprintf(stderr,"Error sending packet: %d\n",errno);
	    //exit(1);
	}
    }

    free(form);
}

char* RemoteLog::formatString(RemoteLogIF::MessageString mes) 
{
    char* hold;
    //2 bytes for header, 1 for size
    int len = strlen(mes) + 3;
    
  
    hold = (char *)malloc(sizeof(char)*len);

    memset(hold, 0, len);
    
    hold[0] = '@';
    hold[1] = '$';
    hold[2] = (char)len;
    strncpy(&hold[3], mes, len);

    return hold;
}
