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.2 KiB
97 lines
3.2 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_PLATFORM_CLIENT_H_
|
|
#define CAST_SENDER_CAST_PLATFORM_CLIENT_H_
|
|
|
|
#include <functional>
|
|
#include <map>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "absl/types/optional.h"
|
|
#include "cast/common/channel/cast_message_handler.h"
|
|
#include "cast/sender/channel/message_util.h"
|
|
#include "util/alarm.h"
|
|
#include "util/json/json_value.h"
|
|
|
|
namespace openscreen {
|
|
namespace cast {
|
|
|
|
struct ServiceInfo;
|
|
class VirtualConnectionRouter;
|
|
|
|
// This class handles Cast messages that generally relate to the "platform", in
|
|
// other words not a specific app currently running (e.g. app availability,
|
|
// receiver status). These messages follow a request/response format, so each
|
|
// request requires a corresponding response callback. These requests will also
|
|
// timeout if there is no response after a certain amount of time (currently 5
|
|
// seconds). The timeout callbacks will be called on the thread managed by
|
|
// |task_runner|.
|
|
class CastPlatformClient final : public CastMessageHandler {
|
|
public:
|
|
using AppAvailabilityCallback =
|
|
std::function<void(const std::string& app_id, AppAvailabilityResult)>;
|
|
|
|
CastPlatformClient(VirtualConnectionRouter* router,
|
|
ClockNowFunctionPtr clock,
|
|
TaskRunner* task_runner);
|
|
~CastPlatformClient() override;
|
|
|
|
// Requests availability information for |app_id| from the receiver identified
|
|
// by |device_id|. |callback| will be called exactly once with a result.
|
|
absl::optional<int> RequestAppAvailability(const std::string& device_id,
|
|
const std::string& app_id,
|
|
AppAvailabilityCallback callback);
|
|
|
|
// Notifies this object about general receiver connectivity or property
|
|
// changes.
|
|
void AddOrUpdateReceiver(const ServiceInfo& device, int socket_id);
|
|
void RemoveReceiver(const ServiceInfo& device);
|
|
|
|
void CancelRequest(int request_id);
|
|
|
|
private:
|
|
struct AvailabilityRequest {
|
|
int request_id;
|
|
std::string app_id;
|
|
std::unique_ptr<Alarm> timeout;
|
|
AppAvailabilityCallback callback;
|
|
};
|
|
|
|
struct PendingRequests {
|
|
std::vector<AvailabilityRequest> availability;
|
|
};
|
|
|
|
// CastMessageHandler overrides.
|
|
void OnMessage(VirtualConnectionRouter* router,
|
|
CastSocket* socket,
|
|
::cast::channel::CastMessage message) override;
|
|
|
|
void HandleResponse(const std::string& device_id,
|
|
int request_id,
|
|
const Json::Value& message);
|
|
|
|
void CancelAppAvailabilityRequest(int request_id);
|
|
|
|
static int GetNextRequestId();
|
|
|
|
static int next_request_id_;
|
|
|
|
const std::string sender_id_;
|
|
VirtualConnectionRouter* const virtual_conn_router_;
|
|
std::map<std::string /* device_id */, int> socket_id_by_device_id_;
|
|
std::map<std::string /* device_id */, PendingRequests>
|
|
pending_requests_by_device_id_;
|
|
|
|
const ClockNowFunctionPtr clock_;
|
|
TaskRunner* const task_runner_;
|
|
};
|
|
|
|
} // namespace cast
|
|
} // namespace openscreen
|
|
|
|
#endif // CAST_SENDER_CAST_PLATFORM_CLIENT_H_
|