in c/benchmarks/connection-driver.cpp [261:350]
static void handle_sender(app_data_t *app, pn_event_t *event) {
switch (pn_event_type(event)) {
case PN_CONNECTION_INIT: {
pn_connection_t *c = pn_event_connection(event);
pn_connection_set_container(c, "sendercid");
pn_connection_open(c);
pn_session_t *s = pn_session(c);
pn_session_open(s);
pn_link_t *l = pn_sender(s, "my_sender");
pn_terminus_set_address(pn_link_target(l), "example");
pn_link_set_snd_settle_mode(l, PN_SND_UNSETTLED);
pn_link_set_rcv_settle_mode(l, PN_RCV_FIRST);
pn_link_open(l);
} break;
case PN_LINK_FLOW: {
if (VERBOSE)
printf("BEGIN handle_sender: PN_LINK_FLOW\n");
/* The peer has given us some credit, now we can send messages */
pn_link_t *sender = pn_event_link(event);
while (pn_link_credit(sender) > 0 && app->sent != app->message_count) {
++app->sent;
/* Use sent counter as unique delivery tag. */
pn_delivery(sender, pn_dtag((const char *)&app->sent, sizeof(app->sent)));
send_message(app, sender);
}
break;
}
case PN_DELIVERY: {
/* We received acknowledgement from the peer that a message was delivered. */
pn_delivery_t *d = pn_event_delivery(event);
if (pn_delivery_remote_state(d) == PN_ACCEPTED) {
if (VERBOSE)
printf("got PN_ACCEPTED\n");
if (++app->acknowledged == app->message_count) {
if (VERBOSE)
printf("%d messages sent and acknowledged\n", app->acknowledged);
pn_connection_close(pn_event_connection(event));
/* Continue handling events till we receive TRANSPORT_CLOSED */
}
} else {
fprintf(stderr, "unexpected delivery state %d\n", (int) pn_delivery_remote_state(d));
pn_connection_close(pn_event_connection(event));
exit(EXIT_FAILURE);
}
break;
}
case PN_CONNECTION_REMOTE_OPEN:
pn_connection_open(pn_event_connection(event)); /* Complete the open */
break;
case PN_SESSION_REMOTE_OPEN:
pn_session_open(pn_event_session(event));
break;
case PN_TRANSPORT_ERROR:
check_condition(event, pn_transport_condition(pn_event_transport(event)));
pn_connection_close(pn_event_connection(event));
break;
case PN_CONNECTION_REMOTE_CLOSE:
check_condition(event,
pn_connection_remote_condition(pn_event_connection(event)));
pn_connection_close(pn_event_connection(event));
break;
case PN_SESSION_REMOTE_CLOSE:
check_condition(event,
pn_session_remote_condition(pn_event_session(event)));
pn_connection_close(pn_event_connection(event));
break;
case PN_LINK_REMOTE_CLOSE:
case PN_LINK_REMOTE_DETACH:
check_condition(event, pn_link_remote_condition(pn_event_link(event)));
pn_connection_close(pn_event_connection(event));
break;
case PN_TRANSPORT_CLOSED:
app->closed++;
break;
default:
break;
}
}