/*******************************************************************************
 * Copyright (c) 2007 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * IBM Corporation - Initial API and implementation
 *******************************************************************************/

/*
 * Utility routines for constructing and sending proxy runtime events.
 *
 * These routines define the format of runtime events for communication with
 * runtime proxy clients.
 *
 * See org.eclipse.ptp.rtsystem.AbstractProxyRuntimeSystem for a description
 * of the protocol format.
 */

#ifdef __gnu_linux__
#define _GNU_SOURCE
#endif /* __gnu_linux__ */

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

#include "proxy.h"
#include "proxy_msg.h"
#include "args.h"
#include "list.h"
#include "compat.h"

/*
 * Add a string attribute to an existing event.
 */
void
proxy_add_string_attribute(proxy_msg *m, char *attr, char *value)
{
	proxy_msg_add_keyval_string(m, attr, value);
}

/*
 * Add an integer attribute to an existing event.
 */
void
proxy_add_int_attribute(proxy_msg *m, char *attr, int value)
{
	proxy_msg_add_keyval_int(m, attr, value);
}

/*
 * OK EVENT. Sent in response to a sucessfully
 * completed command.
 */
proxy_msg *
proxy_ok_event(int trans_id)
{
 	return new_proxy_msg(PROXY_EV_OK, trans_id);
}

/*
 * SHUTDOWN EVENT. Sent in response to a quit command.
 */
proxy_msg *
proxy_shutdown_event(int trans_id)
{
 	return new_proxy_msg(PROXY_EV_SHUTDOWN, trans_id);
}

/*
 * MESSAGE EVENT. Used for sending messages that
 * should be logged by the client.
 */
proxy_msg *
proxy_message_event(int trans_id, char *level, int code, char *fmt, ...)
{
	va_list		ap;
	char *		msg;
	proxy_msg *	m = new_proxy_msg(PROXY_EV_MESSAGE, trans_id);

	va_start(ap, fmt);
	vasprintf(&msg, fmt, ap);
	va_end(ap);

	proxy_msg_add_int(m, 3); /* 3 attributes */
	proxy_msg_add_keyval_string(m, MSG_LEVEL_ATTR, level);
	proxy_msg_add_keyval_int(m, MSG_CODE_ATTR, code);
	proxy_msg_add_keyval_string(m, MSG_TEXT_ATTR, msg);

	return m;
}

/*
 * ERROR EVENT. General error event that should be sent to
 * indicate an error condition. NOTE: command errors should
 * use the specific error events below.
 */
proxy_msg *
proxy_error_event(int trans_id, int code, char *fmt, ...)
{
	va_list		ap;
	char *		msg;
	proxy_msg *	m = new_proxy_msg(PROXY_EV_ERROR, trans_id);

	va_start(ap, fmt);
	vasprintf(&msg, fmt, ap);
	va_end(ap);

	proxy_msg_add_int(m, 2); /* 2 attributes */
	proxy_msg_add_keyval_int(m, ERROR_CODE_ATTR, code);
	proxy_msg_add_keyval_string(m, ERROR_MSG_ATTR, msg);

	return m;
}

/*
 * SUBMITJOB ERROR EVENT. Used to indicate an error when attempting
 * to submit a job. The jobSubId argument is the job submission ID
 * that was specified to the submitJob command. This event should
 * be used to indicate submission errors as soon as the job submission
 * id has been obtained.
 */
proxy_msg *
proxy_submitjob_error_event(int trans_id, char *jobSubId, int code, char *msg)
{
	proxy_msg *	m = new_proxy_msg(PROXY_EV_RT_SUBMITJOB_ERROR, trans_id);

	proxy_msg_add_int(m, 3); /* 3 attributes */
	proxy_msg_add_keyval_string(m, JOB_SUB_ID_ATTR, jobSubId);
	proxy_msg_add_keyval_int(m, ERROR_CODE_ATTR, code);
	proxy_msg_add_keyval_string(m, ERROR_MSG_ATTR, msg);

	return m;
}

/*
 * TERMINATEJOB ERROR EVENT. Used to indicate an error when attempting
 * to terminate a job. The jobId argument is the job ID
 * that was specified to the terminateJob command.
 */
proxy_msg *
proxy_terminatejob_error_event(int trans_id, char *jobId, int code, char *msg)
{
	proxy_msg *	m = new_proxy_msg(PROXY_EV_RT_TERMINATEJOB_ERROR, trans_id);

	proxy_msg_add_int(m, 3); /* 3 attributes */
	proxy_msg_add_keyval_string(m, JOB_ID_ATTR, jobId);
	proxy_msg_add_keyval_int(m, ERROR_CODE_ATTR, code);
	proxy_msg_add_keyval_string(m, ERROR_MSG_ATTR, msg);

	return m;
}

/*
 * ATTR DEF INT EVENT. Uused to define a new INTEGER attribute that can be used
 * in subsequent events.
 */
