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/12/12 02:11:55 UTC

svn commit: r485973 - in /incubator/activemq/activemq-cpp/trunk/activemq-cpp/src: main/activemq/connector/stomp/ main/activemq/connector/stomp/commands/ test/activemq/connector/stomp/ test/activemq/core/

Author: nmittler
Date: Mon Dec 11 17:11:54 2006
New Revision: 485973

URL: http://svn.apache.org/viewvc?view=rev&rev=485973
Log:
[AMQCPP-16] - changing StompFrame to use a std::vector rather than a direct pointer.  This is to support the updated interface on the BytesMessage.

Modified:
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompCommandReader.cpp
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompCommandWriter.cpp
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompFrame.h
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/AbstractCommand.h
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/BytesMessageCommand.h
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/ErrorCommand.h
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/StompMessage.h
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/TextMessageCommand.h
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/connector/stomp/StompConnectorTest.h
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/connector/stomp/StompFrameTest.h
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/core/ActiveMQSessionTest.h

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompCommandReader.cpp
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompCommandReader.cpp?view=diff&rev=485973&r1=485972&r2=485973
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompCommandReader.cpp (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompCommandReader.cpp Mon Dec 11 17:11:54 2006
@@ -282,11 +282,8 @@
     
         if( content_length != 0 )
         {
-            char* cpyBody = new char[content_length];
-            memcpy( cpyBody, &buffer[0], content_length );
-    
             // Set the body contents in the frame - copy the memory
-            frame.setBody( cpyBody, content_length );
+            frame.getBody() = buffer;
         }    
     }
     AMQ_CATCH_EXCEPTION_CONVERT( IOException, CommandIOException )

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompCommandWriter.cpp
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompCommandWriter.cpp?view=diff&rev=485973&r1=485972&r2=485973
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompCommandWriter.cpp (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompCommandWriter.cpp Mon Dec 11 17:11:54 2006
@@ -78,10 +78,10 @@
         writeByte( '\n' );
 
         // Write the body.
-        const char* body = frame.getBody();
-        if( body != NULL ) 
+        const std::vector<unsigned char>& body = frame.getBody();
+        if( body.size() > 0 ) 
         {
-            write( body, frame.getBodyLength() );
+            write( &body[0], body.size() );
         }
 
         if( ( frame.getBodyLength() == 0 ) ||

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompFrame.h
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompFrame.h?view=diff&rev=485973&r1=485972&r2=485973
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompFrame.h (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/StompFrame.h Mon Dec 11 17:11:54 2006
@@ -37,28 +37,23 @@
         /**
          * Default constructor.
          */
-        StompFrame(void){
-            body = NULL;
-            bodyLength = 0;
-        }
+        StompFrame(){}
         
         /**
-         * Destruction - frees the memory pool.
+         * Destruction.
          */
-        virtual ~StompFrame(void) { delete body; }
+        virtual ~StompFrame() {}
         
         /**
          * Clonse this message exactly, returns a new instance that the
          * caller is required to delete.
          * @return new copy of this message
          */
-        virtual StompFrame* clone(void) const {
+        virtual StompFrame* clone() const {
             StompFrame* frame = new StompFrame();
             frame->command = command;
             frame->properties = properties;
-            char* cpyBody = new char[bodyLength];
-            memcpy(cpyBody, body, bodyLength);
-            frame->setBody(cpyBody, bodyLength);
+            frame->body = body;
             return frame;
         }
         
@@ -73,7 +68,7 @@
         /**
          * Accessor for this frame's command field.
          */
-        const std::string& getCommand(void) const{
+        const std::string& getCommand() const{
             return command;
         }
         
@@ -81,8 +76,8 @@
          * Gets access to the header properties for this frame.
          * @return the Properties object owned by this Frame
          */
-        util::Properties& getProperties(void){ return properties; }
-        const util::Properties& getProperties(void) const { 
+        util::Properties& getProperties(){ return properties; }
+        const util::Properties& getProperties() const { 
             return properties;
         }
         
@@ -90,7 +85,14 @@
          * Accessor for the body data of this frame.
          * @return char pointer to body data
          */
-        const char* getBody(void) const{
+        const std::vector<unsigned char>& getBody() const{
+            return body;
+        }
+        
+        /**
+         * Non-const version of the body accessor.
+         */
+        std::vector<unsigned char>& getBody(){
             return body;
         }
         
@@ -98,16 +100,23 @@
          * Return the number of bytes contained in this frames body
          * @return Body bytes length.
          */
-        long long getBodyLength(void) const{ return bodyLength; }
+        unsigned long long getBodyLength() const{ return (unsigned long long)body.size(); }
         
         /**
          * Sets the body data of this frame as a byte sequence.
          * @param bytes The byte buffer to be set in the body.
          * @param numBytes The number of bytes in the buffer.
          */
-        void setBody( const char* bytes, const long long numBytes ){
-            body = bytes;
-            bodyLength = numBytes;
+        void setBody( const unsigned char* bytes, unsigned long long numBytes ){
+            
+            // Remove old data
+            body.clear();
+           
+            // Copy data to internal buffer.
+            for( long long ix = 0; ix < numBytes; ++ix )
+            {
+                body.push_back(bytes[ix]);
+            }
         }   
         
     private:
@@ -119,9 +128,7 @@
         util::SimpleProperties properties;
 
         // Byte data of Body.
-        const char* body;
-        long long bodyLength;     
-        
+        std::vector<unsigned char> body;         
     };
     
 }}}

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/AbstractCommand.h
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/AbstractCommand.h?view=diff&rev=485973&r1=485972&r2=485973
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/AbstractCommand.h (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/AbstractCommand.h Mon Dec 11 17:11:54 2006
@@ -257,7 +257,11 @@
          * Returns a char array of bytes that are contained in the message
          * @return pointer to array of bytes.
          */
-        virtual const char* getBytes(void) const{
+        virtual const std::vector<unsigned char>& getBytes() const{
+            return getFrame().getBody();
+        }
+        
+        virtual std::vector<unsigned char>& getBytes(){
             return getFrame().getBody();
         }
     
@@ -270,19 +274,30 @@
          * @param setContentLength true if the content length header should 
          * be set
          */
-        virtual void setBytes( const char* bytes, 
+        virtual void setBytes( const unsigned char* bytes, 
                                const unsigned long long numBytes,
                                const bool setContentLength = true )
         {
-            char* copy = new char[numBytes];
-            memcpy( copy, bytes, numBytes );
-            getFrame().setBody( copy, numBytes );
+            getFrame().setBody( bytes, numBytes );
             if( setContentLength )
             {
                 setPropertyValue( 
                     CommandConstants::toString( 
                         CommandConstants::HEADER_CONTENTLENGTH),
                     util::Long::toString( numBytes ) );
+            }
+        }
+        
+        virtual void setBytes( const std::vector<unsigned char>& bytes,
+                               const bool setContentLength = true )
+        {
+            getFrame().getBody() = bytes;
+            if( setContentLength )
+            {
+                setPropertyValue( 
+                    CommandConstants::toString( 
+                        CommandConstants::HEADER_CONTENTLENGTH),
+                    util::Long::toString( bytes.size() ) );
             }
         }
     };

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/BytesMessageCommand.h
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/BytesMessageCommand.h?view=diff&rev=485973&r1=485972&r2=485973
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/BytesMessageCommand.h (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/BytesMessageCommand.h Mon Dec 11 17:11:54 2006
@@ -21,6 +21,7 @@
 #include <cms/BytesMessage.h>
 #include <activemq/connector/stomp/commands/StompMessage.h>
 #include <activemq/connector/stomp/commands/CommandConstants.h>
+#include <activemq/exceptions/IllegalStateException.h>
 
 namespace activemq{
 namespace connector{
@@ -34,24 +35,59 @@
      */    
     class BytesMessageCommand : public StompMessage< cms::BytesMessage >
     {
+    private:
+    
+        /**
+         * Flag that indicates what state the stream is in.  If true, the
+         * message may only be read from.  If false, the message may only be
+         * written to.
+         */
+        bool readOnly;
+        
     public:
 
-        BytesMessageCommand(void) :
-            StompMessage< cms::BytesMessage >() {
-                initialize( getFrame() );
+        BytesMessageCommand() :
+        StompMessage< cms::BytesMessage >() {
+            initialize( getFrame() );
+            readOnly = false;    
         }
+        
         BytesMessageCommand( StompFrame* frame ) : 
-            StompMessage< cms::BytesMessage >( frame ) {
-                validate( getFrame() );
+        StompMessage< cms::BytesMessage >( frame ) {
+            validate( getFrame() );
+            readOnly = false;
         }
-    	virtual ~BytesMessageCommand(void) {}
+        
+    	virtual ~BytesMessageCommand() {}
 
         /**
+         * Clears out the body of the message.  This does not clear the
+         * headers or properties.
+         */
+        virtual void clearBody(){
+            
+            // Invoke base class's version.
+            StompMessage< cms::BytesMessage >::clearBody();
+            
+            // Set the stream in write only mode.
+            readOnly = false;
+        }
+        
+        /**
+         * Puts the message body in read-only mode and repositions the stream 
+         * of bytes to the beginning.
+         * @throws CMSException
+         */
+        virtual void reset() throw ( cms::CMSException ){
+            readOnly = true;
+        }
+        
+        /**
          * Clonse this message exactly, returns a new instance that the
          * caller is required to delete.
          * @return new copy of this message
          */
-        virtual cms::Message* clone(void) const {
+        virtual cms::Message* clone() const {
             StompFrame* frame = getFrame().clone();
             
             return new BytesMessageCommand( frame );
@@ -66,8 +102,13 @@
         virtual void setBodyBytes( const unsigned char* buffer, 
                                    const unsigned long long numBytes ) 
             throw( cms::CMSException ) {
-            this->setBytes(
-                reinterpret_cast<const char*>( buffer ), numBytes );
+            
+            if( readOnly ){
+                throw exceptions::IllegalStateException( __FILE__, __LINE__, 
+                    "message is in read-only mode and cannot be written to" );
+            }
+            
+            this->setBytes( buffer, numBytes );
         }
         
         /**
@@ -77,19 +118,23 @@
          * to expect.
          * @return const pointer to a byte buffer
          */
-        virtual const unsigned char* getBodyBytes(void) const {
-            return reinterpret_cast<const unsigned char*>( 
-                this->getBytes() );
+        virtual const unsigned char* getBodyBytes() const {
+            const std::vector<unsigned char>& bytes = getBytes();
+            if( bytes.size() == 0 ){
+                return NULL;
+            }
+            
+            return &this->getBytes()[0];
         }
       
         /**
          * Returns the number of bytes contained in the body of this message.
          * @return number of bytes.
          */
-        virtual unsigned long long getBodyLength(void) const {
+        virtual unsigned long long getBodyLength() const {
             return this->getNumBytes();
-        }
-
+        }               
+        
     };
 
 }}}}

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/ErrorCommand.h
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/ErrorCommand.h?view=diff&rev=485973&r1=485972&r2=485973
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/ErrorCommand.h (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/ErrorCommand.h Mon Dec 11 17:11:54 2006
@@ -35,21 +35,23 @@
     {
     public:
 
-        ErrorCommand(void) :
+        ErrorCommand() :
             AbstractCommand<transport::Command>() {
                 initialize( getFrame() );
         }
+        
         ErrorCommand( StompFrame* frame ) : 
             AbstractCommand<transport::Command>( frame ) {
                 validate( getFrame() );
         }
-        virtual ~ErrorCommand(void) {};
+        
+        virtual ~ErrorCommand() {};
 
         /**
          * Get the error message
          * @return the error message string
          */      
-        virtual std::string getErrorMessage(void) const {
+        virtual std::string getErrorMessage() const {
             return getPropertyValue( 
                 CommandConstants::toString( 
                     CommandConstants::HEADER_MESSAGE ), "" );
@@ -71,15 +73,21 @@
          * @param text Detailed Error Message
          */
         virtual void setErrorDetails( const std::string& text ) {
-            setBytes( text.c_str(), text.length() + 1 );
+            setBytes( (unsigned char*)text.c_str(), text.length() + 1 );
         }
 
         /**
          * Get the Text associated with this Error
          * @return Error Message String
          */
-        virtual std::string getErrorDetails(void) const {
-            return getBytes() != NULL ? getBytes() : "";
+        virtual std::string getErrorDetails() const {
+            
+            const std::vector<unsigned char>& bytes = getBytes();
+            if( bytes.size() == 0 ){
+                return "";
+            }
+            
+            return std::string((char*)&getBytes()[0]);
         }
 
     protected:

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/StompMessage.h
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/StompMessage.h?view=diff&rev=485973&r1=485972&r2=485973
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/StompMessage.h (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/StompMessage.h Mon Dec 11 17:11:54 2006
@@ -72,7 +72,9 @@
             AbstractCommand< transport::Command >(),
             ackHandler( NULL ),
             dest( NULL ),
-            replyTo( NULL) {}
+            replyTo( NULL) {
+        }
+            
         StompMessage( StompFrame* frame ) : 
             AbstractCommand< transport::Command >( frame ),
             ackHandler( NULL ),
@@ -93,14 +95,23 @@
             }            
         }
 
-    	virtual ~StompMessage() { delete dest; }
+    	virtual ~StompMessage() {
+            
+            if( dest != NULL ){
+                delete dest;
+            }
+            
+            if( replyTo != NULL ){
+                delete replyTo;
+            } 
+        }
 
         /**
          * Clears out the body of the message.  This does not clear the
          * headers or properties.
          */
         virtual void clearBody(){
-            getFrame().setBody( NULL, 0 );
+            getFrame().getBody().clear();
         }
         
         /**

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/TextMessageCommand.h
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/TextMessageCommand.h?view=diff&rev=485973&r1=485972&r2=485973
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/TextMessageCommand.h (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/stomp/commands/TextMessageCommand.h Mon Dec 11 17:11:54 2006
@@ -32,22 +32,24 @@
     {
     public:
 
-        TextMessageCommand(void) :
+        TextMessageCommand() :
             StompMessage< cms::TextMessage >() {
                 initialize( getFrame() );
         }
+        
         TextMessageCommand( StompFrame* frame ) : 
             StompMessage< cms::TextMessage >( frame ) {
                 validate( getFrame() );
         }
-    	virtual ~TextMessageCommand(void) {}
+        
+    	virtual ~TextMessageCommand() {}
 
         /**
          * Clonse this message exactly, returns a new instance that the
          * caller is required to delete.
          * @return new copy of this message
          */
-        virtual cms::Message* clone(void) const {
+        virtual cms::Message* clone() const {
             StompFrame* frame = getFrame().clone();
             
             return new TextMessageCommand( frame );
@@ -57,8 +59,14 @@
          * Gets the message character buffer.
          * @return The message character buffer.
          */
-        virtual std::string getText(void) const throw( cms::CMSException ) {
-            return getBytes() != NULL ? getBytes() : "";
+        virtual std::string getText() const throw( cms::CMSException ) {
+            
+            const std::vector<unsigned char>& bytes = getBytes();
+            if( bytes.size() == 0 ){
+                return "";
+            }
+            
+            return std::string( (char*)&bytes[0] );
         }
         
         /**
@@ -66,7 +74,7 @@
          * @param msg The message buffer.
          */
         virtual void setText( const char* msg ) throw( cms::CMSException ) {
-            setBytes( msg, strlen(msg) + 1, false );
+            setBytes( (unsigned char*)msg, strlen(msg) + 1, false );
         }
 
         /**
@@ -74,7 +82,7 @@
          * @param msg The message buffer.
          */
         virtual void setText( const std::string& msg ) throw( cms::CMSException ) {
-            setBytes( msg.c_str(), msg.length() + 1, false );
+            setBytes( (unsigned char*)msg.c_str(), msg.length() + 1, false );
         }
 
     };

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/connector/stomp/StompConnectorTest.h
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/connector/stomp/StompConnectorTest.h?view=diff&rev=485973&r1=485972&r2=485973
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/connector/stomp/StompConnectorTest.h (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/connector/stomp/StompConnectorTest.h Mon Dec 11 17:11:54 2006
@@ -247,7 +247,7 @@
             frame->getProperties().setProperty( 
                 "destination", dest1.toProviderString() );
             const char* buffer = strdup("hello world");
-            frame->setBody( buffer, 12 );
+            frame->setBody( (const unsigned char*)buffer, 12 );
 
             commands::TextMessageCommand* msg = 
                 new commands::TextMessageCommand( frame );
@@ -267,7 +267,7 @@
             frame->getProperties().setProperty( 
                 "destination", dest2.toProviderString() );
             buffer = strdup("hello world");
-            frame->setBody( buffer, 12 );
+            frame->setBody( (unsigned char*)buffer, 12 );
 
             msg = new commands::TextMessageCommand( frame );
             transport.fireCommand( msg );

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/connector/stomp/StompFrameTest.h
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/connector/stomp/StompFrameTest.h?view=diff&rev=485973&r1=485972&r2=485973
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/connector/stomp/StompFrameTest.h (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/connector/stomp/StompFrameTest.h Mon Dec 11 17:11:54 2006
@@ -52,14 +52,14 @@
          
          CPPUNIT_ASSERT( result == "value" );         
          
-         CPPUNIT_ASSERT( frame.getBody() == NULL );
+         CPPUNIT_ASSERT( frame.getBody().size() == 0 );
          CPPUNIT_ASSERT( frame.getBodyLength() == 0 );
          
-         frame.setBody( strdup("ABC"), 4 );
+         frame.setBody( (unsigned char*)strdup("ABC"), 4 );
          
-         CPPUNIT_ASSERT( frame.getBody() != NULL );
+         CPPUNIT_ASSERT( frame.getBody().size() == 4 );
          CPPUNIT_ASSERT( frame.getBodyLength() == 4 );
-         CPPUNIT_ASSERT( std::string(frame.getBody()) == "ABC" );
+         CPPUNIT_ASSERT( std::string((char*)&frame.getBody()[0]) == "ABC" );
       }
       
    };

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/core/ActiveMQSessionTest.h
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/core/ActiveMQSessionTest.h?view=diff&rev=485973&r1=485972&r2=485973
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/core/ActiveMQSessionTest.h (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/test/activemq/core/ActiveMQSessionTest.h Mon Dec 11 17:11:54 2006
@@ -200,7 +200,7 @@
             frame->getProperties().setProperty( 
                 "destination", destination.toProviderString() );
             const char* buffer = strdup( message.c_str() );
-            frame->setBody( buffer, 12 );
+            frame->setBody( (unsigned char*)buffer, 12 );
 
             connector::stomp::commands::TextMessageCommand* msg = 
                 new connector::stomp::commands::TextMessageCommand( frame );