Files
tech5/source/shared/idlib/networking/amqp/mqcommander.cpp
T
2026-08-08 13:54:26 -07:00

59 lines
2.1 KiB
C++

#include "mqmessaging.h"
idMQCommand::idMQCommand()
: method(nullptr), contentHeader(nullptr), complete(false), contentBody(16),
remainingBodyBytes(0) {
}
idMQCommand::~idMQCommand() = default;
void idMQCommand::Reset() {
delete method;
delete contentHeader;
method = nullptr;
contentHeader = nullptr;
complete = false;
contentBody.Clear();
remainingBodyBytes = 0;
}
idMQCommandBuilder::idMQCommandBuilder()
: state(MQ_CMDSTATE_NEED_METHOD), remainingBytes(0) {
}
MQErrors_t idMQCommandBuilder::HandleFrame(idMQCommand& command,
idMQFrame& frame) {
if (state == MQ_CMDSTATE_NEED_METHOD) {
if (frame.type != AMQP_FRAME_METHOD) return MQERROR_INVALID_FRAME;
command.method = idMQChannel::DecodeMethod(frame);
if (command.method == nullptr) return MQERROR_UNEXPECTED_METHOD;
state = command.method->HasContent()
? MQ_CMDSTATE_NEED_HEADER : MQ_CMDSTATE_COMPLETE;
} else if (state == MQ_CMDSTATE_NEED_HEADER) {
if (frame.type != AMQP_FRAME_HEADER) return MQERROR_INVALID_FRAME;
command.contentHeader = idMQChannel::DecodeContentHeader(frame);
if (command.contentHeader == nullptr) return MQERROR_UNEXPECTED_CLASS;
command.remainingBodyBytes = command.contentHeader->bodyLength;
state = command.remainingBodyBytes == 0
? MQ_CMDSTATE_COMPLETE : MQ_CMDSTATE_NEED_BODY;
} else if (state == MQ_CMDSTATE_NEED_BODY) {
if (frame.type != AMQP_FRAME_BODY) return MQERROR_INVALID_FRAME;
if (static_cast<std::uint64_t>(frame.data.Num())
> command.remainingBodyBytes) return MQERROR_FRAME_OVERFLOW;
for (int index = 0; index < frame.data.Num(); ++index) {
command.contentBody.Append(frame.data[index]);
}
command.remainingBodyBytes -= frame.data.Num();
if (command.remainingBodyBytes == 0) state = MQ_CMDSTATE_COMPLETE;
} else {
return MQERROR_UNKNOWN;
}
command.complete = state == MQ_CMDSTATE_COMPLETE;
if (command.complete) {
state = MQ_CMDSTATE_NEED_METHOD;
remainingBytes = 0;
}
return MQERROR_NONE;
}