Exemplo n.º 1
0
        public object MapToIdlStruct(Type clsType)
        {
            lock (structTCs)
            {
                StructTC result = structTCs[clsType] as StructTC;
                if (result != null)
                {
                    return(result);
                }

                result = new StructTC();
                RegisterCreatedTypeCodeForType(clsType, AttributeExtCollection.EmptyCollection,
                                               result);

                FieldInfo[]    members       = ReflectionHelper.GetAllDeclaredInstanceFieldsOrdered(clsType);
                StructMember[] structMembers = new StructMember[members.Length];
                for (int i = 0; i < members.Length; i++)
                {
                    omg.org.CORBA.TypeCode memberType =
                        CreateOrGetTypeCodeForType(members[i].FieldType,
                                                   ReflectionHelper.GetCustomAttriutesForField(members[i],
                                                                                               true));
                    structMembers[i] = new StructMember(members[i].Name, memberType);
                }
                result.Initalize(Repository.GetRepositoryID(clsType),
                                 IdlNaming.ReverseIdlToClsNameMapping(clsType.Name),
                                 structMembers);

                structTCs[clsType] = result;

                return(result);
            }
        }
Exemplo n.º 2
0
        public object MapToIdlLocalInterface(Type clsType)
        {
            LocalIfTC result = new LocalIfTC(Repository.GetRepositoryID(clsType),
                                             IdlNaming.ReverseIdlToClsNameMapping(clsType.Name));

            RegisterCreatedTypeCodeForType(clsType, AttributeExtCollection.EmptyCollection,
                                           result);
            return(result);
        }
Exemplo n.º 3
0
        public object MapToIdlEnum(Type clsType)
        {
            string[] names  = Enum.GetNames(clsType);
            EnumTC   result = new EnumTC(Repository.GetRepositoryID(clsType),
                                         IdlNaming.ReverseIdlToClsNameMapping(clsType.Name),
                                         names);

            RegisterCreatedTypeCodeForType(clsType, AttributeExtCollection.EmptyCollection,
                                           result);
            return(result);
        }
Exemplo n.º 4
0
        private object MapToIdlBoxedValueType(Type clsType,
                                              bool boxInAny)
        {
            // dotNetType is subclass of BoxedValueBase
            if (!clsType.IsSubclassOf(ReflectionHelper.BoxedValueBaseType))
            {
                // mapper error: MapToIdlBoxedValue found incorrect type
                throw new INTERNAL(1929, CompletionStatus.Completed_MayBe);
            }
            Type boxedType;

            object[] attributesOnBoxed = new object[0];
            try {
                boxedType = (Type)clsType.InvokeMember(BoxedValueBase.GET_BOXED_TYPE_METHOD_NAME,
                                                       BindingFlags.InvokeMethod | BindingFlags.Public |
                                                       BindingFlags.NonPublic | BindingFlags.Static |
                                                       BindingFlags.DeclaredOnly,
                                                       null, null, new object[0]);

                attributesOnBoxed = (object[])clsType.InvokeMember(BoxedValueBase.GET_BOXED_TYPE_ATTRIBUTES_METHOD_NAME,
                                                                   BindingFlags.InvokeMethod | BindingFlags.Public |
                                                                   BindingFlags.NonPublic | BindingFlags.Static |
                                                                   BindingFlags.DeclaredOnly,
                                                                   null, null, new object[0]);
            }
            catch (Exception) {
                // invalid type: clsType
                // static method missing or not callable:
                // BoxedValueBase.GET_BOXED_TYPE_METHOD_NAME
                throw new INTERNAL(1930, CompletionStatus.Completed_MayBe);
            }
            if (boxInAny)
            {
                omg.org.CORBA.TypeCode boxed = CreateOrGetTypeCodeForType(boxedType,
                                                                          AttributeExtCollection.ConvertToAttributeCollection(attributesOnBoxed));

                ValueBoxTC result = new ValueBoxTC(Repository.GetRepositoryID(clsType),
                                                   IdlNaming.ReverseIdlToClsNameMapping(clsType.Name),
                                                   boxed);
                RegisterCreatedTypeCodeForType(clsType, AttributeExtCollection.EmptyCollection, result);
                return(result);
            }
            else
            {
                // don't use boxed form
                // therefore create a typecode for the type boxed inside
                // e.g. in case of a boxed sequence of int, there will be a idlsequence typecode with int as element type created.
                // e.g. in case, where a sequence of boxed valuetype is boxed, an idl sequence will be created containing a typecode
                // for the boxed type.
                omg.org.CORBA.TypeCodeImpl forBoxed = CreateOrGetTypeCodeForType(boxedType,
                                                                                 AttributeExtCollection.ConvertToAttributeCollection(attributesOnBoxed));
                return(forBoxed);
            }
        }
