Example #1
0
        public void Execute()
        {
            // Create lists of the properties that contribute to the special lists of properties.
            SortedSet <string> adminProperties  = new SortedSet <string>();
            SortedSet <string> secureProperties = new SortedSet <string>();
            SortedSet <string> hiddenProperties = new SortedSet <string>();

            foreach (var wixPropertyRow in this.Section.Tuples.OfType <WixPropertyTuple>())
            {
                if (wixPropertyRow.Admin)
                {
                    adminProperties.Add(wixPropertyRow.Property_);
                }

                if (wixPropertyRow.Hidden)
                {
                    hiddenProperties.Add(wixPropertyRow.Property_);
                }

                if (wixPropertyRow.Secure)
                {
                    secureProperties.Add(wixPropertyRow.Property_);
                }
            }

            if (0 < adminProperties.Count)
            {
                var tuple = new PropertyTuple(null, new Identifier("AdminProperties", AccessModifier.Private));
                tuple.Property = "AdminProperties";
                tuple.Value    = String.Join(";", adminProperties);

                this.Section.Tuples.Add(tuple);
            }

            if (0 < secureProperties.Count)
            {
                var tuple = new PropertyTuple(null, new Identifier("SecureCustomProperties", AccessModifier.Private));
                tuple.Property = "SecureCustomProperties";
                tuple.Value    = String.Join(";", secureProperties);

                this.Section.Tuples.Add(tuple);
            }

            if (0 < hiddenProperties.Count)
            {
                var tuple = new PropertyTuple(null, new Identifier("MsiHiddenProperties", AccessModifier.Private));
                tuple.Property = "MsiHiddenProperties";
                tuple.Value    = String.Join(";", hiddenProperties);

                this.Section.Tuples.Add(tuple);
            }
        }
Example #2
0
        private void AddPropertyTuple(PropertyTuple tuple, Output output)
        {
            if (String.IsNullOrEmpty(tuple.Value))
            {
                return;
            }

            var table = output.EnsureTable(this.TableDefinitions["Property"]);
            var row   = (PropertyRow)table.CreateRow(tuple.SourceLineNumbers);

            row.Property = tuple.Property;
            row.Value    = tuple.Value;
        }
        static void BuildSegmentProperty(TypeBuilder type, FieldInfo originalBytesField, FieldInfo trackerField, PropertyTuple property)
        {
            var prop = type.DefineProperty(property.PropertyInfo.Name, property.PropertyInfo.Attributes, property.PropertyInfo.PropertyType, Type.EmptyTypes);

            // build get
            var getMethod = property.PropertyInfo.GetGetMethod();

            if (getMethod != null)
            {
                var method = type.DefineMethod(getMethod.Name, getMethod.Attributes & ~MethodAttributes.NewSlot, getMethod.ReturnType, Type.EmptyTypes);

                var il = method.GetILGenerator();

                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldfld, property.SegmentField);
                il.Emit(OpCodes.Ret);

                prop.SetGetMethod(method);
            }

            // build set
            var setMethod = property.PropertyInfo.GetSetMethod();

            if (setMethod != null)
            {
                var method = type.DefineMethod(setMethod.Name, setMethod.Attributes & ~MethodAttributes.NewSlot, null, new[] { setMethod.GetParameters()[0].ParameterType });

                var il = method.GetILGenerator();

                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldfld, trackerField);
                il.Emit(OpCodes.Callvirt, Dirty);
                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldarg_1);
                il.Emit(OpCodes.Stfld, property.SegmentField);
                il.Emit(OpCodes.Ret);

                prop.SetSetMethod(method);
            }
        }
        static void BuildFixedProperty(TypeBuilder type, FieldInfo originalBytesField, FieldInfo trackerField, FieldInfo binaryLastIndex, FieldInfo extraBytes, PropertyTuple property)
        {
            var prop = type.DefineProperty(property.PropertyInfo.Name, property.PropertyInfo.Attributes, property.PropertyInfo.PropertyType, Type.EmptyTypes);

            // build get
            var getMethod = property.PropertyInfo.GetGetMethod();

            if (getMethod != null)
            {
                var method = type.DefineMethod(getMethod.Name, getMethod.Attributes & ~MethodAttributes.NewSlot, getMethod.ReturnType, Type.EmptyTypes);

                var il = method.GetILGenerator();

                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldfld, originalBytesField);
                il.Emit(OpCodes.Ldc_I4, property.Index);
                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldfld, binaryLastIndex);
                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldfld, extraBytes);
                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldfld, trackerField);
                il.Emit(OpCodes.Call, typeof(ObjectSegmentHelper).GetTypeInfo().GetMethod("GetFixedProperty").MakeGenericMethod(typeof(TTypeResolver), getMethod.ReturnType));
                il.Emit(OpCodes.Ret);

                prop.SetGetMethod(method);
            }

            // build set
            var setMethod = property.PropertyInfo.GetSetMethod();

            if (setMethod != null)
            {
                var method = type.DefineMethod(setMethod.Name, setMethod.Attributes & ~MethodAttributes.NewSlot, null, new[] { setMethod.GetParameters()[0].ParameterType });

                var il = method.GetILGenerator();

                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldfld, originalBytesField);
                il.Emit(OpCodes.Ldc_I4, property.Index);
                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldfld, binaryLastIndex);
                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldfld, extraBytes);
                il.Emit(OpCodes.Ldarg_1);
                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldfld, trackerField);
                il.Emit(OpCodes.Call, typeof(ObjectSegmentHelper).GetTypeInfo().GetMethod("SetFixedProperty").MakeGenericMethod(typeof(TTypeResolver), getMethod.ReturnType));
                il.Emit(OpCodes.Ret);

                prop.SetSetMethod(method);
            }
        }