// This file automatically generated by:
//   Apache Etch 1.4.0 (LOCAL-0) / cpp 1.4.0 (LOCAL-0)
//   Fri Apr 04 11:35:36 CEST 2014
// This file is automatically created for your convenience and will not be
// overwritten once it exists! Please edit this file as necessary to implement
// your service logic.

#include "ImplHelloWorldServer.h"

using namespace org_apache_etch_examples_helloworld_HelloWorld;

/**
 * Your custom implementation of BaseHelloWorldServer. Add methods here to provide
 * implementations of messages from the mClient.
 */

  ImplHelloWorldServer::ImplHelloWorldServer( RemoteHelloWorldClient* mClient )
  {
    this->mClient = mClient;
  }

  // TODO insert methods here to provide implementations of HelloWorldServer
  // messages from the mClient.
  ImplHelloWorldServer::say_helloAsyncResultPtr ImplHelloWorldServer::say_hello(HelloWorld::userPtr to_whom)
  {
    say_helloAsyncResultPtr res = new EtchAsyncResult<EtchString>();
    res->setResult(new EtchString("Hi From C++ Server!"));
    return res;
  }
