#ifndef CONNECTION_HUB_H
#define CONNECTION_HUB_H

/*!
  \file
  \brief TCP/IP 越しにデバイス接続を行うクラス
  
  \author Satofumi KAMIMURA
  
  $Id: connectionHub.h 286 2008-10-20 09:40:22Z satofumi $
*/

#include "connectionDevice.h"
#include "tcpipServer.h"


/*!
  \todo port_a, port_b を配列にするとか？
*/
class ConnectionHub {
  enum { WaitToConnect, Connected, Closed };
  int state;
  TcpipServer* server;
  const char* con_device;
  long con_baudrate;
  ConnectionHub(void);

protected:
  ConnectionDevice* port_a;	/*!< TCP/IP 側の接続 */
  ConnectionDevice* port_b;	/*!< デバイス側の接続 */

  /*!
    \brief 接続を切断
  */
  void disconnect(void);

  /*!
    \brief 接続待ちの処理

    \param ret_value [o] 戻り値が true のときに呼出し元に返すべき値

    \return ret_value 呼出し元を抜けるべき場合に true
  */
  bool preUpdate(bool& ret_value);

public:
  /*!
    \brief 接続済みオブジェクトを用いるコンストラクタ

    \param a [i] 接続済み ConnectionDevice オブジェクト
    \param b [i] 接続済み ConnectionDevice オブジェクト
  */
  ConnectionHub(ConnectionDevice& a, ConnectionDevice& b);

  /*!
    \brief 接続待ちポート指定のコンストラクタ

    接続が行われると、device, baudrate へのシリアル接続が行われる

    \param port [i] 接続待ちポート
    \param device [i] 接続デバイス
    \param baudrate [i] 接続ボーレート
  */
  ConnectionHub(int port, const char* device, long baudrate);
  ~ConnectionHub(void);

  /*!
    \brief データの相互交換を行う

    \retval true 切断前状態
    \retval false 切断済み
  */
  bool update(void);
};

#endif /* !CONNECTION_HUB_H */
