Subversion Repositories HomeAutomation

Rev

Rev 1203 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

Rev 1203 Rev 1213
1
/***************************************************************************
1
/***************************************************************************
2
 *   Copyright (C) December 26, 2008 by Mattias Runge                             *
2
 *   Copyright (C) December 26, 2008 by Mattias Runge                             *
3
 *   mattias@runge.se                                                      *
3
 *   mattias@runge.se                                                      *
4
 *   socketthread.cpp                                            *
4
 *   socketthread.cpp                                            *
5
 *                                                                         *
5
 *                                                                         *
6
 *   This program is free software; you can redistribute it and/or modify  *
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  *
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     *
8
 *   the Free Software Foundation; either version 2 of the License, or     *
9
 *   (at your option) any later version.                                   *
9
 *   (at your option) any later version.                                   *
10
 *                                                                         *
10
 *                                                                         *
11
 *   This program is distributed in the hope that it will be useful,       *
11
 *   This program is distributed in the hope that it will be useful,       *
12
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
13
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
14
 *   GNU General Public License for more details.                          *
14
 *   GNU General Public License for more details.                          *
15
 *                                                                         *
15
 *                                                                         *
16
 *   You should have received a copy of the GNU General Public License     *
16
 *   You should have received a copy of the GNU General Public License     *
17
 *   along with this program; if not, write to the                         *
17
 *   along with this program; if not, write to the                         *
18
 *   Free Software Foundation, Inc.,                                       *
18
 *   Free Software Foundation, Inc.,                                       *
19
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
19
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
20
 ***************************************************************************/
20
 ***************************************************************************/
21
 
21
 
22
#include "socketthread.h"
22
#include "socketthread.h"
23
#include "virtualmachine.h"
23
#include "virtualmachine.h"
24
 
24
 
25
unsigned long int SocketThread::myCount = 0;
25
unsigned long int SocketThread::myCount = 0;
26
Mutex SocketThread::myCountMutex;
26
Mutex SocketThread::myCountMutex;
27
 
27
 
28
SocketThread::SocketThread(string address, unsigned int port, unsigned int reconnectTimeout)
28
SocketThread::SocketThread(string address, unsigned int port, unsigned int reconnectTimeout)
29
{
29
{
30
    myCountMutex.lock();
30
    myCountMutex.lock();
31
    myId = myCount++;
31
    myId = myCount++;
32
    myCountMutex.unlock();
32
    myCountMutex.unlock();
33
 
33
 
34
    mySocket = new AsyncSocket();
34
    mySocket = new AsyncSocket();
35
 
35
 
36
    mySocket->setAddress(address);
36
    mySocket->setAddress(address);
37
    mySocket->setPort(port);
37
    mySocket->setPort(port);
38
    mySocket->setReconnectTimeout(reconnectTimeout);
38
    mySocket->setReconnectTimeout(reconnectTimeout);
39
}
39
}
40
 
40
 
41
SocketThread::~SocketThread()
41
SocketThread::~SocketThread()
42
{
42
{
43
    if (!stop())
43
    if (!stop())
44
    {
44
    {
45
        cout << "~SocketThread() :: Failed to stop thread :: Error code is " + itos(getError()) + "\n";
45
        cout << "~SocketThread() :: Failed to stop thread :: Error code is " + itos(getError()) + "\n";
46
 
46
 
47
    }
47
    }
48
    else
48
    else
49
    {
49
    {
50
        //cout << "~SocketThread() :: Successfully stopped thread " << myId << "\n";
50
        //cout << "~SocketThread() :: Successfully stopped thread " << myId << "\n";
51
    }
51
    }
52
    delete mySocket;
52
    delete mySocket;
53
}
53
}
54
 
54
 
55
void SocketThread::startSocket()
55
void SocketThread::startSocket()
56
{
56
{
57
cout << "SocketThread::run - starting socket \n";
57
//cout << "SocketThread::run - starting socket \n";
58
    mySocket->start();
58
    mySocket->start();
59
}
59
}
60
 
60
 
