4 Copyright (c) 2003-2004 by Marc Cramdal <marc.cramdal@gmail.com>
6 Copyright (c) 2007 by the Kopete Developers <kopete-devel@kde.org>
8 *************************************************************************
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
15 *************************************************************************
25 #include <kgenericfactory.h>
26 #include <kaboutdata.h>
28 #include <kactioncollection.h>
29 #include <kmessagebox.h>
30 #include <kstandarddirs.h>
31 #include <kdeversion.h>
33 #include "kopetechatsessionmanager.h"
34 #include "kopetemetacontact.h"
35 #include "kopeteview.h"
36 #include "kopetecontactlist.h"
37 #include "kopeteuiglobal.h"
38 #include "kopetemessageevent.h"
39 #include "kopeteonlinestatus.h"
40 #include "kopeteaccountmanager.h"
41 #include "kopeteaccount.h"
42 #include "kopetecontact.h"
44 #include "statisticscontact.h"
45 #include "statisticsdialog.h"
46 #include "statisticsplugin.h"
47 #include "statisticsadaptor.h"
48 #include "statisticsdb.h"
50 K_PLUGIN_FACTORY(StatisticsPluginFactory
, registerPlugin
<StatisticsPlugin
>();)
51 K_EXPORT_PLUGIN(StatisticsPluginFactory( "kopete_statistics" ))
53 StatisticsPlugin::StatisticsPlugin( QObject
*parent
, const QVariantList
&/*args*/ )
54 : Kopete::Plugin( StatisticsPluginFactory::componentData(), parent
)
57 KAction
*viewMetaContactStatistics
= new KAction( KIcon("view-statistics"), i18n("View &Statistics" ),
59 actionCollection()->addAction ( "viewMetaContactStatistics", viewMetaContactStatistics
);
60 connect(viewMetaContactStatistics
, SIGNAL(triggered(bool)), this, SLOT(slotViewStatistics()));
61 viewMetaContactStatistics
->setEnabled(Kopete::ContactList::self()->selectedMetaContacts().count() == 1);
63 connect(Kopete::ChatSessionManager::self(),SIGNAL(chatSessionCreated(Kopete::ChatSession
*)),
64 this, SLOT(slotViewCreated(Kopete::ChatSession
*)));
65 connect(Kopete::ChatSessionManager::self(),SIGNAL(aboutToReceive(Kopete::Message
&)),
66 this, SLOT(slotAboutToReceive(Kopete::Message
&)));
68 connect(Kopete::ContactList::self(), SIGNAL(metaContactSelected(bool)),
69 viewMetaContactStatistics
, SLOT(setEnabled(bool)));
70 connect(Kopete::ContactList::self(), SIGNAL(metaContactAdded(Kopete::MetaContact
*)),
71 this, SLOT(slotMetaContactAdded(Kopete::MetaContact
*)));
72 connect(Kopete::ContactList::self(), SIGNAL(metaContactRemoved(Kopete::MetaContact
*)),
73 this, SLOT(slotMetaContactRemoved(Kopete::MetaContact
*)));
75 setXMLFile("statisticsui.rc");
77 /* Initialization reads the database, so it could be a bit time-consuming
78 due to disk access. This should overcome the problem and makes it non-blocking. */
79 QTimer::singleShot(0, this, SLOT(slotInitialize()));
81 new StatisticsAdaptor(this);
82 QDBusConnection dbus
= QDBusConnection::sessionBus();
83 dbus
.registerObject("/Statistics", this);
86 void StatisticsPlugin::slotInitialize()
88 // Initializes the database
89 m_db
= new StatisticsDB();
91 QList
<Kopete::MetaContact
*> list
= Kopete::ContactList::self()->metaContacts();
92 foreach(Kopete::MetaContact
*metaContact
, list
)
94 slotMetaContactAdded(metaContact
);
98 StatisticsPlugin::~StatisticsPlugin()
100 qDeleteAll(statisticsContactMap
);
101 statisticsContactMap
.clear();
104 void StatisticsPlugin::slotAboutToReceive(Kopete::Message
& m
)
109 StatisticsContact
*sc
= statisticsContactMap
.value(m
.from()->metaContact());
111 sc
->newMessageReceived(m
);
114 void StatisticsPlugin::slotViewCreated(Kopete::ChatSession
* session
)
116 connect(session
, SIGNAL(closing(Kopete::ChatSession
*)), this, SLOT(slotViewClosed(Kopete::ChatSession
*)));
119 void StatisticsPlugin::slotViewClosed(Kopete::ChatSession
* session
)
121 QList
<Kopete::Contact
*> list
= session
->members();
122 foreach(Kopete::Contact
*contact
, list
)
124 // If this contact is not in other chat sessions
125 if (!contact
->manager())
127 StatisticsContact
*sc
= statisticsContactMap
.value(contact
->metaContact());
129 sc
->setIsChatWindowOpen(false);
134 void StatisticsPlugin::slotViewStatistics()
136 Kopete::MetaContact
*mc
= Kopete::ContactList::self()->selectedMetaContacts().first();
138 kDebug(14315) << "statistics - dialog: " + mc
->displayName();
140 StatisticsContact
*sc
= statisticsContactMap
.value(mc
);
143 StatisticsDialog
* dialog
= new StatisticsDialog(sc
, db());
144 dialog
->setObjectName( QLatin1String( "StatisticsDialog" ) );
149 void StatisticsPlugin::slotOnlineStatusChanged(Kopete::MetaContact
*metaContact
, Kopete::OnlineStatus::StatusType status
)
151 StatisticsContact
*sc
= statisticsContactMap
.value(metaContact
);
153 sc
->onlineStatusChanged(status
);
156 void StatisticsPlugin::slotMetaContactAdded(Kopete::MetaContact
*mc
)
158 connect(mc
, SIGNAL(onlineStatusChanged(Kopete::MetaContact
*, Kopete::OnlineStatus::StatusType
)), this,
159 SLOT(slotOnlineStatusChanged(Kopete::MetaContact
*, Kopete::OnlineStatus::StatusType
)));
161 statisticsContactMap
[mc
] = new StatisticsContact(mc
, db());
164 void StatisticsPlugin::slotMetaContactRemoved(Kopete::MetaContact
*mc
)
166 disconnect(mc
, 0, this, 0);
167 StatisticsContact
*sc
= statisticsContactMap
.value(mc
);
170 statisticsContactMap
.remove(mc
);
175 StatisticsContact
* StatisticsPlugin::findStatisticsContact(QString id
) const
177 QMapIterator
<Kopete::MetaContact
*, StatisticsContact
*> it(statisticsContactMap
);
181 if (it
.key()->metaContactId() == id
)
188 void StatisticsPlugin::dbusStatisticsDialog(QString id
)
190 kDebug(14315) << "statistics - DBus dialog :" << id
;
192 StatisticsContact
*sc
= findStatisticsContact(id
);
195 StatisticsDialog
* dialog
= new StatisticsDialog(sc
, db());
196 dialog
->setObjectName( QLatin1String("StatisticsDialog") );
201 bool StatisticsPlugin::dbusWasOnline(QString id
, int timeStamp
)
204 dt
.setTime_t(timeStamp
);
205 return dbusWasStatus(id
, dt
, Kopete::OnlineStatus::Online
);
208 bool StatisticsPlugin::dbusWasOnline(QString id
, QString dateTime
)
210 return dbusWasStatus(id
, QDateTime::fromString(dateTime
), Kopete::OnlineStatus::Online
);
213 bool StatisticsPlugin::dbusWasAway(QString id
, int timeStamp
)
216 dt
.setTime_t(timeStamp
);
217 return dbusWasStatus(id
, dt
, Kopete::OnlineStatus::Away
);
220 bool StatisticsPlugin::dbusWasAway(QString id
, QString dateTime
)
222 return dbusWasStatus(id
, QDateTime::fromString(dateTime
), Kopete::OnlineStatus::Away
);
225 bool StatisticsPlugin::dbusWasOffline(QString id
, int timeStamp
)
228 dt
.setTime_t(timeStamp
);
229 return dbusWasStatus(id
, dt
, Kopete::OnlineStatus::Offline
);
232 bool StatisticsPlugin::dbusWasOffline(QString id
, QString dateTime
)
234 return dbusWasStatus(id
, QDateTime::fromString(dateTime
), Kopete::OnlineStatus::Offline
);
237 bool StatisticsPlugin::dbusWasStatus(QString id
, QDateTime dateTime
, Kopete::OnlineStatus::StatusType status
)
239 kDebug(14315) << "statistics - DBus wasOnline :" << id
;
241 if (dateTime
.isValid())
243 StatisticsContact
*sc
= findStatisticsContact(id
);
245 return sc
->wasStatus(dateTime
, status
);
251 QString
StatisticsPlugin::dbusStatus(QString id
, int timeStamp
)
254 dt
.setTime_t(timeStamp
);
255 return dbusStatus(id
, dt
.toString());
259 QString
StatisticsPlugin::dbusStatus(QString id
, QString dateTime
)
261 QDateTime dt
= QDateTime::fromString(dateTime
);
264 StatisticsContact
*sc
= findStatisticsContact(id
);
266 return sc
->statusAt(dt
);
273 QString
StatisticsPlugin::dbusMainStatus(QString id
, int timeStamp
)
276 dt
.setTime_t(timeStamp
);
279 StatisticsContact
*sc
= findStatisticsContact(id
);
281 return sc
->mainStatusDate(dt
.date());
287 #include "statisticsplugin.moc"