Added initial code for text chat with telepathy framework, classes TpTextClientHandler
[miniature:miniature.git] / src / telepathy / tpaccountitem.cc
1 /* Miniature - A chess board that goes always with you, ready to let
2  * you play and learn wherever you go.
3  *
4  * Copyright (C) 2010 Collabora Ltd. <http://www.collabora.co.uk/>
5  *              Dariusz Mikulski <dariusz.mikulski@collabora.co.uk>
6  *
7  *
8  * Miniature is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * Miniature is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with Miniature. If not, see <http://www.gnu.org/licenses/>.
20  */
21
22 #include "tpaccountitem.h"
23
24 #include <TelepathyQt4/Debug>
25 #include <TelepathyQt4/Constants>
26 #include <TelepathyQt4/Types>
27
28 #include <TelepathyQt4/Account>
29 #include <TelepathyQt4/AccountManager>
30 #include <TelepathyQt4/PendingOperation>
31 #include <TelepathyQt4/PendingReady>
32 #include <TelepathyQt4/ChannelRequest>
33 #include <TelepathyQt4/ContactManager>
34
35 #include <QString>
36 #include <QtGlobal>
37
38 namespace Miniature
39 {
40
41 TpAccountItem::TpAccountItem(Tp::AccountManagerPtr am, const QString &path, QObject *parent) : QObject(parent), 
42             mAcc(Tp::Account::create(am->dbusConnection(), am->busName(), path))
43 {
44     qDebug() << "TpAccountItem::TpAccountItem()";
45 }
46
47 TpAccountItem::~TpAccountItem()
48 {
49     qDebug() << "TpAccountItem::~TpAccountItem()";
50
51     if(mAcc->haveConnection())
52         mAcc->disconnect();
53 }
54
55 bool TpAccountItem::isInitialized()
56 {
57     return mAcc->isReady() && mAcc->isValid();
58 }
59
60 void TpAccountItem::initialize()
61 {
62     qDebug() << "TpAccountItem::initialize()";
63
64     Tp::Features features;
65     features << Tp::Account::FeatureCore
66             << Tp::Account::FeatureAvatar
67             << Tp::Account::FeatureProtocolInfo;
68
69     QObject::connect(mAcc->becomeReady(features), SIGNAL(finished(Tp::PendingOperation *)), SLOT(onReady(Tp::PendingOperation *)));
70 }
71
72 void TpAccountItem::onReady(Tp::PendingOperation *o)
73 {
74     qDebug() << "TpAccountItem::onReady()";
75
76     if(o->isError())
77     {
78         qDebug() << "Account ready error.";
79         return;
80     }
81
82     QObject::connect(mAcc.data(), SIGNAL(connectionStatusChanged(Tp::ConnectionStatus, Tp::ConnectionStatusReason)),
83                      this, SLOT(onConnectionStatusChanged(Tp::ConnectionStatus, Tp::ConnectionStatusReason)));
84
85     Q_EMIT initialized();
86 }
87
88 QString TpAccountItem::getDisplayName()
89 {
90     if(mAcc->isReady() && mAcc->isValid())
91     {
92         return mAcc->normalizedName();
93     }
94
95     return QString();
96 }
97
98 void TpAccountItem::ensureContactsList()
99 {
100     qDebug() << "TpAccountItem::ensureContactsList()";
101
102     if(mAcc->haveConnection())
103     {
104         connectionReady();
105     }
106     else
107     {
108         QObject::connect(mAcc->setEnabled(true), SIGNAL(finished(Tp::PendingOperation *)), this, SLOT(onAccountSetEnabled(Tp::PendingOperation *)));
109     }
110 }
111
112 void TpAccountItem::onAccountSetEnabled(Tp::PendingOperation *o)
113 {
114     qDebug() << "TpAccountItem::onAccountSetEnabled()";
115
116     if(o->isError())
117     {
118         qDebug() << "Account set enabled failed.";
119         return;
120     }
121
122     QObject::connect(mAcc->setConnectsAutomatically(true), SIGNAL(finished(Tp::PendingOperation *)), this, SLOT(onConnectsAutomatically(Tp::PendingOperation *)));
123 }
124
125 void TpAccountItem::onConnectsAutomatically(Tp::PendingOperation *o)
126 {
127     qDebug() << "TpAccountItem::onConnectsAutomatically()";
128
129     if(o->isError())
130     {
131         qDebug() << "Account connection automatically failed.";
132         return;
133     }
134 }
135
136 void TpAccountItem::onConnectionStatusChanged(Tp::ConnectionStatus cs, Tp::ConnectionStatusReason)
137 {
138     qDebug() << "TpAccountItem::onConnectionStatusChanged()";
139
140     if(Tp::ConnectionStatusConnected == cs && mAcc->haveConnection())
141         connectionReady();
142 }
143
144 void TpAccountItem::connectionReady()
145 {
146     qDebug() << "TpAccountItem::connectionReady()";
147
148     if(!mAcc->haveConnection())
149     {
150         qDebug() << "Error: Could not find active connection or account";
151         return;
152     }
153
154     mConnection = mAcc->connection();
155
156     Tp::Features features;
157     features << Tp::Connection::FeatureCore
158              << Tp::Connection::FeatureRoster
159              << Tp::Connection::FeatureRosterGroups;
160
161     QObject::connect(mConnection->becomeReady(features), SIGNAL(finished(Tp::PendingOperation *)), this, SLOT(onConnectionReady(Tp::PendingOperation *)));
162 }
163
164 void TpAccountItem::onConnectionReady(Tp::PendingOperation *o)
165 {
166     qDebug() << "TpAccountItem::onConnectionReady()";
167
168     if(o->isError())
169     {
170         qDebug() << "Connection ready failed";
171         return;
172     }
173
174     if(mConnection->status() != Tp::Connection::StatusConnected)
175     {
176         qDebug() << "connection.status() is not Connected!";
177         return;
178     }
179
180     Tp::ContactManager *contactManager = mConnection->contactManager();
181     Tp::Contacts contactsList = contactManager->allKnownContacts();
182
183     Q_EMIT contactsForAccount(contactsList);
184 }
185
186 void TpAccountItem::ensureChannel(const QVariantMap &req)
187 {
188     qDebug() << "TpAccountItem::ensureChannel()";
189
190     qDebug() << req;
191
192     QObject::connect(mAcc->ensureChannel(req), SIGNAL(finished(Tp::PendingOperation *)), this, SLOT(onEnsureChannelFinished(Tp::PendingOperation *)));
193 }
194
195 void TpAccountItem::onEnsureChannelFinished(Tp::PendingOperation *o)
196 {
197     qDebug() << "TpAccountItem::onEnsureChannelFinished()";
198
199     if(o->isError())
200     {
201         qDebug() << "Ensure channel failed: " << o->errorName() << o->errorMessage();
202         return;
203     }
204 }
205
206 Tp::AccountPtr TpAccountItem::getInternal()
207 {
208     return mAcc;
209 }
210
211 }