Exemplo n.º 5
0
        public object MapToIdlConcreteInterface(Type clsType)
        {
            ObjRefTC result;

            if (!clsType.Equals(ReflectionHelper.MarshalByRefObjectType))
            {
                result = new ObjRefTC(Repository.GetRepositoryID(clsType),
                                      IdlNaming.ReverseIdlToClsNameMapping(clsType.Name));
            }
            else
            {
                result = new ObjRefTC(String.Empty, String.Empty);
            }
            RegisterCreatedTypeCodeForType(clsType, AttributeExtCollection.EmptyCollection,
                                           result);
            return(result);
        }
Exemplo n.º 6
0
        public object MapToIdlConcreateValueType(Type clsType)
        {
            omg.org.CORBA.TypeCode baseTypeCode;
            if (clsType.BaseType.Equals(ReflectionHelper.ObjectType) ||
                clsType.BaseType.Equals(typeof(System.ComponentModel.MarshalByValueComponent)))
            {
                baseTypeCode = new NullTC();
            }
            else
            {
                baseTypeCode = CreateOrGetTypeCodeForType(clsType.BaseType,
                                                          AttributeExtCollection.EmptyCollection);
            }
            ValueTypeTC result = new ValueTypeTC();

            RegisterCreatedTypeCodeForType(clsType, AttributeExtCollection.EmptyCollection,
                                           result);

            // create the TypeCodes for the members
            FieldInfo[]   members      = ReflectionHelper.GetAllDeclaredInstanceFieldsOrdered(clsType);
            ValueMember[] valueMembers = new ValueMember[members.Length];
            for (int i = 0; i < members.Length; i++)
            {
                omg.org.CORBA.TypeCode memberType = CreateOrGetTypeCodeForType(members[i].FieldType,
                                                                               ReflectionHelper.GetCustomAttriutesForField(members[i],
                                                                                                                           true));
                short visibility;
                if (members[i].IsPrivate)
                {
                    visibility = VISIBILITY_PRIVATE;
                }
                else
                {
                    visibility = VISIBILITY_PUBLIC;
                }
                valueMembers[i] = new ValueMember(members[i].Name, memberType, visibility);
            }
            result.Initalize(Repository.GetRepositoryID(clsType),
                             IdlNaming.ReverseIdlToClsNameMapping(clsType.Name),
                             valueMembers, baseTypeCode, CONCRETE_VALUE_MOD);
            return(result);
        }
Exemplo n.º 7
0
        public object MapException(Type clsType)
        {
            // TODO: check this, generic user exception handling ...
            ExceptTC result = new ExceptTC();

            RegisterCreatedTypeCodeForType(clsType, AttributeExtCollection.EmptyCollection,
                                           result);

            FieldInfo[]    members   = ReflectionHelper.GetAllDeclaredInstanceFieldsOrdered(clsType);
            StructMember[] exMembers = new StructMember[members.Length];
            for (int i = 0; i < members.Length; i++)
            {
                omg.org.CORBA.TypeCode memberType = CreateOrGetTypeCodeForType(members[i].FieldType,
                                                                               ReflectionHelper.GetCustomAttriutesForField(members[i],
                                                                                                                           true));
                exMembers[i] = new StructMember(members[i].Name, memberType);
            }
            result.Initalize(Repository.GetRepositoryID(clsType),
                             IdlNaming.ReverseIdlToClsNameMapping(clsType.Name),
                             exMembers);
            return(result);
        }
Exemplo n.º 8
0
        public object MapToIdlAbstractValueType(Type clsType)
        {
            omg.org.CORBA.TypeCode baseTypeCode;
            if (clsType.BaseType.Equals(ReflectionHelper.ObjectType) ||
                clsType.BaseType.Equals(typeof(System.ComponentModel.MarshalByValueComponent)))
            {
                baseTypeCode = new NullTC();
            }
            else
            {
                baseTypeCode = CreateOrGetTypeCodeForType(clsType.BaseType,
                                                          AttributeExtCollection.EmptyCollection);
            }
            ValueTypeTC result = new ValueTypeTC();

            RegisterCreatedTypeCodeForType(clsType, AttributeExtCollection.EmptyCollection,
                                           result);
            result.Initalize(Repository.GetRepositoryID(clsType),
                             IdlNaming.ReverseIdlToClsNameMapping(clsType.Name),
                             new ValueMember[0],
                             baseTypeCode, ABSTRACT_VALUE_MOD);
            return(result);
        }
