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