/* -*- c -*- */ /**@MODULEPAGE "nea" - SIP Events Module * * @section nea_meta Module Meta Information * * Sofia Event API provides an interface to different events used in SIP * presence and conferencing. Interface used both in client and server sides * is presented in . * * @CONTACT Pekka Pessi * * @STATUS @SofiaSIP Core library * * @LICENSE LGPL * * @section Creating NEA server and events * * @section nea_server_create Creating NEA server * * NEA server generates, receives and sends events to subscribed * parties. The server is presentity specific, ie. a different server * is created for every presentity. * * First, a server object is created. The object uses the NTA @e agent * (#nta_agent_t) that handles incoming and outgoing SIP messages. * * The example below provides a way to create the NEA server. The * function nea_server_create() creates the server. Parameters @e * agent, @e root define the transaction engine. Third parameter is * the address of the presentity. event_callback is a callback * function pointer and is called every time a new user subscribes to * an event that does not exist or requests for payload type that * doesn't match. * * @code * presence_t *presence_create(su_root_t *root, * nta_agent_t *agent, * sip_contact_t const *m) * { * presentity_t *pr = su_home_clone(p->p_home, sizeof (*pr)); * ... * pr->pr_nes = * nea_server_create(agent, root, * m->m_url, * MAX_SUBSCRIBERS, * event_callback, pr, * SIPTAG_CONTACT(m), * SIPTAG_SERVER_STR("Sofia-SIP NEA"), * TAG_NULL()); * ... * } * @endcode * * @section nea_event_create Creating Events * * Next, events are created. The function nea_event_create () defines * an event, its package and content types (a comma separated * list). The parameter presence_callback defines the callback * function that is called when a someone subscribes to a defined * event. * * @code * #define PRESENCE_PACKAGE "presence" * #define XPIDF_MIME_TYPE "application/xpidf+xml" * #define PIDF_MIME_TYPE "application/cpim-pidf+xml" * ne = nea_event_create(pr->pr_nes, presence_callback, ep, * PRESENCE_PACKAGE, NULL, * PIDF_MIME_TYPE, * PIDF_MIME_TYPE "," XPIDF_MIME_TYPE); * @endcode * * @section nea_server_update Operating with event payloads * * A new payload can be inserted to a event with the function * nea_server_update(). The 4th parameter describes if the updated * content is a fake (for unauthorized subscribers). A real payload is * inserted (updated) with the 4th parameter being 0. If the event is * not updated with the content type @a ct before, a new content type * format for the event is created. Otherwise the old payload is * replaced with the new one. * * After the update, subscribers of the event are notified (with SIP * NOTIFY) of the changed payload with nea_server_update (). * * @code * nea_server_update(pr->pr_nes, home, event, 1, * SIPTAG_CONTENT_TYPE(ct), * SIPTAG_PAYLOAD(pl), * TAG_END()); * nea_server_notify(pr->pr_nes, event); * @endcode * * Obtaining the event's payload and removing it is presented in the * example below. The event is defined as a part of the @a package_t * structure. Function nea_payloads_get() is used to return a payload * (in this case content type being predefined * "application/cpim-pidf+xml"). The real and fake payloads are stored * in the structure #nea_payloads_t. Finally, the payload is removed * with nea_payload_remove(). * * @code * int remove_old_payload(package_t *ep) * { * nea_payloads_t *np; * sip_content_type_t *ct; * sip_payload_t *real; * sip_payload_t *fake; * event = ep->ep_event; * np = nea_payloads_get(event, PIDF_MIME_TYPE); * ct = nea_content_type_get(np); * real = nea_payload_get(np); * fake = nea_fake_get(np); * nea_payload_remove(ep->ep_home, np); * return 0; * } * @endcode */