Poco::JSON::Array::Ptr ConnectionMapper::inquire() { createCommand(MQCMD_INQUIRE_CONNECTION); // Required parameters if ( _input->has("ConnectionId") ) { std::string hexId = _input->get("ConnectionId"); if ( hexId.length() > MQ_CONNECTION_ID_LENGTH ) { hexId.erase(MQ_CONNECTION_ID_LENGTH); } Buffer::Ptr id = new Buffer(hexId); pcf()->addParameter(MQBACF_CONNECTION_ID, id); } else { Buffer::Ptr id = new Buffer(MQ_CONNECTION_ID_LENGTH); // Empty buffer memset(id->data(), 0, MQ_CONNECTION_ID_LENGTH); pcf()->addParameter(MQBACF_GENERIC_CONNECTION_ID, id); } // Optional parameters //TODO: ByteStringFilter addParameter<std::string>(MQCACF_COMMAND_SCOPE, "CommandScope"); addAttributeList(MQIACF_CONNECTION_ATTRS, "ConnectionAttrs"); addParameterNumFromString(MQIACF_CONN_INFO_TYPE, "ConnInfoType"); addIntegerFilter(); addStringFilter(); addParameterNumFromString(MQIA_UR_DISP, "URDisposition"); if ( ! _input->has("ConnectionAttrs") ) { // It seems that this is not set by default, so we do // it ourselves. MQLONG attrs[] = { MQIACF_ALL }; pcf()->addParameterList(MQIACF_CONNECTION_ATTRS, attrs, 1); } PCF::Vector commandResponse; execute(commandResponse); Poco::JSON::Array::Ptr json = new Poco::JSON::Array(); for(PCF::Vector::iterator it = commandResponse.begin(); it != commandResponse.end(); it++) { if ( (*it)->getReasonCode() != MQRC_NONE ) // Skip errors (2035 not authorized for example) continue; if ( (*it)->isExtendedResponse() ) // Skip extended response continue; json->add(createJSON(**it)); } return json; }
String::CPtr percentEncode(String::CPtr str, String::Encoding enc) { static const Boolean isBigEndian = endian() == BIG; if (!str || str->length() == 0) return String::create(); Buffer::Ptr buf; switch (enc) { case String::UTF8: buf = Buffer::create(str, Buffer::UTF8); break; case String::UTF16: if (isBigEndian) { buf = Buffer::create(str, Buffer::UTF16BE); } else { buf = Buffer::create(str, Buffer::UTF16LE); } break; case String::UTF16BE: buf = Buffer::create(str, Buffer::UTF16BE); break; case String::UTF16LE: buf = Buffer::create(str, Buffer::UTF16LE); break; case String::UTF32: if (isBigEndian) { buf = Buffer::create(str, Buffer::UTF32BE); } else { buf = Buffer::create(str, Buffer::UTF32LE); } break; case String::UTF32BE: buf = Buffer::create(str, Buffer::UTF32BE); break; case String::UTF32LE: buf = Buffer::create(str, Buffer::UTF32LE); break; default: assert(false); buf = Buffer::null(); } Size sourceLen = buf->length(); const char* source = static_cast<const char*>(buf->data()); Size encodedLen = sourceLen * 3 + 1; char* encoded = new char[encodedLen]; percentEncode(encoded, encodedLen, source, sourceLen); String::CPtr res = String::create(encoded); delete[] encoded; return res; }
void PCF::addParameter(MQLONG parameter, Buffer::Ptr value) { MQLONG structLength = ((MQCFST_STRUC_LENGTH_FIXED + value->size()) / 4 + 1) * 4; _pointers[parameter] = buffer().size(); buffer().resize(buffer().size() + structLength); MQCFBS* pcfParam = (MQCFBS*) buffer().data(_pointers[parameter]); pcfParam->Type = MQCFT_BYTE_STRING; pcfParam->StrucLength = structLength; pcfParam->Parameter = parameter; pcfParam->StringLength = value->size(); memcpy(pcfParam->String, value->data(), pcfParam->StringLength); MQCFH* header = (MQCFH*) (MQBYTE*) buffer().data(); header->ParameterCount++; }