2 * Copyright (C) 2011 Lukáš Karas <lukas.karas@centrum.cz>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the
16 * Free Software Foundation, Inc.,
17 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 #include <QDomElement>
22 #include "session-model-item.h"
23 #include "session-model.h"
25 #include "../backend/session.h"
27 struct SessionModelItem::QueueItem
{
29 QueueItem(const QString
&text
, const QString
& contact
) :
30 text(text
), contact(contact
) {
37 SessionModelItem::SessionModelItem(MaknetoBackend::Session
*session
, QObject
*parent
) :
42 connect(_session
, SIGNAL(messageReceived(const QString
&, const QString
&)),
43 SLOT(onMessageReceived(const QString
&, const QString
&)));
44 connect(_session
, SIGNAL(messageSent(const QString
&)),
45 SLOT(onMessageSent(const QString
&)));
46 connect(_session
, SIGNAL(sendingError(const QString
&, const QString
&)),
47 SLOT(onSendingError(const QString
&, const QString
&)));
48 connect(_session
, SIGNAL(sessionTypeChanged()),
49 SLOT(onSessionTypeChanged()));
50 connect(_session
, SIGNAL(chatStateChanged(MaknetoBackend::Session::ChatState
, const QString
&)),
51 SLOT(onChatStateChanged(MaknetoBackend::Session::ChatState
, const QString
&)));
53 connect(_session
, SIGNAL(incomingCall()),
54 SLOT(onIncomingCall()));
55 connect(_session
, SIGNAL(callReady()),
57 connect(_session
, SIGNAL(callEnded(const QString
&)),
58 SLOT(onCallEnded(const QString
&)));
59 connect(_session
, SIGNAL(callError(const QString
&)),
60 SLOT(onCallError(const QString
&)));
61 connect(_session
, SIGNAL(videoPreviewAvailable(QGst::ElementPtr
)),
62 SLOT(onVideoPreviewAvailable(QGst::ElementPtr
)));
63 connect(_session
, SIGNAL(videoAvailable(QGst::ElementPtr
)),
64 SLOT(onVideoAvailable(QGst::ElementPtr
)));
65 connect(_session
, SIGNAL(incomingCall()),
66 SLOT(onIncomingCall()));
67 connect(_session
, SIGNAL(videoPreviewRemoved(QGst::ElementPtr
)),
68 SLOT(onVideoPreviewRemoved(QGst::ElementPtr
)));
69 connect(_session
, SIGNAL(videoRemoved(QGst::ElementPtr
)),
70 SLOT(onVideoRemoved(QGst::ElementPtr
)));
71 connect(_session
, SIGNAL(remoteAudioStreamAdded()),
72 SLOT(onRemoteAudioStreamAdded()));
75 SessionModelItem::~SessionModelItem() {
78 MaknetoBackend::Session
*SessionModelItem::getSession() {
82 bool SessionModelItem::isVisible() {
86 void SessionModelItem::setVisible(bool b
) {
88 if (_visible
) { // flush queue
89 while (!_queue
.isEmpty()) {
90 QueueItem
*item
= _queue
.front();
92 // FIXME: add timestamp to queue item
93 onMessageReceived(item
->text
, item
->contact
);
99 QString
SessionModelItem::getId() {
100 return _session
->getUniqueName();
103 QVariant
SessionModelItem::data(int role
) {
108 case SessionModel::ItemRole
:
109 //return QVariant(_session->getUniqueName());
110 return QVariant::fromValue(this);
111 case SessionModel::IdRole
:
112 return QVariant(_session
->getUniqueName());
113 case SessionModel::IconRole
:
114 return _session
->getIcon();
115 case Qt::DisplayRole
:
116 case SessionModel::NameRole
:
117 return QVariant(_session
->getName());
122 void SessionModelItem::onIncomingCall() {
123 emit
incomingCall(getId());
126 void SessionModelItem::onCallReady() {
127 qDebug() << "SessionModelItem: Call Ready, accepting outgoing call...";
128 _session
->acceptCall();
129 emit
callReady(getId());
132 void SessionModelItem::onCallEnded(const QString
&errorMsg
) {
133 qDebug() << "SessionModelItem: Call Ended";
134 emit
callEnded(getId());
137 void SessionModelItem::onCallError(const QString
&errorMsg
) {
138 qDebug() << "SessionModelItem: Call Error" << errorMsg
;
139 emit
callError(getId(), errorMsg
);
142 void SessionModelItem::onVideoPreviewAvailable(QGst::ElementPtr videoOutElemPtr
) {
143 qDebug() << "SessionModelItem: videoPreviewAvailable";
144 emit
videoPreviewAvailable(getId(), videoOutElemPtr
);
147 void SessionModelItem::onVideoAvailable(QGst::ElementPtr videoOutElemPtr
) {
148 qDebug() << "SessionModelItem: videoAvailable";
149 emit
videoAvailable(getId(), videoOutElemPtr
);
152 void SessionModelItem::onVideoPreviewRemoved(QGst::ElementPtr videoOutElemPtr
) {
153 qDebug() << "SessionModelItem: videoPreviewRemoved";
154 emit
videoPreviewRemoved(getId(), videoOutElemPtr
);
157 void SessionModelItem::onVideoRemoved(QGst::ElementPtr videoOutElemPtr
) {
158 qDebug() << "SessionModelItem: videoRemoved";
159 emit
videoRemoved(getId(), videoOutElemPtr
);
162 void SessionModelItem::onRemoteAudioStreamAdded() {
163 qDebug() << "SessionModelItem: audio stream added";
164 emit
remoteAudioStreamAdded(getId());
167 void SessionModelItem::onMessageReceived(const QString
&text
, const QString
&contact
) {
168 if (!_visible
) { // enqueue
169 QueueItem
*item
= new QueueItem(text
, contact
);
170 _queue
.push_back(item
);
171 emit
messageEnqueued(getId());
176 doc
.setContent(text
);
177 //QDomElement e = doc.elementsByTagNameNS("http://jabber.org/protocol/svgwb", "wb").item(0).toElement();
178 QDomElement e
= doc
.elementsByTagName("wb").item(0).toElement();
180 emit
whiteboardMessageReceived(getId(), text
, contact
);
182 //TODO figure out what to do in case of MUC
183 emit
textMessageReceived(getId(), text
, contact
);
187 void SessionModelItem::sendTextMessage(const QString
&text
) {
188 _session
->sendMessage(text
);
191 void SessionModelItem::sendWhiteboardMessage(const QDomElement
&wb
) {
194 QTextStream
ts(&message
);
196 //qDebug() << "wb:" << endl << message << endl << endl;
197 //TODO check the resource
198 _session
->sendMessage(ts
.readAll());
201 void SessionModelItem::onSessionTypeChanged() {
202 MaknetoBackend::Session::SesstionTypes type
= _session
->getSessionType();
204 // just for information...
205 QString typeStr
= "[";
206 if (type
.testFlag(MaknetoBackend::Session::SessionTypeText
))
208 if (type
.testFlag(MaknetoBackend::Session::SessionTypeMuc
))
210 if (type
.testFlag(MaknetoBackend::Session::SessionTypeAudio
))
212 if (type
.testFlag(MaknetoBackend::Session::SessionTypeVideo
))
215 qDebug() << "SessionModelItem: session type changed " << typeStr
;
218 sessionTypeChanged(getId(), ((int) type
));
221 void SessionModelItem::onMessageSent(const QString
&message
) {
222 // TODO: split this signal for whiteboard and text message...
223 messageSent(getId(), message
);
226 void SessionModelItem::onSendingError(const QString
&message
, const QString
&errorMessage
) {
227 sendingError(getId(), message
, errorMessage
);
230 void SessionModelItem::onChatStateChanged(MaknetoBackend::Session::ChatState state
, const QString
&contact
) {
232 emit
chatStateChanged(getId(), state
, contact
);
235 void SessionModelItem::changeChatState(MaknetoBackend::Session::ChatState state
) {
236 _session
->changeChatState(state
);
239 #include "session-model-item.moc"