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 2008/12/09 15:42:04 UTC

svn commit: r724718 - in /activemq/activemq-cpp/trunk/src/main: ./ decaf/internal/io/ decaf/io/

Author: tabish
Date: Tue Dec  9 06:42:03 2008
New Revision: 724718

URL: http://svn.apache.org/viewvc?rev=724718&view=rev
Log:
Refactoring Decaf's standard input / output streams

Added:
    activemq/activemq-cpp/trunk/src/main/decaf/internal/io/
    activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardErrorOutputStream.cpp   (with props)
    activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardErrorOutputStream.h   (with props)
    activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardInputStream.cpp   (with props)
    activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardInputStream.h   (with props)
    activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardOutputStream.cpp   (with props)
    activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardOutputStream.h   (with props)
Removed:
    activemq/activemq-cpp/trunk/src/main/decaf/io/StandardErrorOutputStream.h
Modified:
    activemq/activemq-cpp/trunk/src/main/Makefile.am

Modified: activemq/activemq-cpp/trunk/src/main/Makefile.am
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/Makefile.am?rev=724718&r1=724717&r2=724718&view=diff
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/Makefile.am (original)
+++ activemq/activemq-cpp/trunk/src/main/Makefile.am Tue Dec  9 06:42:03 2008
@@ -85,6 +85,9 @@
     decaf/internal/AprPool.cpp \
     decaf/internal/util/ByteArrayAdapter.cpp \
     decaf/internal/util/HexStringParser.cpp \
+    decaf/internal/io/StandardErrorOutputStream.cpp \
+    decaf/internal/io/StandardOutputStream.cpp \
+    decaf/internal/io/StandardInputStream.cpp \
     decaf/internal/nio/BufferFactory.cpp \
     decaf/internal/nio/ByteArrayPerspective.cpp \
     decaf/internal/nio/ByteArrayBuffer.cpp \
@@ -365,7 +368,6 @@
     decaf/lang/exceptions/InterruptedException.h \
     decaf/lang/exceptions/NumberFormatException.h \
     decaf/io/BufferedOutputStream.h \
-    decaf/io/StandardErrorOutputStream.h \
     decaf/io/OutputStream.h \
     decaf/io/Writer.h \
     decaf/io/ByteArrayOutputStream.h \
@@ -440,6 +442,9 @@
     decaf/internal/DecafRuntime.h \
     decaf/internal/util/HexStringParser.h \
     decaf/internal/util/ByteArrayAdapter.h \
+    decaf/internal/io/StandardErrorOutputStream.h \
+    decaf/internal/io/StandardOutputStream.h \
+    decaf/internal/io/StandardInputStream.h \
     decaf/internal/nio/BufferFactory.h \
     decaf/internal/nio/ByteArrayPerspective.h \
     decaf/internal/nio/ByteArrayBuffer.h \

