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/19 21:42:11 UTC

svn commit: r497950 - in /incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/marshal: PrimitiveMapMarshaller.cpp PrimitiveMapMarshaller.h

Author: tabish
Date: Fri Jan 19 12:42:10 2007
New Revision: 497950

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

Modified:
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/marshal/PrimitiveMapMarshaller.cpp
    incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/marshal/PrimitiveMapMarshaller.h

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/marshal/PrimitiveMapMarshaller.cpp
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/marshal/PrimitiveMapMarshaller.cpp?view=diff&rev=497950&r1=497949&r2=497950
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/marshal/PrimitiveMapMarshaller.cpp (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/marshal/PrimitiveMapMarshaller.cpp Fri Jan 19 12:42:10 2007
@@ -23,45 +23,44 @@
 #include <activemq/io/DataOutputStream.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::marshal;
 
 ///////////////////////////////////////////////////////////////////////////////
-PrimitiveMapMarshaller::PrimitiveMapMarshaller()
-{
-}
-
-///////////////////////////////////////////////////////////////////////////////
-PrimitiveMapMarshaller::~PrimitiveMapMarshaller()
-{
-}
-
-///////////////////////////////////////////////////////////////////////////////
 void PrimitiveMapMarshaller::marshal( const util::PrimitiveMap* map, 
                                       std::vector<unsigned char>& dest ) 
                                         throw ( cms::CMSException ) 
 {
-//    ByteArrayOutputStream bytesOut( dest );
-//    DataOutputStream dataOut( &bytesOut );
-//
-//    if( map == NULL )
-//    {
-//        dataOut.writeInt( -1 );
-//    }
-//    else
-//    {
-//        dataOut.write( map.count() );
-//        
-//        foreach (DictionaryEntry entry in map)
-//        {
-//            std::string name = (std::string) entry.Key;
-//            dataOut.Write(name);
-//            Object value = entry.Value;
-//            MarshalPrimitive(dataOut, value);
-//    }
+    try {
 
+        ByteArrayOutputStream bytesOut( dest );
+        DataOutputStream dataOut( &bytesOut );
+    
+        if( map == NULL )
+        {
+            dataOut.writeInt( -1 );
+        }
+        else
+        {
+            dataOut.write( map->size() );
+            
+            std::vector<std::string> keys = map->getKeys();
+            std::vector<std::string>::const_iterator iter = keys.begin();
+            
+            for(; iter != keys.end(); ++iter ) {
+    
+                dataOut.writeChars( *iter );
+                PrimitiveMap::ValueNode value = map->getValue( *iter );
+                marshalPrimitive( &dataOut, value );
+            }
+        }
+    }
+    AMQ_CATCH_RETHROW( ActiveMQException )
+    AMQ_CATCHALL_THROW( ActiveMQException )        
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -69,83 +68,135 @@
     const std::vector<unsigned char>& src ) 
         throw ( cms::CMSException ) 
 {
-    return NULL;
-}
-
-/*
-
-
-        /// <summary>
-        /// Marshals the primitive type map to a byte array
-        /// </summary>
-        public static byte[] MarshalPrimitiveMap(IDictionary map)
-        {
-            if (map == null)
-            {
-                return null;
-            }
-            else
-            {
-                MemoryStream memoryStream = new MemoryStream();
-                MarshalPrimitiveMap(map, new OpenWireBinaryWriter(memoryStream));
-                return memoryStream.GetBuffer();
-            }
-        }
-        
-        public static void MarshalPrimitiveMap(IDictionary map, BinaryWriter dataOut)
-        {
-            if (map == null)
-            {
-                dataOut.Write((int)-1);
-            }
-            else
-            {
-                dataOut.Write(map.Count);
-                foreach (DictionaryEntry entry in map)
-                {
-                    String name = (String) entry.Key;
-                    dataOut.Write(name);
-                    Object value = entry.Value;
-                    MarshalPrimitive(dataOut, value);
-                }
-            }}
-        
+    try{
         
+        ByteArrayInputStream bytesIn( src );
+        DataInputStream dataIn( &bytesIn );
+    
+        int size = dataIn.readInt();
         
-        /// <summary>
-        /// Unmarshals the primitive type map from the given byte array
-        /// </summary>
-        public static  IDictionary UnmarshalPrimitiveMap(byte[] data)
+        if( size > 0 )
         {
-            if (data == null)
+            PrimitiveMap* map = new PrimitiveMap;
+    
+            for( int i=0; i < size; i++ )
             {
-                return new Hashtable();
-            }
-            else
-            {
-                return UnmarshalPrimitiveMap(new OpenWireBinaryReader(new MemoryStream(data)));
+                std::string key = dataIn.readString();
+                unmarshalPrimitive( &dataIn, key, *map );
             }
+    
+            return map;
         }
+    
+        return NULL;
+    
+    }
+    AMQ_CATCH_RETHROW( ActiveMQException )
+    AMQ_CATCHALL_THROW( ActiveMQException )
+}
+
+///////////////////////////////////////////////////////////////////////////////
+void PrimitiveMapMarshaller::marshalPrimitive( io::DataOutputStream* dataOut,
+                                               util::PrimitiveMap::ValueNode& value )
+                                                    throw ( cms::CMSException ) {
+
+    try {
         
-        public static  IDictionary UnmarshalPrimitiveMap(BinaryReader dataIn)
-        {
-            int size = dataIn.ReadInt32();
-            if (size < 0)
-            {
-                return null;
-            }
-            else
-            {
-                IDictionary answer = new Hashtable(size);
-                for (int i=0; i < size; i++)
-                {
-                    String name = dataIn.ReadString();
-                    answer[name] = UnmarshalPrimitive(dataIn);
-                }
-                return answer;
-            }
-            
-        }
+//        if( value is bool )
+//        {
+//            dataOut.writeByte( BOOLEAN_TYPE );
+//            dataOut.writeBoolean( value );
+//        }
+//        else if( value is byte )
+//        {
+//            dataOut.writeByte( BYTE_TYPE );
+//            dataOut.writeByte( value );
+//        }
+//        else if( value is char )
+//        {
+//            dataOut.writeByte( CHAR_TYPE );
+//            dataOut.writeChar( value );
+//        }
+//        else if( value is short )
+//        {
+//            dataOut.writeByte( SHORT_TYPE );
+//            dataOut.writeShort( value );
+//        }
+//        else if( value is int )
+//        {
+//            dataOut.writeByte( INTEGER_TYPE );
+//            dataOut.writeInt( value );
+//        }
+//        else if( value is long )
+//        {
+//            dataOut.writeByte( LONG_TYPE );
+//            dataOut.writeLong( value );
+//        }
+//        else if( value is float )
+//        {
+//            dataOut.writeByte( FLOAT_TYPE );
+//            dataOut.writeFloat( value );
+//        }
+//        else if( value is double )
+//        {
+//            dataOut.writeByte( DOUBLE_TYPE );
+//            dataOut.writeDouble( value );
+//        }
+//        else if( value is byte[] )
+//        {
+//            dataOut.writeByte( BYTE_ARRAY_TYPE );
+//            dataOut.writeInt( value.byeArrayValue.size() );
+//            dataOut.write( value.byeArrayValue );
+//        }
+//        else if( value is string )
+//        {
+//            // is the string big??
+//            if( value.stringValue.size() > 8191 )
+//            {
+//                dataOut.writeByte( BIG_STRING_TYPE );
+//                dataOut.writeChars( value.stringValue );
+//            }
+//            else
+//            {
+//                dataOut.writeByte( STRING_TYPE );
+//                dataOut.writeChars( value.stringValue );
+//            }
+//        }
+//        else if( value is IDictionary )
+//        {
+//            dataOut.Write( MAP_TYPE );
+//            MarshalPrimitiveMap((IDictionary) value, dataOut);
+//        }
+//        else if( value is IList )
+//        {
+//            dataOut.Write( LIST_TYPE );
+//            MarshalPrimitiveList((IList) value, dataOut);
+//        }
+//        else
+//        {
+//            throw IOException(
+//                __FILE__,
+//                __LINE__,
+//                "Object is not a primitive: ");
+//        }
+    }
+    AMQ_CATCH_RETHROW( ActiveMQException )
+    AMQ_CATCHALL_THROW( ActiveMQException )        
+}
+                                                    
+///////////////////////////////////////////////////////////////////////////////
+void PrimitiveMapMarshaller::unmarshalPrimitive( io::DataInputStream* dataIn,
+                                                 const std::string& key,
+                                                 util::PrimitiveMap& map )
+                                                    throw ( cms::CMSException ) {
+
+    try {
+    }
+    AMQ_CATCH_RETHROW( ActiveMQException )
+    AMQ_CATCHALL_THROW( ActiveMQException )        
+}
+
+/*
 
         public static void MarshalPrimitiveList(IList list, BinaryWriter dataOut)
         {

Modified: incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/marshal/PrimitiveMapMarshaller.h
URL: http://svn.apache.org/viewvc/incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/marshal/PrimitiveMapMarshaller.h?view=diff&rev=497950&r1=497949&r2=497950
==============================================================================
--- incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/marshal/PrimitiveMapMarshaller.h (original)
+++ incubator/activemq/activemq-cpp/trunk/activemq-cpp/src/main/activemq/connector/openwire/marshal/PrimitiveMapMarshaller.h Fri Jan 19 12:42:10 2007
@@ -19,6 +19,8 @@
 #define _ACTIVEMQ_CONNECTOR_OPENWIRE_MARSHAL_PRIMITIVEMAPMARSHALLER_H_
 
 #include <activemq/util/PrimitiveMap.h>
+#include <activemq/io/DataOutputStream.h>
+#include <activemq/io/DataInputStream.h>
 
 namespace activemq{
 namespace connector{
@@ -34,8 +36,8 @@
     {
     public:
     
-        PrimitiveMapMarshaller();
-        virtual ~PrimitiveMapMarshaller();
+        PrimitiveMapMarshaller() {}
+        virtual ~PrimitiveMapMarshaller() {}
         
         /**
          * Static Marshal of a primitive map object
@@ -54,7 +56,33 @@
          */
         static util::PrimitiveMap* unmarshal( const std::vector<unsigned char>& src ) 
             throw ( cms::CMSException );
-        
+    
+    protected:
+    
+        /**
+         * Used to Marshal the Primitive types that are contianed in the 
+         * map, out on the Wire.
+         * @param dataOut - the DataOutputStream to write to
+         * @param value - the ValueNode to write.
+         * @throws CMSException
+         */
+        static void marshalPrimitive( io::DataOutputStream* dataOut,
+                                      util::PrimitiveMap::ValueNode& value )
+                                        throw ( cms::CMSException );
+
+        /**
+         * Unmarshals a Primitive Type from the stream, and returns it as a
+         * value Node.
+         * @param dataIn - DataInputStream to read from.
+         * @param key - key where the element should be inserted
+         * @param map - Map to insert data into.
+         * @throws CMSException
+         */        
+        static void unmarshalPrimitive( io::DataInputStream* dataIn,
+                                        const std::string& key,
+                                        util::PrimitiveMap& map )
+                                            throw ( cms::CMSException );
+
     };
 
 }}}}