Subversion Repositories HomeAutomation

Rev

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

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