// 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);
}
}
}