You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by nm...@apache.org on 2006/07/03 13:51:54 UTC
svn commit: r418749 [11/17] - in /incubator/activemq/trunk/activemq-cpp: ./
src/ src/main/ src/main/activemq/ src/main/activemq/concurrent/
src/main/activemq/connector/ src/main/activemq/connector/openwire/
src/main/activemq/connector/stomp/ src/main/a...
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/IOTransportFactory.h
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/IOTransportFactory.h?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/IOTransportFactory.h (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/IOTransportFactory.h Mon Jul 3 04:51:36 2006
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed 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_TRANSPORT_IOTRANSPORTFACTORY_H_
+#define ACTIVEMQ_TRANSPORT_IOTRANSPORTFACTORY_H_
+
+#include <activemq/transport/IOTransport.h>
+#include <activemq/transport/TransportFactory.h>
+#include <activemq/transport/TransportFactoryMapRegistrar.h>
+
+namespace activemq{
+namespace transport{
+
+ /**
+ * Manufactures IOTransports, which are objects that
+ * read from input streams and write to output streams.
+ */
+ class IOTransportFactory : public TransportFactory{
+ private:
+
+ static TransportFactoryMapRegistrar registrar;
+
+ public:
+
+ virtual ~IOTransportFactory(){}
+
+ /**
+ * Creates a Transport instance.
+ * @param properties The properties for the transport.
+ */
+ virtual Transport* createTransport(
+ const activemq::util::Properties& properties )
+ {
+ return new IOTransport();
+ }
+
+ /**
+ * Returns a reference to this TransportFactory
+ * @returns TransportFactory Reference
+ */
+ static TransportFactory& getInstance(void);
+
+ };
+
+}}
+
+#endif /*ACTIVEMQ_TRANSPORT_IOTRANSPORTFACTORY_H_*/
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/Response.h
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/Response.h?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/Response.h (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/Response.h Mon Jul 3 04:51:36 2006
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed 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_TRANSPORT_RESPONSE_H_
+#define ACTIVEMQ_TRANSPORT_RESPONSE_H_
+
+#include <activemq/transport/Command.h>
+
+namespace activemq{
+namespace transport{
+
+ class Response : public Command{
+ public:
+
+ virtual ~Response(void) {}
+
+ /**
+ * Gets the Correlation Id that is associated with this message
+ * @return the Correlation Id
+ */
+ virtual unsigned int getCorrelationId() const = 0;
+
+ /**
+ * Sets the Correlation Id if this Command
+ * @param Id
+ */
+ virtual void setCorrelationId( const unsigned int corrId ) = 0;
+
+ };
+
+}}
+
+#endif /*ACTIVEMQ_TRANSPORT_RESPONSE_H_*/
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/ResponseCorrelator.cpp
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/ResponseCorrelator.cpp?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/ResponseCorrelator.cpp (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/ResponseCorrelator.cpp Mon Jul 3 04:51:36 2006
@@ -0,0 +1 @@
+#include "ResponseCorrelator.h"
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/ResponseCorrelator.h
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/ResponseCorrelator.h?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/ResponseCorrelator.h (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/ResponseCorrelator.h Mon Jul 3 04:51:36 2006
@@ -0,0 +1,368 @@
+/*
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed 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_TRANSPORT_RESPONSECORRELATOR_H_
+#define ACTIVEMQ_TRANSPORT_RESPONSECORRELATOR_H_
+
+#include <activemq/transport/TransportFilter.h>
+#include <activemq/transport/FutureResponse.h>
+#include <activemq/transport/Command.h>
+#include <activemq/transport/ExceptionResponse.h>
+#include <activemq/concurrent/Mutex.h>
+#include <activemq/concurrent/Concurrent.h>
+#include <map>
+
+namespace activemq{
+namespace transport{
+
+ /**
+ * This type of transport filter is responsible for correlating
+ * asynchronous responses with requests. Non-response messages
+ * are simply sent directly to the CommandListener. It owns
+ * the transport that it
+ */
+ class ResponseCorrelator : public TransportFilter
+ {
+ private:
+
+ /**
+ * The next command id for sent commands.
+ */
+ unsigned int nextCommandId;
+
+ /**
+ * Map of request ids to future response objects.
+ */
+ std::map<unsigned int, FutureResponse*> requestMap;
+
+ /**
+ * Maximum amount of time in milliseconds to wait for a response.
+ */
+ unsigned long maxResponseWaitTime;
+
+ /**
+ * Sync object for accessing the next command id variable.
+ */
+ concurrent::Mutex commandIdMutex;
+
+ /**
+ * Sync object for accessing the request map.
+ */
+ concurrent::Mutex mapMutex;
+
+ /**
+ * Flag to indicate the closed state.
+ */
+ bool closed;
+
+ private:
+
+ /**
+ * Returns the next available command id.
+ */
+ unsigned int getNextCommandId() throw (exceptions::ActiveMQException){
+
+ try{
+ synchronized( &commandIdMutex ){
+ return ++nextCommandId;
+ }
+
+ // Should never get here, but some compilers aren't
+ // smart enough to figure out we'll never get here.
+ return 0;
+ }
+ AMQ_CATCH_RETHROW( exceptions::ActiveMQException )
+ AMQ_CATCHALL_THROW( exceptions::ActiveMQException )
+ }
+
+ public:
+
+ /**
+ * Constructor.
+ */
+ ResponseCorrelator( Transport* next, const bool own = true )
+ :
+ TransportFilter( next, own )
+ {
+ nextCommandId = 0;
+
+ // Default max response wait time to 3 seconds.
+ maxResponseWaitTime = 3000;
+
+ // Start in the closed state.
+ closed = true;
+ }
+
+ /**
+ * Destructor - calls close().
+ */
+ virtual ~ResponseCorrelator(){
+
+ // Close the transport and destroy it.
+ close();
+
+ // Don't do anything with the future responses -
+ // they should be cleaned up by each requester.
+ }
+
+ /**
+ * Gets the maximum wait time for a response in milliseconds.
+ */
+ virtual unsigned long getMaxResponseWaitTime() const{
+ return maxResponseWaitTime;
+ }
+
+ /**
+ * Sets the maximum wait time for a response in milliseconds.
+ */
+ virtual void setMaxResponseWaitTime( const unsigned long milliseconds ){
+ maxResponseWaitTime = milliseconds;
+ }
+
+ /**
+ * Sends a one-way command. Does not wait for any response from the
+ * broker.
+ * @param command the command to be sent.
+ * @throws CommandIOException if an exception occurs during writing of
+ * the command.
+ * @throws UnsupportedOperationException if this method is not implemented
+ * by this transport.
+ */
+ virtual void oneway( Command* command )
+ throw(CommandIOException, exceptions::UnsupportedOperationException)
+ {
+
+ try{
+ command->setCommandId( getNextCommandId() );
+ command->setResponseRequired( false );
+
+ if( closed || next == NULL ){
+ throw CommandIOException( __FILE__, __LINE__,
+ "transport already closed" );
+ }
+
+ next->oneway( command );
+ }
+ AMQ_CATCH_RETHROW( exceptions::UnsupportedOperationException )
+ AMQ_CATCH_RETHROW( CommandIOException )
+ AMQ_CATCH_EXCEPTION_CONVERT( exceptions::ActiveMQException, CommandIOException )
+ AMQ_CATCHALL_THROW( CommandIOException )
+ }
+
+ /**
+ * Sends the given request to the server and waits for the response.
+ * @param command The request to send.
+ * @return the response from the server. This may be of type ExceptionResponse
+ * in the case of a distributed error that occurs at the broker.
+ * @throws CommandIOException if an error occurs with the request.
+ */
+ virtual Response* request( Command* command )
+ throw(CommandIOException, exceptions::UnsupportedOperationException)
+ {
+
+ try{
+ command->setCommandId( getNextCommandId() );
+ command->setResponseRequired( true );
+
+ // Add a future response object to the map indexed by this
+ // command id.
+ FutureResponse* futureResponse =
+ new FutureResponse();
+
+ synchronized( &mapMutex ){
+ requestMap[command->getCommandId()] = futureResponse;
+ }
+
+ // Wait to be notified of the response via the futureResponse
+ // object.
+ Response* response = NULL;
+ synchronized( futureResponse ){
+
+ // Send the request.
+ next->oneway( command );
+
+ // Wait for the response to come in.
+ futureResponse->wait( maxResponseWaitTime );
+
+ // Get the response.
+ response = futureResponse->getResponse();
+ }
+
+ // Perform cleanup on the map.
+ synchronized( &mapMutex ){
+
+ // We've done our waiting - get this thing out
+ // of the map.
+ requestMap.erase( command->getCommandId() );
+
+ // Destroy the futureResponse. It is safe to
+ // do this now because the other thread only
+ // accesses the futureResponse within a lock on
+ // the map.
+ delete futureResponse;
+ futureResponse = NULL;
+ }
+
+ if( response == NULL ){
+
+ throw CommandIOException( __FILE__, __LINE__,
+ "response from futureResponse was invalid" );
+ }
+
+ return response;
+ }
+ AMQ_CATCH_RETHROW( exceptions::UnsupportedOperationException )
+ AMQ_CATCH_RETHROW( CommandIOException )
+ AMQ_CATCH_EXCEPTION_CONVERT( exceptions::ActiveMQException, CommandIOException )
+ AMQ_CATCHALL_THROW( CommandIOException )
+ }
+
+ /**
+ * This is called in the context of the nested transport's
+ * reading thread. In the case of a response object,
+ * updates the request map and notifies those waiting on the
+ * response. Non-response messages are just delegated to
+ * the command listener.
+ * @param command the received from the nested transport.
+ */
+ virtual void onCommand( Command* command ){
+
+ // Let's see if the incoming command is a response.
+ Response* response =
+ dynamic_cast<Response*>(command);
+
+ if( response == NULL ){
+
+ // It's a non-response - just notify the listener.
+ fire( command );
+ return;
+ }
+
+ // It is a response - let's correlate ...
+ synchronized( &mapMutex ){
+
+ // Look the future request up based on the correlation id.
+ std::map<unsigned int, FutureResponse*>::iterator iter =
+ requestMap.find( response->getCorrelationId() );
+ if( iter == requestMap.end() ){
+
+ // This is not terrible - just log it.
+ printf("ResponseCorrelator::onCommand() - received unknown response for request: %d\n",
+ response->getCorrelationId() );
+ return;
+ }
+
+ // Get the future response (if it's in the map, it's not NULL).
+ FutureResponse* futureResponse = iter->second;
+
+ // If it's an exception response, notify the exception listener.
+ ExceptionResponse* exResp =
+ dynamic_cast<ExceptionResponse*>(response);
+ if( exResp != NULL ){
+ const BrokerError* error = exResp->getException();
+ fire( *error );
+ }
+
+ synchronized( futureResponse ){
+
+ // Set the response property in the future response.
+ futureResponse->setResponse( response );
+
+ // Notify all waiting for this response.
+ futureResponse->notifyAll();
+ }
+ }
+ }
+
+ /**
+ * Assigns the command listener for non-response commands.
+ * @param listener the listener.
+ */
+ virtual void setCommandListener( CommandListener* listener ){
+ this->commandlistener = listener;
+ }
+
+ /**
+ * Sets the observer of asynchronous exceptions from this transport.
+ * @param listener the listener of transport exceptions.
+ */
+ virtual void setTransportExceptionListener(
+ TransportExceptionListener* listener )
+ {
+ this->exceptionListener = listener;
+ }
+
+ /**
+ * Starts this transport object and creates the thread for
+ * polling on the input stream for commands. If this object
+ * has been closed, throws an exception. Before calling start,
+ * the caller must set the IO streams and the reader and writer
+ * objects.
+ * @throws CMSException if an error occurs or if this transport
+ * has already been closed.
+ */
+ virtual void start() throw( cms::CMSException ){
+
+ /**
+ * We're already started.
+ */
+ if( !closed ){
+ return;
+ }
+
+ if( commandlistener == NULL ){
+ throw exceptions::ActiveMQException( __FILE__, __LINE__,
+ "commandListener is invalid" );
+ }
+
+ if( exceptionListener == NULL ){
+ throw exceptions::ActiveMQException( __FILE__, __LINE__,
+ "exceptionListener is invalid" );
+ }
+
+ if( next == NULL ){
+ throw exceptions::ActiveMQException( __FILE__, __LINE__,
+ "next transport is NULL" );
+ }
+
+ // Start the delegate transport object.
+ next->start();
+
+ // Mark it as open.
+ closed = false;
+ }
+
+ /**
+ * Stops the polling thread and closes the streams. This can
+ * be called explicitly, but is also called in the destructor. Once
+ * this object has been closed, it cannot be restarted.
+ * @throws CMSException if errors occur.
+ */
+ virtual void close() throw( cms::CMSException ){
+
+ if( !closed && next != NULL ){
+ next->close();
+ }
+
+ closed = true;
+ }
+
+ };
+
+}}
+
+#endif /*ACTIVEMQ_TRANSPORT_RESPONSECORRELATOR_H_*/
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TcpTransport.cpp
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TcpTransport.cpp?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TcpTransport.cpp (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TcpTransport.cpp Mon Jul 3 04:51:36 2006
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed 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 "TcpTransport.h"
+
+#include <activemq/network/SocketFactory.h>
+#include <activemq/transport/IOTransport.h>
+#include <activemq/transport/TransportFactory.h>
+#include <activemq/transport/TransportFactoryMap.h>
+
+using namespace std;
+using namespace activemq;
+using namespace activemq::transport;
+using namespace activemq::network;
+using namespace activemq::exceptions;
+
+////////////////////////////////////////////////////////////////////////////////
+TcpTransport::TcpTransport( const activemq::util::Properties& properties,
+ Transport* next,
+ const bool own )
+ : TransportFilter( next, own )
+{
+ try
+ {
+ // Create the IO device we will be communicating over the
+ // wire with. This may need to change if we add more types
+ // of sockets, such as SSL.
+ socket = SocketFactory::createSocket(properties);
+
+ // Cast it to an IO transport so we can wire up the socket
+ // input and output streams.
+ IOTransport* ioTransport = dynamic_cast<IOTransport*>( next );
+ if( ioTransport == NULL ){
+ throw ActiveMQException(
+ __FILE__, __LINE__,
+ "TcpTransport::TcpTransport - "
+ "transport must be of type IOTransport");
+ }
+
+ // Give the IOTransport the streams from out TCP socket.
+ ioTransport->setInputStream( socket->getInputStream() );
+ ioTransport->setOutputStream( socket->getOutputStream() );
+ }
+ AMQ_CATCH_RETHROW( ActiveMQException )
+ AMQ_CATCHALL_THROW( ActiveMQException )
+}
+
+////////////////////////////////////////////////////////////////////////////////
+TcpTransport::~TcpTransport(void)
+{
+ try
+ {
+ socket->close();
+ delete socket;
+ }
+ AMQ_CATCH_NOTHROW( ActiveMQException )
+ AMQ_CATCHALL_NOTHROW( )
+}
+
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TcpTransport.h
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TcpTransport.h?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TcpTransport.h (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TcpTransport.h Mon Jul 3 04:51:36 2006
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed 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_TRANSPORT_TCPTRANSPORT_H_
+#define _ACTIVEMQ_TRANSPORT_TCPTRANSPORT_H_
+
+#include <activemq/transport/TransportFilter.h>
+#include <activemq/network/Socket.h>
+#include <activemq/util/Properties.h>
+
+namespace activemq{
+namespace transport{
+
+ /**
+ * Implements a TCP/IP based transport filter, this transport
+ * is meant to wrap an instance of an IOTransport. The lower
+ * level transport should take care of manaing stream reads
+ * and writes.
+ */
+ class TcpTransport : public TransportFilter
+ {
+ private:
+
+ /**
+ * Socket that this Transport Communicates with
+ */
+ network::Socket* socket;
+
+ public:
+
+ TcpTransport( const activemq::util::Properties& properties,
+ Transport* next,
+ const bool own = true );
+ virtual ~TcpTransport(void);
+
+ };
+
+}}
+
+#endif /*_ACTIVEMQ_TRANSPORT_TCPTRANSPORT_H_*/
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TcpTransportFactory.cpp
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TcpTransportFactory.cpp?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TcpTransportFactory.cpp (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TcpTransportFactory.cpp Mon Jul 3 04:51:36 2006
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed 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 "TcpTransportFactory.h"
+
+#include <activemq/transport/TcpTransport.h>
+#include <activemq/transport/ResponseCorrelator.h>
+
+using namespace activemq;
+using namespace activemq::transport;
+using namespace activemq::exceptions;
+
+////////////////////////////////////////////////////////////////////////////////
+TransportFactory& TcpTransportFactory::getInstance(void)
+{
+ // Create the one and only instance of the registrar
+ static TransportFactoryMapRegistrar registrar(
+ "tcp", new TcpTransportFactory());
+
+ return registrar.getFactory();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+Transport* TcpTransportFactory::createTransport(
+ const activemq::util::Properties& properties )
+ throw ( ActiveMQException )
+{
+ try
+ {
+ TransportFactory* factory =
+ TransportFactoryMap::getInstance().lookup( "io" );
+
+ if( factory == NULL ){
+ throw ActiveMQException(
+ __FILE__, __LINE__,
+ "TcpTransport::createTransport - "
+ "unknown transport factory");
+ }
+
+ Transport* transport = new TcpTransport(
+ properties, factory->createTransport( properties ) );
+
+ // Create a response correlator. This will wrap around our
+ // transport and manage its lifecycle - we don't need the
+ // internal transport anymore, so we can reuse its pointer.
+ transport = new ResponseCorrelator( transport );
+
+ return transport;
+ }
+ AMQ_CATCH_RETHROW( ActiveMQException )
+ AMQ_CATCHALL_THROW( ActiveMQException )
+}
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TcpTransportFactory.h
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TcpTransportFactory.h?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TcpTransportFactory.h (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TcpTransportFactory.h Mon Jul 3 04:51:36 2006
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed 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_TRANSPORT_TCPTRANSPORTFACTORY_H_
+#define _ACTIVEMQ_TRANSPORT_TCPTRANSPORTFACTORY_H_
+
+#include <activemq/transport/TransportFactory.h>
+#include <activemq/transport/TransportFactoryMapRegistrar.h>
+#include <activemq/transport/IOTransportFactory.h>
+#include <activemq/exceptions/ActiveMQException.h>
+
+namespace activemq{
+namespace transport{
+
+ class TcpTransportFactory : public TransportFactory
+ {
+ public:
+
+ virtual ~TcpTransportFactory(void) {}
+
+ /**
+ * Creates a Transport instance.
+ * @param properties The properties for the transport.
+ * @throws ActiveMQException
+ */
+ virtual Transport* createTransport(
+ const activemq::util::Properties& properties )
+ throw ( exceptions::ActiveMQException );
+
+ /**
+ * Returns a reference to this TransportFactory
+ * @returns TransportFactory Reference
+ */
+ static TransportFactory& getInstance(void);
+
+ };
+
+}}
+
+#endif /*_ACTIVEMQ_TRANSPORT_TCPTRANSPORTFACTORY_H_*/
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/Transport.h
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/Transport.h?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/Transport.h (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/Transport.h Mon Jul 3 04:51:36 2006
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed 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_TRANSPORT_TRANSPORT_H_
+#define ACTIVEMQ_TRANSPORT_TRANSPORT_H_
+
+#include <activemq/io/InputStream.h>
+#include <activemq/io/OutputStream.h>
+#include <activemq/transport/CommandIOException.h>
+#include <activemq/exceptions/UnsupportedOperationException.h>
+#include <activemq/transport/Command.h>
+#include <activemq/transport/Response.h>
+#include <cms/Startable.h>
+#include <cms/Closeable.h>
+
+namespace activemq{
+namespace transport{
+
+ // Forward declarations.
+ class CommandListener;
+ class CommandReader;
+ class CommandWriter;
+ class TransportExceptionListener;
+
+ /**
+ * Interface for a transport layer for command objects. Callers can
+ * send oneway messages or make synchronous requests. Non-response
+ * messages will be delivered to the specified listener object upon
+ * receipt.
+ */
+ class Transport
+ :
+ public cms::Startable,
+ public cms::Closeable
+ {
+ public:
+
+ virtual ~Transport(){}
+
+ /**
+ * Sends a one-way command. Does not wait for any response from the
+ * broker.
+ * @param command the command to be sent.
+ * @throws CommandIOException if an exception occurs during writing of
+ * the command.
+ * @throws UnsupportedOperationException if this method is not implemented
+ * by this transport.
+ */
+ virtual void oneway( Command* command )
+ throw(CommandIOException,
+ exceptions::UnsupportedOperationException) = 0;
+
+ /**
+ * Sends the given command to the broker and then waits for the response.
+ * @param command the command to be sent.
+ * @return the response from the broker.
+ * @throws CommandIOException if an exception occurs during the read of the
+ * command.
+ * @throws UnsupportedOperationException if this method is not implemented
+ * by this transport.
+ */
+ virtual Response* request( Command* command )
+ throw(CommandIOException,
+ exceptions::UnsupportedOperationException) = 0;
+
+ /**
+ * Assigns the command listener for non-response commands.
+ * @param listener the listener.
+ */
+ virtual void setCommandListener( CommandListener* listener ) = 0;
+
+ /**
+ * Sets the command reader.
+ * @param reader the object that will be used for reading command objects.
+ */
+ virtual void setCommandReader( CommandReader* reader ) = 0;
+
+ /**
+ * Sets the command writer.
+ * @param writer the object that will be used for writing command objects.
+ */
+ virtual void setCommandWriter( CommandWriter* writer ) = 0;
+
+ /**
+ * Sets the observer of asynchronous exceptions from this transport.
+ * @param listener the listener of transport exceptions.
+ */
+ virtual void setTransportExceptionListener(
+ TransportExceptionListener* listener ) = 0;
+ };
+
+}}
+
+#endif /*ACTIVEMQ_TRANSPORT_TRANSPORT_H_*/
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportExceptionListener.h
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportExceptionListener.h?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportExceptionListener.h (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportExceptionListener.h Mon Jul 3 04:51:36 2006
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed 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_TRANSPORT_TRANSPORTEXCEPTIONLISTENER_H_
+#define ACTIVEMQ_TRANSPORT_TRANSPORTEXCEPTIONLISTENER_H_
+
+#include <activemq/exceptions/ActiveMQException.h>
+
+namespace activemq{
+namespace transport{
+
+ // Forward declarations.
+ class Transport;
+
+ /**
+ * A listener of asynchronous exceptions from a command transport object.
+ */
+ class TransportExceptionListener{
+ public:
+
+ virtual ~TransportExceptionListener(){}
+
+ /**
+ * Event handler for an exception from a command transport.
+ * @param source The source of the exception
+ * @param ex The exception.
+ */
+ virtual void onTransportException(
+ Transport* source,
+ const exceptions::ActiveMQException& ex ) = 0;
+ };
+
+}}
+
+#endif /*ACTIVEMQ_TRANSPORT_TRANSPORTEXCEPTIONLISTENER_H_*/
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportFactory.h
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportFactory.h?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportFactory.h (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportFactory.h Mon Jul 3 04:51:36 2006
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed 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_TRANSPORT_TRANSPORTFACTORY_H_
+#define ACTIVEMQ_TRANSPORT_TRANSPORTFACTORY_H_
+
+#include <activemq/transport/IOTransport.h>
+#include <activemq/transport/ResponseCorrelator.h>
+#include <activemq/io/InputStream.h>
+#include <activemq/io/OutputStream.h>
+#include <activemq/exceptions/IllegalArgumentException.h>
+#include <activemq/util/Properties.h>
+
+namespace activemq{
+namespace transport{
+
+ class TransportFactory{
+ public:
+
+ virtual ~TransportFactory(void){}
+
+ /**
+ * Creates a Transport instance.
+ * @param Properties Object that will hold transport values
+ */
+ virtual Transport* createTransport(
+ const activemq::util::Properties& properties ) = 0;
+
+ };
+
+}}
+
+#endif /*ACTIVEMQ_TRANSPORT_TRANSPORTFACTORY_H_*/
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportFactoryMap.cpp
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportFactoryMap.cpp?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportFactoryMap.cpp (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportFactoryMap.cpp Mon Jul 3 04:51:36 2006
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed 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 "TransportFactoryMap.h"
+
+using namespace activemq::transport;
+using namespace std;
+
+////////////////////////////////////////////////////////////////////////////////
+TransportFactoryMap& TransportFactoryMap::getInstance(void)
+{
+ // Static instance of this Map, create here so that one will
+ // always exist, the one and only Connector Map.
+ static TransportFactoryMap instance;
+
+ return instance;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void TransportFactoryMap::registerTransportFactory( const string& name,
+ TransportFactory* factory )
+{
+ factoryMap[name] = factory;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void TransportFactoryMap::unregisterTransportFactory( const string& name ){
+ factoryMap.erase(name);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+TransportFactory* TransportFactoryMap::lookup( const string& name ){
+
+ map<string, TransportFactory*>::const_iterator itr =
+ factoryMap.find(name);
+
+ if(itr != factoryMap.end())
+ {
+ return itr->second;
+ }
+
+ // Didn't find it, return nothing, not a single thing.
+ return NULL;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+size_t TransportFactoryMap::getFactoryNames(vector<string>& factoryList){
+ map<string, TransportFactory*>::const_iterator itr =
+ factoryMap.begin();
+
+ for(; itr != factoryMap.end(); ++itr)
+ {
+ factoryList.insert(factoryList.end(), itr->first);
+ }
+
+ return factoryMap.size();
+}
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportFactoryMap.h
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportFactoryMap.h?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportFactoryMap.h (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportFactoryMap.h Mon Jul 3 04:51:36 2006
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed 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_TRANSPORT_TRANSPORTFACTORYMAP_H_
+#define ACTIVEMQ_TRANSPORT_TRANSPORTFACTORYMAP_H_
+
+#include <activemq/transport/TransportFactory.h>
+#include <map>
+#include <string>
+
+namespace activemq{
+namespace transport{
+
+ /**
+ * The TransportFactoryMap contains keys that map to specific versions
+ * of the TransportFactory class which create a particular type of
+ * Transport.
+ */
+ class TransportFactoryMap{
+
+ private:
+
+ // Map of Factories
+ std::map<std::string, TransportFactory*> factoryMap;
+
+ private:
+
+ // Hidden Contrustor, prevents instantiation
+ TransportFactoryMap() {};
+
+ // Hidden Destructor.
+ virtual ~TransportFactoryMap() {};
+
+ // Hidden Copy Constructore
+ TransportFactoryMap(const TransportFactoryMap& factoryMap){};
+
+ // Hidden Assignment operator
+ TransportFactoryMap& operator=(const TransportFactoryMap& factoryMap){
+ return *this;
+ }
+
+ public:
+
+ /**
+ * Gets a singleton instance of this class.
+ */
+ static TransportFactoryMap& getInstance(void);
+
+ /**
+ * Registers a new Transport Factory with this map
+ * @param name to associate the factory with
+ * @param factory to store.
+ */
+ void registerTransportFactory( const std::string& name,
+ TransportFactory* factory );
+
+ /**
+ * Unregisters a Transport Factory with this map
+ * @param name of the factory to remove
+ */
+ void unregisterTransportFactory( const std::string& name );
+
+ /**
+ * Lookup the named factory in the Map
+ * @param the factory name to lookup
+ * @return the factory assciated with the name, or NULL
+ */
+ TransportFactory* lookup( const std::string& name );
+
+ /**
+ * Fetch a list of factory names that this Map contains
+ * @param vector object to receive the list
+ * @returns count of factories.
+ */
+ std::size_t getFactoryNames(std::vector<std::string>& factoryList);
+
+ };
+
+}}
+
+#endif /*ACTIVEMQ_TRANSPORT_TRANSPORTFACTORYMAP_H_*/
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportFactoryMapRegistrar.h
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportFactoryMapRegistrar.h?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportFactoryMapRegistrar.h (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportFactoryMapRegistrar.h Mon Jul 3 04:51:36 2006
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed 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_TRANSPORT_TRANSPORTFACTORYMAPREGISTRAR_H_
+#define ACTIVEMQ_TRANSPORT_TRANSPORTFACTORYMAPREGISTRAR_H_
+
+#include <activemq/transport/TransportFactoryMap.h>
+
+namespace activemq{
+namespace transport{
+
+ /**
+ * Registers the passed in factory into the factory map, this class
+ * can manage the lifetime of the registered factory (default behaviour).
+ */
+ class TransportFactoryMapRegistrar
+ {
+ public:
+
+ /**
+ * Constructor for this class
+ * @param name of the factory to register
+ * @param the factory
+ * @param boolean indicating if this object manages the lifetime of
+ * the factory that is being registered.
+ */
+ TransportFactoryMapRegistrar(const std::string& name,
+ TransportFactory* factory,
+ bool manageLifetime = true)
+ {
+ // Register it in the map.
+ TransportFactoryMap::getInstance().
+ registerTransportFactory(name, factory);
+
+ // Store for later deletion
+ this->factory = factory;
+ this->manageLifetime = manageLifetime;
+ this->name = name;
+ }
+
+ virtual ~TransportFactoryMapRegistrar(void)
+ {
+ try
+ {
+ // UnRegister it in the map.
+ TransportFactoryMap::getInstance().
+ unregisterTransportFactory(name);
+
+ if(manageLifetime)
+ {
+ delete factory;
+ }
+ }
+ catch(...) {}
+ }
+
+ /**
+ * Return a reference to the factory object that is contained in this
+ * registrar.
+ * @return TransportFactory reference
+ */
+ virtual TransportFactory& getFactory(void) {
+ return *factory;
+ }
+
+ private:
+
+ std::string name;
+ TransportFactory* factory;
+ bool manageLifetime;
+
+ };
+
+}}
+
+#endif /*ACTIVEMQ_TRANSPORT_TRANSPORTFACTORYMAPREGISTRAR_H_*/
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportFilter.h
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportFilter.h?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportFilter.h (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/transport/TransportFilter.h Mon Jul 3 04:51:36 2006
@@ -0,0 +1,230 @@
+/*
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed 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_TRANSPORT_TRANSPORTFILTER_H_
+#define ACTIVEMQ_TRANSPORT_TRANSPORTFILTER_H_
+
+#include <activemq/transport/Transport.h>
+#include <activemq/transport/CommandListener.h>
+#include <activemq/transport/Command.h>
+#include <activemq/transport/TransportExceptionListener.h>
+
+namespace activemq{
+namespace transport{
+
+ /**
+ * A filter on the transport layer. Transport
+ * filters implement the Transport interface and
+ * optionally delegate calls to another Transport object.
+ */
+ class TransportFilter
+ :
+ public Transport,
+ public CommandListener,
+ public TransportExceptionListener
+ {
+ protected:
+
+ /**
+ * The transport that this filter wraps around.
+ */
+ Transport* next;
+
+ /**
+ * Flag to indicate whether this object controls
+ * the lifetime of the next transport object.
+ */
+ bool own;
+
+ /**
+ * Listener to incoming commands.
+ */
+ CommandListener* commandlistener;
+
+ /**
+ * Listener of exceptions from this transport.
+ */
+ TransportExceptionListener* exceptionListener;
+
+ protected:
+
+ /**
+ * Notify the excpetion listener
+ */
+ void fire( const exceptions::ActiveMQException& ex ){
+
+ if( exceptionListener != NULL ){
+
+ try{
+ exceptionListener->onTransportException( this, ex );
+ }catch( ... ){}
+ }
+ }
+
+ /**
+ * Notify the command listener.
+ */
+ void fire( Command* command ){
+
+ try{
+ if( commandlistener != NULL ){
+ commandlistener->onCommand( command );
+ }
+ }catch( ... ){}
+ }
+
+ public:
+
+ /**
+ * Constructor.
+ */
+ TransportFilter( Transport* next, const bool own = true ){
+
+ this->next = next;
+ this->own = own;
+
+ commandlistener = NULL;
+ exceptionListener = NULL;
+
+ // Observe the nested transport for events.
+ next->setCommandListener( this );
+ next->setTransportExceptionListener( this );
+ }
+
+ /**
+ * Destructor - calls close().
+ */
+ virtual ~TransportFilter(){
+
+ if( own ){
+ delete next;
+ next = NULL;
+ }
+
+ }
+
+ /**
+ * Event handler for the receipt of a command.
+ * @param command the received command object.
+ */
+ virtual void onCommand( Command* command ){
+ fire( command );
+ }
+
+ /**
+ * Event handler for an exception from a command transport.
+ * @param source The source of the exception
+ * @param ex The exception.
+ */
+ virtual void onTransportException( Transport* source, const exceptions::ActiveMQException& ex ){
+ fire( ex );
+ }
+
+ /**
+ * Sends a one-way command. Does not wait for any response from the
+ * broker.
+ * @param command the command to be sent.
+ * @throws CommandIOException if an exception occurs during writing of
+ * the command.
+ * @throws UnsupportedOperationException if this method is not implemented
+ * by this transport.
+ */
+ virtual void oneway( Command* command ) throw(CommandIOException, exceptions::UnsupportedOperationException){
+ next->oneway( command );
+ }
+
+ /**
+ * Not supported by this class - throws an exception.
+ * @throws UnsupportedOperationException.
+ */
+ virtual Response* request( Command* command ) throw(CommandIOException, exceptions::UnsupportedOperationException){
+ return next->request( command );
+ }
+
+ /**
+ * Assigns the command listener for non-response commands.
+ * @param listener the listener.
+ */
+ virtual void setCommandListener( CommandListener* listener ){
+ this->commandlistener = listener;
+ }
+
+ /**
+ * Sets the command reader.
+ * @param reader the object that will be used for reading command objects.
+ */
+ virtual void setCommandReader( CommandReader* reader ){
+ next->setCommandReader( reader );
+ }
+
+ /**
+ * Sets the command writer.
+ * @param writer the object that will be used for writing command objects.
+ */
+ virtual void setCommandWriter( CommandWriter* writer ){
+ next->setCommandWriter( writer );
+ }
+
+ /**
+ * Sets the observer of asynchronous exceptions from this transport.
+ * @param listener the listener of transport exceptions.
+ */
+ virtual void setTransportExceptionListener( TransportExceptionListener* listener ){
+ this->exceptionListener = listener;
+ }
+
+ /**
+ * Starts this transport object and creates the thread for
+ * polling on the input stream for commands. If this object
+ * has been closed, throws an exception. Before calling start,
+ * the caller must set the IO streams and the reader and writer
+ * objects.
+ * @throws CMSException if an error occurs or if this transport
+ * has already been closed.
+ */
+ virtual void start() throw( cms::CMSException ){
+
+ if( commandlistener == NULL ){
+ throw exceptions::ActiveMQException( __FILE__, __LINE__,
+ "commandListener is invalid" );
+ }
+
+ if( exceptionListener == NULL ){
+ throw exceptions::ActiveMQException( __FILE__, __LINE__,
+ "exceptionListener is invalid" );
+ }
+
+ // Start the delegate transport object.
+ next->start();
+ }
+
+ /**
+ * Stops the polling thread and closes the streams. This can
+ * be called explicitly, but is also called in the destructor. Once
+ * this object has been closed, it cannot be restarted.
+ * @throws CMSException if errors occur.
+ */
+ virtual void close() throw( cms::CMSException ){
+
+ next->close();
+ }
+
+ };
+
+}}
+
+#endif /*ACTIVEMQ_TRANSPORT_TRANSPORTFILTER_H_*/
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Boolean.h
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Boolean.h?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Boolean.h (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Boolean.h Mon Jul 3 04:51:36 2006
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed 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_UTIL_BOOLEAN_H_
+#define _ACTIVEMQ_UTIL_BOOLEAN_H_
+
+#include <activemq/util/Number.h>
+
+namespace activemq{
+namespace util{
+
+ class Boolean : Number
+ {
+ public:
+
+ Boolean(void) {}
+ virtual ~Boolean(void) {}
+
+ /**
+ * Parses the String passed and extracts an bool.
+ * @param String to parse
+ * @return bool value
+ */
+ static int parseBoolean(const std::string& value){
+ bool ret = 0;
+ std::istringstream istream(value);
+ istream.clear();
+ istream >> std::boolalpha >> ret;
+ return ret;
+ }
+
+ /**
+ * Converts the bool to a String representation
+ * @param bool to convert
+ * @return string representation
+ */
+ static std::string toString(bool value){
+ std::ostringstream ostream;
+ ostream << std::boolalpha << value;
+ return ostream.str();
+ }
+
+ };
+
+}}
+
+#endif /*BOOLEAN_H_*/
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Endian.h
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Endian.h?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Endian.h (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Endian.h Mon Jul 3 04:51:36 2006
@@ -0,0 +1,199 @@
+/*
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed 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_UTIL_ENDIAN_H
+#define ACTIVEMQ_UTIL_ENDIAN_H
+
+#ifdef unix
+#include <netinet/in.h>
+#else
+#include <Winsock2.h>
+#endif
+
+// First try - check __BYTE_ORDER macro
+#if !defined IFR_IS_BIG_ENDIAN && !defined IFR_IS_LITTLE_ENDIAN && !defined IFR_IS_DPD_ENDIAN
+# ifdef unix
+# include <sys/param.h> // defines __BYTE_ORDER (or sometimes __LITTLE_ENDIAN or __BIG_ENDIAN or __PDP_ENDIAN)
+# endif
+# if defined (__GLIBC__)
+# include <endian.h> // Can also define __BYTE_ORDER
+# endif
+# ifdef __BYTE_ORDER
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+# define IFR_IS_LITTLE_ENDIAN
+# elif __BYTE_ORDER == __BIG_ENDIAN
+# define IFR_IS_BIG_ENDIAN
+# elif __BYTE_ORDER == __PDP_ENDIAN
+# define IFR_IS_PDP_ENDIAN
+# endif
+# endif
+#endif
+
+// Second try - check __LITTLE_ENDIAN or __BIG_ENDIAN
+#if !defined IFR_IS_BIG_ENDIAN && !defined IFR_IS_LITTLE_ENDIAN && !defined IFR_IS_DPD_ENDIAN
+# if defined __LITTLE_ENDIAN
+# define IFR_IS_LITTLE_ENDIAN
+# elif defined __BIG_ENDIAN
+# define IFR_IS_BIG_ENDIAN
+# elif defined __PDP_ENDIAN
+# define IFR_IS_PDP_ENDIAN
+# endif
+#endif
+
+// Last try - find out from well-known processor types using little endian
+#if !defined IFR_IS_BIG_ENDIAN && !defined IFR_IS_LITTLE_ENDIAN && !defined IFR_IS_DPD_ENDIAN
+# if defined (i386) || defined (__i386__) \
+ || defined (_M_IX86) || defined (vax) \
+ || defined (__alpha) || defined (__alpha__) \
+ || defined (__x86_64__) || defined (__ia64) \
+ || defined (__ia64__) || defined (__amd64__) \
+ || defined (_M_IX86) || defined (_M_IA64) \
+ || defined (_M_ALPHA)
+# define IFR_IS_LITTLE_ENDIAN
+# else
+# if defined (__sparc) || defined(__sparc__) \
+ || defined(_POWER) || defined(__powerpc__) \
+ || defined(__ppc__) || defined(__hppa) \
+ || defined(_MIPSEB) || defined(_POWER) \
+ || defined(__s390__)
+# define IFR_IS_BIG_ENDIAN
+# endif
+# endif
+#endif
+
+// Show error if we still don't know endianess
+#if !defined IFR_IS_BIG_ENDIAN && !defined IFR_IS_LITTLE_ENDIAN && !defined IFR_IS_DPD_ENDIAN
+#error "Could not determine endianess of your processor type"
+#endif
+
+// Use these if the compiler does not support _intXX
+#ifdef NEEDS_INT_DEFINED
+#define _int16 short
+#define _int32 int
+#define _int64 long long
+#endif
+
+// Check for uintXX types
+#ifndef uint8_t
+#define uint8_t unsigned char
+#endif
+#ifndef uint16_t
+#define uint16_t unsigned short
+#endif
+#ifndef uint32_t
+#define uint32_t unsigned int
+#endif
+#ifndef uint64_t
+#define uint64_t unsigned long long
+#endif
+
+// Macros and helpers for endian conversion
+namespace activemq{
+namespace util{
+
+/*#ifdef IFR_IS_BIGENDIAN
+inline unsigned int htoni (unsigned int i) { return i; }
+inline unsigned long long htonll (unsigned long long ll) { return ll; }
+inline float htonf (float f) { return f; }
+inline double htond (double d) { return d; }
+inline unsigned int ntohi (unsigned int i) { return i; }
+inline unsigned long long ntohll (unsigned long long ll) { return ll; }
+inline float ntohf (float f) { return f; }
+inline double ntohd (double d) { return d; }
+#else // !IFR_IS_BIGENDIAN
+
+inline unsigned int htoni (unsigned int i) {
+ return ( i << 8 ) & 0xFF00 |
+ ( i >> 8 ) & 0x00FF;
+}
+inline unsigned long long htonll (unsigned long long ll) {
+ return
+ ( ll << 56 ) & 0xFF00000000000000ULL |
+ ( ll << 40 ) & 0x00FF000000000000ULL |
+ ( ll << 24 ) & 0x0000FF0000000000ULL |
+ ( ll << 8 ) & 0x000000FF00000000ULL |
+ ( ll >> 8 ) & 0x00000000FF000000ULL |
+ ( ll >> 24 ) & 0x0000000000FF0000ULL |
+ ( ll >> 40 ) & 0x000000000000FF00ULL |
+ ( ll >> 56 ) & 0x00000000000000FFULL;
+}
+
+
+inline float htonf (float f) {
+ unsigned int i = htonl( *(unsigned int *)&f ) ;
+ return *(float *)&i ;
+}
+inline double htond (double d) {
+ unsigned long long ll = htonll( *(unsigned long long *)&d ) ;
+ return *(double *)&ll ;
+}
+inline unsigned int ntohi (unsigned int i) { return htoni (i); }
+inline unsigned long long ntohll (unsigned long long ll) { return htonll (ll); }
+inline float ntohf (float f) { return htonf (f); }
+inline double ntohd (double d) { return htond (d); }
+*/
+ class Endian{
+ public:
+
+ static void byteSwap(unsigned char* data, int dataLength) {
+
+ #ifdef IFR_IS_BIGENDIAN
+ return;
+ #endif
+
+ for (int i = 0; i<dataLength/2; i++) {
+ unsigned char temp = data[i];
+ data[i] = data[dataLength-1-i];
+ data[dataLength-1-i] = temp;
+ }
+ }
+
+ static uint8_t byteSwap( uint8_t value ){
+ byteSwap( (unsigned char*)&value, sizeof( value ) );
+ return value;
+ }
+
+ static uint16_t byteSwap( uint16_t value ){
+ byteSwap( (unsigned char*)&value, sizeof( value ) );
+ return value;
+ }
+
+ static uint32_t byteSwap( uint32_t value ){
+ byteSwap( (unsigned char*)&value, sizeof( value ) );
+ return value;
+ }
+
+ static uint64_t byteSwap( uint64_t value ){
+ byteSwap( (unsigned char*)&value, sizeof( value ) );
+ return value;
+ }
+
+ static float byteSwap( float value ){
+ byteSwap( (unsigned char*)&value, sizeof( value ) );
+ return value;
+ }
+
+ static double byteSwap( double value ){
+ byteSwap( (unsigned char*)&value, sizeof( value ) );
+ return value;
+ }
+ };
+
+//#endif // IFR_IS_BIGENDIAN
+
+}}
+
+#endif /*ACTIVEMQ_UTIL_ENDIAN_H*/
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Guid.cpp
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Guid.cpp?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Guid.cpp (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Guid.cpp Mon Jul 3 04:51:36 2006
@@ -0,0 +1,405 @@
+/*
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed 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 "Guid.h"
+#include <stdexcept>
+
+using namespace activemq::util;
+using namespace activemq::exceptions;
+using namespace std;
+
+////////////////////////////////////////////////////////////////////////////////
+Guid::Guid(void)
+{
+ // Clear internal uuid, would pass isNull
+ #if defined( unix ) && !defined( __CYGWIN__ )
+ memset(&uuid, 0, sizeof(uuid_t));
+ #else
+ ::UuidCreateNil(&uuid);
+ #endif
+}
+
+////////////////////////////////////////////////////////////////////////////////
+Guid::Guid(const Guid& source)
+{
+ // Set this uuid to that of the source
+ *this = source;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+Guid::Guid(const std::string& source)
+ throw ( IllegalArgumentException )
+{
+ if(source == "")
+ {
+ throw IllegalArgumentException(
+ __FILE__, __LINE__,
+ "GUID::fromBytes - Source was Empty");
+ }
+
+ // Set this uuid to that of the source
+ *this = source;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+Guid::~Guid(void)
+{
+}
+
+////////////////////////////////////////////////////////////////////////////////
+bool Guid::isNull(void) const
+{
+ #if defined( unix ) && !defined( __CYGWIN__ )
+ // Check the uuid APIs is null method
+ return uuid_is_null(*(const_cast<uuid_t*>(&uuid))) == 1 ? true : false;
+ #else
+ RPC_STATUS status;
+
+ BOOL result = ::UuidIsNil( const_cast<GUID*>( &uuid ), &status );
+
+ return (result == TRUE) ? true : false;
+ #endif
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void Guid::setNull(void)
+{
+ #if defined( unix ) && !defined( __CYGWIN__ )
+ // use the uuid function to clear
+ uuid_clear(uuid);
+ #else
+ ::UuidCreateNil(&uuid);
+ #endif
+}
+
+////////////////////////////////////////////////////////////////////////////////
+Guid& Guid::createGUID(void) throw( RuntimeException )
+{
+ #if defined( unix ) && !defined( __CYGWIN__ )
+ // Use the uuid_generate method to create a new GUID
+ uuid_generate(uuid);
+ #else
+ // Create a uuid with the Co Create GUID
+ RPC_STATUS lhResult = ::UuidCreate( &uuid );
+
+ if ( lhResult == RPC_S_UUID_NO_ADDRESS )
+ {
+ throw RuntimeException(
+ __FILE__, __LINE__,
+ "GUIG::createGUID - Failed Creating GUID");
+ }
+ #endif
+
+ return *this;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+std::string Guid::toString(void) const throw( RuntimeException )
+{
+ std::string uuid_str = "";
+
+ #if defined( unix ) && !defined( __CYGWIN__ )
+ // Create storage for the string buffer
+ char buffer[36] = {0};
+
+ // parse the uuid to the string
+ uuid_unparse(*(const_cast<uuid_t*>(&uuid)), buffer);
+
+ // Store it in a string
+ uuid_str = buffer;
+ #else
+ // Convert the GUID object to a string.
+ unsigned char* guidStr = 0;
+
+ RPC_STATUS result = ::UuidToString(
+ const_cast<GUID*>(&uuid),
+ &guidStr);
+
+ if(result == RPC_S_OUT_OF_MEMORY)
+ {
+ throw RuntimeException(
+ __FILE__, __LINE__,
+ "GUIG::createGUID - Failed Creating GUID");
+ }
+
+ uuid_str = (char*)guidStr;
+
+ // Dispose of the GUID string.
+ ::RpcStringFree(&guidStr);
+ #endif
+
+ return uuid_str;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+Guid::operator std::string() const
+{
+ return toString();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+const unsigned char* Guid::toBytes(void) const
+{
+ unsigned char* buffer = new unsigned char[getRawBytesSize()];
+
+ // copy our buffer
+ #if defined( unix ) && !defined( __CYGWIN__ )
+ uuid_copy(buffer, *(const_cast<uuid_t*>(&uuid)));
+ #else
+ memcpy(buffer, &uuid, getRawBytesSize());
+ #endif
+
+ return &buffer[0];
+}
+
+////////////////////////////////////////////////////////////////////////////////
+Guid& Guid::fromBytes(const unsigned char* bytes)
+ throw ( IllegalArgumentException )
+{
+ if(bytes == NULL)
+ {
+ throw IllegalArgumentException(
+ __FILE__, __LINE__,
+ "GUID::fromBytes - bytes pointer was NULL");
+ }
+
+ // Copy the data
+ #if defined( unix ) && !defined( __CYGWIN__ )
+ memcpy(uuid, bytes, getRawBytesSize());
+ #else
+ memcpy(&uuid, bytes, getRawBytesSize());
+ #endif
+
+ return *this;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+int Guid::getRawBytesSize(void) const
+{
+ #if defined( unix ) && !defined( __CYGWIN__ )
+ return sizeof(uuid_t);
+ #else
+ return sizeof(::GUID);
+ #endif
+}
+
+////////////////////////////////////////////////////////////////////////////////
+Guid::operator const unsigned char*() const
+{
+ #if defined( unix ) && !defined( __CYGWIN__ )
+ return &uuid[0];
+ #else
+ return reinterpret_cast<const unsigned char*>(&uuid);
+ #endif
+}
+
+////////////////////////////////////////////////////////////////////////////////
+Guid& Guid::operator=(const Guid& source)
+ throw ( IllegalArgumentException )
+{
+ #if defined( unix ) && !defined( __CYGWIN__ )
+ // Use the uuid method to copy
+ uuid_copy(uuid, *(const_cast<uuid_t*>(&source.uuid)));
+ #else
+ // Use mem copy
+ memcpy(&uuid, &source.uuid, getRawBytesSize());
+ #endif
+
+ return *this;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+Guid& Guid::operator=(const std::string& source)
+ throw ( IllegalArgumentException )
+{
+ #if defined( unix ) && !defined( __CYGWIN__ )
+ // Parse a uuid from the passed in string
+ uuid_parse( const_cast<char*>(source.c_str()), uuid );
+ #else
+ if ( source.empty() )
+ {
+ ::UuidCreateNil( &uuid );
+ }
+ else
+ {
+ RPC_STATUS hResult =
+ ::UuidFromString( (unsigned char*)source.c_str(), &uuid );
+
+ if ( hResult == RPC_S_INVALID_STRING_UUID )
+ {
+ throw IllegalArgumentException(
+ __FILE__, __LINE__,
+ "GUID::fromBytes - Invalid GUID String");
+ }
+ }
+ #endif
+
+ return *this;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+bool Guid::operator==(const Guid& source) const
+{
+ #if defined( unix ) && !defined( __CYGWIN__ )
+ // uuid_compare returns 0 for equal
+ return uuid_compare(
+ *(const_cast<uuid_t*>(&uuid)),
+ *(const_cast<uuid_t*>(&source.uuid))) == 0 ? true : false;
+ #else
+ RPC_STATUS status;
+
+ BOOL result = ::UuidEqual(
+ const_cast<GUID*>( &uuid ),
+ const_cast<GUID*>( &source.uuid ),
+ &status );
+
+ return ( result == TRUE ) ? true : false;
+ #endif
+}
+
+////////////////////////////////////////////////////////////////////////////////
+bool Guid::operator==(const std::string& source) const
+{
+ return *this == Guid(source);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+bool Guid::operator!=(const Guid& source) const
+{
+ return !(*this == source);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+bool Guid::operator!=(const std::string& source) const
+{
+ return !(*this == source);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+bool Guid::operator<(const Guid& source) const
+{
+ #if defined( unix ) && !defined( __CYGWIN__ )
+ // uuid_compare returns 0 for equal
+ return uuid_compare(
+ *(const_cast<uuid_t*>(&uuid)),
+ *(const_cast<uuid_t*>(&source.uuid))) < 0 ? true : false;
+ #else
+ RPC_STATUS status;
+
+ int result = ::UuidCompare(
+ const_cast<GUID*>( &uuid ),
+ const_cast<GUID*>( &source.uuid ),
+ &status );
+
+ return ( result < 0 ) ? true : false;
+ #endif
+}
+
+////////////////////////////////////////////////////////////////////////////////
+bool Guid::operator<(const std::string& source) const
+{
+ return *this < Guid(source);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+bool Guid::operator<=(const Guid& source) const
+{
+ #if defined( unix ) && !defined( __CYGWIN__ )
+ // uuid_compare returns 0 for equal
+ return uuid_compare(
+ *(const_cast<uuid_t*>(&uuid)),
+ *(const_cast<uuid_t*>(&source.uuid))) <= 0 ? true : false;
+ #else
+ RPC_STATUS status;
+
+ int result = ::UuidCompare(
+ const_cast<GUID*>( &uuid ),
+ const_cast<GUID*>( &source.uuid ),
+ &status );
+
+ return ( result <= 0 ) ? true : false;
+ #endif
+}
+
+////////////////////////////////////////////////////////////////////////////////
+bool Guid::operator<=(const std::string& source) const
+{
+ return *this <= Guid(source);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+bool Guid::operator>(const Guid& source) const
+{
+ #if defined( unix ) && !defined( __CYGWIN__ )
+ // uuid_compare returns 0 for equal
+ return uuid_compare(
+ *(const_cast<uuid_t*>(&uuid)),
+ *(const_cast<uuid_t*>(&source.uuid))) > 0 ? true : false;
+ #else
+ RPC_STATUS status;
+
+ int result = ::UuidCompare(
+ const_cast<GUID*>( &uuid ),
+ const_cast<GUID*>( &source.uuid ),
+ &status );
+
+ return ( result > 0 ) ? true : false;
+ #endif
+}
+
+////////////////////////////////////////////////////////////////////////////////
+bool Guid::operator>(const std::string& source) const
+{
+ return *this > Guid(source);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+bool Guid::operator>=(const Guid& source) const
+{
+ #if defined( unix ) && !defined( __CYGWIN__ )
+ // uuid_compare returns 0 for equal
+ return uuid_compare(
+ *(const_cast<uuid_t*>(&uuid)),
+ *(const_cast<uuid_t*>(&source.uuid))) >= 0 ? true : false;
+ #else
+ RPC_STATUS status;
+
+ int result = ::UuidCompare(
+ const_cast<GUID*>(&uuid),
+ const_cast<GUID*>(&source.uuid),
+ &status);
+
+ return (result >= 0) ? true : false;
+ #endif
+}
+
+////////////////////////////////////////////////////////////////////////////////
+bool Guid::operator>=(const std::string& source) const
+{
+ return *this >= Guid(source);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+std::string Guid::createGUIDString(void)
+{
+ return Guid().createGUID().toString();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+const unsigned char* createGUIDBytes(void)
+{
+ return Guid().createGUID().toBytes();
+}
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Guid.h
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Guid.h?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Guid.h (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Guid.h Mon Jul 3 04:51:36 2006
@@ -0,0 +1,200 @@
+/*
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed 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_UTIL_GUID_H
+#define ACTIVEMQ_UTIL_GUID_H
+
+#if defined( unix ) && !defined( __CYGWIN__ )
+ #include <uuid/uuid.h>
+#elif defined(_WIN32) || defined( __CYGWIN__ )
+ #include <objbase.h>
+ #include <rpcdce.h>
+#else // defined MACOSX
+ #include "uuid.h"
+#endif
+
+#include <activemq/exceptions/RuntimeException.h>
+#include <activemq/exceptions/IllegalArgumentException.h>
+
+#include <string>
+
+namespace activemq{
+namespace util{
+
+ class Guid
+ {
+ public:
+
+ /**
+ * Constructor
+ */
+ Guid(void);
+
+ /**
+ * Copy Constructor
+ */
+ Guid(const Guid& source);
+
+ /**
+ * Constructor - Create a GUID from a String
+ */
+ Guid(const std::string& source)
+ throw ( exceptions::IllegalArgumentException );
+
+ /**
+ * Destructor
+ */
+ virtual ~Guid(void);
+
+ /**
+ * Determines if this GUID is null, if so it can be initialized with a
+ * call to <code>createGUID</code>.
+ * @return true for Null GUID, false otherwise.
+ */
+ bool isNull(void) const;
+
+ /**
+ * Clears the GUID's current value and sets it to a NULL GUID value
+ * will now pass <code>isNull</code>.
+ */
+ void setNull(void);
+
+ /**
+ * Generate a new GUID which will overwrite any current GUID value
+ * @return Reference to this object that now has a new GUID
+ */
+ Guid& createGUID(void) throw( exceptions::RuntimeException );
+
+ /**
+ * Converts the GUID to a string and returns that string
+ * @return a string with this GUID's stringified value
+ */
+ std::string toString(void) const throw( exceptions::RuntimeException );
+
+ /**
+ * Converts the GUID to a byte array and return a pointer to the
+ * new array, called takes ownership and must delete this array
+ * when done.
+ * @return a byte array with the GUID byte value, size = 16
+ */
+ const unsigned char* toBytes(void) const;
+
+ /**
+ * Initializes this GUID with the GUID specified in the bytes parameter
+ * @return reference to this object.
+ */
+ Guid& fromBytes(const unsigned char* bytes)
+ throw ( exceptions::IllegalArgumentException );
+
+ /**
+ * Returns the Size in Bytes of the Raw bytes representation of the
+ * GUID.
+ * @return size of the Raw bytes representation
+ */
+ int getRawBytesSize(void) const;
+
+ /**
+ * string type cast operator
+ * @returns string representation of this GUID
+ */
+ operator std::string() const;
+
+ /**
+ * byte array cast operator, caller does not own this memeory
+ * @returns byte array with the GUID byte value representation
+ */
+ operator const unsigned char*() const;
+
+ /**
+ * Assignment operators
+ * @return Reference to this GUID object
+ */
+ Guid& operator=(const Guid& source)
+ throw ( exceptions::IllegalArgumentException );
+ Guid& operator=(const std::string& source)
+ throw ( exceptions::IllegalArgumentException );
+
+ /**
+ * Equality Comparison Operators
+ * @return true for equal. false otherwise
+ */
+ bool operator==(const Guid& source) const;
+ bool operator==(const std::string& source) const;
+
+ /**
+ * Inequality Comparison Operators
+ * @return true for equal. false otherwise
+ */
+ bool operator!=(const Guid& source) const;
+ bool operator!=(const std::string& source) const;
+
+ /**
+ * Less than operators
+ * @return true for equal. false otherwise
+ */
+ bool operator<(const Guid& source) const;
+ bool operator<(const std::string& source) const;
+
+ /**
+ * Less than or equal to operators
+ * @return true for equal. false otherwise
+ */
+ bool operator<=(const Guid& source) const;
+ bool operator<=(const std::string& source) const;
+
+ /**
+ * Greater than operators
+ * @return true for equal. false otherwise
+ */
+ bool operator>(const Guid& source) const;
+ bool operator>(const std::string& source) const;
+
+ /**
+ * Greater than or equal to operators
+ * @return true for equal. false otherwise
+ */
+ bool operator>=(const Guid& source) const;
+ bool operator>=(const std::string& source) const;
+
+ public:
+
+ /**
+ * Static Guid Creation Method, creates a GUID and returns it as a string
+ * @return Guid string.
+ */
+ static std::string createGUIDString(void);
+
+ /**
+ * Static Guid Create Method, create a GUID and returns the byte representation
+ * of the new GUID.
+ * @return Guid bytes array, size is 16
+ */
+ static const unsigned char* createGUIDBytes(void);
+
+ private:
+
+ // the uuid that this object represents.
+ #ifdef unix
+ uuid_t uuid;
+ #else
+ ::GUID uuid;
+ #endif
+
+ };
+
+}}
+
+#endif /*ACTIVEMQ_UTIL_GUID_H*/
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Integer.h
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Integer.h?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Integer.h (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Integer.h Mon Jul 3 04:51:36 2006
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed 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_UTIL_INTEGER_H_
+#define _ACTIVEMQ_UTIL_INTEGER_H_
+
+#include <activemq/util/Number.h>
+
+namespace activemq{
+namespace util{
+
+ class Integer : public Number
+ {
+ public:
+
+ Integer(void) {}
+ virtual ~Integer(void) {}
+
+ /**
+ * Parses the String passed and extracts an int.
+ * @param String to parse
+ * @return int value
+ */
+ static int parseInt(const std::string& value){
+ int ret = 0;
+ std::istringstream istream(value);
+ istream.clear();
+ istream >> ret;
+ return ret;
+ }
+
+ /**
+ * Converts the int to a String representation
+ * @param int to convert
+ * @return string representation
+ */
+ static std::string toString(int value){
+ std::ostringstream ostream;
+ ostream << value;
+ return ostream.str();
+ }
+
+ };
+
+}}
+
+#endif /*_ACTIVEMQ_UTIL_INTEGER_H_*/
Added: incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Long.h
URL: http://svn.apache.org/viewvc/incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Long.h?rev=418749&view=auto
==============================================================================
--- incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Long.h (added)
+++ incubator/activemq/trunk/activemq-cpp/src/main/activemq/util/Long.h Mon Jul 3 04:51:36 2006
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2006 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed 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_UTIL_LONG_H_
+#define _ACTIVEMQ_UTIL_LONG_H_
+
+#include <activemq/util/Number.h>
+
+namespace activemq{
+namespace util{
+
+ class Long : public Number
+ {
+ public:
+
+ Long(void) {}
+ virtual ~Long(void) {}
+
+ /**
+ * Parses the String passed and extracts an long.
+ * @param String to parse
+ * @return long value
+ */
+ static long parseLong(const std::string& value){
+ long ret = 0;
+ std::istringstream istream(value);
+ istream.clear();
+ istream >> ret;
+ return ret;
+ }
+
+ /**
+ * Converts the long to a String representation
+ * @param long to convert
+ * @return string representation
+ */
+ static std::string toString(long value){
+ std::ostringstream ostream;
+ ostream << value;
+ return ostream.str();
+ }
+ };
+
+}}
+
+#endif /*_ACTIVEMQ_UTIL_LONG_H_*/