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