Audit of ao2_iterator_init() usage for v1.8.
[asterisk/asterisk.git] / main / indications.c
index 0687648..b07de4b 100644 (file)
@@ -38,9 +38,23 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "asterisk/cli.h"
 #include "asterisk/module.h"
 #include "asterisk/astobj2.h"
+#include "asterisk/data.h"
 
 #include "asterisk/_private.h" /* _init(), _reload() */
 
+#define DATA_EXPORT_TONE_ZONE(MEMBER)                                  \
+       MEMBER(ast_tone_zone, country, AST_DATA_STRING)                 \
+       MEMBER(ast_tone_zone, description, AST_DATA_STRING)             \
+       MEMBER(ast_tone_zone, nrringcadence, AST_DATA_UNSIGNED_INTEGER)
+
+AST_DATA_STRUCTURE(ast_tone_zone, DATA_EXPORT_TONE_ZONE);
+
+#define DATA_EXPORT_TONE_ZONE_SOUND(MEMBER)                    \
+       MEMBER(ast_tone_zone_sound, name, AST_DATA_STRING)      \
+       MEMBER(ast_tone_zone_sound, data, AST_DATA_STRING)
+
+AST_DATA_STRUCTURE(ast_tone_zone_sound, DATA_EXPORT_TONE_ZONE_SOUND);
+
 /* Globals */
 static const char config[] = "indications.conf";
 
@@ -102,7 +116,7 @@ struct playtones_state {
        int npos;
        int oldnpos;
        int pos;
-       int origwfmt;
+       struct ast_format origwfmt;
        struct ast_frame f;
        unsigned char offset[AST_FRIENDLY_OFFSET];
        short data[4000];
@@ -113,7 +127,7 @@ static void playtones_release(struct ast_channel *chan, void *params)
        struct playtones_state *ps = params;
 
        if (chan) {
-               ast_set_write_format(chan, ps->origwfmt);
+               ast_set_write_format(chan, &ps->origwfmt);
        }
 
        if (ps->items) {
@@ -133,10 +147,10 @@ static void *playtones_alloc(struct ast_channel *chan, void *params)
                return NULL;
        }
 
-       ps->origwfmt = chan->writeformat;
+       ast_format_copy(&ps->origwfmt, &chan->writeformat);
 
-       if (ast_set_write_format(chan, AST_FORMAT_SLINEAR)) {
-               ast_log(LOG_WARNING, "Unable to set '%s' to signed linear format (write)\n", chan->name);
+       if (ast_set_write_format_by_id(chan, AST_FORMAT_SLINEAR)) {
+               ast_log(LOG_WARNING, "Unable to set '%s' to signed linear format (write)\n", ast_channel_name(chan));
                playtones_release(NULL, ps);
                ps = NULL;
        } else {
@@ -209,7 +223,7 @@ static int playtones_generator(struct ast_channel *chan, void *data, int len, in
        }
 
        ps->f.frametype = AST_FRAME_VOICE;
-       ps->f.subclass.codec = AST_FORMAT_SLINEAR;
+       ast_format_set(&ps->f.subclass.format, AST_FORMAT_SLINEAR, 0);
        ps->f.datalen = len;
        ps->f.samples = samples;
        ps->f.offset = AST_FRIENDLY_OFFSET;
@@ -402,12 +416,12 @@ struct ao2_iterator ast_tone_zone_iterator_init(void)
        return ao2_iterator_init(ast_tone_zones, 0);
 }
 
-/* Set global indication country */
+/*! \brief Set global indication country 
+   If no country is specified or we are unable to find the zone, then return not found */
 static int ast_set_indication_country(const char *country)
 {
        struct ast_tone_zone *zone = NULL;
 
-       /* If no country is specified or we are unable to find the zone, then return not found */
        if (ast_strlen_zero(country) || !(zone = ast_get_indication_zone(country))) {
                return -1;
        }
@@ -426,7 +440,7 @@ static int ast_set_indication_country(const char *country)
        return 0;
 }
 
-/* locate ast_tone_zone, given the country. if country == NULL, use the default country */
+/*! \brief locate ast_tone_zone, given the country. if country == NULL, use the default country */
 struct ast_tone_zone *ast_get_indication_zone(const char *country)
 {
        struct ast_tone_zone *tz = NULL;
@@ -516,7 +530,7 @@ static void ast_tone_zone_destructor(void *obj)
        }
 }
 
-/* add a new country, if country exists, it will be replaced. */
+/*! \brief add a new country, if country exists, it will be replaced. */
 static int ast_register_indication_country(struct ast_tone_zone *zone)
 {
        ao2_lock(ast_tone_zones);
@@ -532,7 +546,7 @@ static int ast_register_indication_country(struct ast_tone_zone *zone)
        return 0;
 }
 
-/* remove an existing country and all its indications, country must exist. */
+/*! \brief remove an existing country and all its indications, country must exist. */
 static int ast_unregister_indication_country(const char *country)
 {
        struct ast_tone_zone *tz = NULL;
@@ -596,7 +610,7 @@ static int ast_register_indication(struct ast_tone_zone *zone, const char *indic
        return 0;
 }
 
-/* remove an existing country's indication. Both country and indication must exist */
+/*! \brief remove an existing country's indication. Both country and indication must exist */
 static int ast_unregister_indication(struct ast_tone_zone *zone, const char *indication)
 {
        struct ast_tone_zone_sound *ts;
@@ -644,6 +658,7 @@ static char *complete_country(struct ast_cli_args *a)
                        break;
                }
        }
+       ao2_iterator_destroy(&i);
 
        return res;
 }
