/* $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 __ETCHTCPCONNECTION_H__
#define __ETCHTCPCONNECTION_H__

#include "capu/util/Runnable.h"

#include "common/EtchObject.h"
#include "common/EtchError.h"
#include "common/EtchString.h"
#include "common/EtchSocket.h"
#include "support/EtchRuntime.h"
#include "transport/EtchConnection.h"
#include "transport/EtchTransportData.h"
#include "transport/EtchFlexBuffer.h"
#include "transport/EtchSessionData.h"
#include "transport/EtchTcpOption.h"
#include "util/EtchURL.h"
#include "util/EtchResources.h"
#include "util/EtchLogger.h"

class EtchRuntime;

/**
 * Implementation of connection which handles a tcp connection.
 */
class EtchTcpConnection : public EtchConnection<EtchSessionData>, public EtchTransportData, public capu::Runnable {
public:

  /**
   * Constructs the Connection from a uri.
   * @param socket
   * @param uri
   * @param resources
   */
  EtchTcpConnection(EtchRuntime* runtime, EtchSocket* socket, EtchURL* uri);

  /**
   * Destructor
   */
  ~EtchTcpConnection();

  /**
   * @see TransportData
   */
  status_t transportControl(capu::SmartPointer<EtchObject> control, capu::SmartPointer<EtchObject> value);


  /**
   * @see TransportData
   */
  status_t transportData(capu::SmartPointer<EtchWho> recipient, capu::SmartPointer<EtchFlexBuffer> buf);

  /**
   * @see TransportData
   */
  status_t transportNotify(capu::SmartPointer<EtchObject> event);

  /**
   * @see TransportData
   */
  status_t transportQuery(capu::SmartPointer<EtchObject> query, capu::SmartPointer<EtchObject> *result);

  /**
   * @return Session
   */
  EtchSessionData* getSession();

  /**
   * Sets session
   */
  void setSession(EtchSessionData* session);


  /**
   * @see EtchConnection
   */
  capu::bool_t isStarted();

  /**
   * @see capu::thread
   */
  void run();

  /**
   * @see EtchConnection
   */
  status_t close();

  /**
   * @see EtchConnection
   */
  status_t setupSocket();

  /**
   * Sends some data to the remote end. If the connection is buffered, the
   * data is saved until the buffer is full or the buffer is flushed. If the
   * connection is not buffered, the data is sent to the operating system
   * immediately. The operating system may or may not transmit the data
   * immediately, depending upon the noDelay setting.
   * @param buf the bytes to be sent.
   * @param off the offset into buf of the first byte to send.
   * @param len the number of bytes to send.
   * @return ETCH_OK if the sent is successful
   *         ETCH_EINVAL if the buffer is NULL or socket is not opened
   *         ETCH_ERROR otherwise
   */
  status_t send(capu::int8_t* buf, capu::uint32_t off, capu::uint32_t len);

  /**
   * Sets the number of connection attempts
   * @param numAttempts
   */
  void setNumAttempts(capu::uint8_t numAttempts);

private:
  EtchString mHost;
  capu::uint16_t mPort;
  EtchSocket* mSocket;
  EtchTcpOption mOptions;
  capu::uint8_t mNumAttempts;
  EtchRuntime *mRuntime;

protected:

  status_t readSocket();

  status_t openSocket(capu::bool_t reconnect);

};

#endif /* ETCHTCPCONNECTION_H */

