1 /*
2     userdetailsmanager.cpp - Storage of all user details seen during this session
3 
4     Copyright (c) 2004      SUSE Linux AG	     http://www.suse.com
5 
6     Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.org>
7 
8     *************************************************************************
9     *                                                                       *
10     * This library is free software; you can redistribute it and/or         *
11     * modify it under the terms of the GNU Lesser General Public            *
12     * License as published by the Free Software Foundation; either          *
13     * version 2 of the License, or (at your option) any later version.      *
14     *                                                                       *
15     *************************************************************************
16 */
17 
18 #include "userdetailsmanager.h"
19 
20 #include "client.h"
21 #include "tasks/getdetailstask.h"
22 
UserDetailsManager(Client * parent)23 UserDetailsManager::UserDetailsManager(Client *parent)
24     : QObject(parent)
25     , m_client(parent)
26 {
27 }
28 
~UserDetailsManager()29 UserDetailsManager::~UserDetailsManager()
30 {
31 }
32 
dump(const QStringList & list)33 void UserDetailsManager::dump(const QStringList &list)
34 {
35     for (QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) {
36         m_client->debug(QStringLiteral(" - %1").arg(*it));
37     }
38 }
39 
known(const QString & dn)40 bool UserDetailsManager::known(const QString &dn)
41 {
42     if (dn == m_client->userDN()) {
43         return true;
44     }
45     // we always know the local user's details, so don't look them up
46     return m_detailsMap.keys().contains(dn);
47 }
48 
details(const QString & dn)49 ContactDetails UserDetailsManager::details(const QString &dn)
50 {
51 //	qDebug() << "UserDetailsManager::details() requested for " << dn.toLatin1();
52     return m_detailsMap[ dn ];
53 }
54 
knownDNs()55 QStringList UserDetailsManager::knownDNs()
56 {
57     return m_detailsMap.keys();
58 }
59 
addDetails(const ContactDetails & details)60 void UserDetailsManager::addDetails(const ContactDetails &details)
61 {
62 //	qDebug() << "UserDetailsManager::addDetails, got " << details.dn;
63     m_detailsMap.insert(details.dn, details);
64 /*	QStringList keys = m_detailsMap.keys();
65     dump( keys );
66     qDebug( "UserDetailsManager::addContact, pending: " );
67     dump( m_pendingDNs );*/
68 }
69 
removeContact(const QString & dn)70 void UserDetailsManager::removeContact(const QString &dn)
71 {
72     m_detailsMap.remove(dn);
73 }
74 
requestDetails(const QStringList & dnList,bool onlyUnknown)75 void UserDetailsManager::requestDetails(const QStringList &dnList, bool onlyUnknown)
76 {
77     // build a list of DNs that are not already subject to a pending request
78     QStringList requestList;
79     QStringListIterator it(dnList);
80     while (it.hasNext())
81     {
82         QString dn = it.next();
83         // don't request our own details
84         if (dn == m_client->userDN()) {
85             break;
86         }
87         // don't request details we already have unless the caller specified this
88         if (onlyUnknown && known(dn)) {
89             break;
90         }
91         if (!m_pendingDNs.contains(dn)) {
92             m_client->debug(QStringLiteral("UserDetailsManager::requestDetails - including %1").arg(dn));
93             requestList.append(dn);
94             m_pendingDNs.append(dn);
95         }
96     }
97     if (!requestList.empty()) {
98         GetDetailsTask *gdt = new GetDetailsTask(m_client->rootTask());
99         gdt->userDNs(requestList);
100         connect(gdt, SIGNAL(gotContactUserDetails(GroupWise::ContactDetails)),
101                 SLOT(slotReceiveContactDetails(GroupWise::ContactDetails)));
102         // TODO: connect to gdt's finished() signal, check for failures, expand gdt to maintain a list of not found DNs?
103         gdt->go(true);
104     } else {
105         m_client->debug(QStringLiteral("UserDetailsManager::requestDetails - all requested contacts are already available or pending"));
106     }
107 }
108 
requestDetails(const QString & dn,bool onlyUnknown)109 void UserDetailsManager::requestDetails(const QString &dn, bool onlyUnknown)
110 {
111     m_client->debug(QStringLiteral("UserDetailsManager::requestDetails for %1").arg(dn));
112     QStringList list;
113     list.append(dn);
114     requestDetails(list, onlyUnknown);
115 }
116 
slotReceiveContactDetails(const GroupWise::ContactDetails & details)117 void UserDetailsManager::slotReceiveContactDetails(const GroupWise::ContactDetails &details)
118 {
119     m_client->debug(QStringLiteral("UserDetailsManager::slotReceiveContactDetails()"));
120     m_pendingDNs.removeAll(details.dn);
121     /*client()->userDetailsManager()->*/
122     addDetails(details);
123     qDebug()
124         << "  Auth attribute: " << details.authAttribute
125         << "  , Away message: " << details.awayMessage
126         << "  , CN" << details.cn
127         << "  , DN" << details.dn
128         << "  , fullName" << details.fullName
129         << "  , surname" << details.surname
130         << "  , givenname" << details.givenName
131         << "  , status" << details.status
132         << endl;
133     //emit temporaryContact( details );
134     emit gotContactDetails(details);
135 }
136