1/****************************************************************************
2**
3** Copyright (C) 2015 The Qt Company Ltd.
4** Contact: http://www.qt.io/licensing/
5**
6** This file is part of the QtContacts module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL21$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see http://www.qt.io/terms-conditions. For further
15** information use the contact form at http://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 2.1 or version 3 as published by the Free
20** Software Foundation and appearing in the file LICENSE.LGPLv21 and
21** LICENSE.LGPLv3 included in the packaging of this file. Please review the
22** following information to ensure the GNU Lesser General Public License
23** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
24** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25**
26** As a special exception, The Qt Company gives you certain additional
27** rights. These rights are described in The Qt Company LGPL Exception
28** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29**
30** $QT_END_LICENSE$
31**
32****************************************************************************/
33
34#include "qcontactactionmanager_p.h"
35
36#include "qcontactaction.h"
37#include "qcontactactionfactory.h"
38#include "qcontactmanager_p.h"
39
40QT_BEGIN_NAMESPACE_CONTACTS
41
42Q_GLOBAL_STATIC(QContactActionManager, contactActionManagerInstance)
43
44/*!
45 \internal
46 \class QContactActionManager
47 This class uses a plugin to delegate discovery of actions (to avoid a dependency on SFW for QtContacts)
48 It is an implementation detail of QContactAction.
49 */
50
51QContactActionManager* QContactActionManager::instance()
52{
53 return contactActionManagerInstance();
54}
55
56QContactActionManager::QContactActionManager()
57 : QObject(),
58 m_plugin(0)
59{
60}
61
62void QContactActionManager::init()
63{
64 // We ask the qcontactmanager engine loading code, since it has to enumerate things anyway
65 QContactManagerData::loadFactoriesMetadata();
66 m_plugin = QContactManagerData::m_actionManagers.value(i: 0);
67}
68
69QContactActionManager::~QContactActionManager()
70{
71 // Allow our subordinates to do their thing when they want,
72 // since we just cache stuff
73}
74
75QList<QContactActionDescriptor> QContactActionManager::availableActions(const QContact &contact)
76{
77 QMutexLocker locker(&m_instanceMutex);
78 init();
79
80 QList<QContactActionDescriptor> ret;
81 if (m_plugin) {
82 QHash<QContactActionDescriptor, QContactActionFactory*> hash = m_plugin->actionFactoryHash();
83 QHash<QContactActionDescriptor, QContactActionFactory*>::const_iterator it;
84 for (it = hash.constBegin(); it != hash.constEnd(); ++it) {
85 QContactActionFactory* curr = it.value();
86 if (curr && curr->supportsContact(contact, which: it.key())) {
87 ret.append(t: it.key());
88 }
89 }
90 }
91
92 return ret;
93}
94
95QList<QContactActionDescriptor> QContactActionManager::actionDescriptors(const QString& actionName)
96{
97 QMutexLocker locker(&m_instanceMutex);
98 init();
99
100 if (m_plugin) {
101 if (actionName.isEmpty())
102 return m_plugin->descriptorHash().values();
103 return m_plugin->descriptorHash().values(akey: actionName);
104 }
105 return QList<QContactActionDescriptor>();
106}
107
108/*! The caller takes ownership of the returned action pointer, and must delete it to avoid leaking memory. */
109QContactAction* QContactActionManager::action(const QContactActionDescriptor& descriptor)
110{
111 QMutexLocker locker(&m_instanceMutex);
112 init();
113
114 if (m_plugin) {
115 QContactActionFactory *factory = m_plugin->actionFactoryHash().value(akey: descriptor);
116 if (factory)
117 return factory->create(which: descriptor);
118 }
119 return 0;
120}
121
122#include "moc_qcontactactionmanager_p.cpp"
123
124QT_END_NAMESPACE_CONTACTS
125

source code of qtpim/src/contacts/qcontactactionmanager_p.cpp