void EncodedMessage::getBody(std::string& raw, qpid::types::Variant& c) const { try { if (!content.isVoid()) { c = content;//integer types, floats, bool etc //TODO: populate raw data? } else { if (bodyType.empty() || bodyType == qpid::amqp::typecodes::BINARY_NAME || bodyType == qpid::types::encodings::UTF8 || bodyType == qpid::types::encodings::ASCII) { c = std::string(body.data, body.size); c.setEncoding(bodyType); } else if (bodyType == qpid::amqp::typecodes::LIST_NAME) { qpid::amqp::ListBuilder builder; qpid::amqp::Decoder decoder(body.data, body.size); decoder.read(builder); c = builder.getList(); raw.assign(body.data, body.size); } else if (bodyType == qpid::amqp::typecodes::MAP_NAME) { qpid::types::Variant v = qpid::types::Variant::Map(); qpid::amqp::DataBuilder builder(v); qpid::amqp::Decoder decoder(body.data, body.size); decoder.read(builder); c = builder.getValue().asMap(); raw.assign(body.data, body.size); } else if (bodyType == qpid::amqp::typecodes::UUID_NAME) { if (body.size == qpid::types::Uuid::SIZE) c = qpid::types::Uuid(body.data); raw.assign(body.data, body.size); } else if (bodyType == qpid::amqp::typecodes::ARRAY_NAME) { raw.assign(body.data, body.size); } } } catch (const qpid::Exception& e) { throw FetchError(e.what()); } }
bool PnData::read(pn_type_t type, qpid::types::Variant& value) { switch (type) { case PN_NULL: if (value.getType() != qpid::types::VAR_VOID) value = qpid::types::Variant(); return true; case PN_BOOL: value = pn_data_get_bool(data); return true; case PN_UBYTE: value = pn_data_get_ubyte(data); return true; case PN_BYTE: value = pn_data_get_byte(data); return true; case PN_USHORT: value = pn_data_get_ushort(data); return true; case PN_SHORT: value = pn_data_get_short(data); return true; case PN_UINT: value = pn_data_get_uint(data); return true; case PN_INT: value = pn_data_get_int(data); return true; case PN_CHAR: value = pn_data_get_char(data); return true; case PN_ULONG: value = pn_data_get_ulong(data); return true; case PN_LONG: value = pn_data_get_long(data); return true; case PN_TIMESTAMP: value = pn_data_get_timestamp(data); return true; case PN_FLOAT: value = pn_data_get_float(data); return true; case PN_DOUBLE: value = pn_data_get_double(data); return true; case PN_UUID: value = qpid::types::Uuid(pn_data_get_uuid(data).bytes); return true; case PN_BINARY: value = str(pn_data_get_binary(data)); value.setEncoding(qpid::types::encodings::BINARY); return true; case PN_STRING: value = str(pn_data_get_string(data)); value.setEncoding(qpid::types::encodings::UTF8); return true; case PN_SYMBOL: value = str(pn_data_get_string(data)); value.setEncoding(qpid::types::encodings::ASCII); return true; case PN_LIST: value = qpid::types::Variant::List(); readList(value.asList()); return true; break; case PN_MAP: value = qpid::types::Variant::Map(); readMap(value.asMap()); return true; case PN_ARRAY: value = qpid::types::Variant::List(); readArray(value.asList()); return true; case PN_DESCRIBED: case PN_DECIMAL32: case PN_DECIMAL64: case PN_DECIMAL128: default: return false; } }