[package]: block-extroot: Fixed hang when no modules in on either squashfs or jffs2...
[openwrt.git] / package / tapi_sip / src / session.c
1 #include <stdlib.h>
2 #include <stdio.h>
3
4 #include "agent.h"
5 #include "session.h"
6
7 #include <tapi-device.h>
8
9
10 struct session
11 {
12         struct agent *agents[2];
13
14         struct tapi_device *tdev;
15
16         void (*release)(struct session *);
17
18         int link;
19 };
20
21 struct session *session_alloc(struct tapi_device *dev, struct agent *caller,
22         struct agent *callee, void (*release)(struct session *))
23 {
24         struct session *session;
25         int ret;
26
27         session = malloc(sizeof(*session));
28
29         session->tdev = dev;
30
31         session->agents[0] = caller;
32         session->agents[1] = callee;
33
34         ret = agent_invite(callee, session);
35         if (ret < 0) {
36                 session_hangup(session, callee);
37                 free(session);
38                 return NULL;
39         }
40
41         session->release = release;
42
43         return session;
44 }
45
46 void session_accept(struct session *session, struct agent *agent)
47 {
48         int ep[2];
49
50         printf("session_accept: %p %p\n", session, agent);
51         printf("session agents: %p %p\n", session->agents[0], session->agents[1]);
52         printf("session tdev: %p\n", session->tdev);
53
54         agent_accept(session->agents[0], session);
55
56         ep[0] = agent_get_endpoint(session->agents[0], session);
57         ep[1] = agent_get_endpoint(session->agents[1], session);
58         session->link = tapi_link_alloc(session->tdev, ep[0], ep[1]);
59
60         printf("eps: %d %d\n", ep[0], ep[1]);
61
62         tapi_link_enable(session->tdev, session->link);
63
64         tapi_sync(session->tdev);
65 }
66
67 void session_hangup(struct session *session, struct agent *agent)
68 {
69         struct agent *other_agent;
70
71         if (session->agents[0] == agent)
72                 other_agent = session->agents[1];
73         else
74                 other_agent = session->agents[0];
75
76         agent_hangup(other_agent, session);
77
78         tapi_link_disable(session->tdev, session->link);
79         tapi_link_free(session->tdev, session->link);
80         tapi_sync(session->tdev);
81
82         if (session->release)
83                 session->release(session);
84 }