Subversion Repository Public Repository

WOX2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
using System;
using System.Collections;
using System.Reflection;

/// <header>
/// <wox>
///     <version>1.0</version>
///     <author>Carlos R. Jaimez Gonzalez</author>
///     <author>Simon M. Lucas</author>
///     <site>http://woxserializer.sourceforge.net/</site>
/// </wox>
/// <wox>
///     <version>1.5</version>
///     <author>Steven M Lewis</author>
/// </wox>
/// <wox>
///     <version>2.0</version>
///     <author>George A Smith</author>
///     <svn>http://woxserializer.sourceforge.net/</svn>
///     <note>XML form for vs 2 is more compact and therefor incompatible with vs 1</note>
/// </wox>
/// </header>

namespace wox.serial
{
    public class MapHandler : AbstractHandler, WoxGenericsHandler
    {
        public static readonly MapHandler INSTANCE = new MapHandler();

        public const String WOX_TYPE = "map";

        private const string GENERIC_WOX_TYPE_NAME_STARTS_WITH = WOX_TYPE + "<";

        private const string GENERIC_NATIVE_TYPE_NAME_STARTS_WITH = "System.Collections.Generic.Dictionary";

        private static readonly string NON_GENERIC_NATIVE_TYPE_NAME = typeof (Hashtable).ToString();

        protected MapHandler()
        {
        }

        #region WoxStartsWithHandler Members

        public bool IsFor( string pTypeName )
        {
            return NON_GENERIC_NATIVE_TYPE_NAME.Equals( pTypeName ) || //
                   pTypeName.StartsWith( GENERIC_NATIVE_TYPE_NAME_STARTS_WITH );
        }

        public string GetGenericsNativeBaseTypeFor( WoxHandlers pWoxHandlers, string pWoxBaseType )
        {
            return GenericsBaseTypeFor( pWoxBaseType, "Wox", WOX_TYPE, "Native", GENERIC_NATIVE_TYPE_NAME_STARTS_WITH );
        }

        public string GetGenericsWoxBaseTypeFor( WoxHandlers pWoxHandlers, string pNativeBaseType )
        {
            return GenericsBaseTypeFor( pNativeBaseType, "Native", GENERIC_NATIVE_TYPE_NAME_STARTS_WITH, "Wox", WOX_TYPE );
        }

        public override string[] GetForReadObjectWoxTypeNames()
        {
            return null; // Ask Us
        }

        public override Type GetNativeTypeFor( WoxHandlers pWoxHandlers, string pWoxType )
        {
            if ( WOX_TYPE.Equals( pWoxType ) )
            {
                return typeof (Hashtable);
            }
            if ( pWoxType.StartsWith( GENERIC_WOX_TYPE_NAME_STARTS_WITH ) )
            {
                Type zType = CommonNativeType( pWoxHandlers, pWoxType );
                if ( zType != null )
                {
                    return zType;
                }
            }
            throw new ApplicationException( "No Native Type for Wox Type: " + pWoxType );
        }

        public override string GetWoxTypeFor( WoxHandlers pWoxHandlers, Type pType, FieldInfo pField, bool pJustType )
        {
            if ( typeof (Hashtable).Equals( pType ) )
            {
                return WOX_TYPE;
            }
            if ( pType.ToString().StartsWith( GENERIC_NATIVE_TYPE_NAME_STARTS_WITH ) )
            {
                return CommonWoxType( pWoxHandlers, pType, pField, pJustType );
            }
            throw new ApplicationException( "No Wox Type for Native Type: " + pType );
        }

        public override bool WillReadObjectForWoxType( string pWoxType )
        {
            return WOX_TYPE.Equals( pWoxType ) || pWoxType.StartsWith( GENERIC_WOX_TYPE_NAME_STARTS_WITH );
        }

        public override object ReadObject( WoxHandlers pWoxHandlers, WoxReader pWoxReader, XMLreader pReader )
        {
            XMLreader zSubtree = pReader.CreateSubtreeReader();
            zSubtree.ReadStartElement(); //position the cursor to our element

            try
            {
                string zWoxTypeName = zSubtree.GetAttribute( Serial.TYPE );

                Type zNativeType = GetNativeTypeFor( pWoxHandlers, zWoxTypeName );

                object zDictionary = Util.CreateInstance( zNativeType, zWoxTypeName );

                MethodInfo zMethodInfo = zDictionary.GetType().GetMethod( "Add" );

                while ( zSubtree.ReadStartElement() )
                {
                    // currently at the "entry"
                    //position the cursor in the KEY object
                    zSubtree.ReadStartElement();
                    Object zKey = pWoxReader.Read( zSubtree );

                    //position the cursor in the VALUE object
                    zSubtree.ReadStartElement();
                    Object zValue = pWoxReader.Read( zSubtree );

                    //Add the key and the value to the Dictionary
                    Object[] args = {zKey, zValue};
                    zMethodInfo.Invoke( zDictionary, args );
                }

                return zDictionary;
            }
            catch ( Exception e )
            {
                throw new ApplicationException( "Map Handler Read Object Exception is: " + e.Message, e );
            }
            finally
            {
                Consume( zSubtree );
            }
        }

        public override void WriteObject( WoxHandlers pWoxHandlers, WoxWriter pWoxWriter, object pObject, FieldInfo pField, XMLwriter pWriter,
                                          bool pJustType )
        {
            Type zType = pObject.GetType();
            string zWoxTypeName = CommonWoxType( pWoxHandlers, zType, pField, pJustType );

            pWriter.WriteStartElement( Serial.OBJECT );
            pWriter.WriteAttributeString( Serial.TYPE, zWoxTypeName );

            //we already know it is either a Generic Dictionary or a Hashtable, so, we can simply Enumerate over the entries.
            MethodInfo zMethodInfo = zType.GetMethod( "GetEnumerator" );
            IDictionaryEnumerator zEnumerator = (IDictionaryEnumerator) zMethodInfo.Invoke( pObject, null ); // null == NO Params

            if ( zEnumerator.MoveNext() )
            {
                pWriter.WriteAttributeString( Serial.ID, pWoxWriter.CreateIDfor( pObject ) );

                do
                {
                    pWriter.WriteStartElement( Serial.OBJECT );
                    pWriter.WriteAttributeString( Serial.TYPE, Serial.MAP_ENTRY );
                    pWoxWriter.Write( zEnumerator.Key, pField, pWriter, pJustType );
                    pWoxWriter.Write( zEnumerator.Value, pField, pWriter, pJustType );
                    pWriter.WriteEndElement();
                }
                while ( zEnumerator.MoveNext() );
            }

            pWriter.WriteEndElement();
        }

        #endregion
    }
}

Commits for WOX2/trunk/CSharp/src/wox/serial/MapHandler.cs

Diff revisions: vs.
Revision Author Commited Message
14 Diff Diff GeorgeS picture GeorgeS Fri 19 Feb, 2010 19:15:03 +0000
5 Diff Diff GeorgeS picture GeorgeS Fri 05 Feb, 2010 18:59:04 +0000
4 Diff Diff GeorgeS picture GeorgeS Fri 05 Feb, 2010 18:15:55 +0000
3 GeorgeS picture GeorgeS Thu 04 Feb, 2010 23:53:47 +0000