-
Notifications
You must be signed in to change notification settings - Fork 16
/
command.cpp
119 lines (100 loc) · 4.28 KB
/
command.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/**
***************************************************************************
* Description : Class for Newfor subtitles
* Compiler : C++
*
* Copyright (C) 2017, Peter Kwan
*
* Permission to use, copy, modify, and distribute this software
* and its documentation for any purpose and without fee is hereby
* granted, provided that the above copyright notice appear in all
* copies and that both that the copyright notice and this
* permission notice and warranty disclaimer appear in supporting
* documentation, and that the name of the author not be used in
* advertising or publicity pertaining to distribution of the
* software without specific, written prior permission.
*
* The author disclaims all warranties with regard to this
* software, including all implied warranties of merchantability
* and fitness. In no event shall the author be liable for any
* special, indirect or consequential damages or any damages
* whatsoever resulting from loss of use, data or profits, whether
* in an action of contract, negligence or other tortious action,
* arising out of or in connection with the use or performance of
* this software.
***************************************************************************
* The command processor accepts commands over TCP.
* The primary use is to accept Newfor subtitles
* but other inserter commands could be done this way
* It arbitrarily uses port 5570 and accepts Newfor commands
**/
#include "command.h"
using namespace vbit;
using namespace ttx;
Command::Command(Configure *configure, Debug *debug, PacketSubtitle* subtitle=nullptr, PageList *pageList=nullptr) :
_debug(debug),
_portNumber(configure->GetCommandPort()),
_client(debug, subtitle, pageList)
{
// Constructor
// Start a listener thread
}
Command::~Command()
{
//destructor
}
void Command::DieWithError(std::string errorMessage)
{
perror(errorMessage.c_str());
exit(1);
}
void Command::run()
{
_debug->Log(Debug::LogLevels::logDEBUG,"[Command::run] Newfor subtitle listener started");
int serverSock; /* Socket descriptor for server */
int clientSock; /* Socket descriptor for client */
struct sockaddr_in echoServAddr; /* Local address */
struct sockaddr_in echoClntAddr; /* Client address */
unsigned short echoServPort; /* Server port */
#ifdef WIN32
int clntLen; /* needs to be signed int for winsock */
WSADATA wsaData;
int iResult;
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0)
{
DieWithError("WSAStartup failed");
}
#else
unsigned int clntLen; /* Length of client address data structure */
#endif
echoServPort = _portNumber; /* This is the local port */
// System initialisations
/* Construct local address structure */
std::memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */
echoServAddr.sin_family = AF_INET; /* Internet address family */
echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */
echoServAddr.sin_port = htons(echoServPort); /* Local port */
/* Create socket for incoming connections */
if ((serverSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
DieWithError("socket() failed\n");
/* Bind to the local address */
if (bind(serverSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0)
DieWithError("bind() failed");
/* Mark the socket so it will listen for incoming connections */
if (listen(serverSock, MAXPENDING) < 0)
DieWithError("listen() failed");
/* Set the size of the in-out parameter */
clntLen = sizeof(echoClntAddr);
while(1)
{
_debug->Log(Debug::LogLevels::logDEBUG,"[Command::run] Ready for a client to connect");
/* Wait for a client to connect */
if ((clientSock = accept(serverSock, (struct sockaddr *) &echoClntAddr, &clntLen)) < 0)
DieWithError("accept() failed");
_debug->Log(Debug::LogLevels::logINFO,"[Command::run] Connected " + std::string(inet_ntoa(echoClntAddr.sin_addr)) + ":" + std::to_string(ntohs(echoClntAddr.sin_port)));
/* clientSock is connected to a client! */
_client.Handler(clientSock);
}
}