0003-Add-a-default-repository.patch

S. Barut, 09/26/2018 04:31 PM

Download (9.54 KB)

View differences:

rsb-cil-test/Program.cs
79 79

  
80 80
			listener.Deactivate();
81 81

  
82
            Console.WriteLine("\nConverter test:");
83

  
84
            var defaultInConverters = buildConverterSelection(new List<Tuple<String, IConverter>> {
85
                new Tuple<string, IConverter>("ascii-string",                        new StringConverter(false)                        ),
86
                new Tuple<string, IConverter>("utf-8-string",                        new StringConverter(true)                         ),
87
                new Tuple<string, IConverter>("int32",                               new Int32Converter()                              ),
88
                new Tuple<string, IConverter>("int64",                               new Int64Converter()                              ),
89
                new Tuple<string, IConverter>("uint32",                              new UInt32Converter()                             ),
90
                new Tuple<string, IConverter>("uint64",                              new UInt64Converter()                             ),
91
                new Tuple<string, IConverter>("float",                               new FloatConverter()                              ),
92
                new Tuple<string, IConverter>("double",                              new DoubleConverter()                             ),
93
                new Tuple<string, IConverter>("bool",                                new BoolConverter()                               ),
94
                new Tuple<string, IConverter>("bytes",                               new ByteConverter()                               ),
95
                new Tuple<string, IConverter>("void",                                new NullConverter()                               ),
96
                new Tuple<string, IConverter>("." + JointAngles.Descriptor.FullName, new ProtocolBufferConverter(JointAngles.Descriptor))
97
            });
98

  
99
            var defaultOutConverters = buildConverterSelection(new List<Tuple<Type, IConverter>> {
100
                new Tuple<Type, IConverter>(typeof(string),                          new StringConverter(true)                         ),
101
                new Tuple<Type, IConverter>(typeof(int),                             new Int32Converter()                              ),
102
                new Tuple<Type, IConverter>(typeof(long),                            new Int64Converter()                              ),
103
                new Tuple<Type, IConverter>(typeof(uint),                            new UInt32Converter()                             ),
104
                new Tuple<Type, IConverter>(typeof(ulong),                           new UInt64Converter()                             ),
105
                new Tuple<Type, IConverter>(typeof(float),                           new FloatConverter()                              ),
106
                new Tuple<Type, IConverter>(typeof(double),                          new DoubleConverter()                             ),
107
                new Tuple<Type, IConverter>(typeof(bool),                            new BoolConverter()                               ),
108
                new Tuple<Type, IConverter>(typeof(byte[]),                          new ByteConverter()                               ),
109
                new Tuple<Type, IConverter>(typeof(Null),                            new NullConverter()                               ),
110
                new Tuple<Type, IConverter>(typeof(JointAngles),                     new ProtocolBufferConverter(JointAngles.Descriptor))
111
            });
112

  
113
            Informer repoInformer = new Informer("/test/repo", new OutConnector(new BusClientConnection(host, port), defaultOutConverters));
114
            Listener repoListener = new Listener(new InPushConnector(new BusClientConnection(host, port), new Scope("/"), defaultInConverters));
82
            Console.WriteLine("\nRepository test:");
83

  
84
            DefaultConverterRepository.Instance.addConverter(new ProtocolBufferConverter(JointAngles.Descriptor));
85

  
86
            Informer repoInformer = new Informer("/test/repo", new OutConnector(new BusClientConnection(host, port), DefaultConverterRepository.Instance.SerializationConverterSelector));
87
            Listener repoListener = new Listener(new InPushConnector(new BusClientConnection(host, port), new Scope("/"), DefaultConverterRepository.Instance.DeserializationConverterSelector));
115 88
            repoListener.EventReceived += (e) => {
116 89
                Console.WriteLine("Event: {0}\nData: {1}", e, e.Data);
117 90
            };
