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;
                    }
                }
            }
        }
Esempio n. 2
0
        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));
                    }
                }
            }
        }