##
## 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 for your convenience and will not be
// overwritten once it exists! Please edit this file as necessary to implement
// your service logic.


#set($i = $intf.name())
#set($intfname = "$i$suffix")
#set($baseclname = "Base$intfname")
#set($clname = "Impl$intfname")
#if ($helper.isServer($mc))
#set($peer = "client")
#set($peerclass = "Remote${i}Client")
#else
#set($peer = "server")
#set($peerclass = "Remote${i}Server")
#end

#if ($helper.isServer($mc))
#ifndef __MAIN${intf.name().toString().toUpperCase()}LISTENER_H__
\#define __MAIN${intf.name().toString().toUpperCase()}LISTENER_H__
#else
#ifndef __MAIN${intf.name().toString().toUpperCase()}CLIENT_H__
\#define __MAIN${intf.name().toString().toUpperCase()}CLIENT_H__
#end
 

\#include "capu/Config.h"
\#include "${i}Helper.h"

namespace $namespace {
#if ($helper.isServer($mc))
  /**
   * Main program for ${i}Server. This program makes a listener to accept
   * connections from Main${i}Client.
   */
  class Main${i}Listener
   : public ${i}Helper::${i}ServerFactory
  {
  public:
    virtual ~Main${i}Listener() {}
    ${i}Server* new${i}Server(Remote${i}Client* client);
  };
#else

  /**
   * Main program for ${i}Client. This program makes a connection to the
   * listener created by Main${i}Listener.
   */
  class Main${i}Client
   : public ${i}Helper::${i}ClientFactory
  {
  public:
    virtual ~Main${i}Client() {}
    ${i}Client* new${i}Client(Remote${i}Server* server);
  };
#end
}

#if ($helper.isServer($mc))
#endif /* __MAIN${intf.name().toString().toUpperCase()}LISTENER_H__ */
#else
#endif /* __MAIN${intf.name().toString().toUpperCase()}CLIENT_H__ */

#end
 