blob: d8b6227c549ff1230fdd14dadb3fda8146f21c74 [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef PERIDOT_BIN_BASEMGR_SESSION_CONTEXT_IMPL_H_
#define PERIDOT_BIN_BASEMGR_SESSION_CONTEXT_IMPL_H_
#include <fuchsia/auth/cpp/fidl.h>
#include <fuchsia/modular/auth/cpp/fidl.h>
#include <fuchsia/modular/cpp/fidl.h>
#include <fuchsia/modular/internal/cpp/fidl.h>
#include <fuchsia/sys/cpp/fidl.h>
#include <fuchsia/ui/policy/cpp/fidl.h>
#include <fuchsia/ui/views/cpp/fidl.h>
#include <lib/async/cpp/future.h>
#include <lib/fidl/cpp/binding.h>
#include <lib/fidl/cpp/interface_handle.h>
#include <lib/fidl/cpp/interface_ptr_set.h>
#include <lib/fidl/cpp/interface_request.h>
#include <lib/fit/function.h>
#include <lib/sys/cpp/component_context.h>
#include <src/lib/fxl/macros.h>
#include "peridot/lib/fidl/app_client.h"
#include "peridot/lib/fidl/environment.h"
namespace modular {
// |SessionContextImpl| starts and manages a Sessionmgr. The life time of a
// Sessionmgr is bound to this class. |SessionContextImpl| is not self-owned,
// but still drives its own deletion: On logout, it signals its
// owner (BasemgrImpl) to delete it.
class SessionContextImpl : fuchsia::modular::internal::SessionContext {
public:
enum class ShutDownReason {
// normal mode of shutdown
LOGGED_OUT,
// sessionmgr or session_shell crashed.
CRASHED
};
// Called after performing shutdown of the session, to signal our completion
// (and deletion of our instance) to our owner, this is done using a callback
// supplied in the constructor. (The alternative is to take in a
// SessionProvider*, which seems a little specific and overscoped).
using OnSessionShutdownCallback =
fit::function<void(ShutDownReason shutdown_reason, bool logout_users)>;
// Called when sessionmgr requests to acquire the presentation.
using GetPresentationCallback =
fit::function<void(fidl::InterfaceRequest<fuchsia::ui::policy::Presentation> request)>;
// |session_id| is the device-local unique identifier for this session. Caller
// must ensure its uniqueness. sessionmgr creates an Environment namespace
// with the given |session_id|, and this will crash if it tries to create an
// environment with a pre-existing name.
//
// |additional_services| are services that will be installed into the
// Sessionmgr's namespace, including an implementation of
// `fuchsia.intl.PropertyProvider`.
SessionContextImpl(fuchsia::sys::Launcher* const launcher, std::string session_id,
fuchsia::modular::AppConfig sessionmgr_config,
fuchsia::modular::AppConfig session_shell_config,
fuchsia::modular::AppConfig story_shell_config,
bool use_session_shell_for_story_shell_factory,
fidl::InterfaceHandle<fuchsia::auth::TokenManager> ledger_token_manager,
fidl::InterfaceHandle<fuchsia::auth::TokenManager> agent_token_manager,
fuchsia::modular::auth::AccountPtr account,
fuchsia::ui::views::ViewToken view_token,
fuchsia::sys::ServiceListPtr additional_services,
GetPresentationCallback get_presentation,
OnSessionShutdownCallback on_session_shutdown);
// This will effectively tear down the entire instance by calling
// |on_session_shutdown_|. If |logout_users| is true, all the users will be
// logged out with the assumption that all users belong to the current
// session.
void Shutdown(bool logout_users, fit::function<void()> callback);
// Stops the active session shell, and starts the session shell specified in
// |session_shell_config|.
FuturePtr<> SwapSessionShell(fuchsia::modular::AppConfig session_shell_config);
private:
// Determines where current configurations are being read from, and forwards
// that directory into a flat namespace that will be added to sessionmgr's
// launch info.
fuchsia::sys::FlatNamespacePtr MakeConfigNamespace();
// |fuchsia::modular::internal::SessionContext|
void Logout() override;
// |fuchsia::modular::internal::SessionContext|
void Shutdown() override;
// |fuchsia::modular::internal::SessionContext|
void GetPresentation(fidl::InterfaceRequest<fuchsia::ui::policy::Presentation> request) override;
std::unique_ptr<Environment> sessionmgr_environment_;
std::unique_ptr<AppClient<fuchsia::modular::Lifecycle>> sessionmgr_app_;
fuchsia::modular::internal::SessionmgrPtr sessionmgr_;
fidl::Binding<fuchsia::modular::internal::SessionContext> session_context_binding_;
std::vector<fit::function<void()>> shutdown_callbacks_;
GetPresentationCallback get_presentation_;
OnSessionShutdownCallback on_session_shutdown_;
FXL_DISALLOW_COPY_AND_ASSIGN(SessionContextImpl);
};
} // namespace modular
#endif // PERIDOT_BIN_BASEMGR_SESSION_CONTEXT_IMPL_H_