proxy_msg *
proxy_attr_def_int_event(int trans_id, char *id, char *name, char *desc, int disp, int def)
{
	proxy_msg *	m = new_proxy_msg(PROXY_EV_RT_ATTR_DEF, trans_id);

	proxy_msg_add_int(m, 1); /* 1 attribute def */
	proxy_msg_add_int(m, 5); /* 5 attributes */
	proxy_msg_add_string(m, id);
	proxy_msg_add_string(m, "INTEGER");
	proxy_msg_add_string(m, name);
	proxy_msg_add_string(m, desc);
	proxy_msg_add_string(m, disp ? "true" : "false");
	proxy_msg_add_int(m, def);

	return m;
}

/*
 * ATTR DEF STRING EVENT. Used to define a new STRING attribute that can be used
 * in subsequent events.
 */
proxy_msg *
proxy_attr_def_string_event(int trans_id, char *id, char *name, char *desc, int disp, char *def)
{
	proxy_msg *	m = new_proxy_msg(PROXY_EV_RT_ATTR_DEF, trans_id);

	proxy_msg_add_int(m, 1); /* 1 attribute def */
	proxy_msg_add_int(m, 5); /* 5 attributes */
	proxy_msg_add_string(m, id);
	proxy_msg_add_string(m, "STRING");
	proxy_msg_add_string(m, name);
	proxy_msg_add_string(m, desc);
	proxy_msg_add_string(m, disp ? "true" : "false");
	proxy_msg_add_string(m, def);

	return m;
}

/*
 * NEW MACHINE. Used to define new machine model elements.
 */
proxy_msg *
proxy_new_machine_event(int trans_id, char *rm_id, char *machine_id_range, char *name, char *state)
{
	proxy_msg *	m = new_proxy_msg(PROXY_EV_RT_NEW_MACHINE, trans_id);

	proxy_msg_add_string(m, rm_id);
	proxy_msg_add_int(m, 1); /* 1 new machine range */
	proxy_msg_add_string(m, machine_id_range);
	proxy_msg_add_int(m, 2); /* 2 attributes */
	proxy_msg_add_keyval_string(m, ELEMENT_NAME_ATTR, name);
	proxy_msg_add_keyval_string(m, MACHINE_STATE_ATTR, state);

	return m;
}

/*
 * NEW JOB EVENT. Used to create a job model element. Jobs can either be created in
 * response to a submitJob command, or to represent existing jobs in a queue (for example).
 *
 * New jobs created in response to a submitJob event *MUST* provide the job submission ID.
 */
proxy_msg *
proxy_new_job_event(int trans_id, char *queue_id, char *job_id_range, char *name, char *state, char *jobSubId)
{
	proxy_msg *	m = new_proxy_msg(PROXY_EV_RT_NEW_JOB, trans_id);

	proxy_msg_add_string(m, queue_id);
	proxy_msg_add_int(m, 1); /* 1 new job range */
	proxy_msg_add_string(m, job_id_range);

	if (jobSubId != NULL) {
		proxy_msg_add_int(m, 3); /* 3 attributes */
		proxy_msg_add_keyval_string(m, JOB_SUB_ID_ATTR, jobSubId);
	} else {
		proxy_msg_add_int(m, 2); /* 2 attributes */
	}

	proxy_msg_add_keyval_string(m, ELEMENT_NAME_ATTR, name);
	proxy_msg_add_keyval_string(m, JOB_STATE_ATTR, state);

	return m;
}

/*
 * NEW NODE EVENT. Used to create new node model elements.
 */
proxy_msg *
proxy_new_node_event(int trans_id, char *mach_id, int num_nodes)
{
	proxy_msg *	m = new_proxy_msg(PROXY_EV_RT_NEW_NODE, trans_id);

	proxy_msg_add_string(m, mach_id);
	proxy_msg_add_int(m, num_nodes);

	return m;
}

/*
 * Add a node to a new node event.
 */
void
proxy_add_node(proxy_msg *m, char *node_id, char *name, char *state, int extra_attrs)
{
	proxy_msg_add_string(m, node_id);
	proxy_msg_add_int(m, 2 + extra_attrs);
	proxy_msg_add_keyval_string(m, ELEMENT_NAME_ATTR, name);
	proxy_msg_add_keyval_string(m, NODE_STATE_ATTR, state);
}

/*
 * NEW PROCESS EVENT. Used to create a new process model element.
 */
proxy_msg *
proxy_new_process_event(int trans_id, char *job_id, int num_procs)
{
	proxy_msg *	m = new_proxy_msg(PROXY_EV_RT_NEW_PROCESS, trans_id);

	proxy_msg_add_string(m, job_id);
	proxy_msg_add_int(m, num_procs);

	return m;
}

void
proxy_add_process(proxy_msg *m, char *proc_id, char *name, char *state, int extra_attrs)
{
	proxy_msg_add_string(m, proc_id);
	proxy_msg_add_int(m, 2 + extra_attrs);
	proxy_msg_add_keyval_string(m, ELEMENT_NAME_ATTR, name);
	proxy_msg_add_keyval_string(m, PROC_STATE_ATTR, state);
}

/*
 * NEW QUEUE EVENT. Used to create a new queue model element.
 */
