Repository: qpid-dispatch
Updated Branches:
  refs/heads/tross-DISPATCH-179-1 38e550b7a -> ec1b4aea2


DISPATCH-179 - Added boilerplate code to cover delete and create management 
operations


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/ec1b4aea
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/ec1b4aea
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/ec1b4aea

Branch: refs/heads/tross-DISPATCH-179-1
Commit: ec1b4aea2b4f14bb9cafd48c9e2c6fe60dcb859b
Parents: 38e550b
Author: ganeshmurthy <[email protected]>
Authored: Wed Nov 18 16:10:17 2015 -0500
Committer: ganeshmurthy <[email protected]>
Committed: Thu Nov 19 09:21:36 2015 -0500

----------------------------------------------------------------------
 include/qpid/dispatch/amqp.h                  |   2 +
 python/qpid_dispatch/management/qdrouter.json |   2 +-
 src/CMakeLists.txt                            |   1 +
 src/amqp.c                                    |   2 +
 src/router_core/agent.c                       |  82 ++++++++--
 src/router_core/agent_address.c               |  43 +++++-
 src/router_core/agent_address.h               |   7 +-
 src/router_core/agent_waypoint.c              | 165 +++++++++++++++++++++
 src/router_core/agent_waypoint.h              |  39 +++++
 src/router_core/management_agent.c            |  63 ++++++--
 src/router_core/router_core_private.h         |   7 +
 11 files changed, 385 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ec1b4aea/include/qpid/dispatch/amqp.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/amqp.h b/include/qpid/dispatch/amqp.h
index 2beb690..8f239ae 100644
--- a/include/qpid/dispatch/amqp.h
+++ b/include/qpid/dispatch/amqp.h
@@ -123,6 +123,8 @@ const char * const QD_INTERNODE_LINK_NAME_2;
 /** An AMQP error status code and string description  */
 typedef struct qd_amqp_error_t { int status; const char* description; } 
qd_amqp_error_t;
 extern const qd_amqp_error_t QD_AMQP_OK;
