Skip to content

Commit a7a6845

Browse files
committed
增加视频
1 parent dc09e43 commit a7a6845

26 files changed

+824
-245
lines changed

Call/CallAction.cpp

+105
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
#include "CallAction.h"
2+
#include "Global/Global.h"
3+
4+
CCallAction::CCallAction(QSharedPointer<CCallObject> call, const QString &author, const QTime &date, const bool &me) :
5+
CChatAction(me, author, date)
6+
{
7+
m_Call = call;
8+
}
9+
10+
CCallAction::~CCallAction()
11+
{
12+
}
13+
14+
QString CCallAction::getMessage()
15+
{
16+
QString szMsg;
17+
szMsg = "<table>";
18+
switch(m_Call->GetState())
19+
{
20+
case CCallObject::ConnectingState:
21+
szMsg += getDescriptionConnectingState();
22+
break;
23+
case CCallObject::ActiveState:
24+
szMsg += getDescriptionActiveState();
25+
break;
26+
case CCallObject::DisconnectingState:
27+
szMsg += getDescriptionDisconnectingState();
28+
break;
29+
case CCallObject::FinishedState:
30+
szMsg += getDescriptionFinishedState();
31+
break;
32+
default:
33+
break;
34+
};
35+
szMsg += "</table>";
36+
return szMsg;
37+
}
38+
39+
QString CCallAction::drawButton(const QString &szHref, const QString &szText, const QString &szIcon)
40+
{
41+
QString szMsg;
42+
szMsg = "<td align='center'><a href='" + szHref + "'>";
43+
if(!szIcon.isEmpty())
44+
szMsg += QImage2Html(QImage(szIcon, "png"), 16, 16);
45+
szMsg += szText + "</a></td>";
46+
return szMsg;
47+
}
48+
49+
QString CCallAction::drawAccept(QString szHref)
50+
{
51+
return drawButton(szHref, tr("Accpet"), ":/icon/Accept");
52+
}
53+
54+
QString CCallAction::drawCancel(QString szHref)
55+
{
56+
return drawButton(szHref, tr("Cancel"), ":/icon/Cancel");
57+
}
58+
59+
QString CCallAction::getDescriptionConnectingState()
60+
{
61+
QString szMsg;
62+
szMsg = "<tr>";
63+
if(m_isMe)
64+
szMsg += "<td align='center'>" + tr("Be launching a video call");
65+
else
66+
szMsg += "<td colspan='2' align='center'>" + tr("Be receiving a video call");
67+
szMsg += "</td></tr>";
68+
szMsg += "<tr>";
69+
if(!m_isMe)
70+
szMsg += drawAccept("rabbitim://CallVideo?command=accept");
71+
szMsg += drawCancel("rabbitim://CallVideo?command=cancel");
72+
szMsg += "</tr>";
73+
return szMsg;
74+
}
75+
76+
QString CCallAction::getDescriptionActiveState()
77+
{
78+
QString szMsg;
79+
szMsg = "<tr>";
80+
szMsg += "<td align='center'>" + tr("Be talking ...");
81+
szMsg += "</td></tr>";
82+
szMsg += "<tr>";
83+
szMsg += drawCancel("rabbitim://CallVideo?command=cancel");
84+
szMsg += "</tr>";
85+
return szMsg;
86+
}
87+
88+
QString CCallAction::getDescriptionDisconnectingState()
89+
{
90+
QString szMsg;
91+
92+
return szMsg;
93+
}
94+
95+
QString CCallAction::getDescriptionFinishedState()
96+
{
97+
QString szMsg;
98+
szMsg = "<tr>";
99+
szMsg += "<td align='center'>" + tr("video call over");
100+
szMsg += "</td></tr>";
101+
szMsg += "<tr>";
102+
szMsg += drawButton("rabbitim://CallVideo?command=call", tr("Call"));
103+
szMsg += "</tr>";
104+
return szMsg;
105+
}

