blob: e7ae865a7082e8f22555d8ab2bdf62d69dd48052 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
#include <iostream>
#include <vector>
#include <amqp_types.h>
#include <FieldTable.h>
#ifndef _Value_
#define _Value_
namespace qpid {
namespace framing {
class Buffer;
/**
* Represents a decimal value.
* No arithmetic functionality for now, we only care about encoding/decoding.
*/
struct Decimal {
u_int32_t value;
u_int8_t decimals;
Decimal(u_int32_t value_=0, u_int8_t decimals_=0) : value(value_), decimals(decimals_) {}
bool operator==(const Decimal& d) const {
return decimals == d.decimals && value == d.value;
}
bool operator!=(const Decimal& d) const { return !(*this == d); }
};
std::ostream& operator<<(std::ostream& out, const Decimal& d);
/**
* Polymorpic base class for values.
*/
class Value {
public:
virtual ~Value();
virtual u_int32_t size() const = 0;
virtual char getType() const = 0;
virtual void encode(Buffer& buffer) = 0;
virtual void decode(Buffer& buffer) = 0;
virtual bool operator==(const Value&) const = 0;
bool operator!=(const Value& v) const { return !(*this == v); }
virtual void print(std::ostream& out) const = 0;
/** Create a new value by decoding from the buffer */
static std::auto_ptr<Value> decode_value(Buffer& buffer);
};
std::ostream& operator<<(std::ostream& out, const Value& d);
/**
* Template for common operations on Value sub-classes.
*/
template <class T>
class ValueOps : public Value
{
protected:
T value;
public:
ValueOps() {}
ValueOps(const T& v) : value(v) {}
const T& getValue() const { return value; }
T& getValue() { return value; }
virtual bool operator==(const Value& v) const {
const ValueOps<T>* vo = dynamic_cast<const ValueOps<T>*>(&v);
if (vo == 0) return false;
else return value == vo->value;
}
void print(std::ostream& out) const { out << value; }
};
class StringValue : public ValueOps<std::string> {
public:
StringValue(const std::string& v) : ValueOps<std::string>(v) {}
StringValue() {}
virtual u_int32_t size() const { return 4 + value.length(); }
virtual char getType() const { return 'S'; }
virtual void encode(Buffer& buffer);
virtual void decode(Buffer& buffer);
};
class IntegerValue : public ValueOps<int> {
public:
IntegerValue(int v) : ValueOps<int>(v) {}
IntegerValue(){}
virtual u_int32_t size() const { return 4; }
virtual char getType() const { return 'I'; }
virtual void encode(Buffer& buffer);
virtual void decode(Buffer& buffer);
};
class TimeValue : public ValueOps<u_int64_t> {
public:
TimeValue(u_int64_t v) : ValueOps<u_int64_t>(v){}
TimeValue(){}
virtual u_int32_t size() const { return 8; }
virtual char getType() const { return 'T'; }
virtual void encode(Buffer& buffer);
virtual void decode(Buffer& buffer);
};
class DecimalValue : public ValueOps<Decimal> {
public:
DecimalValue(const Decimal& d) : ValueOps<Decimal>(d) {}
DecimalValue(u_int32_t value_=0, u_int8_t decimals_=0) :
ValueOps<Decimal>(Decimal(value_, decimals_)){}
virtual u_int32_t size() const { return 5; }
virtual char getType() const { return 'D'; }
virtual void encode(Buffer& buffer);
virtual void decode(Buffer& buffer);
};
class FieldTableValue : public ValueOps<FieldTable> {
public:
FieldTableValue(const FieldTable& v) : ValueOps<FieldTable>(v){}
FieldTableValue(){}
virtual u_int32_t size() const { return 4 + value.size(); }
virtual char getType() const { return 'F'; }
virtual void encode(Buffer& buffer);
virtual void decode(Buffer& buffer);
};
class EmptyValue : public Value {
public:
~EmptyValue();
virtual u_int32_t size() const { return 0; }
virtual char getType() const { return 0; }
virtual void encode(Buffer& ) {}
virtual void decode(Buffer& ) {}
virtual bool operator==(const Value& v) const {
return dynamic_cast<const EmptyValue*>(&v);
}
virtual void print(std::ostream& out) const;
};
//non-standard types, introduced in java client for JMS compliance
class BinaryValue : public StringValue {
public:
BinaryValue(const std::string& v) : StringValue(v) {}
BinaryValue() {}
virtual char getType() const { return 'x'; }
};
}} // qpid::framing
#endif