/// <summary> /// Loaded file from a cache to event arguments. /// </summary> /// <param name="fileName">File name.</param> /// <param name="callback">Callback which should be called to return tile if it is available or null.</param> public override void LoadAsync(string fileName, Action <byte[]> callback) { CacheRecord record = this.GetCacheRecord(fileName); byte[] tile = null; if (record == null) { ICacheRecordMetadata metaData = this.LoadFileMetadata(fileName); if (metaData != null && metaData.Expires >= DateTime.Now) { Stream stream = this.OpenCacheStream(fileName); if (stream.Length == 0) { stream.Dispose(); } else { AsyncStreamOperations.LoadAsync(stream, callback); return; } } } else { tile = record.TileBody; } callback(tile); }
private void CheckCacheSize() { while (this.maxSize > 0 && this.cacheSize >= this.maxSize && this.cacheMetadata.Count > 0) { ICacheRecordMetadata metadata = this.cacheMetadata[0]; this.RemoveFile(metadata.FileName); this.cacheMetadataDictionary.Remove(metadata.FileName); this.cacheMetadata.Remove(metadata); this.cacheSize -= metadata.FileStorageLength; } }
private Stream GetStorageStream(string fileName) { ICacheRecordMetadata metaData = this.LoadFileMetadata(fileName); if (metaData != null && metaData.Expires >= DateTime.Now) { Stream stream = this.OpenCacheStream(fileName); if (stream.Length == 0) { stream.Dispose(); return(null); } this.SaveFileMetadata(metaData); return(stream); } return(null); }
private int CompareMetadata(ICacheRecordMetadata a, ICacheRecordMetadata b) { DateTime now = DateTime.Now; if (a == null && b == null) { return(0); } if (a == null) { return(-1); } if (a == b) { return(0); } if (a.Expires < now && b.Expires < now) { return(0); } if (a.Expires < now) { return(-1); } if (b.Expires < now) { return(1); } if (a.LastAccess < b.LastAccess) { return(-1); } return(1); }
private void GetMetadata() { string[] files = this.GetFiles(this.threadSafetyCachePath, "*"); Regex fileNameRegex = new Regex(@"\\([^\\]+)$"); foreach (string file in files) { Match match = fileNameRegex.Match(file); if (match.Success) { ICacheRecordMetadata metadata = this.GetFileMetadataSafety(match.Groups[0].Value); if (metadata != null) { this.AddMetadata(metadata); } } } this.cacheMetadata.Sort(this.CompareMetadata); }
private void AddMetadata(ICacheRecordMetadata metadata) { this.cacheMetadataDictionary.Add(metadata.FileName, metadata); this.cacheMetadata.Add(metadata); this.cacheSize += metadata.FileStorageLength; }
/// <summary> /// Saves file metadata. /// </summary> /// <param name="cacheRecord">Cache record metadata.</param> protected abstract void SaveFileMetadata(ICacheRecordMetadata cacheRecord);