Subversion Repositories HomeAutomation

Rev

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

  1. /***************************************************************************
  2.  *   Copyright (C) January 4, 2009 by Mattias Runge                             *
  3.  *   mattias@runge.se                                                      *
  4.  *   server.cpp                                            *
  5.  *                                                                         *
  6.  *   This program is free software; you can redistribute it and/or modify  *
  7.  *   it under the terms of the GNU General Public License as published by  *
  8.  *   the Free Software Foundation; either version 2 of the License, or     *
  9.  *   (at your option) any later version.                                   *
  10.  *                                                                         *
  11.  *   This program is distributed in the hope that it will be useful,       *
  12.  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
  13.  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
  14.  *   GNU General Public License for more details.                          *
  15.  *                                                                         *
  16.  *   You should have received a copy of the GNU General Public License     *
  17.  *   along with this program; if not, write to the                         *
  18.  *   Free Software Foundation, Inc.,                                       *
  19.  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  20.  ***************************************************************************/
  21.  
  22. #include "server.h"
  23.  
  24. Server::Server(int port, string name)
  25. {
  26.     setSettings(port, name);
  27. }
  28.  
  29. Server::~Server()
  30. {
  31.     stop();
  32.  
  33.     for (map<int, AsyncSocket*>::iterator iter = myClientSockets.begin(); iter != myClientSockets.end(); iter++)
  34.     {
  35.         if (iter->second->isConnected())
  36.         {
  37.             iter->second->stop();
  38.         }
  39.  
  40.         delete iter->second;
  41.     }
  42. }
  43.  
  44. void Server::setSettings(int port, string name)
  45. {
  46.     myName = name;
  47.     mySocket.setPort(port);
  48. }
  49.  
  50. void Server::run()
  51. {
  52.     Logger &log = Logger::getInstance();
  53.  
  54.     try
  55.     {
  56.         mySocket.startListen();
  57.  
  58.         log.add(myName + " is listening for connections on port " + itos(mySocket.getPort()) + ".\n");
  59.  
  60.         while (true)
  61.         {
  62.             AsyncSocket *newSocket = new AsyncSocket();
  63.  
  64.             if (mySocket.accept(newSocket))
  65.             {
  66.                 newSocket->sendData("Welcome to Atom " + ftos(VERSION) + " - " + myName + "\r\n");
  67.  
  68.                 log.add(myName + " accepted new client with id " + itos(newSocket->getId()) + ".\n");
  69.                 myClientSockets[newSocket->getId()] = newSocket;
  70.                 myClientSockets[newSocket->getId()]->eventSetCallback(this);
  71.                 myClientSockets[newSocket->getId()]->start();
  72.             }
  73.         }
  74.     }
  75.     catch (SocketException* e)
  76.     {
  77.         log.add(myName + " caught an exception:" + e->getDescription() + ".\n");
  78.     }
  79. }
  80.  
  81. void Server::sendToAll(string data)
  82. {
  83.     Logger &log = Logger::getInstance();
  84.  
  85.     for (map<int, AsyncSocket*>::iterator iter = myClientSockets.begin(); iter != myClientSockets.end(); iter++)
  86.     {
  87.         if (iter->second->isConnected())
  88.         {
  89.             //log.add("Server: sent data to client " + itos(iter->second->getSocket()) + ".\n";
  90.  
  91.             try
  92.             {
  93.                 iter->second->sendData(data);
  94.             }
  95.             catch (SocketException* e)
  96.             {
  97.                 log.add(myName + " caught an exception:" + e->getDescription() + ".\n");
  98.             }
  99.         }
  100.         else
  101.         {
  102.             log.add(myName + " had a client disconnect.\n");
  103.             delete iter->second;
  104.             myClientSockets.erase(iter);
  105.         }
  106.     }
  107. }
  108.  
  109. void Server::sendTo(int id, string data)
  110. {
  111.     Logger &log = Logger::getInstance();
  112.  
  113.     if (myClientSockets.find(id) != myClientSockets.end())
  114.     {
  115.         if (myClientSockets[id]->isConnected())
  116.         {
  117.             //log.add("Server: sent data to client " + itos(iter->second->getSocket()) + ".\n";
  118.  
  119.             try
  120.             {
  121.                 myClientSockets[id]->sendData(data);
  122.             }
  123.             catch (SocketException* e)
  124.             {
  125.                 log.add(myName + " caught an exception:" + e->getDescription() + ".\n");
  126.             }
  127.         }
  128.         else
  129.         {
  130.             log.add(myName + " had a client disconnect.\n");
  131.            
  132.             delete myClientSockets[id];
  133.             myClientSockets[id]=0;
  134.             myClientSockets.erase(id);
  135.         }
  136.     }
  137. }
  138.  
  139. void Server::disconnectClient(int id)
  140. {
  141.     Logger &log = Logger::getInstance();
  142.  
  143.     if (myClientSockets.find(id) != myClientSockets.end())
  144.     {
  145. //      log.add(myName + " had a client disconnect!.\n");
  146.        
  147. //      delete myClientSockets[id];
  148.  
  149. //      myClientSockets.erase(id);
  150. //delete myClientSockets[id];
  151. //          myClientSockets[id]=0;
  152. //          myClientSockets.erase(id);
  153.     }
  154. }
  155.  
  156. void Server::handleEvent(int id, SocketEvent socketEvent)
  157. {
  158.     switch (socketEvent.getType())
  159.     {
  160.         case SocketEvent::TYPE_CONNECTION_CLOSED:
  161.         case SocketEvent::TYPE_CONNECTION_DIED:
  162.         case SocketEvent::TYPE_CONNECTION_RESET:
  163.         disconnectClient(id);
  164.         break;
  165.  
  166.         case SocketEvent::TYPE_DATA:
  167.         handleClientData(id, socketEvent.getData());
  168.         break;
  169.     }
  170. }
  171.  
  172. void Server::handleClientData(int id, string data)
  173. {
  174.     Logger &log = Logger::getInstance();
  175.     log.add(myName + " received data from client " + itos(id) + ": \"" + data + "\"\n");
  176. }
  177.