// Copyright 2018 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_CAST_CAST_APP_AVAILABILITY_TRACKER_H_ #define CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_CAST_CAST_APP_AVAILABILITY_TRACKER_H_ #include <string> #include <vector> #include "base/containers/flat_map.h" #include "base/containers/flat_set.h" #include "base/time/time.h" #include "components/media_router/common/discovery/media_sink_internal.h" #include "components/media_router/common/media_source.h" #include "components/media_router/common/providers/cast/cast_media_source.h" #include "components/media_router/common/providers/cast/channel/cast_device_capability.h" #include "components/media_router/common/providers/cast/channel/cast_message_util.h" namespace media_router { // Tracks sink queries and their extracted Cast app IDs and their availabilities // on discovered sinks. // Example usage: /// // (1) A page creates a PresentationRequest with URL "cast:foo". To register the // source to be tracked: // CastAppAvailabilityTracker tracker; // auto source = CastMediaSource::From("cast:foo"); // auto new_app_ids = tracker.RegisterSource(*source); // // (2) The set of app IDs returned by the tracker can then be used by the caller // to send an app availability request to each of the discovered sinks. // // (3) Once the caller knows the availability value for a (sink, app) pair, it // may inform the tracker to update its results: // auto affected_sources = // tracker.UpdateAppAvailability(sink_id, app_id, {availability, now}); // // (4) The tracker returns a subset of discovered sources that were affected by // the update. The caller can then call |GetAvailableSinks()| to get the updated // results for each affected source. // // (5a): At any time, the caller may call |RemoveResultsForSink()| to remove // cached results pertaining to the sink, when it detects that a sink is removed // or no longer valid. // // (5b): At any time, the caller may call |GetAvailableSinks()| (even before the // source is registered) to determine if there are cached results available. class CastAppAvailabilityTracker { … }; } // namespace media_router #endif // CHROME_BROWSER_MEDIA_ROUTER_PROVIDERS_CAST_CAST_APP_AVAILABILITY_TRACKER_H_