| Index: mojo/public/cpp/shell/application.h
|
| diff --git a/mojo/public/cpp/shell/application.h b/mojo/public/cpp/shell/application.h
|
| index 933077bfdc9e4a01751e587530afc1d4a0cbfc33..3e016d18114c45b15ee26a15137fd7b3564fb052 100644
|
| --- a/mojo/public/cpp/shell/application.h
|
| +++ b/mojo/public/cpp/shell/application.h
|
| @@ -7,24 +7,61 @@
|
|
|
| #include <vector>
|
|
|
| -#include "mojo/public/cpp/shell/service.h"
|
| +#include "mojo/public/cpp/shell/connect.h"
|
| +#include "mojo/public/cpp/shell/lib/service_connector.h"
|
| #include "mojo/public/cpp/system/core.h"
|
| #include "mojo/public/interfaces/shell/shell.mojom.h"
|
|
|
| namespace mojo {
|
|
|
| +// Utility class for creating ShellClients that vend service instances.
|
| +// To use define a class that implements your specific server api, e.g. FooImpl
|
| +// to implement a service named Foo.
|
| +// That class must subclass an InterfaceImpl specialization.
|
| +//
|
| +// If there is context that is to be shared amongst all instances, define a
|
| +// constructor with that class as its only argument, otherwise define an empty
|
| +// constructor.
|
| +//
|
| +// class FooImpl : public InterfaceImpl<Foo> {
|
| +// public:
|
| +// FooImpl() {}
|
| +// };
|
| +//
|
| +// or
|
| +//
|
| +// class BarImpl : public InterfaceImpl<Bar> {
|
| +// public:
|
| +// // context will remain valid for the lifetime of BarImpl.
|
| +// BarImpl(BarContext* context) : context_(context) {}
|
| +// private:
|
| +// BarContext* context;
|
| +// };
|
| +//
|
| +// Create an Application instance that collects any service implementations.
|
| +//
|
| +// Application app(shell_handle);
|
| +// app.AddService<FooImpl>();
|
| +//
|
| +// BarContext context;
|
| +// app.AddService<BarImpl>(&context);
|
| +//
|
| +//
|
| class Application : public internal::ServiceConnectorBase::Owner {
|
| public:
|
| explicit Application(ScopedMessagePipeHandle shell_handle);
|
| explicit Application(MojoHandle shell_handle);
|
| virtual ~Application();
|
|
|
| - // internal::ServiceConnectorBase::Owner methods.
|
| - // Takes ownership of |service_connector|.
|
| - virtual void AddServiceConnector(
|
| - internal::ServiceConnectorBase* service_connector) MOJO_OVERRIDE;
|
| - virtual void RemoveServiceConnector(
|
| - internal::ServiceConnectorBase* service_connector) MOJO_OVERRIDE;
|
| + template <typename Impl, typename Context>
|
| + void AddService(Context* context) {
|
| + AddServiceConnector(new internal::ServiceConnector<Impl, Context>(context));
|
| + }
|
| +
|
| + template <typename Impl>
|
| + void AddService() {
|
| + AddServiceConnector(new internal::ServiceConnector<Impl, void>(NULL));
|
| + }
|
|
|
| template <typename Interface>
|
| void ConnectTo(const std::string& url, InterfacePtr<Interface>* ptr) {
|
| @@ -33,11 +70,20 @@ class Application : public internal::ServiceConnectorBase::Owner {
|
|
|
| protected:
|
| // ShellClient methods.
|
| + // Override this to dispatch to correct service when there's more than one.
|
| + // TODO(davemoore): Augment this with name registration.
|
| virtual void AcceptConnection(const mojo::String& url,
|
| ScopedMessagePipeHandle client_handle)
|
| MOJO_OVERRIDE;
|
|
|
| private:
|
| + // internal::ServiceConnectorBase::Owner methods.
|
| + // Takes ownership of |service_connector|.
|
| + virtual void AddServiceConnector(
|
| + internal::ServiceConnectorBase* service_connector) MOJO_OVERRIDE;
|
| + virtual void RemoveServiceConnector(
|
| + internal::ServiceConnectorBase* service_connector) MOJO_OVERRIDE;
|
| +
|
| typedef std::vector<internal::ServiceConnectorBase*> ServiceConnectorList;
|
| ServiceConnectorList service_connectors_;
|
| };
|
|
|