You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ta...@apache.org on 2010/05/13 00:40:19 UTC
svn commit: r943731 - in /activemq/activemq-cpp/trunk/activemq-cpp/src/main:
./ decaf/internal/net/ decaf/internal/net/ssl/openssl/
decaf/internal/net/tcp/
Author: tabish
Date: Wed May 12 22:40:18 2010
New Revision: 943731
URL: http://svn.apache.org/viewvc?rev=943731&view=rev
Log:
https://issues.apache.org/activemq/browse/AMQCPP-140
Add a SocketFileDescriptor to allow the OpenSSLSocket class to connect the APR socket fd to a BIO structure. Implement the guts of OpenSSLSocket.
Added:
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/SocketFileDescriptor.cpp (with props)
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/SocketFileDescriptor.h (with props)
Modified:
activemq/activemq-cpp/trunk/activemq-cpp/src/main/Makefile.am
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/ssl/openssl/OpenSSLSocket.cpp
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/ssl/openssl/OpenSSLSocket.h
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/ssl/openssl/OpenSSLSocketFactory.cpp
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/ssl/openssl/OpenSSLSocketFactory.h
activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocket.cpp
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/Makefile.am
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/Makefile.am?rev=943731&r1=943730&r2=943731&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/Makefile.am (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/Makefile.am Wed May 12 22:40:18 2010
@@ -485,6 +485,7 @@ cc_sources = \
decaf/internal/io/StandardInputStream.cpp \
decaf/internal/io/StandardOutputStream.cpp \
decaf/internal/net/Network.cpp \
+ decaf/internal/net/SocketFileDescriptor.cpp \
decaf/internal/net/URIEncoderDecoder.cpp \
decaf/internal/net/URIHelper.cpp \
decaf/internal/net/ssl/DefaultSSLContext.cpp \
@@ -1164,6 +1165,7 @@ h_sources = \
decaf/internal/io/StandardInputStream.h \
decaf/internal/io/StandardOutputStream.h \
decaf/internal/net/Network.h \
+ decaf/internal/net/SocketFileDescriptor.h \
decaf/internal/net/URIEncoderDecoder.h \
decaf/internal/net/URIHelper.h \
decaf/internal/net/URIType.h \
Added: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/SocketFileDescriptor.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/SocketFileDescriptor.cpp?rev=943731&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/SocketFileDescriptor.cpp (added)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/SocketFileDescriptor.cpp Wed May 12 22:40:18 2010
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "SocketFileDescriptor.h"
+
+using namespace decaf;
+using namespace decaf::io;
+using namespace decaf::internal;
+using namespace decaf::internal::net;
+
+////////////////////////////////////////////////////////////////////////////////
+SocketFileDescriptor::SocketFileDescriptor( long value ) : FileDescriptor( value, false ) {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+SocketFileDescriptor::~SocketFileDescriptor() {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+long SocketFileDescriptor::getValue() const {
+ return this->descriptor;
+}
Propchange: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/SocketFileDescriptor.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/SocketFileDescriptor.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/SocketFileDescriptor.h?rev=943731&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/SocketFileDescriptor.h (added)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/SocketFileDescriptor.h Wed May 12 22:40:18 2010
@@ -0,0 +1,52 @@
+/*
+ * 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 _DECAF_INTERNAL_NET_SOCKETFILEDESCRIPTOR_H_
+#define _DECAF_INTERNAL_NET_SOCKETFILEDESCRIPTOR_H_
+
+#include <decaf/util/Config.h>
+
+#include <decaf/io/FileDescriptor.h>
+
+namespace decaf {
+namespace internal {
+namespace net {
+
+ /**
+ * File Descriptor type used internally by Decaf Socket objects.
+ *
+ * @since 1.0
+ */
+ class DECAF_API SocketFileDescriptor : public decaf::io::FileDescriptor {
+ public:
+
+ SocketFileDescriptor( long value );
+
+ virtual ~SocketFileDescriptor();
+
+ /**
+ * Gets the OS Level FileDescriptor
+ *
+ * @return a FileDescriptor value.
+ */
+ long getValue() const;
+
+ };
+
+}}}
+
+#endif /* _DECAF_INTERNAL_NET_SOCKETFILEDESCRIPTOR_H_ */
Propchange: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/SocketFileDescriptor.h
------------------------------------------------------------------------------
svn:eol-style = native
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/ssl/openssl/OpenSSLSocket.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/ssl/openssl/OpenSSLSocket.cpp?rev=943731&r1=943730&r2=943731&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/ssl/openssl/OpenSSLSocket.cpp (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/ssl/openssl/OpenSSLSocket.cpp Wed May 12 22:40:18 2010
@@ -19,13 +19,22 @@
#ifdef HAVE_OPENSSL
#include <openssl/ssl.h>
+ #include <openssl/x509.h>
+ #include <openssl/x509v3.h>
+ #include <openssl/bio.h>
#endif
+#include <apr_strings.h>
+
#include <decaf/net/SocketImpl.h>
#include <decaf/io/IOException.h>
+#include <decaf/net/SocketException.h>
#include <decaf/lang/exceptions/NullPointerException.h>
#include <decaf/lang/exceptions/IndexOutOfBoundsException.h>
+#include <decaf/internal/net/SocketFileDescriptor.h>
#include <decaf/internal/net/ssl/openssl/OpenSSLSocketException.h>
+#include <decaf/internal/net/ssl/openssl/OpenSSLSocketInputStream.h>
+#include <decaf/internal/net/ssl/openssl/OpenSSLSocketOutputStream.h>
using namespace decaf;
using namespace decaf::lang;
@@ -74,7 +83,8 @@ namespace openssl {
}}}}}
////////////////////////////////////////////////////////////////////////////////
-OpenSSLSocket::OpenSSLSocket( void* ssl ) : SSLSocket(), data( new SocketData() ) {
+OpenSSLSocket::OpenSSLSocket( void* ssl ) :
+ SSLSocket(), data( new SocketData() ), input( NULL ), output( NULL ) {
if( ssl == NULL ) {
throw NullPointerException(
@@ -100,12 +110,146 @@ OpenSSLSocket::~OpenSSLSocket() {
#endif
delete data;
+ delete input;
+ delete output;
}
DECAF_CATCH_NOTHROW( Exception )
DECAF_CATCHALL_NOTHROW()
}
////////////////////////////////////////////////////////////////////////////////
+void OpenSSLSocket::connect( const std::string& host, int port, int timeout )
+ throw( decaf::io::IOException,
+ decaf::lang::exceptions::IllegalArgumentException ) {
+
+ try{
+
+ SSLSocket::connect( host, port, timeout );
+ if( isConnected() ) {
+
+ BIO* bio = BIO_new( BIO_s_socket() );
+ if( !bio ) {
+ throw SocketException(
+ __FILE__, __LINE__, "Failed to create SSL IO Bindings");
+ }
+
+ const SocketFileDescriptor* fd =
+ dynamic_cast<const SocketFileDescriptor*>( this->impl->getFileDescriptor() );
+
+ if( fd == NULL ) {
+ throw SocketException(
+ __FILE__, __LINE__, "Invalid File Descriptor returned from Socket" );
+ }
+
+ BIO_set_fd( bio, (int)fd->getValue(), BIO_NOCLOSE );
+ SSL_set_bio( this->data->ssl, bio, bio );
+
+ int result = SSL_connect( this->data->ssl );
+
+ switch( SSL_get_error( this->data->ssl, result ) ) {
+ case SSL_ERROR_NONE:
+ verifyServerCert( host );
+ return;
+ case SSL_ERROR_SSL:
+ case SSL_ERROR_ZERO_RETURN:
+ case SSL_ERROR_SYSCALL:
+ SSLSocket::close();
+ throw OpenSSLSocketException( __FILE__, __LINE__ );
+ }
+ }
+ }
+ DECAF_CATCH_RETHROW( IOException )
+ DECAF_CATCH_RETHROW( IllegalArgumentException )
+ DECAF_CATCH_EXCEPTION_CONVERT( Exception, IOException )
+ DECAF_CATCHALL_THROW( IOException )
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void OpenSSLSocket::close() throw( decaf::io::IOException ) {
+
+ try{
+
+ if( isClosed() ) {
+ return;
+ }
+
+ SSLSocket::close();
+
+ if( this->input != NULL ) {
+ this->input->close();
+ }
+ if( this->output != NULL ) {
+ this->output->close();
+ }
+ }
+ DECAF_CATCH_RETHROW( IOException )
+ DECAF_CATCH_EXCEPTION_CONVERT( Exception, IOException )
+ DECAF_CATCHALL_THROW( IOException )
+}
+
+////////////////////////////////////////////////////////////////////////////////
+decaf::io::InputStream* OpenSSLSocket::getInputStream() throw( decaf::io::IOException ) {
+
+ checkClosed();
+
+ try{
+ if( this->input == NULL ) {
+ this->input = new OpenSSLSocketInputStream( this );
+ }
+
+ return this->input;
+ }
+ DECAF_CATCH_RETHROW( IOException )
+ DECAF_CATCH_EXCEPTION_CONVERT( Exception, IOException )
+ DECAF_CATCHALL_THROW( IOException )
+}
+
+////////////////////////////////////////////////////////////////////////////////
+decaf::io::OutputStream* OpenSSLSocket::getOutputStream() throw( decaf::io::IOException ) {
+
+ checkClosed();
+
+ try{
+ if( this->output == NULL ) {
+ this->output = new OpenSSLSocketOutputStream( this );
+ }
+
+ return this->output;
+ }
+ DECAF_CATCH_RETHROW( IOException )
+ DECAF_CATCH_EXCEPTION_CONVERT( Exception, IOException )
+ DECAF_CATCHALL_THROW( IOException )
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void OpenSSLSocket::shutdownInput() throw( decaf::io::IOException ) {
+
+ throw SocketException(
+ __FILE__, __LINE__, "Not supported for SSL Sockets" );
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void OpenSSLSocket::shutdownOutput() throw( decaf::io::IOException ) {
+
+ throw SocketException(
+ __FILE__, __LINE__, "Not supported for SSL Sockets" );
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void OpenSSLSocket::setOOBInline( bool value DECAF_UNUSED ) throw( SocketException ) {
+
+ throw SocketException(
+ __FILE__, __LINE__, "Not supported for SSL Sockets" );
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void OpenSSLSocket::sendUrgentData( int data DECAF_UNUSED ) throw( decaf::io::IOException ) {
+
+ throw SocketException(
+ __FILE__, __LINE__, "Not supported for SSL Sockets" );
+}
+
+////////////////////////////////////////////////////////////////////////////////
std::vector<std::string> OpenSSLSocket::getSupportedCipherSuites() const {
return std::vector<std::string>();
@@ -251,7 +395,7 @@ void OpenSSLSocket::write( const unsigne
__FILE__, __LINE__, "length parameter out of Bounds: %d.", length );
}
- std::size_t remaining = length;
+ int remaining = length;
while( remaining > 0 && !isClosed() ) {
@@ -291,3 +435,83 @@ int OpenSSLSocket::available() {
DECAF_CATCH_RETHROW( IOException )
DECAF_CATCHALL_THROW( IOException )
}
+
+////////////////////////////////////////////////////////////////////////////////
+void OpenSSLSocket::verifyServerCert( const std::string& serverName ) {
+
+ X509* cert = SSL_get_peer_certificate( this->data->ssl );
+
+ if( cert == NULL ) {
+ this->close();
+ throw OpenSSLSocketException(
+ __FILE__, __LINE__,
+ "No server certificate for verify for host: %s", serverName.c_str() );
+ }
+
+ class Finalizer {
+ private:
+
+ X509* cert;
+
+ public:
+
+ Finalizer( X509* cert ) : cert( cert ) {
+ }
+
+ ~Finalizer() {
+ if( cert != NULL ) {
+ X509_free( cert );
+ }
+ }
+ };
+
+ // We check the extensions first since newer x509v3 Certificates are recommended
+ // to store the FQDN in the dsnName field of the subjectAltName extension. If we
+ // don't find it there then we can check the commonName field which is where older
+ // Certificates placed the FQDN.
+ int extensions = X509_get_ext_count( cert );
+
+ for( int ix = 0; ix < extensions; ix++ ) {
+
+ X509_EXTENSION* extension = X509_get_ext( cert, ix );
+ const char* extensionName = OBJ_nid2sn( OBJ_obj2nid( X509_EXTENSION_get_object( extension ) ) );
+
+ if( apr_strnatcmp( "subjectAltName", extensionName ) == 0 ) {
+
+ const X509V3_EXT_METHOD* method = X509V3_EXT_get( extension );
+ if( method == NULL ) {
+ break;
+ }
+
+ const unsigned char* data = extension->value->data;
+ STACK_OF(CONF_VALUE)* confValue =
+ method->i2v( method, method->d2i( NULL, &data, extension->value->length ), NULL );
+
+ CONF_VALUE* value = NULL;
+
+ for( int iy = 0; iy < sk_CONF_VALUE_num( confValue ); iy++ ) {
+ value = sk_CONF_VALUE_value( confValue, iy );
+ if( ( apr_strnatcmp( value->name, "DNS" ) == 0 ) &&
+ apr_strnatcmp( value->value, serverName.c_str() ) == 0 ) {
+
+ // Found it.
+ return;
+ }
+ }
+ }
+ }
+
+ X509_NAME* subject = X509_get_subject_name( cert );
+ char buffer[256];
+
+ if( subject != NULL && X509_NAME_get_text_by_NID( subject, NID_commonName, buffer, 256 ) > 0 ) {
+ buffer[255] = 0;
+ if( apr_strnatcmp( buffer, serverName.c_str() ) == 0 ) {
+ return;
+ }
+ }
+
+ // We got here so no match to serverName in the Certificate
+ throw OpenSSLSocketException(
+ __FILE__, __LINE__, "Server Certificate Name doesn't match the URI Host Name value." );
+}
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/ssl/openssl/OpenSSLSocket.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/ssl/openssl/OpenSSLSocket.h?rev=943731&r1=943730&r2=943731&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/ssl/openssl/OpenSSLSocket.h (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/ssl/openssl/OpenSSLSocket.h Wed May 12 22:40:18 2010
@@ -22,6 +22,9 @@
#include <decaf/net/ssl/SSLSocket.h>
+#include <decaf/io/InputStream.h>
+#include <decaf/io/OutputStream.h>
+
namespace decaf {
namespace internal {
namespace net {
@@ -39,15 +42,66 @@ namespace openssl {
class DECAF_API OpenSSLSocket : public decaf::net::ssl::SSLSocket {
private:
+ // Private data related to the OpenSSL Socket impl.
SocketData* data;
+ // The InputStream owned by this Socket
+ decaf::io::InputStream* input;
+
+ // The OutputStream owned by this Socket
+ decaf::io::OutputStream* output;
+
public:
OpenSSLSocket( void* ssl );
virtual ~OpenSSLSocket();
- public:
+ public: // Socket Overrides.
+
+ /**
+ * {@inheritDoc}
+ */
+ virtual void connect( const std::string& host, int port, int timeout )
+ throw( decaf::io::IOException,
+ decaf::lang::exceptions::IllegalArgumentException );
+
+ /**
+ * {@inheritDoc}
+ */
+ virtual void close() throw( decaf::io::IOException );
+
+ /**
+ * {@inheritDoc}
+ */
+ virtual decaf::io::InputStream* getInputStream() throw( decaf::io::IOException );
+
+ /**
+ * {@inheritDoc}
+ */
+ virtual decaf::io::OutputStream* getOutputStream() throw( decaf::io::IOException );
+
+ /**
+ * {@inheritDoc}
+ */
+ virtual void shutdownInput() throw( decaf::io::IOException );
+
+ /**
+ * {@inheritDoc}
+ */
+ virtual void shutdownOutput() throw( decaf::io::IOException );
+
+ /**
+ * {@inheritDoc}
+ */
+ virtual void setOOBInline( bool value ) throw( decaf::net::SocketException );
+
+ /**
+ * {@inheritDoc}
+ */
+ virtual void sendUrgentData( int data ) throw( decaf::io::IOException );
+
+ public: // SSLSocket Overrides
/**
* {@inheritDoc}
@@ -148,6 +202,12 @@ namespace openssl {
*/
int available();
+ private:
+
+ // Perform some additional checks on the Server's Certificate to ensure that
+ // its really valid.
+ void verifyServerCert( const std::string& serverName );
+
};
}}}}}
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/ssl/openssl/OpenSSLSocketFactory.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/ssl/openssl/OpenSSLSocketFactory.cpp?rev=943731&r1=943730&r2=943731&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/ssl/openssl/OpenSSLSocketFactory.cpp (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/ssl/openssl/OpenSSLSocketFactory.cpp Wed May 12 22:40:18 2010
@@ -23,6 +23,8 @@
#include <decaf/internal/net/ssl/openssl/OpenSSLSocket.h>
#include <decaf/internal/net/ssl/openssl/OpenSSLContextSpi.h>
+#include <memory>
+
#ifdef HAVE_OPENSSL
#include <openssl/ssl.h>
#endif
@@ -32,6 +34,7 @@ using namespace decaf::lang;
using namespace decaf::lang::exceptions;
using namespace decaf::io;
using namespace decaf::net;
+using namespace decaf::net::ssl;
using namespace decaf::internal;
using namespace decaf::internal::net;
using namespace decaf::internal::net::ssl;
@@ -81,11 +84,24 @@ Socket* OpenSSLSocketFactory::createSock
}
////////////////////////////////////////////////////////////////////////////////
-Socket* OpenSSLSocketFactory::createSocket( const std::string& name, int port )
+Socket* OpenSSLSocketFactory::createSocket( const std::string& hostname, int port )
throw( decaf::io::IOException, decaf::net::UnknownHostException ) {
- return NULL;
-}
+ try{
+
+#ifdef HAVE_OPENSSL
+ // Create a new SSL object for the Socket then create a new unconnected Socket.
+ SSL_CTX* ctx = static_cast<SSL_CTX*>( this->parent->getOpenSSLCtx() );
+ std::auto_ptr<SSLSocket> socket( new OpenSSLSocket( SSL_new( ctx ) ) );
+ socket->connect( hostname, port );
+ return socket.release();
+#else
+ return NULL;
+#endif
+ }
+ DECAF_CATCH_RETHROW( IOException )
+ DECAF_CATCH_EXCEPTION_CONVERT( Exception, IOException )
+ DECAF_CATCHALL_THROW( IOException )}
////////////////////////////////////////////////////////////////////////////////
Socket* OpenSSLSocketFactory::createSocket( Socket* socket DECAF_UNUSED,
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/ssl/openssl/OpenSSLSocketFactory.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/ssl/openssl/OpenSSLSocketFactory.h?rev=943731&r1=943730&r2=943731&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/ssl/openssl/OpenSSLSocketFactory.h (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/ssl/openssl/OpenSSLSocketFactory.h Wed May 12 22:40:18 2010
@@ -54,7 +54,7 @@ namespace openssl {
/**
* {@inheritDoc}
*/
- virtual decaf::net::Socket* createSocket( const std::string& name, int port )
+ virtual decaf::net::Socket* createSocket( const std::string& hostname, int port )
throw( decaf::io::IOException, decaf::net::UnknownHostException );
/**
Modified: activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocket.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocket.cpp?rev=943731&r1=943730&r2=943731&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocket.cpp (original)
+++ activemq/activemq-cpp/trunk/activemq-cpp/src/main/decaf/internal/net/tcp/TcpSocket.cpp Wed May 12 22:40:18 2010
@@ -17,6 +17,7 @@
#include "TcpSocket.h"
+#include <decaf/internal/net/SocketFileDescriptor.h>
#include <decaf/internal/net/tcp/TcpSocketInputStream.h>
#include <decaf/internal/net/tcp/TcpSocketOutputStream.h>
@@ -59,22 +60,6 @@ using namespace decaf::lang;
using namespace decaf::lang::exceptions;
////////////////////////////////////////////////////////////////////////////////
-namespace {
-
- class SocketFileDescriptor : public FileDescriptor {
- public:
-
- SocketFileDescriptor( apr_socket_t* socket ) : FileDescriptor() {
- apr_os_sock_t osSocket = -1;
- apr_os_sock_get( &osSocket, socket );
- this->descriptor = (int)osSocket;
- }
-
- };
-
-}
-
-////////////////////////////////////////////////////////////////////////////////
TcpSocket::TcpSocket() throw ( SocketException )
: socketHandle( NULL ),
localAddress( NULL ),
@@ -128,7 +113,9 @@ void TcpSocket::create() throw( decaf::i
APR_PROTO_TCP, apr_pool.getAprPool() ) );
// Initialize the Socket's FileDescriptor
- this->fd = new SocketFileDescriptor( socketHandle );
+ apr_os_sock_t osSocket = -1;
+ apr_os_sock_get( &osSocket, socketHandle );
+ this->fd = new SocketFileDescriptor( osSocket );
}
DECAF_CATCH_RETHROW( decaf::io::IOException )
DECAF_CATCH_EXCEPTION_CONVERT( Exception, decaf::io::IOException )