/*******************************************************************************
 * Copyright (c) 2008 IBM Corporation.
 * 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
 *******************************************************************************/

#ifndef SDM_H_
#define SDM_H_

#define SDM_AGGREGATE_UPSTREAM		0x00000001
#define SDM_AGGREGATE_DOWNSTREAM	0x00000002
#define SDM_AGGREGATE_INIT			0x00000004
#define SDM_AGGREGATE_TIMEOUT		0x00000008

struct sdm_idset;
struct sdm_message;
struct sdm_aggregate;

typedef int						sdm_id;
typedef struct sdm_idset *		sdm_idset;
typedef struct sdm_message *	sdm_message;
typedef struct sdm_aggregate *	sdm_aggregate;

extern sdm_id	SDM_MASTER;

#include "routing_table.h"

/*
 * Startup/Initialization
 */
extern int sdm_init(int argc, char *argv[]);
extern int sdm_connect(const sdm_idset ids);
extern void sdm_finalize(void);
extern void sdm_progress(void);

/*
 * Communication
 */
extern int sdm_message_init(int argc, char *argv[]);
extern void sdm_message_finalize(void);
extern sdm_message sdm_message_new(char *buf, int len);
extern void sdm_message_free(sdm_message msg);
extern unsigned int sdm_message_get_id(const sdm_message msg);
extern void sdm_message_set_id(const sdm_message msg, const unsigned int id);
extern sdm_idset sdm_message_get_destination(const sdm_message msg);
extern sdm_aggregate sdm_message_get_aggregate(const sdm_message msg);
extern sdm_idset sdm_message_get_source(const sdm_message msg);
extern void sdm_message_set_source(const sdm_message msg, const sdm_idset src);
extern void sdm_message_get_payload(const sdm_message msg, char **buf, int *len);
extern int sdm_message_send(const sdm_message msg);
extern void sdm_message_set_send_callback(const sdm_message msg, void (*callback)(const sdm_message msg));
extern void sdm_message_set_recv_callback(void (*callback)(const sdm_message msg));
extern void sdm_message_set_deliver_callback(void (*callback)(const sdm_message msg));
extern int sdm_message_progress(void);
extern void	sdm_message_deliver(const sdm_message msg);

/*
 * Set operations
 */
extern sdm_idset sdm_set_new(void);
extern void sdm_set_free(sdm_idset set);
extern sdm_idset sdm_set_clear(sdm_idset set);
extern int sdm_set_size(const sdm_idset set);
extern sdm_idset sdm_set_add_element(const sdm_idset set, const sdm_id id);
extern sdm_idset sdm_set_remove_element(const sdm_idset set, const sdm_id id);
extern sdm_idset sdm_set_add_all(const sdm_idset set, const sdm_id id);
extern int sdm_set_is_subset(const sdm_idset set1, const sdm_idset set2);
extern int sdm_set_is_empty(const sdm_idset set);
extern int sdm_set_compare(const sdm_idset set1, const sdm_idset set2);
extern sdm_idset sdm_set_union(const sdm_idset set1, const sdm_idset set2);
extern sdm_idset sdm_set_intersect(const sdm_idset set1, const sdm_idset set2);
extern sdm_idset sdm_set_diff(const sdm_idset set1, const sdm_idset set2);
extern int sdm_set_contains(const sdm_idset set, const sdm_id id);
extern sdm_id sdm_set_max(const sdm_idset set);
extern sdm_id sdm_set_first(const sdm_idset set);
extern sdm_id sdm_set_next(const sdm_idset set);
extern int sdm_set_done(const sdm_idset set);
extern int sdm_set_serialize(const sdm_idset set, char *buf, char **end);
extern int sdm_set_serialized_length(const sdm_idset set);
extern int sdm_set_deserialize(sdm_idset set, char *str, char **end);
extern char *_set_to_str(const sdm_idset set);

/*
 * Routing
 */
extern int sdm_route_init(int argc, char *argv[]);
extern void sdm_route_finalize(void);
extern sdm_id sdm_route_get_parent(void);
extern sdm_id sdm_route_get_id(void);
extern void sdm_route_set_id(sdm_id id);
extern int sdm_route_get_size(void);
extern void sdm_route_set_size(int s);
extern sdm_idset sdm_route_get_route(const sdm_idset dest);
extern sdm_idset sdm_route_reachable(const sdm_idset dest);

/*
 * Aggregation
 */
extern int sdm_aggregate_init(int argc, char *argv[]);
extern void	sdm_aggregate_finalize(void);
extern sdm_aggregate sdm_aggregate_new(void);
extern void sdm_aggregate_free(sdm_aggregate a);
extern int sdm_aggregate_serialize(const sdm_aggregate a, char *buf, char **end);
extern int sdm_aggregate_serialized_length(const sdm_aggregate a);
extern int sdm_aggregate_deserialize(sdm_aggregate a, char *str, char **end);
extern void sdm_aggregate_copy(const sdm_aggregate a1, const sdm_aggregate a2);
extern void sdm_aggregate_set_completion_callback(int (*callback)(const sdm_message msg));
extern void sdm_aggregate_set_value(const sdm_aggregate a, int type, ...);
extern void sdm_aggregate_message(const sdm_message msg, unsigned int flags);
extern void	sdm_aggregate_progress(void);
extern char * _aggregate_to_str(sdm_aggregate a);

/*
 * I/O forwarding
 */
extern int sdm_iof_set_stdin_handler(int fd_in, int fd_out, int (*stdin_handler)(int fd_in, int fd_out));
extern int sdm_iof_set_stdout_handler(int fd_in, int fd_out, int (*stdout_handler)(int fd_in, int fd_out));
extern int sdm_iof_set_stderr_handler(int fd_in, int fd_out, int (*stderr_handler)(int fd_in, int fd_out));

#endif /* SDM_H_ */
