1 /** @file qsocket.hpp
2  *
3  * @copyright (C) 2016
4  * @date 2016.05.26
5  * @version 1.0.0
6  * @author amir zamani <azadkuh@live.com>
7  *
8  */
9 
10 #ifndef __QHTTP_SOCKET_HPP__
11 #define __QHTTP_SOCKET_HPP__
12 
13 #include "qhttpfwd.hpp"
14 
15 #include <QTcpSocket>
16 #include <QLocalSocket>
17 #include <QUrl>
18 ///////////////////////////////////////////////////////////////////////////////
19 namespace qhttp {
20 namespace details {
21 ///////////////////////////////////////////////////////////////////////////////
22 
23 /** an adapter for different socket types.
24  * the main purpose of QHttp was to create a small HTTP server with ability to
25  * support UNIX sockets (QLocalSocket)
26  */
27 class QSocket
28 {
29 public:
close()30     void close() {
31         if ( itcpSocket )
32             itcpSocket->close();
33 
34         if ( ilocalSocket )
35             ilocalSocket->close();
36     }
37 
release()38     void release() {
39         close();
40         if ( itcpSocket )
41             itcpSocket->deleteLater();
42 
43         if ( ilocalSocket )
44             ilocalSocket->deleteLater();
45 
46         itcpSocket   = nullptr;
47         ilocalSocket = nullptr;
48     }
49 
flush()50     void flush() {
51         if ( itcpSocket )
52             itcpSocket->flush();
53 
54         else if ( ilocalSocket )
55             ilocalSocket->flush();
56     }
57 
isOpen() const58     bool isOpen() const {
59         if ( ibackendType == ETcpSocket    &&    itcpSocket )
60             return itcpSocket->isOpen()
61                 && itcpSocket->state() == QTcpSocket::ConnectedState;
62 
63         else if ( ibackendType == ELocalSocket    &&    ilocalSocket )
64             return ilocalSocket->isOpen()
65                 && ilocalSocket->state() == QLocalSocket::ConnectedState;
66 
67         return false;
68     }
69 
connectTo(const QUrl & url)70     void connectTo(const QUrl& url) {
71         if ( ilocalSocket )
72             ilocalSocket->connectToServer(url.path());
73     }
74 
connectTo(const QString & host,quint16 port)75     void connectTo(const QString& host, quint16 port) {
76         if ( itcpSocket )
77             itcpSocket->connectToHost(host, port);
78     }
79 
readRaw(char * buffer,int maxlen)80     qint64 readRaw(char* buffer, int maxlen) {
81         if ( itcpSocket )
82             return itcpSocket->read(buffer, maxlen);
83 
84         else if ( ilocalSocket )
85             return ilocalSocket->read(buffer, maxlen);
86 
87         return 0;
88     }
89 
writeRaw(const QByteArray & data)90     void writeRaw(const QByteArray& data) {
91         if ( itcpSocket )
92             itcpSocket->write(data);
93 
94         else if ( ilocalSocket )
95             ilocalSocket->write(data);
96     }
97 
bytesAvailable()98     qint64 bytesAvailable() {
99         if ( itcpSocket )
100             return itcpSocket->bytesAvailable();
101 
102         else if ( ilocalSocket )
103             return ilocalSocket->bytesAvailable();
104 
105         return 0;
106     }
107 
disconnectAllQtConnections()108     void disconnectAllQtConnections() {
109         if ( itcpSocket )
110             QObject::disconnect(itcpSocket, 0, 0, 0);
111 
112         if ( ilocalSocket )
113             QObject::disconnect(ilocalSocket, 0, 0, 0);
114     }
115 
116 public:
117     TBackend      ibackendType = ETcpSocket;
118     QTcpSocket*   itcpSocket   = nullptr;
119     QLocalSocket* ilocalSocket = nullptr;
120 }; // class QSocket
121 
122 ///////////////////////////////////////////////////////////////////////////////
123 } // namespace details
124 } // namespace qhttp
125 ///////////////////////////////////////////////////////////////////////////////
126 #endif // __QHTTP_SOCKET_HPP__
127