Call/CallAction.h

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#ifndef CCALLACTION_H
2+
#define CCALLACTION_H
3+
4+
#include "Message/ChatActions/ChatAction.h"
5+
#include "CallObject.h"
6+
#include <QSharedPointer>
7+
8+
class CCallAction : public CChatAction
9+
{
10+
public:
11+
CCallAction(QSharedPointer<CCallObject> call, const QString &author, const QTime &date, const bool &me);
12+
virtual ~CCallAction();
13+
14+
virtual QString getMessage();
15+
16+
private:
17+
QString getDescriptionConnectingState();
18+
QString getDescriptionActiveState();
19+
QString getDescriptionDisconnectingState();
20+
QString getDescriptionFinishedState();
21+
QString drawButton(const QString &szHref, const QString &szText, const QString &szIcon = QString());
22+
QString drawAccept(QString szHref);
23+
QString drawCancel(QString szHref);
24+
25+
private:
26+
QSharedPointer<CCallObject> m_Call;
27+
};
28+
29+
#endif // CCALLACTION_H

Call/CallObject.cpp

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#include "CallObject.h"
2+
#include "Global/Global.h"
3+
4+
CCallObject::CCallObject(QObject *parent) :
5+
QObject(parent)
6+
{
7+
}
8+
9+
QString CCallObject::GetId()
10+
{
11+
return m_szId;
12+
}
13+
14+
int CCallObject::SetId(const QString szId)
15+
{
16+
m_szId = szId;
17+
return 0;
18+
}
19+
20+
int CCallObject::GetTotalTime()
21+
{
22+
return m_nTotal;
23+
}
24+
25+
int CCallObject::Accept()
26+
{
27+
LOG_MODEL_WARNING("CCallObject", "The CCallObject::Accept function must be implemented by derived classes");
28+
Q_ASSERT(false);
29+
return 0;
30+
}
31+
32+
int CCallObject::Cancel()
33+
{
34+
LOG_MODEL_WARNING("CCallObject", "The CCallObject::Cancel function must be implemented by derived classes");
35+
Q_ASSERT(false);
36+
return 0;
37+
}
38+
39+
CCallObject::State CCallObject::GetState()
40+
{
41+
LOG_MODEL_WARNING("CCallObject", "The CCallObject::GetState function must be implemented by derived classes");
42+
Q_ASSERT(false);
43+
return ConnectingState;
44+
}

Call/CallObject.h

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#ifndef CALLOBJECT_H
2+
#define CALLOBJECT_H
3+
4+
#include <QObject>
5+
#include <QIODevice>
6+
#include <QTime>
7+
8+
class CCallObject : public QObject
9+
{
10+
Q_OBJECT
11+
public:
12+
explicit CCallObject(QObject *parent = 0);
13+
14+
enum Direction
15+
{
16+
IncomingDirection, ///< The call is incoming.
17+
OutgoingDirection, ///< The call is outgoing.
18+
};
19+
20+
/// This enum is used to describe the state of a call.
21+
enum State
22+
{
23+
ConnectingState = 0, ///< The call is being connected.
24+
ActiveState = 1, ///< The call is active.
25+
DisconnectingState = 2, ///< The call is being disconnected.
26+
FinishedState = 3, ///< The call is finished.
27+
};
28+
29+
virtual int Accept();
30+
virtual int Cancel();
31+
32+
virtual QString GetId();
33+
virtual int GetTotalTime();//得到通话时间
34+
virtual State GetState();
35+
36+
protected:
37+
virtual int SetId(const QString szId);
38+
39+
signals:
40+
/// \brief This signal is emitted when a call is connected.
41+
///
42+
/// Once this signal is emitted, you can connect a QAudioOutput and
43+
/// QAudioInput to the call. You can determine the appropriate clockrate
44+
/// and the number of channels by calling payloadType().
45+
void sigConnected();
46+
47+
/// \brief This signal is emitted when a call is finished.
48+
///
49+
/// Note: Do not delete the call in the slot connected to this signal,
50+
/// instead use deleteLater().
51+
void sigFinished();
52+
53+
/// \brief This signal is emitted when the remote party is ringing.
54+
void sigRinging();
55+
56+
/// \brief This signal is emitted when the call state changes.
57+
void sigStateChanged(State state);
58+
59+
/// \brief This signal is emitted when the audio channel changes.
60+
void audioModeChanged(QIODevice::OpenMode mode);
61+
62+
/// \brief This signal is emitted when the video channel changes.
63+
void videoModeChanged(QIODevice::OpenMode mode);
64+
65+
private:
66+
QString m_szId;
67+
68+
protected:
69+
QTime m_tmStart; //呼叫开始时间
70+
int m_nTotal; //呼叫总时间
71+
};
72+
73+
#endif // CALLOBJECT_H

