1 /* IOSocket.cpp - IOMultiplexer v2
2 * Copyright (C) 2014 Philipp Kreil (pk910)
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #include "../IOHandler/IOSockets.h"
25 static IOSOCKET_CALLBACK(c_socket_callback) {
26 CIOSocket *ciosock = (CIOSocket *) event->socket->data;
27 ciosock->socket_callback(event);
30 CIOSocket::CIOSocket() {
33 CIOSocket::CIOSocket(IOSocket *iosocket) {
34 this->iosocket = iosocket;
37 int CIOSocket::connect(char *hostname, unsigned int port, int ssl, char *bindhost) {
38 return this->connect(hostname, port, ssl, bindhost, IOSOCKET_ADDR_IPV6 | IOSOCKET_ADDR_IPV4);
41 int CIOSocket::connect(char *hostname, unsigned int port, int ssl, char *bindhost, int flags) {
42 this->iosocket = iosocket_connect_flags(hostname, port, (ssl ? 1 : 0), (bindhost ? bindhost : NULL), c_socket_callback, flags);
44 this->iosocket->data = this;
50 int CIOSocket::listen(char *hostname, unsigned int port) {
51 return this->listen(hostname, port, IOSOCKET_ADDR_IPV6 | IOSOCKET_ADDR_IPV4);
53 int CIOSocket::listen(char *hostname, unsigned int port, int flags) {
54 this->iosocket = iosocket_listen_flags(hostname, port, c_socket_callback, flags);
56 this->iosocket->data = this;
62 int CIOSocket::listen_ssl(char *hostname, unsigned int port, char *certfile, char *keyfile) {
63 return listen_ssl(hostname, port, certfile, keyfile, IOSOCKET_ADDR_IPV6 | IOSOCKET_ADDR_IPV4);
65 int CIOSocket::listen_ssl(char *hostname, unsigned int port, char *certfile, char *keyfile, int flags) {
66 this->iosocket = iosocket_listen_ssl_flags(hostname, port, certfile, keyfile, c_socket_callback, flags);
68 this->iosocket->data = this;
74 void CIOSocket::write(const char *data, int len) {
75 iosocket_send(iosocket, data, len);
77 #define IOSOCKET_PRINTF_LEN 2048
78 void CIOSocket::writef(const char *format, ...) {
80 char sendBuf[IOSOCKET_PRINTF_LEN];
83 va_start(arg_list, format);
84 pos = vsnprintf(sendBuf, IOSOCKET_PRINTF_LEN - 1, format, arg_list);
86 if (pos < 0 || pos > (IOSOCKET_PRINTF_LEN - 1)) pos = IOSOCKET_PRINTF_LEN - 1;
88 iosocket_send(iosocket, sendBuf, pos);
91 void CIOSocket::close() {
92 iosocket_close(iosocket);
96 void CIOSocket::socket_callback(IOSocketEvent *event) {
98 case IOSOCKETEVENT_RECV:
99 if(iosocket->parse_delimiter)
100 this->recvLine(event->data.recv_str);
102 IOSocketBuffer *recvbuf = event->data.recv_buf;
104 usedlen = this->recvEvent(recvbuf->buffer, recvbuf->bufpos);
105 if(usedlen == recvbuf->bufpos) {
108 memmove(recvbuf->buffer, recvbuf->buffer + usedlen, recvbuf->bufpos - usedlen);
109 recvbuf->bufpos -= usedlen;
113 case IOSOCKETEVENT_CONNECTED:
114 this->connectedEvent();
116 case IOSOCKETEVENT_NOTCONNECTED:
117 this->notConnectedEvent(event->data.errid);
119 case IOSOCKETEVENT_CLOSED:
120 this->closedEvent(event->data.errid);
122 case IOSOCKETEVENT_ACCEPT:
123 this->acceptedEvent(new CIOSocket(event->data.accept_socket));
125 case IOSOCKETEVENT_DNSFAILED:
126 this->dnsErrEvent(event->data.recv_str);
131 int CIOSocket::getSSL() {
134 int CIOSocket::getIPv6() {
137 int CIOSocket::getConnected() {
140 int CIOSocket::getListening() {