Added: activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardErrorOutputStream.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardErrorOutputStream.cpp?rev=724718&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardErrorOutputStream.cpp (added)
+++ activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardErrorOutputStream.cpp Tue Dec  9 06:42:03 2008
@@ -0,0 +1,80 @@
+/*
+ * 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 "StandardErrorOutputStream.h"
+
+#include <apr.h>
+#include <apr_general.h>
+#include <apr_pools.h>
+
+using namespace decaf;
+using namespace decaf::internal;
+using namespace decaf::internal::io;
+
+////////////////////////////////////////////////////////////////////////////////
+StandardErrorOutputStream::StandardErrorOutputStream() {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+StandardErrorOutputStream::~StandardErrorOutputStream() {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void StandardErrorOutputStream::write( unsigned char c )
+    throw ( decaf::io::IOException ) {
+
+    std::cerr << c;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void StandardErrorOutputStream::write( const std::vector<unsigned char>& buffer )
+    throw ( decaf::io::IOException ) {
+
+    if( buffer.empty() ){
+        return;
+    }
+
+    this->write( &buffer[0], 0, buffer.size() );
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void StandardErrorOutputStream::write( const unsigned char* buffer,
+                                       std::size_t offset,
+                                       std::size_t len )
+    throw ( decaf::io::IOException, lang::exceptions::NullPointerException ) {
+
+    if( buffer == NULL ) {
+        throw lang::exceptions::NullPointerException(
+            __FILE__, __LINE__,
+            "StandardErrorOutputStream::write - Passed buffer is null." );
+    }
+
+    if( offset > len ) {
+        throw decaf::io::IOException(
+            __FILE__, __LINE__,
+            "StandardErrorOutputStream::write - offset passed is greater than length" );
+    }
+
+    for( int i = 0; i < len; ++i ) {
+        std::cerr << buffer[i+offset];
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void StandardErrorOutputStream::flush() throw ( decaf::io::IOException ){
+    std::cerr.flush();
+}

Propchange: activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardErrorOutputStream.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Added: activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardErrorOutputStream.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardErrorOutputStream.h?rev=724718&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardErrorOutputStream.h (added)
+++ activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardErrorOutputStream.h Tue Dec  9 06:42:03 2008
@@ -0,0 +1,159 @@
+/*
+ * 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_IO_STANDARDERROROUTPUTSTREAM_H_
+#define _DECAF_INTERNAL_IO_STANDARDERROROUTPUTSTREAM_H_
+
+#include <decaf/util/Config.h>
+#include <decaf/io/OutputStream.h>
+#include <decaf/util/concurrent/Mutex.h>
+
+namespace decaf{
+namespace internal{
+namespace io{
+
+    /**
+     * Wrapper Around the Standard error Output facility on the current
+     * platform.  This allows for the use of alternate output methods on
+     * platforms or compilers that do not support <code>std::cerr</code>.
+     */
+    class DECAF_API StandardErrorOutputStream : public decaf::io::OutputStream {
+    private:
+
+        /**
+         * Synchronization object.
+         */
+        util::concurrent::Mutex mutex;
+
+    public:
+
+        /**
+         * Default Constructor
+         */
+        StandardErrorOutputStream();
+
+        virtual ~StandardErrorOutputStream();
+
+        /**
+         * Writes a single byte to the output stream.
+         * @param c the byte.
+         * @throws IOException thrown if an error occurs.
+         */
+        virtual void write( unsigned char c )
+            throw ( decaf::io::IOException );
+
+        /**
+         * Writes an array of bytes to the output stream.
+         * @param buffer The bytes to write.
+         * @throws IOException thrown if an error occurs.
+         */
+        virtual void write( const std::vector<unsigned char>& buffer )
+            throw ( decaf::io::IOException );
+
+        /**
+         * Writes an array of bytes to the output stream.
+         * @param buffer The array of bytes to write.
+         * @param offset, the position to start writing in buffer.
+         * @param len The number of bytes from the buffer to be written.
+         * @throws decaf::io::IOException thrown if an error occurs.
+         * @throws NullPointerException if buffer is null.
+         */
+        virtual void write( const unsigned char* buffer,
+                            std::size_t offset,
+                            std::size_t len )
+            throw ( decaf::io::IOException, lang::exceptions::NullPointerException );
+
+        /**
+         * Invokes flush on the target output stream.
+         * throws decaf::io::IOException if an error occurs
+         */
+        virtual void flush() throw ( decaf::io::IOException );
+
+        /**
+         * Invokes close on the target output stream.
+         * throws CMSException if an error occurs
+         */
+        virtual void close() throw( decaf::lang::Exception ){
+            this->flush();
+        }
+
+    public:
+
+        /**
+         * Waits on a signal from this object, which is generated
+         * by a call to Notify.  Must have this object locked before
+         * calling.
+         * @throws Exception
+         */
+        virtual void lock() throw( decaf::lang::Exception ){
+            mutex.lock();
+        }
+
+        /**
+         * Unlocks the object.
+         * @throws Exception
+         */
+        virtual void unlock() throw( decaf::lang::Exception ){
+            mutex.unlock();
+        }
+
+        /**
+         * Waits on a signal from this object, which is generated
+         * by a call to Notify.  Must have this object locked before
+         * calling.
+         * @throws Exception
+         */
+        virtual void wait() throw( decaf::lang::Exception ){
+            mutex.wait();
+        }
+
+        /**
+         * Waits on a signal from this object, which is generated
+         * by a call to Notify.  Must have this object locked before
+         * calling.  This wait will timeout after the specified time
+         * interval.
+         * @param time in milliseconds to wait, or WAIT_INIFINITE
+         * @throws Exception
+         */
+        virtual void wait( unsigned long millisecs ) throw( decaf::lang::Exception ){
+            mutex.wait( millisecs );
+        }
+
+        /**
+         * Signals a waiter on this object that it can now wake
+         * up and continue.  Must have this object locked before
+         * calling.
+         * @throws Exception
+         */
+        virtual void notify() throw( decaf::lang::Exception ){
+            mutex.notify();
+        }
+
+        /**
+         * Signals the waiters on this object that it can now wake
+         * up and continue.  Must have this object locked before
+         * calling.
+         * @throws Exception
+         */
+        virtual void notifyAll() throw( decaf::lang::Exception ){
+            mutex.notifyAll();
+        }
+
+    };
+
+}}}
+
+#endif /*_DECAF_INTERNAL_IO_STANDARDERROROUTPUTSTREAM_H_*/

