You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rh...@apache.org on 2013/12/04 16:47:31 UTC

svn commit: r1547827 - in /qpid/proton/trunk/proton-c: include/proton/engine.h src/dispatcher/dispatcher.c src/dispatcher/dispatcher.h src/engine/engine-internal.h src/sasl/sasl.c src/transport/transport.c

Author: rhs
Date: Wed Dec  4 15:47:30 2013
New Revision: 1547827

URL: http://svn.apache.org/r1547827
Log:
PROTON-343: added logging callback for proton-c

Modified:
    qpid/proton/trunk/proton-c/include/proton/engine.h
    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/sasl/sasl.c
    qpid/proton/trunk/proton-c/src/transport/transport.c

Modified: qpid/proton/trunk/proton-c/include/proton/engine.h
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/include/proton/engine.h?rev=1547827&r1=1547826&r2=1547827&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/include/proton/engine.h (original)
+++ qpid/proton/trunk/proton-c/include/proton/engine.h Wed Dec  4 15:47:30 2013
@@ -120,6 +120,7 @@ typedef int pn_state_t;     /**< encodes
 #define PN_MODIFIED (0x0000000000000027)
 
 typedef int pn_trace_t;
+typedef void (pn_tracer_t)(pn_transport_t *transport, const char *message);
 
 #define PN_TRACE_OFF (0)
 #define PN_TRACE_RAW (1)
@@ -435,6 +436,10 @@ PN_EXTERN int pn_transport_close_head(pn
  */
 PN_EXTERN pn_timestamp_t pn_transport_tick(pn_transport_t *transport, pn_timestamp_t now);
 PN_EXTERN void pn_transport_trace(pn_transport_t *transport, pn_trace_t trace);
+PN_EXTERN void pn_transport_set_tracer(pn_transport_t *transport, pn_tracer_t *tracer);
+PN_EXTERN pn_tracer_t *pn_transport_get_tracer(pn_transport_t *transport);
+PN_EXTERN void pn_transport_log(pn_transport_t *transport, const char *message);
+PN_EXTERN void pn_transport_logf(pn_transport_t *transport, const char *fmt, ...);
 // max frame of zero means "unlimited"
 PN_EXTERN uint32_t pn_transport_get_max_frame(pn_transport_t *transport);
 PN_EXTERN void pn_transport_set_max_frame(pn_transport_t *transport, uint32_t size);

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=1547827&r1=1547826&r2=1547827&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.c (original)
+++ qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.c Wed Dec  4 15:47:30 2013
@@ -30,12 +30,12 @@
 #include "../util.h"
 #include "../platform_fmt.h"
 
-pn_dispatcher_t *pn_dispatcher(uint8_t frame_type, void *context)
+pn_dispatcher_t *pn_dispatcher(uint8_t frame_type, pn_transport_t *transport)
 {
   pn_dispatcher_t *disp = (pn_dispatcher_t *) calloc(sizeof(pn_dispatcher_t), 1);
 
   disp->frame_type = frame_type;
-  disp->context = context;
+  disp->transport = transport;
   disp->trace = PN_TRACE_OFF;
 
   disp->input = pn_buffer(1024);
@@ -57,6 +57,8 @@ pn_dispatcher_t *pn_dispatcher(uint8_t f
   disp->halt = false;
   disp->batch = true;
 
+  disp->scratch = pn_string(NULL);
+
   return disp;
 }
 
@@ -68,6 +70,7 @@ void pn_dispatcher_free(pn_dispatcher_t 
     pn_data_free(disp->output_args);
     pn_buffer_free(disp->frame);
     free(disp->output);
+    pn_free(disp->scratch);
     free(disp);
   }
 }
@@ -84,45 +87,35 @@ static void pn_do_trace(pn_dispatcher_t 
                         pn_data_t *args, const char *payload, size_t size)
 {
   if (disp->trace & PN_TRACE_FRM) {
-    size_t n = SCRATCH;
-    pn_data_format(args, disp->scratch, &n);
-    pn_dispatcher_trace(disp, ch, "%s %s", dir == OUT ? "->" : "<-",
-                        disp->scratch);
+    pn_string_format(disp->scratch, "%u %s ", ch, dir == OUT ? "->" : "<-");
+    pn_inspect(args, disp->scratch);
+
     if (size) {
       char buf[1024];
       int e = pn_quote_data(buf, 1024, payload, size);
-      fprintf(stderr, " (%" PN_ZU ") \"%s\"%s\n", size, buf,
-              e == PN_OVERFLOW ? "... (truncated)" : "");
-    } else {
-      fprintf(stderr, "\n");
+      pn_string_addf(disp->scratch, " (%" PN_ZU ") \"%s\"%s", size, buf,
+                     e == PN_OVERFLOW ? "... (truncated)" : "");
     }
-  }
-}
 
