--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneuis/easydialing/edcontactor/src/edcontactorserviceoperator.cpp Fri Feb 19 22:50:26 2010 +0200
@@ -0,0 +1,493 @@
+/*
+* Copyright (c) 2010 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: Class for handling service logic.
+*
+*/
+
+#include <e32std.h>
+#include <s32mem.h>
+
+#include "edcontactorserviceheaders.h"
+
+// ================= MEMBER FUNCTIONS =======================
+//
+
+// --------------------------------------------------------------------------
+// CEDContactorServiceOperator::NewLC
+// --------------------------------------------------------------------------
+//
+CEDContactorServiceOperator* CEDContactorServiceOperator::NewLC( MEDContactorObserver* aObserver )
+ {
+ CEDContactorServiceOperator* self = new (ELeave) CEDContactorServiceOperator(aObserver);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CEDContactorServiceOperator::NewL
+// --------------------------------------------------------------------------
+//
+CEDContactorServiceOperator* CEDContactorServiceOperator::NewL( MEDContactorObserver* aObserver )
+ {
+ CEDContactorServiceOperator* self = CEDContactorServiceOperator::NewLC(aObserver);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CEDContactorServiceOperator::~CEDContactorServiceOperator
+// --------------------------------------------------------------------------
+//
+CEDContactorServiceOperator::~CEDContactorServiceOperator()
+ {
+ LOGSTRING("CEDContactorServiceOperator::~CEDContactorServiceOperator");
+
+ delete iPopupHandler;
+ }
+
+// --------------------------------------------------------------------------
+// CEDContactorServiceOperator::Execute
+// --------------------------------------------------------------------------
+//
+void CEDContactorServiceOperator::Execute(
+ const CEDContactorService::TCSParameter& aParameter)
+ {
+ LOGSTRING("CEDContactorServiceOperator::Execute");
+
+ iParameter = &aParameter;
+
+ /**
+ * LOGIC:
+ * 1. Launch AIW popup
+ * 2. Special cases: Find out serviceid for voip
+ * 3. Launch communication service
+ *
+ * All actions are trapped here.
+ */
+ TDesC* result = NULL;
+ TBool useDefaults = EFalse;
+
+ // Check default control flag
+ if (CEDContactorService::TCSParameter::EEnableDefaults &
+ iParameter->iControlFlag)
+ {
+ useDefaults = ETrue;
+ }
+
+ // Launch popup
+ TRAPD(err, result = &iPopupHandler->LaunchPopupL(
+ iParameter->iContactLinkArray,
+ CommunicationEnumMapper(iParameter->iCommTypeSelector),
+ useDefaults));
+
+ if (KErrNone != err)
+ {
+ LOGSTRING1("CEDContactorServiceOperator::ExecuteL: LaunchPopupL: Leaves %d.", err);
+
+ if (iObserver)
+ {
+ iObserver->InformContactorEvent(MEDContactorObserver::ECommunicationCancelled);
+ }
+ return;
+ }
+
+ // Resolve special cases
+ TRAP(err, ResolveSpecialCasesL(*result));
+
+ if (KErrNone != err)
+ {
+ LOGSTRING1("CEDContactorServiceOperator::ExecuteL: ResolveSpecialCasesL: Leaves %d.", err);
+
+ if (iObserver)
+ {
+ iObserver->InformContactorEvent(MEDContactorObserver::ECommunicationCancelled);
+ }
+ return;
+ }
+
+ // Launch communication service
+ TRAP(err, LaunchCommunicationMethodL(*result));
+
+ if (KErrNone != err)
+ {
+ LOGSTRING1("CEDContactorServiceOperator::ExecuteL: LaunchCommunicationMethodL: Leaves %d.", err);
+
+ if (iObserver)
+ {
+ iObserver->InformContactorEvent(MEDContactorObserver::ECommunicationCancelled);
+ }
+ return;
+ }
+ LOGSTRING("CEDContactorServiceOperator::Execute: Done.");
+ }
+
+// --------------------------------------------------------------------------
+// CEDContactorServiceOperator::Cancel
+// --------------------------------------------------------------------------
+//
+void CEDContactorServiceOperator::Cancel()
+ {
+ if ( iPopupHandler )
+ {
+ TRAP_IGNORE( iPopupHandler->ClosePopupL() );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CEDContactorServiceOperator::CEDContactorServiceOperator
+// --------------------------------------------------------------------------
+//
+CEDContactorServiceOperator::CEDContactorServiceOperator( MEDContactorObserver* aObserver ):
+ iServiceId((TUint32)KErrNotFound),
+ iObserver(aObserver)
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CEDContactorServiceOperator::ConstructL
+// --------------------------------------------------------------------------
+//
+void CEDContactorServiceOperator::ConstructL()
+ {
+ LOGSTRING("CEDContactorServiceOperator::ConstructL");
+
+ iPopupHandler = CEDContactorPopupHandler::NewL();
+
+ LOGSTRING("CEDContactorServiceOperator::ConstructL: Done.");
+ }
+
+// --------------------------------------------------------------------------
+// CEDContactorServiceOperator::ResolveSpecialCasesL
+// --------------------------------------------------------------------------
+//
+void CEDContactorServiceOperator::ResolveSpecialCasesL(const TDesC& aFieldData)
+ {
+ LOGSTRING("CEDContactorServiceOperator::ResolveSpecialCasesL");
+
+ /*
+ * Currently only VOIP ServiceId is needed to find out.
+ */
+ switch(iParameter->iCommTypeSelector)
+ {
+ case VPbkFieldTypeSelectorFactory::EVOIPCallSelector:
+ iServiceId = ResolveServiceIdL(aFieldData);
+ break;
+ }
+
+ LOGSTRING("CEDContactorServiceOperator::ResolveSpecialCasesL: Done.");
+ }
+
+// --------------------------------------------------------------------------
+// CEDContactorServiceOperator::ResolveServiceIdL
+// --------------------------------------------------------------------------
+//
+TUint32 CEDContactorServiceOperator::ResolveServiceIdL(const TDesC& aFieldData)
+ {
+ LOGSTRING("CEDContactorServiceOperator::ResolveServiceIdL");
+
+ __ASSERT_ALWAYS (NULL != &aFieldData, User::Leave (KErrArgument));
+ __ASSERT_ALWAYS (0 < aFieldData.Size(), User::Leave (KErrArgument));
+
+ TUint32 ret = (TUint32)KErrNotFound;
+
+ //LOGIC:
+ /*
+ * 1. Find out is there xSP prefix ( voip address for some specific service provider )
+ * 2. If there is, search service id
+ * 3. If not, find out how many services support msisdn
+ * 4. If only one, find use that service id
+ * 5. If more than one, do not use service id. User will be prompt which service to use.
+ */
+
+ TPtrC result;
+
+ // 1. Find out is there xSP prefix
+ if (ExtractServiceL(aFieldData, result))
+ {
+ LOGSTRING("CEDContactorServiceOperator::ResolveServiceIdL: ExtractServiceL found.");
+
+ // 2. If there is, search service id
+ ret = SearchServiceIdL(result);
+ }
+ else
+ {
+ LOGSTRING("CEDContactorServiceOperator::ResolveServiceIdL: ExtractServiceL not found.");
+
+ // 3. If not, find out how many services support msisdn ( normal phone number )
+ ret = ResolveMSISDNAddressingSupportedL();
+ if ((TUint32)KErrNotFound != ret)
+ {
+ // 4. If only one, find use that service id
+ // Currently no implementation.
+ LOGSTRING("CEDContactorServiceOperator::ResolveServiceIdL: ResolveMSISDNAddressingSupportedL only one service.");
+
+ }
+ else
+ {
+ // 5. If more than one or none found, do not use service id.
+ // User will be asked to choose among services when call is initiated.
+ // Currently no implementation.
+ LOGSTRING("CEDContactorServiceOperator::ResolveServiceIdL: ResolveMSISDNAddressingSupportedL more than one service.");
+ }
+ }
+
+ LOGSTRING("CEDContactorServiceOperator::ResolveServiceIdL: Done.");
+
+ return ret;
+ }
+
+// --------------------------------------------------------------------------
+// CEDContactorServiceOperator::ExtractServiceL
+// --------------------------------------------------------------------------
+//
+TBool CEDContactorServiceOperator::ExtractServiceL(
+ const TDesC& aFieldData, TPtrC& aXSPId)
+ {
+ LOGSTRING("CEDContactorServiceOperator::ExtractServiceL");
+
+ TBool found = EFalse;
+
+ TInt pos = aFieldData.Find(KColon);
+ if (pos >= 0)
+ {
+ // ok input
+ aXSPId.Set(aFieldData.Left(pos));
+ found = ETrue;
+ }
+
+ LOGSTRING("CEDContactorServiceOperator::ExtractServiceL: Done.");
+
+ return found;
+ }
+
+// --------------------------------------------------------------------------
+// CEDContactorServiceOperator::SearchServiceIdL
+// --------------------------------------------------------------------------
+//
+TUint32 CEDContactorServiceOperator::SearchServiceIdL(const TDesC& aFieldData)
+ {
+ LOGSTRING("CEDContactorServiceOperator::SearchServiceIdL");
+
+ TUint32 ret = (TUint32)KErrNotFound;
+ TInt err = KErrNone;
+ CDesCArrayFlat* nameArray = NULL;
+
+ RIdArray ids;
+ CleanupClosePushL(ids);
+
+ nameArray = new (ELeave) CDesCArrayFlat(2);
+ CleanupStack::PushL(nameArray);
+
+ CSPSettings* settings = CSPSettings::NewLC();
+
+ err = settings->FindServiceIdsL(ids);
+ User::LeaveIfError(err);
+ err = settings->FindServiceNamesL(ids, *nameArray);
+ User::LeaveIfError(err);
+
+ TInt count = nameArray->MdcaCount();
+ for (TInt i(0); i < count; i++)
+ {
+ // search the mathching service name
+ TPtrC p = nameArray->MdcaPoint(i);
+ if (!p.CompareF(aFieldData))
+ {
+ // Service found
+ ret = ids[i];
+
+ LOGSTRING("CEDContactorServiceOperator::SearchServiceIdL: Service found.");
+ break;
+ }
+ }
+ CleanupStack::PopAndDestroy( settings );
+ CleanupStack::PopAndDestroy( nameArray );
+ CleanupStack::PopAndDestroy( &ids );
+
+ LOGSTRING("CEDContactorServiceOperator::SearchServiceIdL: Done.");
+
+ return ret;
+ }
+
+// --------------------------------------------------------------------------
+// CEDContactorServiceOperator::ResolveMSISDNAddressingSupportedL
+// --------------------------------------------------------------------------
+//
+TUint32 CEDContactorServiceOperator::ResolveMSISDNAddressingSupportedL()
+ {
+ LOGSTRING("CEDContactorServiceOperator::ResolveMSISDNAddressingSupportedL");
+
+ /*
+ * LOGIC:
+ * -Find out services that support calling normal mobile/telephone numbers
+ * -If only 1 service, return the serviceid
+ * -If services are more than 1, then do not use serviceid.
+ */
+
+ TInt err = KErrNone;
+ TInt foundNo = 0;
+ TUint32 ret = (TUint32)KErrNotFound;
+
+ RIdArray ids;
+ CleanupClosePushL(ids);
+
+ CSPSettings* settings = CSPSettings::NewLC();
+
+ err = settings->FindServiceIdsL(ids);
+ User::LeaveIfError(err);
+
+ CSPProperty* property = CSPProperty::NewLC();
+
+ TInt count = ids.Count();
+ for (TInt i(0); i < count; i++)
+ {
+ // Find out property
+ err = settings->FindPropertyL(ids[i],
+ EPropertyServiceAttributeMask, *property);
+
+ // If service have property
+ if (KErrNone == err)
+ {
+ // read the value of mask property
+ TInt mask = 0;
+ err = property->GetValue(mask);
+ if (KErrNone == err)
+ {
+ if ((mask & ESupportsMSISDNAddressing) &&
+ (mask & ESupportsInternetCall))
+ {
+ // Found one.
+ ret = ids[i];
+ foundNo++;
+
+ }// if mask
+ }// if err
+ }// if err
+
+ }// for
+
+ // If more than 1 service, do not use serviceid
+
+ if (1 < foundNo)
+ {
+ ret = (TUint32)KErrNotFound;
+ }
+
+ CleanupStack::PopAndDestroy( property );
+ CleanupStack::PopAndDestroy( settings );
+ CleanupStack::PopAndDestroy( &ids );
+
+ LOGSTRING("CEDContactorServiceOperator::ResolveMSISDNAddressingSupportedL: Done.");
+ return ret;
+ }
+
+// --------------------------------------------------------------------------
+// CEDContactorServiceOperator::LaunchCommunicationMethodL
+// --------------------------------------------------------------------------
+//
+void CEDContactorServiceOperator::LaunchCommunicationMethodL(
+ const TDesC& aFieldData)
+ {
+ LOGSTRING("CEDContactorServiceOperator::LaunchCommunicationMethodL");
+
+ __ASSERT_ALWAYS (NULL != &iParameter->iFullName, User::Leave (KErrArgument));
+ __ASSERT_ALWAYS (0 < iParameter->iFullName.Size(), User::Leave (KErrArgument));
+
+
+ TBool forcedService( EFalse );
+
+ // Check forced service flag
+ if (CEDContactorService::TCSParameter::EForcedService &
+ iParameter->iControlFlag)
+ {
+ forcedService = ETrue;
+ }
+
+ // If serviceid found, use it.
+ if ((TUint32)KErrNotFound != iServiceId)
+ {
+ LOGSTRING("CEDContactorServiceOperator::ExecuteL: ExecuteServiceL with serviceid");
+ CEDContactor::ExecuteServiceL(
+ iParameter->iCommTypeSelector,
+ aFieldData,
+ iParameter->iFullName,
+ forcedService,
+ iServiceId);
+ }
+ else
+ {
+ LOGSTRING("CEDContactorServiceOperator::ExecuteL: ExecuteServiceL without serviceid");
+ CEDContactor::ExecuteServiceL(
+ iParameter->iCommTypeSelector,
+ aFieldData,
+ iParameter->iFullName,
+ forcedService);
+ }
+
+ LOGSTRING("CEDContactorServiceOperator::LaunchCommunicationMethodL: Done.");
+ }
+
+// --------------------------------------------------------------------------
+// CEDContactorServiceOperator::CommunicationEnumMapper
+// --------------------------------------------------------------------------
+//
+TAiwCommAddressSelectType CEDContactorServiceOperator::CommunicationEnumMapper(
+ VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aCommTypeSelector)
+ {
+ LOGSTRING("CEDContactorServiceOperator::CommunicationEnumMapper");
+
+ TAiwCommAddressSelectType type;
+
+ switch(aCommTypeSelector)
+ {
+ case VPbkFieldTypeSelectorFactory::EEmptySelector:
+ type = EAiwCommEmpty;
+ break;
+
+ case VPbkFieldTypeSelectorFactory::EVoiceCallSelector:
+ type = EAiwCommVoiceCall;
+ break;
+
+ case VPbkFieldTypeSelectorFactory::EUniEditorSelector:
+ type = EAiwCommUniEditor;
+ break;
+
+ case VPbkFieldTypeSelectorFactory::EEmailEditorSelector:
+ type = EAiwCommEmailEditor;
+ break;
+
+ case VPbkFieldTypeSelectorFactory::EInstantMessagingSelector:
+ type = EAiwCommInstantMessaging;
+ break;
+
+ case VPbkFieldTypeSelectorFactory::EVOIPCallSelector:
+ type = EAiwCommVOIPCall;
+ break;
+
+ case VPbkFieldTypeSelectorFactory::EVideoCallSelector:
+ type = EAiwCommVideoCall;
+ break;
+
+ default:
+ LOGSTRING("CEDContactorServiceOperator::CommunicationEnumMapper: default -> Empty mapped.");
+ type = EAiwCommEmpty;
+ break;
+ }
+
+ LOGSTRING("CEDContactorServiceOperator::CommunicationEnumMapper: Done.");
+
+ return type;
+ }
+
+// End of file