session.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include "agent.h"
  4. #include "session.h"
  5. #include <tapi-device.h>
  6. struct session
  7. {
  8. struct agent *agents[2];
  9. struct tapi_device *tdev;
  10. void (*release)(struct session *);
  11. int link;
  12. };
  13. struct session *session_alloc(struct tapi_device *dev, struct agent *caller,
  14. struct agent *callee, void (*release)(struct session *))
  15. {
  16. struct session *session;
  17. int ret;
  18. session = malloc(sizeof(*session));
  19. session->tdev = dev;
  20. session->agents[0] = caller;
  21. session->agents[1] = callee;
  22. ret = agent_invite(callee, session);
  23. if (ret < 0) {
  24. session_hangup(session, callee);
  25. free(session);
  26. return NULL;
  27. }
  28. session->release = release;
  29. return session;
  30. }
  31. void session_accept(struct session *session, struct agent *agent)
  32. {
  33. int ep[2];
  34. printf("session_accept: %p %p\n", session, agent);
  35. printf("session agents: %p %p\n", session->agents[0], session->agents[1]);
  36. printf("session tdev: %p\n", session->tdev);
  37. agent_accept(session->agents[0], session);
  38. ep[0] = agent_get_endpoint(session->agents[0], session);
  39. ep[1] = agent_get_endpoint(session->agents[1], session);
  40. session->link = tapi_link_alloc(session->tdev, ep[0], ep[1]);
  41. printf("eps: %d %d\n", ep[0], ep[1]);
  42. tapi_link_enable(session->tdev, session->link);
  43. tapi_sync(session->tdev);
  44. }
  45. void session_hangup(struct session *session, struct agent *agent)
  46. {
  47. struct agent *other_agent;
  48. if (session->agents[0] == agent)
  49. other_agent = session->agents[1];
  50. else
  51. other_agent = session->agents[0];
  52. agent_hangup(other_agent, session);
  53. tapi_link_disable(session->tdev, session->link);
  54. tapi_link_free(session->tdev, session->link);
  55. tapi_sync(session->tdev);
  56. if (session->release)
  57. session->release(session);
  58. }