@@ -821,6 +836,7 @@ static char *handle_cli_indication_show(struct ast_cli_entry *e, int cmd, struct
                        ast_tone_zone_unlock(tz);
                        tz = ast_tone_zone_unref(tz);
                }
+               ao2_iterator_destroy(&iter);
                return CLI_SUCCESS;
        }
 
@@ -881,7 +897,8 @@ static int is_valid_tone_zone(struct ast_tone_zone *zone)
        return res;
 }
 
-/*!
+/*!\brief
+ *
  * \note This is called with the tone zone locked.
  */
 static void store_tone_zone_ring_cadence(struct ast_tone_zone *zone, const char *val)
@@ -980,7 +997,7 @@ static int parse_tone_zone(struct ast_config *cfg, const char *country)
        return 0;
 }
 
-/*!
+/*! \brief
  * Mark the zone and its tones before parsing configuration.  We will use this
  * to know what to remove after configuration is parsed.
  */
@@ -1002,7 +1019,7 @@ static int tone_zone_mark(void *obj, void *arg, int flags)
        return 0;
 }
 
-/*!
+/*! \brief
  * Prune tones no longer in the configuration, and have the tone zone unlinked
  * if it is no longer in the configuration at all.
  */
@@ -1102,6 +1119,33 @@ static int ast_tone_zone_cmp(void *obj, void *arg, int flags)
                        CMP_MATCH | CMP_STOP : 0;
 }
 
+int ast_tone_zone_data_add_structure(struct ast_data *tree, struct ast_tone_zone *zone)
+{
+       struct ast_data *data_zone_sound;
+       struct ast_tone_zone_sound *s;
+
+       ast_data_add_structure(ast_tone_zone, tree, zone);
+
+       if (AST_LIST_EMPTY(&zone->tones)) {
+               return 0;
+       }
+
+       data_zone_sound = ast_data_add_node(tree, "tones");
+       if (!data_zone_sound) {
+               return -1;
+       }
+
+       ast_tone_zone_lock(zone);
+
+       AST_LIST_TRAVERSE(&zone->tones, s, entry) {
+               ast_data_add_structure(ast_tone_zone_sound, data_zone_sound, s);
+       }
+
+       ast_tone_zone_unlock(zone);
+
+       return 0;
+}
+
 /*! \brief Load indications module */
 int ast_indications_init(void)
 {