Author: rhs
Date: Sat May 25 08:23:02 2013
New Revision: 1486299

URL: http://svn.apache.org/r1486299
Log:
replaced ad-hoc lists with proper data structures; improved protocol traces

Modified:
    qpid/proton/trunk/proton-c/src/codec/codec.c
    qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.c
    qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.h
    qpid/proton/trunk/proton-c/src/engine/engine-internal.h
    qpid/proton/trunk/proton-c/src/engine/engine.c
    qpid/proton/trunk/proton-c/src/protocol.h.py
    qpid/proton/trunk/proton-c/src/sasl/sasl.c

Modified: qpid/proton/trunk/proton-c/src/codec/codec.c
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/codec/codec.c?rev=1486299&r1=1486298&r2=1486299&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/codec/codec.c (original)
+++ qpid/proton/trunk/proton-c/src/codec/codec.c Sat May 25 08:23:02 2013
@@ -30,6 +30,8 @@
 #include <stdlib.h>
 #include <ctype.h>
 #include "encodings.h"
+#define DEFINE_FIELDS
+#include "protocol.h"
 #include "../platform_fmt.h"
 #include "../util.h"
 
@@ -322,29 +324,39 @@ size_t pn_atoms_ltrim(pn_atoms_t *atoms,
   return size;
 }
 
