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