Web page and doxygen documentation created
[tpsession] / tpsession-0.1 / tpsession / tpsession.cpp
1 /*
2  * This file is part of TpSession
3  *
4  * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
5  * Contact Kate Alhola  kate.alhola(a)nokia.com
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20  */
21 #include "tpsession.h"
22 #include <QDebug>
23
24
25
26
27
28 /**
29  * \class TpSession
30  * \headerfile <tpsession.h>
31  *
32  * Top level class, counterpart of Account Manager. TpSession connects to account manager and requests accounts from it. TpSession creates TpSessionAccount for all accounts .
33  * As top level class TpSession provides simÃ¥lified interface to send and receive messages via any account. TpSession provides signal when it has accounts ready.
34  * If you require some specific account in constructor, you will receive signal only when this account is ready. If you use constructor without any parameters, you will get one
35  * signal for every account.  If synchronous is true, constructor is executed as synchronous and it does return after transactions to set up accounts are done.
36  */
37 /**
38  * \fn void TpSession::accountReady(TpSessionAccount *);
39  *
40  * Emitted when the account becomes ready
41  *
42  * \param  TpSessionAccount  pointer to account become ready
43  */
44 /**
45  * \fn void TpSession::amReady(TpSession *);
46  *
47  * Emitted when the account Manager becomes ready
48  *
49  * \param  TpSession  pointer to TpSession class
50  */
51 /**
52  * \fn void TpSession::messageReceived(const Tp::ReceivedMessage &,TpSessionAccount *);
53  *
54  * Emitted when any of Account Managers recived message
55  *
56  * \param  Tp::ReceivedMessage  Message received
57  * \param  TpSessionAccount  pointer to account received message
58  */
59
60
61 /**
62  * Construct a new TpSession object.
63  *
64  * \param cmname      Name of the default connection manager. Can be empty or omnitted, then there is no default connection manager
65  * \param synchronous if false, asynchronous behavior, function returns immediately and accountReady signals are emitted when accounts are ready
66  *                    if True, synchronous behavior and function returns when accounts are ready
67  */
68 TpSession::TpSession(QString cmname,bool synchronous)
69 {
70     Tp::registerTypes();
71     Tp::enableDebug(false);
72     Tp::enableWarnings(false);
73
74     mAM = Tp::AccountManager::create();
75     reqCm=cmname;
76     connect(mAM->becomeReady(),
77             SIGNAL(finished(Tp::PendingOperation *)),
78             SLOT(onAMReady(Tp::PendingOperation *)));
79     connect(mAM.data(),
80             SIGNAL(accountCreated(const QString &)),
81             SLOT(onAccountCreated(const QString &)));
82
83    // createObserver();
84   if(synchronous) loop.exec(); // Loop locally untill accounts are initialized
85    reqCm=cmname;
86
87 }
88 TpSession* TpSession::instancePtr=NULL;
89 /**
90  * Returns pointer to TpSession singleton. If there is not yet TpSession Object, creates it with "Ring" connection manager as default
91  *
92  * \param synchronous if false, asynchronous behavior, function returns immediately and accountReady signals are emitted when accounts are ready
93  *                    if True, synchronous behavior and function returns when accounts are ready
94  */
95 TpSession* TpSession::instance(bool synchronous)
96 {
97     if(instancePtr==NULL) instancePtr=new TpSession("ring",synchronous);
98     return instancePtr;
99 };
100
101 void TpSession::onAMReady(Tp::PendingOperation *op)
102 {
103  qDebug() << "TpSession::onAMReady";
104  TpSessionAccount *tpacc;
105
106    foreach (const QString &path, mAM->allAccountPaths()) {
107        accounts+=tpacc=new TpSessionAccount(mAM, path);
108        connect(tpacc,SIGNAL(accountReady(TpSessionAccount*)),
109                       SLOT(onAccountReady(TpSessionAccount *)));
110     }
111
112 }
113
114 void TpSession::onReady(Tp::PendingOperation *)
115 {
116 };
117
118 void TpSession::onAccountCreated(const QString &path)
119 {
120
121     accounts+=new TpSessionAccount(mAM, path);
122 }
123
124 void TpSession::onAccountReady(TpSessionAccount *tpacc)
125 {
126     qDebug() << "TpSession::onAccountReady:Account " << tpacc->acc->cmName() << "is Ready";
127     connect(tpacc,SIGNAL(messageReceived(const Tp::ReceivedMessage &,TpSessionAccount *)),
128                   SLOT(onMessageReceived(const Tp::ReceivedMessage &,TpSessionAccount *)));
129     if(!reqCm.isEmpty() && tpacc->acc->cmName()==reqCm) {
130     if(sync) {
131         sync=false;
132         loop.quit();
133         emit accountReady(tpacc);
134      if(!reqMsg.isEmpty()) tpacc->sendMessageToAddress(reqAddress,reqMsg);
135     }
136   }
137 }
138
139 void TpSession::onMessageReceived(const Tp::ReceivedMessage &msg,TpSessionAccount *acc)
140 {
141     qDebug() << "TestProg::onMessageReceived " << msg.text() << "from " << msg.sender()->id();
142     emit messageReceived(msg,acc);
143 }
144
145 /**
146  * Send message using specified connection manager to address
147  *
148  * \param connectionMgr  Name of the connection manager
149  * \param address Valid address for this connection manager type. Asexample telephone number to Ring, GoogleTalk address for Gabble
150  * \param message Message body
151  */
152 void TpSession::sendMessageToAddress(QString connectionMgr,QString address,QString message)
153 {
154  TpSessionAccount *tpsa=getAccount(connectionMgr);
155  if(tpsa) tpsa->sendMessageToAddress(address,message);
156 }
157 /**
158  * Returns pointer to TpSessionAccout object with specified connection manager or protocol, returns NULL if no match found
159  *
160  * \param cm  Name of the connection manager, if left empty matches every entry
161  * \param protocol Name of the protocol manager, if left empty matches every entry
162  */
163 TpSessionAccount* TpSession::getAccount(const  QString cm,QString protocol)
164 {
165  qDebug() << "TpSession::getAccount" << cm << " " << protocol;
166  foreach (TpSessionAccount *tpacc, accounts) {
167      if((!cm.isEmpty()  && tpacc->acc->cmName()==cm) || (!protocol.isEmpty() && tpacc->acc->protocol()==protocol)) {
168      qDebug() << "TpSession::getAccount found" << tpacc->acc->cmName() << " " << tpacc->acc->protocol();
169      return tpacc;
170      }
171  }
172  return NULL;
173 }
174
175 void TpSession::createObserver()
176 {
177
178     qDebug() << __PRETTY_FUNCTION__ ;
179
180     registrar = Tp::ClientRegistrar::create();
181
182     Tp::ChannelClassList channelFilters;
183     QMap<QString, QDBusVariant> textFilter, mediaFilter;
184     // Registering Text channel observer
185     textFilter.insert(QLatin1String(TELEPATHY_INTERFACE_CHANNEL ".ChannelType"),
186                   QDBusVariant(TELEPATHY_INTERFACE_CHANNEL_TYPE_TEXT));
187     textFilter.insert(QLatin1String(TELEPATHY_INTERFACE_CHANNEL ".TargetHandleType"),
188                   QDBusVariant(Tp::HandleTypeContact));
189     channelFilters.append(textFilter);
190
191     // Registering Media channel observer
192     mediaFilter.insert(QLatin1String(TELEPATHY_INTERFACE_CHANNEL ".ChannelType"),
193                   QDBusVariant(TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAMED_MEDIA));
194     mediaFilter.insert(QLatin1String(TELEPATHY_INTERFACE_CHANNEL ".TargetHandleType"),
195                   QDBusVariant(Tp::HandleTypeContact));
196     channelFilters.append(mediaFilter);
197
198     TpSessionObserver* observer = new TpSessionObserver( channelFilters, this );
199     bool registered = registrar->registerClient(
200       Tp::AbstractClientPtr::dynamicCast(Tp::SharedPtr<TpSessionObserver>(observer)),
201       "TpSessionChannelObserver");
202
203         qDebug() << "TpSession::createObserver" << (registered ? "started" : "failed");
204
205 }
206
207
208 void TpSession::createChannelListener(const QString &channelType,
209                                    const Tp::MethodInvocationContextPtr<> &context,
210                                    const Tp::AccountPtr &account,
211                                    const Tp::ChannelPtr &channel)
212 {
213     qDebug() << "TpSession::createChannelListener";
214
215     QString channelObjectPath = channel->objectPath();
216
217
218     if ( channels.contains( channelObjectPath ) &&
219          !channelType.isEmpty() &&
220          !channelObjectPath.isEmpty() ) {
221         qDebug() << "TELEPATHY_ERROR_INVALID_ARGUMENT";
222         return;
223     }
224     qDebug() << "creating listener for: " << channelObjectPath << " type " << channelType;
225 #if 0
226     ChannelListener* listener = 0;
227     if( channelType == TELEPATHY_INTERFACE_CHANNEL_TYPE_TEXT ) {
228         listener = new TextChannelListener(account, channel, context);
229     } else if ( channelType == TELEPATHY_INTERFACE_CHANNEL_TYPE_STREAMED_MEDIA ) {
230         listener = new StreamChannelListener(account, channel, context);
231     }
232
233     if(listener) {
234         connect(listener, SIGNAL(channelClosed(ChannelListener *)),
235                 this, SLOT(channelClosed(ChannelListener *)));
236         Channels.append( channelObjectPath );
237     }
238 #endif
239 }
240
241
242
243
244
245
246
247