| Index: mojo/services/network/network_service_delegate.cc
|
| diff --git a/mojo/services/network/network_service_delegate.cc b/mojo/services/network/network_service_delegate.cc
|
| index b3b1c8e8a4bf546bfa4e8ccdc22ddcebc2330811..137747409464d3bff91fbfc9d4763a8c6c6cc5c8 100644
|
| --- a/mojo/services/network/network_service_delegate.cc
|
| +++ b/mojo/services/network/network_service_delegate.cc
|
| @@ -6,23 +6,97 @@
|
|
|
| #include "base/at_exit.h"
|
| #include "base/base_paths.h"
|
| +#include "base/bind.h"
|
| +#include "base/command_line.h"
|
| #include "base/files/file_path.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/path_service.h"
|
| #include "mojo/application/public/cpp/application_connection.h"
|
| +#include "mojo/common/message_pump_mojo.h"
|
| #include "mojo/services/network/network_service_impl.h"
|
| #include "mojo/services/network/url_loader_factory_impl.h"
|
| +#include "mojo/util/capture_util.h"
|
| +#include "sql/mojo/mojo_vfs.h"
|
|
|
| -NetworkServiceDelegate::NetworkServiceDelegate() : app_(nullptr) {}
|
| +namespace {
|
|
|
| -NetworkServiceDelegate::~NetworkServiceDelegate() {}
|
| +const char kSQLThreadName[] = "SQL_IO_Thread";
|
| +
|
| +// SQL blocks on the filesystem service, so perform all SQL functions on a
|
| +// separate thread.
|
| +class SQLThread : public base::Thread {
|
| + public:
|
| + SQLThread(filesystem::DirectoryPtr directory)
|
| + : base::Thread(kSQLThreadName),
|
| + directory_info_(directory.PassInterface().Pass()) {
|
| + base::Thread::Options options;
|
| + options.message_pump_factory =
|
| + base::Bind(&mojo::common::MessagePumpMojo::Create);
|
| + StartWithOptions(options);
|
| + }
|
| + ~SQLThread() override { Stop(); }
|
| +
|
| + void Init() override {
|
| + filesystem::DirectoryPtr directory;
|
| + directory.Bind(directory_info_.Pass());
|
| + vfs_.reset(new sql::ScopedMojoFilesystemVFS(directory.Pass()));
|
| + }
|
| +
|
| + void CleanUp() override {
|
| + vfs_.reset();
|
| + }
|
| +
|
| + private:
|
| + // Our VFS which wraps sqlite so that we can reuse the current sqlite code.
|
| + scoped_ptr<sql::ScopedMojoFilesystemVFS> vfs_;
|
| +
|
| + // This member is used to safely pass data from one thread to another. It is
|
| + // set in the constructor and is consumed in Init().
|
| + mojo::InterfacePtrInfo<filesystem::Directory> directory_info_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(SQLThread);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +NetworkServiceDelegate::NetworkServiceDelegate()
|
| + : app_(nullptr) {
|
| +}
|
| +
|
| +NetworkServiceDelegate::~NetworkServiceDelegate() {
|
| +}
|
|
|
| void NetworkServiceDelegate::Initialize(mojo::ApplicationImpl* app) {
|
| app_ = app;
|
| +
|
| + mojo::URLRequestPtr request(mojo::URLRequest::New());
|
| + request->url = mojo::String::From("mojo:filesystem");
|
| + app_->ConnectToService(request.Pass(), &files_);
|
| +
|
| + filesystem::FileError error = filesystem::FILE_ERROR_FAILED;
|
| + filesystem::DirectoryPtr directory;
|
| + files_->OpenFileSystem("origin", GetProxy(&directory), mojo::Capture(&error));
|
| + files_.WaitForIncomingResponse();
|
| +
|
| + io_worker_thread_.reset(new SQLThread(directory.Pass()));
|
| +
|
| + // TODO(erg): Find everything else that writes to the filesystem and
|
| + // transition it to proxying mojo:filesystem. We shouldn't have any path
|
| + // calculation code here, but sadly need it until the transition is done. In
|
| + // the mean time, manually handle the user-data-dir switch (which gets set in
|
| + // tests) so that tests are writing to a temp dir.
|
| base::FilePath base_path;
|
| - CHECK(PathService::Get(base::DIR_TEMP, &base_path));
|
| - base_path = base_path.Append(FILE_PATH_LITERAL("network_service"));
|
| - context_.reset(new mojo::NetworkContext(base_path));
|
| + const base::CommandLine* command_line =
|
| + base::CommandLine::ForCurrentProcess();
|
| + if (command_line->HasSwitch("user-data-dir")) {
|
| + base_path = command_line->GetSwitchValuePath("user-data-dir");
|
| + } else {
|
| + CHECK(PathService::Get(base::DIR_TEMP, &base_path));
|
| + base_path = base_path.Append(FILE_PATH_LITERAL("network_service"));
|
| + }
|
| +
|
| + context_.reset(new mojo::NetworkContext(
|
| + base_path, io_worker_thread_->task_runner()));
|
| }
|
|
|
| bool NetworkServiceDelegate::ConfigureIncomingConnection(
|
| @@ -38,6 +112,10 @@ void NetworkServiceDelegate::Quit() {
|
| // destruction and it is the last moment we know for sure that it is
|
| // running.
|
| context_.reset();
|
| +
|
| + // Destroy the io worker thread here so that we can commit any pending
|
| + // cookies here.
|
| + io_worker_thread_.reset();
|
| }
|
|
|
| void NetworkServiceDelegate::Create(
|
|
|