protected void UpdateTargetProperty(IList <MediaItem> items, MediaItemQueryMode queryMode) { IDataDescriptor targetDataDescriptor = _targetDataDescriptor; if (targetDataDescriptor == null) { return; } object result; //Try and update our target property with either a media item enumeration or the first media item if ((queryMode != MediaItemQueryMode.SingleItem && TypeConverter.Convert(items, targetDataDescriptor.DataType, out result)) || (queryMode != MediaItemQueryMode.MultipleItems && TypeConverter.Convert(items != null ? items.FirstOrDefault() : null, targetDataDescriptor.DataType, out result))) { lock (_syncObj) { //Avoid multiple updates with the same value if (ReferenceEquals(_lastUpdatedValue, result)) { return; } _lastUpdatedValue = result; } targetDataDescriptor.Value = result; } }
//Performs the actual query and updates the target property with the returned media item(s) protected void QueryMediaItems() { IFilter filter = Filter; if (filter == null) { //Set target property to null if invalid to remove any previously assigned media items UpdateTargetProperty(null, QueryMode); return; } IContentDirectory cd = ServiceRegistration.Get <IServerConnectionManager>().ContentDirectory; if (cd == null) { return; } MediaItemQueryMode queryMode = QueryMode; MediaItemQuery query = new MediaItemQuery(NecessaryRequestedMIAs, OptionalRequestedMIAs, filter); if (queryMode == MediaItemQueryMode.SingleItem) { query.Limit = 1; } IList <MediaItem> items = cd.Search(query, true, GetCurrentUserId(), false); UpdateTargetProperty(items, queryMode); }