##
## Licensed to the Apache Software Foundation (ASF) under one
## or more contributor license agreements.  See the NOTICE file
## distributed with this work for additional information
## regarding copyright ownership.  The ASF licenses this file
## to you under the Apache License, Version 2.0 (the
## "License"); you may not use this file except in compliance
## with the License.  You may obtain a copy of the License at
##
##   http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing,
## software distributed under the License is distributed on an
## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
## KIND, either express or implied.  See the License for the
## specific language governing permissions and limitations
## under the License.
##

// This file automatically generated by:
//   $version
//   $now
// This file is automatically created and should not be edited!

#set($i = $intf.name())
#set($vfname = "ValueFactory$i")
#set($intfname = "$i$suffix")
#set($clname = "Remote$intfname")

#ifndef __$helper.getRemoteName($intf, $mc).toUpperCase()_H__
\#define __$helper.getRemoteName($intf, $mc).toUpperCase()_H__

#if(!$hasBaseClass)
\#include "support/EtchRemoteBase.h"
#else
\#include "${vfname}.h"
\#include "$inc"
\#include "Remote${i}.h"
#end
\#include "${intfname}.h"
\#include "support/EtchAsyncResult.h"

namespace $namespace {
  /**
   * Call to message translator for $intfname.
   */
#if($hasBaseClass)
  class $clname : public Remote$i, public $intfname
#else
  class $clname : public EtchRemoteBase, public $intfname
#end
  {
  private:

    /**
     * Async result implementations of service methods.
     */

#foreach($n in $intf.iterator())
#if($n.isMsgDir($mc))
#if(!$n.isHidden())
    class $n.name()AsyncResultRemote : public #if($n.hasReturn())EtchAsyncResult<$helper.getEtchTypeName($n.type(), false)>#{else}EtchAsyncResultNone#end {
    public:
      /**
       * Create a new instance from $clname class
       */
      $n.name()AsyncResultRemote($clname* base, capu::SmartPointer<EtchMailbox> mailbox);

      /**
       * Destructor
       */
      virtual ~$n.name()AsyncResultRemote();

      /**
       * @see EtchNotify
       */
      status_t mailboxStatus(EtchMailbox* mb, EtchObject* state, capu::bool_t closed);

      /**
       * Create a new instance from $clname class
       */
       static $n.name()AsyncResultPtr Begin($clname* base#set($sep = ", ")#foreach($p in $n.iterator())$sep$helper.getEtchTypeName($p.type(), true) $p.name()#end);

    private:
        $clname* mBase;
    };

#end
#end
#end
  public:
    /**
     * Constructs the $clname.
     *
     * @param svc
     * @param vf
     * @param stack
     */
    $clname(EtchRuntime* runtime, EtchDeliveryService* svc, EtchValueFactory* vf, EtchStack* stack );
    
    /**
     * Destructor
     */
    virtual ~$clname();
  protected:
#if(!$hasBaseClass)
     EtchRuntime* mRuntime;
#end

  public:
#foreach($n in $intf.iterator())
#if($n.isMsgDir($mc) || $n.isMsgDirBoth())
#if(!$n.isHidden())
#if(!$methodList.contains($n.name().name()))
#set ( $addMethodListStatus = $methodList.add($n.name().name()))
    $n.name()AsyncResultPtr $n.name()(#set( $sep = "" )#foreach( $p in $n.iterator() )$sep$helper.getEtchTypeName($p.type(), true) $p.name()#set( $sep = ", " )#end);
## TODO Implement delegate
## $n.name()AsyncResultPtr $n.name()(#set( $sep = "" )#foreach( $p in $n.iterator() )$sep$helper.getEtchTypeName($p.type(), true) $p.name()#set( $sep = ", " )#end${sep}EtchDelegate<$intfname::$n.name()AsyncResultPtr>* delegate);
#end
#end
#end
#end
##    //TODO: MIXIN generation!
###set( $k = 0 )
###foreach( $x in $intf.iterator() )
###if( $x.isMixin() )
##
##  // ----- mixin $x.name() ----- //
###set( $k = $k + 1 )
###set( $v = "_mixin$k" )
###set( $m = $x.getModule() )
###set( $z = $m.iterator().next() )
##
##  private final ${m.name()}.Remote$z.name()$suffix $v;
###foreach( $n in $z.messages( true ) )
###if($n.isMsgDir($mc))
###if(!$n.isHidden())
###if(!$methodList.contains($n.name().name()))
###set ( $addMethodListStatus = $methodList.add($n.name().name()) )
##  // --- generated methods for $n.name() --- //

###if($n.isOneway())
##  public final $helper.getTypeName( $n.type() ) $n.name()(
###set( $sep = "" )
###foreach( $p in $n.iterator() )
##    $sep$helper.getTypeName( $p.type() ) $p.name()
###set( $sep = ", " )
###end
##  )
##  {
##    ${v}.$n.name()(
###set( $sep = "" )
###foreach( $p in $n.iterator() )
##      $sep$p.name()
###set( $sep = ", " )
###end
##    );
##  }
###else
##  public final $helper.getTypeName( $n.type() ) $n.name()(
###set( $sep = "" )
###foreach( $p in $n.iterator() )
##    $sep$helper.getTypeName( $p.type() ) $p.name()
###set( $sep = ", " )
###end
##  )
###if($n.thrown().iterator().hasNext())
##  throws
###set( $sep = "" )
###foreach($t in $n.thrown().iterator())
##    $sep$t.getNamed().fqname()
###set( $sep = ", " )
###end
###end
##  {
###if($n.hasReturn())
##    return
###end
##    ${v}.$n.name()(
###set( $sep = "" )
###foreach( $p in $n.iterator() )
##      $sep$p.name()
###set( $sep = ", " )
###end
##    );
##  }
###end
###end
###end
###end
###end
###end
###end
  };
  typedef capu::SmartPointer<$clname> ${clname}Ptr;
}
#endif /* __$helper.getRemoteName($intf, $mc).toUpperCase()_H__ */
