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 2007/01/20 23:16:06 UTC

svn commit: r498194 - in /incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/utils: OpenwireStringSupport.cpp OpenwireStringSupport.h

Author: tabish
Date: Sat Jan 20 14:16:05 2007
New Revision: 498194

URL: http://svn.apache.org/viewvc?view=rev&rev=498194
Log:
http://issues.apache.org/activemq/browse/AMQCPP-30

Added:
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/utils/OpenwireStringSupport.cpp   (with props)
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/utils/OpenwireStringSupport.h   (with props)

Added: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/utils/OpenwireStringSupport.cpp
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/utils/OpenwireStringSupport.cpp?view=auto&rev=498194
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/utils/OpenwireStringSupport.cpp (added)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/utils/OpenwireStringSupport.cpp Sat Jan 20 14:16:05 2007
@@ -0,0 +1,179 @@
+/*
+ * 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 "OpenwireStringSupport.h"
+
+#include <activemq/util/Integer.h>
+
+using namespace activemq;
+using namespace activemq::io;
+using namespace activemq::util;
+using namespace activemq::exceptions;
+using namespace activemq::connector;
+using namespace activemq::connector::openwire;
+using namespace activemq::connector::openwire::utils;
+
+////////////////////////////////////////////////////////////////////////////////
+std::string OpenwireStringSupport::readString( io::DataInputStream& dataIn )
+    throw ( io::IOException ) {
+        
+    try {
+
+        short utflen = dataIn.readShort();
+        
+        if( utflen > -1 )
+        {
+            // Let the stream get us all that data.
+            std::vector<unsigned char> value;
+            value.resize( utflen );
+            dataIn.readFully( value );            
+
+            int c, char2, char3;
+            int count = 0;
+            
+            while( count < utflen )
+            {
+                c = value[count] & 0xff;
+                switch( c >> 4 )
+                {
+                    case 0:
+                    case 1:
+                    case 2:
+                    case 3:
+                    case 4:
+                    case 5:
+                    case 6:
+                    case 7:
+                        /* 0xxxxxxx */
+                        count++;
+//                        str.Append((char) c);
+                        break;
+                    case 12:
+                    case 13:
+//                        /* 110x xxxx 10xx xxxx */
+//                        count += 2;
+//                        if (count > utflen)
+//                        {
+//                            throw CreateDataFormatException();
+//                        }
+//                        char2 = bytearr[count - 1];
+//                        if ((char2 & 0xC0) != 0x80)
+//                        {
+//                            throw CreateDataFormatException();
+//                        }
+//                        str.Append((char) (((c & 0x1F) << 6) | (char2 & 0x3F)));
+//                        break;
+                    case 14:
+//                        /* 1110 xxxx 10xx xxxx 10xx xxxx */
+//                        count += 3;
+//                        if (count > utflen)
+//                        {
+//                            throw CreateDataFormatException();
+//                        }
+//                        char2 = bytearr[count - 2];
+//                        char3 = bytearr[count - 1];
+//                        if (((char2 & 0xC0) != 0x80) || ((char3 & 0xC0) != 0x80))
+//                        {
+//                            throw CreateDataFormatException();
+//                        }
+//                        str.Append((char) (((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0)));
+//                        break;
+                    default :
+                    {
+                        /* 10xx xxxx, 1111 xxxx */
+                        throw IOException(
+                            __FILE__,
+                            __LINE__,
+                            "OpenwireStringSupport::readString - Encoding not supported" );
+                    }
+                }
+            }
+
+            // Let the Compiler give us a string.
+            return reinterpret_cast<const char*>( &value[0] );
+        }
+
+        return "";
+    }
+    AMQ_CATCH_RETHROW( ActiveMQException )
+    AMQ_CATCHALL_THROW( ActiveMQException )        
+}
+
+////////////////////////////////////////////////////////////////////////////////
+void OpenwireStringSupport::writeString( io::DataOutputStream& dataOut, 
+                                         const std::string* str )
+                                            throw ( io::IOException ) {
+
+    try {
+
+        if( str != NULL )
+        {
+            if( str->size() > 65536 ) {
+                throw IOException(
+                    __FILE__,
+                    __LINE__,
+                    ( std::string( "OpenwireStringSupport::writeString - Cannot marshall " ) + 
+                    "string longer than: 65536 characters, supplied steing was: " +
+                    Integer::toString( str->size() ) + " characters long." ).c_str() );
+            }
+            
+            short strlen = (short)str->size();
+            short utflen = 0;
+            int c, count = 0;
+            
+            std::string::const_iterator iter = str->begin();
+            
+            for(; iter != str->end(); ++iter ) {
+                c = *iter;
+                if( (c >= 0x0001) && (c <= 0x007F) ) {
+                    utflen++;
+                } else if( c > 0x07FF ) {
+                    utflen += 3;
+                } else {
+                    utflen += 2;
+                }
+            }
+            
+            dataOut.writeShort( utflen );
+            std::vector<unsigned char> byteArr;
+            byteArr.resize( utflen );
+
+            for( iter = str->begin(); iter != str->end(); ++iter ) {
+
+                c = *iter;
+                if( (c >= 0x0001) && (c <= 0x007F) ) {
+                    byteArr[count++] = (unsigned char)c;
+                } else if ( c > 0x07FF ) {
+                    byteArr[count++] = (unsigned char)( 0xE0 | ( (c >> 12) & 0x0F) );
+                    byteArr[count++] = (unsigned char)( 0x80 | ( (c >> 6) & 0x3F) );
+                    byteArr[count++] = (unsigned char)( 0x80 | ( (c >> 0) & 0x3F) );
+                } else {
+                    byteArr[count++] = (unsigned char)( 0xC0 | ( (c >> 6) & 0x1F) );
+                    byteArr[count++] = (unsigned char)( 0x80 | ( (c >> 0) & 0x3F) );
+                }
+            }
+
+            dataOut.write( byteArr );
+        }
+        else
+        {
+            dataOut.writeShort( (short)-1 );
+        }
+    }
+    AMQ_CATCH_RETHROW( ActiveMQException )
+    AMQ_CATCHALL_THROW( ActiveMQException )        
+} 

