public static ReplacementModel ToReplacementModel(this Replacement replacement) { if (replacement == null) { return null; } ReplacementModel model = new ReplacementModel(); model.DeletedLength = replacement.DeletedLength; if (!String.IsNullOrEmpty(replacement.InsertedBytes)) { model.InsertedString = Encoding.UTF8.GetString(Convert.FromBase64String(replacement.InsertedBytes)); model.InsertedBytes = Encoding.UTF8.GetBytes(model.InsertedString); } model.Offset = replacement.Offset; return model; }
internal bool TryFixFile(string filePath, IEnumerable <ReplacementModel> replacements, bool isPreview, out byte[] fixedFile) { fixedFile = null; if (_fileSystem.FileExists(filePath)) { // Sort the replacements from top to bottom. var sortedReplacements = replacements.OrderBy(r => r.Offset); // Delete/Insert the bytes for each replacement. List <byte> bytes = _fileSystem.ReadAllBytes(filePath).ToList(); FixOffsetList list = null; string path = filePath.ToLower(); if (!s_sourceFileFixLedger.ContainsKey(path)) { // Create a new dictionary entry for this file list = new FixOffsetList(); s_sourceFileFixLedger.Add(path, list); } else { list = s_sourceFileFixLedger[path]; } // Sum all of the changes that have been made up to and including // the first replacement location ReplacementModel rm = sortedReplacements.First(); int delta = list.Offsets.Where(kvp => kvp.Key <= rm.Offset) .Sum(kvp => kvp.Value); foreach (ReplacementModel replacement in sortedReplacements) { int offset = replacement.Offset + delta; int thisDelta = 0; if (replacement.DeletedLength > 0) { bytes.RemoveRange(offset, replacement.DeletedLength); thisDelta -= replacement.DeletedLength; } if (replacement.InsertedBytes.Length > 0) { bytes.InsertRange(offset, replacement.InsertedBytes); thisDelta += replacement.InsertedBytes.Length; } // If it's a preview, don't record the offset changes if (!isPreview) { if (!list.Offsets.ContainsKey(replacement.Offset)) { // First change at this offset list.Offsets.Add(replacement.Offset, thisDelta); } else { // Add to previous change(s) at this location list.Offsets[replacement.Offset] += thisDelta; } } delta += thisDelta; } fixedFile = bytes.ToArray(); } return(fixedFile != null); }