rsb-cil/Rsb/Converter/DefaultConverterRepository.cs
1
using System;
2
using System.Collections.Generic;
3

  
4
namespace Rsb.Converter
5
{
6
    public class DefaultConverterRepository
7
    {
8
        private static readonly DefaultConverterRepository instance = new DefaultConverterRepository();
9

  
10
        private List<Tuple<PredicateConverterSelection<string>.Predicate, IConverter>> deserializationConverterList = new List<Tuple<PredicateConverterSelection<string>.Predicate, IConverter>>();
11
        public PredicateConverterSelection<string> DeserializationConverterSelector { get; private set; }
12

  
13
        private List<Tuple<PredicateConverterSelection<Type>.Predicate, IConverter>> serializationConverterList = new List<Tuple<PredicateConverterSelection<Type>.Predicate, IConverter>>();
14
        public PredicateConverterSelection<Type> SerializationConverterSelector { get; private set; }
15

  
16
        private readonly IConverter[] defaultConverter = {
17
                new NullConverter(),
18
                new DoubleConverter(),
19
                new FloatConverter(),
20
                new Int32Converter(),
21
                new Int64Converter(),
22
                new UInt32Converter(),
23
                new UInt64Converter(),
24
                new BoolConverter(),
25
                new StringConverter(false),
26
                new StringConverter(),
27
                new ByteConverter(),
28
                //new ScopeConverter()
29
            };
30
        
31
        // Explicit static constructor to tell C# compiler
32
        // not to mark type as beforefieldinit
33
        static DefaultConverterRepository()
34
        {
35
        }
36

  
37
        private DefaultConverterRepository()
38
        {
39

  
40
            foreach (var converter in defaultConverter) {
41
                ConverterSignature signature = converter.GetSignature();
42

  
43
                deserializationConverterList.Add(
44
                    new Tuple<PredicateConverterSelection<string>.Predicate, IConverter>(
45
                        new IsExactMatch<string>(signature.Schema),
46
                        converter
47
                        ));
48
                
49
                // this will add a second string converter in the informer list.
50
                // I assume the first one wins and i don't think, that this is intended. Checks and Exceptions should be added at sometime
51
                
52
                serializationConverterList.Add(
53
                    new Tuple<PredicateConverterSelection<Type>.Predicate, IConverter>(
54
                        new IsExactMatch<Type>(signature.DataType),
55
                        converter
56
                        ));
57
            }
58

  
59
            DeserializationConverterSelector = new PredicateConverterSelection<string>(deserializationConverterList);
60
            SerializationConverterSelector = new PredicateConverterSelection<Type>(serializationConverterList);
61
            
62
        }
63

  
64
        public static DefaultConverterRepository Instance
65
        {
66
            get
67
            {
68
                return instance;
69
            }
70
        }
71

  
72
        public void addConverter(IConverter converter) {
73
            deserializationConverterList.Add(
74
                    new Tuple<PredicateConverterSelection<string>.Predicate, IConverter>(
75
                        new IsExactMatch<string>(converter.GetSignature().Schema),
76
                        converter
77
                        ));
78
            serializationConverterList.Add(
79
                    new Tuple<PredicateConverterSelection<Type>.Predicate, IConverter>(
80
                        new IsExactMatch<Type>(converter.GetSignature().DataType),
81
                        converter
82
                        ));
83
        }
84
    }
85
}
rsb-cil/rsb-cil.csproj
42 42
    <Compile Include="Properties\AssemblyInfo.cs" />
43 43
    <Compile Include="Rsb\Converter\ByteConverter.cs" />
44 44
    <Compile Include="Rsb\Converter\ConverterSignature.cs" />
45
	<Compile Include="Rsb\Converter\DefaultConverterRepository.cs" />
45 46
    <Compile Include="Rsb\Converter\DoubleConverter.cs" />
46 47
    <Compile Include="Rsb\Converter\FloatConverter.cs" />
47 48
    <Compile Include="Rsb\Converter\Int32Converter.cs" />
48
-