Subversion Repositories HomeAutomation

Rev

Rev 1213 | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  1. /***************************************************************************
  2.  *   Copyright (C) December 26, 2008 by Mattias Runge                             *
  3.  *   mattias@runge.se                                                      *
  4.  *   socketthread.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 "socketthread.h"
  23. #include "virtualmachine.h"
  24.  
  25. unsigned long int SocketThread::myCount = 0;
  26. Mutex SocketThread::myCountMutex;
  27.  
  28. SocketThread::SocketThread(string address, unsigned int port, unsigned int reconnectTimeout)
  29. {
  30.     myCountMutex.lock();
  31.     myId = myCount++;
  32.     myCountMutex.unlock();
  33.  
  34.     mySocket = new AsyncSocket();
  35.  
  36.     mySocket->setAddress(address);
  37.     mySocket->setPort(port);
  38.     mySocket->setReconnectTimeout(reconnectTimeout);
  39. }
  40.  
  41. SocketThread::~SocketThread()
  42. {
  43.     if (!stop())
  44.     {
  45.         cout << "~SocketThread() :: Failed to stop thread :: Error code is " + itos(getError()) + "\n";
  46.  
  47.     }
  48.     else
  49.     {
  50.         //cout << "~SocketThread() :: Successfully stopped thread " << myId << "\n";
  51.     }
  52.     delete mySocket;
  53. }
  54.  
  55. void SocketThread::startSocket()
  56. {
  57. //cout << "SocketThread::run - starting socket \n";
  58.     mySocket->start();
  59. }
  60.  
  61. void SocketThread::run()
  62. {
  63. //cout << "SocketThread::run - Thread started " << myId << "\n";
  64.     VirtualMachine &vm = VirtualMachine::getInstance();
  65.  
  66. //cout << "SocketThread::run - starting socket \n";
  67. //  mySocket->start();
  68.  
  69. //cout << "SocketThread::run - locking mutex \n";
  70.     mySocket->eventStartListen();
  71.  
  72. //cout << "SocketThread::run - start wait \n";
  73.     while (true)
  74.     {
  75.         if (!mySocket->eventIsAvailable())
  76.         {
  77.             mySocket->eventWait();
  78.         }
  79.         usleep(2000);
  80. //cout << "SocketThread::run - eventWait over \n";
  81.  
  82.         while (mySocket->eventIsAvailable())
  83.         {
  84.             SocketEvent socketEvent = mySocket->eventFetch();
  85.  
  86.             switch (socketEvent.getType())
  87.             {
  88.                 case SocketEvent::TYPE_CONNECTED:
  89. //cout << "SocketThread::run - event CONNECTED \n";
  90.                 vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'CONNECTED', '" + escape(socketEvent.getData()) + "');");
  91.                 break;
  92.  
  93.                 case SocketEvent::TYPE_CONNECTING:
  94. //cout << "SocketThread::run - event CONNECTING \n";
  95.                 vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'CONNECTING', '" + escape(socketEvent.getData()) + "');");
  96.                 break;
  97.  
  98.                 case SocketEvent::TYPE_CONNECTION_CLOSED:
  99. //cout << "SocketThread::run - event CLOSED \n";
  100.                 vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'CLOSED', '" + escape(socketEvent.getData()) + "');");
  101.                 break;
  102.  
  103.                 case SocketEvent::TYPE_CONNECTION_DIED:
  104. //cout << "SocketThread::run - event DIED \n";
  105.                 vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'DIED', '" + escape(socketEvent.getData()) + "');");
  106.                 break;
  107.  
  108.                 case SocketEvent::TYPE_CONNECTION_RESET:
  109. //cout << "SocketThread::run - event RESET \n";
  110.                 vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'RESET', '" + escape(socketEvent.getData()) + "');");
  111.                 break;
  112.  
  113.                 case SocketEvent::TYPE_CONNECTION_FAILED:
  114. //cout << "SocketThread::run - event CONNECTION_FAILED \n";
  115.                 vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'CONNECTION_FAILED', '" + escape(socketEvent.getData()) + "');");
  116.                 break;
  117.  
  118.                 case SocketEvent::TYPE_DATA:
  119. //cout << "SocketThread::run - event DATA \n";
  120.                 vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'DATA', '" + escape(socketEvent.getData()) + "');");
  121.                 break;
  122.  
  123.                 case SocketEvent::TYPE_INACTIVITY:
  124. //cout << "SocketThread::run - event INACTIVITY \n";
  125.                 vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'INACTIVITY', '" + escape(socketEvent.getData()) + "');");
  126.                 break;
  127.                
  128.                 case SocketEvent::TYPE_WAITING_RECONNECT:
  129. //cout << "SocketThread::run - event WAITING_RECONNECT \n";
  130.                 vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'WAITING_RECONNECT', '" + escape(socketEvent.getData()) + "');");
  131.                 break;
  132.             }
  133.         }
  134.     }
  135.  
  136. //cout << "SocketThread::run - Thread end?\n";
  137.     mySocket->eventStopListen();
  138. }
  139.  
  140. void SocketThread::send(string data)
  141. {
  142. //cout << "SocketThread::send - Sending data\n";
  143.     mySocket->sendData(data);
  144. }
  145.  
  146.