1 /* Ricochet - https://ricochet.im/ 2 * Copyright (C) 2014, John Brooks <john.brooks@dereferenced.net> 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 11 * * Redistributions in binary form must reproduce the above 12 * copyright notice, this list of conditions and the following disclaimer 13 * in the documentation and/or other materials provided with the 14 * distribution. 15 * 16 * * Neither the names of the copyright owners nor the names of its 17 * contributors may be used to endorse or promote products derived from 18 * this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 #ifndef TORCONTROLSOCKET_H 34 #define TORCONTROLSOCKET_H 35 36 #include <QTcpSocket> 37 #include <QQueue> 38 39 namespace Tor 40 { 41 42 class TorControlCommand; 43 44 class TorControlSocket : public QTcpSocket 45 { 46 Q_OBJECT 47 public: 48 explicit TorControlSocket(QObject *parent = 0); 49 virtual ~TorControlSocket(); 50 errorMessage()51 QString errorMessage() const { return m_errorMessage; } 52 53 void registerEvent(const QByteArray &event, TorControlCommand *handler); 54 sendCommand(const QByteArray & data)55 void sendCommand(const QByteArray &data) { sendCommand(0, data); } 56 void sendCommand(TorControlCommand *command, const QByteArray &data); 57 58 signals: 59 void error(const QString &message); 60 61 private slots: 62 void process(); 63 void clear(); 64 65 private: 66 QQueue<TorControlCommand*> commandQueue; 67 QHash<QByteArray,TorControlCommand*> eventCommands; 68 QString m_errorMessage; 69 TorControlCommand *currentCommand; 70 bool inDataReply; 71 72 void setError(const QString &message); 73 }; 74 75 } 76 77 #endif // TORCONTROLSOCKET_H 78