blob: a04c401ae8ebacce5565b8ea48702c647648ba16 [file] [log] [blame]
// 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.
#include "cast/standalone_receiver/mirroring_application.h"
#include "cast/common/public/message_port.h"
#include "cast/streaming/environment.h"
#include "cast/streaming/message_fields.h"
#include "cast/streaming/receiver_session.h"
#include "platform/api/task_runner.h"
#include "util/osp_logging.h"
namespace openscreen {
namespace cast {
const char kMirroringAppId[] = "0F5096E8";
const char kMirroringAudioOnlyAppId[] = "85CDB22F";
const char kMirroringDisplayName[] = "Chrome Mirroring";
const char kRemotingRpcNamespace[] = "urn:x-cast:com.google.cast.remoting";
MirroringApplication::MirroringApplication(TaskRunner* task_runner,
const IPAddress& interface_address,
ApplicationAgent* agent)
: task_runner_(task_runner),
interface_address_(interface_address),
app_ids_({kMirroringAppId, kMirroringAudioOnlyAppId}),
agent_(agent) {
OSP_DCHECK(task_runner_);
OSP_DCHECK(agent_);
agent_->RegisterApplication(this);
}
MirroringApplication::~MirroringApplication() {
agent_->UnregisterApplication(this); // ApplicationAgent may call Stop().
OSP_DCHECK(!current_session_);
}
const std::vector<std::string>& MirroringApplication::GetAppIds() const {
return app_ids_;
}
bool MirroringApplication::Launch(const std::string& app_id,
const Json::Value& app_params,
MessagePort* message_port) {
if ((app_id != kMirroringAppId && app_id != kMirroringAudioOnlyAppId) ||
!message_port || current_session_) {
return false;
}
wake_lock_ = ScopedWakeLock::Create(task_runner_);
environment_ = std::make_unique<Environment>(
&Clock::now, task_runner_,
IPEndpoint{interface_address_, kDefaultCastStreamingPort});
controller_ =
std::make_unique<StreamingPlaybackController>(task_runner_, this);
current_session_ = std::make_unique<ReceiverSession>(
controller_.get(), environment_.get(), message_port,
ReceiverSession::Preferences{});
return true;
}
std::string MirroringApplication::GetSessionId() {
return current_session_ ? current_session_->session_id() : std::string();
}
std::string MirroringApplication::GetDisplayName() {
return current_session_ ? kMirroringDisplayName : std::string();
}
std::vector<std::string> MirroringApplication::GetSupportedNamespaces() {
return {kCastWebrtcNamespace, kRemotingRpcNamespace};
}
void MirroringApplication::Stop() {
current_session_.reset();
controller_.reset();
environment_.reset();
wake_lock_.reset();
}
void MirroringApplication::OnPlaybackError(StreamingPlaybackController*,
Error error) {
OSP_LOG_ERROR << "[MirroringApplication] " << error;
agent_->StopApplicationIfRunning(this); // ApplicationAgent calls Stop().
}
} // namespace cast
} // namespace openscreen