| # Copyright 2015 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. |
| |
| """Python implementation of the Application interface.""" |
| |
| import application_mojom |
| import service_provider_mojom |
| import shell_mojom |
| from mojo_application.service_provider_impl import ServiceProviderImpl |
| |
| import mojo_system |
| |
| class ApplicationImpl(application_mojom.Application): |
| def __init__(self, delegate, app_request_handle): |
| self.shell = None |
| self.url = None |
| self.args = None |
| self._delegate = delegate |
| self._providers = [] |
| application_mojom.Application.manager.Bind(self, app_request_handle) |
| |
| def Initialize(self, shell, url, args): |
| self.shell = shell |
| self.url = url |
| self.args = args |
| self._delegate.Initialize(shell, self) |
| |
| def AcceptConnection(self, requestor_url, services, exposed_services, |
| resolved_url): |
| service_provider = ServiceProviderImpl(services) |
| if self._delegate.OnAcceptConnection(requestor_url, resolved_url, |
| service_provider, exposed_services): |
| # We keep a reference to ServiceProviderImpl to ensure neither it nor |
| # |services| gets garbage collected. |
| services.Bind(service_provider) |
| self._providers.append(service_provider) |
| |
| def removeServiceProvider(): |
| self._providers.remove(service_provider) |
| service_provider.manager.AddOnErrorCallback(removeServiceProvider) |
| |
| def ConnectToService(self, application_url, service_class): |
| """ |
| Helper method to connect to a service. |application_url| is the URL of the |
| application to be connected to, and |service_class| is the class of the |
| service to be connected to. Returns a proxy to the service. |
| """ |
| application_proxy, request = ( |
| service_provider_mojom.ServiceProvider.manager.NewRequest()) |
| self.shell.ConnectToApplication(application_url, request, None) |
| |
| service_proxy, request = service_class.manager.NewRequest() |
| application_proxy.ConnectToService(service_class.manager.name, |
| request.PassMessagePipe()) |
| |
| return service_proxy |