Propchange: activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardErrorOutputStream.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardInputStream.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardInputStream.cpp?rev=724718&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardInputStream.cpp (added)
+++ activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardInputStream.cpp Tue Dec  9 06:42:03 2008
@@ -0,0 +1,87 @@
+/*
+ * 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 "StandardInputStream.h"
+
+#include <iostream>
+
+#include <apr.h>
+#include <apr_general.h>
+#include <apr_pools.h>
+
+using namespace std;
+using namespace decaf;
+using namespace decaf::lang;
+using namespace decaf::lang::exceptions;
+using namespace decaf::internal;
+using namespace decaf::internal::io;
+
+////////////////////////////////////////////////////////////////////////////////
+StandardInputStream::StandardInputStream() {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+StandardInputStream::~StandardInputStream() {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+std::size_t StandardInputStream::available() const throw ( decaf::io::IOException ) {
+    return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+unsigned char StandardInputStream::read() throw ( decaf::io::IOException ) {
+
+    if( !std::cin.good() ) {
+        throw decaf::io::IOException(
+            __FILE__, __LINE__,
+            "Standard Input Stream in Error State." );
+    }
+
+    return std::cin.get();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+int StandardInputStream::read( unsigned char* buffer,
+                               std::size_t offset,
+                               std::size_t bufferSize )
+    throw ( decaf::io::IOException, decaf::lang::exceptions::NullPointerException ) {
+
+    if( buffer == NULL ) {
+        throw NullPointerException(
+            __FILE__, __LINE__,
+            "ByteArrayInputStream::read - Buffer passed is Null" );
+    }
+
+    return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+std::size_t StandardInputStream::skip( std::size_t num )
+    throw ( decaf::io::IOException,
+            decaf::lang::exceptions::UnsupportedOperationException ) {
+
+    return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void StandardInputStream::reset() throw ( decaf::io::IOException ) {
+
+    throw decaf::io::IOException(
+        __FILE__, __LINE__,
+        "Mark and Rest not Supported by this class." );
+}

Propchange: activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardInputStream.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Added: activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardInputStream.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardInputStream.h?rev=724718&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardInputStream.h (added)
+++ activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardInputStream.h Tue Dec  9 06:42:03 2008
@@ -0,0 +1,213 @@
+/*
+ * 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_IO_STANDARDINPUTSTREAM_H_
+#define _DECAF_INTERNAL_IO_STANDARDINPUTSTREAM_H_
+
+#include <decaf/util/Config.h>
+#include <decaf/io/InputStream.h>
+#include <decaf/util/concurrent/Mutex.h>
+
+namespace decaf {
+namespace internal {
+namespace io {
+
+    class DECAF_API StandardInputStream : public decaf::io::InputStream {
+    private:
+
+        /**
+         * Synchronization object.
+         */
+        util::concurrent::Mutex mutex;
+
+    public:
+
+        StandardInputStream();
+        virtual ~StandardInputStream();
+
+        /**
+         * Indicates the number of bytes available.
+         * @return The number of bytes until the end of the internal buffer.
+         */
+        virtual std::size_t available() const throw ( decaf::io::IOException );
+
+        /**
+         * Reads a single byte from the buffer.
+         * @return The next byte.
+         * @throws IOException thrown if an error occurs.
+         */
+        virtual unsigned char read() throw ( decaf::io::IOException );
+
+        /**
+         * Reads an array of bytes from the buffer.
+         *
+         * @param buffer (out) the target buffer.
+         * @param offset the position in the buffer to start reading from.
+         * @param bufferSize the size of the output buffer.
+         *
+         * @return The number of bytes read.
+         *
+         * @throws decaf::io::IOException thrown if an error occurs.
+         * @throws decaf::lang::exceptions::NullPointerException if buffer is null.
+         */
+        virtual int read( unsigned char* buffer,
+                          std::size_t offset,
+                          std::size_t bufferSize )
+            throw ( decaf::io::IOException, decaf::lang::exceptions::NullPointerException );
+
+        /**
+         * Closes the target input stream.
+         * @throws decaf::io::IOException thrown if an error occurs.
+         */
+        virtual void close() throw( lang::Exception ) {}
+
+        /**
+         * Skips over and discards n bytes of data from this input stream. The
+         * skip method may, for a variety of reasons, end up skipping over some
+         * smaller number of bytes, possibly 0. This may result from any of a
+         * number of conditions; reaching end of file before n bytes have been
+         * skipped is only one possibility. The actual number of bytes skipped
+         * is returned. If n is negative, no bytes are skipped.
+         * <p>
+         * The skip method of InputStream creates a byte array and then
+         * repeatedly reads into it until n bytes have been read or the end
+         * of the stream has been reached. Subclasses are encouraged to
+         * provide a more efficient implementation of this method.
+         * @param num - the number of bytes to skip
+         * @returns total bytes skipped
+         *
+         * @throws decaf::io::IOException if an error occurs
+         * @throws decaf::lang::exceptions::UnsupportedOperationException
+         *         If skip is not supported.
+         */
+        virtual std::size_t skip( std::size_t num )
+            throw ( decaf::io::IOException,
+                    decaf::lang::exceptions::UnsupportedOperationException );
+
+        /**
+         * Marks the current position in the stream A subsequent call to the
+         * reset method repositions this stream at the last marked position so
+         * that subsequent reads re-read the same bytes.
+         *
+         * If a stream instance reports that marks are supported then the stream
+         * will ensure that the same bytes can be read again after the reset method
+         * is called so long the readLimit is not reached.
+         * @param readLimit - max bytes read before marked position is invalid.
+         */
+        virtual void mark( int readLimit DECAF_UNUSED ) {}
+
+        /**
+         * Repositions this stream to the position at the time the mark method was
+         * last called on this input stream.
+         *
+         * If the method markSupported returns true, then:
+         *   * If the method mark has not been called since the stream was created,
+         *     or the number of bytes read from the stream since mark was last called
+         *     is larger than the argument to mark at that last call, then an
+         *     IOException might be thrown.
+         *   * If such an IOException is not thrown, then the stream is reset to a
+         *     state such that all the bytes read since the most recent call to mark
+         *     (or since the start of the file, if mark has not been called) will be
+         *     resupplied to subsequent callers of the read method, followed by any
+         *     bytes that otherwise would have been the next input data as of the
+         *     time of the call to reset.
+         * If the method markSupported returns false, then:
+         *   * The call to reset may throw an IOException.
+         *   * If an IOException is not thrown, then the stream is reset to a fixed
+         *     state that depends on the particular type of the input stream and how
+         *     it was created. The bytes that will be supplied to subsequent callers
+         *     of the read method depend on the particular type of the input stream.
+         * @throws IOException
+         */
+        virtual void reset() throw ( decaf::io::IOException );
+
+        /**
+         * Determines if this input stream supports the mark and reset methods.
+         * Whether or not mark and reset are supported is an invariant property of
+         * a particular input stream instance.
+         * @returns true if this stream instance supports marks
+         */
+        virtual bool markSupported() const{ return false; }
+
+    protected:
+
+        /**
+         * Waits on a signal from this object, which is generated
+         * by a call to Notify.  Must have this object locked before
+         * calling.
+         * @throws Exception
+         */
+        virtual void lock() throw( lang::Exception ){
+            mutex.lock();
+        }
+
+        /**
+         * Unlocks the object.
+         * @throws Exception
+         */
+        virtual void unlock() throw( lang::Exception ){
+            mutex.unlock();
+        }
+
+        /**
+         * Waits on a signal from this object, which is generated
+         * by a call to Notify.  Must have this object locked before
+         * calling.
+         * @throws Exception
+         */
+        virtual void wait() throw( lang::Exception ){
+            mutex.wait();
+        }
+
+        /**
+         * Waits on a signal from this object, which is generated
+         * by a call to Notify.  Must have this object locked before
+         * calling.  This wait will timeout after the specified time
+         * interval.
+         * @param millisecs the time in milliseconds to wait, or
+         * WAIT_INIFINITE
+         * @throws Exception
+         */
+        virtual void wait( unsigned long millisecs ) throw( lang::Exception ){
+            mutex.wait( millisecs );
+        }
+
+        /**
+         * Signals a waiter on this object that it can now wake
+         * up and continue.  Must have this object locked before
+         * calling.
+         * @throws Exception
+         */
+        virtual void notify() throw( lang::Exception ){
+            mutex.notify();
+        }
+
+        /**
+         * Signals the waiters on this object that it can now wake
+         * up and continue.  Must have this object locked before
+         * calling.
+         * @throws Exception
+         */
+        virtual void notifyAll() throw( lang::Exception ){
+            mutex.notifyAll();
+        }
+
+    };
+
+}}}
+
+#endif /* _DECAF_INTERNAL_IO_STANDARDINPUTSTREAM_H_ */

