Author: file
Date: Tue Jul 30 06:55:57 2013
New Revision: 395726

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=395726
Log:
Reduce duplicated URI parsing code, and make it easier to change.

Modified:
    team/file/bucket/main/bucket.c

Modified: team/file/bucket/main/bucket.c
URL: 
http://svnview.digium.com/svn/asterisk/team/file/bucket/main/bucket.c?view=diff&rev=395726&r1=395725&r2=395726
==============================================================================
--- team/file/bucket/main/bucket.c (original)
+++ team/file/bucket/main/bucket.c Tue Jul 30 06:55:57 2013
@@ -71,6 +71,48 @@
        char name[0];
 };
 
+/*!
+ * \brief Simple URI parser
+ *
+ * \param uri Full URI
+ * \param scheme The scheme in the URI
+ * \param name The name of the object in the URI
+ *
+ * \retval 0 success
+ * \retval -1 failure
+ *
+ * \note The URI passed in will be modified
+ */
+static int bucket_uri_parse(char *uri, char **scheme, char **name)
+{
+       char *tmp;
+
+       /* If no URI has been specified this is invalid */
+       if (ast_strlen_zero(uri)) {
+               return -1;
+       }
+
+       *scheme = DEFAULT_UNSPECIFIED_SCHEME;
+       *name = NULL;
+
+       /* Assume the naming starts at the front until proven otherwise */
+       *name = uri;
+
+       /* Determine the scheme from the provided URI */
+       if ((tmp = strstr(uri, "://"))) {
+               *scheme = uri;
+               *tmp++ = '\0';
+               *name = tmp;
+       }
+
+       /* Determine the name */
+       if ((tmp = strrchr(*name, '/'))) {
+               *name = tmp + 1;
+       }
+
+       return 0;
+}
+
 /*! \brief Callback function for creating a bucket */
 static int bucket_wizard_create(const struct ast_sorcery *sorcery, void *data, 
void *object)
 {
@@ -88,29 +130,19 @@
 static void *bucket_wizard_retrieve(const struct ast_sorcery *sorcery, void 
*data, const char *type,
        const char *id)
 {
-       char *full_uri, *scheme_name = DEFAULT_UNSPECIFIED_SCHEME, *tmp;
+       char *uri, *uri_scheme, *uri_name;
        RAII_VAR(struct bucket_scheme *, scheme, NULL, ao2_cleanup);
 
-       if (!(full_uri = ast_strdupa(id))) {
-               return NULL;
-       }
-
-       /* Assume no scheme until proven otherwise */
-       if ((tmp = strstr(full_uri, "://"))) {
-               scheme_name = full_uri;
-               *tmp++ = '\0';
-
-               /* If only a scheme has been specified this URI is invalid */
-               if (ast_strlen_zero(tmp)) {
-                       return NULL;
-               }
-       }
-
-       if (ast_strlen_zero(scheme_name)) {
-               return NULL;
-       }
-
-       scheme = ao2_find(schemes, scheme_name, OBJ_KEY);
+       if (!(uri = ast_strdupa(id))) {
+               return NULL;
+       }
+
+       if (bucket_uri_parse(uri, &uri_scheme, &uri_name) ||
+               ast_strlen_zero(uri_scheme) || ast_strlen_zero(uri_name)) {
+               return NULL;
+       }
+
+       scheme = ao2_find(schemes, uri_scheme, OBJ_KEY);
        if (!scheme) {
                return NULL;
        }
@@ -156,29 +188,19 @@
 static void *bucket_file_wizard_retrieve(const struct ast_sorcery *sorcery, 
void *data, const char *type,
        const char *id)
 {
-       char *full_uri, *scheme_name = DEFAULT_UNSPECIFIED_SCHEME, *tmp;
+       char *uri, *uri_scheme, *uri_name;
        RAII_VAR(struct bucket_scheme *, scheme, NULL, ao2_cleanup);
 
-       if (!(full_uri = ast_strdupa(id))) {
-               return NULL;
-       }
-
-       /* Assume no scheme until proven otherwise */
-       if ((tmp = strstr(full_uri, "://"))) {
-               scheme_name = full_uri;
-               *tmp++ = '\0';
-
-               /* If only a scheme has been specified this URI is invalid */
-               if (ast_strlen_zero(tmp)) {
-                       return NULL;
-               }
-       }
-
-       if (ast_strlen_zero(scheme_name)) {
-               return NULL;
-       }
-
-       scheme = ao2_find(schemes, scheme_name, OBJ_KEY);
+       if (!(uri = ast_strdupa(id))) {
+               return NULL;
+       }
+
+       if (bucket_uri_parse(uri, &uri_scheme, &uri_name) ||
+               ast_strlen_zero(uri_scheme) || ast_strlen_zero(uri_name)) {
+               return NULL;
+       }
+
+       scheme = ao2_find(schemes, uri_scheme, OBJ_KEY);
        if (!scheme) {
                return NULL;
        }
@@ -360,39 +382,24 @@
 
 struct ast_bucket *ast_bucket_alloc(const char *uri)
 {
-       char *full_uri, *scheme = DEFAULT_UNSPECIFIED_SCHEME, *name, *tmp;
+       char *full_uri, *uri_scheme, *uri_name;
        struct ast_bucket *bucket;
 
-       if (ast_strlen_zero(uri) || !(full_uri = ast_strdupa(uri))) {
-               return NULL;
-       }
-
-       /* Assume the naming starts at the front until proven otherwise */
-       name = full_uri;
-
-       /* Determine the scheme from the provided URI */
-       if ((tmp = strstr(full_uri, "://"))) {
-               scheme = full_uri;
-               *tmp++ = '\0';
-               name = tmp;
-       }
-
-       /* Determine the name of the bucket */
-       if ((tmp = strrchr(name, '/'))) {
-               name = tmp + 1;
-       }
-
-       /* If no scheme and name are available the URI is invalid */
-       if (ast_strlen_zero(scheme) || ast_strlen_zero(name)) {
-               return NULL;
-       }
-
-       if (!(bucket = ast_sorcery_alloc(bucket_sorcery, "bucket", name))) {
+       if (!(full_uri = ast_strdupa(uri))) {
+               return NULL;
+       }
+
+       if (bucket_uri_parse(full_uri, &uri_scheme, &uri_name) ||
+               ast_strlen_zero(uri_scheme) || ast_strlen_zero(uri_name)) {
+               return NULL;
+       }
+
+       if (!(bucket = ast_sorcery_alloc(bucket_sorcery, "bucket", uri_name))) {
                return NULL;
        }
 
        ast_string_field_set(bucket, uri, uri);
-       ast_string_field_set(bucket, scheme, scheme);
+       ast_string_field_set(bucket, scheme, uri_scheme);
 
        return bucket;
 }
@@ -559,39 +566,24 @@
 
 struct ast_bucket_file *ast_bucket_file_alloc(const char *uri)
 {
-       char *full_uri, *scheme = DEFAULT_UNSPECIFIED_SCHEME, *name, *tmp;
+       char *full_uri, *uri_scheme, *uri_name;
        struct ast_bucket_file *file;
 
-       if (ast_strlen_zero(uri) || !(full_uri = ast_strdupa(uri))) {
-               return NULL;
-       }
-
-       /* Assume the naming starts at the front until proven otherwise */
-       name = full_uri;
-
-       /* Determine the scheme from the provided URI */
-       if ((tmp = strstr(full_uri, "://"))) {
-               scheme = full_uri;
-               *tmp++ = '\0';
-               name = tmp;
-       }
-
-       /* Determine the name of the bucket */
-       if ((tmp = strrchr(name, '/'))) {
-               name = tmp + 1;
-       }
-
-       /* If no scheme and name are available the URI is invalid */
-       if (ast_strlen_zero(scheme) || ast_strlen_zero(name)) {
-               return NULL;
-       }
-
-       if (!(file = ast_sorcery_alloc(bucket_sorcery, "file", name))) {
+       if (!(full_uri = ast_strdupa(uri))) {
+               return NULL;
+       }
+
+       if (bucket_uri_parse(full_uri, &uri_scheme, &uri_name) ||
+               ast_strlen_zero(uri_scheme) || ast_strlen_zero(uri_name)) {
+               return NULL;
+       }
+
+       if (!(file = ast_sorcery_alloc(bucket_sorcery, "file", uri_name))) {
                return NULL;
        }
 
        ast_string_field_set(file, uri, uri);
-       ast_string_field_set(file, scheme, scheme);
+       ast_string_field_set(file, scheme, uri_scheme);
 
        if (!tmpnam(file->path)) {
                return NULL;


--
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

svn-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/svn-commits

Reply via email to