[asterisk-commits] file: branch file/bucket r395573 - in /team/file/bucket: include/asterisk/ ma...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Fri Jul 26 16:32:46 CDT 2013
Author: file
Date: Fri Jul 26 16:32:44 2013
New Revision: 395573
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=395573
Log:
Add the ability to get a JSON representation of a bucket.
Modified:
team/file/bucket/include/asterisk/bucket.h
team/file/bucket/include/asterisk/config_options.h
team/file/bucket/main/bucket.c
team/file/bucket/main/config_options.c
team/file/bucket/tests/test_bucket.c
Modified: team/file/bucket/include/asterisk/bucket.h
URL: http://svnview.digium.com/svn/asterisk/team/file/bucket/include/asterisk/bucket.h?view=diff&rev=395573&r1=395572&r2=395573
==============================================================================
--- team/file/bucket/include/asterisk/bucket.h (original)
+++ team/file/bucket/include/asterisk/bucket.h Fri Jul 26 16:32:44 2013
@@ -218,6 +218,18 @@
*/
void ast_bucket_observer_remove(struct ast_sorcery_observer *callbacks);
+/*!
+ * \brief Get a JSON representation of a bucket
+ *
+ * \param bucket The specific bucket
+ *
+ * \retval non-NULL success
+ * \retval NULL failure
+ *
+ * \note The returned ast_json object must be unreferenced using ast_json_unref
+ */
+struct ast_json *ast_bucket_json(const struct ast_bucket *bucket);
+
#if defined(__cplusplus) || defined(c_plusplus)
}
#endif
Modified: team/file/bucket/include/asterisk/config_options.h
URL: http://svnview.digium.com/svn/asterisk/team/file/bucket/include/asterisk/config_options.h?view=diff&rev=395573&r1=395572&r2=395573
==============================================================================
--- team/file/bucket/include/asterisk/config_options.h (original)
+++ team/file/bucket/include/asterisk/config_options.h Fri Jul 26 16:32:44 2013
@@ -53,6 +53,17 @@
ACO_EXACT = 1,
ACO_REGEX,
};
+
+
+/*! \brief A callback function for handling a particular option
+ * \param opt The option being configured
+ * \param var The config variable to use to configure \a obj
+ * \param obj The object to be configured
+ *
+ * \retval 0 Parsing and recording the config value succeeded
+ * \retval non-zero Failure. Parsing should stop and no reload applied
+ */
+typedef int (*aco_option_handler)(const struct aco_option *opt, struct ast_variable *var, void *obj);
/*! Callback functions for option parsing via aco_process_config() */
@@ -437,15 +448,21 @@
OPT_UINT_T,
};
-/*! \brief A callback function for handling a particular option
- * \param opt The option being configured
- * \param var The config variable to use to configure \a obj
- * \param obj The object to be configured
- *
- * \retval 0 Parsing and recording the config value succeeded
- * \retval non-zero Failure. Parsing should stop and no reload applied
- */
-typedef int (*aco_option_handler)(const struct aco_option *opt, struct ast_variable *var, void *obj);
+/*! \brief Configuration option structure */
+struct aco_option {
+ const char *name;
+ const char *aliased_to;
+ const char *default_val;
+ enum aco_matchtype match_type;
+ regex_t *name_regex;
+ struct aco_type **obj;
+ enum aco_option_type type;
+ aco_option_handler handler;
+ unsigned int flags;
+ unsigned char deprecated:1;
+ size_t argc;
+ intptr_t args[0];
+};
/*! \brief Allocate a container to hold config options */
struct ao2_container *aco_option_container_alloc(void);
Modified: team/file/bucket/main/bucket.c
URL: http://svnview.digium.com/svn/asterisk/team/file/bucket/main/bucket.c?view=diff&rev=395573&r1=395572&r2=395573
==============================================================================
--- team/file/bucket/main/bucket.c (original)
+++ team/file/bucket/main/bucket.c Fri Jul 26 16:32:44 2013
@@ -34,8 +34,10 @@
#include "asterisk/logger.h"
#include "asterisk/sorcery.h"
#include "asterisk/bucket.h"
+#include "asterisk/config_options.h"
#include "asterisk/astobj2.h"
#include "asterisk/strings.h"
+#include "asterisk/json.h"
/*! \brief Default scheme for when one is not specified */
#define DEFAULT_UNSPECIFIED_SCHEME "local"
@@ -339,6 +341,50 @@
return ast_sorcery_delete(bucket_sorcery, bucket);
}
+struct ast_json *ast_bucket_json(const struct ast_bucket *bucket)
+{
+ RAII_VAR(struct ast_json *, json, NULL, ast_json_unref);
+ struct ast_json *files, *buckets;
+ struct ao2_iterator i;
+ char *uri;
+
+ json = ast_sorcery_objectset_json_create(bucket_sorcery, bucket);
+ if (!json) {
+ return NULL;
+ }
+
+ buckets = ast_json_array_create();
+ if (!buckets) {
+ return NULL;
+ }
+
+ /* TODO: Below needs better error checking */
+
+ i = ao2_iterator_init(bucket->buckets, 0);
+ for (; (uri = ao2_iterator_next(&i)); ao2_ref(uri, -1)) {
+ ast_json_array_append(buckets, ast_json_string_create(uri));
+ }
+ ao2_iterator_destroy(&i);
+
+ ast_json_object_set(json, "buckets", buckets);
+
+ files = ast_json_array_create();
+ if (!files) {
+ return NULL;
+ }
+
+ i = ao2_iterator_init(bucket->files, 0);
+ for (; (uri = ao2_iterator_next(&i)); ao2_ref(uri, -1)) {
+ ast_json_array_append(files, ast_json_string_create(uri));
+ }
+ ao2_iterator_destroy(&i);
+
+ ast_json_object_set(json, "files", files);
+
+ ast_json_ref(json);
+ return json;
+}
+
/*! \brief Destructor for bucket files */
static void bucket_file_destroy(void *obj)
{
@@ -388,6 +434,20 @@
ast_sorcery_wizard_unregister(&bucket_file_wizard);
ao2_cleanup(schemes);
+}
+
+/*! \brief Custom handler for translating from a string timeval to actual structure */
+static int timeval_str2struct(const struct aco_option *opt, struct ast_variable *var, void *obj)
+{
+ struct timeval *field = (struct timeval *)(obj + opt->args[0]);
+ return ast_get_timeval(var->value, field, ast_tv(0, 0), NULL);
+}
+
+/*! \brief Custom handler for translating from an actual structure timeval to string */
+static int timeval_struct2str(const void *obj, const intptr_t *args, char **buf)
+{
+ struct timeval *field = (struct timeval *)(obj + args[0]);
+ return (ast_asprintf(buf, "%lu", field->tv_sec) < 0) ? -1 : 0;
}
/*! \brief Initialize bucket support */
@@ -425,6 +485,11 @@
goto failure;
}
+ ast_sorcery_object_field_register(bucket_sorcery, "bucket", "uri", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_bucket, uri));
+ ast_sorcery_object_field_register(bucket_sorcery, "bucket", "scheme", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_bucket, scheme));
+ ast_sorcery_object_field_register_custom(bucket_sorcery, "bucket", "created", "", timeval_str2struct, timeval_struct2str, 0, FLDSET(struct ast_bucket, created));
+ ast_sorcery_object_field_register_custom(bucket_sorcery, "bucket", "modified", "", timeval_str2struct, timeval_struct2str, 0, FLDSET(struct ast_bucket, modified));
+
if (ast_sorcery_apply_default(bucket_sorcery, "file", "bucket_file", NULL)) {
ast_log(LOG_ERROR, "Failed to apply intermediary for 'file' object type in Bucket sorcery\n");
goto failure;
Modified: team/file/bucket/main/config_options.c
URL: http://svnview.digium.com/svn/asterisk/team/file/bucket/main/config_options.c?view=diff&rev=395573&r1=395572&r2=395573
==============================================================================
--- team/file/bucket/main/config_options.c (original)
+++ team/file/bucket/main/config_options.c Fri Jul 26 16:32:44 2013
@@ -57,21 +57,6 @@
struct aco_type_internal {
regex_t *regex;
struct ao2_container *opts; /*!< The container of options registered to the aco_info */
-};
-
-struct aco_option {
- const char *name;
- const char *aliased_to;
- const char *default_val;
- enum aco_matchtype match_type;
- regex_t *name_regex;
- struct aco_type **obj;
- enum aco_option_type type;
- aco_option_handler handler;
- unsigned int flags;
- unsigned char deprecated:1;
- size_t argc;
- intptr_t args[0];
};
#ifdef AST_XML_DOCS
Modified: team/file/bucket/tests/test_bucket.c
URL: http://svnview.digium.com/svn/asterisk/team/file/bucket/tests/test_bucket.c?view=diff&rev=395573&r1=395572&r2=395573
==============================================================================
--- team/file/bucket/tests/test_bucket.c (original)
+++ team/file/bucket/tests/test_bucket.c Fri Jul 26 16:32:44 2013
@@ -289,6 +289,42 @@
return AST_TEST_PASS;
}
+AST_TEST_DEFINE(bucket_json)
+{
+ RAII_VAR(struct ast_bucket *, bucket, NULL, ao2_cleanup);
+ RAII_VAR(struct ast_json *, json, NULL, ast_json_unref);
+
+ switch (cmd) {
+ case TEST_INIT:
+ info->name = "bucket_json";
+ info->category = "/main/bucket/";
+ info->summary = "bucket json unit test";
+ info->description =
+ "Test creation of JSON for a bucket";
+ return AST_TEST_NOT_RUN;
+ case TEST_EXECUTE:
+ break;
+ }
+
+ if (!(bucket = ast_bucket_alloc("test:///tmp/bob"))) {
+ ast_test_status_update(test, "Failed to allocate bucket\n");
+ return AST_TEST_FAIL;
+ }
+
+ ast_str_container_add(bucket->buckets, "test:///tmp/bob/joe");
+ ast_str_container_add(bucket->files, "test:///tmp/bob/recording.wav");
+
+ json = ast_bucket_json(bucket);
+ if (!json) {
+ ast_test_status_update(test, "Could not produce JSON for a valid bucket\n");
+ return AST_TEST_FAIL;
+ }
+
+ /* TODO: Check contents of JSON against expected */
+
+ return AST_TEST_PASS;
+}
+
AST_TEST_DEFINE(bucket_retrieve)
{
RAII_VAR(struct ast_bucket *, bucket, NULL, ao2_cleanup);
@@ -321,6 +357,7 @@
AST_TEST_UNREGISTER(bucket_create);
AST_TEST_UNREGISTER(bucket_delete);
AST_TEST_UNREGISTER(bucket_retrieve);
+ AST_TEST_UNREGISTER(bucket_json);
return 0;
}
@@ -331,6 +368,7 @@
AST_TEST_REGISTER(bucket_create);
AST_TEST_REGISTER(bucket_delete);
AST_TEST_REGISTER(bucket_retrieve);
+ AST_TEST_REGISTER(bucket_json);
return AST_MODULE_LOAD_SUCCESS;
}
More information about the asterisk-commits
mailing list