static void AMQP_opened_handler(qd_router_t *router, qd_connection_t *conn, bool inbound) { qdr_connection_role_t role = 0; int cost = 1; int remote_cost = 1; bool strip_annotations_in = false; bool strip_annotations_out = false; int link_capacity = 1; const char *name = 0; uint64_t connection_id = qd_connection_connection_id(conn); pn_connection_t *pn_conn = qd_connection_pn(conn); qd_router_connection_get_config(conn, &role, &cost, &name, &strip_annotations_in, &strip_annotations_out, &link_capacity); if (role == QDR_ROLE_INTER_ROUTER) { // // Check the remote properties for an inter-router cost value. // pn_data_t *props = pn_conn ? pn_connection_remote_properties(pn_conn) : 0; if (props) { pn_data_rewind(props); pn_data_next(props); if (props && pn_data_type(props) == PN_MAP) { pn_data_enter(props); while (pn_data_next(props)) { if (pn_data_type(props) == PN_SYMBOL) { pn_bytes_t sym = pn_data_get_symbol(props); if (sym.size == strlen(QD_CONNECTION_PROPERTY_COST_KEY) && strcmp(sym.start, QD_CONNECTION_PROPERTY_COST_KEY) == 0) { pn_data_next(props); if (pn_data_type(props) == PN_INT) remote_cost = pn_data_get_int(props); break; } } } } } // // Use the larger of the local and remote costs for this connection // if (remote_cost > cost) cost = remote_cost; } qdr_connection_t *qdrc = qdr_connection_opened(router->router_core, inbound, role, cost, connection_id, name, pn_connection_remote_container(pn_conn), strip_annotations_in, strip_annotations_out, link_capacity); qd_connection_set_context(conn, qdrc); qdr_connection_set_context(qdrc, conn); }
void DataReader::readOne(pn_data_t* data) { qpid::amqp::Descriptor descriptor(0); bool described = pn_data_is_described(data); if (described) { pn_data_enter(data); pn_data_next(data); if (pn_data_type(data) == PN_ULONG) { descriptor = qpid::amqp::Descriptor(pn_data_get_ulong(data)); } else if (pn_data_type(data) == PN_SYMBOL) { descriptor = qpid::amqp::Descriptor(convert(pn_data_get_symbol(data))); } else { QPID_LOG(notice, "Ignoring descriptor of type " << pn_data_type(data)); } pn_data_next(data); } switch (pn_data_type(data)) { case PN_NULL: reader.onNull(described ? &descriptor : 0); break; case PN_BOOL: reader.onBoolean(pn_data_get_bool(data), described ? &descriptor : 0); break; case PN_UBYTE: reader.onUByte(pn_data_get_ubyte(data), described ? &descriptor : 0); break; case PN_BYTE: reader.onByte(pn_data_get_byte(data), described ? &descriptor : 0); break; case PN_USHORT: reader.onUShort(pn_data_get_ushort(data), described ? &descriptor : 0); break; case PN_SHORT: reader.onShort(pn_data_get_short(data), described ? &descriptor : 0); break; case PN_UINT: reader.onUInt(pn_data_get_uint(data), described ? &descriptor : 0); break; case PN_INT: reader.onInt(pn_data_get_int(data), described ? &descriptor : 0); break; case PN_CHAR: pn_data_get_char(data); break; case PN_ULONG: reader.onULong(pn_data_get_ulong(data), described ? &descriptor : 0); break; case PN_LONG: reader.onLong(pn_data_get_long(data), described ? &descriptor : 0); break; case PN_TIMESTAMP: reader.onTimestamp(pn_data_get_timestamp(data), described ? &descriptor : 0); break; case PN_FLOAT: reader.onFloat(pn_data_get_float(data), described ? &descriptor : 0); break; case PN_DOUBLE: reader.onDouble(pn_data_get_double(data), described ? &descriptor : 0); break; case PN_DECIMAL32: pn_data_get_decimal32(data); break; case PN_DECIMAL64: pn_data_get_decimal64(data); break; case PN_DECIMAL128: pn_data_get_decimal128(data); break; case PN_UUID: reader.onUuid(convert(pn_data_get_uuid(data)), described ? &descriptor : 0); break; case PN_BINARY: reader.onBinary(convert(pn_data_get_binary(data)), described ? &descriptor : 0); break; case PN_STRING: reader.onString(convert(pn_data_get_string(data)), described ? &descriptor : 0); break; case PN_SYMBOL: reader.onSymbol(convert(pn_data_get_symbol(data)), described ? &descriptor : 0); break; case PN_DESCRIBED: break; case PN_ARRAY: readArray(data, described ? &descriptor : 0); break; case PN_LIST: readList(data, described ? &descriptor : 0); break; case PN_MAP: readMap(data, described ? &descriptor : 0); break; } if (described) pn_data_exit(data); }