summaryrefslogtreecommitdiff
path: root/package/tapi_sip/src/tapi_agent.c
diff options
context:
space:
mode:
Diffstat (limited to 'package/tapi_sip/src/tapi_agent.c')
-rw-r--r--package/tapi_sip/src/tapi_agent.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/package/tapi_sip/src/tapi_agent.c b/package/tapi_sip/src/tapi_agent.c
new file mode 100644
index 0000000..93c73c2
--- /dev/null
+++ b/package/tapi_sip/src/tapi_agent.c
@@ -0,0 +1,105 @@
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <tapi-port.h>
+
+#include "session.h"
+#include "agent.h"
+#include "tapi_agent.h"
+
+static int tapi_agent_invite(struct agent *agent, struct session *session)
+{
+ struct tapi_agent *tagent = agent_to_tapi_agent(agent);
+
+ if (tagent->session)
+ return -1;
+
+ tagent->state = TAPI_AGENT_STATE_RINGING;
+ tapi_port_set_ring(&tagent->port, true);
+
+ tagent->session = session;
+
+ return 0;
+}
+
+static int tapi_agent_accept(struct agent *agent, struct session *session)
+{
+ return 0;
+}
+
+static int tapi_agent_hangup(struct agent *agent, struct session *session)
+{
+ struct tapi_agent *tagent = agent_to_tapi_agent(agent);
+
+ switch (tagent->state) {
+ case TAPI_AGENT_STATE_RINGING:
+ tapi_port_set_ring(&tagent->port, false);
+ break;
+ default:
+ break;
+ }
+
+ tagent->state = TAPI_AGENT_STATE_IDLE;
+ tagent->session = NULL;
+
+ return 0;
+}
+
+static int tapi_agent_get_endpoint(struct agent *agent, struct session *session)
+{
+ struct tapi_agent *tagent = agent_to_tapi_agent(agent);
+ return tapi_port_get_endpoint(&tagent->port);
+}
+
+static const struct agent_ops tapi_agent_ops = {
+ .invite = tapi_agent_invite,
+ .accept = tapi_agent_accept,
+ .hangup = tapi_agent_hangup,
+ .get_endpoint = tapi_agent_get_endpoint,
+};
+
+static void tapi_agent_event(struct tapi_port *port, struct tapi_event *event,
+ void *data)
+{
+ struct tapi_agent *tagent = data;
+
+ if (event->type != TAPI_EVENT_TYPE_HOOK)
+ return;
+
+ if (!tagent->session)
+ return;
+
+ if (event->hook.on) {
+ session_hangup(tagent->session, &tagent->agent);
+ tagent->state = TAPI_AGENT_STATE_IDLE;
+ tagent->session = NULL;
+ } else {
+ session_accept(tagent->session, &tagent->agent);
+ tagent->state = TAPI_AGENT_STATE_ACTIVE;
+ }
+}
+
+void tapi_agent_init(struct tapi_device *tdev, int port, struct tapi_agent *tagent)
+{
+ int ret;
+
+ tagent->agent.ops = &tapi_agent_ops;
+ tagent->state = TAPI_AGENT_STATE_IDLE;
+ tagent->session = NULL;
+
+ ret = tapi_port_open(tdev, port, &tagent->port);
+ if (ret) {
+ printf("Failed to open tapi port %d: %d\n", port, ret);
+ return;
+ }
+
+ tagent->event_listener.callback = tapi_agent_event;
+ tagent->event_listener.data = tagent;
+
+ tapi_port_register_event(&tagent->port, &tagent->event_listener);
+}
+
+void tapi_agent_free(struct tapi_agent *tagent)
+{
+ tapi_port_unregister_event(&tagent->port, &tagent->event_listener);
+}