示例#1
0
        /// <summary>
        /// Queries the list of objects for objects matching
        /// a descriptor query
        /// </summary>
        /// <param name="query">The query</param>
        /// <returns>The list of objects</returns>
        public List <ObjectInfo> QueryObjects(DescriptorQuery query)
        {
            List <ObjectInfo> ret = null;

            lock (_connectionLock)
                if (!_disposed)
                {
                    ret = _commands.QueryObjects.Execute(_registrar, query);
                }

            return(ret ?? new List <ObjectInfo>());
        }
示例#2
0
        /// <summary>
        /// Executes the command
        /// </summary>
        /// <param name="registrar">The registrar of descriptor types</param>
        /// <param name="query">The descriptor query</param>
        /// <returns>The descriptors that match the query</returns>
        public List <ObjectInfo> Execute(DescriptorRegistrar registrar, DescriptorQuery query)
        {
            List <ObjectInfo> ret = new List <ObjectInfo>();

            lock (this)
            {
                _deviceInstance.Value = query.DeviceInstance;
                _objectType.Value     = query.ObjectType;

                using (var reader = _command.ExecuteReader())
                {
                    int deviceInstanceOrdinal = reader.GetOrdinal("device_instance");
                    int objectTypeOrdinal     = reader.GetOrdinal("object_type");
                    int instanceOrdinal       = reader.GetOrdinal("instance");
                    int vendorIdOrdinal       = reader.GetOrdinal("vendor_id");
                    int nameOrdinal           = reader.GetOrdinal("name");
                    int propsOrdinal          = reader.GetOrdinal("props");

                    while (reader.Read())
                    {
                        uint   deviceInstance = (uint)reader.GetInt32(deviceInstanceOrdinal);
                        ushort objectType     = (ushort)reader.GetInt32(objectTypeOrdinal);
                        uint   instance       = (uint)reader.GetInt32(instanceOrdinal);
                        ushort vendorId       = (ushort)reader.GetInt32(vendorIdOrdinal);
                        string name           = reader.IsDBNull(nameOrdinal) ? null :  reader.GetString(nameOrdinal);

                        if (query.NameRegex == null || (name != null && Regex.IsMatch(name, query.NameRegex, RegexOptions.IgnoreCase)))
                        {
                            var info = registrar.CreateDescriptor(
                                vendorId,
                                deviceInstance,
                                new ObjectId(objectType, instance));
                            info.Name = name;

                            if (!reader.IsDBNull(propsOrdinal))
                            {
                                var props = reader.GetString(propsOrdinal);
                                info.LoadProperties(props);
                            }

                            ret.Add(info);
                        }
                    }
                }
            }

            return(ret);
        }
示例#3
0
        /// <summary>
        /// Subscribes to the network database
        /// </summary>
        /// <param name="observer">The obsever to subscribe</param>
        /// <returns>The disposable subscription instance</returns>
        public IDisposable Subscribe(DescriptorQuery query, IDescriptorObserver <ObjectInfo, GlobalObjectId> observer)
        {
            DescriptorSubscription ret = null;

            lock (_lock)
            {
                this._observers.Add(new DescriptorObserver(query, observer));
                ret = new DescriptorSubscription(this, observer);
            }

            Task.Factory.StartNew(() =>
            {
                lock (_lock)
                {
                    var descriptors = _db.QueryObjects(query);
                    observer.Add(descriptors);
                }
            });

            return(ret);
        }
示例#4
0
 public DescriptorObserver(DescriptorQuery query, IDescriptorObserver <ObjectInfo, GlobalObjectId> observer)
     : this()
 {
     this.Query    = query;
     this.Observer = observer;
 }