-int pn_format_atoms_one(pn_bytes_t *bytes, pn_atoms_t *atoms, int level)
+int pn_format_atoms_one(pn_bytes_t *bytes, pn_atoms_t *atoms, int level, 
pn_fields_t *fields)
 {
   if (!atoms->size) return PN_UNDERFLOW;
   pn_iatom_t *atom = atoms->start;
   pn_atoms_ltrim(atoms, 1);
   int err, count;
-  bool list;
+  pn_fields_t *f;
 
   switch (atom->type) {
   case PN_DESCRIPTOR:
     if ((err = pn_bytes_format(bytes, "@"))) return err;
-    if ((err = pn_format_atoms_one(bytes, atoms, level + 1))) return err;
+    if (atoms->start->type == PN_ULONG) {
+      f = &FIELDS[atoms->start->u.as_ulong];
+    } else {
+      f = NULL;
+    }
+    if (f && f->name) {
+      if ((err = pn_bytes_format(bytes, "%s", f->name))) return err;
+      pn_atoms_ltrim(atoms, 1);
+    } else {
+      if ((err = pn_format_atoms_one(bytes, atoms, level + 1, NULL))) return 
err;
+    }
     if ((err = pn_bytes_format(bytes, " "))) return err;
-    if ((err = pn_format_atoms_one(bytes, atoms, level + 1))) return err;
+    if ((err = pn_format_atoms_one(bytes, atoms, level + 1, f))) return err;
     return 0;
   case PN_ARRAY:
     count = atom->u.count;
     if ((err = pn_bytes_format(bytes, "@"))) return err;
-    if ((err = pn_format_atoms_one(bytes, atoms, level + 1))) return err;
+    if ((err = pn_format_atoms_one(bytes, atoms, level + 1, NULL))) return err;
     if ((err = pn_bytes_format(bytes, "["))) return err;
     for (int i = 0; i < count; i++)
     {
-      if ((err = pn_format_atoms_one(bytes, atoms, level + 1))) return err;
+      if ((err = pn_format_atoms_one(bytes, atoms, level + 1, NULL))) return 
err;
       if (i < count - 1) {
         if ((err = pn_bytes_format(bytes, ", "))) return err;
       }
@@ -352,28 +364,52 @@ int pn_format_atoms_one(pn_bytes_t *byte
     if ((err = pn_bytes_format(bytes, "]"))) return err;
     return 0;
   case PN_LIST:
+    {
+      count = atom->u.count;
+      if ((err = pn_bytes_format(bytes, "["))) return err;
+      bool comma = false;
+      for (int i = 0; i < count; i++)
+      {
+        const char *name = NULL;
+        bool render = true;
+        if (fields) {
+          name = fields->fields[i];
+          if (atoms->start->type == PN_NULL) {
+            pn_atoms_ltrim(atoms, 1);
+            render = false;
+          }
+        }
+
+        if (render) {
+          if (comma) {
+            if ((err = pn_bytes_format(bytes, ", "))) return err;
+          } else {
+            comma = true;
+          }
+          if (name) {
+            if ((err = pn_bytes_format(bytes, "%s=", name))) return err;
+          }
+          if ((err = pn_format_atoms_one(bytes, atoms, level + 1, NULL))) 
return err;
+        }
+      }
+    }
+    if ((err = pn_bytes_format(bytes, "]"))) return err;
+    return 0;
   case PN_MAP:
     count = atom->u.count;
-    list = atom->type == PN_LIST;
-    if ((err = pn_bytes_format(bytes, "%s",  list ? "[" : "{"))) return err;
+    if ((err = pn_bytes_format(bytes, "{"))) return err;
     for (int i = 0; i < count; i++)
     {
-      if ((err = pn_format_atoms_one(bytes, atoms, level + 1))) return err;
-      if (list) {
+      if ((err = pn_format_atoms_one(bytes, atoms, level + 1, NULL))) return 
err;
+      if (i % 2) {
         if (i < count - 1) {
           if ((err = pn_bytes_format(bytes, ", "))) return err;
         }
       } else {
-        if (i % 2) {
-          if (i < count - 1) {
-            if ((err = pn_bytes_format(bytes, ", "))) return err;
-          }
-        } else {
-          if ((err = pn_bytes_format(bytes, "="))) return err;
-        }
+        if ((err = pn_bytes_format(bytes, "="))) return err;
       }
     }
-    if ((err = pn_bytes_format(bytes, "%s",  list ? "]" : "}"))) return err;
+    if ((err = pn_bytes_format(bytes, "}"))) return err;
     return 0;
   default:
     return pn_format_atom(bytes, *atom);
@@ -387,7 +423,7 @@ ssize_t pn_format_atoms(char *buf, size_
 
   while (copy.size)
   {
-    int e = pn_format_atoms_one(&bytes, &copy, 0);
+    int e = pn_format_atoms_one(&bytes, &copy, 0, NULL);
     if (e) return e;
     if (copy.size) {
       e = pn_bytes_format(&bytes, " ");

Modified: qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.c
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.c?rev=1486299&r1=1486298&r2=1486299&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.c (original)
+++ qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.c Sat May 25 08:23:02 
2013
@@ -72,11 +72,10 @@ void pn_dispatcher_free(pn_dispatcher_t 
   }
 }
 
-void pn_dispatcher_action(pn_dispatcher_t *disp, uint8_t code, const char 
*name,
+void pn_dispatcher_action(pn_dispatcher_t *disp, uint8_t code,
                           pn_action_t *action)
 {
   disp->actions[code] = action;
-  disp->names[code] = name;
 }
 
 typedef enum {IN, OUT} pn_dir_t;
@@ -85,14 +84,10 @@ static void pn_do_trace(pn_dispatcher_t 
                         pn_data_t *args, const char *payload, size_t size)
 {
   if (disp->trace & PN_TRACE_FRM) {
-    uint64_t code64;
-    bool scanned;
-    pn_data_scan(args, "D?L.", &scanned, &code64);
-    uint8_t code = scanned ? code64 : 0;
     size_t n = SCRATCH;
     pn_data_format(args, disp->scratch, &n);
-    pn_dispatcher_trace(disp, ch, "%s %s %s", dir == OUT ? "->" : "<-",
-                        disp->names[code], disp->scratch);
+    pn_dispatcher_trace(disp, ch, "%s %s", dir == OUT ? "->" : "<-",
+                        disp->scratch);
     if (size) {
       char buf[1024];
       int e = pn_quote_data(buf, 1024, payload, size);

Modified: qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.h
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.h?rev=1486299&r1=1486298&r2=1486299&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.h (original)
+++ qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.h Sat May 25 08:23:02 
2013
@@ -38,7 +38,6 @@ typedef int (pn_action_t)(pn_dispatcher_
 
 struct pn_dispatcher_t {
   pn_action_t *actions[256];
-  const char *names[256];
   uint8_t frame_type;
   pn_trace_t trace;
   pn_buffer_t *input;
@@ -66,7 +65,7 @@ struct pn_dispatcher_t {
 
 pn_dispatcher_t *pn_dispatcher(uint8_t frame_type, void *context);
 void pn_dispatcher_free(pn_dispatcher_t *disp);
-void pn_dispatcher_action(pn_dispatcher_t *disp, uint8_t code, const char 
*name,
+void pn_dispatcher_action(pn_dispatcher_t *disp, uint8_t code,
                           pn_action_t *action);
 int pn_scan_args(pn_dispatcher_t *disp, const char *fmt, ...);
 void pn_set_payload(pn_dispatcher_t *disp, const char *data, size_t size);

Modified: qpid/proton/trunk/proton-c/src/engine/engine-internal.h
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/engine/engine-internal.h?rev=1486299&r1=1486298&r2=1486299&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/engine/engine-internal.h (original)
+++ qpid/proton/trunk/proton-c/src/engine/engine-internal.h Sat May 25 08:23:02 
2013
@@ -90,10 +90,8 @@ typedef struct {
   pn_sequence_t incoming_window;
   pn_sequence_t outgoing_transfer_count;
   pn_sequence_t outgoing_window;
-  pn_link_state_t *links;
-  size_t link_capacity;
-  pn_link_state_t **handles;
-  size_t handle_capacity;
+  pn_hash_t *local_handles;
+  pn_hash_t *remote_handles;
 
   uint64_t disp_code;
   bool disp_settled;
@@ -155,10 +153,8 @@ struct pn_transport_t {
   uint64_t last_bytes_output;
 
   pn_error_t *error;
-  pn_session_state_t *sessions;
-  size_t session_capacity;
-  pn_session_state_t **channels;
-  size_t channel_capacity;
+  pn_hash_t *local_channels;
+  pn_hash_t *remote_channels;
   char scratch[SCRATCH];
 
   /* statistics */
@@ -201,8 +197,8 @@ struct pn_session_t {
   pn_endpoint_t endpoint;
   pn_connection_t *connection;
   pn_list_t *links;
-  size_t id;
   void *context;
+  pn_session_state_t state;
 };
 
 struct pn_terminus_t {
@@ -237,8 +233,8 @@ struct pn_link_t {
   pn_sequence_t queued;
   bool drain;
   bool drained; // sender only
-  size_t id;
   void *context;
+  pn_link_state_t state;
 };
 
 struct pn_delivery_t {

Modified: qpid/proton/trunk/proton-c/src/engine/engine.c
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/engine/engine.c?rev=1486299&r1=1486298&r2=1486299&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/engine/engine.c (original)
+++ qpid/proton/trunk/proton-c/src/engine/engine.c Sat May 25 08:23:02 2013
@@ -223,20 +223,14 @@ void pn_transport_free(pn_transport_t *t
   pn_ssl_free(transport->ssl);
   pn_sasl_free(transport->sasl);
   pn_dispatcher_free(transport->disp);
-  for (unsigned i = 0; i < transport->session_capacity; i++) {
-    pn_delivery_buffer_free(&transport->sessions[i].incoming);
-    pn_delivery_buffer_free(&transport->sessions[i].outgoing);
-    free(transport->sessions[i].links);
-    free(transport->sessions[i].handles);
-  }
   free(transport->remote_container);
   free(transport->remote_hostname);
   pn_data_free(transport->remote_offered_capabilities);
   pn_data_free(transport->remote_desired_capabilities);
   pn_error_free(transport->error);
   pn_condition_tini(&transport->remote_condition);
-  free(transport->sessions);
-  free(transport->channels);
+  pn_free(transport->local_channels);
+  pn_free(transport->remote_channels);
   free(transport->input_buf);
   free(transport->output_buf);
   free(transport);
@@ -246,7 +240,6 @@ void pn_add_session(pn_connection_t *con
 {
   pn_list_add(conn->sessions, ssn);
   ssn->connection = conn;
-  ssn->id = pn_list_size(conn->sessions);
 }
 
 void pn_remove_session(pn_connection_t *conn, pn_session_t *ssn)
@@ -292,7 +285,6 @@ void pn_add_link(pn_session_t *ssn, pn_l
 {
   pn_list_add(ssn->links, link);
   link->session = ssn;
-  link->id = pn_list_size(ssn->links);
 }
 
 void pn_remove_link(pn_session_t *ssn, pn_link_t *link)
@@ -649,6 +641,11 @@ static void pn_session_finalize(void *ob
   pn_session_t *session = (pn_session_t *) object;
   pn_free(session->links);
   pn_endpoint_tini(&session->endpoint);
+
+  pn_delivery_buffer_free(&session->state.incoming);
+  pn_delivery_buffer_free(&session->state.outgoing);
+  pn_free(session->state.local_handles);
+  pn_free(session->state.remote_handles);
 }
 
 pn_session_t *pn_session(pn_connection_t *conn)
@@ -664,6 +661,14 @@ pn_session_t *pn_session(pn_connection_t
   ssn->links = pn_list(0, PN_REFCOUNT);
   ssn->context = 0;
 
+  // begin transport state
+  ssn->state = (pn_session_state_t) {ssn, (uint16_t)-1, (uint16_t)-1};
+  pn_delivery_buffer_init(&ssn->state.incoming, 0, PN_SESSION_WINDOW);
+  pn_delivery_buffer_init(&ssn->state.outgoing, 0, PN_SESSION_WINDOW);
+  ssn->state.local_handles = pn_hash(0, 0.75, PN_REFCOUNT);
+  ssn->state.remote_handles = pn_hash(0, 0.75, PN_REFCOUNT);
+  // end transport state
+
   return ssn;
 }
 
@@ -721,15 +726,15 @@ void pn_transport_init(pn_transport_t *t
   amqp->buffered_input = NULL;
   amqp->next = NULL;
 
-  pn_dispatcher_action(transport->disp, OPEN, "OPEN", pn_do_open);
-  pn_dispatcher_action(transport->disp, BEGIN, "BEGIN", pn_do_begin);
-  pn_dispatcher_action(transport->disp, ATTACH, "ATTACH", pn_do_attach);
-  pn_dispatcher_action(transport->disp, TRANSFER, "TRANSFER", pn_do_transfer);
-  pn_dispatcher_action(transport->disp, FLOW, "FLOW", pn_do_flow);
-  pn_dispatcher_action(transport->disp, DISPOSITION, "DISPOSITION", 
pn_do_disposition);
-  pn_dispatcher_action(transport->disp, DETACH, "DETACH", pn_do_detach);
-  pn_dispatcher_action(transport->disp, END, "END", pn_do_end);
-  pn_dispatcher_action(transport->disp, CLOSE, "CLOSE", pn_do_close);
+  pn_dispatcher_action(transport->disp, OPEN, pn_do_open);
+  pn_dispatcher_action(transport->disp, BEGIN, pn_do_begin);
+  pn_dispatcher_action(transport->disp, ATTACH, pn_do_attach);
+  pn_dispatcher_action(transport->disp, TRANSFER, pn_do_transfer);
+  pn_dispatcher_action(transport->disp, FLOW, pn_do_flow);
+  pn_dispatcher_action(transport->disp, DISPOSITION, pn_do_disposition);
+  pn_dispatcher_action(transport->disp, DETACH, pn_do_detach);
+  pn_dispatcher_action(transport->disp, END, pn_do_end);
+  pn_dispatcher_action(transport->disp, CLOSE, pn_do_close);
 
   transport->open_sent = false;
   transport->open_rcvd = false;
@@ -751,11 +756,8 @@ void pn_transport_init(pn_transport_t *t
   transport->error = pn_error();
   pn_condition_init(&transport->remote_condition);
 
-  transport->sessions = NULL;
-  transport->session_capacity = 0;
-
-  transport->channels = NULL;
-  transport->channel_capacity = 0;
+  transport->local_channels = pn_hash(0, 0.75, PN_REFCOUNT);
+  transport->remote_channels = pn_hash(0, 0.75, PN_REFCOUNT);
 
   transport->bytes_input = 0;
   transport->bytes_output = 0;
@@ -766,31 +768,25 @@ void pn_transport_init(pn_transport_t *t
 
 pn_session_state_t *pn_session_get_state(pn_transport_t *transport, 
pn_session_t *ssn)
 {
-  int old_capacity = transport->session_capacity;
-  PN_ENSURE(transport->sessions, transport->session_capacity, ssn->id + 1, 
pn_session_state_t);
-  for (unsigned i = old_capacity; i < transport->session_capacity; i++)
-  {
-    pn_session_state_t t = {NULL, (uint16_t)-1, (uint16_t)-1};
-    transport->sessions[i] = t;
-    pn_delivery_buffer_init(&transport->sessions[i].incoming, 0, 
PN_SESSION_WINDOW);
-    pn_delivery_buffer_init(&transport->sessions[i].outgoing, 0, 
PN_SESSION_WINDOW);
-  }
-  pn_session_state_t *state = &transport->sessions[ssn->id];
-  state->session = ssn;
-  return state;
+  return &ssn->state;
 }
 
 pn_session_state_t *pn_channel_state(pn_transport_t *transport, uint16_t 
channel)
 {
-    PN_ENSUREZ(transport->channels, transport->channel_capacity, (size_t) 
channel + 1, pn_session_state_t *);
-  return transport->channels[channel];
+  pn_session_t *ssn = (pn_session_t *) pn_hash_get(transport->remote_channels, 
channel);
+  return &ssn->state;
 }
 
-void pn_map_channel(pn_transport_t *transport, uint16_t channel, 
pn_session_state_t *state)
+static void pn_map_channel(pn_transport_t *transport, uint16_t channel, 
pn_session_state_t *state)
 {
-    PN_ENSUREZ(transport->channels, transport->channel_capacity, (size_t) 
channel + 1, pn_session_state_t *);
+  pn_hash_put(transport->remote_channels, channel, state->session);
   state->remote_channel = channel;
-  transport->channels[channel] = state;
+}
+
+static void pn_unmap_channel(pn_transport_t *transport, pn_session_state_t 
*state)
+{
+  pn_hash_del(transport->remote_channels, state->remote_channel);
+  state->remote_channel = -2;
 }
 
 pn_transport_t *pn_transport()
@@ -933,6 +929,14 @@ pn_link_t *pn_link_new(int type, pn_sess
   link->drained = false;
   link->context = 0;
 
+  // begin transport state
+  link->state.link = link;
+  link->state.local_handle = -1;
+  link->state.remote_handle = -1;
+  link->state.delivery_count = 0;
+  link->state.link_credit = 0;
+  // end transport stat
+
   return link;
 }
 
@@ -1083,39 +1087,27 @@ int pn_terminus_copy(pn_terminus_t *term
   return 0;
 }
 
-void pn_link_state_init(pn_link_state_t *ls)
+pn_link_state_t *pn_link_get_state(pn_session_state_t *ssn_state, pn_link_t 
*link)
 {
-  ls->link = NULL;
-  ls->local_handle = -1;
-  ls->remote_handle = -1;
-  ls->delivery_count = 0;
-  ls->link_credit = 0;
+  return &link->state;
 }
 
-pn_link_state_t *pn_link_get_state(pn_session_state_t *ssn_state, pn_link_t 
*link)
+static void pn_map_handle(pn_session_state_t *ssn_state, uint32_t handle, 
pn_link_state_t *state)
 {
-  int old_capacity = ssn_state->link_capacity;
-  PN_ENSURE(ssn_state->links, ssn_state->link_capacity, link->id + 1, 
pn_link_state_t);
-  for (unsigned i = old_capacity; i < ssn_state->link_capacity; i++)
-  {
-    pn_link_state_init(&ssn_state->links[i]);
-  }
-  pn_link_state_t *state = &ssn_state->links[link->id];
-  state->link = link;
-  return state;
+  state->remote_handle = handle;
+  pn_hash_put(ssn_state->remote_handles, handle, state->link);
 }
 
-void pn_map_handle(pn_session_state_t *ssn_state, uint32_t handle, 
pn_link_state_t *state)
+static void pn_unmap_handle(pn_session_state_t *ssn_state, pn_link_state_t 
*state)
 {
-  PN_ENSUREZ(ssn_state->handles, ssn_state->handle_capacity, handle + 1, 
pn_link_state_t*);
-  state->remote_handle = handle;
-  ssn_state->handles[handle] = state;
+  pn_hash_del(ssn_state->remote_handles, state->remote_handle);
+  state->remote_handle = -2;
 }
 
 pn_link_state_t *pn_handle_state(pn_session_state_t *ssn_state, uint32_t 
handle)
 {
-  PN_ENSUREZ(ssn_state->handles, ssn_state->handle_capacity, handle + 1, 
pn_link_state_t*);
-  return ssn_state->handles[handle];
+  pn_link_t *link = (pn_link_t *) pn_hash_get(ssn_state->remote_handles, 
handle);
+  return &link->state;
 }
 
 pn_link_t *pn_sender(pn_session_t *session, const char *name)
@@ -1457,14 +1449,14 @@ int pn_do_begin(pn_dispatcher_t *disp)
   int err = pn_scan_args(disp, "D.[?HI]", &reply, &remote_channel, &next);
   if (err) return err;
 
-  pn_session_state_t *state;
+  pn_session_t *ssn;
   if (reply) {
     // XXX: what if session is NULL?
-    state = &transport->sessions[remote_channel];
+    ssn = (pn_session_t *) pn_hash_get(transport->local_channels, 
remote_channel);
   } else {
-    pn_session_t *ssn = pn_session(transport->connection);
-    state = pn_session_get_state(transport, ssn);
+    ssn = pn_session(transport->connection);
   }
+  pn_session_state_t *state = pn_session_get_state(transport, ssn);
   state->incoming_transfer_count = next;
   pn_map_channel(transport, disp->channel, state);
   PN_SET_REMOTE(state->session->endpoint.state, PN_REMOTE_ACTIVE);
@@ -1800,7 +1792,7 @@ int pn_do_detach(pn_dispatcher_t *disp)
   err = pn_scan_error(disp, &link->endpoint.remote_condition, true);
   if (err) return err;
 
-  link_state->remote_handle = -2;
+  pn_unmap_handle(ssn_state, link_state);
 
   if (closed)
   {
@@ -1819,7 +1811,7 @@ int pn_do_end(pn_dispatcher_t *disp)
   pn_session_t *session = ssn_state->session;
   int err = pn_scan_error(disp, &session->endpoint.remote_condition, false);
   if (err) return err;
-  ssn_state->remote_channel = -2;
+  pn_unmap_channel(transport, ssn_state);
   PN_SET_REMOTE(session->endpoint.state, PN_REMOTE_CLOSED);
   return 0;
 }
@@ -2035,6 +2027,18 @@ int pn_process_conn_setup(pn_transport_t
   return 0;
 }
 
+static uint16_t allocate_alias(pn_hash_t *aliases)
+{
+  for (uint32_t i = 0; i < 65536; i++) {
+    if (!pn_hash_get(aliases, i)) {
+      return i;
+    }
+  }
+
+  assert(false);
+  return 0;
+}
+
 int pn_process_ssn_setup(pn_transport_t *transport, pn_endpoint_t *endpoint)
 {
   if (endpoint->type == SESSION && transport->open_sent)
@@ -2043,15 +2047,14 @@ int pn_process_ssn_setup(pn_transport_t 
     pn_session_state_t *state = pn_session_get_state(transport, ssn);
     if (!(endpoint->state & PN_LOCAL_UNINIT) && state->local_channel == 
(uint16_t) -1)
     {
-      // XXX: we use the session id as the outgoing channel, we depend
-      // on this for looking up via remote channel
-      uint16_t channel = ssn->id;
+      uint16_t channel = allocate_alias(transport->local_channels);
       pn_post_frame(transport->disp, channel, "DL[?HIII]", BEGIN,
                     ((int16_t) state->remote_channel >= 0), 
state->remote_channel,
                     state->outgoing_transfer_count,
                     pn_delivery_buffer_available(&state->incoming),
                     pn_delivery_buffer_available(&state->outgoing));
       state->local_channel = channel;
+      pn_hash_put(transport->local_channels, channel, ssn);
     }
   }
 
@@ -2085,8 +2088,8 @@ int pn_process_link_setup(pn_transport_t
     if (((int16_t) ssn_state->local_channel >= 0) &&
         !(endpoint->state & PN_LOCAL_UNINIT) && state->local_handle == 
(uint32_t) -1)
     {
-      // XXX
-      state->local_handle = link->id;
+      state->local_handle = allocate_alias(ssn_state->local_handles);
+      pn_hash_put(ssn_state->local_handles, state->local_handle, link);
       int err = pn_post_frame(transport->disp, ssn_state->local_channel,
                               "DL[SIonn?DL[SIsIoCnCnCC]?DL[SIsIoCC]nnI]", 
ATTACH,
                               pn_string_get(link->name),

Modified: qpid/proton/trunk/proton-c/src/protocol.h.py
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/protocol.h.py?rev=1486299&r1=1486298&r2=1486299&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/protocol.h.py (original)
+++ qpid/proton/trunk/proton-c/src/protocol.h.py Sat May 25 08:23:02 2013
@@ -25,6 +25,8 @@ print "#ifndef _PROTON_PROTOCOL_H"
 print "#define _PROTON_PROTOCOL_H 1"
 print
 
+fields = {}
+
 for type in TYPES:
   fidx = 0
   for f in type.query["field"]:
@@ -40,7 +42,39 @@ for type in TYPES:
   hi, lo = [int(x, 0) for x in desc["@code"].split(":")]
   code = (hi << 32) + lo
   print "#define %s ((uint64_t) %s)" % (name, code)
+  fields[code] = (type["@name"], [f["@name"] for f in type.query["field"]])
   idx += 1
 
 print
+
+print """typedef struct {
+  const char *name;
+  const char *fields[32];
+} pn_fields_t;"""
+
+print
+
+print "#ifndef DEFINE_FIELDS"
+print "extern"
+print "#endif"
+
+print "pn_fields_t FIELDS[256]"
+print "#ifdef DEFINE_FIELDS"
+print " = {"
+
+for i in range(256):
+  if i in fields:
+    name, fnames = fields[i]
+    if fnames:
+      print '  {"%s", {%s}},' % (name, ", ".join(['"%s"' % f for f in fnames]))
+    else:
+      print '  {"%s", {NULL}},' % name
+  else:
+    print '  {NULL, {NULL}},'
+
+print "}"
+print "#endif"
+print ";"
+
+print
 print "#endif /* protocol.h */"

Modified: qpid/proton/trunk/proton-c/src/sasl/sasl.c
URL: 
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/sasl/sasl.c?rev=1486299&r1=1486298&r2=1486299&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/sasl/sasl.c (original)
+++ qpid/proton/trunk/proton-c/src/sasl/sasl.c Sat May 25 08:23:02 2013
@@ -70,11 +70,11 @@ pn_sasl_t *pn_sasl(pn_transport_t *trans
     sasl->disp = pn_dispatcher(1, sasl);
     sasl->disp->batch = false;
 
-    pn_dispatcher_action(sasl->disp, SASL_INIT, "SASL-INIT", pn_do_init);
-    pn_dispatcher_action(sasl->disp, SASL_MECHANISMS, "SASL-MECHANISMS", 
pn_do_mechanisms);
-    pn_dispatcher_action(sasl->disp, SASL_CHALLENGE, "SASL-CHALLENGE", 
pn_do_challenge);
-    pn_dispatcher_action(sasl->disp, SASL_RESPONSE, "SASL-RESPONSE", 
pn_do_response);
-    pn_dispatcher_action(sasl->disp, SASL_OUTCOME, "SASL-OUTCOME", 
pn_do_outcome);
+    pn_dispatcher_action(sasl->disp, SASL_INIT, pn_do_init);
+    pn_dispatcher_action(sasl->disp, SASL_MECHANISMS, pn_do_mechanisms);
+    pn_dispatcher_action(sasl->disp, SASL_CHALLENGE, pn_do_challenge);
+    pn_dispatcher_action(sasl->disp, SASL_RESPONSE, pn_do_response);
+    pn_dispatcher_action(sasl->disp, SASL_OUTCOME, pn_do_outcome);
 
     sasl->client = false;
     sasl->configured = false;



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

Reply via email to