1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "components/filesystem/file_system_app.h"
8 #include "base/logging.h"
9 #include "mojo/application/public/cpp/application_connection.h"
10 #include "mojo/application/public/cpp/application_impl.h"
12 namespace filesystem
{
14 FileSystemApp::FileSystemApp() : app_(nullptr), in_shutdown_(false) {}
16 FileSystemApp::~FileSystemApp() {}
18 void FileSystemApp::Initialize(mojo::ApplicationImpl
* app
) {
22 bool FileSystemApp::ConfigureIncomingConnection(
23 mojo::ApplicationConnection
* connection
) {
24 connection
->AddService
<FileSystem
>(this);
28 void FileSystemApp::RegisterDirectoryToClient(DirectoryImpl
* directory
,
29 FileSystemClientPtr client
) {
30 directory
->set_connection_error_handler(
31 base::Bind(&FileSystemApp::OnDirectoryConnectionError
,
32 base::Unretained(this),
34 client_mapping_
.emplace_back(directory
, client
.Pass());
37 bool FileSystemApp::OnShellConnectionError() {
38 if (client_mapping_
.empty()) {
39 // If we have no current connections, we can shutdown immediately.
45 // We have live connections. Send a notification to each one indicating that
46 // they should shutdown.
47 for (std::vector
<Client
>::iterator it
= client_mapping_
.begin();
48 it
!= client_mapping_
.end(); ++it
) {
49 it
->fs_client_
->OnFileSystemShutdown();
55 // |InterfaceFactory<Files>| implementation:
56 void FileSystemApp::Create(mojo::ApplicationConnection
* connection
,
57 mojo::InterfaceRequest
<FileSystem
> request
) {
58 new FileSystemImpl(this, connection
, request
.Pass());
61 void FileSystemApp::OnDirectoryConnectionError(DirectoryImpl
* directory
) {
62 for (std::vector
<Client
>::iterator it
= client_mapping_
.begin();
63 it
!= client_mapping_
.end(); ++it
) {
64 if (it
->directory_
== directory
) {
65 client_mapping_
.erase(it
);
67 if (in_shutdown_
&& client_mapping_
.empty()) {
68 // We just cleared the last directory after our shell connection went
69 // away. Time to shut ourselves down.
78 FileSystemApp::Client::Client(DirectoryImpl
* directory
,
79 FileSystemClientPtr fs_client
)
80 : directory_(directory
),
81 fs_client_(fs_client
.Pass()) {
84 FileSystemApp::Client::Client(Client
&& rhs
)
85 : directory_(rhs
.directory_
),
86 fs_client_(rhs
.fs_client_
.Pass()) {
89 FileSystemApp::Client::~Client() {}
91 FileSystemApp::Client
& FileSystemApp::Client::operator=(
92 FileSystemApp::Client
&& rhs
) {
93 directory_
= rhs
.directory_
;
94 fs_client_
= rhs
.fs_client_
.Pass();
98 } // namespace filesystem