/*****************************************************************************\
**                                                                           **
** PBX4Linux                                                                 **
**                                                                           **
**---------------------------------------------------------------------------**
** Copyright: Andreas Eversberg                                              **
**                                                                           **
** join functions                                                            **
**                                                                           **
\*****************************************************************************/ 

#include "main.h"
//#define __u8 unsigned char
//#define __u16 unsigned short
//#define __u32 unsigned int

unsigned int join_serial = 1; /* must be 1, because 0== no join */

//JOIN_STATES

class Join *join_first = NULL;

/*
 * find the join with join_id
 */ 
class Join *find_join_id(unsigned int join_id)
{
	class Join *join = join_first;

	while(join)
	{
//printf("comparing: '%s' with '%s'\n", name, join->j_name);
		if (join->j_serial == join_id)
			return(join);
		join = join->next;
	}

	return(NULL);
}


/*
 * constructor for a new join 
 */
Join::Join(void)
{
	class Join **joinp;

	j_serial = join_serial++;
	j_type = JOIN_TYPE_NONE;

	/* attach to chain */
	next = NULL;
	joinp = &join_first;
	while(*joinp)
		joinp = &((*joinp)->next);
	*joinp = this;

	classuse++;
}


/*
 * join descructor
 */
Join::~Join()
{
	class Join *cl, **clp;

	classuse--;

	cl = join_first;
	clp = &join_first;
	while(cl)
	{
		if (cl == this)
			break;
		clp = &cl->next;
		cl = cl->next;
	}
	if (!cl)
		FATAL("software error, join not in chain!\n");
	*clp = cl->next; /* detach from chain */
}



/* epoint sends a message to a join
 *
 */
void Join::message_epoint(unsigned int epoint_id, int message_type, union parameter *param)
{
}


/* join process is called from the main loop
 * it processes the current calling state.
 * returns 0 if nothing was done
 */
int Join::handler(void)
{
	return(0);
}

/* free all join structures */
void join_free(void)
{

	if (!join_first)
	{
		PDEBUG(DEBUG_JOIN, "no more pending join(s), done!\n");
		return;
	}
	while(join_first)
	{
		if (options.deb & DEBUG_JOIN)
		{
			PDEBUG(DEBUG_JOIN, "freeing pending join\n");
		}

		delete join_first;
	}
}



