2007-05-06 13:54:52 +00:00
|
|
|
/*****************************************************************************\
|
|
|
|
** **
|
|
|
|
** PBX4Linux **
|
|
|
|
** **
|
|
|
|
**---------------------------------------------------------------------------**
|
|
|
|
** Copyright: Andreas Eversberg **
|
|
|
|
** **
|
|
|
|
** call functions **
|
|
|
|
** **
|
|
|
|
\*****************************************************************************/
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
//#include <string.h>
|
|
|
|
//#include <stdlib.h>
|
|
|
|
//#include <unistd.h>
|
|
|
|
//#include <poll.h>
|
|
|
|
//#include <sys/types.h>
|
|
|
|
//#include <sys/stat.h>
|
|
|
|
//#include <fcntl.h>
|
|
|
|
#include "main.h"
|
|
|
|
//#define __u8 unsigned char
|
|
|
|
//#define __u16 unsigned short
|
|
|
|
//#define __u32 unsigned long
|
|
|
|
//#include "linux/isdnif.h"
|
|
|
|
|
|
|
|
unsigned long call_serial = 1; /* must be 1, because 0== no call */
|
|
|
|
|
|
|
|
//CALL_STATES
|
|
|
|
|
|
|
|
class Call *call_first = NULL;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* find the call with call_id
|
|
|
|
*/
|
|
|
|
class Call *find_call_id(unsigned long call_id)
|
|
|
|
{
|
|
|
|
class Call *call = call_first;
|
|
|
|
|
|
|
|
while(call)
|
|
|
|
{
|
|
|
|
//printf("comparing: '%s' with '%s'\n", name, call->c_name);
|
|
|
|
if (call->c_serial == call_id)
|
|
|
|
return(call);
|
|
|
|
call = call->next;
|
|
|
|
}
|
|
|
|
|
|
|
|
return(NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* constructor for a new call
|
|
|
|
*/
|
2007-07-15 10:01:27 +00:00
|
|
|
Call::Call(void)
|
2007-05-06 13:54:52 +00:00
|
|
|
{
|
|
|
|
class Call **callp;
|
|
|
|
|
|
|
|
c_serial = call_serial++;
|
|
|
|
c_type = CALL_TYPE_NONE;
|
|
|
|
|
|
|
|
/* attach to chain */
|
|
|
|
next = NULL;
|
|
|
|
callp = &call_first;
|
|
|
|
while(*callp)
|
|
|
|
callp = &((*callp)->next);
|
|
|
|
*callp = this;
|
|
|
|
|
|
|
|
classuse++;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* call descructor
|
|
|
|
*/
|
|
|
|
Call::~Call()
|
|
|
|
{
|
|
|
|
class Call *cl, **clp;
|
|
|
|
|
|
|
|
classuse--;
|
|
|
|
|
|
|
|
cl = call_first;
|
|
|
|
clp = &call_first;
|
|
|
|
while(cl)
|
|
|
|
{
|
|
|
|
if (cl == this)
|
|
|
|
break;
|
|
|
|
clp = &cl->next;
|
|
|
|
cl = cl->next;
|
|
|
|
}
|
|
|
|
if (!cl)
|
2007-07-15 10:01:27 +00:00
|
|
|
FATAL("software error, call not in chain!\n");
|
2007-05-06 13:54:52 +00:00
|
|
|
*clp = cl->next; /* detach from chain */
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* epoint sends a message to a call
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void Call::message_epoint(unsigned long epoint_id, int message_type, union parameter *param)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* call process is called from the main loop
|
|
|
|
* it processes the current calling state.
|
|
|
|
* returns 0 if call nothing was done
|
|
|
|
*/
|
|
|
|
int Call::handler(void)
|
|
|
|
{
|
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* free all call structures */
|
|
|
|
void call_free(void)
|
|
|
|
{
|
|
|
|
|
|
|
|
if (!call_first)
|
|
|
|
{
|
|
|
|
PDEBUG(DEBUG_CALL, "no more pending call(s), done!\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
while(call_first)
|
|
|
|
{
|
|
|
|
if (options.deb & DEBUG_CALL)
|
|
|
|
{
|
|
|
|
PDEBUG(DEBUG_CALL, "freeing pending call\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
delete call_first;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|