// 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.

// Helpers for using |ServiceProvider|s.

#ifndef MOJO_PUBLIC_CPP_APPLICATION_CONNECT_H_
#define MOJO_PUBLIC_CPP_APPLICATION_CONNECT_H_

#include "mojo/public/cpp/bindings/interface_handle.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "mojo/public/interfaces/application/application_connector.mojom.h"
#include "mojo/public/interfaces/application/service_provider.mojom.h"
#include "mojo/public/interfaces/application/shell.mojom.h"

namespace mojo {

// Helper for using a |ServiceProvider|'s |ConnectToService()| that takes a
// fully-typed interface request (and can use the default interface name). Note
// that this can be used in conjunction with |GetProxy()|, etc. E.g.:
//
//   FooPtr foo;
//   ConnectToService(service_provider, GetProxy(&foo));
template <typename Interface>
inline void ConnectToService(
    ServiceProvider* service_provider,
    InterfaceRequest<Interface> interface_request,
    const std::string& interface_name = Interface::Name_) {
  service_provider->ConnectToService(interface_name,
                                     interface_request.PassMessagePipe());
}

// Helper for connecting to an application (specified by URL) using the |Shell|
// and then a service from it. (As above, this is typed and may be used with
// |GetProxy()|.)
template <typename Interface>
inline void ConnectToService(
    Shell* shell,
    const std::string& application_url,
    InterfaceRequest<Interface> interface_request,
    const std::string& interface_name = Interface::Name_) {
  ServiceProviderPtr service_provider;
  shell->ConnectToApplication(application_url, GetProxy(&service_provider),
                              nullptr);
  ConnectToService(service_provider.get(), interface_request.Pass(),
                   interface_name);
}

// Helper for connecting to an application (specified by URL) using an
// |ApplicationConnector| and then a service from it. (As above, this is typed
// and may be used with |GetProxy()|.)
template <typename Interface>
inline void ConnectToService(ApplicationConnector* application_connector,
                             const std::string& application_url,
                             InterfaceRequest<Interface> request) {
  ServiceProviderPtr service_provider;
  application_connector->ConnectToApplication(
      application_url, GetProxy(&service_provider), nullptr);
  ConnectToService(service_provider.get(), request.Pass());
}

// Helper for getting an |InterfaceHandle<ApplicationConnector>| (which can be
// passed to any thread) from the shell.
InterfaceHandle<ApplicationConnector> CreateApplicationConnector(Shell* shell);

// Helper for "duplicating" a |ApplicationConnector| (typically, from an
// |ApplicationConnectorPtr|, getting another independent
// |InterfaceHandle<ApplicationConnector>|).
InterfaceHandle<ApplicationConnector> DuplicateApplicationConnector(
    ApplicationConnector* application_connector);

}  // namespace mojo

#endif  // MOJO_PUBLIC_CPP_APPLICATION_CONNECT_H_
