// 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(mojo::ApplicationConnection* connection,
              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(mojo::ApplicationConnection* connection,
              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(mojo::ApplicationConnection* connection,
              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);
}
