add color picker and support for whiteboard zooming
[makneto-zunavac1.git] / src / ui-mobile / session-model-item.cpp
blob1befc41432bc17759471b0d57623286890bf3006
1 /*
2 * Copyright (C) 2011 Lukáš Karas <lukas.karas@centrum.cz>
3 *
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.
8 *
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) {
33 QString text;
34 QString contact;
37 SessionModelItem::SessionModelItem(MaknetoBackend::Session *session, QObject *parent) :
38 QObject(parent),
39 _session(session),
40 _visible(false) {
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()),
56 SLOT(onCallReady()));
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() {
79 return _session;
82 bool SessionModelItem::isVisible() {
83 return _visible;
86 void SessionModelItem::setVisible(bool b) {
87 _visible = b;
88 if (_visible) { // flush queue
89 while (!_queue.isEmpty()) {
90 QueueItem *item = _queue.front();
91 _queue.pop_front();
92 // FIXME: add timestamp to queue item
93 onMessageReceived(item->text, item->contact);
94 delete item;
99 QString SessionModelItem::getId() {
100 return _session->getUniqueName();
103 QVariant SessionModelItem::data(int role) {
104 if (!_session)
105 return QVariant();
107 switch (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());
119 return QVariant();
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());
172 return;
175 QDomDocument doc;
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();
179 if (!e.isNull())
180 emit whiteboardMessageReceived(getId(), text, contact);
181 else {
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) {
192 QString message;
194 QTextStream ts(&message);
195 wb.save(ts, 0);
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))
207 typeStr += "Text ";
208 if (type.testFlag(MaknetoBackend::Session::SessionTypeMuc))
209 typeStr += "MUC ";
210 if (type.testFlag(MaknetoBackend::Session::SessionTypeAudio))
211 typeStr += "Audio ";
212 if (type.testFlag(MaknetoBackend::Session::SessionTypeVideo))
213 typeStr += "Video ";
214 typeStr += "]";
215 qDebug() << "SessionModelItem: session type changed " << typeStr;
217 if (_visible)
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) {
231 if (_visible)
232 emit chatStateChanged(getId(), state, contact);
235 void SessionModelItem::changeChatState(MaknetoBackend::Session::ChatState state) {
236 _session->changeChatState(state);
239 #include "session-model-item.moc"