xref: /aosp_15_r20/external/openscreen/osp/impl/service_publisher_impl.cc (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
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 Sanglard bool 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 Sanglard void 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 Sanglard ServicePublisherImpl::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 Sanglard bool 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 Sanglard bool 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 Sanglard bool 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 Sanglard bool 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 Sanglard bool 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 Sanglard void 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 Sanglard void 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