+extern const qd_amqp_error_t QD_AMQP_CREATED;
+extern const qd_amqp_error_t QD_AMQP_NO_CONTENT;
 extern const qd_amqp_error_t QD_AMQP_BAD_REQUEST;
 extern const qd_amqp_error_t QD_AMQP_NOT_FOUND;
 extern const qd_amqp_error_t QD_AMQP_NOT_IMPLEMENTED;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ec1b4aea/python/qpid_dispatch/management/qdrouter.json
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch/management/qdrouter.json 
b/python/qpid_dispatch/management/qdrouter.json
index 00e247f..41b628a 100644
--- a/python/qpid_dispatch/management/qdrouter.json
+++ b/python/qpid_dispatch/management/qdrouter.json
@@ -771,7 +771,7 @@
         "waypoint": {
             "description":"A remote node that messages for an address pass 
through.",
             "extends": "configurationEntity",
-            "operations": ["CREATE"],
+            "operations": ["CREATE", "DELETE"],
             "attributes": {
                 "address": {
                     "description":"The AMQP address of the waypoint.",

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ec1b4aea/src/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 4dd221a..62b61b8 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -67,6 +67,7 @@ set(qpid_dispatch_SOURCES
   router_config.c
   router_core/agent.c
   router_core/agent_address.c
+  router_core/agent_waypoint.c
   router_core/agent_link.c
   router_core/connections.c
   router_core/router_core.c

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ec1b4aea/src/amqp.c
----------------------------------------------------------------------
diff --git a/src/amqp.c b/src/amqp.c
index 9ecb4cc..45639cf 100644
--- a/src/amqp.c
+++ b/src/amqp.c
@@ -33,6 +33,8 @@ const char * const QD_INTERNODE_LINK_NAME_1 = 
"qd.internode.1";
 const char * const QD_INTERNODE_LINK_NAME_2 = "qd.internode.2";
 
 const qd_amqp_error_t QD_AMQP_OK = { 200, "OK" };
+const qd_amqp_error_t QD_AMQP_CREATED = { 201, "Created" };
+const qd_amqp_error_t QD_AMQP_NO_CONTENT = { 204, "No Content" }; // This is 
the response code if the delete of a manageable entity was successful.
 const qd_amqp_error_t QD_AMQP_BAD_REQUEST = { 400, "Bad Request" };
 const qd_amqp_error_t QD_AMQP_NOT_FOUND = { 404, "Not Found" };
 const qd_amqp_error_t QD_AMQP_NOT_IMPLEMENTED = { 501, "Not Implemented"};

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ec1b4aea/src/router_core/agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent.c b/src/router_core/agent.c
index e8e5761..5fd0161 100644
--- a/src/router_core/agent.c
+++ b/src/router_core/agent.c
@@ -19,6 +19,7 @@
 
 #include <qpid/dispatch/amqp.h>
 #include "agent_address.h"
+#include "agent_waypoint.h"
 #include "agent_link.h"
 #include "router_core_private.h"
 #include <stdio.h>
@@ -58,7 +59,8 @@ static const char *qdr_link_columns[] =
 #define QDR_LINK_COLUMN_COUNT     10
 
 static void qdr_manage_read_CT(qdr_core_t *core, qdr_action_t *action, bool 
discard);
-
+static void qdr_manage_create_CT(qdr_core_t *core, qdr_action_t *action, bool 
discard);
+static void qdr_manage_delete_CT(qdr_core_t *core, qdr_action_t *action, bool 
discard);
 
 
//==================================================================================
 // Internal Functions
@@ -130,15 +132,37 @@ static void qdr_agent_set_columns(qdr_query_t *query, 
qd_parsed_field_t *attribu
 // Interface Functions
 
//==================================================================================
 
-void qdr_manage_create(qdr_core_t *core, void *context, 
qd_router_entity_type_t type,
-                       qd_field_iterator_t *name, qd_parsed_field_t *in_body, 
qd_composed_field_t *out_body)
+void qdr_manage_create(qdr_core_t              *core,
+                       void                    *context,
+                       qd_router_entity_type_t  type,
+                       qd_field_iterator_t     *name,
+                       qd_parsed_field_t       *in_body,
+                       qd_composed_field_t     *out_body)
 {
+    qdr_action_t *action = qdr_action(qdr_manage_create_CT);
+
+    // Create a query object here
+    action->args.agent.query = qdr_query(core, context, type, 0, out_body);
+    action->args.agent.name = name;
+    action->args.agent.in_body = in_body;
+
+    qdr_action_enqueue(core, action);
 }
 
 
-void qdr_manage_delete(qdr_core_t *core, void *context, 
qd_router_entity_type_t type,
-                       qd_field_iterator_t *name, qd_field_iterator_t 
*identity)
+void qdr_manage_delete(qdr_core_t *core, void  *context,
+                       qd_router_entity_type_t  type,
+                       qd_field_iterator_t     *name,
+                       qd_field_iterator_t     *identity)
 {
+    qdr_action_t *action = qdr_action(qdr_manage_delete_CT);
+
+    // Create a query object here
+    action->args.agent.query = qdr_query(core, context, type, 0, 0);
+    action->args.agent.name = name;
+    action->args.agent.identity = identity;
+
+    qdr_action_enqueue(core, action);
 }
 
 
@@ -159,10 +183,15 @@ void qdr_manage_read(qdr_core_t *core, void  *context,
 }
 
 
-void qdr_manage_update(qdr_core_t *core, void *context, 
qd_router_entity_type_t type,
-                       qd_field_iterator_t *name, qd_field_iterator_t 
*identity,
-                       qd_parsed_field_t *in_body, qd_composed_field_t 
*out_body)
+void qdr_manage_update(qdr_core_t              *core,
+                       void                    *context,
+                       qd_router_entity_type_t  type,
+                       qd_field_iterator_t     *name,
+                       qd_field_iterator_t     *identity,
+                       qd_parsed_field_t       *in_body,
+                       qd_composed_field_t      *out_body)
 {
+
 }
 
 
@@ -305,7 +334,7 @@ static void qdr_manage_read_CT(qdr_core_t *core, 
qdr_action_t *action, bool disc
     switch (query->entity_type) {
         case QD_ROUTER_CONNECTION: break;
         case QD_ROUTER_LINK:       break;
-        case QD_ROUTER_ADDRESS:    qdra_address_get(core, name, identity, 
query, qdr_address_columns); break;
+        case QD_ROUTER_ADDRESS:    qdra_address_get_CT(core, name, identity, 
query, qdr_address_columns); break;
         case QD_ROUTER_WAYPOINT:   break;
         case QD_ROUTER_EXCHANGE:   break;
         case QD_ROUTER_BINDING:    break;
@@ -313,6 +342,41 @@ static void qdr_manage_read_CT(qdr_core_t *core, 
qdr_action_t *action, bool disc
 }
 
 
+static void qdr_manage_create_CT(qdr_core_t *core, qdr_action_t *action, bool 
discard)
+{
+    qd_field_iterator_t     *name       = action->args.agent.name;
+    qdr_query_t             *query      = action->args.agent.query;
+    qd_parsed_field_t       *in_body    = action->args.agent.in_body;
+    switch (query->entity_type) {
+        case QD_ROUTER_CONNECTION: break;
+        case QD_ROUTER_LINK:       break;
+        case QD_ROUTER_ADDRESS:    break;
+        case QD_ROUTER_WAYPOINT:   qdra_waypoint_create_CT(core, name, query, 
in_body); break;
+        case QD_ROUTER_EXCHANGE:   break;
+        case QD_ROUTER_BINDING:    break;
+   }
+}
+
+
+static void qdr_manage_delete_CT(qdr_core_t *core, qdr_action_t *action, bool 
discard)
+{
+    qd_field_iterator_t     *name       = action->args.agent.name;
+    qd_field_iterator_t     *identity   = action->args.agent.identity;
+    qdr_query_t             *query      = action->args.agent.query;
+
+    switch (query->entity_type) {
+        case QD_ROUTER_CONNECTION: break;
+        case QD_ROUTER_LINK:       break;
+        case QD_ROUTER_ADDRESS:    qdra_address_delete_CT(core, name, 
identity, query); break;
+        case QD_ROUTER_WAYPOINT:   qdra_waypoint_delete_CT(core, name, 
identity, query); break;
+        case QD_ROUTER_EXCHANGE:   break;
+        case QD_ROUTER_BINDING:    break;
+   }
+}
+
+
+
+
 static void qdrh_query_get_first_CT(qdr_core_t *core, qdr_action_t *action, 
bool discard)
 {
     qdr_query_t *query  = action->args.agent.query;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ec1b4aea/src/router_core/agent_address.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_address.c b/src/router_core/agent_address.c
index fbbd7a0..ef8155b 100644
--- a/src/router_core/agent_address.c
+++ b/src/router_core/agent_address.c
@@ -37,7 +37,8 @@
 
 static void qdr_insert_address_columns_CT(qdr_address_t        *addr,
                                           qd_composed_field_t  *body,
-                                          int column_index) {
+                                          int column_index)
+{
     switch(column_index) {
         case QDR_ADDRESS_NAME:
         case QDR_ADDRESS_IDENTITY:
@@ -140,11 +141,11 @@ static void qdr_manage_advance_address_CT(qdr_query_t 
*query, qdr_address_t *add
         query->more = false;
 }
 
-void qdra_address_get(qdr_core_t          *core,
-                      qd_field_iterator_t *name,
-                      qd_field_iterator_t *identity,
-                      qdr_query_t         *query,
-                      const char          *qdr_address_columns[])
+void qdra_address_get_CT(qdr_core_t          *core,
+                         qd_field_iterator_t *name,
+                         qd_field_iterator_t *identity,
+                         qdr_query_t         *query,
+                         const char          *qdr_address_columns[])
 {
     qdr_address_t *addr;
 
@@ -258,3 +259,33 @@ void qdra_address_get_next_CT(qdr_core_t *core, 
qdr_query_t *query)
     qdr_agent_enqueue_response_CT(core, query);
 }
 
+void qdra_address_delete_CT(qdr_core_t          *core,
+                             qd_field_iterator_t *name,
+                             qd_field_iterator_t *identity,
+                             qdr_query_t          *query)
+{
+    bool success = true;
+
+    if (identity) {//If there is identity, ignore the name
+       //TOOD - do something here
+    }
+    else if (name) {
+       //TOOD - do something here
+    }
+    else {
+        query->status = &QD_AMQP_BAD_REQUEST;
+        success = false;
+    }
+
+
+    // TODO - Add more logic here.
+    if (success) {
+        // If the request was successful then the statusCode MUST be 204 (No 
Content).
+        query->status = &QD_AMQP_NO_CONTENT;
+    }
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+}

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ec1b4aea/src/router_core/agent_address.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_address.h b/src/router_core/agent_address.h
index 5a1a4f7..d2e9f8b 100644
--- a/src/router_core/agent_address.h
+++ b/src/router_core/agent_address.h
@@ -24,12 +24,17 @@
 void qdra_address_get_first_CT(qdr_core_t *core, qdr_query_t *query, int 
offset);
 void qdra_address_get_next_CT(qdr_core_t *core, qdr_query_t *query);
 
-void qdra_address_get(qdr_core_t *core,
+void qdra_address_get_CT(qdr_core_t *core,
                       qd_field_iterator_t *name,
                       qd_field_iterator_t *identity,
                       qdr_query_t          *query,
                       const char *qdr_address_columns[]);
 
+void qdra_address_delete_CT(qdr_core_t          *core,
+                             qd_field_iterator_t *name,
+                             qd_field_iterator_t *identity,
+                             qdr_query_t          *query);
+
 
 #define QDR_ADDRESS_COLUMN_COUNT  13
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ec1b4aea/src/router_core/agent_waypoint.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_waypoint.c b/src/router_core/agent_waypoint.c
new file mode 100644
index 0000000..aa5ec37
--- /dev/null
+++ b/src/router_core/agent_waypoint.c
@@ -0,0 +1,165 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "agent_waypoint.h"
+
+#define QDR_WAYPOINT_NAME         0
+#define QDR_WAYPOINT_ADDRESS      1
+#define QDR_WAYPOINT_CONNECTOR    2
+#define QDR_WAYPOINT_INPHASE      3
+#define QDR_WAYPOINT_OUTPHASE     4
+#define QDR_WAYPOINT_MODE         5
+
+#define QDR_WAYPOINT_COLUMN_COUNT  6
+
+static const char *qdr_waypoint_columns[] =
+    {"name",
+     "address",
+     "connector",
+     "inPhase",
+     "outPhase",
+     "mode",
+     0};
+
+static void qdr_insert_waypoint_columns_CT(qd_composed_field_t  *body,
+                                          int column_index)
+{
+    // TODO replace nulls with actual values.
+    switch(column_index) {
+        case QDR_WAYPOINT_NAME:
+            qd_compose_insert_null(body);
+            break;
+
+        case QDR_WAYPOINT_ADDRESS:
+            qd_compose_insert_null(body);
+            break;
+
+        case QDR_WAYPOINT_CONNECTOR:
+            qd_compose_insert_null(body);
+            break;
+
+        case QDR_WAYPOINT_INPHASE:
+            qd_compose_insert_null(body);
+            break;
+
+        case QDR_WAYPOINT_OUTPHASE:
+            qd_compose_insert_null(body);
+            break;
+
+        case QDR_WAYPOINT_MODE:
+            qd_compose_insert_null(body);  // TEMP
+            break;
+
+        default:
+            qd_compose_insert_null(body);
+            break;
+    }
+
+}
+
+static void qdr_manage_write_response_map_CT(qd_composed_field_t *body)
+{
+    qd_compose_start_map(body);
+
+    for(int i = 0; i < QDR_WAYPOINT_COLUMN_COUNT; i++) {
+        qd_compose_insert_string(body, qdr_waypoint_columns[i]);
+        qdr_insert_waypoint_columns_CT(body, i);
+    }
+
+    qd_compose_end_map(body);
+}
+
+void qdra_waypoint_create_CT(qdr_core_t          *core,
+                             qd_field_iterator_t *name,
+                             qdr_query_t         *query,
+                             qd_parsed_field_t   *in_body)
+{
+    // Get the map fields from the body
+    if (qd_parse_is_map(in_body)) {
+        qd_parsed_field_t *address_field = qd_parse_value_by_key(in_body, 
qdr_waypoint_columns[1]);
+        qd_parsed_field_t *connector_field = qd_parse_value_by_key(in_body, 
qdr_waypoint_columns[2]);
+        qd_parsed_field_t *inPhase_field = qd_parse_value_by_key(in_body, 
qdr_waypoint_columns[3]);
+        qd_parsed_field_t *outPhase_field = qd_parse_value_by_key(in_body, 
qdr_waypoint_columns[4]);
+        qd_parsed_field_t *mode_field = qd_parse_value_by_key(in_body, 
qdr_waypoint_columns[5]);
+
+        if ( address_field   &&
+             connector_field &&
+             inPhase_field   &&
+             outPhase_field  &&
+             mode_field) {
+            // TODO - Add code here that would actually create a waypoint.
+            // If the request was successful then the statusCode MUST be 201 
(Created) and the body of the message
+            // MUST consist an amqp-value section that contains a Map 
containing the actual attributes of the entity created
+            qdr_manage_write_response_map_CT(query->body);
+            query->status = &QD_AMQP_CREATED;
+        }
+        else {
+            query->status = &QD_AMQP_BAD_REQUEST;
+        }
+    }
+    else {
+        query->status = &QD_AMQP_BAD_REQUEST;
+    }
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+
+
+}
+
+void qdra_waypoint_delete_CT(qdr_core_t          *core,
+                             qd_field_iterator_t *name,
+                             qd_field_iterator_t *identity,
+                             qdr_query_t          *query)
+{
+    bool success = true;
+
+    if (identity) {//If there is identity, ignore the name
+       //TOOD - do something here
+    }
+    else if (name) {
+       //TOOD - do something here
+    }
+    else {
+        query->status = &QD_AMQP_BAD_REQUEST;
+        success = false;
+    }
+
+
+    // TODO - Add more logic here.
+    if (success) {
+        // If the request was successful then the statusCode MUST be 204 (No 
Content).
+        query->status = &QD_AMQP_NO_CONTENT;
+    }
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+}
+
+
+void qdra_waypoint_update_CT(qdr_core_t *core, qd_field_iterator_t *name, 
qdr_query_t *query)
+{
+
+}
+
+

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ec1b4aea/src/router_core/agent_waypoint.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_waypoint.h b/src/router_core/agent_waypoint.h
new file mode 100644
index 0000000..7abc38f
--- /dev/null
+++ b/src/router_core/agent_waypoint.h
@@ -0,0 +1,39 @@
+#ifndef qdr_agent_waypoint
+#define qdr_agent_waypoint 1
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "router_core_private.h"
+
+void qdra_waypoint_create_CT(qdr_core_t          *core,
+                             qd_field_iterator_t *name,
+                             qdr_query_t         *query,
+                             qd_parsed_field_t   *in_body);
+
+void qdra_waypoint_delete_CT(qdr_core_t          *core,
+                             qd_field_iterator_t *name,
+                             qd_field_iterator_t *identity,
+                             qdr_query_t          *query);
+
+
+void qdra_waypoint_update_CT(qdr_core_t          *core,
+                             qd_field_iterator_t *name,
+                             qdr_query_t         *query);
+
+#endif

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ec1b4aea/src/router_core/management_agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/management_agent.c 
b/src/router_core/management_agent.c
index b45d7cd..ffb40be 100644
--- a/src/router_core/management_agent.c
+++ b/src/router_core/management_agent.c
@@ -40,6 +40,7 @@ const char *identity_key = "identity";
 const char *operation_type_key = "operation";
 const char *attribute_names_key = "attributeNames";
 
+const unsigned char *waypoint_entity_type = (unsigned char*) 
"org.apache.qpid.dispatch.waypoint";
 const unsigned char *address_entity_type = (unsigned char*) 
"org.apache.qpid.dispatch.router.address";
 const unsigned char *link_entity_type    = (unsigned char*) 
"org.apache.qpid.dispatch.router.link";
 
@@ -166,11 +167,14 @@ static void qd_manage_response_handler (void *context, 
const qd_amqp_error_t *st
                }
             }
         }
-        qd_compose_end_list(ctx->query->body);
-        qd_compose_end_map(ctx->query->body);
+        qd_compose_end_list(ctx->field);
+        qd_compose_end_map(ctx->field);
+    }
+    else if (ctx->operation_type == QD_ROUTER_OPERATION_DELETE) {
+        // The body of the delete response message MUST consist of an 
amqp-value section containing a Map with zero entries.
+        qd_compose_start_map(ctx->field);
+        qd_compose_end_map(ctx->field);
     }
-
-
 
     qd_field_iterator_t *reply_to = 0;
 
@@ -251,22 +255,39 @@ static void qd_core_agent_read_handler(qd_dispatch_t      
        *qd,
     //
     // Add the Body
     //
-    qd_composed_field_t *field = qd_compose(QD_PERFORMATIVE_BODY_AMQP_VALUE, 
0);
+    qd_composed_field_t *body = qd_compose(QD_PERFORMATIVE_BODY_AMQP_VALUE, 0);
 
     // Set the callback function.
     qdr_manage_handler(core, qd_manage_response_handler);
 
     // Call local function that creates and returns a qd_management_context_t 
containing the values passed in.
-    qd_management_context_t *ctx = qd_management_context(qd_message(), msg, 
field, 0, qd, operation_type, 0);
+    qd_management_context_t *ctx = qd_management_context(qd_message(), msg, 
body, 0, qd, operation_type, 0);
 
     //Call the read API function
-    qdr_manage_read(core, ctx, entity_type, name_iter, identity_iter, field);
+    qdr_manage_read(core, ctx, entity_type, name_iter, identity_iter, body);
 }
 
 
-static void qd_core_agent_create_handler()
+static void qd_core_agent_create_handler(qd_dispatch_t              *qd,
+                                         qd_message_t               *msg,
+                                         qd_router_entity_type_t     
entity_type,
+                                         qd_router_operation_type_t  
operation_type,
+                                         qd_field_iterator_t        *name_iter)
 {
+    qdr_core_t *core = qd_router_core(qd);
+
+    //
+    // Add the Body
+    //
+    qd_composed_field_t *out_body = 
qd_compose(QD_PERFORMATIVE_BODY_AMQP_VALUE, 0);
+
+    // Set the callback function.
+    qdr_manage_handler(core, qd_manage_response_handler);
 
+    // Call local function that creates and returns a qd_management_context_t 
containing the values passed in.
+    qd_management_context_t *ctx = qd_management_context(qd_message(), msg, 
out_body, 0, qd, operation_type, 0);
+
+    qdr_manage_create(core, ctx, entity_type, name_iter, 
qd_parse(qd_message_field_iterator(msg, QD_FIELD_BODY)), out_body);
 }
 
 
@@ -276,9 +297,27 @@ static void qd_core_agent_update_handler()
 }
 
 
-static void qd_core_agent_delete_handler()
+static void qd_core_agent_delete_handler(qd_dispatch_t              *qd,
+                                         qd_message_t               *msg,
+                                         qd_router_entity_type_t    
entity_type,
+                                         qd_router_operation_type_t 
operation_type,
+                                         qd_field_iterator_t        
*identity_iter,
+                                         qd_field_iterator_t        *name_iter)
 {
+    qdr_core_t *core = qd_router_core(qd);
+
+    //
+    // Add the Body
+    //
+    qd_composed_field_t *body = qd_compose(QD_PERFORMATIVE_BODY_AMQP_VALUE, 0);
+
+    // Set the callback function.
+    qdr_manage_handler(core, qd_manage_response_handler);
+
+    // Call local function that creates and returns a qd_management_context_t 
containing the values passed in.
+    qd_management_context_t *ctx = qd_management_context(qd_message(), msg, 
body, 0, qd, operation_type, 0);
 
+    qdr_manage_delete(core, ctx, entity_type, name_iter, identity_iter);
 }
 
 
@@ -330,6 +369,8 @@ static bool qd_can_handle_request(qd_field_iterator_t       
 *props,
         (*entity_type) = QD_ROUTER_ADDRESS;
     else if(qd_field_iterator_equal(qd_parse_raw(parsed_field), 
link_entity_type))
         (*entity_type) = QD_ROUTER_LINK;
+    else if(qd_field_iterator_equal(qd_parse_raw(parsed_field), 
waypoint_entity_type))
+        (*entity_type) = QD_ROUTER_WAYPOINT;
     else
         return false;
 
@@ -397,7 +438,7 @@ void management_agent_handler(void *context, qd_message_t 
*msg, int link_id)
                 qd_core_agent_query_handler(qd, entity_type, operation_type, 
msg, &count, &offset);
                 break;
             case QD_ROUTER_OPERATION_CREATE:
-                qd_core_agent_create_handler();
+                qd_core_agent_create_handler(qd, msg, entity_type, 
operation_type, name_iter);
                 break;
             case QD_ROUTER_OPERATION_READ:
                 qd_core_agent_read_handler(qd, msg, entity_type, 
operation_type, identity_iter, name_iter);
@@ -406,7 +447,7 @@ void management_agent_handler(void *context, qd_message_t 
*msg, int link_id)
                 qd_core_agent_update_handler();
                 break;
             case QD_ROUTER_OPERATION_DELETE:
-                qd_core_agent_delete_handler();
+                qd_core_agent_delete_handler(qd, msg, entity_type, 
operation_type, identity_iter, name_iter);
                 break;
        }
     }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/ec1b4aea/src/router_core/router_core_private.h
----------------------------------------------------------------------
diff --git a/src/router_core/router_core_private.h 
b/src/router_core/router_core_private.h
index 64253b1..0347fe0 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -95,6 +95,7 @@ struct qdr_action_t {
             int                      offset;
             qd_field_iterator_t     *identity;
             qd_field_iterator_t     *name;
+            qd_parsed_field_t       *in_body;
         } agent;
 
     } args;
@@ -303,6 +304,12 @@ struct qdr_core_t {
     qdr_link_t          **data_links_by_mask_bit;
 };
 
+typedef enum {
+    PASSTHROUGH,
+    TAP,
+    BYPASS
+} qdr_waypoint_mode_t;
+
 void *router_core_thread(void *arg);
 void  qdr_route_table_setup_CT(qdr_core_t *core);
 void  qdr_agent_setup_CT(qdr_core_t *core);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to