[asterisk-commits] mmichelson: branch mmichelson/rls-config r416659 - /team/mmichelson/rls-confi...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed Jun 18 17:44:13 CDT 2014
Author: mmichelson
Date: Wed Jun 18 17:44:10 2014
New Revision: 416659
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=416659
Log:
Implement list configuration logic.
Modified:
team/mmichelson/rls-config/res/res_pjsip_pubsub.c
Modified: team/mmichelson/rls-config/res/res_pjsip_pubsub.c
URL: http://svnview.digium.com/svn/asterisk/team/mmichelson/rls-config/res/res_pjsip_pubsub.c?view=diff&rev=416659&r1=416658&r2=416659
==============================================================================
--- team/mmichelson/rls-config/res/res_pjsip_pubsub.c (original)
+++ team/mmichelson/rls-config/res/res_pjsip_pubsub.c Wed Jun 18 17:44:10 2014
@@ -257,6 +257,20 @@
};
/*!
+ * \brief Resource list configuration item
+ */
+struct resource_list {
+ /*! SIP event package the list uses. */
+ char event[32];
+ /*! Strings representing resources in the list. */
+ AST_VECTOR(, const char *) items;
+ /*! Indicates if Asterisk sends full or partial state on notifications. */
+ unsigned int full_state;
+ /*! Time, in milliseconds Asterisk waits before sending a batched notification.*/
+ unsigned int notification_batch_interval;
+};
+
+/*!
* Used to create new entity IDs by ESCs.
*/
static int esc_etag_counter;
@@ -1914,6 +1928,79 @@
return (ast_asprintf(buf, "%ld", persistence->expires.tv_sec) < 0) ? -1 : 0;
}
+#define RESOURCE_LIST_INIT_SIZE 4
+
+static void resource_list_destructor(void *obj)
+{
+ struct resource_list *list = obj;
+
+ AST_VECTOR_FREE(&list->items);
+}
+
+static void *resource_list_alloc(const char *name)
+{
+ struct resource_list *list;
+
+ list = ast_sorcery_generic_alloc(sizeof(*list), resource_list_destructor);
+ if (!list) {
+ return NULL;
+ }
+
+ if (AST_VECTOR_INIT(&list->items, RESOURCE_LIST_INIT_SIZE)) {
+ ao2_cleanup(list);
+ return NULL;
+ }
+
+ return list;
+}
+
+static int list_item_handler(const struct aco_option *opt,
+ struct ast_variable *var, void *obj)
+{
+ struct resource_list *list = obj;
+
+ return AST_VECTOR_APPEND(&list->items, var->value);
+}
+
+static int list_item_to_str(const void *obj, const intptr_t *args, char **buf)
+{
+ const struct resource_list *list = obj;
+ int i;
+ struct ast_str *str = ast_str_create(32);
+
+ for (i = 0; i < AST_VECTOR_SIZE(&list->items); ++i) {
+ ast_str_append(&str, 0, "%s,", AST_VECTOR_GET(&list->items, i));
+ }
+
+ /* Chop off trailing comma */
+ ast_str_truncate(str, -1);
+ *buf = ast_strdup(ast_str_buffer(str));
+ return 0;
+}
+
+static int apply_list_configuration(struct ast_sorcery *sorcery)
+{
+ ast_sorcery_apply_default(sorcery, "resource_list", "config",
+ "pjsip.conf,criteria=type=resource_list");
+ if (ast_sorcery_object_register(sorcery, "resource_list", resource_list_alloc,
+ NULL, NULL)) {
+ return -1;
+ }
+
+ ast_sorcery_object_field_register(sorcery, "resource_list", "type", "",
+ OPT_NOOP_T, 0, 0);
+ ast_sorcery_object_field_register(sorcery, "resource_list", "event", "",
+ OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct resource_list, event));
+ ast_sorcery_object_field_register(sorcery, "resource_list", "full_state", "0",
+ OPT_UINT_T, 0, FLDSET(struct resource_list, full_state));
+ ast_sorcery_object_field_register(sorcery, "resource_list", "notification_batch_interval",
+ "0", OPT_UINT_T, 0, FLDSET(struct resource_list, notification_batch_interval));
+ ast_sorcery_object_field_register_custom(sorcery, "resource_list", "list_item",
+ "", list_item_handler, list_item_to_str, NULL, 0, 0);
+
+ return 0;
+}
+
static int load_module(void)
{
static const pj_str_t str_PUBLISH = { "PUBLISH", 7 };
@@ -1970,6 +2057,11 @@
ast_sorcery_object_field_register_custom(sorcery, "subscription_persistence", "expires", "",
persistence_expires_str2struct, persistence_expires_struct2str, NULL, 0, 0);
+ if (apply_list_configuration(sorcery)) {
+ ast_sip_unregister_service(&pubsub_module);
+ ast_sched_context_destroy(sched);
+ }
+
if (ast_test_flag(&ast_options, AST_OPT_FLAG_FULLY_BOOTED)) {
ast_sip_push_task(NULL, subscription_persistence_load, NULL);
} else {
More information about the asterisk-commits
mailing list