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); } }
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); } }