// 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_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());
}

}  // namespace mojo

#endif  // MOJO_PUBLIC_CPP_APPLICATION_CONNECT_H_
