summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpp/src/qpid/broker/Message.cpp20
-rw-r--r--cpp/src/qpid/framing/FrameSet.cpp16
-rw-r--r--cpp/src/qpid/framing/TypeFilter.h33
-rw-r--r--cpp/src/qpid/framing/frame_functors.h8
4 files changed, 35 insertions, 42 deletions
diff --git a/cpp/src/qpid/broker/Message.cpp b/cpp/src/qpid/broker/Message.cpp
index fe412fd77b..c307118f20 100644
--- a/cpp/src/qpid/broker/Message.cpp
+++ b/cpp/src/qpid/broker/Message.cpp
@@ -74,7 +74,7 @@ uint32_t Message::getRequiredCredit() const
{
//add up payload for all header and content frames in the frameset
SumBodySize sum;
- frames.map_if(sum, TypeFilter(HEADER_BODY, CONTENT_BODY));
+ frames.map_if(sum, TypeFilter2<HEADER_BODY, CONTENT_BODY>());
return sum.getSize();
}
@@ -82,18 +82,18 @@ void Message::encode(framing::Buffer& buffer) const
{
//encode method and header frames
EncodeFrame f1(buffer);
- frames.map_if(f1, TypeFilter(METHOD_BODY, HEADER_BODY));
+ frames.map_if(f1, TypeFilter2<METHOD_BODY, HEADER_BODY>());
//then encode the payload of each content frame
EncodeBody f2(buffer);
- frames.map_if(f2, TypeFilter(CONTENT_BODY));
+ frames.map_if(f2, TypeFilter<CONTENT_BODY>());
}
void Message::encodeContent(framing::Buffer& buffer) const
{
//encode the payload of each content frame
EncodeBody f2(buffer);
- frames.map_if(f2, TypeFilter(CONTENT_BODY));
+ frames.map_if(f2, TypeFilter<CONTENT_BODY>());
}
uint32_t Message::encodedSize() const
@@ -110,7 +110,7 @@ uint32_t Message::encodedHeaderSize() const
{
//add up the size for all method and header frames in the frameset
SumFrameSize sum;
- frames.map_if(sum, TypeFilter(METHOD_BODY, HEADER_BODY));
+ frames.map_if(sum, TypeFilter2<METHOD_BODY, HEADER_BODY>());
return sum.getSize();
}
@@ -137,7 +137,7 @@ void Message::decodeContent(framing::Buffer& buffer)
} else {
//adjust header flags
MarkLastSegment f;
- frames.map_if(f, TypeFilter(HEADER_BODY));
+ frames.map_if(f, TypeFilter<HEADER_BODY>());
}
//mark content loaded
loaded = true;
@@ -152,7 +152,7 @@ void Message::releaseContent(MessageStore* _store)
store->stage(*this);
}
//remove any content frames from the frameset
- frames.remove(TypeFilter(CONTENT_BODY));
+ frames.remove(TypeFilter<CONTENT_BODY>());
setContentReleased();
}
@@ -183,17 +183,17 @@ void Message::sendContent(Queue& queue, framing::FrameHandler& out, uint16_t max
} else {
Count c;
- frames.map_if(c, TypeFilter(CONTENT_BODY));
+ frames.map_if(c, TypeFilter<CONTENT_BODY>());
SendContent f(out, maxFrameSize, c.getCount());
- frames.map_if(f, TypeFilter(CONTENT_BODY));
+ frames.map_if(f, TypeFilter<CONTENT_BODY>());
}
}
void Message::sendHeader(framing::FrameHandler& out, uint16_t /*maxFrameSize*/) const
{
Relay f(out);
- frames.map_if(f, TypeFilter(HEADER_BODY));
+ frames.map_if(f, TypeFilter<HEADER_BODY>());
}
// FIXME aconway 2007-11-09: Obsolete, remove. Was used to cover over
diff --git a/cpp/src/qpid/framing/FrameSet.cpp b/cpp/src/qpid/framing/FrameSet.cpp
index b361076ee7..9d9b7bc8f8 100644
--- a/cpp/src/qpid/framing/FrameSet.cpp
+++ b/cpp/src/qpid/framing/FrameSet.cpp
@@ -64,18 +64,20 @@ AMQHeaderBody* FrameSet::getHeaders()
uint64_t FrameSet::getContentSize() const
{
SumBodySize sum;
- map_if(sum, TypeFilter(CONTENT_BODY));
+ map_if(sum, TypeFilter<CONTENT_BODY>());
return sum.getSize();
}
-void FrameSet::getContent(std::string& out) const
-{
- AccumulateContent accumulator(out);
- map_if(accumulator, TypeFilter(CONTENT_BODY));
+void FrameSet::getContent(std::string& out) const {
+ out.clear();
+ out.reserve(getContentSize());
+ for(Frames::const_iterator i = parts.begin(); i != parts.end(); i++) {
+ if (i->getBody()->type() == CONTENT_BODY)
+ out += i->castBody<AMQContentBody>()->getData();
+ }
}
-std::string FrameSet::getContent() const
-{
+std::string FrameSet::getContent() const {
std::string out;
getContent(out);
return out;
diff --git a/cpp/src/qpid/framing/TypeFilter.h b/cpp/src/qpid/framing/TypeFilter.h
index 3a607190fd..d1c42de583 100644
--- a/cpp/src/qpid/framing/TypeFilter.h
+++ b/cpp/src/qpid/framing/TypeFilter.h
@@ -1,3 +1,6 @@
+#ifndef QPID_FRAMING_TYPEFILTER_H
+#define QPID_FRAMING_TYPEFILTER_H
+
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
@@ -23,30 +26,26 @@
#include "qpid/framing/AMQFrame.h"
#include "qpid/framing/FrameHandler.h"
-#ifndef _TypeFilter_
-#define _TypeFilter_
-
namespace qpid {
namespace framing {
/**
* Predicate that selects frames by type
*/
-class TypeFilter
-{
- std::vector<uint8_t> types;
-public:
- TypeFilter(uint8_t type) { add(type); }
- TypeFilter(uint8_t type1, uint8_t type2) { add(type1); add(type2); }
- void add(uint8_t type) { types.push_back(type); }
- bool operator()(const AMQFrame& f) const
- {
- return find(types.begin(), types.end(), f.getBody()->type()) != types.end();
- }
+template <uint8_t Type>
+struct TypeFilter {
+ bool operator()(const AMQFrame& f) const {
+ return f.getBody()->type() == Type;
+ }
};
-}
-}
+template <uint8_t T1, uint8_t T2>
+struct TypeFilter2 {
+ bool operator()(const AMQFrame& f) const {
+ return f.getBody()->type() == T1 || f.getBody()->type() == T2;
+ }
+};
+}} // namespace qpid::framing
-#endif
+#endif /*!QPID_FRAMING_TYPEFILTER_H*/
diff --git a/cpp/src/qpid/framing/frame_functors.h b/cpp/src/qpid/framing/frame_functors.h
index 992d389faf..d915a270c2 100644
--- a/cpp/src/qpid/framing/frame_functors.h
+++ b/cpp/src/qpid/framing/frame_functors.h
@@ -74,14 +74,6 @@ public:
void operator()(const AMQFrame& f) { f.getBody()->encode(buffer); }
};
-class AccumulateContent
-{
- std::string& content;
-public:
- AccumulateContent(std::string& c) : content(c) {}
- void operator()(const AMQFrame& f) { content += f.castBody<AMQContentBody>()->getData(); }
-};
-
/**
* Sends a copy of the frame its applied to to the specified handler
*/