00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <string>
00022 #include "qpid/InlineVector.h"
00023 #include "qpid/framing/amqp_framing.h"
00024 #include "qpid/framing/AMQFrame.h"
00025 #include "qpid/framing/SequenceNumber.h"
00026 #include "qpid/CommonImportExport.h"
00027
00028 #ifndef _FrameSet_
00029 #define _FrameSet_
00030
00031 namespace qpid {
00032 namespace framing {
00033
00037 class FrameSet
00038 {
00039 typedef InlineVector<AMQFrame, 4> Frames;
00040 const SequenceNumber id;
00041 Frames parts;
00042 mutable uint64_t contentSize;
00043 mutable bool recalculateSize;
00044
00045 public:
00046 typedef boost::shared_ptr<FrameSet> shared_ptr;
00047
00048 QPID_COMMON_EXTERN FrameSet(const SequenceNumber& id);
00049 QPID_COMMON_EXTERN void append(const AMQFrame& part);
00050 QPID_COMMON_EXTERN bool isComplete() const;
00051
00052 QPID_COMMON_EXTERN uint64_t getContentSize() const;
00053
00054 QPID_COMMON_EXTERN void getContent(std::string&) const;
00055 QPID_COMMON_EXTERN std::string getContent() const;
00056
00057 bool isContentBearing() const;
00058
00059 QPID_COMMON_EXTERN const AMQMethodBody* getMethod() const;
00060 QPID_COMMON_EXTERN const AMQHeaderBody* getHeaders() const;
00061 QPID_COMMON_EXTERN AMQHeaderBody* getHeaders();
00062
00063 template <class T> bool isA() const {
00064 const AMQMethodBody* method = getMethod();
00065 return method && method->isA<T>();
00066 }
00067
00068 template <class T> const T* as() const {
00069 const AMQMethodBody* method = getMethod();
00070 return (method && method->isA<T>()) ? dynamic_cast<const T*>(method) : 0;
00071 }
00072
00073 template <class T> const T* getHeaderProperties() const {
00074 const AMQHeaderBody* header = getHeaders();
00075 return header ? header->get<T>() : 0;
00076 }
00077
00078 Frames::const_iterator begin() const { return parts.begin(); }
00079 Frames::const_iterator end() const { return parts.end(); }
00080
00081 const SequenceNumber& getId() const { return id; }
00082
00083 template <class P> void remove(P predicate) {
00084 parts.erase(std::remove_if(parts.begin(), parts.end(), predicate), parts.end());
00085 }
00086
00087 template <class F> void map(F& functor) {
00088 std::for_each(parts.begin(), parts.end(), functor);
00089 }
00090
00091 template <class F> void map(F& functor) const {
00092 std::for_each(parts.begin(), parts.end(), functor);
00093 }
00094
00095 template <class F, class P> void map_if(F& functor, P predicate) {
00096 for(Frames::iterator i = parts.begin(); i != parts.end(); i++) {
00097 if (predicate(*i)) functor(*i);
00098 }
00099 }
00100
00101 template <class F, class P> void map_if(F& functor, P predicate) const {
00102 for(Frames::const_iterator i = parts.begin(); i != parts.end(); i++) {
00103 if (predicate(*i)) functor(*i);
00104 }
00105 }
00106 };
00107
00108 }
00109 }
00110
00111
00112 #endif