public virtual void ResolvePatch(FileRow fileRow, out bool retainRangeWarning) { if (fileRow == null) { throw new ArgumentNullException("fileRow"); } retainRangeWarning = false; if (this.deltaBinaryPatch && RowOperation.Modify == fileRow.Operation) { if (0 != (PatchAttributeType.IncludeWholeFile | fileRow.PatchAttributes)) { string deltaBase = Common.GenerateIdentifier("dlt", true, Common.GenerateGuid()); string deltaFile = Path.Combine(this.tempFilesLocation, String.Concat(deltaBase, ".dpf")); string headerFile = Path.Combine(this.tempFilesLocation, String.Concat(deltaBase, ".phd")); PatchAPI.PatchInterop.PatchSymbolFlagsType apiPatchingSymbolFlags = 0; bool optimizePatchSizeForLargeFiles = false; Table wixPatchIdTable = this.output.Tables["WixPatchId"]; if (null != wixPatchIdTable) { Row row = wixPatchIdTable.Rows[0]; if (null != row) { if (null != row[2]) { optimizePatchSizeForLargeFiles = (1 == Convert.ToUInt32(row[2], CultureInfo.InvariantCulture)); } if (null != row[3]) { apiPatchingSymbolFlags = (PatchAPI.PatchInterop.PatchSymbolFlagsType)Convert.ToUInt32(row[3], CultureInfo.InvariantCulture); } } } if (PatchAPI.PatchInterop.CreateDelta( deltaFile, fileRow.Source, fileRow.Symbols, fileRow.RetainOffsets, fileRow.PreviousSourceArray, fileRow.PreviousSymbolsArray, fileRow.PreviousIgnoreLengthsArray, fileRow.PreviousIgnoreOffsetsArray, fileRow.PreviousRetainLengthsArray, fileRow.PreviousRetainOffsetsArray, apiPatchingSymbolFlags, optimizePatchSizeForLargeFiles, out retainRangeWarning)) { PatchAPI.PatchInterop.ExtractDeltaHeader(deltaFile, headerFile); fileRow.Patch = headerFile; fileRow.Source = deltaFile; } } } }
public void Execute() { bool optimizePatchSizeForLargeFiles = false; PatchAPI.PatchInterop.PatchSymbolFlagsType apiPatchingSymbolFlags = 0; if (null != this.WixPatchIdTable) { Row row = this.WixPatchIdTable.Rows[0]; if (null != row) { if (null != row[2]) { optimizePatchSizeForLargeFiles = (1 == Convert.ToUInt32(row[2], CultureInfo.InvariantCulture)); } if (null != row[3]) { apiPatchingSymbolFlags = (PatchAPI.PatchInterop.PatchSymbolFlagsType)Convert.ToUInt32(row[3], CultureInfo.InvariantCulture); } } } foreach (FileFacade facade in this.FileFacades) { if (RowOperation.Modify == facade.File.Operation && 0 != (facade.WixFile.PatchAttributes & PatchAttributeType.IncludeWholeFile)) { string deltaBase = String.Concat("delta_", facade.File.File); string deltaFile = Path.Combine(this.TempFilesLocation, String.Concat(deltaBase, ".dpf")); string headerFile = Path.Combine(this.TempFilesLocation, String.Concat(deltaBase, ".phd")); bool retainRangeWarning = false; if (PatchAPI.PatchInterop.CreateDelta( deltaFile, facade.WixFile.Source, facade.DeltaPatchFile.Symbols, facade.DeltaPatchFile.RetainOffsets, new[] { facade.WixFile.PreviousSource }, facade.DeltaPatchFile.PreviousSymbols.Split(new[] { ';' }), facade.DeltaPatchFile.PreviousIgnoreLengths.Split(new[] { ';' }), facade.DeltaPatchFile.PreviousIgnoreOffsets.Split(new[] { ';' }), facade.DeltaPatchFile.PreviousRetainLengths.Split(new[] { ';' }), facade.DeltaPatchFile.PreviousRetainOffsets.Split(new[] { ';' }), apiPatchingSymbolFlags, optimizePatchSizeForLargeFiles, out retainRangeWarning)) { PatchAPI.PatchInterop.ExtractDeltaHeader(deltaFile, headerFile); facade.WixFile.Source = deltaFile; facade.WixFile.DeltaPatchHeaderSource = headerFile; } if (retainRangeWarning) { // TODO: get patch family to add to warning message for PatchWiz parity. Messaging.Instance.OnMessage(WixWarnings.RetainRangeMismatch(facade.File.SourceLineNumbers, facade.File.File)); } } } }