// 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& 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( &Clock::now, task_runner_, IPEndpoint{interface_address_, kDefaultCastStreamingPort}); controller_ = std::make_unique(task_runner_, this); current_session_ = std::make_unique( 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 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