private void CollectCommandAccessPointChanges(ICollection<AccessPoint> toAdd, ICollection<AccessPoint> toRemove)
{
// Build lists with current integration state
var currentMenuEntries = new List<MenuEntry>();
var currentDesktopIcons = new List<DesktopIcon>();
var currentSendTo = new List<SendTo>();
var currentAliases = new List<AppAlias>();
var currentAutoStarts = new List<AutoStart>();
if (AppEntry.AccessPoints != null)
{
new PerTypeDispatcher<AccessPoint>(ignoreMissing: true)
{
(Action<MenuEntry>)currentMenuEntries.Add,
(Action<DesktopIcon>)currentDesktopIcons.Add,
(Action<SendTo>)currentSendTo.Add,
(Action<AppAlias>)currentAliases.Add,
(Action<AutoStart>)currentAutoStarts.Add
}.Dispatch(AppEntry.AccessPoints.Entries);
}
// Remove incomplete entries
MenuEntries.RemoveAll(x => string.IsNullOrEmpty(x.Name));
DesktopIcons.RemoveAll(x => string.IsNullOrEmpty(x.Name));
SendTo.RemoveAll(x => string.IsNullOrEmpty(x.Name));
Aliases.RemoveAll(x => string.IsNullOrEmpty(x.Name));
AutoStarts.RemoveAll(x => string.IsNullOrEmpty(x.Name));
// Determine differences between current and desired state
Merge.TwoWay(theirs: MenuEntries, mine: currentMenuEntries, added: toAdd.Add, removed: toRemove.Add);
Merge.TwoWay(theirs: DesktopIcons, mine: currentDesktopIcons, added: toAdd.Add, removed: toRemove.Add);
Merge.TwoWay(theirs: SendTo, mine: currentSendTo, added: toAdd.Add, removed: toRemove.Add);
Merge.TwoWay(theirs: Aliases, mine: currentAliases, added: toAdd.Add, removed: toRemove.Add);
Merge.TwoWay(theirs: AutoStarts, mine: currentAutoStarts, added: toAdd.Add, removed: toRemove.Add);
}
}