Call/CallVideo.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#include "CallVideo.h"
2+
3+
CCallVideo::CCallVideo(QObject *parent) : CCallObject(parent)
4+
{
5+
}

Call/CallVideo.h

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#ifndef CALLVIDEO_H
2+
#define CALLVIDEO_H
3+
#include "CallObject.h"
4+
5+
class CCallVideo : public CCallObject
6+
{
7+
public:
8+
explicit CCallVideo(QObject *parent = 0);
9+
10+
};
11+
12+
#endif // CALLVIDEO_H

Call/CallVideoQXmpp.cpp

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#include "CallVideoQXmpp.h"
2+
#include "qxmpp/QXmppUtils.h"
3+
4+
CCallVideoQXmpp::CCallVideoQXmpp(QXmppCall* pCall, QObject *parent) : CCallVideo(parent)
5+
{
6+
m_pQXmppCall = pCall;
7+
if(pCall)
8+
{
9+
SetId(QXmppUtils::jidToBareJid(pCall->jid()));
10+
ConnectionCallSlot(pCall);
11+
}
12+
}
13+
14+
int CCallVideoQXmpp::ConnectionCallSlot(QXmppCall *pCall)
15+
{
16+
return 0;
17+
//只有主叫方才有的事件
18+
bool check = connect(pCall, SIGNAL(ringing()),
19+
SLOT(ringing()));
20+
Q_ASSERT(check);
21+
22+
//以下是双方都有的事件
23+
check = connect(pCall, SIGNAL(connected()),
24+
SLOT(slotConnection()));
25+
Q_ASSERT(check);
26+
27+
check = connect(pCall, SIGNAL(stateChanged(QXmppCall::State)),
28+
SLOT(slotStateChanged(QXmppCall::State)));
29+
Q_ASSERT(check);
30+
31+
check = connect(pCall, SIGNAL(audioModeChanged(QIODevice::OpenMode)),
32+
SLOT(slotAudioModeChanged(QIODevice::OpenMode)));
33+
Q_ASSERT(check);
34+
35+
check = connect(pCall, SIGNAL(videoModeChanged(QIODevice::OpenMode)),
36+
SLOT(slotVideoModeChanged(QIODevice::OpenMode)));
37+
Q_ASSERT(check);
38+
39+
check = connect(pCall, SIGNAL(finished()),
40+
SLOT(slotFinished()));
41+
Q_ASSERT(check);
42+
43+
if(check)
44+
return 0;
45+
46+
return -1;
47+
}
48+
49+
int CCallVideoQXmpp::Accept()
50+
{
51+
int nRet = 0;
52+
m_pQXmppCall->accept();
53+
return nRet;
54+
}
55+
56+
int CCallVideoQXmpp::Cancel()
57+
{
58+
int nRet = 0;
59+
m_pQXmppCall->hangup();
60+
return nRet;
61+
}
62+
63+
CCallObject::State CCallVideoQXmpp::GetState()
64+
{
65+
return (State)m_pQXmppCall->state();
66+
}

Call/CallVideoQXmpp.h

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#ifndef CALLVIDEOQXMPP_H
2+
#define CALLVIDEOQXMPP_H
3+
#include "qxmpp/QXmppCallManager.h"
4+
#include "CallVideo.h"
5+
6+
class CCallVideoQXmpp : public CCallVideo
7+
{
8+
public:
9+
explicit CCallVideoQXmpp(QXmppCall* pCall, QObject *parent = 0);
10+
11+
virtual int Accept();
12+
virtual int Cancel();
13+
14+
virtual State GetState();
15+
16+
private:
17+
//连接与 call 相关的信号
18+
int ConnectionCallSlot(QXmppCall *pCall);
19+
private slots:
20+
void slotConnection();
21+
void slotStateChanged(QXmppCall::State state);
22+
void slotFinished();
23+
void slotAudioModeChanged(QIODevice::OpenMode mode);
24+
void slotVideoModeChanged(QIODevice::OpenMode mode);
25+
26+
private:
27+
QXmppCall* m_pQXmppCall;
28+
};
29+
30+
#endif // CALLVIDEOQXMPP_H

0 commit comments

Comments
 (0)