/* $Id$
 *
 * 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.
 */


#ifndef __ETCHTCPTRANSPORTFACTORY_H__
#define __ETCHTCPTRANSPORTFACTORY_H__

#include "common/EtchString.h"
#include "common/EtchConfig.h"
#include "support/EtchServerFactory.h"
#include "support/EtchStack.h"
#include "transport/EtchTransportMessage.h"
#include "transport/EtchTransportData.h"
#include "transport/EtchTransportPacket.h"
#include "transport/EtchPacketizer.h"
#include "transport/EtchTcpConnection.h"
#include "transport/EtchTcpListener.h"
#include "transport/EtchMessagizer.h"
#include "transport/EtchTransportFactory.h"
#include "util/EtchResources.h"

class EtchTcpTransportFactory
 : public EtchTransportFactory {
public:

  friend class MySessionListener;
  /**
   * Constructor
   * @param runtime
   */
  EtchTcpTransportFactory(EtchRuntime* runtime);

  /**
   * Constructor
   * @param runtime
   * @param secure indicates whether the connection should be secured by SSL or not
   */
  EtchTcpTransportFactory(EtchRuntime* runtime, capu::bool_t secure);

  /**
   * Destructor
   */
  virtual ~EtchTcpTransportFactory();

  /**
   * @see EtchTransportFactory
   */
  status_t newTransport(EtchString uri, EtchResources* resources, EtchTransportMessage*& result);

  /**
   * @see EtchTransportFactory
   */
  status_t newListener(EtchString uri, EtchResources* resources, EtchTransport<EtchServerFactory>*& result);

private:
  static const EtchString& SOCKET();
  EtchRuntime* mRuntime;
  const capu::bool_t mIsSecure;

  class MySessionListener : public EtchTransport<EtchServerFactory>, public EtchSessionListener<EtchSocket> {
  public:

    /**
     * Creates a new Session Listener
     * @param runtime
     * @param transport
     * @param uri
     * @param resources
     */
    MySessionListener(EtchRuntime* runtime, EtchTcpTransportFactory* factory, EtchTransport<EtchSessionListener<EtchSocket> > *transport,
            EtchString uri, EtchResources* resources, capu::bool_t secure);

     /**
      * Destructor
      */
    virtual ~MySessionListener();

    /**
     * @see EtchTransport
     */
    EtchServerFactory* getSession();

    /**
     * @see EtchTransport
     */
    void setSession(EtchServerFactory* session);

    /**
     * @see EtchTransport
     */
    status_t transportQuery(capu::SmartPointer<EtchObject> query, capu::SmartPointer<EtchObject> *result);

    /**
     * @see EtchTransport
     */
    status_t transportControl(capu::SmartPointer<EtchObject> control, capu::SmartPointer<EtchObject> value);

    /**
     * @see EtchTransport
     */
    status_t transportNotify(capu::SmartPointer<EtchObject> event);

    /**
     * @see EtchSessionListener
     */
    status_t sessionAccepted(EtchSocket* connection);

    /**
     * @see EtchSessionListener
     */
    status_t sessionQuery(capu::SmartPointer<EtchObject> query, capu::SmartPointer<EtchObject> &result);

    /**
     * @see EtchSessionListener
     */
    status_t sessionControl(capu::SmartPointer<EtchObject> control, capu::SmartPointer<EtchObject> value);

    /**
     * @see EtchSessionListener
     */
    status_t sessionNotify(capu::SmartPointer<EtchObject> event);

  private:
    EtchRuntime* mRuntime;
    EtchTcpTransportFactory* mFactory;
    EtchTransport<EtchSessionListener<EtchSocket> > *mTransport;
    EtchString mUri;
    EtchResources* mResources;
    capu::bool_t mIsSecure;
    EtchServerFactory* mSession;
    capu::List<EtchStack*>* mConnectionStacks;
  };

};

#endif