proxy_msg *
proxy_new_queue_event(int trans_id, char *rm_id, char *queue_id, char *name, char *state)
{
	proxy_msg *	m = new_proxy_msg(PROXY_EV_RT_NEW_QUEUE, trans_id);

	proxy_msg_add_string(m, rm_id);
	proxy_msg_add_int(m, 1); /* 1 new queue */
	proxy_msg_add_string(m, queue_id);
	proxy_msg_add_int(m, 2); /* 2 attributes */
	proxy_msg_add_keyval_string(m, ELEMENT_NAME_ATTR, name);
	proxy_msg_add_keyval_string(m, QUEUE_STATE_ATTR, state);

	return m;
}

/*
 * JOB CHANGE EVENT. Used to change attributes on a job.
 */
proxy_msg *
proxy_job_change_event(int trans_id, char *id_range, int num_attrs)
{
	proxy_msg *	m = new_proxy_msg(PROXY_EV_RT_JOB_CHANGE, trans_id);

	proxy_msg_add_int(m, 1); /* 1 id range */
	proxy_msg_add_string(m, id_range);
	proxy_msg_add_int(m, num_attrs);

	return m;
}

/*
 * MACHINE CHANGE EVENT. Used to change attributes on a machine.
 */
proxy_msg *
proxy_machine_change_event(int trans_id, char *id_range, int num_attrs)
{
	proxy_msg *	m = new_proxy_msg(PROXY_EV_RT_MACHINE_CHANGE, trans_id);

	proxy_msg_add_int(m, 1); /* 1 id range */
	proxy_msg_add_string(m, id_range);
	proxy_msg_add_int(m, num_attrs);

	return m;
}

/*
 * NODE CHANGE EVENT. Used to change attributes on a node.
 */
proxy_msg *
proxy_node_change_event(int trans_id, char *id_range, int num_attrs)
{
	proxy_msg *	m = new_proxy_msg(PROXY_EV_RT_NODE_CHANGE, trans_id);

	proxy_msg_add_int(m, 1); /* 1 id range */
	proxy_msg_add_string(m, id_range);
	proxy_msg_add_int(m, num_attrs);

	return m;
}

/*
 * PROCESS CHANGE EVENT. Used to change attributes on a process.
 */
proxy_msg *
proxy_process_change_event(int trans_id, char *id_range, int num_attrs)
{
	proxy_msg *m = new_proxy_msg(PROXY_EV_RT_PROCESS_CHANGE, trans_id);

	proxy_msg_add_int(m, 1); /* 1 id range */
	proxy_msg_add_string(m, id_range);
	proxy_msg_add_int(m, num_attrs);

	return m;
}

/*
 * QUEUE CHANGE EVENT. Used to change attributes on a queue.
 */
proxy_msg *
proxy_queue_change_event(int trans_id, char *id_range, int num_attrs)
{
	proxy_msg *m = new_proxy_msg(PROXY_EV_RT_QUEUE_CHANGE, trans_id);

	proxy_msg_add_int(m, 1); /* 1 id range */
	proxy_msg_add_string(m, id_range);
	proxy_msg_add_int(m, num_attrs);

	return m;
}

/*
 * REMOVE ALL EVENT. Used to remove all model elements.
 */
proxy_msg *
proxy_remove_all_event(int trans_id)
{
	return new_proxy_msg(PROXY_EV_RT_REMOVE_ALL, trans_id);
}

/*
 * REMOVE JOB EVENT. Used to remove job model elements.
 */
proxy_msg *
proxy_remove_job_event(int trans_id, char *id_range)
{
	proxy_msg *m = new_proxy_msg(PROXY_EV_RT_REMOVE_JOB, trans_id);

	proxy_msg_add_string(m, id_range);

	return m;
}

/*
 * REMOVE MACHINE EVENT. Used to remove machine model elements.
 */
proxy_msg *
proxy_remove_machine_event(int trans_id, char *id_range)
{
	proxy_msg *m = new_proxy_msg(PROXY_EV_RT_REMOVE_MACHINE, trans_id);

	proxy_msg_add_string(m, id_range);

	return m;
}

/*
 * REMOVE NODE EVENT. Used to remove node model elements.
 */
proxy_msg *
proxy_remove_node_event(int trans_id, char *id_range)
{
	proxy_msg *m = new_proxy_msg(PROXY_EV_RT_REMOVE_NODE, trans_id);

	proxy_msg_add_string(m, id_range);

	return m;
}

/*
 * REMOVE PROCESS EVENT. Used to remove process model elements.
 */
proxy_msg *
proxy_remove_process_event(int trans_id, char *id_range)
{
	proxy_msg *m = new_proxy_msg(PROXY_EV_RT_REMOVE_PROCESS, trans_id);

	proxy_msg_add_string(m, id_range);

	return m;
}

/*
 * REMOVE QUEUE EVENT. Used to remove queue model elements.
 */
proxy_msg *
proxy_remove_queue_event(int trans_id, char *id_range)
{
	proxy_msg *m = new_proxy_msg(PROXY_EV_RT_REMOVE_QUEUE, trans_id);

	proxy_msg_add_string(m, id_range);

	return m;
}
