asterisk/res/stasis/app.h
Kevin Harwell ed48377994 ARI: Implement device state API
Created a data model and implemented functionality for an ARI device state
resource.  The following operations have been added that allow a user to
manipulate an ARI controlled device:

Create/Change the state of an ARI controlled device
PUT    /deviceStates/{deviceName}&{deviceState}

Retrieve all ARI controlled devices
GET    /deviceStates

Retrieve the current state of a device
GET    /deviceStates/{deviceName}

Destroy a device-state controlled by ARI
DELETE /deviceStates/{deviceName}

The ARI controlled device must begin with 'Stasis:'.  An example controlled
device name would be Stasis:Example.  A 'DeviceStateChanged' event has also
been added so that an application can subscribe and receive device change
events.  Any device state, ARI controlled or not, can be subscribed to.

While adding the event, the underlying subscription control mechanism was
refactored so that all current and future resource subscriptions would be
the same.  Each event resource must now register itself in order to be able
to properly handle [un]subscribes.

(issue ASTERISK-22838)
Reported by: Matt Jordan
Review: https://reviewboard.asterisk.org/r/3025/
........

Merged revisions 403134 from http://svn.asterisk.org/svn/asterisk/branches/12


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@403135 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-11-23 17:48:28 +00:00

230 lines
6.3 KiB
C

/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 2013, Digium, Inc.
*
* David M. Lee, II <dlee@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 _ASTERISK_RES_STASIS_APP_H
#define _ASTERISK_RES_STASIS_APP_H
/*! \file
*
* \brief Internal API for the Stasis application controller.
*
* \author David M. Lee, II <dlee@digium.com>
* \since 12
*/
#include "asterisk/channel.h"
#include "asterisk/stasis.h"
#include "asterisk/stasis_app.h"
/*!
* \brief Opaque pointer to \c res_stasis app structure.
*/
struct stasis_app;
/*!
* \brief Create a res_stasis application.
*
* \param name Name of the application.
* \param handler Callback for messages sent to the application.
* \param data Data pointer provided to the callback.
* \return New \c res_stasis application.
* \return \c NULL on error.
*/
struct stasis_app *app_create(const char *name, stasis_app_cb handler, void *data);
/*!
* \brief Tears down an application.
*
* It should be finished before calling this.
*
* \param app Application to unsubscribe.
*/
void app_shutdown(struct stasis_app *app);
/*!
* \brief Deactivates an application.
*
* Any channels currently in the application remain active (since the app might
* come back), but new channels are rejected.
*
* \param app Application to deactivate.
*/
void app_deactivate(struct stasis_app *app);
/*!
* \brief Checks whether an app is active.
*
* \param app Application to check.
* \return True (non-zero) if app is active.
* \return False (zero) if app has been deactivated.
*/
int app_is_active(struct stasis_app *app);
/*!
* \brief Checks whether a deactivated app has no channels.
*
* \param app Application to check.
* \param True (non-zero) if app is deactivated, and has no associated channels.
* \param False (zero) otherwise.
*/
int app_is_finished(struct stasis_app *app);
/*!
* \brief Update the handler and data for a \c res_stasis application.
*
* If app has been deactivated, this will reactivate it.
*
* \param app Application to update.
* \param handler New application callback.
* \param data New data pointer for the callback.
*/
void app_update(struct stasis_app *app, stasis_app_cb handler, void *data);
/*!
* \brief Return an application's name.
*
* \param app Application.
* \return Name of the application.
* \return \c NULL is \a app is \c NULL.
*/
const char *app_name(const struct stasis_app *app);
/*!
* \brief Send a message to an application.
*
* \param app Application.
* \param message Message to send.
*/
void app_send(struct stasis_app *app, struct ast_json *message);
struct app_forwards;
struct ast_json *app_to_json(const struct stasis_app *app);
/*!
* \brief Subscribes an application to a channel.
*
* \param app Application.
* \param chan Channel to subscribe to.
* \return 0 on success.
* \return Non-zero on error.
*/
int app_subscribe_channel(struct stasis_app *app, struct ast_channel *chan);
/*!
* \brief Cancel the subscription an app has for a channel.
*
* \param app Subscribing application.
* \param chan Channel to unsubscribe from.
* \return 0 on success.
* \return Non-zero on error.
*/
int app_unsubscribe_channel(struct stasis_app *app, struct ast_channel *chan);
/*!
* \brief Cancel the subscription an app has for a channel.
*
* \param app Subscribing application.
* \param channel_id Id of channel to unsubscribe from.
* \return 0 on success.
* \return Non-zero on error.
*/
int app_unsubscribe_channel_id(struct stasis_app *app, const char *channel_id);
/*!
* \brief Test if an app is subscribed to a channel.
*
* \param app Subscribing application.
* \param channel_id Id of channel to check.
* \return True (non-zero) if channel is subscribed to \a app.
* \return False (zero) if channel is not subscribed.
*/
int app_is_subscribed_channel_id(struct stasis_app *app, const char *channel_id);
/*!
* \brief Add a bridge subscription to an existing channel subscription.
*
* \param app Application.
* \param bridge Bridge to subscribe to.
* \return 0 on success.
* \return Non-zero on error.
*/
int app_subscribe_bridge(struct stasis_app *app, struct ast_bridge *bridge);
/*!
* \brief Cancel the bridge subscription for an application.
*
* \param forwards Return from app_subscribe_channel().
* \param bridge Bridge to subscribe to.
* \return 0 on success.
* \return Non-zero on error.
*/
int app_unsubscribe_bridge(struct stasis_app *app, struct ast_bridge *bridge);
/*!
* \brief Cancel the subscription an app has for a bridge.
*
* \param app Subscribing application.
* \param bridge_id Id of bridge to unsubscribe from.
* \return 0 on success.
* \return Non-zero on error.
*/
int app_unsubscribe_bridge_id(struct stasis_app *app, const char *bridge_id);
/*!
* \brief Test if an app is subscribed to a bridge.
*
* \param app Subscribing application.
* \param bridge_id Id of bridge to check.
* \return True (non-zero) if bridge is subscribed to \a app.
* \return False (zero) if bridge is not subscribed.
*/
int app_is_subscribed_bridge_id(struct stasis_app *app, const char *bridge_id);
/*!
* \brief Subscribes an application to a endpoint.
*
* \param app Application.
* \param chan Endpoint to subscribe to.
* \return 0 on success.
* \return Non-zero on error.
*/
int app_subscribe_endpoint(struct stasis_app *app, struct ast_endpoint *endpoint);
/*!
* \brief Cancel the subscription an app has for a endpoint.
*
* \param app Subscribing application.
* \param endpoint_id Id of endpoint to unsubscribe from.
* \return 0 on success.
* \return Non-zero on error.
*/
int app_unsubscribe_endpoint_id(struct stasis_app *app, const char *endpoint_id);
/*!
* \brief Test if an app is subscribed to a endpoint.
*
* \param app Subscribing application.
* \param endpoint_id Id of endpoint to check.
* \return True (non-zero) if endpoint is subscribed to \a app.
* \return False (zero) if endpoint is not subscribed.
*/
int app_is_subscribed_endpoint_id(struct stasis_app *app, const char *endpoint_id);
#endif /* _ASTERISK_RES_STASIS_APP_H */