Add server and client files
[miniature:miniature.git] / src / telepathy / tpaccountmanager.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 "tpaccountmanager.h"
23 #include "tpaccountitem.h"
24 #include "accountselectiondlg.h"
25
26 #include <select_account.ui.h>
27
28 #include <TelepathyQt4/Debug>
29 #include <TelepathyQt4/Constants>
30 #include <TelepathyQt4/Types>
31
32 #include <TelepathyQt4/Account>
33 #include <TelepathyQt4/AccountManager>
34 #include <TelepathyQt4/PendingOperation>
35 #include <TelepathyQt4/PendingReady>
36 #include <TelepathyQt4/ReferencedHandles>
37
38 #include <QDebug>
39 #include <QString>
40 #include <QtGlobal>
41
42 #if defined(Q_WS_MAEMO_5)
43 #include <QtMaemo5/QtMaemo5>
44 #endif
45
46 namespace Miniature
47 {
48
49 TpAccountManager::TpAccountManager(QObject *parent)
50     : QObject(parent)
51 {
52     Tp::enableDebug(false);
53     Tp::enableWarnings(true);
54
55     Tp::registerTypes();
56
57     mAM = Tp::AccountManager::create();
58
59     QObject::connect(mAM->becomeReady(),
60            SIGNAL(finished(Tp::PendingOperation *)),
61            SLOT(onAMReady(Tp::PendingOperation *)));
62 }
63
64 TpAccountManager::~TpAccountManager()
65 {
66
67 }
68
69 void TpAccountManager::onAMReady(Tp::PendingOperation *o)
70 {
71     if(o->isError())
72     {
73         qDebug() << "Account Manager error";
74         return;
75     }
76
77     mAccounts.clear();
78
79     Q_FOREACH(const QString &path, mAM->allAccountPaths())
80     {
81         TpAccountItemPtr account = TpAccountItemPtr(new TpAccountItem(mAM, path, this));
82         QObject::connect(account.data(), SIGNAL(initialized()), this, SLOT(onAccountInitialized()));
83         account->initialize();
84         mAccounts.push_back(account);
85     }
86 }
87
88 void TpAccountManager::onAccountInitialized()
89 {
90     QList<QString> accountNamesList;
91
92     Q_FOREACH(TpAccountItemPtr accItem, mAccounts)
93     {
94         if(accItem->isInitialized())
95         {
96             accountNamesList.push_back(accItem->getDisplayName());
97         }
98     }
99
100     Q_EMIT onAccountNameListChanged(accountNamesList);
101 }
102
103 void TpAccountManager::ensureAccountNameList()
104 {
105     onAccountInitialized();
106 }
107
108 void TpAccountManager::ensureContactListForAccount(QString accountName)
109 {
110     Q_FOREACH(TpAccountItemPtr accItem, mAccounts)
111     {
112         if(accountName == accItem->getDisplayName())
113         {
114             accItem.data()->disconnect(SIGNAL(contactsForAccount(Tp::Contacts)));
115             QObject::connect(accItem.data(), SIGNAL(contactsForAccount(const Tp::Contacts)), this, SIGNAL(onContactsForAccount(const Tp::Contacts)));
116             accItem->ensureContactsList();
117             break;
118         }
119     }
120 }
121
122 void TpAccountManager::onEnsureChannel(QString accountName, QString contactName)
123 {
124     mContactName = contactName;
125
126     Q_FOREACH(TpAccountItemPtr accItem, mAccounts)
127     {
128         if(accountName == accItem->getDisplayName())
129         {
130             accItem.data()->disconnect(SIGNAL(contactsForAccount(Tp::Contacts)));
131             QObject::connect(accItem.data(), SIGNAL(contactsForAccount(const Tp::Contacts)), this, SLOT(ensureContactsForAccount(const Tp::Contacts)));
132             accItem->ensureContactsList();
133             mAccount = accItem;
134             break;
135         }
136     }
137 }
138
139 void TpAccountManager::ensureContactsForAccount(const Tp::Contacts contacts)
140 {
141     Q_FOREACH(Tp::ContactPtr contact, contacts)
142     {
143         if(contact->id() == mContactName)
144         {
145             createChannel(contact);
146             break;
147         }
148     }
149 }
150
151 void TpAccountManager::createChannel(const Tp::ContactPtr contact)
152 {
153     qDebug() << "TpAccountManager::createChannel()";
154     qDebug() << "!!!! CREATING CHANNEL for" << contact->id() << " !!!";
155
156     QVariantMap req;
157
158     req.insert(QLatin1String(TELEPATHY_INTERFACE_CHANNEL ".ChannelType"),
159                TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAM_TUBE);
160     req.insert(QLatin1String(TELEPATHY_INTERFACE_CHANNEL ".TargetHandleType"),
161                Tp::HandleTypeContact);
162     req.insert(QLatin1String(TELEPATHY_INTERFACE_CHANNEL ".TargetHandle"),
163                contact->handle().at(0));
164     req.insert(QLatin1String(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAM_TUBE ".Service"),
165                "Miniature");
166
167     mAccount->ensureChannel(req);
168 }
169
170 };