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

#include <memory>

#include "examples/echo/echo.mojom.h"
#include "mojo/common/binding_set.h"
#include "mojo/public/c/system/main.h"
#include "mojo/public/cpp/application/application_connection.h"
#include "mojo/public/cpp/application/application_delegate.h"
#include "mojo/public/cpp/application/application_runner.h"
#include "mojo/public/cpp/application/interface_factory.h"
#include "mojo/public/cpp/bindings/strong_binding.h"

namespace mojo {
namespace examples {

// This file demonstrates three ways to implement a simple Mojo server. Because
// there's no state that's saved per-pipe, all three servers appear to the
// client to do exactly the same thing.
//
// To choose one of the them, update MojoMain() at the end of this file.
// 1. MultiServer - creates a new object for each connection. Cleans up by using
//    StrongBinding.
// 2. SingletonServer -- all requests are handled by one object. Connections are
//    tracked using BindingSet.
// 3. OneAtATimeServer -- each Create call from InterfaceFactory<> closes the
//    old interface pipe and binds the new interface pipe.

// EchoImpl defines our implementation of the Echo interface.
// It is used by all three server variants.
class EchoImpl : public Echo {
 public:
  void EchoString(const mojo::String& value,
                  const Callback<void(mojo::String)>& callback) override {
    callback.Run(value);
  }
};

// StrongBindingEchoImpl inherits from EchoImpl and adds the StrongBinding<>
// class so instances will delete themselves when the message pipe is closed.
// This simplifies lifetime management. This class is only used by MultiServer.
class StrongBindingEchoImpl : public EchoImpl {
 public:
  explicit StrongBindingEchoImpl(InterfaceRequest<Echo> handle)
      : strong_binding_(this, handle.Pass()) {}

 private:
  mojo::StrongBinding<Echo> strong_binding_;
};

// MultiServer creates a new object to handle each message pipe.
class MultiServer : public mojo::ApplicationDelegate,
                    public mojo::InterfaceFactory<Echo> {
 public:
  MultiServer() {}

  // From ApplicationDelegate
  bool ConfigureIncomingConnection(
      mojo::ApplicationConnection* connection) override {
    connection->AddService<Echo>(this);
    return true;
  }

  // From InterfaceFactory<Echo>
  void Create(const mojo::ConnectionContext& connection_context,
              mojo::InterfaceRequest<Echo> request) override {
    // This object will be deleted automatically because of the use of
    // StrongBinding<> for the declaration of |strong_binding_|.
    new StrongBindingEchoImpl(request.Pass());
  }
};

// SingletonServer uses the same object to handle all message pipes. Useful
// for stateless operation.
class SingletonServer : public mojo::ApplicationDelegate,
                        public mojo::InterfaceFactory<Echo> {
 public:
  SingletonServer() {}

  // From ApplicationDelegate
  bool ConfigureIncomingConnection(
      mojo::ApplicationConnection* connection) override {
    connection->AddService<Echo>(this);
    return true;
  }

  // From InterfaceFactory<Echo>
  void Create(const mojo::ConnectionContext& connection_context,
              mojo::InterfaceRequest<Echo> request) override {
    // All channels will connect to this singleton object, so just
    // add the binding to our collection.
    bindings_.AddBinding(&echo_impl_, request.Pass());
  }

 private:
  EchoImpl echo_impl_;

  mojo::BindingSet<Echo> bindings_;
};

// OneAtATimeServer works with only one pipe at a time. When a new pipe tries
// to bind, the previous pipe is closed. This would seem to be useful when
// clients are expected to make a single call and then go away, but in fact it's
// not reliable. There's a race condition because a second client could bind
// to the server before the first client called EchoString(). Therefore, this
// is an example of how not to write your code.
class OneAtATimeServer : public mojo::ApplicationDelegate,
                         public mojo::InterfaceFactory<Echo> {
 public:
  OneAtATimeServer() : binding_(&echo_impl_) {}

  // From ApplicationDelegate
  bool ConfigureIncomingConnection(
      mojo::ApplicationConnection* connection) override {
    connection->AddService<Echo>(this);
    return true;
  }

  // From InterfaceFactory<Echo>
  void Create(const mojo::ConnectionContext& connection_context,
              mojo::InterfaceRequest<Echo> request) override {
    binding_.Bind(request.Pass());
  }

 private:
  EchoImpl echo_impl_;

  mojo::Binding<Echo> binding_;
};

}  // namespace examples
}  // namespace mojo

MojoResult MojoMain(MojoHandle application_request) {
  // Uncomment one of the three servers at a time to see it work:
  mojo::ApplicationRunner runner(std::unique_ptr<mojo::examples::MultiServer>(
      new mojo::examples::MultiServer()));
  // mojo::ApplicationRunner runner(new mojo::examples::SingletonServer());
  // mojo::ApplicationRunner runner(new mojo::examples::OneAtATimeServer());

  return runner.Run(application_request);
}
