コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }