| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef WEBKIT_APPCACHE_APPCACHE_SERVICE_H_ | 5 #ifndef WEBKIT_APPCACHE_APPCACHE_SERVICE_H_ |
| 6 #define WEBKIT_APPCACHE_APPCACHE_SERVICE_H_ | 6 #define WEBKIT_APPCACHE_APPCACHE_SERVICE_H_ |
| 7 | 7 |
| 8 #include <map> | 8 #include <map> |
| 9 #include <set> | 9 #include <set> |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| 12 #include "base/hash_tables.h" | 12 #include "base/hash_tables.h" |
| 13 #include "base/file_path.h" | 13 #include "base/file_path.h" |
| 14 #include "base/ref_counted.h" | 14 #include "base/ref_counted.h" |
| 15 #include "base/task.h" |
| 15 #include "net/url_request/url_request_context.h" | 16 #include "net/url_request/url_request_context.h" |
| 16 #include "googleurl/src/gurl.h" | 17 #include "googleurl/src/gurl.h" |
| 17 | 18 |
| 18 namespace appcache { | 19 namespace appcache { |
| 19 | 20 |
| 20 class AppCache; | 21 class AppCache; |
| 21 class AppCacheBackendImpl; | 22 class AppCacheBackendImpl; |
| 22 class AppCacheGroup; | 23 class AppCacheGroup; |
| 23 | 24 |
| 24 // Class that manages the application cache service. Sends notifications | 25 // Class that manages the application cache service. Sends notifications |
| 25 // to many frontends. One instance per user-profile. Each instance has | 26 // to many frontends. One instance per user-profile. Each instance has |
| 26 // exclusive access to it's cache_directory on disk. | 27 // exclusive access to it's cache_directory on disk. |
| 27 class AppCacheService { | 28 class AppCacheService { |
| 28 public: | 29 public: |
| 30 |
| 31 class LoadClient { |
| 32 public: |
| 33 virtual ~LoadClient() {} |
| 34 |
| 35 // If a load fails the object pointer will be NULL. |
| 36 virtual void CacheLoadedCallback(AppCache* cache, int64 cache_id) = 0; |
| 37 virtual void GroupLoadedCallback(AppCacheGroup* cache, |
| 38 const GURL& manifest_url) = 0; |
| 39 }; |
| 40 |
| 29 AppCacheService(); | 41 AppCacheService(); |
| 30 virtual ~AppCacheService(); | 42 virtual ~AppCacheService(); |
| 31 | 43 |
| 32 void Initialize(const FilePath& cache_directory); | 44 void Initialize(const FilePath& cache_directory); |
| 33 | 45 |
| 34 // Context for use during cache updates, should only be accessed | 46 // Context for use during cache updates, should only be accessed |
| 35 // on the IO thread. | 47 // on the IO thread. |
| 36 URLRequestContext* request_context() { return request_context_.get(); } | 48 URLRequestContext* request_context() { return request_context_.get(); } |
| 37 void set_request_context(URLRequestContext* context) { | 49 void set_request_context(URLRequestContext* context) { |
| 38 // TODO(michaeln): need to look into test failures that occur | 50 // TODO(michaeln): need to look into test failures that occur |
| 39 // when we take this reference? Stubbing out for now. | 51 // when we take this reference? Stubbing out for now. |
| 40 // request_context_ = context; | 52 // request_context_ = context; |
| 41 } | 53 } |
| 42 | 54 |
| 43 // TODO(jennb): API to set service settings, like file paths for storage | 55 // TODO(jennb): API to set service settings, like file paths for storage |
| 44 | 56 |
| 45 // track which processes are using this appcache service | 57 // Track which processes are using this appcache service. |
| 46 void RegisterBackend(AppCacheBackendImpl* backend_impl); | 58 void RegisterBackend(AppCacheBackendImpl* backend_impl); |
| 47 void UnregisterBackend(AppCacheBackendImpl* backend_impl); | 59 void UnregisterBackend(AppCacheBackendImpl* backend_impl); |
| 48 | |
| 49 void AddCache(AppCache* cache); | |
| 50 void RemoveCache(AppCache* cache); | |
| 51 void AddGroup(AppCacheGroup* group); | |
| 52 void RemoveGroup(AppCacheGroup* group); | |
| 53 | |
| 54 AppCacheBackendImpl* GetBackend(int id) { | 60 AppCacheBackendImpl* GetBackend(int id) { |
| 55 BackendMap::iterator it = backends_.find(id); | 61 BackendMap::iterator it = backends_.find(id); |
| 56 return (it != backends_.end()) ? it->second : NULL; | 62 return (it != backends_.end()) ? it->second : NULL; |
| 57 } | 63 } |
| 58 | 64 |
| 65 // Track what we have in or in-memory cache. |
| 66 void AddCache(AppCache* cache); |
| 67 void RemoveCache(AppCache* cache); |
| 68 void AddGroup(AppCacheGroup* group); |
| 69 void RemoveGroup(AppCacheGroup* group); |
| 59 AppCache* GetCache(int64 id) { | 70 AppCache* GetCache(int64 id) { |
| 60 CacheMap::iterator it = caches_.find(id); | 71 CacheMap::iterator it = caches_.find(id); |
| 61 return (it != caches_.end()) ? it->second : NULL; | 72 return (it != caches_.end()) ? it->second : NULL; |
| 62 } | 73 } |
| 63 | |
| 64 AppCacheGroup* GetGroup(const GURL& manifest_url) { | 74 AppCacheGroup* GetGroup(const GURL& manifest_url) { |
| 65 GroupMap::iterator it = groups_.find(manifest_url); | 75 GroupMap::iterator it = groups_.find(manifest_url); |
| 66 return (it != groups_.end()) ? it->second : NULL; | 76 return (it != groups_.end()) ? it->second : NULL; |
| 67 } | 77 } |
| 68 | 78 |
| 79 // Load caches and groups from storage. If the request object |
| 80 // is already in memory, the client is called immediately |
| 81 // without returning to the message loop. |
| 82 void LoadCache(int64 id, LoadClient* client); |
| 83 void LoadOrCreateGroup(const GURL& manifest_url, |
| 84 LoadClient* client); |
| 85 |
| 86 // Cancels pending callbacks for this client. |
| 87 void CancelLoads(LoadClient* client); |
| 88 |
| 89 // Updates in memory and persistent storage. |
| 90 void MarkAsForeignEntry(const GURL& entry_url, int64 cache_id); |
| 91 |
| 69 // The service generates unique storage ids for different object types. | 92 // The service generates unique storage ids for different object types. |
| 70 int64 NewCacheId() { return ++last_cache_id_; } | 93 int64 NewCacheId() { return ++last_cache_id_; } |
| 71 int64 NewGroupId() { return ++last_group_id_; } | 94 int64 NewGroupId() { return ++last_group_id_; } |
| 72 int64 NewEntryId() { return ++last_entry_id_; } | 95 int64 NewEntryId() { return ++last_entry_id_; } |
| 73 int64 NewResponseId() { return ++last_response_id_; } | 96 int64 NewResponseId() { return ++last_response_id_; } |
| 74 | 97 |
| 75 private: | 98 private: |
| 76 // In-memory representation of stored appcache data. Represents a subset | 99 // In-memory representation of stored appcache data. Represents a subset |
| 77 // of the appcache database currently in use. | 100 // of the appcache database currently in use. |
| 78 typedef base::hash_map<int64, AppCache*> CacheMap; | 101 typedef base::hash_map<int64, AppCache*> CacheMap; |
| 79 typedef std::map<GURL, AppCacheGroup*> GroupMap; | 102 typedef std::map<GURL, AppCacheGroup*> GroupMap; |
| 80 CacheMap caches_; | 103 CacheMap caches_; |
| 81 GroupMap groups_; | 104 GroupMap groups_; |
| 82 | 105 |
| 83 // The last storage id used for different object types. | 106 // The last storage id used for different object types. |
| 84 int64 last_cache_id_; | 107 int64 last_cache_id_; |
| 85 int64 last_group_id_; | 108 int64 last_group_id_; |
| 86 int64 last_entry_id_; | 109 int64 last_entry_id_; |
| 87 int64 last_response_id_; | 110 int64 last_response_id_; |
| 88 | 111 |
| 89 // Track current processes. One 'backend' per child process. | 112 // Track current processes. One 'backend' per child process. |
| 90 typedef std::map<int, AppCacheBackendImpl*> BackendMap; | 113 typedef std::map<int, AppCacheBackendImpl*> BackendMap; |
| 91 BackendMap backends_; | 114 BackendMap backends_; |
| 92 | 115 |
| 116 // Where we save our data. |
| 93 FilePath cache_directory_; | 117 FilePath cache_directory_; |
| 94 | 118 |
| 95 // Context for use during cache updates. | 119 // Context for use during cache updates. |
| 96 scoped_refptr<URLRequestContext> request_context_; | 120 scoped_refptr<URLRequestContext> request_context_; |
| 97 | 121 |
| 98 // TODO(jennb): info about appcache storage | 122 // TODO(michaeln): cache and group loading book keeping. |
| 99 // AppCacheDatabase db_; | 123 // TODO(michaeln): database and response storage |
| 100 // DiskCache response_storage_; | |
| 101 | |
| 102 // TODO(jennb): service state: e.g. reached quota? | 124 // TODO(jennb): service state: e.g. reached quota? |
| 103 }; | 125 }; |
| 104 | 126 |
| 105 } // namespace appcache | 127 } // namespace appcache |
| 106 | 128 |
| 107 #endif // WEBKIT_APPCACHE_APPCACHE_SERVICE_H_ | 129 #endif // WEBKIT_APPCACHE_APPCACHE_SERVICE_H_ |
| OLD | NEW |