2014-05-29 00:25:28 +08:00
|
|
|
#include <QCoreApplication>
|
|
|
|
|
#include <QDebug>
|
|
|
|
|
#include <QDataStream>
|
|
|
|
|
#include <QFile>
|
|
|
|
|
|
2014-08-27 03:05:39 +08:00
|
|
|
#include "qamqpqueue.h"
|
|
|
|
|
#include "qamqpqueue_p.h"
|
|
|
|
|
#include "qamqpexchange.h"
|
|
|
|
|
#include "qamqpmessage_p.h"
|
|
|
|
|
#include "qamqptable.h"
|
|
|
|
|
using namespace QAMQP;
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
QAmqpQueuePrivate::QAmqpQueuePrivate(QAmqpQueue *q)
|
|
|
|
|
: QAmqpChannelPrivate(q),
|
2014-06-04 21:46:15 +08:00
|
|
|
delayedDeclare(false),
|
|
|
|
|
declared(false),
|
2014-06-24 22:30:05 +08:00
|
|
|
recievingMessage(false),
|
|
|
|
|
consuming(false)
|
2014-06-04 21:46:15 +08:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
QAmqpQueuePrivate::~QAmqpQueuePrivate()
|
2014-06-04 21:46:15 +08:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
bool QAmqpQueuePrivate::_q_method(const QAmqpMethodFrame &frame)
|
2014-06-04 21:46:15 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_Q(QAmqpQueue);
|
|
|
|
|
if (QAmqpChannelPrivate::_q_method(frame))
|
2014-06-04 21:46:15 +08:00
|
|
|
return true;
|
|
|
|
|
|
2014-09-16 03:43:03 +08:00
|
|
|
if (frame.methodClass() == QAmqpFrame::Queue) {
|
2014-06-04 21:46:15 +08:00
|
|
|
switch (frame.id()) {
|
|
|
|
|
case miDeclareOk:
|
|
|
|
|
declareOk(frame);
|
|
|
|
|
break;
|
2014-06-07 00:10:51 +08:00
|
|
|
case miDeleteOk:
|
2014-06-04 21:46:15 +08:00
|
|
|
deleteOk(frame);
|
|
|
|
|
break;
|
|
|
|
|
case miBindOk:
|
|
|
|
|
bindOk(frame);
|
|
|
|
|
break;
|
|
|
|
|
case miUnbindOk:
|
|
|
|
|
unbindOk(frame);
|
|
|
|
|
break;
|
|
|
|
|
case miPurgeOk:
|
2014-06-11 01:04:57 +08:00
|
|
|
purgeOk(frame);
|
2014-06-04 21:46:15 +08:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-16 03:43:03 +08:00
|
|
|
if (frame.methodClass() == QAmqpFrame::Basic) {
|
2014-06-04 21:46:15 +08:00
|
|
|
switch(frame.id()) {
|
|
|
|
|
case bmConsumeOk:
|
|
|
|
|
consumeOk(frame);
|
|
|
|
|
break;
|
|
|
|
|
case bmDeliver:
|
|
|
|
|
deliver(frame);
|
|
|
|
|
break;
|
|
|
|
|
case bmGetOk:
|
|
|
|
|
getOk(frame);
|
|
|
|
|
break;
|
|
|
|
|
case bmGetEmpty:
|
|
|
|
|
Q_EMIT q->empty();
|
|
|
|
|
break;
|
2014-06-24 23:09:19 +08:00
|
|
|
case bmCancelOk:
|
|
|
|
|
cancelOk(frame);
|
|
|
|
|
break;
|
2014-06-04 21:46:15 +08:00
|
|
|
}
|
2014-06-11 01:04:57 +08:00
|
|
|
|
2014-06-04 21:46:15 +08:00
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueuePrivate::_q_content(const QAmqpContentFrame &frame)
|
2014-06-04 21:46:15 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_Q(QAmqpQueue);
|
2014-06-04 21:50:31 +08:00
|
|
|
Q_ASSERT(frame.channel() == channelNumber);
|
|
|
|
|
if (frame.channel() != channelNumber)
|
2014-06-04 21:46:15 +08:00
|
|
|
return;
|
|
|
|
|
|
2014-06-19 22:01:47 +08:00
|
|
|
if (!currentMessage.isValid()) {
|
|
|
|
|
qAmqpDebug() << "received content-header without delivered message";
|
2014-06-04 21:46:15 +08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-19 22:01:47 +08:00
|
|
|
currentMessage.d->leftSize = frame.bodySize();
|
2014-09-15 23:51:48 +08:00
|
|
|
QAmqpMessage::PropertyHash::ConstIterator it;
|
|
|
|
|
QAmqpMessage::PropertyHash::ConstIterator itEnd = frame.properties_.constEnd();
|
2014-08-04 04:39:31 +08:00
|
|
|
for (it = frame.properties_.constBegin(); it != itEnd; ++it) {
|
2014-09-15 23:51:48 +08:00
|
|
|
QAmqpMessage::Property property = (it.key());
|
|
|
|
|
if (property == QAmqpMessage::Headers)
|
2014-08-04 04:39:31 +08:00
|
|
|
currentMessage.d->headers = (it.value()).toHash();
|
|
|
|
|
currentMessage.d->properties[property] = it.value();
|
|
|
|
|
}
|
2014-09-11 10:38:06 +08:00
|
|
|
|
|
|
|
|
if (currentMessage.d->leftSize == 0) {
|
|
|
|
|
// message with an empty body
|
|
|
|
|
q->enqueue(currentMessage);
|
|
|
|
|
Q_EMIT q->messageReceived();
|
|
|
|
|
}
|
2014-06-04 21:46:15 +08:00
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueuePrivate::_q_body(const QAmqpContentBodyFrame &frame)
|
2014-06-04 21:46:15 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_Q(QAmqpQueue);
|
2014-06-04 21:50:31 +08:00
|
|
|
Q_ASSERT(frame.channel() == channelNumber);
|
|
|
|
|
if (frame.channel() != channelNumber)
|
2014-06-04 21:46:15 +08:00
|
|
|
return;
|
|
|
|
|
|
2014-06-19 22:01:47 +08:00
|
|
|
if (!currentMessage.isValid()) {
|
|
|
|
|
qAmqpDebug() << "received content-body without delivered message";
|
2014-06-04 21:46:15 +08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-19 22:01:47 +08:00
|
|
|
currentMessage.d->payload.append(frame.body());
|
|
|
|
|
currentMessage.d->leftSize -= frame.body().size();
|
|
|
|
|
if (currentMessage.d->leftSize == 0) {
|
|
|
|
|
q->enqueue(currentMessage);
|
2014-06-06 03:40:17 +08:00
|
|
|
Q_EMIT q->messageReceived();
|
2014-06-19 22:01:47 +08:00
|
|
|
}
|
2014-06-04 21:46:15 +08:00
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueuePrivate::declareOk(const QAmqpMethodFrame &frame)
|
2014-06-04 21:46:15 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_Q(QAmqpQueue);
|
2014-06-19 22:01:47 +08:00
|
|
|
qAmqpDebug() << "declared queue: " << name;
|
2014-06-04 21:46:15 +08:00
|
|
|
declared = true;
|
|
|
|
|
|
|
|
|
|
QByteArray data = frame.arguments();
|
|
|
|
|
QDataStream stream(&data, QIODevice::ReadOnly);
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
name = QAmqpFrame::readAmqpField(stream, QAmqpMetaType::ShortString).toString();
|
2014-06-04 21:46:15 +08:00
|
|
|
qint32 messageCount = 0, consumerCount = 0;
|
|
|
|
|
stream >> messageCount >> consumerCount;
|
2014-06-19 22:01:47 +08:00
|
|
|
qAmqpDebug("message count %d\nConsumer count: %d", messageCount, consumerCount);
|
2014-06-04 21:46:15 +08:00
|
|
|
|
|
|
|
|
Q_EMIT q->declared();
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueuePrivate::purgeOk(const QAmqpMethodFrame &frame)
|
2014-06-11 01:04:57 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_Q(QAmqpQueue);
|
2014-06-11 01:04:57 +08:00
|
|
|
qAmqpDebug() << "purged queue: " << name;
|
|
|
|
|
|
|
|
|
|
QByteArray data = frame.arguments();
|
|
|
|
|
QDataStream stream(&data, QIODevice::ReadOnly);
|
|
|
|
|
|
|
|
|
|
qint32 messageCount = 0;
|
|
|
|
|
stream >> messageCount;
|
|
|
|
|
|
|
|
|
|
Q_EMIT q->purged(messageCount);
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueuePrivate::deleteOk(const QAmqpMethodFrame &frame)
|
2014-06-04 21:46:15 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_Q(QAmqpQueue);
|
2014-06-11 01:04:57 +08:00
|
|
|
qAmqpDebug() << "deleted queue: " << name;
|
2014-06-04 21:46:15 +08:00
|
|
|
declared = false;
|
|
|
|
|
|
|
|
|
|
QByteArray data = frame.arguments();
|
|
|
|
|
QDataStream stream(&data, QIODevice::ReadOnly);
|
|
|
|
|
qint32 messageCount = 0;
|
|
|
|
|
stream >> messageCount;
|
2014-06-07 01:46:08 +08:00
|
|
|
qAmqpDebug("Message count %d", messageCount);
|
2014-06-04 21:46:15 +08:00
|
|
|
|
|
|
|
|
Q_EMIT q->removed();
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueuePrivate::bindOk(const QAmqpMethodFrame &frame)
|
2014-06-04 21:46:15 +08:00
|
|
|
{
|
|
|
|
|
Q_UNUSED(frame)
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_Q(QAmqpQueue);
|
2014-06-07 01:46:08 +08:00
|
|
|
qAmqpDebug() << Q_FUNC_INFO << "bound to exchange";
|
2014-06-04 21:46:15 +08:00
|
|
|
Q_EMIT q->bound();
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueuePrivate::unbindOk(const QAmqpMethodFrame &frame)
|
2014-06-04 21:46:15 +08:00
|
|
|
{
|
|
|
|
|
Q_UNUSED(frame)
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_Q(QAmqpQueue);
|
2014-06-19 22:01:47 +08:00
|
|
|
qAmqpDebug() << Q_FUNC_INFO << "unbound from exchange";
|
2014-06-04 21:46:15 +08:00
|
|
|
Q_EMIT q->unbound();
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueuePrivate::getOk(const QAmqpMethodFrame &frame)
|
2014-06-04 21:46:15 +08:00
|
|
|
{
|
|
|
|
|
QByteArray data = frame.arguments();
|
|
|
|
|
QDataStream in(&data, QIODevice::ReadOnly);
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
QAmqpMessage message;
|
|
|
|
|
message.d->deliveryTag = QAmqpFrame::readAmqpField(in, QAmqpMetaType::LongLongUint).toLongLong();
|
|
|
|
|
message.d->redelivered = QAmqpFrame::readAmqpField(in, QAmqpMetaType::Boolean).toBool();
|
|
|
|
|
message.d->exchangeName = QAmqpFrame::readAmqpField(in, QAmqpMetaType::ShortString).toString();
|
|
|
|
|
message.d->routingKey = QAmqpFrame::readAmqpField(in, QAmqpMetaType::ShortString).toString();
|
2014-06-19 22:01:47 +08:00
|
|
|
currentMessage = message;
|
2014-06-04 21:46:15 +08:00
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueuePrivate::consumeOk(const QAmqpMethodFrame &frame)
|
2014-06-04 21:46:15 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_Q(QAmqpQueue);
|
2014-06-19 22:01:47 +08:00
|
|
|
qAmqpDebug() << "consume ok: " << name;
|
2014-06-04 21:46:15 +08:00
|
|
|
QByteArray data = frame.arguments();
|
|
|
|
|
QDataStream stream(&data, QIODevice::ReadOnly);
|
2014-09-15 23:51:48 +08:00
|
|
|
consumerTag = QAmqpFrame::readAmqpField(stream, QAmqpMetaType::ShortString).toString();
|
2014-06-19 22:01:47 +08:00
|
|
|
qAmqpDebug("consumer tag = %s", qPrintable(consumerTag));
|
2014-06-24 22:30:05 +08:00
|
|
|
consuming = true;
|
|
|
|
|
Q_EMIT q->consuming(consumerTag);
|
2014-06-04 21:46:15 +08:00
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueuePrivate::deliver(const QAmqpMethodFrame &frame)
|
2014-06-04 21:46:15 +08:00
|
|
|
{
|
2014-06-07 01:46:08 +08:00
|
|
|
qAmqpDebug() << Q_FUNC_INFO;
|
2014-06-04 21:46:15 +08:00
|
|
|
QByteArray data = frame.arguments();
|
|
|
|
|
QDataStream in(&data, QIODevice::ReadOnly);
|
2014-09-15 23:51:48 +08:00
|
|
|
QString consumer = QAmqpFrame::readAmqpField(in, QAmqpMetaType::ShortString).toString();
|
2014-06-24 22:30:05 +08:00
|
|
|
if (consumerTag != consumer) {
|
2014-06-19 22:01:47 +08:00
|
|
|
qAmqpDebug() << Q_FUNC_INFO << "invalid consumer tag: " << consumer;
|
2014-06-04 21:46:15 +08:00
|
|
|
return;
|
2014-06-06 03:34:08 +08:00
|
|
|
}
|
2014-06-04 21:46:15 +08:00
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
QAmqpMessage message;
|
|
|
|
|
message.d->deliveryTag = QAmqpFrame::readAmqpField(in, QAmqpMetaType::LongLongUint).toLongLong();
|
|
|
|
|
message.d->redelivered = QAmqpFrame::readAmqpField(in, QAmqpMetaType::Boolean).toBool();
|
|
|
|
|
message.d->exchangeName = QAmqpFrame::readAmqpField(in, QAmqpMetaType::ShortString).toString();
|
|
|
|
|
message.d->routingKey = QAmqpFrame::readAmqpField(in, QAmqpMetaType::ShortString).toString();
|
2014-06-19 22:01:47 +08:00
|
|
|
currentMessage = message;
|
2014-06-04 21:46:15 +08:00
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueuePrivate::declare()
|
2014-06-07 00:10:51 +08:00
|
|
|
{
|
2014-09-16 03:43:03 +08:00
|
|
|
QAmqpMethodFrame frame(QAmqpFrame::Queue, QAmqpQueuePrivate::miDeclare);
|
2014-06-07 00:10:51 +08:00
|
|
|
frame.setChannel(channelNumber);
|
|
|
|
|
|
|
|
|
|
QByteArray arguments;
|
|
|
|
|
QDataStream out(&arguments, QIODevice::WriteOnly);
|
|
|
|
|
|
|
|
|
|
out << qint16(0); //reserved 1
|
2014-09-15 23:51:48 +08:00
|
|
|
QAmqpFrame::writeAmqpField(out, QAmqpMetaType::ShortString, name);
|
2014-06-07 00:10:51 +08:00
|
|
|
out << qint8(options);
|
2014-09-15 23:51:48 +08:00
|
|
|
QAmqpFrame::writeAmqpField(out, QAmqpMetaType::Hash, QAmqpTable());
|
2014-06-07 00:10:51 +08:00
|
|
|
|
|
|
|
|
frame.setArguments(arguments);
|
|
|
|
|
sendFrame(frame);
|
|
|
|
|
|
|
|
|
|
if (delayedDeclare)
|
|
|
|
|
delayedDeclare = false;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueuePrivate::cancelOk(const QAmqpMethodFrame &frame)
|
2014-06-24 23:09:19 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_Q(QAmqpQueue);
|
2014-06-24 23:09:19 +08:00
|
|
|
qAmqpDebug() << Q_FUNC_INFO;
|
|
|
|
|
QByteArray data = frame.arguments();
|
|
|
|
|
QDataStream in(&data, QIODevice::ReadOnly);
|
2014-09-15 23:51:48 +08:00
|
|
|
QString consumer = QAmqpFrame::readAmqpField(in, QAmqpMetaType::ShortString).toString();
|
2014-06-24 23:09:19 +08:00
|
|
|
if (consumerTag != consumer) {
|
|
|
|
|
qAmqpDebug() << Q_FUNC_INFO << "invalid consumer tag: " << consumer;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
consumerTag.clear();
|
|
|
|
|
Q_EMIT q->cancelled(consumer);
|
|
|
|
|
}
|
2014-06-07 00:10:51 +08:00
|
|
|
|
2014-06-04 21:46:15 +08:00
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
QAmqpQueue::QAmqpQueue(int channelNumber, QAmqpClient *parent)
|
|
|
|
|
: QAmqpChannel(new QAmqpQueuePrivate(this), parent)
|
2014-05-29 00:25:28 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_D(QAmqpQueue);
|
2014-05-29 00:25:28 +08:00
|
|
|
d->init(channelNumber, parent);
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
QAmqpQueue::~QAmqpQueue()
|
2014-05-29 00:25:28 +08:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueue::channelOpened()
|
2014-05-29 00:25:28 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_D(QAmqpQueue);
|
2014-05-29 00:25:28 +08:00
|
|
|
if (d->delayedDeclare)
|
2014-06-07 00:10:51 +08:00
|
|
|
d->declare();
|
2014-05-29 00:25:28 +08:00
|
|
|
|
|
|
|
|
if (!d->delayedBindings.isEmpty()) {
|
|
|
|
|
typedef QPair<QString, QString> BindingPair;
|
|
|
|
|
foreach(BindingPair binding, d->delayedBindings)
|
2014-05-31 03:20:57 +08:00
|
|
|
bind(binding.first, binding.second);
|
2014-05-29 00:25:28 +08:00
|
|
|
d->delayedBindings.clear();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueue::channelClosed()
|
2014-05-29 00:25:28 +08:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
int QAmqpQueue::options() const
|
2014-05-29 00:25:28 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_D(const QAmqpQueue);
|
2014-05-29 00:25:28 +08:00
|
|
|
return d->options;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueue::declare(int options)
|
2014-05-29 00:25:28 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_D(QAmqpQueue);
|
2014-05-29 00:25:28 +08:00
|
|
|
d->options = options;
|
2014-05-31 03:36:11 +08:00
|
|
|
|
|
|
|
|
if (!d->opened) {
|
|
|
|
|
d->delayedDeclare = true;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-07 00:10:51 +08:00
|
|
|
d->declare();
|
2014-05-29 00:25:28 +08:00
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueue::remove(int options)
|
2014-05-29 00:25:28 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_D(QAmqpQueue);
|
2014-05-31 03:36:11 +08:00
|
|
|
if (!d->declared) {
|
2014-06-07 01:46:08 +08:00
|
|
|
qAmqpDebug() << Q_FUNC_INFO << "trying to remove undeclared queue, aborting...";
|
2014-05-31 03:36:11 +08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-16 03:43:03 +08:00
|
|
|
QAmqpMethodFrame frame(QAmqpFrame::Queue, QAmqpQueuePrivate::miDelete);
|
2014-06-04 21:50:31 +08:00
|
|
|
frame.setChannel(d->channelNumber);
|
2014-05-31 03:36:11 +08:00
|
|
|
|
|
|
|
|
QByteArray arguments;
|
|
|
|
|
QDataStream out(&arguments, QIODevice::WriteOnly);
|
|
|
|
|
|
2014-06-06 03:34:08 +08:00
|
|
|
out << qint16(0); //reserved 1
|
2014-09-15 23:51:48 +08:00
|
|
|
QAmqpFrame::writeAmqpField(out, QAmqpMetaType::ShortString, d->name);
|
2014-06-07 00:10:51 +08:00
|
|
|
out << qint8(options);
|
2014-05-31 03:36:11 +08:00
|
|
|
|
|
|
|
|
frame.setArguments(arguments);
|
|
|
|
|
d->sendFrame(frame);
|
2014-05-29 00:25:28 +08:00
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueue::purge()
|
2014-05-29 00:25:28 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_D(QAmqpQueue);
|
2014-05-31 02:51:44 +08:00
|
|
|
|
|
|
|
|
if (!d->opened)
|
|
|
|
|
return;
|
|
|
|
|
|
2014-09-16 03:43:03 +08:00
|
|
|
QAmqpMethodFrame frame(QAmqpFrame::Queue, QAmqpQueuePrivate::miPurge);
|
2014-06-04 21:50:31 +08:00
|
|
|
frame.setChannel(d->channelNumber);
|
2014-05-31 02:51:44 +08:00
|
|
|
|
|
|
|
|
QByteArray arguments;
|
|
|
|
|
QDataStream out(&arguments, QIODevice::WriteOnly);
|
2014-06-06 03:34:08 +08:00
|
|
|
out << qint16(0); //reserved 1
|
2014-09-15 23:51:48 +08:00
|
|
|
QAmqpFrame::writeAmqpField(out, QAmqpMetaType::ShortString, d->name);
|
2014-05-31 02:51:44 +08:00
|
|
|
out << qint8(0); // no-wait
|
|
|
|
|
|
2014-06-07 01:37:36 +08:00
|
|
|
frame.setArguments(arguments);
|
2014-05-31 02:51:44 +08:00
|
|
|
d->sendFrame(frame);
|
2014-05-29 00:25:28 +08:00
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueue::bind(QAmqpExchange *exchange, const QString &key)
|
2014-05-29 00:25:28 +08:00
|
|
|
{
|
2014-05-31 03:20:57 +08:00
|
|
|
if (!exchange) {
|
2014-06-07 01:46:08 +08:00
|
|
|
qAmqpDebug() << Q_FUNC_INFO << "invalid exchange provided";
|
2014-05-31 03:20:57 +08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bind(exchange->name(), key);
|
2014-05-29 00:25:28 +08:00
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueue::bind(const QString &exchangeName, const QString &key)
|
2014-05-29 00:25:28 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_D(QAmqpQueue);
|
2014-05-31 03:20:57 +08:00
|
|
|
if (!d->opened) {
|
|
|
|
|
d->delayedBindings.append(QPair<QString,QString>(exchangeName, key));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-16 03:43:03 +08:00
|
|
|
QAmqpMethodFrame frame(QAmqpFrame::Queue, QAmqpQueuePrivate::miBind);
|
2014-06-04 21:50:31 +08:00
|
|
|
frame.setChannel(d->channelNumber);
|
2014-05-31 03:20:57 +08:00
|
|
|
|
|
|
|
|
QByteArray arguments;
|
|
|
|
|
QDataStream out(&arguments, QIODevice::WriteOnly);
|
|
|
|
|
|
2014-06-07 01:37:36 +08:00
|
|
|
out << qint16(0); // reserved 1
|
2014-09-15 23:51:48 +08:00
|
|
|
QAmqpFrame::writeAmqpField(out, QAmqpMetaType::ShortString, d->name);
|
|
|
|
|
QAmqpFrame::writeAmqpField(out, QAmqpMetaType::ShortString, exchangeName);
|
|
|
|
|
QAmqpFrame::writeAmqpField(out, QAmqpMetaType::ShortString, key);
|
2014-05-31 03:20:57 +08:00
|
|
|
|
2014-06-07 01:37:36 +08:00
|
|
|
out << qint8(0); // no-wait
|
2014-09-15 23:51:48 +08:00
|
|
|
QAmqpFrame::writeAmqpField(out, QAmqpMetaType::Hash, QAmqpTable());
|
2014-05-31 03:20:57 +08:00
|
|
|
|
|
|
|
|
frame.setArguments(arguments);
|
|
|
|
|
d->sendFrame(frame);
|
2014-05-29 00:25:28 +08:00
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueue::unbind(QAmqpExchange *exchange, const QString &key)
|
2014-05-29 00:25:28 +08:00
|
|
|
{
|
2014-05-31 03:20:57 +08:00
|
|
|
if (!exchange) {
|
2014-06-07 01:46:08 +08:00
|
|
|
qAmqpDebug() << Q_FUNC_INFO << "invalid exchange provided";
|
2014-05-31 03:20:57 +08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
unbind(exchange->name(), key);
|
2014-05-29 00:25:28 +08:00
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueue::unbind(const QString &exchangeName, const QString &key)
|
2014-05-29 00:25:28 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_D(QAmqpQueue);
|
2014-05-31 03:20:57 +08:00
|
|
|
if (!d->opened) {
|
2014-06-07 01:46:08 +08:00
|
|
|
qAmqpDebug() << Q_FUNC_INFO << "queue is not open";
|
2014-05-31 03:20:57 +08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-16 03:43:03 +08:00
|
|
|
QAmqpMethodFrame frame(QAmqpFrame::Queue, QAmqpQueuePrivate::miUnbind);
|
2014-06-04 21:50:31 +08:00
|
|
|
frame.setChannel(d->channelNumber);
|
2014-05-31 03:20:57 +08:00
|
|
|
|
|
|
|
|
QByteArray arguments;
|
|
|
|
|
QDataStream out(&arguments, QIODevice::WriteOnly);
|
2014-06-06 03:34:08 +08:00
|
|
|
out << qint16(0); //reserved 1
|
2014-09-15 23:51:48 +08:00
|
|
|
QAmqpFrame::writeAmqpField(out, QAmqpMetaType::ShortString, d->name);
|
|
|
|
|
QAmqpFrame::writeAmqpField(out, QAmqpMetaType::ShortString, exchangeName);
|
|
|
|
|
QAmqpFrame::writeAmqpField(out, QAmqpMetaType::ShortString, key);
|
|
|
|
|
QAmqpFrame::writeAmqpField(out, QAmqpMetaType::Hash, QAmqpTable());
|
2014-05-31 03:20:57 +08:00
|
|
|
|
|
|
|
|
frame.setArguments(arguments);
|
|
|
|
|
d->sendFrame(frame);
|
2014-05-29 00:25:28 +08:00
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
bool QAmqpQueue::consume(int options)
|
2014-05-29 00:25:28 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_D(QAmqpQueue);
|
2014-05-31 03:10:55 +08:00
|
|
|
if (!d->opened) {
|
2014-06-07 01:46:08 +08:00
|
|
|
qAmqpDebug() << Q_FUNC_INFO << "queue is not open";
|
2014-06-24 22:30:05 +08:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (d->consuming) {
|
|
|
|
|
qAmqpDebug() << Q_FUNC_INFO << "already consuming with tag: " << d->consumerTag;
|
|
|
|
|
return false;
|
2014-05-31 03:10:55 +08:00
|
|
|
}
|
|
|
|
|
|
2014-09-16 03:43:03 +08:00
|
|
|
QAmqpMethodFrame frame(QAmqpFrame::Basic, QAmqpQueuePrivate::bmConsume);
|
2014-06-04 21:50:31 +08:00
|
|
|
frame.setChannel(d->channelNumber);
|
2014-05-31 03:10:55 +08:00
|
|
|
|
|
|
|
|
QByteArray arguments;
|
|
|
|
|
QDataStream out(&arguments, QIODevice::WriteOnly);
|
|
|
|
|
|
2014-06-06 03:34:08 +08:00
|
|
|
out << qint16(0); //reserved 1
|
2014-09-15 23:51:48 +08:00
|
|
|
QAmqpFrame::writeAmqpField(out, QAmqpMetaType::ShortString, d->name);
|
|
|
|
|
QAmqpFrame::writeAmqpField(out, QAmqpMetaType::ShortString, d->consumerTag);
|
2014-05-31 03:10:55 +08:00
|
|
|
|
2014-06-11 01:04:57 +08:00
|
|
|
out << qint8(options);
|
2014-09-15 23:51:48 +08:00
|
|
|
QAmqpFrame::writeAmqpField(out, QAmqpMetaType::Hash, QAmqpTable());
|
2014-05-31 03:10:55 +08:00
|
|
|
|
|
|
|
|
frame.setArguments(arguments);
|
|
|
|
|
d->sendFrame(frame);
|
2014-06-24 22:30:05 +08:00
|
|
|
return true;
|
2014-05-29 00:25:28 +08:00
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueue::setConsumerTag(const QString &consumerTag)
|
2014-05-29 00:25:28 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_D(QAmqpQueue);
|
2014-06-24 22:30:05 +08:00
|
|
|
d->consumerTag = consumerTag;
|
2014-05-29 00:25:28 +08:00
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
QString QAmqpQueue::consumerTag() const
|
2014-05-29 00:25:28 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_D(const QAmqpQueue);
|
2014-06-24 22:30:05 +08:00
|
|
|
return d->consumerTag;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
bool QAmqpQueue::isConsuming() const
|
2014-06-24 22:30:05 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_D(const QAmqpQueue);
|
2014-06-24 22:30:05 +08:00
|
|
|
return d->consuming;
|
2014-05-29 00:25:28 +08:00
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueue::get(bool noAck)
|
2014-05-29 00:25:28 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_D(QAmqpQueue);
|
2014-05-31 03:10:55 +08:00
|
|
|
if (!d->opened) {
|
2014-06-25 09:09:45 +08:00
|
|
|
qAmqpDebug() << Q_FUNC_INFO << "channel is not open";
|
2014-05-31 03:10:55 +08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-16 03:43:03 +08:00
|
|
|
QAmqpMethodFrame frame(QAmqpFrame::Basic, QAmqpQueuePrivate::bmGet);
|
2014-06-04 21:50:31 +08:00
|
|
|
frame.setChannel(d->channelNumber);
|
2014-05-31 03:10:55 +08:00
|
|
|
|
|
|
|
|
QByteArray arguments;
|
|
|
|
|
QDataStream out(&arguments, QIODevice::WriteOnly);
|
|
|
|
|
|
2014-06-06 03:34:08 +08:00
|
|
|
out << qint16(0); //reserved 1
|
2014-09-15 23:51:48 +08:00
|
|
|
QAmqpFrame::writeAmqpField(out, QAmqpMetaType::ShortString, d->name);
|
2014-07-29 05:55:30 +08:00
|
|
|
out << qint8(noAck ? 1 : 0); // no-ack
|
2014-05-31 03:10:55 +08:00
|
|
|
|
|
|
|
|
frame.setArguments(arguments);
|
|
|
|
|
d->sendFrame(frame);
|
2014-05-29 00:25:28 +08:00
|
|
|
}
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
void QAmqpQueue::ack(const QAmqpMessage &message)
|
2014-05-29 00:25:28 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_D(QAmqpQueue);
|
2014-05-31 03:10:55 +08:00
|
|
|
if (!d->opened) {
|
2014-06-25 09:09:45 +08:00
|
|
|
qAmqpDebug() << Q_FUNC_INFO << "channel is not open";
|
2014-05-31 03:10:55 +08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-16 03:43:03 +08:00
|
|
|
QAmqpMethodFrame frame(QAmqpFrame::Basic, QAmqpQueuePrivate::bmAck);
|
2014-06-04 21:50:31 +08:00
|
|
|
frame.setChannel(d->channelNumber);
|
2014-05-31 03:10:55 +08:00
|
|
|
|
|
|
|
|
QByteArray arguments;
|
|
|
|
|
QDataStream out(&arguments, QIODevice::WriteOnly);
|
|
|
|
|
|
2014-07-29 05:55:30 +08:00
|
|
|
out << message.deliveryTag();
|
|
|
|
|
out << qint8(0); // multiple
|
2014-05-31 03:10:55 +08:00
|
|
|
|
|
|
|
|
frame.setArguments(arguments);
|
|
|
|
|
d->sendFrame(frame);
|
2014-05-29 00:25:28 +08:00
|
|
|
}
|
2014-06-24 23:09:19 +08:00
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
bool QAmqpQueue::cancel(bool noWait)
|
2014-06-24 23:09:19 +08:00
|
|
|
{
|
2014-09-15 23:51:48 +08:00
|
|
|
Q_D(QAmqpQueue);
|
2014-06-24 23:09:19 +08:00
|
|
|
if (!d->consuming) {
|
|
|
|
|
qAmqpDebug() << Q_FUNC_INFO << "not consuming!";
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (d->consumerTag.isEmpty()) {
|
|
|
|
|
qAmqpDebug() << Q_FUNC_INFO << "consuming with an empty consumer tag, failing...";
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-16 03:43:03 +08:00
|
|
|
QAmqpMethodFrame frame(QAmqpFrame::Basic, QAmqpQueuePrivate::bmCancel);
|
2014-06-24 23:09:19 +08:00
|
|
|
frame.setChannel(d->channelNumber);
|
|
|
|
|
|
|
|
|
|
QByteArray arguments;
|
|
|
|
|
QDataStream out(&arguments, QIODevice::WriteOnly);
|
|
|
|
|
|
2014-09-15 23:51:48 +08:00
|
|
|
QAmqpFrame::writeAmqpField(out, QAmqpMetaType::ShortString, d->consumerTag);
|
2014-06-24 23:09:19 +08:00
|
|
|
out << (noWait ? qint8(0x01) : qint8(0x0));
|
|
|
|
|
|
|
|
|
|
frame.setArguments(arguments);
|
|
|
|
|
d->sendFrame(frame);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2014-09-11 23:46:40 +08:00
|
|
|
|
|
|
|
|
#include "moc_qamqpqueue.cpp"
|