Subversion Repositories HomeAutomation

Rev

Rev 1962 | Rev 1971 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  1. /*
  2.  *
  3.  *  Copyright (C) 2010  Mattias Runge
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License along
  16.  *  with this program; if not, write to the Free Software Foundation, Inc.,
  17.  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  18.  *
  19.  */
  20.  
  21. #include "Client.h"
  22.  
  23. #include <iostream>
  24.  
  25. #include <boost/bind.hpp>
  26. #include <boost/lexical_cast.hpp>
  27.  
  28. #include "common/log.h"
  29.  
  30. namespace atom {
  31. namespace net {
  32.  
  33. static const std::string log_module_ = "net::client";
  34.  
  35. Client::Client(boost::asio::io_service& io_service, SocketId id, SocketId server_id) : buffer_(2048), io_service_(io_service)
  36. {
  37.   LOG_DEBUG_ENTER;
  38.  
  39.   this->server_id_ = server_id;
  40.   this->id_ = id;
  41.  
  42.   LOG_DEBUG_EXIT;
  43. }
  44.  
  45. Client::~Client()
  46. {
  47.   LOG_DEBUG_ENTER;
  48.  
  49.   this->Stop();
  50.  
  51.   LOG_DEBUG_EXIT;
  52. }
  53.  
  54. void Client::ConnectSlots(const SignalOnNewState::slot_type& slot_on_new_state, const SignalOnNewData::slot_type& slot_on_new_data)
  55. {
  56.   LOG_DEBUG_ENTER;
  57.  
  58.   this->signal_on_new_state_.connect(slot_on_new_state);
  59.   this->signal_on_new_data_.connect(slot_on_new_data);
  60.  
  61.   LOG_DEBUG_EXIT;
  62. }
  63.  
  64. SocketId Client::GetId()
  65. {
  66.   LOG_DEBUG_ENTER;
  67.   LOG_DEBUG_EXIT;
  68.  
  69.   return this->id_;
  70. }
  71.  
  72. SocketId Client::GetServerId()
  73. {
  74.   LOG_DEBUG_ENTER;
  75.   LOG_DEBUG_EXIT;
  76.  
  77.   return this->server_id_;
  78. }
  79.  
  80. void Client::Read()
  81. {
  82.   LOG_DEBUG_ENTER;
  83.  
  84.   this->buffer_.Clear();
  85.  
  86.   LOG_DEBUG_EXIT;
  87. }
  88.  
  89. void Client::ReadHandler(const boost::system::error_code& error, size_t size)
  90. {
  91.   LOG_DEBUG_ENTER;
  92.  
  93.   if (error)
  94.   {
  95.     this->Disconnect();
  96.   }
  97.   else if (size == 0)
  98.   {
  99.     this->Disconnect();
  100.   }
  101.   else
  102.   {
  103.     this->buffer_.SetSize(size);
  104.    
  105.     this->signal_on_new_data_(this->id_, this->server_id_, this->buffer_);
  106.    
  107.     this->Read();
  108.   }
  109.  
  110.   LOG_DEBUG_EXIT;
  111. }
  112.  
  113. void Client::Stop()
  114. {
  115.   LOG_DEBUG_ENTER;
  116.   LOG_DEBUG_EXIT;
  117. }
  118.  
  119. void Client::Disconnect()
  120. {
  121.   LOG_DEBUG_ENTER;
  122.  
  123.   if (this->id_ != 0)
  124.   {
  125.     SocketId id = this->id_;
  126.      
  127.     this->Stop();
  128.        
  129.     this->id_ = 0;
  130.        
  131.     this->signal_on_new_state_(id, this->server_id_, CLIENT_STATE_DISCONNECTED);
  132.   }
  133.  
  134.   LOG_DEBUG_EXIT;
  135. }
  136.    
  137. }; // namespace net
  138. }; // namespace atom
  139.