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