3 @author: Sudheer K. <scifi1947 at gmail.com>
4 @license: GNU General Public License
6 Based on Telepathy-SNOM with copyright notice below.
10 * Telepathy SNOM VoIP phone connection manager
11 * Copyright (C) 2006 by basyskom GmbH
12 * @author Tobias Hunger <info@basyskom.de>
14 * This library is free software; you can redisQObject::tribute it and/or
15 * modify it under the terms of the GNU Lesser General Public
16 * License version 2.1 as published by the Free Software Foundation.
18 * This library is disQObject::tributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 * Lesser General Public License for more details.
23 * You should have received a copy of the GNU Lesser General Public
24 * License along with this library; if not, write to the
25 * Free Software Foundation, Inc.,
26 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29 #include "connection.h"
30 #include "connectionadaptor.h"
31 #include "connectioninterfacerequestsadaptor.h"
32 #include "connectioninterfacerequeststypes.h"
33 #include "connectioninterfacecapabilitiesadaptor.h"
34 #include "connectioninterfacecapabilitiestypes.h"
36 #include "vicarcallrouterproxy.h"
37 #include <logutility.h>
39 #include <QtCore/QDebug>
40 #include <QtCore/QCoreApplication>
41 #include <QtCore/QVariantMap>
42 #include <QDBusMessage>
45 #define SELF_HANDLE 1 //Any non-zero
50 static const QString protocol_vicar("tel");
52 static const QString connection_service_name_prefix("org.freedesktop.Telepathy.Connection.vicar." + protocol_vicar + '.');
53 static const QString connection_object_path_prefix("/org/freedesktop/Telepathy/Connection/vicar/" + protocol_vicar + '/');
54 static const QString requests_interface("org.freedesktop.Telepathy.Connection.Interface.Requests");
57 using namespace org::maemo;
60 class ConnectionPrivate
63 ConnectionPrivate(Connection * p,
64 const QString & acc) :
66 connection_status(Connection::Disconnected),
67 adaptor(new ConnectionAdaptor(p)),
68 connIfaceReqsAdaptor(new ConnectionInterfaceRequestsAdaptor(p)),
70 logUtility(new LogUtility(p)),
72 logUtility(new LogUtility("/var/log/vicar/vicar.log",p)),
73 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
76 Q_ASSERT(0 != adaptor);
81 qDebug() << "VICaR Connection: Connection Destructing";
84 const QString account;
86 Connection::Status connection_status;
87 ConnectionAdaptor * adaptor;
88 ConnectionInterfaceRequestsAdaptor * connIfaceReqsAdaptor;
89 LogUtility * const logUtility;
90 Connection * const parent;
93 // ---------------------------------------------------------------------------
95 Connection::Connection(const QString & account,
98 d(new ConnectionPrivate(this, account))
102 strMessage = "DEBUG: In Connection Constructor";
105 qDebug() << strMessage;
106 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
107 d->logUtility->logMessage(strMessage);
110 Q_ASSERT(!account.isEmpty());
112 /* -- Set the Dynamic property "Interfaces" ---
114 Apparently it is not sufficient to implement an additional interface like Conn.I.Requests.
115 We have to assign the list of additional interfaces to the DBus Property Interfaces.
117 The actual DBus property "Interfaces" is declared in ConnectionAdaptor class,
118 which is our Connection Interface implementation.
121 QStringList interfaces = QStringList(requests_interface);
122 this->setProperty("Interfaces",interfaces);
124 // Set the Dynamic property "HasImmortalHandles" to true as per telepathy Connection spec 0.21.6
125 //The handles for vicar connection are expected to last throughout the lifetime of the connection
126 this->setProperty("HasImmortalHandles",true);
128 this->setProperty("Status",org::freedesktop::Telepathy::CONNECTION_STATUS_CONNECTED);
132 //this->setProperty("SelfHandle",org::freedesktop::Telepathy::HANDLE_TYPE_CONTACT);
133 uint selfHandle(SELF_HANDLE);
134 this->setProperty("SelfHandle",selfHandle);
136 strMessage = "VICaR Connection: Emitting SelfHandleChanged.";
137 d->logUtility->logMessage(strMessage);
138 emit SelfHandleChanged(selfHandle);
140 this->setProperty("SelfHandle",org::freedesktop::Telepathy::HANDLE_TYPE_CONTACT);
141 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
143 //Set the property RequestableChannelClasses
144 org::freedesktop::Telepathy::RequestableChannelClassList requestableChannelClasses;
146 uint targetHandleType(1);
148 org::freedesktop::Telepathy::RequestableChannelClass requestableChannelClass1;
149 requestableChannelClass1.fixedProperties.insert("org.freedesktop.Telepathy.Channel.TargetHandleType",targetHandleType);
150 requestableChannelClass1.fixedProperties.insert("org.freedesktop.Telepathy.Channel.ChannelType","org.freedesktop.Telepathy.Channel.Type.StreamedMedia");
152 requestableChannelClass1.allowedProperties.append("org.freedesktop.Telepathy.Channel.TargetHandle");
153 requestableChannelClass1.allowedProperties.append("org.freedesktop.Telepathy.Channel.Type.StreamedMedia.InitialAudio");
155 requestableChannelClasses.append(requestableChannelClass1);
157 org::freedesktop::Telepathy::RequestableChannelClass requestableChannelClass2;
158 requestableChannelClass2.fixedProperties.insert("org.freedesktop.Telepathy.Channel.TargetHandleType",targetHandleType);
159 requestableChannelClass2.fixedProperties.insert("org.freedesktop.Telepathy.Channel.ChannelType","org.freedesktop.Telepathy.Channel.Type.StreamedMedia");
161 requestableChannelClass2.allowedProperties.append("com.nokia.Telepathy.Channel.Interface.Conference.InitialMembers");
162 requestableChannelClass2.allowedProperties.append("org.freedesktop.Telepathy.Channel.TargetHandleType");
163 requestableChannelClass2.allowedProperties.append("org.freedesktop.Telepathy.Channel.Type.StreamedMedia.InitialAudio");
165 requestableChannelClasses.append(requestableChannelClass2);
168 this->setProperty("RequestableChannelClasses",QVariant::fromValue(requestableChannelClasses));
170 //Set the property Channels
171 org::freedesktop::Telepathy::ChannelDetailsList channelDetails;
172 this->setProperty("Channels",QVariant::fromValue(channelDetails));
176 //Set the connection status to Connected (default for Vicar)
177 d->connection_status = Connection::Connected;
178 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
180 //Set the connection status to Connected (default for Vicar)
181 d->connection_status = Connection::Connected;
184 strMessage = "VICaR Connection: Connection set up.";
188 strMessage = "VICaR Connection: Connection set up.";
190 qDebug() << strMessage;
191 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
192 d->logUtility->logMessage(strMessage);
195 Connection::~Connection()
197 qDebug() << "VICaR Connection: Connection closed.";
201 bool Connection::registerObject()
205 if (!QDBusConnection::sessionBus().interface()->isServiceRegistered(serviceName())){
206 if (!QDBusConnection::sessionBus().registerService(serviceName()))
208 strMessage = "VICaR Connection: Problem registering connection service:" + serviceName();
211 qDebug() << strMessage;
212 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
213 d->logUtility->logMessage(strMessage);
217 if (!QDBusConnection::sessionBus().registerObject(objectPath().path(),
220 strMessage = "VICaR Connection: Problem registering object path:" + objectPath().path();
223 qDebug() << strMessage;
224 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
225 d->logUtility->logMessage(strMessage);
230 strMessage = "VICaR Connection: " + serviceName()+" is already registered on DBus";
233 qDebug() << strMessage;
234 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
235 d->logUtility->logMessage(strMessage);
240 void Connection::unregisterObject()
242 QString strMessage = "VICaR Connection: Unregistering Connection object from DBus";
245 qDebug() << strMessage;
246 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
247 d->logUtility->logMessage(strMessage);
248 QDBusConnection::sessionBus().unregisterObject(objectPath().path());
249 QDBusConnection::sessionBus().unregisterService(serviceName());
252 QString Connection::name() const
254 return QString("vicar");
258 QString Connection::serviceName() const
259 { return connection_service_name_prefix + name(); }
261 QDBusObjectPath Connection::objectPath() const
262 { return QDBusObjectPath(connection_object_path_prefix + name()); }
265 //org.freedesktop.Telepathy.Connection
266 void Connection::Connect()
269 Since this is not a "real" Telepathy Connection to a SIP, Chat server,
270 I am not connecting to anything.
272 QString strMessage = "VICaR Connection: Changing status to Connected...";
275 qDebug() << strMessage;
276 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
277 d->logUtility->logMessage(strMessage);
278 d->connection_status = Connection::Connected;
280 //Let all the Telepathy clients know that connection status has changed
281 strMessage = "VICaR Connection: Emitting StatusChanged.";
284 qDebug() << strMessage;
285 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
286 d->logUtility->logMessage(strMessage);
287 emit StatusChanged(d->connection_status, ReasonRequested);
290 void Connection::Disconnect()
292 QString strMessage = "VICaR Connection: Changing status to Disconnected...";
295 qDebug() << strMessage;
296 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
297 d->logUtility->logMessage(strMessage);
298 //We don't have any Handles to release here. So just change the status to Disconnected
299 d->connection_status = Connection::Disconnected;
301 strMessage = "VICaR Connection: Emitting StatusChanged";
304 qDebug() << strMessage;
305 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
306 d->logUtility->logMessage(strMessage);
307 emit StatusChanged(d->connection_status, ReasonRequested);
309 //As per Telepathy specfication, on disconnect we need to unregister from Dbus and destroy the object.
314 QStringList Connection::GetInterfaces()
318 QString strMessage = "VICaR Connection: GetInterfaces.";
319 d->logUtility->logMessage(strMessage);
321 if (d->connection_status != Connected)
323 sendErrorReply("org.freedesktop.Telepathy.Error.Disconnected",
324 "VICaR - Unable to get Interfaces List. The connection is no longer available.");
327 result <<requests_interface;
331 QString Connection::GetProtocol()
333 QString strMessage = "VICaR Connection: GetProtocol.";
334 d->logUtility->logMessage(strMessage);
335 return protocol_vicar;
338 uint Connection::GetStatus()
340 QString strMessage = "VICaR Connection: GetStatus.";
341 d->logUtility->logMessage(strMessage);
342 return static_cast<uint>(d->connection_status);
345 uint Connection::GetSelfHandle()
347 QString strMessage = "VICaR Connection: GetSelfHandle";
350 qDebug() << strMessage;
351 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
352 d->logUtility->logMessage(strMessage);
353 if (d->connection_status != Connected)
355 sendErrorReply("org.freedesktop.Telepathy.Error.Disconnected",
356 "VICaR - Unable to get Self Handle. The connection is no longer available.");
357 strMessage = "VICaR Connection: NOT CONNECTED when requesting selfhandle!";
360 qDebug() << strMessage;
361 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
362 d->logUtility->logMessage(strMessage);
366 //WARNING: Incomplete implemenation
368 uint handle(SELF_HANDLE);
369 strMessage = "VICaR Connection: Returning Handle " + QString::number(handle) + "as self handle.";
372 strMessage = "VICaR Connection: Returning Handle " + QString(handle) + "as self handle.";
373 qDebug() << strMessage;
374 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
375 d->logUtility->logMessage(strMessage);
379 QList<uint> Connection::RequestHandles(uint handle_type,
380 const QStringList & names)
382 QString strMessage = "VICaR Connection: RequestHandles.";
383 d->logUtility->logMessage(strMessage);
389 if (d->connection_status != Connected)
391 sendErrorReply("org.freedesktop.Telepathy.Error.Disconnected",
392 "VICaR - Unable to process handle request. The connection is no longer available.");
395 if (handle_type != HandleContact)
397 sendErrorReply("org.freedesktop.Telepathy.Error.InvalidArgument",
398 "VICaR - Supports handles of type Contact only.");
402 //WARNING: Incomplete implementation. Create a handle and return the value here.
403 result.append(this->GetSelfHandle());
407 void Connection::HoldHandles(const uint handle_type, const QList<uint> &handles)
410 QString strMessage = "VICaR Connection: HoldHandles.";
413 qDebug() << strMessage;
414 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
415 d->logUtility->logMessage(strMessage);
416 if (d->connection_status != Connected)
419 strMessage = "VICaR Connection: HoldHandles - Not Connected.";
422 qDebug() << strMessage;
423 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
424 d->logUtility->logMessage(strMessage);
426 sendErrorReply("org.freedesktop.Telepathy.Error.Disconnected",
427 "VICaR - Unable to process handle request. The connection is no longer available.");
430 if (handle_type != HandleContact)
433 strMessage = "VICaR Connection: HoldHandles - Invalid Handle Type.";
436 qDebug() << strMessage;
437 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
438 d->logUtility->logMessage(strMessage);
440 sendErrorReply("org.freedesktop.Telepathy.Error.InvalidArgument",
441 "VICaR - Supports handles of type Contact only.");
445 //WARNING: Incomplete implementation
448 QStringList Connection::InspectHandles(const uint handle_type,
449 const QList<uint> &handles)
452 QStringList handlesList;
456 QString strMessage = "VICaR Connection: InspectHandles.";
457 qDebug() << strMessage;
458 d->logUtility->logMessage(strMessage);
459 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
461 QString strMessage = "VICaR Connection: InspectHandles.";
462 //d->logUtility->logMessage(strMessage);
465 if (d->connection_status != Connected)
467 sendErrorReply("org.freedesktop.Telepathy.Error.Disconnected",
468 "VICaR - Unable to process handle request. The connection is no longer available.");
471 if (handle_type != HandleContact)
473 sendErrorReply("org.freedesktop.Telepathy.Error.InvalidArgument",
474 "VICaR - Supports handles of type Contact only.");
481 for (int i = 0 ; i < handles.length(); i++) {
482 handle = handles.at(i);
483 strMessage = "VICaR Connection: Inspecting handle "+QString(handle);
484 qDebug() << strMessage;
485 d->logUtility->logMessage(strMessage);
486 handlesList.append(QString(handle));
487 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
492 qDebug() << "VICaR Connction: " << handles.length()<< " handles passed to us";
493 for (int i = 0 ; i < handles.length(); i++) {
494 handle = handles.at(i);
495 strMessage = "VICaR Connection: Inspecting handle "+QString::number(handle);
496 d->logUtility->logMessage(strMessage);
497 handlesList.append(QString::number(handle));
500 strMessage = "VICaR Connection: Handle inspection completed";
501 d->logUtility->logMessage(strMessage);
503 //WARNING: Incomplete implementation
507 void Connection::ReleaseHandles(const uint handle_type, const QList<uint> &handles)
511 QString strMessage = "VICaR Connection: ReleaseHandles.";
512 d->logUtility->logMessage(strMessage);
516 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
517 if (d->connection_status != Connected)
519 sendErrorReply("org.freedesktop.Telepathy.Error.Disconnected",
520 "VICaR - Unable to release handle. The connection is no longer available.");
521 strMessage = "VICaR Connection: Releasing Handle while connection is no longer connected.";
524 qDebug() << strMessage;
525 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
526 d->logUtility->logMessage(strMessage);
529 if (handle_type != HandleContact)
531 sendErrorReply("org.freedesktop.Telepathy.Error.InvalidArgument",
532 "VICaR - Supports handles of type Contact only.");
533 strMessage = "VICaR Connection: Trying to release a Handle that is not a contact.";
536 qDebug() << strMessage;
537 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
538 d->logUtility->logMessage(strMessage);
542 //WARNING: Incomplete implementation
545 org::freedesktop::Telepathy::ChannelInfoList Connection::ListChannels()
548 QString strMessage = "VICaR Connection: ListChannels.";
549 d->logUtility->logMessage(strMessage);
551 org::freedesktop::Telepathy::ChannelInfoList result;
552 if (d->connection_status != Connected)
554 sendErrorReply("org.freedesktop.Telepathy.Error.Disconnected",
555 "VICaR - Unable to list channels. The connection is no longer available.");
559 //WARNING: Incomplete implementation
560 //Btw - We never have any channels :)
565 QDBusObjectPath Connection::RequestChannel(const QString &type,
566 uint handle_type, uint handle,
567 bool suppress_handler)
570 Q_UNUSED(suppress_handler);
571 //This method is deprecated and no longer used as per latest Telepathy spec
574 QString strMessage = "VICaR Connection: RequestChannel.";
575 d->logUtility->logMessage(strMessage);
578 if (type != QString("org.freedesktop.Telepathy.Channel.Type.StreamedMedia"))
580 sendErrorReply("org.freedesktop.Telepathy.Error.NotImplemented",
581 "VICaR Connection: Failed to create channel: Channel type not implemented.");
582 return QDBusObjectPath();
585 if (handle_type != HandleContact )
587 sendErrorReply("org.freedesktop.Telepathy.Error.InvalidHandle",
588 "VICaR Connection: Failed to create channel: Handle type not supported.");
589 return QDBusObjectPath();
592 if (d->connection_status != Connected)
594 sendErrorReply("org.freedesktop.Telepathy.Error.Disconnected",
595 "VICaR Connection: Failed to create channel: Connection is Disconnected.");
596 return QDBusObjectPath();
599 //WARNING: Incomplete implementation, we are not creating any channels here at all.
600 QDBusObjectPath channel_path;
601 qDebug() << "VICaR Connection: Returning null channel object path";
605 //org.freedesktop.Telepathy.Connection.Interface.Requests
606 QDBusObjectPath Connection::CreateChannel(const QVariantMap &request,
607 QVariantMap &channel_properties)
609 Q_UNUSED(channel_properties);
610 Q_ASSERT(!request.isEmpty());
612 strMessage = "VICaR Connection: CreateChannel";
615 qDebug() << strMessage;
616 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
617 d->logUtility->logMessage(strMessage);
618 qDebug() << " Request details are: "<< request;
620 //Ideally we need to emit NewChannels signal here, but since we are not creating any channels we ignore it
622 //WARNING: VICaR - Specific implementation
623 return processChannel(request);
627 bool Connection::EnsureChannel(const QVariantMap &request,
628 QDBusObjectPath &channel_object,
629 QVariantMap &channel_properties)
631 Q_UNUSED(channel_object);
632 Q_UNUSED(channel_properties);
633 Q_ASSERT(!request.isEmpty());
634 QString strMessage = "VICaR Connection: EnsureChannel";
637 qDebug() << strMessage;
638 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
639 d->logUtility->logMessage(strMessage);
640 qDebug() << " Request details are: "<< request;
642 //WARNING: Incomplete implementation
643 processChannel(request);
648 QDBusObjectPath Connection::processChannel(const QVariantMap &request){
650 QString strMessage = "VICaR Connection: ProcessChannel";
653 qDebug() << strMessage;
654 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
655 d->logUtility->logMessage(strMessage);
657 QDBusObjectPath channel_path;
659 if (!request.contains("org.freedesktop.Telepathy.Channel.TargetID")){
660 sendErrorReply("org.freedesktop.Telepathy.Error.InvalidArgument",
661 "VICaR - Invalid request. TargetID (Phone Number) not included.");
665 QVariant vNumber = request.value("org.freedesktop.Telepathy.Channel.TargetID");
666 if (!vNumber.isValid()){
667 sendErrorReply("org.freedesktop.Telepathy.Error.InvalidArgument",
668 "VICaR - Invalid request. Phone Number is not valid.");
671 QString strNumber = vNumber.toString();
672 if (strNumber.isEmpty()){
673 sendErrorReply("org.freedesktop.Telepathy.Error.InvalidArgument",
674 "VICaR - Invalid request. Phone Number is empty.");
677 else if (strNumber == "publish" || strNumber == "subscribe"){
678 //Deny the persistent Mission control requests to publish and subscribe
679 QString strError = "VICaR - Invalid request. " + strNumber + " is not supported.";
680 sendErrorReply("org.freedesktop.Telepathy.Error.InvalidArgument",
686 //Only allow requests with handle type as contact
687 QVariant vTargetHandleType = request.value("org.freedesktop.Telepathy.Channel.TargetHandleType");
688 uint intTargetHandleType = vTargetHandleType.toUInt();
689 if (intTargetHandleType != HandleContact)
691 strMessage = "VICaR - Supports handles of type Contact only. Recieved handle type ";
692 strMessage.append(vTargetHandleType.toString());
694 sendErrorReply("org.freedesktop.Telepathy.Error.InvalidArgument",
701 Send an error reply to Tp Client (Mission Control) to force it to close the active channel.
702 Once it recieves the reply, the client does not bother what we return.
706 sendErrorReply("org.freedesktop.Telepathy.Error.NotAvailable",
707 "VICaR - Creating a new channel to "+strNumber+" via Ring.");
710 //Initiate a new call to CC/Google Out/Skype-out number by requesting a new channel with Ring CM.
712 VicarCallRouterProxy *callRouter = new VicarCallRouterProxy(APPLICATION_DBUS_SERVICE,APPLICATION_DBUS_PATH,QDBusConnection::sessionBus(),this);
714 callRouter->callInternationalNumber(strNumber);
716 strMessage = "VICaR Connection: Call is processed.";
720 qDebug() << strMessage;
721 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
722 d->logUtility->logMessage(strMessage);
728 void Connection::AddClientInterest(const QStringList &tokens){
729 //WARNING: Incomplete implementation
733 strMessage = "VICaR Connection: AddClientInterest";
736 qDebug() << strMessage;
737 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
738 d->logUtility->logMessage(strMessage);
741 void Connection::RemoveClientInterest(const QStringList &tokens){
742 //WARNING: Incomplete implementation
746 strMessage = "VICaR Connection: RemoveClientInterest";
749 qDebug() << strMessage;
750 >>>>>>> 74800375ecf7f41e290cf7cc7fa9ee8b230be68e
751 d->logUtility->logMessage(strMessage);
754 //org.freedesktop.Telepathy.Connection.Interface.Capabilities
755 org::freedesktop::Telepathy::ContactCapabilitiesList Connection::GetCapabilities(const QList<uint> &Handles){
757 org::freedesktop::Telepathy::ContactCapabilitiesList capabilities;
763 org::freedesktop::Telepathy::CapabilityPairList Connection::AdvertiseCapabilities(org::freedesktop::Telepathy::CapabilityPairList Add, const QStringList &Remove){
766 org::freedesktop::Telepathy::CapabilityPairList capabilities;