15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved. 25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be 35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file. 45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#ifndef MOJO_SHELL_DBUS_APPLICATION_LOADER_LINUX_H_ 66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define MOJO_SHELL_DBUS_APPLICATION_LOADER_LINUX_H_ 75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include <map> 95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/macros.h" 115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/memory/ref_counted.h" 126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/application_manager/application_loader.h" 135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "mojo/public/cpp/system/core.h" 145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "url/gurl.h" 155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace dbus { 175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass Bus; 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} // namespace dbus 195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace mojo { 215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace shell { 225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass Context; 245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// An implementation of ApplicationLoader that contacts a system service 265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// and bootstraps a Mojo connection to it over DBus. 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// In order to allow the externally-running service to accept connections from 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// a Mojo shell, we need to get it a ShellHandle. This class creates a 305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// dedicated MessagePipe, passes a handle to one end to the desired service 315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// over DBus, and then passes the ShellHandle over that pipe. 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// 335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// This class assumes the following: 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// 1) Your service is already running. 355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// 2) Your service implements the Mojo ExternalService API 365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// (from external_service.mojom). 375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// 3) Your service exports an object that implements the org.chromium.Mojo DBus 385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// interface: 395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// <interface name="org.chromium.Mojo"> 405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// <method name="ConnectChannel"> 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// <arg type="h" name="file_descriptor" direction="in" /> 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// </method> 435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// </interface> 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class DBusApplicationLoader : public ApplicationLoader { 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public: 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DBusApplicationLoader(Context* context); 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual ~DBusApplicationLoader(); 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // URL for DBus services are of the following format: 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // dbus:tld.domain.ServiceName/path/to/DBusObject 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // This is simply the scheme (dbus:) and then the DBus service name followed 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // by the DBus object path of an object that implements the org.chromium.Mojo 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // interface as discussed above. 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Example: 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // dbus:org.chromium.EchoService/org/chromium/MojoImpl 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // This will tell DBusApplicationLoader to reach out to a service with 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // the name "org.chromium.EchoService" and invoke the method 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // "org.chromium.Mojo.ConnectChannel" on the object exported at 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // "/org/chromium/MojoImpl". 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void Load(ApplicationManager* manager, 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const GURL& url, 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<LoadCallbacks> callbacks) OVERRIDE; 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnApplicationError(ApplicationManager* manager, 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& url) OVERRIDE; 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private: 715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu class LoadContext; 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Tosses out connection-related state to service at given URL. 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void ForgetService(const GURL& url); 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Context* const context_; 775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_refptr<dbus::Bus> bus_; 785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu typedef std::map<GURL, LoadContext*> LoadContextMap; 805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu LoadContextMap url_to_load_context_; 815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DBusApplicationLoader); 835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} // namespace shell 865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} // namespace mojo 875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif // MOJO_SHELL_DBUS_APPLICATION_LOADER_LINUX_H_ 89