00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef QXMPPCALLMANAGER_H
00025 #define QXMPPCALLMANAGER_H
00026
00027 #include <QObject>
00028 #include <QIODevice>
00029
00030 #include "QXmppJingleIq.h"
00031 #include "QXmppLogger.h"
00032
00033 class QXmppCodec;
00034 class QXmppJingleCandidate;
00035 class QXmppJingleIq;
00036 class QXmppJinglePayloadType;
00037 class QXmppStream;
00038 class QXmppStunSocket;
00039
00046
00047 class QXmppCall : public QIODevice
00048 {
00049 Q_OBJECT
00050
00051 public:
00053 enum Direction
00054 {
00055 IncomingDirection,
00056 OutgoingDirection,
00057 };
00058
00060 enum State
00061 {
00062 OfferState = 0,
00063 ConnectingState = 1,
00064 ActiveState = 2,
00065 DisconnectingState = 3,
00066 FinishedState = 4,
00067 };
00068
00069 QXmppCall::Direction direction() const;
00070 QString jid() const;
00071 QString sid() const;
00072 QXmppCall::State state() const;
00073
00074 QXmppJinglePayloadType payloadType() const;
00075
00077 qint64 bytesAvailable() const;
00078 bool isSequential() const;
00080
00081 signals:
00087 void connected();
00088
00093 void finished();
00094
00096 void ringing();
00097
00099 void logMessage(QXmppLogger::MessageType type, const QString &msg);
00100
00102 void stateChanged(QXmppCall::State state);
00103
00104 public slots:
00105 void accept();
00106 void hangup();
00107
00108 private slots:
00109 void datagramReceived(const QByteArray &datagram);
00110 void emitSignals();
00111 void updateOpenMode();
00112 void terminate();
00113 void terminated();
00114
00115 protected:
00117 qint64 readData(char * data, qint64 maxSize);
00118 qint64 writeData(const char * data, qint64 maxSize);
00120
00121 private:
00122 QXmppCall(const QString &jid, QXmppCall::Direction direction, QObject *parent);
00123 void connectToHost();
00124 QList<QXmppJingleCandidate> localCandidates() const;
00125 void setPayloadType(const QXmppJinglePayloadType &type);
00126 void addRemoteCandidates(const QList<QXmppJingleCandidate> &candidates);
00127 void setRemoteUser(const QString &user);
00128 void setRemotePassword(const QString &password);
00129 void setState(QXmppCall::State state);
00130
00131 Direction m_direction;
00132 QString m_jid;
00133 QString m_sid;
00134 State m_state;
00135 QString m_contentName;
00136 QXmppJinglePayloadType m_payloadType;
00137
00138 QList<QXmppJingleIq> m_requests;
00139 QList<QXmppJinglePayloadType> m_commonPayloadTypes;
00140
00141
00142 QXmppStunSocket *m_socket;
00143 QXmppStunSocket *m_rtcpSocket;
00144
00145
00146 bool m_signalsEmitted;
00147 qint64 m_writtenSinceLastEmit;
00148
00149
00150 QXmppCodec *m_codec;
00151
00152 QByteArray m_incomingBuffer;
00153 bool m_incomingBuffering;
00154 int m_incomingMinimum;
00155 quint16 m_incomingSequence;
00156 quint32 m_incomingStamp;
00157
00158 quint16 m_outgoingChunk;
00159 QByteArray m_outgoingBuffer;
00160 bool m_outgoingMarker;
00161 quint16 m_outgoingSequence;
00162 quint32 m_outgoingStamp;
00163
00164 friend class QXmppCallManager;
00165 };
00166
00179
00180 class QXmppCallManager : public QObject
00181 {
00182 Q_OBJECT
00183
00184 public:
00185 QXmppCallManager(QXmppStream *stream, QObject *parent = 0);
00186 QXmppCall *call(const QString &jid);
00187
00188 signals:
00193 void callReceived(QXmppCall *call);
00194
00196 void logMessage(QXmppLogger::MessageType type, const QString &msg);
00197
00198 private slots:
00199 void callDestroyed(QObject *object);
00200 void callStateChanged(QXmppCall::State state);
00201 void iqReceived(const QXmppIq &iq);
00202 void jingleIqReceived(const QXmppJingleIq &iq);
00203
00204 private:
00205 bool checkPayloadTypes(QXmppCall *call, const QList<QXmppJinglePayloadType> &remotePayloadTypes);
00206 QXmppCall *findCall(const QString &sid) const;
00207 QXmppCall *findCall(const QString &sid, QXmppCall::Direction direction) const;
00208 QList<QXmppJinglePayloadType> localPayloadTypes() const;
00209 bool sendAck(const QXmppJingleIq &iq);
00210 bool sendRequest(QXmppCall *call, const QXmppJingleIq &iq);
00211
00212 QList<QXmppCall*> m_calls;
00213
00214
00215 QXmppStream* m_stream;
00216 };
00217
00218 #endif