namespace GMap.NET.Internals { using System; using System.Diagnostics; using System.IO; using System.Text; using GMap.NET.CacheProviders; internal class CacheLocator { private static string location; public static string Location { get { if(string.IsNullOrEmpty(location)) { Reset(); } return location; } set { if(string.IsNullOrEmpty(value)) // setting to null resets to default { Reset(); } else { location = value; } if(Delay) { Cache.Instance.CacheLocation = location; } } } static void Reset() { #if !PocketPC location = System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData) + Path.DirectorySeparatorChar + "GMap.NET" + Path.DirectorySeparatorChar; // http://greatmaps.codeplex.com/discussions/403151 if(string.IsNullOrEmpty(location)) { GMaps.Instance.Mode = AccessMode.ServerOnly; GMaps.Instance.UseDirectionsCache = false; GMaps.Instance.UseGeocoderCache = false; GMaps.Instance.UsePlacemarkCache = false; GMaps.Instance.UseRouteCache = false; GMaps.Instance.UseUrlCache = false; } #else location = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData) + Path.DirectorySeparatorChar + "GMap.NET" + Path.DirectorySeparatorChar; #endif } public static bool Delay = false; } /// /// cache system for tiles, geocoding, etc... /// internal class Cache : Singleton { /// /// abstract image cache /// public PureImageCache ImageCache; /// /// second level abstract image cache /// public PureImageCache ImageCacheSecond; string cache; /// /// local cache location /// public string CacheLocation { get { return cache; } set { cache = value; #if SQLite if(ImageCache is SQLitePureImageCache) { (ImageCache as SQLitePureImageCache).CacheLocation = value; } #else if(ImageCache is MsSQLCePureImageCache) { (ImageCache as MsSQLCePureImageCache).CacheLocation = value; } #endif CacheLocator.Delay = true; } } public Cache() { #region singleton check if(Instance != null) { throw (new System.Exception("You have tried to create a new singleton class where you should have instanced it. Replace your \"new class()\" with \"class.Instance\"")); } #endregion #if SQLite ImageCache = new SQLitePureImageCache(); #else // you can use $ms stuff if you like too ;} ImageCache = new MsSQLCePureImageCache(); #endif #if PocketPC // use sd card if exist for cache string sd = Native.GetRemovableStorageDirectory(); if(!string.IsNullOrEmpty(sd)) { CacheLocation = sd + Path.DirectorySeparatorChar + "GMap.NET" + Path.DirectorySeparatorChar; } else #endif { #if PocketPC CacheLocation = CacheLocator.Location; #else string newCache = CacheLocator.Location; string oldCache = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData) + Path.DirectorySeparatorChar + "GMap.NET" + Path.DirectorySeparatorChar; // move database to non-roaming user directory if(Directory.Exists(oldCache)) { try { if(Directory.Exists(newCache)) { Directory.Delete(oldCache, true); } else { Directory.Move(oldCache, newCache); } CacheLocation = newCache; } catch(Exception ex) { CacheLocation = oldCache; Trace.WriteLine("SQLitePureImageCache, moving data: " + ex.ToString()); } } else { CacheLocation = newCache; } #endif } } #region -- etc cache -- public void SaveContent(string urlEnd, CacheType type, string content) { try { Stuff.RemoveInvalidPathSymbols(ref urlEnd); string dir = Path.Combine(cache, type.ToString()) + Path.DirectorySeparatorChar; // precrete dir if(!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } string file = dir + urlEnd; switch(type) { case CacheType.GeocoderCache: file += ".geo"; break; case CacheType.PlacemarkCache: file += ".plc"; break; case CacheType.RouteCache: file += ".dragdir"; break; case CacheType.UrlCache: file += ".url"; break; case CacheType.DirectionsCache: file += ".dir"; break; default: file += ".txt"; break; } using(StreamWriter writer = new StreamWriter(file, false, Encoding.UTF8)) { writer.Write(content); } } catch(Exception ex) { Debug.WriteLine("SaveContent: " + ex); } } public string GetContent(string urlEnd, CacheType type, TimeSpan stayInCache) { string ret = null; try { Stuff.RemoveInvalidPathSymbols(ref urlEnd); string dir = Path.Combine(cache, type.ToString()) + Path.DirectorySeparatorChar; string file = dir + urlEnd; switch(type) { case CacheType.GeocoderCache: file += ".geo"; break; case CacheType.PlacemarkCache: file += ".plc"; break; case CacheType.RouteCache: file += ".dragdir"; break; case CacheType.UrlCache: file += ".url"; break; default: file += ".txt"; break; } if(File.Exists(file)) { var writeTime = File.GetLastWriteTime(file); if(DateTime.Now - writeTime < stayInCache) { using(StreamReader r = new StreamReader(file, Encoding.UTF8)) { ret = r.ReadToEnd(); } } } } catch(Exception ex) { ret = null; Debug.WriteLine("GetContent: " + ex); } return ret; } public string GetContent(string urlEnd, CacheType type) { return GetContent(urlEnd, type, TimeSpan.FromDays(88)); } #endregion } internal enum CacheType { GeocoderCache, PlacemarkCache, RouteCache, UrlCache, DirectionsCache, } }