You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2014/09/23 22:29:44 UTC

svn commit: r1627155 - in /qpid/proton/trunk/proton-c: include/proton/cid.h src/url.c

Author: aconway
Date: Tue Sep 23 20:29:43 2014
New Revision: 1627155

URL: http://svn.apache.org/r1627155
Log:
 PROTON-693: Make pn_url_t a proper pn_class object, hashable & comparable.

Modified:
    qpid/proton/trunk/proton-c/include/proton/cid.h
    qpid/proton/trunk/proton-c/src/url.c

Modified: qpid/proton/trunk/proton-c/include/proton/cid.h
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/include/proton/cid.h?rev=1627155&r1=1627154&r2=1627155&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/include/proton/cid.h (original)
+++ qpid/proton/trunk/proton-c/include/proton/cid.h Tue Sep 23 20:29:43 2014
@@ -48,7 +48,9 @@ typedef enum {
 
   CID_pn_io,
   CID_pn_selector,
-  CID_pn_selectable
+  CID_pn_selectable,
+
+  CID_pn_url
 } pn_cid_t;
 
 #endif /* cid.h */

Modified: qpid/proton/trunk/proton-c/src/url.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/url.c?rev=1627155&r1=1627154&r2=1627155&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/url.c (original)
+++ qpid/proton/trunk/proton-c/src/url.c Tue Sep 23 20:29:43 2014
@@ -45,10 +45,52 @@ struct pn_url_t {
     pn_string_t *str;
 };
 
+/** Internal use only, returns the pn_string_t. Public function is pn_url_str() */
+static pn_string_t *pn_url_string(pn_url_t* url)
+{
+    pn_url_str(url);               /* Make sure str is up to date */
+    return url->str;
+}
+
+static void pn_url_finalize(void *object)
+{
+    pn_url_t *url = (pn_url_t *) object;
+    pn_url_clear(url);
+    pn_free(url->str);
+}
+
+static uintptr_t pn_url_hashcode(void *object)
+{
+    pn_url_t *url = (pn_url_t *) object;
+    return pn_hashcode(pn_url_string(url));
+}
+
+static intptr_t pn_url_compare(void *oa, void *ob)
+{
+    pn_url_t *a = (pn_url_t *) oa;
+    pn_url_t *b = (pn_url_t *) ob;
+    return pn_compare(pn_url_string(a), pn_url_string(b));
+}
+
+
+static int pn_url_inspect(void *obj, pn_string_t *dst)
+{
+    pn_url_t *url = (pn_url_t *) obj;
+    int err = 0;
+    err = pn_string_addf(dst, "Url("); if (err) return err;
+    err = pn_inspect(pn_url_string(url), dst); if (err) return err;
+    return pn_string_addf(dst, ")");
+}
+
+#define pn_url_initialize NULL
+
+
 PN_EXTERN pn_url_t *pn_url() {
-    pn_url_t *url = (pn_url_t*)malloc(sizeof(pn_url_t));
-    if (url) memset(url, 0, sizeof(*url));
-    url->str = pn_string("");
+    static const pn_class_t clazz = PN_CLASS(pn_url);
+    pn_url_t *url = (pn_url_t*) pn_class_new(&clazz, sizeof(pn_url_t));
+    if (!url) return NULL;
+    memset(url, 0, sizeof(*url));
+    url->str = pn_string(NULL);
     return url;
 }
 
@@ -75,11 +117,7 @@ PN_EXTERN pn_url_t *pn_url_parse(const c
 }
 
 /** Free a URL */
-PN_EXTERN void pn_url_free(pn_url_t *url) {
-    pn_url_clear(url);
-    pn_free(url->str);
-    free(url);
-}
+PN_EXTERN void pn_url_free(pn_url_t *url) { pn_free(url); }
 
 /** Clear the contents of the URL. */
 PN_EXTERN void pn_url_clear(pn_url_t *url) {
@@ -96,17 +134,19 @@ static inline int len(const char *str) {
 
 /** Return the string form of a URL. */
 PN_EXTERN const char *pn_url_str(pn_url_t *url) {
-    pn_string_set(url->str, "");
-    if (url->scheme) pn_string_addf(url->str, "%s://", url->scheme);
-    if (url->username) pn_string_addf(url->str, "%s", url->username);
-    if (url->password) pn_string_addf(url->str, ":%s", url->password);
-    if (url->username || url->password) pn_string_addf(url->str, "@");
-    if (url->host) {
-        if (strchr(url->host, ':')) pn_string_addf(url->str, "[%s]", url->host);
-        else pn_string_addf(url->str, "%s", url->host);
+    if (pn_string_get(url->str) == NULL) {
+        pn_string_set(url->str, "");
+        if (url->scheme) pn_string_addf(url->str, "%s://", url->scheme);
+        if (url->username) pn_string_addf(url->str, "%s", url->username);
+        if (url->password) pn_string_addf(url->str, ":%s", url->password);
+        if (url->username || url->password) pn_string_addf(url->str, "@");
+        if (url->host) {
+            if (strchr(url->host, ':')) pn_string_addf(url->str, "[%s]", url->host);
+            else pn_string_addf(url->str, "%s", url->host);
+        }
+        if (url->port) pn_string_addf(url->str, ":%s", url->port);
+        if (url->path) pn_string_addf(url->str, "/%s", url->path);
     }
-    if (url->port) pn_string_addf(url->str, ":%s", url->port);
-    if (url->path) pn_string_addf(url->str, "/%s", url->path);
     return pn_string_get(url->str);
 }
 
@@ -117,7 +157,7 @@ PN_EXTERN const char *pn_url_get_host(pn
 PN_EXTERN const char *pn_url_get_port(pn_url_t *url) { return url->port; }
 PN_EXTERN const char *pn_url_get_path(pn_url_t *url) { return url->path; }
 
-#define SET(part) free(url->part); url->part = copy(part)
+#define SET(part) free(url->part); url->part = copy(part); pn_string_clear(url->str)
 PN_EXTERN void pn_url_set_scheme(pn_url_t *url, const char *scheme) { SET(scheme); }
 PN_EXTERN void pn_url_set_username(pn_url_t *url, const char *username) { SET(username); }
 PN_EXTERN void pn_url_set_password(pn_url_t *url, const char *password) { SET(password); }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org