| // Copyright 2021 The Chromium OS 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 "federated/session_manager_proxy.h" |
| |
| #include <utility> |
| |
| #include <base/bind.h> |
| #include <dbus/login_manager/dbus-constants.h> |
| |
| #include "federated/utils.h" |
| |
| namespace federated { |
| |
| namespace { |
| |
| constexpr char kUnknownErrorMsg[] = "Unknown error"; |
| |
| void OnSignalConnected(const std::string& interface, |
| const std::string& signal, |
| bool success) { |
| if (!success) { |
| LOG(ERROR) << "Could not connect to signal " << signal << " on interface " |
| << interface; |
| } |
| } |
| |
| } // namespace |
| |
| SessionManagerProxy::SessionManagerProxy( |
| std::unique_ptr<org::chromium::SessionManagerInterfaceProxyInterface> proxy) |
| : proxy_(std::move(proxy)), weak_ptr_factory_(this) { |
| proxy_->RegisterSessionStateChangedSignalHandler( |
| base::BindRepeating(&SessionManagerProxy::OnSessionStateChanged, |
| weak_ptr_factory_.GetWeakPtr()), |
| base::BindOnce(&OnSignalConnected)); |
| } |
| |
| SessionManagerProxy::~SessionManagerProxy() = default; |
| |
| void SessionManagerProxy::AddObserver( |
| SessionManagerObserverInterface* const observer) { |
| CHECK(observer) << "Invalid observer object"; |
| observer_list_.AddObserver(observer); |
| } |
| |
| void SessionManagerProxy::OnSessionStateChanged(const std::string& state) { |
| if (state == kSessionStartedState) { |
| for (SessionManagerObserverInterface& observer : observer_list_) |
| observer.OnSessionStarted(); |
| } else if (state == kSessionStoppedState) { |
| for (SessionManagerObserverInterface& observer : observer_list_) |
| observer.OnSessionStopped(); |
| } |
| } |
| |
| std::string SessionManagerProxy::RetrieveSessionState() { |
| dbus::MethodCall method_call( |
| login_manager::kSessionManagerInterface, |
| login_manager::kSessionManagerRetrieveSessionState); |
| std::string state; |
| brillo::ErrorPtr error; |
| if (!proxy_->RetrieveSessionState(&state, &error)) { |
| const char* const error_msg = |
| error ? error->GetMessage().c_str() : kUnknownErrorMsg; |
| LOG(ERROR) << "Call to RetrieveSessionState failed. " << error_msg; |
| return std::string(); |
| } |
| return state; |
| } |
| |
| std::string SessionManagerProxy::GetSanitizedUsername() { |
| std::string username; |
| std::string sanitized_username; |
| brillo::ErrorPtr error; |
| if (!proxy_->RetrievePrimarySession(&username, &sanitized_username, &error)) { |
| const char* error_msg = |
| error ? error->GetMessage().c_str() : kUnknownErrorMsg; |
| LOG(ERROR) << "Call to RetrievePrimarySession failed. " << error_msg; |
| return std::string(); |
| } |
| return sanitized_username; |
| } |
| |
| } // namespace federated |