/// <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>()); }
/// <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); }
/// <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); }
public DescriptorObserver(DescriptorQuery query, IDescriptorObserver <ObjectInfo, GlobalObjectId> observer) : this() { this.Query = query; this.Observer = observer; }