From a60a53d9424962845ae378602a85070852b6e877 Mon Sep 17 00:00:00 2001 From: Ricardo Marau Date: Fri, 1 Jun 2018 17:33:21 +0100 Subject: [PATCH 1/2] Refactor... Added _saveToCacheObject() to handle save to File. Splitting up _downloadFile functionality. --- lib/flutter_cache_manager.dart | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/lib/flutter_cache_manager.dart b/lib/flutter_cache_manager.dart index 551d9943..db78ba06 100644 --- a/lib/flutter_cache_manager.dart +++ b/lib/flutter_cache_manager.dart @@ -274,23 +274,30 @@ class CacheManager { } catch (e) {} if (response != null) { if (response.statusCode == 200) { + _saveToCacheObject(newCache, response.bodyBytes, response.headers); + } else if (response.statusCode == 304) { await newCache.setDataFromHeaders(response.headers); - - var filePath = await newCache.getFilePath(); - var folder = new File(filePath).parent; - if (!(await folder.exists())) { - folder.createSync(recursive: true); - } - await new File(filePath).writeAsBytes(response.bodyBytes); - - return newCache; - } - if (response.statusCode == 304) { - await newCache.setDataFromHeaders(response.headers); - return newCache; } + return newCache; } return null; } + void _saveToCacheObject(CacheObject newCache, List bodyBytes, + MaprHeaders) async { + + if (bodyBytes==null) + return; + + await newCache.setDataFromHeaders(rHeaders ?? new Map()); + + var filePath = await newCache.getFilePath(); + var folder = new File(filePath).parent; + if (!(await folder.exists())) { + folder.createSync(recursive: true); + } + + await new File(filePath).writeAsBytes(bodyBytes); + } + } From bea7531327f06abba6dfb507cb834e8f1a4318da Mon Sep 17 00:00:00 2001 From: Ricardo Marau Date: Fri, 1 Jun 2018 17:36:28 +0100 Subject: [PATCH 2/2] Added injectFile() to inject a file directly into the cache. --- lib/flutter_cache_manager.dart | 54 ++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/lib/flutter_cache_manager.dart b/lib/flutter_cache_manager.dart index db78ba06..dc607f65 100644 --- a/lib/flutter_cache_manager.dart +++ b/lib/flutter_cache_manager.dart @@ -257,6 +257,42 @@ class CacheManager { return new File(path); } + ///Injects file in filePath into the cache at position key = url + Future injectFile(String filePath, String url) async { + String log = "[Flutter Cache Manager] Injecting as $url"; + + if (!_cacheData.containsKey(url)) { + await synchronized(_lock, () { + if (!_cacheData.containsKey(url)) { + _cacheData[url] = new CacheObject(url); + } + }); + } + + var cacheObject = _cacheData[url]; + await synchronized(cacheObject.lock, () async { + + var newCacheData = await _mockedCacheData(filePath, url, cacheObject.lock); + + if (newCacheData != null) { + _cacheData[url] = newCacheData; + log = "$log\nInjecting file from $filePath."; + } + + }); + + //If non of the above is true, than we don't have to download anything. + _save(); + if (showDebugLogs) print(log); + + var path = await _cacheData[url].getFilePath(); + if (path == null) { + return null; + } + return new File(path); + } + + ///Download the file from the url Future _downloadFile( String url, Map headers, Object lock, @@ -283,6 +319,24 @@ class CacheManager { return null; } + + ///Creates a Cahe entry with a given file path + Future _mockedCacheData( + String filePath, + String url, Object lock, + {String relativePath}) async { + var newCache = new CacheObject(url, lock: lock); + newCache.setRelativePath(relativePath); + + List bodyBytes; + try { + bodyBytes = await new File(filePath).readAsBytes(); + } catch (e) {} + + _saveToCacheObject(newCache, bodyBytes, new Map()); + return newCache; + } + void _saveToCacheObject(CacheObject newCache, List bodyBytes, MaprHeaders) async {