Initial commit
[drdanz-telepathy-kde:libktelepathy-tests.git] / accept-dbustube / test-accept-dbustube.cpp
1 /*
2 * Copyright (C) 2010 Daniele E. Domenichelli <daniele.domenichelli@gmail.com>
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library 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 GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17 */
18
19 #include "test-accept-dbustube.h"
20 #include "exampleinterface.h"
21 #include <KTelepathy/AcceptDBusTubeJob>
22 #include <KTelepathy/TelepathyBridge>
23
24 extern "C"
25 {
26 #include <signal.h>
27 }
28
29 #include <QDBusConnection>
30
31 #include <KAboutData>
32 #include <KCmdLineArgs>
33 #include <KDebug>
34 #include <KApplication>
35 #include <KNotification>
36
37 #include <Nepomuk/ResourceManager>
38 #include <TelepathyQt4/Channel>
39 #include <TelepathyQt4/ClientRegistrar>
40 #include <TelepathyQt4/Account>
41 #include <TelepathyQt4/Debug>
42
43 namespace
44 {
45     static void signal_handler(int signal)
46     {
47         if ((signal == SIGTERM) || (signal == SIGINT)) {
48             QCoreApplication * const app(QCoreApplication::instance());
49             if (app != 0) {
50                 kDebug() << "Signal Handler Called. Exiting...";
51                 app->quit();
52             }
53         }
54     }
55 }
56
57 int main(int argc, char** argv)
58 {
59     KAboutData aboutData("dbustube-receiver", 0, ki18n("Test AcceptDBusTube"), "0.1");
60
61     KCmdLineArgs::init(argc, argv, &aboutData);
62     KApplication app;
63
64     Nepomuk::ResourceManager::instance()->init();
65
66     // Set up signal handlers.
67     if (signal(SIGINT, signal_handler) == SIG_ERR) {
68         kWarning() << "Setting up SIGINT signal handler failed.";
69     }
70
71     if (signal(SIGTERM, signal_handler) == SIG_ERR) {
72         kWarning() << "Setting up SIGTERM signal handler failed.";
73     }
74
75     //Enable telepathy-Qt4 debug
76     Tp::enableDebug(true);
77     Tp::enableWarnings(true);
78
79 //    Test::AcceptDBusTube* receiver = new Test::AcceptDBusTube(0);
80     Tp::SharedPtr<Test::AcceptDBusTube> receiver = Tp::SharedPtr<Test::AcceptDBusTube>(new Test::AcceptDBusTube(0));
81
82     Tp::ClientRegistrarPtr registrar = Tp::ClientRegistrar::create();
83     registrar->registerClient(Tp::AbstractClientPtr::dynamicCast(receiver), "telepathy_test_accept_dbustube");
84
85     receiver->show();
86
87     // Start event loop.
88     return app.exec();
89 }
90
91 namespace Test {
92
93 static inline Tp::ChannelClassList channelClassList()
94 {
95     QMap<QString, QDBusVariant> filter0;
96     filter0[TELEPATHY_INTERFACE_CHANNEL ".ChannelType"] =
97             QDBusVariant(TELEPATHY_INTERFACE_CHANNEL_TYPE_DBUS_TUBE);
98 //    filter0[TELEPATHY_INTERFACE_CHANNEL_TYPE_DBUS_TUBE ".Service"] = QDBusVariant("org.freedesktop.Telepathy.Qt4.Example");
99     filter0[TELEPATHY_INTERFACE_CHANNEL ".Requested"] = QDBusVariant(false);
100
101     return Tp::ChannelClassList() << Tp::ChannelClass(filter0);
102 }
103
104 AcceptDBusTube::AcceptDBusTube(QWidget* parent)
105     : QDialog(parent),
106       Tp::AbstractClientHandler(channelClassList(), false),
107       m_dbusConnection(QLatin1String("none"))
108 {
109     kDebug();
110 /*
111     // Check if Nepomuk Query service client is up and running
112     if (!Nepomuk::Query::QueryServiceClient::serviceAvailable()) {
113         // That's a failure
114         KMessageBox::error(this, i18n("The Nepomuk Query Service client is not available on your system. "
115                                       "Contactlist requires the query service client to be available: please "
116                                       "check your system settings"));
117     }
118 */
119
120     setupUi(this);
121     // Initialize Telepathy
122     TelepathyBridge::instance()->init();
123 //    connect(TelepathyBridge::instance(),
124 //            SIGNAL(ready(bool)),
125 //            SLOT(onHandlerReady(bool)));
126
127 /*
128     // Get 'me' as soon as possible
129     // FIXME: Port to new OSCAF standard for accessing "me" as soon as it
130     // becomes available.
131     Nepomuk::Thing me(QUrl::fromEncoded("nepomuk:/myself"));
132
133
134     // Loop through all the grounding instances of this person
135     foreach (Nepomuk::InformationElement resource, me.groundingOccurrences()) {
136         // See if this grounding instance is of type nco:contact.
137         if (resource.hasType(Nepomuk::Vocabulary::NCO::PersonContact())) {
138             // FIXME: We are going to assume the first NCO::PersonContact is the
139             // right one. Can we improve this?
140             m_mePersonContact = resource;
141             break;
142         }
143     }
144 */
145
146
147 //    Tp::enableDebug(true);
148 //    Tp::enableWarnings(true);
149
150     /* Registering telepathy types */
151     Tp::registerTypes();
152 }
153
154
155 AcceptDBusTube::~AcceptDBusTube()
156 {
157     kDebug();
158 }
159
160 bool AcceptDBusTube::bypassApproval() const
161 {
162     kDebug() << "bypassing";
163     return false;
164 }
165
166 void AcceptDBusTube::handleChannels(const Tp::MethodInvocationContextPtr<> & context,
167         const Tp::AccountPtr & account,
168         const Tp::ConnectionPtr & connection,
169         const QList<Tp::ChannelPtr> & channels,
170         const QList<Tp::ChannelRequestPtr> & requestsSatisfied,
171         const QDateTime & userActionTime,
172         const QVariantMap & handlerInfo)
173 {
174     Q_UNUSED(account);
175     Q_UNUSED(connection);
176     Q_UNUSED(requestsSatisfied);
177     Q_UNUSED(userActionTime);
178     Q_UNUSED(handlerInfo);
179
180     foreach(const Tp::ChannelPtr &channel, channels) {
181         kDebug() << "Handling new tube";
182
183         QVariantMap properties = channel->immutableProperties();
184         kDebug() << properties;
185
186
187         if (properties[TELEPATHY_INTERFACE_CHANNEL ".ChannelType"] == TELEPATHY_INTERFACE_CHANNEL_TYPE_DBUS_TUBE) {
188             kDebug() << "Handling:" << TELEPATHY_INTERFACE_CHANNEL_TYPE_DBUS_TUBE;
189
190             m_contactLineEdit->setText(properties[TELEPATHY_INTERFACE_CHANNEL ".InitiatorID"].toString());
191
192             KJob* job  = TelepathyBridge::instance()->acceptDBusTube(channel);
193
194             if (job) {
195                 connect (job,  SIGNAL(infoMessage(KJob*,QString,QString)),
196                          this, SLOT(onInfoMessage(KJob*,QString,QString)));
197
198                 if (m_acceptComboBox->currentIndex() == 0)
199                     asyncCall(job);
200                 else
201                     syncCall(job);
202             }
203         }
204     }
205     context->setFinished();
206 }
207
208 void AcceptDBusTube::asyncCall(KJob* job)
209 {
210     connect( job,  SIGNAL(result(KJob*)),
211              this, SLOT  (handleResult(KJob*)));
212     job->start();
213 }
214
215
216 void AcceptDBusTube::handleResult(KJob * job)
217 {
218     if ( job->error() ) {
219         // TODO do something;
220     }
221
222     AcceptDBusTubeJob* acceptDBusTubeJob = dynamic_cast<AcceptDBusTubeJob*>(job);
223     if(!acceptDBusTubeJob) {
224         // Not an OfferDBusTubeJob
225         return;
226     }
227 //     m_incomingDBusTubeChannel = acceptDBusTubeJob->incomingDBusTubeChannel();
228
229     m_dbusConnection = acceptDBusTubeJob->dbusConnection();
230     doSomething();
231 }
232
233
234 void AcceptDBusTube::syncCall(KJob* job)
235 {
236     if ( !job->exec() ) {
237         // An error occurred
238     } else {
239         AcceptDBusTubeJob* acceptDBusTubeJob = dynamic_cast<AcceptDBusTubeJob*>(job);
240         if(!acceptDBusTubeJob) {
241             // Not an OfferDBusTubeJob
242             return;
243         }
244 //     m_incomingDBusTubeChannel = acceptDBusTubeJob->incomingDBusTubeChannel();
245
246     m_dbusConnection = acceptDBusTubeJob->dbusConnection();
247     QTimer::singleShot(3000, this, SLOT(doSomething()));
248     }
249 }
250
251
252 void AcceptDBusTube::doSomething()
253 {
254     // Throw in some stuff
255     client = new OrgFreedesktopTelepathyQt4ExampleInterface(QLatin1String(""), QLatin1String("/"), m_dbusConnection, 0);
256
257     connect(client, SIGNAL(Pong()), this, SLOT(onPong()));
258
259     QTimer *timer = new QTimer(this);
260     timer->setInterval(2000);
261     connect(timer, SIGNAL(timeout()), this, SLOT(onTimerTimeout()));
262     timer->start();
263 }
264
265
266 void AcceptDBusTube::onInfoMessage(KJob* job, const QString &plain, const QString &rich)
267 {
268     Q_UNUSED(job)
269     kDebug() << plain;
270
271     KNotification::event("newAcceptDBusTubeEvent", plain, rich);
272 }
273
274
275 void AcceptDBusTube::onTimerTimeout()
276 {
277     client->Ping();
278 }
279
280
281 void AcceptDBusTube::onPong()
282 {
283     kDebug();
284 }
285
286
287 } // end namespace Test