public bool AddKey(string key, CallbackInfo updateCallback, CallbackInfo removeCallback) { lock (_interestedKeys) { if (!_interestedKeys.ContainsKey(key)) { _interestedKeys.Add(key, new NotificationEntry(updateCallback, removeCallback) { RegistrationTime = HPTime.Now }); return(true); } else { NotificationEntry entry = _interestedKeys[key]; entry.SetNotifications(updateCallback, removeCallback); _interestedKeys[key] = entry; } } return(false); }
public PollingResult GetChangedKeys(ILogger logger) { PollingResult result = new PollingResult(); HPTime newPollTime = HPTime.Now; lock (_interestedKeys) { IDictionaryEnumerator enumerator = _interestedKeys.GetEnumerator(); while (enumerator.MoveNext()) { string key = enumerator.Key as string; // add to result if clearkey exists in interest if (key.Equals(_clearKey)) { result.UpdatedKeys.Add(_clearKey); DecrementOrRemove(ref _updatedKeys, _clearKey); } NotificationEntry enntry = (NotificationEntry)enumerator.Value; if (enntry.NotifyOnUpdate) { if (_updatedKeys.ContainsKey(key)) { //change must be detected if a client had registered prior to change occured if (_updatedKeys[key].UpdatedTime.CompareTo(enntry.RegistrationTime) > 0 && _updatedKeys[key].UpdatedTime.CompareTo(_lastPollTime) >= 0) { if (_updatedKeys[key].UpdatedBy != null && string.Compare(_updatedKeys[key].UpdatedBy, _clientId, true) != 0) { result.UpdatedKeys.Add(key); } else if (_updatedKeys[key].UpdatedBy == null) { result.UpdatedKeys.Add(key); } DecrementOrRemove(ref _updatedKeys, key); } } } if (enntry.NotifyOnRemove) { if (_removedKeys.ContainsKey(key)) { //change must be detected if a client had registered prior to change occured if (_removedKeys[key].UpdatedTime.CompareTo(enntry.RegistrationTime) > 0 && _removedKeys[key].UpdatedTime.CompareTo(_lastPollTime) >= 0) { if (_removedKeys[key].UpdatedBy != null && string.Compare(_removedKeys[key].UpdatedBy, _clientId, true) != 0) { result.RemovedKeys.Add(key); } else if (_removedKeys[key].UpdatedBy == null) { result.RemovedKeys.Add(key); } DecrementOrRemove(ref _removedKeys, key); } } } } _lastPollTime = newPollTime; //Remove keys that are deleted from interestedKeys here foreach (string key in result.RemovedKeys) { _interestedKeys.Remove(key); } if (_interestedKeys.ContainsKey(_clearKey)) { _interestedKeys.Remove(_clearKey); } } return(result); }