Home

qtsslsocket.h

This is the verbatim text of the qtsslsocket.h include file. It is provided only for illustration; the copyright remains with Trolltech.


#ifndef QTSSLSOCKET
#define QTSSLSOCKET
#include <qsocket.h>
#include <qdatetime.h>
#include <qcstring.h>
#include <qmap.h>

#include <openssl/ssl.h>

class QtRingBuffer;

#if defined(Q_WS_WIN)
#  if !defined(QT_QTSSLSOCKET_EXPORT) && !defined(QT_QTSSLSOCKET_IMPORT)
#    define QT_QTSSLSOCKET_EXPORT
#  elif defined(QT_QTSSLSOCKET_IMPORT)
#    if defined(QT_QTSSLSOCKET_EXPORT)
#      undef QT_QTSSLSOCKET_EXPORT
#    endif
#    define QT_QTSSLSOCKET_EXPORT __declspec(dllimport)
#  elif defined(QT_QTSSLSOCKET_EXPORT)
#    undef QT_QTSSLSOCKET_EXPORT
#    define QT_QTSSLSOCKET_EXPORT __declspec(dllexport)
#  endif
#else
#  define QT_QTSSLSOCKET_EXPORT
#endif

class QT_QTSSLSOCKET_EXPORT QtSSLSocket : public QSocket
{
    Q_OBJECT
public:
    enum Mode { Client, Server };
    enum State { Idle, Connecting, Accepting, Active,
		 Connected = Active, Accepted = Active, Closing };

    QtSSLSocket(Mode mode = Client, QSocket *sock = 0, QObject *parent = 0, const char *name = 0);
    ~QtSSLSocket();

    State state() const;

    void connectToHost(const QString &host, Q_UINT16 port);

    bool canReadLine() const;
    QString readLine();

    bool open(int mode);
    void flush();
    Offset size() const;
    Offset at() const;
    bool at(Offset pos);
    bool atEnd() const;

    Q_LONG readBlock(char *data, Q_ULONG maxlen);
    Q_LONG writeBlock(const char *data, Q_ULONG len);
    Q_LONG readLine(char *data, Q_ULONG maxlen);

    QByteArray readAll();
    int getch();
    int putch(int ch);
    int ungetch(int ch);

    void setPathToCertificate(const QString &path);
    void setPathToPrivateKey(const QString &path);
    void setPathToCACertFile(const QString &path);
    void setPathToCACertDir(const QString &path);
    QString pathToCertificate() const;
    QString pathToPrivateKey() const;
    QString pathToCACertFile() const;
    QString pathToCACertDir() const;

    QString localCertificate() const;
    QString peerCertificate() const;

    void setCiphers(const QString &ciphers);
    QString ciphers() const;

    void setSocket(QSocket *);
    QSocket *socket() const;

    int bytesAvailable() const;

    QString errorString() const;

    enum Error {
	ErrConnectionRefused = QSocket::ErrConnectionRefused,
	ErrHostNotFound = QSocket::ErrHostNotFound,
	ErrSocketRead = QSocket::ErrSocketRead,
	ErrSSLInit
    };

    enum VerifyResult {
	VerifyOk,
	SelfSigned,
	HostnameMismatch,
	Expired,
	NotYetValid,
	UnableToVerify
    };

signals:
    void accepted();
    void certCheckFailed(int, const QString &);

public slots:
    void close();
    bool sslConnect();
    bool sslAccept();

private slots:
    void readFromSocket();
    int writeToSocket();
    void finishDelayedClose();
    void finishClose();
    void socketError(int);
    void shutdownSSL();

protected:
    void initSignals();
    bool initSSL(Mode);

    void setError(Error);
    int error() const;

    bool sslAcceptOrConnect(bool accept);

private:
    QString verifyErrorString(int err);

    QString errorStr;

    QString cert;
    QString certDir;
    QString key;
    QString cafile;
    QString cadir;
    QString ciph;
    QString hostName;

    State socketState;
    Error err;

    Mode mode;
    bool inited;

    QtRingBuffer *readQueue;
    QtRingBuffer *writeQueue;

    QSocket *sock;
    bool newSock;

    SSL *ssl;
    SSL_CTX *ctx;
    BIO *rbio;
    BIO *wbio;
};

#endif

Copyright © 2003-2006 TrolltechTrademarks
Qt Solutions