You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.4 KiB
97 lines
3.4 KiB
// Copyright 2020 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef CAST_SENDER_CAST_APP_DISCOVERY_SERVICE_IMPL_H_
|
|
#define CAST_SENDER_CAST_APP_DISCOVERY_SERVICE_IMPL_H_
|
|
|
|
#include <map>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "cast/common/public/service_info.h"
|
|
#include "cast/sender/cast_app_availability_tracker.h"
|
|
#include "cast/sender/cast_platform_client.h"
|
|
#include "cast/sender/public/cast_app_discovery_service.h"
|
|
#include "platform/api/time.h"
|
|
#include "util/weak_ptr.h"
|
|
|
|
namespace openscreen {
|
|
namespace cast {
|
|
|
|
// Keeps track of availability queries, receives receiver updates, and issues
|
|
// app availability requests based on these signals.
|
|
class CastAppDiscoveryServiceImpl : public CastAppDiscoveryService {
|
|
public:
|
|
// |platform_client| must outlive |this|.
|
|
CastAppDiscoveryServiceImpl(CastPlatformClient* platform_client,
|
|
ClockNowFunctionPtr clock);
|
|
~CastAppDiscoveryServiceImpl() override;
|
|
|
|
// CastAppDiscoveryService implementation.
|
|
Subscription StartObservingAvailability(
|
|
const CastMediaSource& source,
|
|
AvailabilityCallback callback) override;
|
|
|
|
// Reissues app availability requests for currently registered (device_id,
|
|
// app_id) pairs whose status is kUnavailable or kUnknown.
|
|
void Refresh() override;
|
|
|
|
void AddOrUpdateReceiver(const ServiceInfo& receiver);
|
|
void RemoveReceiver(const ServiceInfo& receiver);
|
|
|
|
private:
|
|
struct AvailabilityCallbackEntry {
|
|
uint32_t id;
|
|
AvailabilityCallback callback;
|
|
};
|
|
|
|
// Issues an app availability request for |app_id| to the receiver given by
|
|
// |device_id|.
|
|
void RequestAppAvailability(const std::string& device_id,
|
|
const std::string& app_id);
|
|
|
|
// Updates the availability result for |device_id| and |app_id| with |result|,
|
|
// and notifies callbacks with updated availability query results.
|
|
void UpdateAppAvailability(const std::string& device_id,
|
|
const std::string& app_id,
|
|
AppAvailabilityResult result);
|
|
|
|
// Updates the availability query results for |sources|.
|
|
void UpdateAvailabilityQueries(const std::vector<CastMediaSource>& sources);
|
|
|
|
std::vector<ServiceInfo> GetReceiversByIds(
|
|
const std::vector<std::string>& device_ids) const;
|
|
|
|
// Returns true if an app availability request should be issued for
|
|
// |device_id| and |app_id|. |now| is used for checking whether previously
|
|
// cached results should be refreshed.
|
|
bool ShouldRefreshAppAvailability(const std::string& device_id,
|
|
const std::string& app_id,
|
|
Clock::time_point now) const;
|
|
|
|
void RemoveAvailabilityCallback(uint32_t id) override;
|
|
|
|
std::map<std::string, ServiceInfo> receivers_by_id_;
|
|
|
|
// Registered availability queries and their associated callbacks keyed by
|
|
// media source IDs.
|
|
std::map<std::string, std::vector<AvailabilityCallbackEntry>> avail_queries_;
|
|
|
|
// Callback ID tracking.
|
|
uint32_t next_avail_query_id_ = 1U;
|
|
|
|
CastPlatformClient* const platform_client_;
|
|
|
|
CastAppAvailabilityTracker availability_tracker_;
|
|
|
|
const ClockNowFunctionPtr clock_;
|
|
|
|
WeakPtrFactory<CastAppDiscoveryServiceImpl> weak_factory_;
|
|
};
|
|
|
|
} // namespace cast
|
|
} // namespace openscreen
|
|
|
|
#endif // CAST_SENDER_CAST_APP_DISCOVERY_SERVICE_IMPL_H_
|