std::size_t ConnectionContext::encode(char* buffer, std::size_t size) { qpid::sys::ScopedLock<qpid::sys::Monitor> l(lock); QPID_LOG(trace, id << " encode(" << size << ")"); if (writeHeader) { size_t encoded = writeProtocolHeader(buffer, size); if (encoded < size) { encoded += encode(buffer + encoded, size - encoded); } return encoded; } ssize_t n = pn_transport_output(engine, buffer, size); if (n > 0) { QPID_LOG_CAT(debug, network, id << " encoded " << n << " bytes from " << size) haveOutput = true; return n; } else if (n == PN_ERR) { throw qpid::Exception(QPID_MSG("Error on output: " << getError())); } else if (n == PN_EOS) { haveOutput = false; return 0;//Is this right? } else { haveOutput = false; return 0; } }
size_t Sasl::encode(char* buffer, size_t size) { if (state == AUTHENTICATED) { if (securityLayer.get()) return securityLayer->encode(buffer, size); else return connection.encode(buffer, size); } else { size_t encoded = 0; if (writeHeader) { encoded += writeProtocolHeader(buffer, size); if (!encoded) return 0; writeHeader = false; } if (encoded < size) { encoded += write(buffer + encoded, size - encoded); } if (state == SUCCESS_PENDING) { state = AUTHENTICATED; } else if (state == FAILURE_PENDING) { state = FAILED; } else { haveOutput = (encoded == size); } QPID_LOG(trace, id << " Sasl::encode(" << size << "): " << encoded); return encoded; } }