-void pn_dispatcher_trace(pn_dispatcher_t *disp, uint16_t ch, const char *fmt, ...)
-{
-  va_list ap;
-  fprintf(stderr, "[%p:%u] ", (void *) disp, ch);
-
-  va_start(ap, fmt);
-  vfprintf(stderr, fmt, ap);
-  va_end(ap);
+    pn_transport_log(disp->transport, pn_string_get(disp->scratch));
+  }
 }
 
 int pn_dispatch_frame(pn_dispatcher_t *disp, pn_frame_t frame)
 {
   if (frame.size == 0) { // ignore null frames
     if (disp->trace & PN_TRACE_FRM)
-      pn_dispatcher_trace(disp, frame.channel, "<- (EMPTY FRAME)\n");
+      pn_transport_logf(disp->transport, "%u <- (EMPTY FRAME)\n", frame.channel);
     return 0;
   }
 
   ssize_t dsize = pn_data_decode(disp->args, frame.payload, frame.size);
   if (dsize < 0) {
-    fprintf(stderr, "Error decoding frame: %s %s\n", pn_code(dsize),
-            pn_error_text(pn_data_error(disp->args)));
-    pn_fprint_data(stderr, frame.payload, frame.size);
-    fprintf(stderr, "\n");
+    pn_string_format(disp->scratch,
+                     "Error decoding frame: %s %s\n", pn_code(dsize),
+                     pn_error_text(pn_data_error(disp->args)));
+    pn_quote(disp->scratch, frame.payload, frame.size);
+    pn_transport_log(disp->transport, pn_string_get(disp->scratch));
     return dsize;
   }
 
@@ -132,11 +125,11 @@ int pn_dispatch_frame(pn_dispatcher_t *d
   bool scanned;
   int e = pn_data_scan(disp->args, "D?L.", &scanned, &lcode);
   if (e) {
-    fprintf(stderr, "Scan error\n");
+    pn_transport_log(disp->transport, "Scan error");
     return e;
   }
   if (!scanned) {
-    fprintf(stderr, "Error dispatching frame\n");
+    pn_transport_log(disp->transport, "Error dispatching frame");
     return PN_ERR;
   }
   uint8_t code = lcode;
@@ -207,8 +200,9 @@ int pn_post_frame(pn_dispatcher_t *disp,
   int err = pn_data_vfill(disp->output_args, fmt, ap);
   va_end(ap);
   if (err) {
-    fprintf(stderr, "error posting frame: %s, %s: %s\n", fmt, pn_code(err),
-            pn_error_text(pn_data_error(disp->output_args)));
+    pn_transport_logf(disp->transport,
+                      "error posting frame: %s, %s: %s", fmt, pn_code(err),
+                      pn_error_text(pn_data_error(disp->output_args)));
     return PN_ERR;
   }
 
@@ -225,7 +219,8 @@ int pn_post_frame(pn_dispatcher_t *disp,
       pn_buffer_ensure( disp->frame, pn_buffer_available( disp->frame ) * 2 );
       goto encode_performatives;
     }
-    fprintf(stderr, "error posting frame: %s", pn_code(wr));
+    pn_transport_logf(disp->transport,
+                      "error posting frame: %s", pn_code(wr));
     return PN_ERR;
   }
 
@@ -241,9 +236,10 @@ int pn_post_frame(pn_dispatcher_t *disp,
   }
   disp->output_frames_ct += 1;
   if (disp->trace & PN_TRACE_RAW) {
-    fprintf(stderr, "RAW: \"");
-    pn_fprint_data(stderr, disp->output + disp->available, n);
-    fprintf(stderr, "\"\n");
+    pn_string_set(disp->scratch, "RAW: \"");
+    pn_quote(disp->scratch, disp->output + disp->available, n);
+    pn_string_addf(disp->scratch, "\"");
+    pn_transport_log(disp->transport, pn_string_get(disp->scratch));
   }
   disp->available += n;
 
@@ -282,8 +278,9 @@ int pn_post_transfer_frame(pn_dispatcher
                          message_format,
                          settled, more_flag);
   if (err) {
-    fprintf(stderr, "error posting transfer frame: %s: %s\n", pn_code(err),
-            pn_error_text(pn_data_error(disp->output_args)));
+    pn_transport_logf(disp->transport,
+                      "error posting transfer frame: %s: %s", pn_code(err),
+                      pn_error_text(pn_data_error(disp->output_args)));
     return PN_ERR;
   }
 
@@ -300,7 +297,7 @@ int pn_post_transfer_frame(pn_dispatcher
         pn_buffer_ensure( disp->frame, pn_buffer_available( disp->frame ) * 2 );
         goto encode_performatives;
       }
-      fprintf(stderr, "error posting frame: %s", pn_code(wr));
+      pn_transport_logf(disp->transport, "error posting frame: %s", pn_code(wr));
       return PN_ERR;
     }
     buf.size = wr;
@@ -348,9 +345,10 @@ int pn_post_transfer_frame(pn_dispatcher
     disp->output_frames_ct += 1;
     framecount++;
     if (disp->trace & PN_TRACE_RAW) {
-      fprintf(stderr, "RAW: \"");
-      pn_fprint_data(stderr, disp->output + disp->available, n);
-      fprintf(stderr, "\"\n");
+      pn_string_set(disp->scratch, "RAW: \"");
+      pn_quote(disp->scratch, disp->output + disp->available, n);
+      pn_string_addf(disp->scratch, "\"");
+      pn_transport_log(disp->transport, pn_string_get(disp->scratch));
     }
     disp->available += n;
   } while (disp->output_size > 0 && framecount < frame_limit);

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=1547827&r1=1547826&r2=1547827&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.h (original)
+++ qpid/proton/trunk/proton-c/src/dispatcher/dispatcher.h Wed Dec  4 15:47:30 2013
@@ -55,15 +55,15 @@ struct pn_dispatcher_t {
   size_t capacity;
   size_t available; /* number of raw bytes pending output */
   char *output;
-  void *context;
+  pn_transport_t *transport;
   bool halt;
   bool batch;
   uint64_t output_frames_ct;
   uint64_t input_frames_ct;
-  char scratch[SCRATCH];
+  pn_string_t *scratch;
 };
 
-pn_dispatcher_t *pn_dispatcher(uint8_t frame_type, void *context);
+pn_dispatcher_t *pn_dispatcher(uint8_t frame_type, pn_transport_t *transport);
 void pn_dispatcher_free(pn_dispatcher_t *disp);
 void pn_dispatcher_action(pn_dispatcher_t *disp, uint8_t code,
                           pn_action_t *action);
@@ -72,7 +72,6 @@ void pn_set_payload(pn_dispatcher_t *dis
 int pn_post_frame(pn_dispatcher_t *disp, uint16_t ch, const char *fmt, ...);
 ssize_t pn_dispatcher_input(pn_dispatcher_t *disp, const char *bytes, size_t available);
 ssize_t pn_dispatcher_output(pn_dispatcher_t *disp, char *bytes, size_t size);
-void pn_dispatcher_trace(pn_dispatcher_t *disp, uint16_t ch, const char *fmt, ...);
 int pn_post_transfer_frame(pn_dispatcher_t *disp,
                            uint16_t local_channel,
                            uint32_t handle,

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=1547827&r1=1547826&r2=1547827&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/engine/engine-internal.h (original)
+++ qpid/proton/trunk/proton-c/src/engine/engine-internal.h Wed Dec  4 15:47:30 2013
@@ -110,6 +110,7 @@ typedef struct pn_io_layer_t {
 } pn_io_layer_t;
 
 struct pn_transport_t {
+  pn_tracer_t *tracer;
   size_t header_count;
   pn_sasl_t *sasl;
   pn_ssl_t *ssl;
@@ -150,7 +151,7 @@ struct pn_transport_t {
   pn_error_t *error;
   pn_hash_t *local_channels;
   pn_hash_t *remote_channels;
-  char scratch[SCRATCH];
+  pn_string_t *scratch;
 
   /* statistics */
   uint64_t bytes_input;

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=1547827&r1=1547826&r2=1547827&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/sasl/sasl.c (original)
+++ qpid/proton/trunk/proton-c/src/sasl/sasl.c Wed Dec  4 15:47:30 2013
@@ -67,7 +67,7 @@ pn_sasl_t *pn_sasl(pn_transport_t *trans
 {
   if (!transport->sasl) {
     pn_sasl_t *sasl = (pn_sasl_t *) malloc(sizeof(pn_sasl_t));
-    sasl->disp = pn_dispatcher(1, sasl);
+    sasl->disp = pn_dispatcher(1, transport);
     sasl->disp->batch = false;
 
     pn_dispatcher_action(sasl->disp, SASL_INIT, pn_do_init);
@@ -356,7 +356,7 @@ ssize_t pn_sasl_output(pn_sasl_t *sasl, 
 
 int pn_do_init(pn_dispatcher_t *disp)
 {
-  pn_sasl_t *sasl = (pn_sasl_t *) disp->context;
+  pn_sasl_t *sasl = disp->transport->sasl;
   pn_bytes_t mech;
   pn_bytes_t recv;
   int err = pn_scan_args(disp, "D.[sz]", &mech, &recv);
@@ -369,14 +369,14 @@ int pn_do_init(pn_dispatcher_t *disp)
 
 int pn_do_mechanisms(pn_dispatcher_t *disp)
 {
-  pn_sasl_t *sasl = (pn_sasl_t *) disp->context;
+  pn_sasl_t *sasl = disp->transport->sasl;
   sasl->rcvd_init = true;
   return 0;
 }
 
 int pn_do_recv(pn_dispatcher_t *disp)
 {
-  pn_sasl_t *sasl = (pn_sasl_t *) disp->context;
+  pn_sasl_t *sasl = disp->transport->sasl;
   pn_bytes_t recv;
   int err = pn_scan_args(disp, "D.[z]", &recv);
   if (err) return err;
@@ -396,7 +396,7 @@ int pn_do_response(pn_dispatcher_t *disp
 
 int pn_do_outcome(pn_dispatcher_t *disp)
 {
-  pn_sasl_t *sasl = (pn_sasl_t *) disp->context;
+  pn_sasl_t *sasl = disp->transport->sasl;
   uint8_t outcome;
   int err = pn_scan_args(disp, "D.[B]", &outcome);
   if (err) return err;
@@ -425,7 +425,7 @@ static ssize_t pn_input_read_sasl_header
     if (sasl->header_count == SASL_HEADER_LEN) {
       sasl->io_layer->process_input = pn_input_read_sasl;
       if (sasl->disp->trace & PN_TRACE_FRM)
-        fprintf(stderr, "    <- %s\n", "SASL");
+        pn_transport_logf(sasl->transport, "  <- %s", "SASL");
     }
     return delta;
   }
@@ -447,7 +447,7 @@ static ssize_t pn_output_write_sasl_head
 {
   pn_sasl_t *sasl = (pn_sasl_t *)io_layer->context;
   if (sasl->disp->trace & PN_TRACE_FRM)
-    fprintf(stderr, "    -> %s\n", "SASL");
+    pn_transport_logf(sasl->transport, "  -> %s", "SASL");
   if (size >= SASL_HEADER_LEN) {
     memmove(bytes, SASL_HEADER, SASL_HEADER_LEN);
     sasl->io_layer->process_output = pn_output_write_sasl;

Modified: qpid/proton/trunk/proton-c/src/transport/transport.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/transport/transport.c?rev=1547827&r1=1547826&r2=1547827&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/transport/transport.c (original)
+++ qpid/proton/trunk/proton-c/src/transport/transport.c Wed Dec  4 15:47:30 2013
@@ -104,11 +104,18 @@ static ssize_t pn_output_write_amqp_head
 static ssize_t pn_output_write_amqp(pn_io_layer_t *io_layer, char *bytes, size_t available);
 static pn_timestamp_t pn_tick_amqp(pn_io_layer_t *io_layer, pn_timestamp_t now);
 
+static void pni_default_tracer(pn_transport_t *transport, const char *message)
+{
+  fprintf(stderr, "[%p]:%s\n", (void *) transport, message);
+}
+
 void pn_transport_init(pn_transport_t *transport)
 {
+  transport->tracer = pni_default_tracer;
   transport->header_count = 0;
   transport->sasl = NULL;
   transport->ssl = NULL;
+  transport->scratch = pn_string(NULL);
   transport->disp = pn_dispatcher(0, transport);
 
   pn_io_layer_t *io_layer = transport->io_layers;
@@ -233,6 +240,7 @@ void pn_transport_free(pn_transport_t *t
   pn_free(transport->remote_channels);
   free(transport->input_buf);
   free(transport->output_buf);
+  pn_free(transport->scratch);
   free(transport);
 }
 
@@ -377,7 +385,7 @@ int pn_do_error(pn_transport_t *transpor
     transport->close_sent = true;
   }
   transport->disp->halt = true;
-  fprintf(stderr, "ERROR %s %s\n", condition, pn_error_text(transport->error));
+  pn_transport_logf(transport, "ERROR %s %s", condition, pn_error_text(transport->error));
   return PN_ERR;
 }
 
@@ -388,7 +396,7 @@ static char *pn_bytes_strdup(pn_bytes_t 
 
 int pn_do_open(pn_dispatcher_t *disp)
 {
-  pn_transport_t *transport = (pn_transport_t *) disp->context;
+  pn_transport_t *transport = disp->transport;
   pn_connection_t *conn = transport->connection;
   bool container_q, hostname_q;
   pn_bytes_t remote_container, remote_hostname;
@@ -405,8 +413,8 @@ int pn_do_open(pn_dispatcher_t *disp)
   if (err) return err;
   if (transport->remote_max_frame > 0) {
     if (transport->remote_max_frame < AMQP_MIN_MAX_FRAME_SIZE) {
-      fprintf(stderr, "Peer advertised bad max-frame (%u), forcing to %u\n",
-              transport->remote_max_frame, AMQP_MIN_MAX_FRAME_SIZE);
+      pn_transport_logf(transport, "Peer advertised bad max-frame (%u), forcing to %u",
+                        transport->remote_max_frame, AMQP_MIN_MAX_FRAME_SIZE);
       transport->remote_max_frame = AMQP_MIN_MAX_FRAME_SIZE;
     }
     disp->remote_max_frame = transport->remote_max_frame;
@@ -436,7 +444,7 @@ int pn_do_open(pn_dispatcher_t *disp)
 
 int pn_do_begin(pn_dispatcher_t *disp)
 {
-  pn_transport_t *transport = (pn_transport_t *) disp->context;
+  pn_transport_t *transport = disp->transport;
   bool reply;
   uint16_t remote_channel;
   pn_sequence_t next;
@@ -524,7 +532,7 @@ int pn_terminus_set_address_bytes(pn_ter
 
 int pn_do_attach(pn_dispatcher_t *disp)
 {
-  pn_transport_t *transport = (pn_transport_t *) disp->context;
+  pn_transport_t *transport = disp->transport;
   pn_bytes_t name;
   uint32_t handle;
   bool is_sender;
@@ -641,7 +649,7 @@ void pn_full_settle(pn_delivery_map_t *d
 int pn_do_transfer(pn_dispatcher_t *disp)
 {
   // XXX: multi transfer
-  pn_transport_t *transport = (pn_transport_t *) disp->context;
+  pn_transport_t *transport = disp->transport;
   uint32_t handle;
   pn_bytes_t tag;
   bool id_present;
@@ -710,7 +718,7 @@ int pn_do_transfer(pn_dispatcher_t *disp
 
 int pn_do_flow(pn_dispatcher_t *disp)
 {
-  pn_transport_t *transport = (pn_transport_t *) disp->context;
+  pn_transport_t *transport = disp->transport;
   pn_sequence_t onext, inext, delivery_count;
   uint32_t iwin, owin, link_credit;
   uint32_t handle;
@@ -777,7 +785,7 @@ static int pn_scan_error(pn_data_t *data
 
 int pn_do_disposition(pn_dispatcher_t *disp)
 {
-  pn_transport_t *transport = (pn_transport_t *) disp->context;
+  pn_transport_t *transport = disp->transport;
   bool role;
   pn_sequence_t first, last;
   uint64_t type = 0;
@@ -854,7 +862,7 @@ int pn_do_disposition(pn_dispatcher_t *d
 
 int pn_do_detach(pn_dispatcher_t *disp)
 {
-  pn_transport_t *transport = (pn_transport_t *) disp->context;
+  pn_transport_t *transport = disp->transport;
   uint32_t handle;
   bool closed;
   int err = pn_scan_args(disp, "D.[Io]", &handle, &closed);
@@ -883,7 +891,7 @@ int pn_do_detach(pn_dispatcher_t *disp)
 
 int pn_do_end(pn_dispatcher_t *disp)
 {
-  pn_transport_t *transport = (pn_transport_t *) disp->context;
+  pn_transport_t *transport = disp->transport;
   pn_session_t *ssn = pn_channel_state(transport, disp->channel);
   int err = pn_scan_error(disp->args, &ssn->endpoint.remote_condition, SCAN_ERROR_DEFAULT);
   if (err) return err;
@@ -894,7 +902,7 @@ int pn_do_end(pn_dispatcher_t *disp)
 
 int pn_do_close(pn_dispatcher_t *disp)
 {
-  pn_transport_t *transport = (pn_transport_t *) disp->context;
+  pn_transport_t *transport = disp->transport;
   pn_connection_t *conn = transport->connection;
   int err = pn_scan_error(disp->args, &transport->remote_condition, SCAN_ERROR_DEFAULT);
   if (err) return err;
@@ -947,12 +955,12 @@ static ssize_t transport_consume(pn_tran
       break;
     } else {
       if (n != PN_EOS) {
-        pn_dispatcher_trace(transport->disp, 0, "ERROR[%i] %s\n",
-                            pn_error_code(transport->error),
-                            pn_error_text(transport->error));
+        pn_transport_logf(transport, "ERROR[%i] %s\n",
+                          pn_error_code(transport->error),
+                          pn_error_text(transport->error));
       }
       if (transport->disp->trace & (PN_TRACE_RAW | PN_TRACE_FRM))
-        pn_dispatcher_trace(transport->disp, 0, "<- EOS\n");
+        pn_transport_log(transport, "  <- EOS");
       transport->input_pending = 0;  // XXX ???
       return n;
     }
@@ -983,7 +991,7 @@ static ssize_t pn_input_read_header(pn_t
       transport->io_layers[PN_IO_AMQP].process_input = next;
 
       if (transport->disp->trace & PN_TRACE_FRM)
-        fprintf(stderr, "    <- %s\n", protocol);
+        pn_transport_logf(transport, "  <- %s", protocol);
     }
     return delta;
   }
@@ -1623,7 +1631,7 @@ static ssize_t pn_output_write_header(pn
                                       ssize_t (*next)(pn_io_layer_t *, char *, size_t))
 {
   if (transport->disp->trace & PN_TRACE_FRM)
-    fprintf(stderr, "    -> %s\n", protocol);
+    pn_transport_logf(transport, "  -> %s", protocol);
   if (size >= hdrsize) {
     memmove(bytes, header, hdrsize);
     transport->io_layers[PN_IO_AMQP].process_output = next;
@@ -1700,10 +1708,10 @@ static ssize_t transport_produce(pn_tran
         break;   // return what is available
       if (transport->disp->trace & (PN_TRACE_RAW | PN_TRACE_FRM)) {
         if (n == PN_EOS)
-          pn_dispatcher_trace(transport->disp, 0, "-> EOS\n");
+          pn_transport_log(transport, "  -> EOS");
         else
-          pn_dispatcher_trace(transport->disp, 0, "-> EOS (%" PN_ZI ") %s\n", n,
-                              pn_error_text(transport->error));
+          pn_transport_logf(transport, "  -> EOS (%" PN_ZI ") %s", n,
+                            pn_error_text(transport->error));
       }
       return n;
     }
@@ -1732,6 +1740,37 @@ void pn_transport_trace(pn_transport_t *
   transport->disp->trace = trace;
 }
 
+void pn_transport_set_tracer(pn_transport_t *transport, pn_tracer_t *tracer)
+{
+  assert(transport);
+  assert(tracer);
+
+  transport->tracer = tracer;
+}
+
+pn_tracer_t *pn_transport_get_tracer(pn_transport_t *transport)
+{
+  assert(transport);
+  return transport->tracer;
+}
+
+void pn_transport_log(pn_transport_t *transport, const char *message)
+{
+  assert(transport);
+  transport->tracer(transport, message);
+}
+
+void pn_transport_logf(pn_transport_t *transport, const char *fmt, ...)
+{
+  va_list ap;
+
+  va_start(ap, fmt);
+  pn_string_vformat(transport->scratch, fmt, ap);
+  va_end(ap);
+
+  pn_transport_log(transport, pn_string_get(transport->scratch));
+}
+
 uint32_t pn_transport_get_max_frame(pn_transport_t *transport)
 {
   return transport->local_max_frame;



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