61
void SocketThread::run()
61
void SocketThread::run()
62
{
62
{
63
//cout << "SocketThread::run - Thread started " << myId << "\n";
63
//cout << "SocketThread::run - Thread started " << myId << "\n";
64
    VirtualMachine &vm = VirtualMachine::getInstance();
64
    VirtualMachine &vm = VirtualMachine::getInstance();
65
 
65
 
66
//cout << "SocketThread::run - starting socket \n";
66
//cout << "SocketThread::run - starting socket \n";
67
//  mySocket->start();
67
//  mySocket->start();
68
 
68
 
69
//cout << "SocketThread::run - locking mutex \n";
69
//cout << "SocketThread::run - locking mutex \n";
70
    mySocket->eventStartListen();
70
    mySocket->eventStartListen();
71
 
71
 
72
cout << "SocketThread::run - start wait \n";
72
//cout << "SocketThread::run - start wait \n";
73
    while (true)
73
    while (true)
74
    {
74
    {
75
        mySocket->eventWait();
75
        mySocket->eventWait();
76
//cout << "SocketThread::run - eventWait over \n";
76
//cout << "SocketThread::run - eventWait over \n";
77
 
77
 
78
        while (mySocket->eventIsAvailable())
78
        while (mySocket->eventIsAvailable())
79
        {
79
        {
80
            SocketEvent socketEvent = mySocket->eventFetch();
80
            SocketEvent socketEvent = mySocket->eventFetch();
81
 
81
 
82
            switch (socketEvent.getType())
82
            switch (socketEvent.getType())
83
            {
83
            {
84
                case SocketEvent::TYPE_CONNECTED:
84
                case SocketEvent::TYPE_CONNECTED:
85
//cout << "SocketThread::run - event CONNECTED \n";
85
//cout << "SocketThread::run - event CONNECTED \n";
86
                vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'CONNECTED', '" + escape(socketEvent.getData()) + "');");
86
                vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'CONNECTED', '" + escape(socketEvent.getData()) + "');");
87
                break;
87
                break;
88
 
88
 
89
                case SocketEvent::TYPE_CONNECTING:
89
                case SocketEvent::TYPE_CONNECTING:
90
//cout << "SocketThread::run - event CONNECTING \n";
90
//cout << "SocketThread::run - event CONNECTING \n";
91
                vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'CONNECTING', '" + escape(socketEvent.getData()) + "');");
91
                vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'CONNECTING', '" + escape(socketEvent.getData()) + "');");
92
                break;
92
                break;
93
 
93
 
94
                case SocketEvent::TYPE_CONNECTION_CLOSED:
94
                case SocketEvent::TYPE_CONNECTION_CLOSED:
95
//cout << "SocketThread::run - event CLOSED \n";
95
//cout << "SocketThread::run - event CLOSED \n";
96
                vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'CLOSED', '" + escape(socketEvent.getData()) + "');");
96
                vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'CLOSED', '" + escape(socketEvent.getData()) + "');");
97
                break;
97
                break;
98
 
98
 
99
                case SocketEvent::TYPE_CONNECTION_DIED:
99
                case SocketEvent::TYPE_CONNECTION_DIED:
100
//cout << "SocketThread::run - event DIED \n";
100
//cout << "SocketThread::run - event DIED \n";
101
                vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'DIED', '" + escape(socketEvent.getData()) + "');");
101
                vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'DIED', '" + escape(socketEvent.getData()) + "');");
102
                break;
102
                break;
103
 
103
 
104
                case SocketEvent::TYPE_CONNECTION_RESET:
104
                case SocketEvent::TYPE_CONNECTION_RESET:
105
//cout << "SocketThread::run - event RESET \n";
105
//cout << "SocketThread::run - event RESET \n";
106
                vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'RESET', '" + escape(socketEvent.getData()) + "');");
106
                vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'RESET', '" + escape(socketEvent.getData()) + "');");
107
                break;
107
                break;
108
 
108
 
109
                case SocketEvent::TYPE_CONNECTION_FAILED:
109
                case SocketEvent::TYPE_CONNECTION_FAILED:
110
//cout << "SocketThread::run - event CONNECTION_FAILED \n";
110
//cout << "SocketThread::run - event CONNECTION_FAILED \n";
111
                vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'CONNECTION_FAILED', '" + escape(socketEvent.getData()) + "');");
111
                vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'CONNECTION_FAILED', '" + escape(socketEvent.getData()) + "');");
112
                break;
112
                break;
113
 
113
 
114
                case SocketEvent::TYPE_DATA:
114
                case SocketEvent::TYPE_DATA:
115
//cout << "SocketThread::run - event DATA \n";
115
//cout << "SocketThread::run - event DATA \n";
116
                vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'DATA', '" + escape(socketEvent.getData()) + "');");
116
                vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'DATA', '" + escape(socketEvent.getData()) + "');");
117
                break;
117
                break;
118
 
118
 
119
                case SocketEvent::TYPE_INACTIVITY:
119
                case SocketEvent::TYPE_INACTIVITY:
120
//cout << "SocketThread::run - event INACTIVITY \n";
120
//cout << "SocketThread::run - event INACTIVITY \n";
121
                vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'INACTIVITY', '" + escape(socketEvent.getData()) + "');");
121
                vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'INACTIVITY', '" + escape(socketEvent.getData()) + "');");
122
                break;
122
                break;
123
               
123
               
124
                case SocketEvent::TYPE_WAITING_RECONNECT:
124
                case SocketEvent::TYPE_WAITING_RECONNECT:
125
//cout << "SocketThread::run - event WAITING_RECONNECT \n";
125
//cout << "SocketThread::run - event WAITING_RECONNECT \n";
126
                vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'WAITING_RECONNECT', '" + escape(socketEvent.getData()) + "');");
126
                vm.queueExpression("Socket.triggerSocketCallback(" + itos(myId) + ", 'WAITING_RECONNECT', '" + escape(socketEvent.getData()) + "');");
127
                break;
127
                break;
128
            }
128
            }
129
        }
129
        }
130
    }
130
    }
131
 
131
 
132
//cout << "SocketThread::run - Thread end?\n";
132
//cout << "SocketThread::run - Thread end?\n";
133
    mySocket->eventStopListen();
133
    mySocket->eventStopListen();
134
}
134
}
135
 
135
 
136
void SocketThread::send(string data)
136
void SocketThread::send(string data)
137
{
137
{
138
//cout << "SocketThread::send - Sending data\n";
138
//cout << "SocketThread::send - Sending data\n";
139
    mySocket->sendData(data);
139
    mySocket->sendData(data);
140
}
140
}
141
 
141
 
142
 
142