mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2025-03-10 12:39:12 +02:00
85 lines
1.7 KiB
C
85 lines
1.7 KiB
C
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
|
||
|
#include "agent.h"
|
||
|
#include "session.h"
|
||
|
|
||
|
#include <tapi-device.h>
|
||
|
|
||
|
|
||
|
struct session
|
||
|
{
|
||
|
struct agent *agents[2];
|
||
|
|
||
|
struct tapi_device *tdev;
|
||
|
|
||
|
void (*release)(struct session *);
|
||
|
|
||
|
int link;
|
||
|
};
|
||
|
|
||
|
struct session *session_alloc(struct tapi_device *dev, struct agent *caller,
|
||
|
struct agent *callee, void (*release)(struct session *))
|
||
|
{
|
||
|
struct session *session;
|
||
|
int ret;
|
||
|
|
||
|
session = malloc(sizeof(*session));
|
||
|
|
||
|
session->tdev = dev;
|
||
|
|
||
|
session->agents[0] = caller;
|
||
|
session->agents[1] = callee;
|
||
|
|
||
|
ret = agent_invite(callee, session);
|
||
|
if (ret < 0) {
|
||
|
session_hangup(session, callee);
|
||
|
free(session);
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
session->release = release;
|
||
|
|
||
|
return session;
|
||
|
}
|
||
|
|
||
|
void session_accept(struct session *session, struct agent *agent)
|
||
|
{
|
||
|
int ep[2];
|
||
|
|
||
|
printf("session_accept: %p %p\n", session, agent);
|
||
|
printf("session agents: %p %p\n", session->agents[0], session->agents[1]);
|
||
|
printf("session tdev: %p\n", session->tdev);
|
||
|
|
||
|
agent_accept(session->agents[0], session);
|
||
|
|
||
|
ep[0] = agent_get_endpoint(session->agents[0], session);
|
||
|
ep[1] = agent_get_endpoint(session->agents[1], session);
|
||
|
session->link = tapi_link_alloc(session->tdev, ep[0], ep[1]);
|
||
|
|
||
|
printf("eps: %d %d\n", ep[0], ep[1]);
|
||
|
|
||
|
tapi_link_enable(session->tdev, session->link);
|
||
|
|
||
|
tapi_sync(session->tdev);
|
||
|
}
|
||
|
|
||
|
void session_hangup(struct session *session, struct agent *agent)
|
||
|
{
|
||
|
struct agent *other_agent;
|
||
|
|
||
|
if (session->agents[0] == agent)
|
||
|
other_agent = session->agents[1];
|
||
|
else
|
||
|
other_agent = session->agents[0];
|
||
|
|
||
|
agent_hangup(other_agent, session);
|
||
|
|
||
|
tapi_link_disable(session->tdev, session->link);
|
||
|
tapi_link_free(session->tdev, session->link);
|
||
|
tapi_sync(session->tdev);
|
||
|
|
||
|
if (session->release)
|
||
|
session->release(session);
|
||
|
}
|