Subversion Repositories HomeAutomation

Rev

Rev 1963 | Rev 1987 | 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.  
  94.   if (error)
  95.   {
  96.     log::Debug(log_module_, "error %d", error);
  97.    
  98.     if (boost::system::errc::operation_canceled != error)
  99.     {
  100.       this->Disconnect();
  101.     }
  102.   }
  103.   else if (size == 0)
  104.   {
  105.     log::Debug(log_module_, "size 0");
  106.    
  107.     this->Disconnect();
  108.   }
  109.   else
  110.   {
  111.     this->buffer_.SetSize(size);
  112.    
  113.     this->signal_on_new_data_(this->id_, this->server_id_, this->buffer_);
  114.    
  115.     this->Read();
  116.   }
  117.  
  118.   LOG_DEBUG_EXIT;
  119. }
  120.  
  121. void Client::Stop()
  122. {
  123.   LOG_DEBUG_ENTER;
  124.   LOG_DEBUG_EXIT;
  125. }
  126.  
  127. void Client::Disconnect()
  128. {
  129.   LOG_DEBUG_ENTER;
  130.  
  131.   if (this->id_ != 0)
  132.   {
  133.     SocketId id = this->id_;
  134.      
  135.     this->Stop();
  136.        
  137.     this->id_ = 0;
  138.        
  139.     this->signal_on_new_state_(id, this->server_id_, CLIENT_STATE_DISCONNECTED);
  140.   }
  141.  
  142.   LOG_DEBUG_EXIT;
  143. }
  144.    
  145. }; // namespace net
  146. }; // namespace atom
  147.