Index: mojo/python/content_handler/content_handler_main.cc |
diff --git a/mojo/python/content_handler/content_handler_main.cc b/mojo/python/content_handler/content_handler_main.cc |
deleted file mode 100644 |
index 3bc09c17f983cab1a0a4e7e6a586f25c49d4336b..0000000000000000000000000000000000000000 |
--- a/mojo/python/content_handler/content_handler_main.cc |
+++ /dev/null |
@@ -1,177 +0,0 @@ |
-// Copyright 2014 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 <python2.7/Python.h> |
-#include <dlfcn.h> |
- |
-#include "base/files/file_path.h" |
-#include "base/files/scoped_temp_dir.h" |
-#include "base/i18n/icu_util.h" |
-#include "mojo/application/application_runner_chromium.h" |
-#include "mojo/application/content_handler_factory.h" |
-#include "mojo/common/common_type_converters.h" |
-#include "mojo/common/data_pipe_utils.h" |
-#include "mojo/public/c/system/main.h" |
-#include "mojo/public/cpp/application/application_delegate.h" |
-#include "mojo/public/cpp/application/application_impl.h" |
-#include "mojo/public/cpp/application/interface_factory_impl.h" |
-#include "mojo/public/python/src/common.h" |
-#include "third_party/zlib/google/zip_reader.h" |
- |
-char kMojoSystem[] = "mojo_system"; |
-char kMojoSystemImpl[] = "mojo_system_impl"; |
-char kMojoMain[] = "MojoMain"; |
- |
-extern "C" { |
- void initmojo_system(); |
- void initmojo_system_impl(); |
-} |
- |
-namespace mojo { |
-namespace python { |
- |
-class PythonContentHandler : public ApplicationDelegate, |
- public ContentHandlerFactory::Delegate { |
- public: |
- PythonContentHandler() : content_handler_factory_(this) {} |
- |
- private: |
- // Overridden from ApplicationDelegate: |
- bool ConfigureIncomingConnection(ApplicationConnection* connection) override { |
- connection->AddService(&content_handler_factory_); |
- return true; |
- } |
- |
- // Extracts the target application into a temporary directory. This directory |
- // is deleted at the end of the life of the PythonContentHandler object. |
- std::unique_ptr<base::ScopedTempDir> ExtractApplication( |
- URLResponsePtr response) { |
- std::unique_ptr<base::ScopedTempDir> temp_dir(new base::ScopedTempDir); |
- MOJO_CHECK(temp_dir->CreateUniqueTempDir()); |
- |
- zip::ZipReader reader; |
- const std::string input_data = CopyToString(response->body.Pass()); |
- MOJO_DCHECK(reader.OpenFromString(input_data)); |
- base::FilePath temp_dir_path = temp_dir->path(); |
- while (reader.HasMore()) { |
- MOJO_DCHECK(reader.OpenCurrentEntryInZip()); |
- MOJO_DCHECK(reader.ExtractCurrentEntryIntoDirectory(temp_dir_path)); |
- MOJO_DCHECK(reader.AdvanceToNextEntry()); |
- } |
- return temp_dir; |
- } |
- |
- // Sets up the Python interpreter and loads mojo system modules. This method |
- // returns the global dictionary for the python environment that should be |
- // used for subsequent calls. Takes as input the path of the unpacked |
- // application files. |
- PyObject* SetupPythonEnvironment(const std::string& application_path) { |
- // TODO(etiennej): Build python ourselves so we don't have to rely on |
- // dynamically loading a system library. |
- dlopen("libpython2.7.so", RTLD_LAZY | RTLD_GLOBAL); |
- |
- PyImport_AppendInittab(kMojoSystemImpl, &initmojo_system_impl); |
- PyImport_AppendInittab(kMojoSystem, &initmojo_system); |
- |
- Py_Initialize(); |
- |
- PyObject *m, *d; |
- m = PyImport_AddModule("__main__"); |
- if (m == NULL) |
- return NULL; |
- d = PyModule_GetDict(m); |
- |
- // Inject the application path into the python search path so that imports |
- // from the application work as expected. |
- std::string search_path_py_command = |
- "import sys; sys.path.append('" + application_path + "');"; |
- ScopedPyRef result( |
- PyRun_String(search_path_py_command.c_str(), Py_file_input, d, d)); |
- |
- if (result == nullptr) { |
- LOG(ERROR) << "Error while configuring path"; |
- PyErr_Print(); |
- return NULL; |
- } |
- |
- return d; |
- } |
- |
- // Overridden from ContentHandlerFactory::ManagedDelegate: |
- void RunApplication(ShellPtr shell, URLResponsePtr response) override { |
- std::unique_ptr<base::ScopedTempDir> temp_dir = |
- ExtractApplication(response.Pass()); |
- base::FilePath directory_path = temp_dir->path(); |
- |
- PyObject* d = SetupPythonEnvironment(directory_path.value()); |
- MOJO_DCHECK(d); |
- |
- base::FilePath entry_path = directory_path.Append("__mojo__.py"); |
- |
- FILE* entry_file = base::OpenFile(entry_path, "r"); |
- MOJO_DCHECK(entry_file); |
- |
- // Ensure that all created objects are destroyed before calling Py_Finalize. |
- { |
- // Load the __mojo__.py file into the interpreter. MojoMain hasn't run |
- // yet. |
- ScopedPyRef result(PyRun_File(entry_file, entry_path.value().c_str(), |
- Py_file_input, d, d)); |
- if (result == nullptr) { |
- LOG(ERROR) << "Error while loading script"; |
- PyErr_Print(); |
- return; |
- } |
- |
- // Find MojoMain. |
- ScopedPyRef py_function(PyMapping_GetItemString(d, kMojoMain)); |
- |
- if (py_function == NULL) { |
- LOG(ERROR) << "Locals size: " << PyMapping_Size(d); |
- LOG(ERROR) << "MojoMain not found"; |
- PyErr_Print(); |
- return; |
- } |
- |
- if (PyCallable_Check(py_function)) { |
- MojoHandle shell_handle = shell.PassMessagePipe().release().value(); |
- ScopedPyRef py_input(PyInt_FromLong(shell_handle)); |
- ScopedPyRef py_arguments(PyTuple_New(1)); |
- // py_input reference is stolen by py_arguments |
- PyTuple_SetItem(py_arguments, 0, py_input.Release()); |
- // Run MojoMain with shell_handle as the first and only argument. |
- ScopedPyRef py_output(PyObject_CallObject(py_function, py_arguments)); |
- |
- if (!py_output) { |
- LOG(ERROR) << "Error while executing MojoMain"; |
- PyErr_Print(); |
- return; |
- } |
- } else { |
- LOG(ERROR) << "MojoMain is not callable; it should be a function"; |
- } |
- } |
- Py_Finalize(); |
- } |
- |
- std::string CopyToString(ScopedDataPipeConsumerHandle body) { |
- std::string body_str; |
- bool result = common::BlockingCopyToString(body.Pass(), &body_str); |
- DCHECK(result); |
- return body_str; |
- } |
- |
- ContentHandlerFactory content_handler_factory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(PythonContentHandler); |
-}; |
- |
-} // namespace python |
-} // namespace mojo |
- |
-MojoResult MojoMain(MojoHandle shell_handle) { |
- mojo::ApplicationRunnerChromium runner( |
- new mojo::python::PythonContentHandler()); |
- return runner.Run(shell_handle); |
-} |