QAMQP
amqp_frame.h
1 #ifndef amqp_frame_h__
2 #define amqp_frame_h__
3 
4 #include <QDataStream>
5 #include <QHash>
6 #include <QVariant>
7 
8 #define AMQP_BASIC_CONTENT_TYPE_FLAG (1 << 15)
9 #define AMQP_BASIC_CONTENT_ENCODING_FLAG (1 << 7)
10 #define AMQP_BASIC_HEADERS_FLAG (1 << 13)
11 #define AMQP_BASIC_DELIVERY_MODE_FLAG (1 << 12)
12 #define AMQP_BASIC_PRIORITY_FLAG (1 << 11)
13 #define AMQP_BASIC_CORRELATION_ID_FLAG (1 << 10)
14 #define AMQP_BASIC_REPLY_TO_FLAG (1 << 9)
15 #define AMQP_BASIC_EXPIRATION_FLAG (1 << 8)
16 #define AMQP_BASIC_MESSAGE_ID_FLAG (1 << 14)
17 #define AMQP_BASIC_TIMESTAMP_FLAG (1 << 6)
18 #define AMQP_BASIC_TYPE_FLAG (1 << 5)
19 #define AMQP_BASIC_USER_ID_FLAG (1 << 4)
20 #define AMQP_BASIC_APP_ID_FLAG (1 << 3)
21 #define AMQP_BASIC_CLUSTER_ID_FLAG (1 << 2)
22 
27 namespace QAMQP
28 {
29  class QueuePrivate;
34  namespace Frame
35  {
39  enum Type
40  {
41  ftMethod = 1,
42  ftHeader = 2,
43  ftBody = 3,
44  ftHeartbeat = 8
45  };
46 
51  enum MethodClass
52  {
53  fcConnection = 10,
54  fcChannel = 20,
55  fcExchange = 40,
56  fcQueue = 50,
57  fcBasic = 60,
58  fcTx = 90,
59  };
60 
61  struct decimal
62  {
63  qint8 scale;
64  quint32 value;
65 
66  };
67 
73  typedef QHash<QString, QVariant> TableField;
74 
75  QDataStream & serialize( QDataStream & stream, const QAMQP::Frame::TableField & f );
76  QDataStream & deserialize( QDataStream & stream, QAMQP::Frame::TableField & f );
77  QVariant readField( qint8 valueType, QDataStream &s );
78  void writeField( QDataStream &s, const QVariant & value );
79  void writeField( qint8 valueType, QDataStream &s, const QVariant & value, bool withType = false );
80  void print( const QAMQP::Frame::TableField & f );
81 
95  class Base
96  {
97  public:
103  Base(Type type);
104 
110  Base(QDataStream& raw);
111 
116  Type type() const;
117 
123  void setChannel(qint16 channel);
124 
129  qint16 channel() const;
130 
134  virtual qint32 size() const;
135 
140  void toStream(QDataStream & stream) const;
141 
142  protected:
143  void writeHeader(QDataStream & stream) const;
144  virtual void writePayload(QDataStream & stream) const;
145  void writeEnd(QDataStream & stream) const;
146 
147  void readHeader(QDataStream & stream);
148  virtual void readPayload(QDataStream & stream);
149  void readEnd(QDataStream & stream);
150 
151  qint32 size_;
152  private:
153  qint8 type_;
154 
155  qint16 channel_;
156 
157  };
158 
172  class Method : public Base
173  {
174  public:
179  Method();
180 
187  Method(MethodClass methodClass, qint16 id);
188 
194  Method(QDataStream& raw);
195 
199  MethodClass methodClass() const;
200 
204  qint16 id() const;
205  qint32 size() const;
206 
212  void setArguments(const QByteArray & data);
213 
218  QByteArray arguments() const;
219 
220  protected:
221  void writePayload(QDataStream & stream) const;
222  void readPayload(QDataStream & stream);
223  short methodClass_;
224  qint16 id_;
225  QByteArray arguments_;
226  };
227 
228 
262  class Content : public Base
263  {
264  friend class QAMQP::QueuePrivate;
265  public:
266 
270  enum Property
271  {
272  cpContentType = AMQP_BASIC_CONTENT_TYPE_FLAG,
273  cpContentEncoding = AMQP_BASIC_CONTENT_ENCODING_FLAG,
274  cpHeaders = AMQP_BASIC_HEADERS_FLAG,
275  cpDeliveryMode = AMQP_BASIC_DELIVERY_MODE_FLAG,
276  cpPriority = AMQP_BASIC_PRIORITY_FLAG,
277  cpCorrelationId = AMQP_BASIC_CORRELATION_ID_FLAG,
278  cpReplyTo = AMQP_BASIC_REPLY_TO_FLAG,
279  cpExpiration = AMQP_BASIC_EXPIRATION_FLAG,
280  cpMessageId = AMQP_BASIC_MESSAGE_ID_FLAG,
281  cpTimestamp = AMQP_BASIC_TIMESTAMP_FLAG,
282  cpType = AMQP_BASIC_TYPE_FLAG,
283  cpUserId = AMQP_BASIC_USER_ID_FLAG,
284  cpAppId = AMQP_BASIC_APP_ID_FLAG,
285  cpClusterID = AMQP_BASIC_CLUSTER_ID_FLAG
286  };
287  Q_DECLARE_FLAGS(Properties, Property);
288 
293  Content();
294 
300  Content(MethodClass methodClass);
301 
307  Content(QDataStream& raw);
308 
312  MethodClass methodClass() const;
313  qint32 size() const;
314 
320  void setProperty(Property prop, const QVariant & value);
321 
326  QVariant property(Property prop) const;
327 
328 
329  void setBody(const QByteArray & data);
330  QByteArray body() const;
331  qlonglong bodySize() const;
332 
333  protected:
334  void writePayload(QDataStream & stream) const;
335  void readPayload(QDataStream & stream);
336  short methodClass_;
337  qint16 id_;
338  QByteArray body_;
339  mutable QByteArray buffer_;
340  QHash<int, QVariant> properties_;
341  qlonglong bodySize_;
342  };
343 
344  class ContentBody : public Base
345  {
346  public:
347  ContentBody();
348  ContentBody(QDataStream& raw);
349  void setBody(const QByteArray & data);
350  QByteArray body() const;
351  qint32 size() const;
352  protected:
353  void writePayload(QDataStream & stream) const;
354  void readPayload(QDataStream & stream);
355 
356  private:
357  QByteArray body_;
358  };
359  }
360 }
361 
362 Q_DECLARE_METATYPE(QAMQP::Frame::decimal);
363 Q_DECLARE_METATYPE(QAMQP::Frame::TableField);
364 
365 #endif // amqp_frame_h__