// This file automatically generated by:
//   Apache Etch 1.3.0-incubating (LOCAL-0) / c 1.3.0-incubating (LOCAL-0)
//   Fri Jul 27 11:35:36 CEST 2012
// 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.
