fe1ff8462287071bbab49f3c5f3c44ba1edcef05
[asterisk/asterisk.git] / include / asterisk / datastore.h
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2007 - 2008, Digium, Inc.
5  *
6  * See http://www.asterisk.org for more information about
7  * the Asterisk project. Please do not directly contact
8  * any of the maintainers of this project for assistance;
9  * the project provides a web site, mailing lists and IRC
10  * channels for your use.
11  *
12  * This program is free software, distributed under the terms of
13  * the GNU General Public License Version 2. See the LICENSE file
14  * at the top of the source tree.
15  */
16
17 /*! \file
18  * \brief Asterisk datastore objects
19  */
20
21 #ifndef _ASTERISK_DATASTORE_H
22 #define _ASTERISK_DATASTORE_H
23
24 #if defined(__cplusplus) || defined(c_plusplus)
25 extern "C" {
26 #endif
27
28 #include "asterisk/linkedlists.h"
29
30 #define DATASTORE_INHERIT_FOREVER       INT_MAX
31
32 /*! \brief Structure for a data store type */
33 struct ast_datastore_info {
34         const char *type;                       /*!< Type of data store */
35         void *(*duplicate)(void *data);         /*!< Duplicate item data (used for inheritance) */
36         void (*destroy)(void *data);            /*!< Destroy function */
37
38         /*!
39          * \brief Fix up channel references
40          *
41          * \arg data The datastore data
42          * \arg old_chan The old channel owning the datastore
43          * \arg new_chan The new channel owning the datastore
44          *
45          * This is exactly like the fixup callback of the channel technology interface.
46          * It allows a datastore to fix any pointers it saved to the owning channel
47          * in case that the owning channel has changed.  Generally, this would happen
48          * when the datastore is set to be inherited, and a masquerade occurs.
49          *
50          * \return nothing.
51          */
52         void (*chan_fixup)(void *data, struct ast_channel *old_chan, struct ast_channel *new_chan);
53 };
54
55 /*! \brief Structure for a data store object */
56 struct ast_datastore {
57         const char *uid;                        /*!< Unique data store identifier */
58         void *data;                             /*!< Contained data */
59         const struct ast_datastore_info *info;  /*!< Data store type information */
60         unsigned int inheritance;               /*!< Number of levels this item will continue to be inherited */
61         AST_LIST_ENTRY(ast_datastore) entry;    /*!< Used for easy linking */
62 };
63
64 /*! 
65  * \brief Create a data store object
66  */
67 struct ast_datastore *ast_datastore_alloc(const struct ast_datastore_info *info, const char *uid);
68
69 /*!
70  * \brief Free a data store object
71  */
72 int ast_datastore_free(struct ast_datastore *datastore);
73
74 #if defined(__cplusplus) || defined(c_plusplus)
75 }
76 #endif
77
78 #endif /* _ASTERISK_DATASTORE_H */