protected internal virtual async Task updateFromWpAndYp(List <WPEntry> whitePages, Dictionary <string, List <YPEntry> > yellowPages) { // by default consider all known device as unplugged List <YDevice> toRemove = new List <YDevice>(_devices.Values); foreach (WPEntry wp in whitePages) { string serial = wp.SerialNumber; if (_devices.ContainsKey(serial)) { // already there YDevice currdev = _devices[serial]; if (!currdev.imm_getLogicalName().Equals(wp.LogicalName)) { // Reindex device from its own data await currdev.refresh(); _yctx._pushPlugEvent(YAPIContext.PlugEvent.Event.CHANGE, serial); } else if (currdev.imm_getBeacon() > 0 != wp.Beacon > 0) { await currdev.refresh(); } toRemove.Remove(currdev); } else { YDevice dev = new YDevice(this, wp, yellowPages); _yctx._yHash.imm_reindexDevice(dev); _devices[serial] = dev; _yctx._pushPlugEvent(YAPIContext.PlugEvent.Event.PLUG, serial); _yctx._Log("HUB: device " + serial + " has been plugged\n"); } } foreach (YDevice dev in toRemove) { string serial = dev.imm_getSerialNumber(); _yctx._pushPlugEvent(YAPIContext.PlugEvent.Event.UNPLUG, serial); _yctx._Log("HUB: device " + serial + " has been unplugged\n"); _devices.Remove(serial); } if (_hubSerialNumber == null) { foreach (WPEntry wp in whitePages) { if (wp.NetworkUrl.Equals("")) { _hubSerialNumber = wp.SerialNumber; } } } _yctx._yHash.imm_reindexYellowPages(yellowPages); }