blob: ff52076ee4e7b2cca2d3dc4bb27864bcddbc2624 [file] [log] [blame]
// Copyright 2018 The Chromium 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 "chrome/browser/ui/webui/settings/chromeos/smb_handler.h"
#include <string>
#include <utility>
#include "base/bind.h"
#include "base/values.h"
#include "chrome/browser/chromeos/file_system_provider/provided_file_system_info.h"
#include "chrome/browser/profiles/profile.h"
#include "content/public/browser/web_ui_message_handler.h"
namespace chromeos {
namespace settings {
namespace {
smb_client::SmbService* GetSmbService(Profile* profile) {
smb_client::SmbService* const service = smb_client::SmbService::Get(profile);
return service;
}
base::Value BuildShareList(const std::vector<smb_client::SmbUrl>& shares) {
base::Value shares_list(base::Value::Type::LIST);
for (const auto& share : shares) {
shares_list.GetList().push_back(base::Value(share.ToString()));
}
return shares_list;
}
} // namespace
SmbHandler::SmbHandler(Profile* profile)
: profile_(profile), weak_ptr_factory_(this) {}
SmbHandler::~SmbHandler() = default;
void SmbHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(
"smbMount",
base::BindRepeating(&SmbHandler::HandleSmbMount, base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"startDiscovery", base::BindRepeating(&SmbHandler::HandleStartDiscovery,
base::Unretained(this)));
}
void SmbHandler::HandleSmbMount(const base::ListValue* args) {
CHECK_EQ(4U, args->GetSize());
std::string mount_url;
std::string mount_name;
std::string username;
std::string password;
CHECK(args->GetString(0, &mount_url));
CHECK(args->GetString(1, &mount_name));
CHECK(args->GetString(2, &username));
CHECK(args->GetString(3, &password));
smb_client::SmbService* const service = GetSmbService(profile_);
if (!service) {
return;
}
chromeos::file_system_provider::MountOptions mo;
mo.display_name = mount_name.empty() ? mount_url : mount_name;
mo.writable = true;
auto mount_response = base::BindOnce(&SmbHandler::HandleSmbMountResponse,
weak_ptr_factory_.GetWeakPtr());
auto mount_call = base::BindOnce(
&smb_client::SmbService::Mount, base::Unretained(service), mo,
base::FilePath(mount_url), username, password, std::move(mount_response));
if (host_discovery_done_) {
std::move(mount_call).Run();
} else {
stored_mount_call_ = std::move(mount_call);
}
}
void SmbHandler::HandleSmbMountResponse(SmbMountResult result) {
AllowJavascript();
FireWebUIListener("on-add-smb-share", base::Value(static_cast<int>(result)));
}
void SmbHandler::HandleStartDiscovery(const base::ListValue* args) {
smb_client::SmbService* const service = GetSmbService(profile_);
if (!service) {
return;
}
service->GatherSharesInNetwork(base::BindRepeating(
&SmbHandler::HandleGatherSharesResponse, weak_ptr_factory_.GetWeakPtr()));
}
void SmbHandler::HandleGatherSharesResponse(
const std::vector<smb_client::SmbUrl>& shares_gathered) {
host_discovery_done_ = true;
if (!stored_mount_call_.is_null()) {
std::move(stored_mount_call_).Run();
}
AllowJavascript();
FireWebUIListener("on-shares-found", BuildShareList(shares_gathered));
}
} // namespace settings
} // namespace chromeos