Propchange: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/utils/OpenwireStringSupport.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/utils/OpenwireStringSupport.h
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/utils/OpenwireStringSupport.h?view=auto&rev=498194
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/utils/OpenwireStringSupport.h (added)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/utils/OpenwireStringSupport.h Sat Jan 20 14:16:05 2007
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ACTIVEMQ_CONNECTOR_OPENWIRE_UTILS_OPENWIRESTRINGSUPPORT_H_
+#define _ACTIVEMQ_CONNECTOR_OPENWIRE_UTILS_OPENWIRESTRINGSUPPORT_H_
+
+#include <string>
+#include <activemq/io/DataInputStream.h>
+#include <activemq/io/DataOutputStream.h>
+
+namespace activemq{
+namespace connector{
+namespace openwire{
+namespace utils{
+
+    class OpenwireStringSupport
+    {
+    protected:
+    
+        OpenwireStringSupport() {}
+        virtual ~OpenwireStringSupport() {}
+
+    public:
+    
+        /**
+         * Static method used for reading a string that uses the Openwire format
+         * from a DataInputStream, this can throw an IOException for the same
+         * reason as a DataInputStream.readUTF might, as well as if the string
+         * that is received doesn't conform to the supported charactor encoding.
+         * @param dataIn - DataInputStream to read from
+         * @returns A string that has been read
+         * @throws IOException on Errror.
+         */
+        static std::string readString( io::DataInputStream& dataIn )
+            throw ( io::IOException );
+
+        /**
+         * Static method used for writing a string that uses the Openwire format
+         * from a DataOutputStream, this can throw an IOException for the same
+         * reason as a DataOutputStream.writeUTF might.
+         * @param dataOut - DataOutputStream to write to
+         * @param str - A pointer to a string that should be written, NULL needs
+         *              to be an option here as its written as -1. 
+         * @throws IOException on Errror.
+         */
+        static void writeString( io::DataOutputStream& dataOut, 
+                                 const std::string* str )
+            throw ( io::IOException );
+
+    };
+
+}}}}
+
+#endif /*_ACTIVEMQ_CONNECTOR_OPENWIRE_UTILS_OPENWIRESTRINGSUPPORT_H_*/

Propchange: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/utils/OpenwireStringSupport.h
------------------------------------------------------------------------------
    svn:eol-style = native