phonebookengines/cntactions/src/cntaction.cpp
branchRCL_3
changeset 62 5b6f26637ad3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/cntactions/src/cntaction.cpp	Tue Aug 31 15:05:21 2010 +0300
@@ -0,0 +1,236 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+#include "cntaction.h"
+
+#include <xqservicerequest.h>
+#include <xqappmgr.h>
+#include <qcontactphonenumber.h>
+#include <qcontactfilters.h>
+#include <QTimer>
+#include <QDebug>
+
+CntAction::CntAction(const QString &actionName) :
+        m_actionName(actionName),
+        m_vendorName("symbian"),
+        m_implementationVersion(1),
+        m_result(), 
+        m_contact(),
+        m_detail(),
+        m_request(NULL)
+{
+}
+        
+CntAction::~CntAction()
+{
+    delete m_request;
+    m_request = NULL;
+}
+
+QVariantMap CntAction::metaData() const
+{
+    return QVariantMap();
+}
+
+QContactFilter CntAction::contactFilter(const QVariant& value) const
+{
+    Q_UNUSED(value);
+    
+    QContactUnionFilter unionFilter;
+   
+    QContactDetailFilter landlineFilter;
+    landlineFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); 
+    landlineFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeLandline));
+    unionFilter << landlineFilter;
+    
+    QContactDetailFilter mobileFilter;
+    mobileFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); 
+    mobileFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeMobile));
+    unionFilter << mobileFilter;
+        
+    QContactDetailFilter pagerFilter;
+    pagerFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); 
+    pagerFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypePager));
+    unionFilter << pagerFilter;
+        
+    QContactDetailFilter voiceFilter;
+    voiceFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); 
+    voiceFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeVoice));
+    unionFilter << voiceFilter;
+        
+    QContactDetailFilter modemFilter;
+    modemFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); 
+    modemFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeModem));
+    unionFilter << modemFilter;
+        
+    QContactDetailFilter videoFilter;
+    videoFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); 
+    videoFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeVideo));
+    unionFilter << videoFilter;
+        
+    QContactDetailFilter carFilter;
+    carFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); 
+    carFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeCar));
+    unionFilter << carFilter;
+        
+    QContactDetailFilter bulletinBoardFilter;
+    bulletinBoardFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes); 
+    bulletinBoardFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeBulletinBoardSystem));
+    unionFilter << bulletinBoardFilter;
+	
+    return unionFilter;
+}
+
+//virtual function, common code for call, videocall and message actions
+bool CntAction::isDetailSupported(const QContactDetail &detail, const QContact &/*contact*/) const
+{
+    return (detail.definitionName() == QContactPhoneNumber::DefinitionName);
+}
+
+//virtual function, common code for call, videocall and message actions
+QList<QContactDetail> CntAction::supportedDetails(const QContact& contact) const
+{
+    return contact.details(QContactPhoneNumber::DefinitionName);
+}
+
+QContactActionDescriptor CntAction::actionDescriptor() const
+{
+    QContactActionDescriptor ret;
+    ret.setActionName(m_actionName);
+    ret.setVendorName(m_vendorName);
+    ret.setImplementationVersion(m_implementationVersion);
+    return ret;
+}
+
+
+bool CntAction::invokeAction(const QContact& contact, const QContactDetail& detail, const QVariantMap& data)
+{
+	m_contact = contact;
+	m_detail  = detail;
+	m_data = data;
+	
+	QTimer::singleShot(1, this, SLOT(performAction()));
+	m_state = QContactAction::ActiveState;
+	return true;
+}
+
+QContactAction::State CntAction::state() const
+{
+    return m_state;
+}
+
+QVariantMap CntAction::results() const
+{
+    return m_result;
+}
+
+//Clears the action data, is called after the result has been emitted to contact (emitResult function)
+void CntAction::resetAction()
+{
+	m_contact = QContact(); 
+	m_detail  = QContactDetail();
+}
+
+//returns whether the actionDescription is supported by this action
+bool CntAction::actionDescriptionSupported(const QContactActionDescriptor& descriptor) const
+{
+    bool supported(false);
+    
+    if ((descriptor.actionName() == m_actionName) && (descriptor.vendorName() == m_vendorName) && (descriptor.implementationVersion() == m_implementationVersion))
+        supported = true;
+    else
+        supported = false; 
+    
+    return supported;       
+}
+
+//common code to perform a call, videocall action
+void CntAction::performNumberAction(const QString &interface, const QString &operation)
+{
+    QVariant retValue;
+    
+    // XQApplicationManager is not supported by PhoneUI to initiate calls,
+    // only old approarch using XQServiceRequest can be used. 
+    XQServiceRequest snd(interface, operation); //sync request
+
+    //QContactType == TypeGroup
+    if (QContactType::TypeGroup == m_contact.type()) {
+        QContactPhoneNumber conferenceCall = m_contact.detail<QContactPhoneNumber>();
+        
+        snd << conferenceCall.number() << m_contact.localId() << m_contact.displayLabel();
+        snd.send(retValue);
+        emitResult(snd.latestError(), retValue);
+    }
+    //QContactType == TypeContact
+    //detail exist use it
+    else if (m_detail.definitionName() == QContactPhoneNumber::DefinitionName) {
+		const QContactPhoneNumber &phoneNumber = static_cast<const QContactPhoneNumber &>(m_detail);
+		
+        snd << phoneNumber.number() << m_contact.localId() << m_contact.displayLabel();
+        snd.send(retValue);
+        emitResult(snd.latestError(), retValue);
+	}
+    //QContactType == TypeContact
+    //if no detail, pick preferred
+	else if (m_detail.isEmpty())
+	{
+		QContactDetail detail = m_contact.preferredDetail(m_actionName);
+		QContactPhoneNumber phoneNumber;
+	
+		//if preferred is empty pick first phonenumber
+		if (detail.isEmpty()) {
+			phoneNumber = m_contact.detail<QContactPhoneNumber>();
+		}
+		
+		//if not empty, cast detail to phonenumber
+		else {
+			phoneNumber = static_cast<QContactPhoneNumber>(detail);
+		}
+		
+        snd << phoneNumber.number() << m_contact.localId() << m_contact.displayLabel();
+        snd.send(retValue);
+        emitResult(snd.latestError(), retValue);
+	}
+	//else return an error
+	else {
+		emitResult(GeneralError, retValue);
+	}
+}
+
+//emit the result to the client
+void CntAction::emitResult(int errorCode, const QVariant &retValue)
+{
+	m_result.clear();
+	m_result.insert("Error", QVariant(errorCode));
+	m_result.insert("ReturnValue", retValue);
+	if (m_request) {
+        m_result.insert("XQAiwRequest Error", m_request->lastError());
+	}
+	
+	if (errorCode == 0) {
+		m_state = QContactAction::FinishedState;
+	}
+	
+	else {
+		m_state = QContactAction::FinishedWithErrorState;
+	}
+	
+	//emit progress(state, m_result);
+	emit stateChanged(m_state);
+	emit resultsAvailable();
+
+	resetAction(); //reset values in the action
+}