blob: 81e02147a88f760a902c45c2c06db0a30eb8ac19 [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.
*/
#ifndef _ACTIVEMQ_WIREFORMAT_OPENWIRE_MARSHAL_BASEDATASTREAMMARSHALLER_H_
#define _ACTIVEMQ_WIREFORMAT_OPENWIRE_MARSHAL_BASEDATASTREAMMARSHALLER_H_
#include <activemq/wireformat/openwire/marshal/DataStreamMarshaller.h>
#include <activemq/wireformat/openwire/utils/HexTable.h>
#include <activemq/commands/MessageId.h>
#include <activemq/commands/ProducerId.h>
#include <activemq/commands/TransactionId.h>
#include <activemq/util/Config.h>
namespace activemq{
namespace wireformat{
namespace openwire{
namespace marshal{
/**
* Base class for all Marshallers that marshal DataStructures to and
* from the wire using the OpenWire protocol.
*
* @since 2.0
*/
class AMQCPP_API BaseDataStreamMarshaller: public DataStreamMarshaller {
private:
// Table for converting bytes to Hex Strings.
static utils::HexTable hexTable;
public:
virtual ~BaseDataStreamMarshaller() {}
/**
* Tight Marhsal to the given stream
* @param format - The OpenwireFormat properties
* @param command - the object to Marshal
* @param bs - boolean stream to marshal to.
* @throws IOException if an error occurs.
*/
virtual int tightMarshal1(OpenWireFormat* format AMQCPP_UNUSED, commands::DataStructure* command AMQCPP_UNUSED, utils::BooleanStream* bs AMQCPP_UNUSED) {
return 0;
}
/**
* Tight Marshal to the given stream
* @param format - The OpenwireFormat properties
* @param command - the object to Marshal
* @param ds - the DataOutputStream to Marshal to
* @param bs - boolean stream to marshal to.
* @throws IOException if an error occurs.
*/
virtual void tightMarshal2(OpenWireFormat* format AMQCPP_UNUSED,
commands::DataStructure* command AMQCPP_UNUSED,
decaf::io::DataOutputStream* ds AMQCPP_UNUSED,
utils::BooleanStream* bs AMQCPP_UNUSED) {}
/**
* Tight Un-Marshal to the given stream
* @param format - The OpenwireFormat properties
* @param command - the object to Un-Marshal
* @param dis - the DataInputStream to Un-Marshal from
* @param bs - boolean stream to Un-Marshal from.
* @throws IOException if an error occurs.
*/
virtual void tightUnmarshal(OpenWireFormat* format AMQCPP_UNUSED,
commands::DataStructure* command AMQCPP_UNUSED,
decaf::io::DataInputStream* dis AMQCPP_UNUSED,
utils::BooleanStream* bs AMQCPP_UNUSED) {}
/**
* Tight Marshal to the given stream
* @param format - The OpenwireFormat properties
* @param command - the object to Marshal
* @param ds - DataOutputStream to marshal to
* @throws IOException if an error occurs.
*/
virtual void looseMarshal(OpenWireFormat* format AMQCPP_UNUSED,
commands::DataStructure* command AMQCPP_UNUSED,
decaf::io::DataOutputStream* ds AMQCPP_UNUSED) {}
/**
* Loose Un-Marshal to the given stream
* @param format - The OpenwireFormat properties
* @param command - the object to Un-Marshal
* @param dis - the DataInputStream to Un-Marshal from
* @throws IOException if an error occurs.
*/
virtual void looseUnmarshal(OpenWireFormat* format AMQCPP_UNUSED,
commands::DataStructure* command AMQCPP_UNUSED,
decaf::io::DataInputStream* dis AMQCPP_UNUSED) {}
public:
// Statics
/**
* Converts the object to a String
* @param id - MessageId pointer
* @return string representing the id
*/
static std::string toString(const commands::MessageId* id);
/**
* Converts the object to a String
* @param id - ProducerId pointer
* @return string representing the id
*/
static std::string toString(const commands::ProducerId* id);
/**
* Converts the given transaction ID into a String
* @param txnId - TransactionId poitner
* @return string representation of the id
*/
static std::string toString(const commands::TransactionId* txnId);
/**
* given an array of bytes, convert that array to a Hexidecimal
* coded string that represents that data.
* @param data - unsigned char data array pointer
* @return a string coded in hex that represents the data
*/
static std::string toHexFromBytes(const std::vector<unsigned char>& data);
protected:
/**
* Tight Unmarshal the cached object
* @param wireFormat - The OpenwireFormat properties
* @param dataIn - stream to read marshaled form from
* @param bs - boolean stream to marshal to.
* @return pointer to a new DataStructure Object
* @throws IOException if an error occurs.
*/
virtual commands::DataStructure* tightUnmarshalCachedObject(OpenWireFormat* wireFormat, decaf::io::DataInputStream* dataIn, utils::BooleanStream* bs);
/**
* Tightly marshals the passed DataStructure based object to the passed
* BooleanStream returning the size of the data marshaled
* @param wireFormat - The OpenwireFormat properties
* @param data - DataStructure Object Pointer to marshal
* @param bs - boolean stream to marshal to.
* @return size of data written.
* @throws IOException if an error occurs.
*/
virtual int tightMarshalCachedObject1(OpenWireFormat* wireFormat, commands::DataStructure* data, utils::BooleanStream* bs);
/**
* Tightly marshals the passed DataStructure based object to the passed
* streams returning nothing
* @param wireFormat - The OpenwireFormat properties
* @param data - DataStructure Object Pointer to marshal
* @param bs - boolean stream to marshal to.
* @param dataOut - stream to write marshaled data to
* @throws IOException if an error occurs.
*/
virtual void tightMarshalCachedObject2(OpenWireFormat* wireFormat, commands::DataStructure* data, decaf::io::DataOutputStream* dataOut,utils::BooleanStream* bs);
/**
* Loosely marshals the passed DataStructure based object to the passed
* stream returning nothing
* @param wireFormat - The OpenwireFormat properties
* @param data - DataStructure Object Pointer to marshal
* @param dataOut - stream to write marshaled data to
* @throws IOException if an error occurs.
*/
virtual void looseMarshalCachedObject(OpenWireFormat* wireFormat, commands::DataStructure* data, decaf::io::DataOutputStream* dataOut);
/**
* Loose Unmarshal the cached object
* @param wireFormat - The OpenwireFormat properties
* @param dataIn - stream to read marshaled form from
* @return pointer to a new DataStructure Object
* @throws IOException if an error occurs.
*/
virtual commands::DataStructure* looseUnmarshalCachedObject(OpenWireFormat* wireFormat, decaf::io::DataInputStream* dataIn);
/**
* Tightly marshals the passed DataStructure based object to the passed
* BooleanStream returning the size of the data marshaled
* @param wireFormat - The OpenwireFormat properties
* @param object - DataStructure Object Pointer to marshal
* @param bs - boolean stream to marshal to.
* @return size of data written.
* @throws IOException if an error occurs.
*/
virtual int tightMarshalNestedObject1(OpenWireFormat* wireFormat, commands::DataStructure* object, utils::BooleanStream* bs);
/**
* Tightly marshals the passed DataStructure based object to the passed
* streams returning nothing
* @param wireFormat - The OpenwireFormat properties
* @param object - DataStructure Object Pointer to marshal
* @param bs - boolean stream to marshal to.
* @param dataOut - stream to write marshaled data to
* @throws IOException if an error occurs.
*/
virtual void tightMarshalNestedObject2(OpenWireFormat* wireFormat, commands::DataStructure* object, decaf::io::DataOutputStream* dataOut,
utils::BooleanStream* bs);
/**
* Tight Unmarshal the nested object
* @param wireFormat - The OpenwireFormat properties
* @param dataIn - stream to read marshaled form from
* @param bs - boolean stream to marshal to.
* @return pointer to a new DataStructure Object
* @throws IOException if an error occurs.
*/
virtual commands::DataStructure* tightUnmarshalNestedObject(OpenWireFormat* wireFormat, decaf::io::DataInputStream* dataIn, utils::BooleanStream* bs);
/**
* Loose Unmarshal the nested object
* @param wireFormat - The OpenwireFormat properties
* @param dataIn - stream to read marshaled form from
* @return pointer to a new DataStructure Object
* @throws IOException if an error occurs.
*/
virtual commands::DataStructure* looseUnmarshalNestedObject(OpenWireFormat* wireFormat, decaf::io::DataInputStream* dataIn);
/**
* Loose marshall the nested object
* @param wireFormat - The OpenwireFormat properties
* @param object - DataStructure Object Pointer to marshal
* @param dataOut - stream to write marshaled data to
* @throws IOException if an error occurs.
*/
virtual void looseMarshalNestedObject(OpenWireFormat* wireFormat, commands::DataStructure* object, decaf::io::DataOutputStream* dataOut);
/**
* Performs Tight Unmarshaling of String Objects
* @param dataIn - the DataInputStream to Un-Marshal from
* @param bs - boolean stream to unmarshal from.
* @return the unmarshaled string.
* @throws IOException if an error occurs.
*/
virtual std::string tightUnmarshalString(decaf::io::DataInputStream* dataIn, utils::BooleanStream* bs);
/**
* Tight Marshals the String to a Booleans Stream Object, returns
* the marshaled size.
* @param value - string to marshal
* @param bs - BooleanStream to use.
* @return size of marshaled string.
* @throws IOException if an error occurs.
*/
virtual int tightMarshalString1(const std::string& value, utils::BooleanStream* bs);
/**
* Tight Marshals the passed string to the streams passed
* @param value - string to marshal
* @param dataOut - the DataOutputStream to Marshal to
* @param bs - boolean stream to marshal to.
* @throws IOException if an error occurs.
*/
virtual void tightMarshalString2(const std::string& value, decaf::io::DataOutputStream* dataOut, utils::BooleanStream* bs);
/**
* Loose Marshal the String to the DataOuputStream passed
* @param value - string to marshal
* @param dataOut - stream to write marshaled form to
* @throws IOException if an error occurs.
*/
virtual void looseMarshalString(const std::string value, decaf::io::DataOutputStream* dataOut);
/**
* Loose Un-Marshal the String to the DataOuputStream passed
* @param dataIn - stream to read marshaled form from
* @return the unmarshaled string
* @throws IOException if an error occurs.
*/
virtual std::string looseUnmarshalString(decaf::io::DataInputStream* dataIn);
/**
* Tightly marshal the long long to the BooleanStream passed.
* @param wireFormat - The OpenwireFormat properties
* @param value - long long to marshal
* @param bs - boolean stream to marshal to.
* @return size of data written.
* @throws IOException if an error occurs.
*/
virtual int tightMarshalLong1(OpenWireFormat* wireFormat, long long value, utils::BooleanStream* bs);
/**
* Tightly marshal the long long to the Streams passed.
* @param wireFormat - The OpenwireFormat properties
* @param value - long long to marshal
* @param dataOut - stream to write marshaled form to
* @param bs - boolean stream to marshal to.
* @throws IOException if an error occurs.
*/
virtual void tightMarshalLong2(OpenWireFormat* wireFormat, long long value, decaf::io::DataOutputStream* dataOut, utils::BooleanStream* bs);
/**
* Tight marshal the long long type.
* @param wireFormat - The OpenwireFormat properties
* @param dataIn - stream to read marshaled form from
* @param bs - boolean stream to marshal to.
* @return the unmarshaled long long
* @throws IOException if an error occurs.
*/
virtual long long tightUnmarshalLong(OpenWireFormat* wireFormat, decaf::io::DataInputStream* dataIn, utils::BooleanStream* bs);
/**
* Tightly marshal the long long to the BooleanStream passed.
* @param wireFormat - The OpenwireFormat properties
* @param value - long long to marshal
* @param dataOut - DataOutputStream to marshal to.
* @throws IOException if an error occurs.
*/
virtual void looseMarshalLong(OpenWireFormat* wireFormat, long long value, decaf::io::DataOutputStream* dataOut);
/**
* Loose marshal the long long type.
* @param wireFormat - The OpenwireFormat properties
* @param dataIn - stream to read marshaled form from
* @return the unmarshaled long long
* @throws IOException if an error occurs.
*/
virtual long long looseUnmarshalLong(OpenWireFormat* wireFormat, decaf::io::DataInputStream* dataIn);
/**
* Tight Unmarshal an array of char
* @param dataIn - the DataInputStream to Un-Marshal from
* @param bs - boolean stream to unmarshal from.
* @return the unmarshaled vector of chars.
* @throws IOException if an error occurs.
*/
virtual std::vector<unsigned char> tightUnmarshalByteArray(decaf::io::DataInputStream* dataIn, utils::BooleanStream* bs);
/**
* Loose Unmarshal an array of char
* @param dataIn - the DataInputStream to Un-Marshal from
* @return the unmarshalled vector of chars.
* @throws IOException if an error occurs.
*/
virtual std::vector<unsigned char> looseUnmarshalByteArray(decaf::io::DataInputStream* dataIn);
/**
* Tight Unmarshal a fixed size array from that data input stream
* and return an stl vector of char as the resultant.
* @param dataIn - the DataInputStream to Un-Marshal from
* @param bs - boolean stream to unmarshal from.
* @param size - size of the const array to unmarshal
* @return the unmarshaled vector of chars.
* @throws IOException if an error occurs.
*/
virtual std::vector<unsigned char> tightUnmarshalConstByteArray(decaf::io::DataInputStream* dataIn, utils::BooleanStream* bs, int size);
/**
* Tight Unmarshal a fixed size array from that data input stream
* and return an stl vector of char as the resultant.
* @param dataIn - the DataInputStream to Un-Marshal from
* @param size - size of the const array to unmarshal
* @return the unmarshaled vector of chars.
* @throws IOException if an error occurs.
*/
virtual std::vector<unsigned char> looseUnmarshalConstByteArray(decaf::io::DataInputStream* dataIn, int size);
/**
* Tight Unarshall the Error object
* @param wireFormat - The OpenwireFormat properties
* @param dataIn - stream to read marshalled form from
* @param bs - boolean stream to marshal to.
* @return pointer to a new DataStructure Object
* @throws IOException if an error occurs.
*/
virtual commands::DataStructure* tightUnmarshalBrokerError(OpenWireFormat* wireFormat, decaf::io::DataInputStream* dataIn, utils::BooleanStream* bs);
/**
* Tight Marshal the Error object
* @param wireFormat - The OpenwireFormat properties
* @param data - Error to Marshal
* @param bs - boolean stream to marshal to.
* @return size of the marshalled data
* @throws IOException if an error occurs.
*/
virtual int tightMarshalBrokerError1(OpenWireFormat* wireFormat, commands::DataStructure* data, utils::BooleanStream* bs);
/**
* Tight Marshal the Error object
* @param wireFormat - The OpenwireFormat properties
* @param data - Error to Marshal
* @param dataOut - stream to write marshalled data to
* @param bs - boolean stream to marshal to.
* @throws IOException if an error occurs.
*/
virtual void tightMarshalBrokerError2(OpenWireFormat* wireFormat, commands::DataStructure* data, decaf::io::DataOutputStream* dataOut,utils::BooleanStream* bs);
/**
* Loose Unarshal the Error object
* @param wireFormat - The OpenwireFormat properties
* @param dataIn - stream to read marshalled form from
* @return pointer to a new DataStructure Object
* @throws IOException if an error occurs.
*/
virtual commands::DataStructure* looseUnmarshalBrokerError(OpenWireFormat* wireFormat, decaf::io::DataInputStream* dataIn);
/**
* Tight Marshal the Error object
* @param wireFormat - The OpenwireFormat properties
* @param data - Error to Marshal
* @param dataOut - stream to write marshalled data to
* @throws IOException if an error occurs.
*/
virtual void looseMarshalBrokerError(OpenWireFormat* wireFormat, commands::DataStructure* data, decaf::io::DataOutputStream* dataOut);
/**
* Tightly Marshal an array of DataStructure objects to the provided
* boolean stream, and return the size that the tight marshalling is
* going to take.
* @param wireFormat - The OpenwireFormat properties
* @param objects - array of DataStructure object pointers.
* @param bs - boolean stream to marshal to.
* @return size of the marshalled data
* @throws IOException if an error occurs.
*/
template<typename T>
int tightMarshalObjectArray1(OpenWireFormat* wireFormat, std::vector<T> objects, utils::BooleanStream* bs) {
try {
if (!objects.empty()) {
int rc = 0;
bs->writeBoolean(true);
rc += 2;
for (std::size_t i = 0; i < objects.size(); ++i) {
rc += tightMarshalNestedObject1(wireFormat, objects[i].get(), bs);
}
return rc;
} else {
bs->writeBoolean(false);
return 0;
}
}
AMQ_CATCH_RETHROW(decaf::io::IOException)
AMQ_CATCH_EXCEPTION_CONVERT(decaf::lang::Exception, decaf::io::IOException)
AMQ_CATCHALL_THROW(decaf::io::IOException)
}
/**
* Tightly Marshal an array of DataStructure objects to the provided
* boolean stream and data output stream
* @param wireFormat - The OpenwireFormat properties
* @param objects - array of DataStructure object pointers.
* @param dataOut - stream to write marshalled data to
* @param bs - boolean stream to marshal to.
* @return size of the marshalled data
* @throws IOException if an error occurs.
*/
template<typename T>
void tightMarshalObjectArray2(OpenWireFormat* wireFormat, std::vector<T> objects, decaf::io::DataOutputStream* dataOut, utils::BooleanStream* bs) {
try {
if (bs->readBoolean()) {
dataOut->writeShort((short) objects.size());
for (std::size_t i = 0; i < objects.size(); ++i) {
tightMarshalNestedObject2(wireFormat, objects[i].get(), dataOut, bs);
}
}
}
AMQ_CATCH_RETHROW(decaf::io::IOException)
AMQ_CATCH_EXCEPTION_CONVERT(decaf::lang::Exception, decaf::io::IOException)
AMQ_CATCHALL_THROW(decaf::io::IOException)
}
/**
* Loosely Marshal an array of DataStructure objects to the provided
* boolean stream and data output stream
* @param wireFormat - The OpenwireFormat properties
* @param objects - array of DataStructure object pointers.
* @param dataOut - stream to write marshalled data to
* @return size of the marshalled data
* @throws IOException if an error occurs.
*/
template<typename T>
void looseMarshalObjectArray(OpenWireFormat* wireFormat, std::vector<T> objects, decaf::io::DataOutputStream* dataOut) {
try {
dataOut->writeBoolean(!objects.empty());
if (!objects.empty()) {
dataOut->writeShort((short) objects.size());
for (std::size_t i = 0; i < objects.size(); ++i) {
looseMarshalNestedObject(wireFormat, objects[i].get(), dataOut);
}
}
}
AMQ_CATCH_RETHROW(decaf::io::IOException)
AMQ_CATCH_EXCEPTION_CONVERT(decaf::lang::Exception, decaf::io::IOException)
AMQ_CATCHALL_THROW(decaf::io::IOException)
}
protected:
/**
* Given an DataInputStream read a know ASCII formatted string from
* the input and return that string
* @param dataIn - DataInputStream to read from
* @return string value read from stream
*/
virtual std::string readAsciiString(decaf::io::DataInputStream* dataIn);
};
}}}}
#endif /*_ACTIVEMQ_WIREFORMAT_OPENWIRE_MARSHAL_BASEDATASTREAMMARSHALLER_H_*/