// 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 "ImplHelloWorldClient.h"

using namespace org_apache_etch_examples_helloworld_HelloWorld;

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

  ImplHelloWorldClient::ImplHelloWorldClient( RemoteHelloWorldServer* mServer )
  {
    this->mServer = mServer;
  }

  status_t ImplHelloWorldClient::_sessionNotify(capu::SmartPointer<EtchObject> event ) {
    if (event->isInstanceOf(EtchString::TYPE())) {
        EtchStringPtr eventName = capu::smartpointer_cast<EtchString>(event);
        printf("Got sessionNotifyEvent %s\n",eventName->c_str());
    } else if (event->isInstanceOf(EtchException::TYPE())) {
            EtchException* eventName = (EtchException*) event.get();
            printf("Got sessionNotify Exception %s\n",eventName->getErrorMessage().c_str());
    } else {
        printf("Got sessionNotify of type %d\n",event->getObjectType()->getTypeId());
    }
    
    return ETCH_OK;
  }

  // TODO insert methods here to provide implementations of HelloWorldClient
  // messages from the mServer.
