res_pjsip_outbound_publish: Add module which provides outbound PUBLISH support.

This module implements the core parts required for doing outbound PUBLISH.
It takes care of configuration, lifetime management, and authentication.
Additional modules implement the specific events that are published.

Review: https://reviewboard.asterisk.org/r/3780/


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@420314 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Joshua Colp 2014-08-07 14:35:09 +00:00
parent 98af8fb715
commit ece78c6991
3 changed files with 1186 additions and 0 deletions

View File

@ -0,0 +1,165 @@
/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 2014, Digium, Inc.
*
* Joshua Colp <jcolp@digium.com>
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*/
#ifndef _RES_PJSIP_OUTBOUND_PUBLISH_H
#define _RES_PJSIP_OUTBOUND_PUBLISH_H
#include "asterisk/linkedlists.h"
/* Forward declarations */
struct ast_datastore;
struct ast_datastore_info;
/*!
* \brief Opaque structure representing outbound publish configuration
*/
struct ast_sip_outbound_publish;
/*!
* \brief Opaque structure representing an outbound publish client
*/
struct ast_sip_outbound_publish_client;
/*!
* \brief Callbacks that event publisher handlers will define
*/
struct ast_sip_event_publisher_handler {
/*! \brief The name of the event this handler deals with */
const char *event_name;
/*!
* \brief Called when a publisher should start publishing.
*
* \param configuration The outbound publish configuration, event-specific configuration
* is accessible using extended sorcery fields
* \param client The publish client that can be used to send PUBLISH messages.
* \retval 0 success
* \retval -1 failure
*/
int (*start_publishing)(struct ast_sip_outbound_publish *configuration,
struct ast_sip_outbound_publish_client *client);
/*!
* \brief Called when a publisher should stop publishing.
*
* \param client The publish client that was used to send PUBLISH messages.
* \retval 0 success
* \retval -1 failure
*/
int (*stop_publishing)(struct ast_sip_outbound_publish_client *client);
AST_LIST_ENTRY(ast_sip_event_publisher_handler) next;
};
/*!
* \brief Register an event publisher handler
*
* \retval 0 Handler was registered successfully
* \retval non-zero Handler was not registered successfully
*/
int ast_sip_register_event_publisher_handler(struct ast_sip_event_publisher_handler *handler);
/*!
* \brief Unregister a publish handler
*/
void ast_sip_unregister_event_publisher_handler(struct ast_sip_event_publisher_handler *handler);
/*!
* \brief Find a publish client using its name
*
* \param name The name of the publish client
*
* \retval NULL failure
* \retval non-NULL success
*
* \note The publish client is returned with its reference count increased and must be released using
* ao2_cleanup.
*/
struct ast_sip_outbound_publish_client *ast_sip_publish_client_get(const char *name);
/*!
* \brief Alternative for ast_datastore_alloc()
*
* There are two major differences between this and ast_datastore_alloc()
* 1) This allocates a refcounted object
* 2) This will fill in a uid if one is not provided
*
* DO NOT call ast_datastore_free() on a datastore allocated in this
* way since that function will attempt to free the datastore rather
* than play nicely with its refcount.
*
* \param info Callbacks for datastore
* \param uid Identifier for datastore
* \retval NULL Failed to allocate datastore
* \retval non-NULL Newly allocated datastore
*/
struct ast_datastore *ast_sip_publish_client_alloc_datastore(const struct ast_datastore_info *info, const char *uid);
/*!
* \brief Add a datastore to a SIP event publisher
*
* Note that SIP uses reference counted datastores. The datastore passed into this function
* must have been allocated using ao2_alloc() or there will be serious problems.
*
* \param client The publication client to add the datastore to
* \param datastore The datastore to be added to the subscription
* \retval 0 Success
* \retval -1 Failure
*/
int ast_sip_publish_client_add_datastore(struct ast_sip_outbound_publish_client *client,
struct ast_datastore *datastore);
/*!
* \brief Retrieve an event publisher datastore
*
* The datastore retrieved will have its reference count incremented. When the caller is done
* with the datastore, the reference counted needs to be decremented using ao2_ref().
*
* \param client The publication client from which to retrieve the datastore
* \param name The name of the datastore to retrieve
* \retval NULL Failed to find the specified datastore
* \retval non-NULL The specified datastore
*/
struct ast_datastore *ast_sip_publish_client_get_datastore(struct ast_sip_outbound_publish_client *client,
const char *name);
/*!
* \brief Remove a publication datastore from an event publisher
*
* This operation may cause the datastore's free() callback to be called if the reference
* count reaches zero.
*
* \param client The publication client to remove the datastore from
* \param name The name of the datastore to remove
*/
void ast_sip_publish_client_remove_datastore(struct ast_sip_outbound_publish_client *client,
const char *name);
/*!
* \brief Send an outgoing PUBLISH message using a client
*
* \param client The publication client to send from
* \param body An optional body to add to the PUBLISH
*
* \retval -1 failure
* \retval 0 success
*/
int ast_sip_publish_client_send(struct ast_sip_outbound_publish_client *client,
const struct ast_sip_body *body);
#endif /* RES_PJSIP_OUTBOUND_PUBLISH_H */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,6 @@
{
global:
LINKER_SYMBOL_PREFIXast_sip_*;
local:
*;
};