Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_DIAL_DEVICE_DESCRIPTION_SERVICE_H_ | |
| 6 #define CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_DIAL_DEVICE_DESCRIPTION_SERVICE_H_ | |
| 7 | |
| 8 #include <memory> | |
| 9 #include <set> | |
| 10 #include <string> | |
| 11 | |
| 12 #include "base/callback.h" | |
| 13 #include "base/gtest_prod_util.h" | |
| 14 #include "base/threading/thread_checker.h" | |
| 15 #include "base/timer/timer.h" | |
| 16 #include "chrome/browser/media/router/discovery/dial/dial_device_data.h" | |
| 17 #include "chrome/browser/media/router/discovery/dial/parsed_dial_device_descript ion.h" | |
| 18 #include "chrome/common/media_router/mojo/dial_device_description_parser.mojom.h " | |
| 19 #include "content/public/browser/browser_thread.h" | |
| 20 | |
| 21 namespace net { | |
| 22 class URLRequestContextGetter; | |
| 23 } | |
| 24 | |
| 25 namespace media_router { | |
| 26 | |
| 27 class DeviceDescriptionFetcher; | |
| 28 class SafeDialDeviceDescriptionParser; | |
| 29 | |
| 30 // This class fetches and parses device description XML for DIAL devices. Actual | |
| 31 // parsing happens in a separate utility process via SafeDeviceDescriptionParser | |
| 32 // (instead of in this class). This class lives on IO thread. | |
| 33 class DeviceDescriptionService { | |
| 34 public: | |
| 35 // Represents cached device description data parsed from device description | |
| 36 // XML. | |
| 37 struct CacheEntry { | |
| 38 CacheEntry(); | |
| 39 CacheEntry(const CacheEntry& other); | |
| 40 ~CacheEntry(); | |
| 41 | |
| 42 // The expiration time from the cache. | |
| 43 base::Time expire_time; | |
| 44 | |
| 45 // The device description version number (non-negative). | |
| 46 int32_t config_id; | |
| 47 | |
| 48 // Parsed device description data from XML. | |
| 49 ParsedDialDeviceDescription description_data; | |
| 50 }; | |
| 51 | |
| 52 // Called if parsing device description XML in utility process succeeds, and | |
| 53 // all fields are valid. | |
| 54 // |device_data|: The device to look up. | |
| 55 // |description_data|: Device description data from device description XML. | |
| 56 using DeviceDescriptionParseSuccessCallback = | |
| 57 base::Callback<void(const DialDeviceData& device_data, | |
| 58 const ParsedDialDeviceDescription& description_data)>; | |
| 59 | |
| 60 // Called if parsing device description XML in utility process fails, or some | |
| 61 // parsed fields are missing or invalid. | |
| 62 using DeviceDescriptionParseErrorCallback = | |
| 63 base::Callback<void(const DialDeviceData& device_data, | |
| 64 const std::string& error_message)>; | |
| 65 | |
| 66 DeviceDescriptionService( | |
| 67 const DeviceDescriptionParseSuccessCallback& success_cb, | |
| 68 const DeviceDescriptionParseErrorCallback& error_cb); | |
| 69 virtual ~DeviceDescriptionService(); | |
| 70 | |
| 71 // For each device in |devices|, if there is a valid cache entry for it, call | |
| 72 // |success_cb_| with cached device description; otherwise start fetching | |
| 73 // device description XML and parsing XML in utility process. Call | |
| 74 // |success_cb_| if both fetching and parsing succeeds; otherwise call | |
| 75 // |error_cb_|. | |
| 76 // |request_context|: Used by the background URLFetchers. | |
| 77 virtual void GetDeviceDescriptions( | |
| 78 const std::vector<DialDeviceData>& devices, | |
| 79 net::URLRequestContextGetter* request_context); | |
| 80 | |
| 81 // Remove expired cache entries from |description_map_|. | |
| 82 void CleanUpCacheEntries(); | |
|
imcheng
2017/04/25 01:40:12
Does this need to be public?
zhaobin
2017/04/26 18:50:04
Done.
| |
| 83 | |
| 84 private: | |
| 85 friend class DeviceDescriptionServiceTest; | |
| 86 friend class TestDeviceDescriptionService; | |
| 87 FRIEND_TEST_ALL_PREFIXES(DeviceDescriptionServiceTest, | |
| 88 TestGetDeviceDescriptionRemoveOutDatedFetchers); | |
| 89 FRIEND_TEST_ALL_PREFIXES(DeviceDescriptionServiceTest, | |
| 90 TestGetDeviceDescriptionFetchURLError); | |
| 91 FRIEND_TEST_ALL_PREFIXES(DeviceDescriptionServiceTest, | |
| 92 TestSafeParserProperlyCreated); | |
| 93 | |
| 94 // Checks the cache for a valid device description. If the entry is found but | |
| 95 // is expired, it is removed from the cache. Returns cached entry of | |
| 96 // parsed device description. Returns nullptr if cache entry does not exist or | |
| 97 // is not valid. | |
| 98 // |device_data|: The device to look up. | |
| 99 const CacheEntry* CheckAndUpdateCache(const DialDeviceData& device_data); | |
| 100 | |
| 101 // Issues a HTTP GET request for the device description. No-op if there is | |
| 102 // already a pending request. | |
| 103 // |device_data|: The device to look up. | |
| 104 // |request_context|: Used by the background URLFetchers. | |
| 105 void FetchDeviceDescription(const DialDeviceData& device_data, | |
| 106 net::URLRequestContextGetter* request_context); | |
| 107 | |
| 108 // Invoked when HTTP GET request finishes. | |
| 109 // |device_data|: Device data initiating the HTTP request. | |
| 110 // |description_data|: Response from HTTP request. | |
| 111 void OnDeviceDescriptionFetchComplete( | |
| 112 const DialDeviceData& device_data, | |
| 113 const DialDeviceDescriptionData& description_data); | |
| 114 | |
| 115 // Invoked when HTTP GET request fails. | |
| 116 // |device_data|: Device data initiating the HTTP request. | |
| 117 // |error_message|: Error message from HTTP request. | |
| 118 void OnDeviceDescriptionFetchError(const DialDeviceData& device_data, | |
| 119 const std::string& error_message); | |
| 120 | |
| 121 // Invoked when SafeDialDeviceDescriptionParser finishes parsing device | |
| 122 // description XML. | |
| 123 // |device_data|: Device data initiating XML parsing in utility process. | |
| 124 // |app_url|: The app Url. | |
| 125 // |device_description_ptr|: Parsed device description from utility process. | |
| 126 // Returns nullptr if parsing fails. | |
|
imcheng
2017/04/25 01:40:12
... process, or nullptr if parsing failed.
zhaobin
2017/04/26 18:50:04
Done.
| |
| 127 void OnParsedDeviceDescription( | |
| 128 const DialDeviceData& device_data, | |
| 129 const GURL& app_url, | |
| 130 chrome::mojom::DialDeviceDescriptionPtr device_description_ptr); | |
| 131 | |
| 132 // Used by unit tests. | |
| 133 virtual base::Time GetNow(); | |
| 134 | |
| 135 // Map of current device description fetches in progress, keyed by device | |
| 136 // label. | |
| 137 std::map<std::string, std::unique_ptr<DeviceDescriptionFetcher>> | |
| 138 device_description_fetcher_map_; | |
| 139 | |
| 140 // Set of device labels to be parsed in current utility process. | |
| 141 std::set<std::string> pending_device_labels_; | |
| 142 | |
| 143 // Map of current cached device descriptions, keyed by device label. | |
| 144 std::map<std::string, CacheEntry> description_map_; | |
|
mark a. foltz
2017/04/25 21:06:25
Maybe description_cache_ ?
zhaobin
2017/04/26 18:50:04
Done.
| |
| 145 | |
| 146 // See comments for DeviceDescriptionParseSuccessCallback. | |
| 147 DeviceDescriptionParseSuccessCallback success_cb_; | |
| 148 | |
| 149 // See comments for DeviceDescriptionParseErrorCallback. | |
| 150 DeviceDescriptionParseErrorCallback error_cb_; | |
| 151 | |
| 152 // Timer for clean up expired cache entries. | |
| 153 std::unique_ptr<base::RepeatingTimer, | |
| 154 content::BrowserThread::DeleteOnIOThread> | |
|
imcheng
2017/04/25 01:40:12
Why do you need this? I thought this object lives
mark a. foltz
2017/04/25 21:06:25
BrowserThread::DeleteOnThread has a shortcut that
zhaobin
2017/04/26 18:50:04
Acknowledged.
zhaobin
2017/04/26 18:50:04
Will mark DialMediaSinkService object as DeleteOnI
| |
| 155 clean_up_timer_; | |
| 156 | |
| 157 // Safe DIAL parser associated with utility process. | |
| 158 std::unique_ptr<SafeDialDeviceDescriptionParser> parser_; | |
| 159 | |
| 160 base::ThreadChecker thread_checker_; | |
| 161 }; | |
| 162 | |
| 163 } // namespace media_router | |
| 164 | |
| 165 #endif // CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_DIAL_DEVICE_DESCRIPTION_SERVICE _H_ | |
| OLD | NEW |