2014-01-04 19:45:04 +08:00
|
|
|
/**
|
|
|
|
|
* String field types for amqp
|
2015-04-30 16:59:03 +08:00
|
|
|
*
|
2014-01-04 19:45:04 +08:00
|
|
|
* @copyright 2014 Copernica BV
|
|
|
|
|
*/
|
|
|
|
|
|
2015-11-01 17:48:13 +08:00
|
|
|
/**
|
|
|
|
|
* Include guard
|
|
|
|
|
*/
|
|
|
|
|
#pragma once
|
|
|
|
|
|
2016-06-23 20:42:50 +08:00
|
|
|
/**
|
|
|
|
|
* Dependencies
|
|
|
|
|
*/
|
|
|
|
|
#include "field.h"
|
|
|
|
|
#include "outbuffer.h"
|
|
|
|
|
#include "numericfield.h"
|
|
|
|
|
#include "receivedframe.h"
|
|
|
|
|
|
2014-01-04 19:45:04 +08:00
|
|
|
/**
|
|
|
|
|
* Set up namespace
|
|
|
|
|
*/
|
|
|
|
|
namespace AMQP {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Base class for string types
|
|
|
|
|
*/
|
|
|
|
|
template <typename T, char F>
|
|
|
|
|
class StringField : public Field
|
|
|
|
|
{
|
|
|
|
|
private:
|
|
|
|
|
/**
|
|
|
|
|
* Pointer to string data
|
|
|
|
|
* @var string
|
|
|
|
|
*/
|
|
|
|
|
std::string _data;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
/**
|
|
|
|
|
* Initialize empty string
|
|
|
|
|
*/
|
|
|
|
|
StringField() {}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Construct based on a std::string
|
|
|
|
|
*
|
|
|
|
|
* @param value string value
|
|
|
|
|
*/
|
2015-04-30 16:59:03 +08:00
|
|
|
StringField(const std::string &value) : _data(value) {}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Construct based on a std::string
|
|
|
|
|
*
|
|
|
|
|
* @param value string value
|
|
|
|
|
*/
|
|
|
|
|
StringField(std::string &&value) : _data(std::move(value)) {}
|
2014-01-04 19:45:04 +08:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Construct based on received data
|
|
|
|
|
* @param frame
|
|
|
|
|
*/
|
|
|
|
|
StringField(ReceivedFrame &frame)
|
|
|
|
|
{
|
|
|
|
|
// get the size
|
|
|
|
|
T size(frame);
|
2015-04-30 16:59:03 +08:00
|
|
|
|
2014-01-04 19:45:04 +08:00
|
|
|
// allocate string
|
2014-01-07 00:15:21 +08:00
|
|
|
_data = std::string(frame.nextData(size.value()), (size_t) size.value());
|
2014-01-04 19:45:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Clean up memory used
|
|
|
|
|
*/
|
2016-06-23 20:42:50 +08:00
|
|
|
virtual ~StringField() = default;
|
2014-01-04 19:45:04 +08:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Create a new instance of this object
|
|
|
|
|
* @return Field*
|
|
|
|
|
*/
|
2014-04-14 23:14:36 +08:00
|
|
|
virtual std::shared_ptr<Field> clone() const override
|
2014-01-04 19:45:04 +08:00
|
|
|
{
|
|
|
|
|
// create a new copy of ourselves and return it
|
2014-04-14 23:14:36 +08:00
|
|
|
return std::make_shared<StringField>(_data);
|
2014-01-04 19:45:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Assign a new value
|
|
|
|
|
*
|
|
|
|
|
* @param value new value
|
|
|
|
|
*/
|
2015-04-30 16:59:03 +08:00
|
|
|
StringField& operator=(const std::string &value)
|
2014-01-04 19:45:04 +08:00
|
|
|
{
|
|
|
|
|
// overwrite data
|
|
|
|
|
_data = value;
|
|
|
|
|
|
|
|
|
|
// allow chaining
|
|
|
|
|
return *this;
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-30 16:59:03 +08:00
|
|
|
/**
|
|
|
|
|
* Assign a new value
|
|
|
|
|
*
|
|
|
|
|
* @param value new value
|
|
|
|
|
*/
|
|
|
|
|
StringField& operator=(std::string &&value)
|
|
|
|
|
{
|
|
|
|
|
// overwrite data
|
|
|
|
|
_data = std::move(value);
|
|
|
|
|
|
|
|
|
|
// allow chaining
|
|
|
|
|
return *this;
|
|
|
|
|
}
|
|
|
|
|
|
2014-01-04 19:45:04 +08:00
|
|
|
/**
|
|
|
|
|
* Get the size this field will take when
|
|
|
|
|
* encoded in the AMQP wire-frame format
|
2014-02-21 16:54:40 +08:00
|
|
|
* @return size_t
|
2014-01-04 19:45:04 +08:00
|
|
|
*/
|
|
|
|
|
virtual size_t size() const override
|
|
|
|
|
{
|
|
|
|
|
// find out size of the size parameter
|
2018-01-24 07:19:55 +08:00
|
|
|
T size((T::Type)_data.size());
|
2015-04-30 16:59:03 +08:00
|
|
|
|
2014-01-04 19:45:04 +08:00
|
|
|
// size of the uint8 or uint32 + the actual string size
|
|
|
|
|
return size.size() + _data.size();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get the value
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
2014-04-14 23:14:36 +08:00
|
|
|
virtual operator const std::string& () const override
|
2014-01-04 19:45:04 +08:00
|
|
|
{
|
|
|
|
|
return _data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get the value
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
const std::string& value() const
|
|
|
|
|
{
|
|
|
|
|
// get data
|
|
|
|
|
return _data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get the maximum allowed string length for this field
|
|
|
|
|
* @return size_t
|
|
|
|
|
*/
|
|
|
|
|
constexpr static size_t maxLength()
|
|
|
|
|
{
|
|
|
|
|
return T::max();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Write encoded payload to the given buffer.
|
|
|
|
|
* @param buffer
|
|
|
|
|
*/
|
|
|
|
|
virtual void fill(OutBuffer& buffer) const override
|
|
|
|
|
{
|
|
|
|
|
// create size
|
2018-01-24 07:19:55 +08:00
|
|
|
T size((T::Type)_data.size());
|
2015-04-30 16:59:03 +08:00
|
|
|
|
2014-01-04 19:45:04 +08:00
|
|
|
// first, write down the size of the string
|
|
|
|
|
size.fill(buffer);
|
|
|
|
|
|
|
|
|
|
// write down the string content
|
|
|
|
|
buffer.add(_data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get the type ID that is used to identify this type of
|
|
|
|
|
* field in a field table
|
|
|
|
|
* @return char
|
|
|
|
|
*/
|
|
|
|
|
virtual char typeID() const override
|
|
|
|
|
{
|
|
|
|
|
return F;
|
|
|
|
|
}
|
2014-04-14 19:34:46 +08:00
|
|
|
|
2015-05-05 19:38:20 +08:00
|
|
|
/**
|
|
|
|
|
* We are a string
|
|
|
|
|
*
|
|
|
|
|
* @return true, because we are a string
|
|
|
|
|
*/
|
|
|
|
|
bool isString() const override
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2014-04-14 19:34:46 +08:00
|
|
|
/**
|
|
|
|
|
* Output the object to a stream
|
|
|
|
|
* @param std::ostream
|
|
|
|
|
*/
|
|
|
|
|
virtual void output(std::ostream &stream) const override
|
|
|
|
|
{
|
|
|
|
|
// show
|
|
|
|
|
stream << "string(" << value() << ")";
|
|
|
|
|
}
|
2014-01-04 19:45:04 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Concrete string types for AMQP
|
|
|
|
|
*/
|
|
|
|
|
typedef StringField<UOctet, 's'> ShortString;
|
|
|
|
|
typedef StringField<ULong, 'S'> LongString;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* end namespace
|
|
|
|
|
*/
|
|
|
|
|
}
|