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