| 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 "qcontactaction.h" |
| 35 | |
| 36 | #include <QtCore/qset.h> |
| 37 | |
| 38 | #include "qcontactactiondescriptor.h" |
| 39 | #include "qcontactactionmanager_p.h" |
| 40 | #include "qcontactmanager_p.h" |
| 41 | |
| 42 | QT_BEGIN_NAMESPACE_CONTACTS |
| 43 | |
| 44 | QContactAction::~QContactAction() |
| 45 | { |
| 46 | } |
| 47 | |
| 48 | /*! |
| 49 | \class QContactAction |
| 50 | \brief The QContactAction class provides an interface for performing an |
| 51 | action on a QContact or QContactDetail. |
| 52 | \ingroup contacts-main |
| 53 | \ingroup contacts-actions |
| 54 | |
| 55 | \inmodule QtContacts |
| 56 | |
| 57 | An action is anything that can be performed on a contact, or a detail of a contact. An example |
| 58 | of an action might be "Send Email" or "Dial" or "Plot Navigation Route". One action may be |
| 59 | implemented by multiple vendors, and indeed one vendor may provide multiple implementations of |
| 60 | the same action. The name of an action identifies its semantics, while its implementation version |
| 61 | distinguishes it from other implementations of the action by the same vendor. |
| 62 | |
| 63 | Invocation of an action is asynchronous; at some stage after calling \l invokeAction() the |
| 64 | action instance will emit the \l stateChanged() signal. Any results of the action may be retrieved |
| 65 | by calling \l results(), and as results become available the action will emit \l resultsAvailable(). |
| 66 | |
| 67 | Each instance of a QContactAction is created by a \l QContactActionFactory when |
| 68 | \l QContactAction::action() is called; the caller takes ownership of the action instance. |
| 69 | Each action is uniquely described by a \l QContactActionDescriptor, which is passed to the |
| 70 | \l QContactAction::action() function to instantiate an action. |
| 71 | |
| 72 | \sa QContactActionFactory, QContactActionFilter |
| 73 | */ |
| 74 | |
| 75 | /*! |
| 76 | \fn QContactAction::~QContactAction() |
| 77 | Clears any memory in use by this instance of the action implementation |
| 78 | */ |
| 79 | |
| 80 | /*! |
| 81 | \fn QContactAction::state() const |
| 82 | Returns the current state of the action. |
| 83 | \sa stateChanged() |
| 84 | */ |
| 85 | |
| 86 | |
| 87 | /*! |
| 88 | \fn QContactAction::invokeAction(const QList<QContactActionTarget>& targets, const QVariantMap& parameters = QVariantMap()) |
| 89 | \overload |
| 90 | |
| 91 | Initiates the action on the specified list of \a targets with the optional supplied \a parameters. |
| 92 | |
| 93 | At some point after invocation, one or more \l resultsAvailable() signals will be emitted by the action instance. |
| 94 | The results of the action (if any) may be retrieved by calling \l results(). |
| 95 | When the state of the action changes, the \l stateChanged() signal will be emitted. |
| 96 | |
| 97 | Returns true if the action was invoked successfully, otherwise false. The return value says nothing |
| 98 | about whether the action which was invoked was successful or not, only whether it was initiated or |
| 99 | the request for it to be initiated was sent successfully (e.g., if the action is implemented as a one-way |
| 100 | RPC call). |
| 101 | |
| 102 | \sa results(), stateChanged() |
| 103 | */ |
| 104 | |
| 105 | |
| 106 | /*! |
| 107 | \fn QContactAction::invokeAction(const QContact& contact, const QContactDetail& detail = QContactDetail(), const QVariantMap& parameters = QVariantMap()) |
| 108 | \overload |
| 109 | |
| 110 | This is a convenience function. |
| 111 | |
| 112 | Initiates the action on the specified \a detail of the given \a contact, or on the first |
| 113 | eligible detail saved in the contact if the given \a detail is empty, with the given \a parameters specified. |
| 114 | |
| 115 | \sa results(), stateChanged() |
| 116 | */ |
| 117 | |
| 118 | /*! |
| 119 | \fn QContactAction::invokeAction(const QContactActionTarget& target, const QVariantMap& parameters = QVariantMap()) |
| 120 | \overload |
| 121 | |
| 122 | This is a convenience function, |
| 123 | |
| 124 | Initiates the action on the specified \a target with the given \a parameters specified. |
| 125 | \sa results(), stateChanged() |
| 126 | */ |
| 127 | |
| 128 | /*! |
| 129 | \fn QContactAction::results() const |
| 130 | Returns the result of the action, if any exists. Calling this function prior to receiving the \l resultsAvailable() |
| 131 | signal will not return a meaningful result. |
| 132 | */ |
| 133 | |
| 134 | /*! |
| 135 | \enum QContactAction::State |
| 136 | Describes the current status of the asynchronous action operation |
| 137 | \value InactiveState The operation has not yet been initiated |
| 138 | \value FinishedDetachedState The operation was initiated but no further information is or will be available |
| 139 | \value ActiveState The operation was initiated and is not yet finished |
| 140 | \value FinishedState The operation successfully completed |
| 141 | \value FinishedWithErrorState The operation has finished, but an error occurred |
| 142 | */ |
| 143 | |
| 144 | /*! |
| 145 | \fn QContactAction::resultsAvailable() |
| 146 | This signal is emitted by an action instance whose functionality has been initiated with \l invokeAction() |
| 147 | when results of the action are available. Not all actions will have results, and these |
| 148 | actions will not emit the resultsAvailable() signal. |
| 149 | |
| 150 | If the action implementation is incapable of reporting results of the operation (for example, the |
| 151 | action is implemented via a one-way IPC call) it should transition to the \c QContactAction::FinishedDetachedState state |
| 152 | immediately upon invocation. |
| 153 | */ |
| 154 | |
| 155 | /*! |
| 156 | \fn QContactAction::stateChanged(QContactAction::State newState) |
| 157 | This signal is emitted when the state of an action changes to the given \a newState. |
| 158 | \sa state() |
| 159 | */ |
| 160 | |
| 161 | /*! |
| 162 | Returns a list of identifiers of the available actions which are provided by the service provider with the given \a serviceName. |
| 163 | If \a serviceName is empty, actions from all service providers and of any implementation version are returned. |
| 164 | */ |
| 165 | QStringList QContactAction::availableActions(const QString& serviceName) |
| 166 | { |
| 167 | // SLOW naive implementation... |
| 168 | QSet<QString> ret; |
| 169 | QList<QContactActionDescriptor> actionDescriptors = QContactActionManager::instance()->actionDescriptors(); |
| 170 | for (int i = 0; i < actionDescriptors.size(); i++) { |
| 171 | QContactActionDescriptor descriptor = actionDescriptors.at(i); |
| 172 | if (serviceName.isEmpty() || serviceName == descriptor.serviceName()) { |
| 173 | ret.insert(value: descriptor.actionName()); |
| 174 | } |
| 175 | } |
| 176 | |
| 177 | return ret.toList(); |
| 178 | } |
| 179 | |
| 180 | |
| 181 | /*! |
| 182 | \fn QContactAction::ActionCall() |
| 183 | The name of the default call action. |
| 184 | Actions of this name will allow the client to call |
| 185 | the specified action target (contact or detail of a contact). |
| 186 | \sa actionDescriptors() |
| 187 | */ |
| 188 | |
| 189 | /*! |
| 190 | \fn QContactAction::ActionEmail() |
| 191 | The name of the default send email action. |
| 192 | Actions of this name will either open a graphical element |
| 193 | which allows the client to send the specified action |
| 194 | target an email, or directly send the specified action |
| 195 | target an email if the correct parameters to invocation |
| 196 | are specified. |
| 197 | \sa actionDescriptors() |
| 198 | */ |
| 199 | |
| 200 | /*! |
| 201 | \fn QContactAction::ActionSms() |
| 202 | The name of the default send sms action. |
| 203 | Actions of this name will allow the client to send |
| 204 | the specified action target an sms. |
| 205 | \sa actionDescriptors() |
| 206 | */ |
| 207 | |
| 208 | /*! |
| 209 | \fn QContactAction::ActionMms() |
| 210 | The name of the default send mms action. |
| 211 | Actions of this name will allow the client to send |
| 212 | the specified action target an mms. |
| 213 | \sa actionDescriptors() |
| 214 | */ |
| 215 | |
| 216 | /*! |
| 217 | \fn QContactAction::ActionChat() |
| 218 | The name of the default IM chat action. |
| 219 | Actions of this name will allow the client to begin |
| 220 | an IM chat session with the specified action target. |
| 221 | \sa actionDescriptors() |
| 222 | */ |
| 223 | |
| 224 | /*! |
| 225 | \fn QContactAction::ActionVideoCall() |
| 226 | The name of the default video call action. |
| 227 | Actions of this name will allow clients to initiate |
| 228 | a video call with the specified action target. |
| 229 | \sa actionDescriptors() |
| 230 | */ |
| 231 | |
| 232 | /*! |
| 233 | \fn QContactAction::ActionOpenInEditor() |
| 234 | The name of the default "edit contact" action. |
| 235 | Actions of this name will open a graphical element |
| 236 | which allows the user to edit the contact. |
| 237 | \sa actionDescriptors() |
| 238 | */ |
| 239 | |
| 240 | /*! |
| 241 | \fn QContactAction::ActionOpenInViewer() |
| 242 | The name of the default view contact action. |
| 243 | Actions of this name will open a graphical element |
| 244 | which allows the user to view the contact. |
| 245 | \sa actionDescriptors() |
| 246 | */ |
| 247 | |
| 248 | /*! |
| 249 | Returns a list of QContactActionDescriptor instances which identified implementations of the given \a actionName. |
| 250 | The action name may either be one of the default action names, or any other arbitrary string. |
| 251 | |
| 252 | Example: |
| 253 | \code |
| 254 | QList<QContactActionDescriptor> availableCallActions = QContactAction::actionDescriptors(QContactAction::ActionCall()); |
| 255 | \endcode |
| 256 | |
| 257 | Example 2: |
| 258 | \code |
| 259 | QList<QContactActionDescriptor> customActions = QContactAction::actionDescriptors(QStringLiteral("customActionName")); |
| 260 | \endcode |
| 261 | |
| 262 | The actions which are available depend on which action plugins have been installed. For more information |
| 263 | on this topic (for example, if you are interested in providing an action plugin for third-party developers |
| 264 | to use) please see the relevant documentation for \l{Qt Contacts Action API}{action providers}. |
| 265 | */ |
| 266 | QList<QContactActionDescriptor> QContactAction::actionDescriptors(const QString& actionName) |
| 267 | { |
| 268 | QContactActionManager* qcam = QContactActionManager::instance(); |
| 269 | return qcam->actionDescriptors(actionName); |
| 270 | } |
| 271 | |
| 272 | /*! |
| 273 | Returns a pointer to a new instance of the action implementation identified by the given \a descriptor. |
| 274 | The caller takes ownership of the action implementation and must delete it to avoid leaking memory. |
| 275 | The caller is able to delete the action at any time, however doing so prior to when the action |
| 276 | transitions to a finished state may have an undefined outcome depending on the implementation of the action. |
| 277 | */ |
| 278 | QContactAction* QContactAction::action(const QContactActionDescriptor& descriptor) |
| 279 | { |
| 280 | QContactActionManager* qcam = QContactActionManager::instance(); |
| 281 | return qcam->action(descriptor); |
| 282 | } |
| 283 | |
| 284 | #include "moc_qcontactaction.cpp" |
| 285 | |
| 286 | QT_END_NAMESPACE_CONTACTS |
| 287 | |