1*3f982cf4SFabien Sanglard // Copyright 2018 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard // found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglard #include "osp/impl/service_publisher_impl.h" 6*3f982cf4SFabien Sanglard 7*3f982cf4SFabien Sanglard #include <utility> 8*3f982cf4SFabien Sanglard 9*3f982cf4SFabien Sanglard #include "util/osp_logging.h" 10*3f982cf4SFabien Sanglard 11*3f982cf4SFabien Sanglard namespace openscreen { 12*3f982cf4SFabien Sanglard namespace osp { 13*3f982cf4SFabien Sanglard namespace { 14*3f982cf4SFabien Sanglard IsTransitionValid(ServicePublisher::State from,ServicePublisher::State to)15*3f982cf4SFabien Sanglardbool IsTransitionValid(ServicePublisher::State from, 16*3f982cf4SFabien Sanglard ServicePublisher::State to) { 17*3f982cf4SFabien Sanglard using State = ServicePublisher::State; 18*3f982cf4SFabien Sanglard switch (from) { 19*3f982cf4SFabien Sanglard case State::kStopped: 20*3f982cf4SFabien Sanglard return to == State::kStarting || to == State::kStopping; 21*3f982cf4SFabien Sanglard case State::kStarting: 22*3f982cf4SFabien Sanglard return to == State::kRunning || to == State::kStopping || 23*3f982cf4SFabien Sanglard to == State::kSuspended; 24*3f982cf4SFabien Sanglard case State::kRunning: 25*3f982cf4SFabien Sanglard return to == State::kSuspended || to == State::kStopping; 26*3f982cf4SFabien Sanglard case State::kStopping: 27*3f982cf4SFabien Sanglard return to == State::kStopped; 28*3f982cf4SFabien Sanglard case State::kSuspended: 29*3f982cf4SFabien Sanglard return to == State::kRunning || to == State::kStopping; 30*3f982cf4SFabien Sanglard default: 31*3f982cf4SFabien Sanglard OSP_DCHECK(false) << "unknown State value: " << static_cast<int>(from); 32*3f982cf4SFabien Sanglard break; 33*3f982cf4SFabien Sanglard } 34*3f982cf4SFabien Sanglard return false; 35*3f982cf4SFabien Sanglard } 36*3f982cf4SFabien Sanglard 37*3f982cf4SFabien Sanglard } // namespace 38*3f982cf4SFabien Sanglard 39*3f982cf4SFabien Sanglard ServicePublisherImpl::Delegate::Delegate() = default; 40*3f982cf4SFabien Sanglard ServicePublisherImpl::Delegate::~Delegate() = default; 41*3f982cf4SFabien Sanglard SetPublisherImpl(ServicePublisherImpl * publisher)42*3f982cf4SFabien Sanglardvoid ServicePublisherImpl::Delegate::SetPublisherImpl( 43*3f982cf4SFabien Sanglard ServicePublisherImpl* publisher) { 44*3f982cf4SFabien Sanglard OSP_DCHECK(!publisher_); 45*3f982cf4SFabien Sanglard publisher_ = publisher; 46*3f982cf4SFabien Sanglard } 47*3f982cf4SFabien Sanglard ServicePublisherImpl(Observer * observer,std::unique_ptr<Delegate> delegate)48*3f982cf4SFabien SanglardServicePublisherImpl::ServicePublisherImpl(Observer* observer, 49*3f982cf4SFabien Sanglard std::unique_ptr<Delegate> delegate) 50*3f982cf4SFabien Sanglard : ServicePublisher(observer), delegate_(std::move(delegate)) { 51*3f982cf4SFabien Sanglard delegate_->SetPublisherImpl(this); 52*3f982cf4SFabien Sanglard } 53*3f982cf4SFabien Sanglard 54*3f982cf4SFabien Sanglard ServicePublisherImpl::~ServicePublisherImpl() = default; 55*3f982cf4SFabien Sanglard Start()56*3f982cf4SFabien Sanglardbool ServicePublisherImpl::Start() { 57*3f982cf4SFabien Sanglard if (state_ != State::kStopped) 58*3f982cf4SFabien Sanglard return false; 59*3f982cf4SFabien Sanglard state_ = State::kStarting; 60*3f982cf4SFabien Sanglard delegate_->StartPublisher(config_); 61*3f982cf4SFabien Sanglard return true; 62*3f982cf4SFabien Sanglard } StartAndSuspend()63*3f982cf4SFabien Sanglardbool ServicePublisherImpl::StartAndSuspend() { 64*3f982cf4SFabien Sanglard if (state_ != State::kStopped) 65*3f982cf4SFabien Sanglard return false; 66*3f982cf4SFabien Sanglard state_ = State::kStarting; 67*3f982cf4SFabien Sanglard delegate_->StartAndSuspendPublisher(config_); 68*3f982cf4SFabien Sanglard return true; 69*3f982cf4SFabien Sanglard } Stop()70*3f982cf4SFabien Sanglardbool ServicePublisherImpl::Stop() { 71*3f982cf4SFabien Sanglard if (state_ == State::kStopped || state_ == State::kStopping) 72*3f982cf4SFabien Sanglard return false; 73*3f982cf4SFabien Sanglard 74*3f982cf4SFabien Sanglard state_ = State::kStopping; 75*3f982cf4SFabien Sanglard delegate_->StopPublisher(); 76*3f982cf4SFabien Sanglard return true; 77*3f982cf4SFabien Sanglard } Suspend()78*3f982cf4SFabien Sanglardbool ServicePublisherImpl::Suspend() { 79*3f982cf4SFabien Sanglard if (state_ != State::kRunning && state_ != State::kStarting) 80*3f982cf4SFabien Sanglard return false; 81*3f982cf4SFabien Sanglard 82*3f982cf4SFabien Sanglard delegate_->SuspendPublisher(); 83*3f982cf4SFabien Sanglard return true; 84*3f982cf4SFabien Sanglard } Resume()85*3f982cf4SFabien Sanglardbool ServicePublisherImpl::Resume() { 86*3f982cf4SFabien Sanglard if (state_ != State::kSuspended) 87*3f982cf4SFabien Sanglard return false; 88*3f982cf4SFabien Sanglard 89*3f982cf4SFabien Sanglard delegate_->ResumePublisher(config_); 90*3f982cf4SFabien Sanglard return true; 91*3f982cf4SFabien Sanglard } 92*3f982cf4SFabien Sanglard SetState(State state)93*3f982cf4SFabien Sanglardvoid ServicePublisherImpl::SetState(State state) { 94*3f982cf4SFabien Sanglard OSP_DCHECK(IsTransitionValid(state_, state)); 95*3f982cf4SFabien Sanglard state_ = state; 96*3f982cf4SFabien Sanglard if (observer_) 97*3f982cf4SFabien Sanglard MaybeNotifyObserver(); 98*3f982cf4SFabien Sanglard } 99*3f982cf4SFabien Sanglard MaybeNotifyObserver()100*3f982cf4SFabien Sanglardvoid ServicePublisherImpl::MaybeNotifyObserver() { 101*3f982cf4SFabien Sanglard OSP_DCHECK(observer_); 102*3f982cf4SFabien Sanglard switch (state_) { 103*3f982cf4SFabien Sanglard case State::kRunning: 104*3f982cf4SFabien Sanglard observer_->OnStarted(); 105*3f982cf4SFabien Sanglard break; 106*3f982cf4SFabien Sanglard case State::kStopped: 107*3f982cf4SFabien Sanglard observer_->OnStopped(); 108*3f982cf4SFabien Sanglard break; 109*3f982cf4SFabien Sanglard case State::kSuspended: 110*3f982cf4SFabien Sanglard observer_->OnSuspended(); 111*3f982cf4SFabien Sanglard break; 112*3f982cf4SFabien Sanglard default: 113*3f982cf4SFabien Sanglard break; 114*3f982cf4SFabien Sanglard } 115*3f982cf4SFabien Sanglard } 116*3f982cf4SFabien Sanglard 117*3f982cf4SFabien Sanglard } // namespace osp 118*3f982cf4SFabien Sanglard } // namespace openscreen 119