Propchange: activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardInputStream.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardOutputStream.cpp
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardOutputStream.cpp?rev=724718&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardOutputStream.cpp (added)
+++ activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardOutputStream.cpp Tue Dec  9 06:42:03 2008
@@ -0,0 +1,80 @@
+/*
+ * 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 "StandardOutputStream.h"
+
+#include <apr.h>
+#include <apr_general.h>
+#include <apr_pools.h>
+
+using namespace decaf;
+using namespace decaf::internal;
+using namespace decaf::internal::io;
+
+////////////////////////////////////////////////////////////////////////////////
+StandardOutputStream::StandardOutputStream() {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+StandardOutputStream::~StandardOutputStream() {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void StandardOutputStream::write( unsigned char c )
+    throw ( decaf::io::IOException ) {
+
+    std::cout << c;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void StandardOutputStream::write( const std::vector<unsigned char>& buffer )
+    throw ( decaf::io::IOException ) {
+
+    if( buffer.empty() ){
+        return;
+    }
+
+    this->write( &buffer[0], 0, buffer.size() );
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void StandardOutputStream::write( const unsigned char* buffer,
+                                       std::size_t offset,
+                                       std::size_t len )
+    throw ( decaf::io::IOException, lang::exceptions::NullPointerException ) {
+
+    if( buffer == NULL ) {
+        throw lang::exceptions::NullPointerException(
+            __FILE__, __LINE__,
+            "StandardOutputStream::write - Passed buffer is null." );
+    }
+
+    if( offset > len ) {
+        throw decaf::io::IOException(
+            __FILE__, __LINE__,
+            "StandardOutputStream::write - offset passed is greater than length" );
+    }
+
+    for( int i = 0; i < len; ++i ) {
+        std::cout << buffer[i+offset];
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void StandardOutputStream::flush() throw ( decaf::io::IOException ){
+    std::cout.flush();
+}

Propchange: activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardOutputStream.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Added: activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardOutputStream.h
URL: http://svn.apache.org/viewvc/activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardOutputStream.h?rev=724718&view=auto
==============================================================================
--- activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardOutputStream.h (added)
+++ activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardOutputStream.h Tue Dec  9 06:42:03 2008
@@ -0,0 +1,150 @@
+/*
+ * 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_IO_STANDARDOUTPUTSTREAM_H_
+#define _DECAF_INTERNAL_IO_STANDARDOUTPUTSTREAM_H_
+
+#include <decaf/util/Config.h>
+#include <decaf/io/OutputStream.h>
+#include <decaf/util/concurrent/Mutex.h>
+
+namespace decaf {
+namespace internal {
+namespace io {
+
+    class DECAF_API StandardOutputStream : public decaf::io::OutputStream {
+    private:
+
+        /**
+         * Synchronization object.
+         */
+        util::concurrent::Mutex mutex;
+
+    public:
+
+        StandardOutputStream();
+        virtual ~StandardOutputStream();
+
+        /**
+         * Writes a single byte to the output stream.
+         * @param c the byte.
+         * @throws IOException thrown if an error occurs.
+         */
+        virtual void write( unsigned char c )
+            throw ( decaf::io::IOException );
+
+        /**
+         * Writes an array of bytes to the output stream.
+         * @param buffer The bytes to write.
+         * @throws IOException thrown if an error occurs.
+         */
+        virtual void write( const std::vector<unsigned char>& buffer )
+            throw ( decaf::io::IOException );
+
+        /**
+         * Writes an array of bytes to the output stream.
+         * @param buffer The array of bytes to write.
+         * @param offset, the position to start writing in buffer.
+         * @param len The number of bytes from the buffer to be written.
+         * @throws decaf::io::IOException thrown if an error occurs.
+         * @throws NullPointerException if buffer is null.
+         */
+        virtual void write( const unsigned char* buffer,
+                            std::size_t offset,
+                            std::size_t len )
+            throw ( decaf::io::IOException, lang::exceptions::NullPointerException );
+
+        /**
+         * Invokes flush on the target output stream.
+         * throws decaf::io::IOException if an error occurs
+         */
+        virtual void flush() throw ( decaf::io::IOException );
+
+        /**
+         * Invokes close on the target output stream.
+         * throws CMSException if an error occurs
+         */
+        virtual void close() throw( decaf::lang::Exception ){
+            this->flush();
+        }
+
+    public:
+
+        /**
+         * Waits on a signal from this object, which is generated
+         * by a call to Notify.  Must have this object locked before
+         * calling.
+         * @throws Exception
+         */
+        virtual void lock() throw( decaf::lang::Exception ){
+            mutex.lock();
+        }
+
+        /**
+         * Unlocks the object.
+         * @throws Exception
+         */
+        virtual void unlock() throw( decaf::lang::Exception ){
+            mutex.unlock();
+        }
+
+        /**
+         * Waits on a signal from this object, which is generated
+         * by a call to Notify.  Must have this object locked before
+         * calling.
+         * @throws Exception
+         */
+        virtual void wait() throw( decaf::lang::Exception ){
+            mutex.wait();
+        }
+
+        /**
+         * Waits on a signal from this object, which is generated
+         * by a call to Notify.  Must have this object locked before
+         * calling.  This wait will timeout after the specified time
+         * interval.
+         * @param time in milliseconds to wait, or WAIT_INIFINITE
+         * @throws Exception
+         */
+        virtual void wait( unsigned long millisecs ) throw( decaf::lang::Exception ){
+            mutex.wait( millisecs );
+        }
+
+        /**
+         * Signals a waiter on this object that it can now wake
+         * up and continue.  Must have this object locked before
+         * calling.
+         * @throws Exception
+         */
+        virtual void notify() throw( decaf::lang::Exception ){
+            mutex.notify();
+        }
+
+        /**
+         * Signals the waiters on this object that it can now wake
+         * up and continue.  Must have this object locked before
+         * calling.
+         * @throws Exception
+         */
+        virtual void notifyAll() throw( decaf::lang::Exception ){
+            mutex.notifyAll();
+        }
+    };
+
+}}}
+
+#endif /* _DECAF_INTERNAL_IO_STANDARDOUTPUTSTREAM_H_ */

Propchange: activemq/activemq-cpp/trunk/src/main/decaf/internal/io/StandardOutputStream.h
------------------------------------------------------------------------------
    svn:eol-style = native