Exemplo n.º 9
0
        public object MapToIdlUnion(Type clsType)
        {
            UnionTC result = new UnionTC();

            RegisterCreatedTypeCodeForType(clsType, AttributeExtCollection.EmptyCollection,
                                           result);

            // first get discriminator type
            FieldInfo discriminator = clsType.GetField(UnionGenerationHelper.DISCR_FIELD_NAME,
                                                       BindingFlags.Instance |
                                                       BindingFlags.DeclaredOnly |
                                                       BindingFlags.NonPublic);

            omg.org.CORBA.TypeCode discrTypeCode =
                CreateOrGetTypeCodeForType(discriminator.FieldType,
                                           ReflectionHelper.GetCustomAttriutesForField(discriminator,
                                                                                       true));
            // get the methods used for typecode creation
            MethodInfo getCoveredDiscrMethod = clsType.GetMethod(UnionGenerationHelper.GET_COVERED_DISCR_VALUES,
                                                                 BindingFlags.Static | BindingFlags.NonPublic |
                                                                 BindingFlags.DeclaredOnly);
            MethodInfo getDefaultFieldMethod = clsType.GetMethod(UnionGenerationHelper.GET_DEFAULT_FIELD,
                                                                 BindingFlags.Static | BindingFlags.NonPublic |
                                                                 BindingFlags.DeclaredOnly);
            MethodInfo getFieldForDiscrVal = clsType.GetMethod(UnionGenerationHelper.GET_FIELD_FOR_DISCR_METHOD,
                                                               BindingFlags.Static | BindingFlags.NonPublic |
                                                               BindingFlags.DeclaredOnly);

            // get all discriminator values used in switch-cases
            object[] coveredDiscrs = (object[])getCoveredDiscrMethod.Invoke(null, new object[0]);
            if (coveredDiscrs == null)
            {
                throw new INTERNAL(898, CompletionStatus.Completed_MayBe);
            }

            FieldInfo defaultField = (FieldInfo)getDefaultFieldMethod.Invoke(null, new object[0]);

            UnionSwitchCase[] cases = null;
            int defaultCaseNumber   = -1; // no default case

            if (defaultField != null)
            {
                cases = new UnionSwitchCase[coveredDiscrs.Length + 1];
                omg.org.CORBA.TypeCode elemType =
                    CreateOrGetTypeCodeForType(defaultField.FieldType,
                                               ReflectionHelper.GetCustomAttriutesForField(defaultField,
                                                                                           true));
                // create a default value of type discriminiator type, because of possible discriminator types, this
                // is possible with Activator.CreateInstance ...
                object dummyValue = null;
                try {
                    dummyValue = Activator.CreateInstance(discriminator.FieldType);
                } catch (Exception) {
                    throw new MARSHAL(881, CompletionStatus.Completed_MayBe);
                }
                cases[coveredDiscrs.Length] = new UnionSwitchCase(dummyValue, defaultField.Name.Substring(2),
                                                                  elemType);
                defaultCaseNumber = coveredDiscrs.Length;
            }
            else
            {
                cases = new UnionSwitchCase[coveredDiscrs.Length];
            }

            // add a UnionSwitchCase to typecode for every discriminator value used
            for (int i = 0; i < coveredDiscrs.Length; i++)
            {
                FieldInfo caseField = (FieldInfo)getFieldForDiscrVal.Invoke(null, new object[] { coveredDiscrs[i] });
                if (caseField == null)
                {
                    throw new INTERNAL(898, CompletionStatus.Completed_MayBe);
                }
                omg.org.CORBA.TypeCode elemType =
                    CreateOrGetTypeCodeForType(caseField.FieldType,
                                               ReflectionHelper.GetCustomAttriutesForField(caseField, true));
                // extract name of element field: strip m_
                UnionSwitchCase switchCase = new UnionSwitchCase(coveredDiscrs[i], caseField.Name.Substring(2),
                                                                 elemType);
                cases[i] = switchCase;
            }
            result.Initalize(Repository.GetRepositoryID(clsType),
                             IdlNaming.ReverseIdlToClsNameMapping(clsType.Name),
                             discrTypeCode, defaultCaseNumber, cases);
            return(result);
        }