Initial commit
[drdanz-telepathy-kde:libktelepathy-tests.git] / offer-dbustube / test-offer-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-offer-dbustube.h"
20 #include "example.h"
21 #include <KTelepathy/OfferDBusTubeJob>
22 #include <KTelepathy/TelepathyBridge>
23
24 #include <pimo.h>
25 #include <nao.h>
26 #include <nco.h>
27 #include <telepathy.h>
28 #include <person.h>
29
30 extern "C"
31 {
32 #include <signal.h>
33 }
34
35 #include <QTimer>
36 #include <QDBusConnection>
37 #include <QTcpSocket>
38
39 #include <KAboutData>
40 #include <KCmdLineArgs>
41 #include <KDebug>
42 #include <KApplication>
43 #include <KMessageBox>
44 #include <KJob>
45 #include <KNotification>
46
47 #include <Nepomuk/ResourceManager>
48 #include <Nepomuk/Resource>
49 #include <Nepomuk/Variant>
50 #include <Nepomuk/Query/QueryServiceClient>
51 #include <Nepomuk/Query/ComparisonTerm>
52 #include <Nepomuk/Query/ResourceTerm>
53 #include <Nepomuk/Query/ResourceTypeTerm>
54 #include <Nepomuk/Query/LiteralTerm>
55 #include <Nepomuk/Query/AndTerm>
56 #include <Nepomuk/Query/Result>
57
58 #include <informationelement.h>
59 #include <imaccount.h>
60
61
62 namespace
63 {
64     static void signal_handler(int signal)
65     {
66         if ((signal == SIGTERM) || (signal == SIGINT)) {
67             QCoreApplication * const app(QCoreApplication::instance());
68             if (app != 0) {
69                 kDebug() << "Signal Handler Called. Exiting...";
70                 app->quit();
71             }
72         }
73     }
74 }
75
76
77 int main(int argc, char** argv)
78 {
79     KAboutData aboutData("telepathy_test_offer_dbustube", 0, ki18n("Test OfferDBusTube"), "0.1");
80
81     KCmdLineArgs::init(argc, argv, &aboutData);
82     KApplication app;
83
84     Nepomuk::ResourceManager::instance()->init();
85
86     // Set up signal handlers.
87     if (signal(SIGINT, signal_handler) == SIG_ERR) {
88         kWarning() << "Setting up SIGINT signal handler failed.";
89     }
90
91     if (signal(SIGTERM, signal_handler) == SIG_ERR) {
92         kWarning() << "Setting up SIGTERM signal handler failed.";
93     }
94
95     Test::OfferDBusTube* window = new Test::OfferDBusTube(0);
96     window->show();
97
98     // Start event loop.
99     return app.exec();
100 }
101
102
103
104 namespace Test {
105
106 OfferDBusTube::OfferDBusTube(QWidget* parent)
107     : QDialog(parent),
108       m_dbusConnection(QLatin1String("none"))
109 {
110     kDebug();
111
112     // Check if Nepomuk Query service client is up and running
113     if (!Nepomuk::Query::QueryServiceClient::serviceAvailable()) {
114         // That's a failure
115         KMessageBox::error(this, i18n("The Nepomuk Query Service client is not available on your system. "
116                                       "Contactlist requires the query service client to be available: please "
117                                       "check your system settings"));
118     }
119
120     setupUi(this);
121
122     // Initialize Telepathy
123     TelepathyBridge::instance()->init();
124 //    connect(TelepathyBridge::instance(),
125 //            SIGNAL(ready(bool)),
126 //            SLOT(onHandlerReady(bool)));
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     connect(m_runPushButton, SIGNAL(clicked()),
146             this,            SLOT(onRunPushButtonClicked()));
147
148     connect(m_modeComboBox, SIGNAL(currentIndexChanged(int)),
149             this,           SLOT(onModeChanged(int)));
150
151     m_example = new Example(this);
152 }
153
154
155 OfferDBusTube::~OfferDBusTube()
156 {
157     kDebug();
158 }
159
160
161 void OfferDBusTube::onModeChanged(int mode)
162 {
163     switch (mode)
164     {
165         case 0:
166             m_contactComboBox->setDisplayMode(KTelepathyAccountsWidget::DisplayModeContacts);
167             break;
168         case 1:
169             m_contactComboBox->setDisplayMode(KTelepathyAccountsWidget::DisplayModeMetaContacts);
170             break;
171         default:
172             break;
173     }
174 }
175
176
177 void OfferDBusTube::onRunPushButtonClicked()
178 {
179     kDebug();
180
181     int mode = m_modeComboBox->currentIndex();
182     KJob* job;
183
184     switch (mode)
185     {
186         case 0:
187         {
188             Nepomuk::PersonContact targetContact = m_contactComboBox->currentContact();
189             job = TelepathyBridge::instance()->offerDBusTube(targetContact);
190             break;
191         }
192         case 2:
193         {
194             Nepomuk::Person targetMetaContact = m_contactComboBox->currentMetaContact();
195             job = TelepathyBridge::instance()->offerDBusTube(targetMetaContact);
196             break;
197         }
198         default:
199             break;
200     }
201
202     if (job) {
203         connect (job,  SIGNAL(infoMessage(KJob*,QString,QString)),
204                  this, SLOT(onInfoMessage(KJob*,QString,QString)));
205     }
206
207     if (m_runComboBox->currentIndex() == 0)
208         asyncCall(job);
209     else
210         syncCall(job);
211 }
212
213
214 void OfferDBusTube::asyncCall(KJob* job)
215 {
216     connect( job,  SIGNAL(result(KJob*)),
217              this, SLOT  (handleResult(KJob*)));
218     job->start();
219 }
220
221
222 void OfferDBusTube::handleResult(KJob * job)
223 {
224     if ( job->error() ) {
225         // TODO do something;
226     }
227
228     OfferDBusTubeJob* offerDBusTubeJob = dynamic_cast<OfferDBusTubeJob*>(job);
229     if(!offerDBusTubeJob) {
230         // Not an OfferDBusTubeJob
231         return;
232     }
233     kDebug() << m_dbusConnection.name();
234     m_dbusConnection = offerDBusTubeJob->dbusConnection();
235     kDebug() << m_dbusConnection.name();
236     registerExample();
237 }
238
239
240 void OfferDBusTube::syncCall(KJob* job)
241 {
242     if ( !job->exec() ) {
243         // An error occurred
244     } else {
245         OfferDBusTubeJob* offerDBusTubeJob = dynamic_cast<OfferDBusTubeJob*>(job);
246         if(!offerDBusTubeJob) {
247             // Not an OfferDBusTubeJob
248             return;
249         }
250         kDebug() << m_dbusConnection.name();
251         m_dbusConnection = offerDBusTubeJob->dbusConnection();
252         kDebug() << m_dbusConnection.name();
253         registerExample();
254     }
255 }
256
257
258 bool OfferDBusTube::registerExample()
259 {
260     bool ret = m_dbusConnection.registerObject(QLatin1String("/"), m_example);
261
262     if (!ret) {
263         kDebug() << i18n("m_dbusConnection.registerObject: FAIL");
264         return false;
265     }
266     else
267         kDebug() << i18n("m_dbusConnection.RegisteredObject: SUCCESS");
268     if (m_dbusConnection.objectRegisteredAt(QLatin1String("/")) != m_example) {
269         kDebug() << i18n("m_dbusConnection.objectRegisteredAt: FAIL");
270         return false;
271     }
272     else
273         kDebug() << i18n("m_dbusConnection.objectRegisteredAt: SUCCESS");
274     return true;
275 }
276
277
278 void OfferDBusTube::onInfoMessage(KJob* job, const QString &plain, const QString &rich)
279 {
280     Q_UNUSED(job)
281     kDebug() << plain;
282
283     KNotification::event("newOfferDBusTubeEvent", plain, rich);
284 }
285
286 } // end namespace Test