From 9f19cd09bfad13715bb4eda46e7782f56674e26c Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Fri, 29 Mar 2013 14:58:12 +0400 Subject: using PersistentImageCache for avatars --- Juick/Storage/ImageCache.cs | 160 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 Juick/Storage/ImageCache.cs (limited to 'Juick/Storage/ImageCache.cs') diff --git a/Juick/Storage/ImageCache.cs b/Juick/Storage/ImageCache.cs new file mode 100644 index 0000000..e45dc62 --- /dev/null +++ b/Juick/Storage/ImageCache.cs @@ -0,0 +1,160 @@ +// 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); + } + } +} -- cgit v1.2.3