You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

sip-message.h 5.4KB

10 maanden geleden
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #ifndef _sip_message_h_
  2. #define _sip_message_h_
  3. #include "sip-header.h"
  4. #include "sip-dialog.h"
  5. #include "http-parser.h"
  6. #include <stdint.h>
  7. #if defined(__cplusplus)
  8. extern "C" {
  9. #endif
  10. // 8.1.1.7 Via (p39)
  11. #define SIP_BRANCH_PREFIX "z9hG4bK"
  12. #define SIP_MAX_FORWARDS 70
  13. // https://en.wikipedia.org/wiki/List_of_SIP_request_methods
  14. #define SIP_METHOD_INVITE "INVITE"
  15. #define SIP_METHOD_CANCEL "CANCEL"
  16. #define SIP_METHOD_BYE "BYE"
  17. #define SIP_METHOD_ACK "ACK"
  18. #define SIP_METHOD_OPTIONS "OPTIONS"
  19. #define SIP_METHOD_REGISTER "REGISTER"
  20. #define SIP_METHOD_PRACK "PRACK" // rfc3262
  21. #define SIP_METHOD_INFO "INFO" // rfc2976/rfc6086
  22. #define SIP_METHOD_REFER "REFER" // rfc3515
  23. #define SIP_METHOD_MESSAGE "MESSAGE" // rfc3428
  24. #define SIP_METHOD_SUBSCRIBE "SUBSCRIBE" // rfc4660/rfc6665
  25. #define SIP_METHOD_NOTIFY "NOTIFY" // rfc4660/rfc6665
  26. #define SIP_METHOD_PUBLISH "PUBLISH" // rfc3903
  27. #define SIP_METHOD_UPDATE "UPDATE" // rfc3311
  28. #define SIP_HEADER_FROM "From"
  29. #define SIP_HEADER_TO "To"
  30. #define SIP_HEADER_CALLID "Call-ID"
  31. #define SIP_HEADER_CSEQ "CSeq"
  32. #define SIP_HEADER_MAX_FORWARDS "Max-Forwards"
  33. #define SIP_HEADER_VIA "Via"
  34. #define SIP_HEADER_CONTACT "Contact"
  35. #define SIP_HEADER_ROUTE "Route"
  36. #define SIP_HEADER_RECORD_ROUTE "Record-Route"
  37. #define SIP_HEADER_RSEQ "RSeq" // rfc3262
  38. #define SIP_HEADER_RACK "RAck" // rfc3262
  39. #define SIP_HEADER_REFER_TO "Refer-To" // rfc3515
  40. #define SIP_HEADER_RECV_INFO "Recv-Info" // rfc2976/rfc6086
  41. #define SIP_HEADER_INFO_PACKAGE "Info-Package" // rfc2976/rfc6086
  42. #define SIP_HEADER_EVENT "Event" // rfc3265/rfc6665
  43. #define SIP_HEADER_ALLOW_EVENTS "Allow-Events" // rfc3265/rfc6665
  44. #define SIP_HEADER_SUBSCRIBE_STATE "Subscription-State" // rfc3265/rfc6665
  45. #define SIP_HEADER_ABBR_FROM "f"
  46. #define SIP_HEADER_ABBR_TO "t"
  47. #define SIP_HEADER_ABBR_CALLID "i"
  48. #define SIP_HEADER_ABBR_VIA "v"
  49. #define SIP_HEADER_ABBR_CONTACT "m"
  50. #define SIP_HEADER_ABBR_SUPPORTED "k"
  51. #define SIP_HEADER_ABBR_SUBJECT "s"
  52. #define SIP_HEADER_ABBR_CONTENT_TYPE "c"
  53. #define SIP_HEADER_ABBR_CONTENT_LENGTH "l"
  54. #define SIP_HEADER_ABBR_CONTENT_ENCODING "e"
  55. #define SIP_HEADER_ABBR_REFER_TO "r"
  56. #define SIP_OPTION_TAG_100REL "100rel" // rfc3262
  57. #define SIP_HEADER_USER_AGENT "ireader/media-server"
  58. enum { SIP_MESSAGE_REQUEST = 0, SIP_MESSAGE_REPLY = 1 };
  59. struct sip_message_t
  60. {
  61. // request line
  62. int mode; // SIP_MESSAGE_REQUEST/SIP_MESSAGE_REPLY
  63. union
  64. {
  65. struct sip_requestline_t c;
  66. struct sip_statusline_t s;
  67. } u;
  68. // 6-headers
  69. struct sip_contact_t to;
  70. struct sip_contact_t from;
  71. struct sip_vias_t vias;
  72. struct cstring_t callid;
  73. struct sip_cseq_t cseq;
  74. int maxforwards;
  75. // contacts/routers
  76. struct sip_contacts_t contacts;
  77. struct sip_uris_t routers;
  78. struct sip_uris_t record_routers; // Record-Route
  79. // other headers
  80. uint32_t rseq; // [1, 2**31 - 1] PRACK
  81. struct cstring_t recv_info; // Info Method (invite)
  82. struct cstring_t info_package; // Info Method
  83. struct sip_contact_t referto; // Refer Method
  84. struct cstring_t event; // Subscribe/Notify Method
  85. struct cstring_t allow_events; // Subscribe/Notify Method
  86. struct sip_substate_t substate; // Subscribe/Notify Method (invite)
  87. struct sip_params_t headers;
  88. const void *payload;
  89. int size; // payload size in byte
  90. // internal use only
  91. struct
  92. {
  93. char* ptr;
  94. char* end;
  95. } ptr;
  96. };
  97. struct sip_message_t* sip_message_create(int mode);
  98. int sip_message_destroy(struct sip_message_t* msg);
  99. int sip_message_clone(struct sip_message_t* msg, const struct sip_message_t* clone);
  100. int sip_message_init(struct sip_message_t* msg, const char* method, const char* uri, const char* from, const char* to);
  101. int sip_message_init2(struct sip_message_t* msg, const char* method, const struct sip_dialog_t* dialog);
  102. int sip_message_init3(struct sip_message_t* reply, const struct sip_message_t* req, const struct sip_dialog_t* dialog);
  103. int sip_message_initack(struct sip_message_t* ack, const struct sip_message_t* origin);
  104. int sip_message_load(struct sip_message_t* msg, const struct http_parser_t* parser);
  105. int sip_message_write(const struct sip_message_t* msg, uint8_t* data, int bytes);
  106. /// @return 1-ack, 0-not ack
  107. int sip_message_isack(const struct sip_message_t* msg);
  108. int sip_message_isbye(const struct sip_message_t* msg);
  109. int sip_message_iscancel(const struct sip_message_t* msg);
  110. /// @return 1-invite, 0-noninvite
  111. int sip_message_isinvite(const struct sip_message_t* msg);
  112. int sip_message_isregister(const struct sip_message_t* msg);
  113. int sip_message_isrefer(const struct sip_message_t* msg);
  114. int sip_message_isnotify(const struct sip_message_t* msg);
  115. int sip_message_issubscribe(const struct sip_message_t* msg);
  116. int sip_message_set_uri(struct sip_message_t* msg, const char* uri);
  117. const struct sip_uri_t* sip_message_get_next_hop(const struct sip_message_t* msg);
  118. int sip_message_set_reply_default_contact(struct sip_message_t* reply);
  119. int sip_message_set_rport(struct sip_message_t* request, const char* addr, int port);
  120. int sip_message_get_header_count(const struct sip_message_t* msg);
  121. int sip_message_get_header(const struct sip_message_t* msg, int i, struct cstring_t* const name, struct cstring_t* const value);
  122. const struct cstring_t* sip_message_get_header_by_name(const struct sip_message_t* msg, const char* name);
  123. int sip_message_add_header(struct sip_message_t* msg, const char* name, const char* value);
  124. int sip_message_add_header_int(struct sip_message_t* msg, const char* name, int value);
  125. #if defined(__cplusplus)
  126. }
  127. #endif
  128. #endif /* !_sip_message_h_ */