// Copyright 2010 Andreas Saudemont (andreas.saudemont@gmail.com) // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. using System; using System.Windows; using System.Windows.Media; namespace Kawagoe.Storage { /// /// Defines the base clase for image cache implementations. /// public abstract class ImageCache { /// /// The name of the default image cache. /// public const string DefaultImageCacheName = "default"; private static ImageCache _defaultImageCache = null; private static object _defaultImageCacheLock = new object(); /// /// The default image cache. /// If not set explicitely, a instance is used by default. /// public static ImageCache Default { get { if (!Deployment.Current.Dispatcher.CheckAccess()) { throw new UnauthorizedAccessException("invalid cross-thread access"); } lock (_defaultImageCacheLock) { if (_defaultImageCache == null) { _defaultImageCache = new PersistentImageCache(DefaultImageCacheName); } return _defaultImageCache; } } set { if (!Deployment.Current.Dispatcher.CheckAccess()) { throw new UnauthorizedAccessException("invalid cross-thread access"); } lock (_defaultImageCacheLock) { _defaultImageCache = value; } } } /// /// Initializes a new instance. /// protected ImageCache(string name) { if (string.IsNullOrEmpty(name)) { throw new ArgumentException(); } Name = name; } /// /// The name of the image cache. /// protected string Name { get; private set; } /// /// Retrieves the source for the image with the specified URI from the cache, downloading it /// if needed. /// /// The URI of the image. Must be an absolute URI. /// An ImageSource object, or null if is null or not an absolute URI. /// The method is not called in the UI thread. public ImageSource Get(Uri imageUri) { if (!Deployment.Current.Dispatcher.CheckAccess()) { throw new UnauthorizedAccessException("invalid cross-thread access"); } if (imageUri == null || !imageUri.IsAbsoluteUri) { return null; } return GetInternal(imageUri); } /// /// Retrieves the source for the image with the specified URI from the cache, downloading it /// if needed. /// /// The URI of the image. Must be an absolute URI. /// An ImageSource object, or null if is null, /// the empty string, or not an absolute URI. /// The method is not called in the UI thread. public ImageSource Get(string imageUriString) { if (!Deployment.Current.Dispatcher.CheckAccess()) { throw new UnauthorizedAccessException("invalid cross-thread access"); } if (string.IsNullOrEmpty(imageUriString)) { return null; } Uri imageUri; try { imageUri = new Uri(imageUriString, UriKind.Absolute); } catch (Exception) { return null; } return Get(imageUri); } /// /// The actual implementation of . /// protected abstract ImageSource GetInternal(Uri imageUri); /// /// Deletes all the images from the cache. /// This method can block the current thread for a long time; it is advised to call it from /// a background thread. /// public abstract void Clear(); /// /// Overrides object.ToString(). /// /// public override string ToString() { return string.Format("ImageCache:{0}", Name); } } }