phonebookengines/VirtualPhonebook/VPbkEng/src/VPbkFieldTypeSelectorFactory.cpp
branchRCL_3
changeset 63 f4a778e096c2
child 64 c1e8ba0c2b16
child 68 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/VPbkEng/src/VPbkFieldTypeSelectorFactory.cpp	Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,421 @@
+/*
+* Copyright (c) 2002-2007 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:  Selector factory for a set of predefined selectors.
+*
+*/
+
+
+// Virtual Phonebook
+#include "VPbkFieldTypeSelectorFactory.h"
+#include "CVPbkFieldTypeList.h"
+
+#include <VPbkDataCaging.hrh>
+#include <CVPbkFieldTypeSelector.h>
+#include <MVPbkFieldType.h>
+#include <CVPbkLocalVariationManager.h>
+#include <VPbkFieldTypeSelectors.rsg>
+#include <RLocalizedResourceFile.h>
+#include <featmgr.h>
+#include <VPbkEng.rsg>
+#include <spsettings.h>
+#include <spproperty.h>
+#include <spentry.h>
+
+// System includes
+#include <f32file.h>
+#include <barsread.h>
+
+namespace {
+
+struct TMap
+    {
+    TInt iType;
+    TInt iResId;
+    };
+
+const TMap KFieldMapTable[] = {
+    { VPbkFieldTypeSelectorFactory::EPhoneNumberSelector, R_VPBK_PHONE_NUMBER_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::EMobileNumberSelector, R_VPBK_MOBILE_NUMBER_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::EFaxNumberSelector, R_VPBK_FAX_NUMBER_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::EVideoNumberSelector, R_VPBK_VIDEO_NUMBER_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::EPagerNumberSelector, R_VPBK_PAGER_NUMBER_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::EEmailAddressSelector, R_VPBK_EMAIL_ADDRESS_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::EEmailOverSmsSelector, R_VPBK_EMAIL_OVER_SMS_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::EMmsAddressSelector, R_VPBK_MMS_ADDRESS_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::EVoipAddressSelector, R_VPBK_VOIP_ADDRESS_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::EPttAddressSelector, R_VPBK_PTT_ADDRESS_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::ESipAddressSelector, R_VPBK_SIP_ADDRESS_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::ESipMsisdnAddressSelector, R_VPBK_SIP_MSISDN_ADDRESS_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::EThumbnailImageSelector, R_VPBK_THUMBNAIL_IMAGE_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::ECodImageSelector, R_VPBK_COD_IMAGE_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::EImageSelector, R_VPBK_IMAGE_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::ECodTextSelector, R_VPBK_COD_TEXT_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::ERingingToneSelector, R_VPBK_RINGING_TONE_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::EUrlAddressSelector, R_VPBK_URL_ADDRESS_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::ELastNameSelector, R_VPBK_LAST_NAME_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::EFirstNameSelector, R_VPBK_FIRST_NAME_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::ELastNamePronunciationSelector, R_VPBK_LAST_NAME_PRONUNCIATION_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::EFirstNamePronunciationSelector, R_VPBK_FIRST_NAME_PRONUNCIATION_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::ESynchronizationSelector, R_VPBK_SYNCHRONIZATION_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::EDtmfNumberSelector, R_VPBK_DTMF_NUMBER_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::ETopcontactSelector, R_VPBK_TOPCONTACT_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::EImppSelector, R_VPBK_IMPP_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::EFindOnMapSelector, R_VPBK_ADDRESS_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::EAssignFromMapSelector, R_VPBK_ADDRESS_SELECTOR },
+    { VPbkFieldTypeSelectorFactory::EPagerfaxSelector, R_VPBK_PAGERFAX_SELECTOR }
+    // add more selectors here
+};
+const TInt KFieldMapTableLength = sizeof( KFieldMapTable ) / sizeof( TMap );
+
+/**
+ * Maps selector iType and ressource id.
+ *
+ * @param aType Id of the predefined selector.
+ * @return A matching ressource id or KErrNotFound.
+ */
+TInt MapFieldTypeSelectorToRessourceId(
+        VPbkFieldTypeSelectorFactory::TVPbkFieldTypeSelector aType )
+    {
+    for( TInt i = 0; i < KFieldMapTableLength; ++i )
+        {
+        if( aType == KFieldMapTable[i].iType )
+            {
+            return KFieldMapTable[i].iResId;
+            }
+        }
+
+    return KErrNotFound;
+    }
+
+// --------------------------------------------------------------------------
+//
+// --------------------------------------------------------------------------
+//
+void FillL(RArray<TInt>& aArray, const TInt* aTable, const TInt aSize)
+    {
+    for (TInt i = 0; i < aSize; ++i)
+        {
+        if (aArray.Find(aTable[i]) == KErrNotFound)
+            {
+            // allows to add only once
+            aArray.AppendL(aTable[i]);
+            }
+        }
+    }
+
+/**
+ * Voip tables extracted from code to clear implementation logic.
+ */
+namespace VoipTables {
+    const TInt KVoipEnabledFieldSelectors[] = {
+                    R_VPBK_VOIP_ADDRESS_SELECTOR,
+                    R_VPBK_PTT_ADDRESS_SELECTOR,
+                    R_VPBK_SIP_ADDRESS_SELECTOR
+                    };
+    const TInt KVoipEnabledFieldSelectorsSize =
+        sizeof(KVoipEnabledFieldSelectors) / sizeof(TInt);
+
+    const TInt KVoipCallOutFieldSelectors[] = {
+                    R_VPBK_VOIP_CALL_OUT_SELECTOR
+                    };
+    const TInt KVoipCallOutFieldSelectorsSize =
+        sizeof(KVoipCallOutFieldSelectors) / sizeof(TInt);
+
+    const TInt KVoipXspProviderSupportsVoipSelectors[] = {
+            R_VPBK_IMPP_SELECTOR
+            };
+    const TInt KVoipXspProviderSupportsVoipSelectorsSize =
+        sizeof(KVoipXspProviderSupportsVoipSelectors) / sizeof(TInt);
+}
+
+// --------------------------------------------------------------------------
+//
+// --------------------------------------------------------------------------
+//
+const CSPProperty* GetProperty(const CSPEntry& aEntry, TServicePropertyName mask)
+    {
+    const CSPProperty* result = NULL;
+    if (aEntry.GetProperty(result, mask) == KErrNone)
+        {
+        return result;
+        }
+    return result;
+    }
+
+// --------------------------------------------------------------------------
+//
+// --------------------------------------------------------------------------
+//
+TInt GetIntValue(const CSPProperty* aProperty)
+    {
+    TInt value = 0;
+    if (aProperty && aProperty->GetValue(value) == KErrNone)
+        {
+        return value;
+        }
+    return 0;
+    }
+
+// --------------------------------------------------------------------------
+//
+// --------------------------------------------------------------------------
+//
+void VoipSelectorsL(RArray<TInt>& aArray)
+    {
+    // Special Voip checker, which selectors can be included in which case
+    RIdArray idArray;
+    CleanupClosePushL(idArray);
+
+    CSPSettings* settings = CSPSettings::NewLC();
+    User::LeaveIfError( settings->FindServiceIdsL(idArray) );
+    for (TInt i = 0; i < idArray.Count(); ++i)
+        {
+        CSPEntry* entry = CSPEntry::NewLC();
+        TServiceId id = idArray[i];
+        User::LeaveIfError( settings->FindEntryL(id, *entry) );
+        // service is an xsp service
+        const CSPProperty* tmpProp = GetProperty(*entry, EPropertyServiceAttributeMask);
+        TInt value = GetIntValue(tmpProp);
+        if (value & ESupportsInternetCall)
+            {
+            // supports voip
+            FillL(aArray, VoipTables::KVoipEnabledFieldSelectors,
+                    VoipTables::KVoipEnabledFieldSelectorsSize);
+            // include xsp fields
+            FillL(aArray, VoipTables::KVoipXspProviderSupportsVoipSelectors,
+                    VoipTables::KVoipXspProviderSupportsVoipSelectorsSize);
+            }
+        CleanupStack::PopAndDestroy(); // entry
+        }
+
+    if (settings->IsFeatureSupported(ESupportCallOutFeature))
+        {
+        // supports call out, add call out field types
+        FillL(aArray, VoipTables::KVoipCallOutFieldSelectors,
+                VoipTables::KVoipCallOutFieldSelectorsSize);
+        }
+
+    CleanupStack::PopAndDestroy(2); // settings, idArray
+    }
+
+// --------------------------------------------------------------------------
+//
+// --------------------------------------------------------------------------
+//
+RArray<TInt> FilteredSelectorsL(
+        VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aType)
+    {
+    RArray<TInt> result;
+    CleanupClosePushL(result);
+    switch (aType)
+        {
+        case VPbkFieldTypeSelectorFactory::EVoiceCallSelector:
+            {
+            result.AppendL(R_VPBK_VOICE_CALL_ACTION_SELECTOR);
+            break;
+            }
+        case VPbkFieldTypeSelectorFactory::EUniEditorSelector:
+            {
+            CVPbkLocalVariationManager* localVariation =
+                CVPbkLocalVariationManager::NewL();
+            CleanupStack::PushL(localVariation);
+            
+            if ( localVariation->LocallyVariatedFeatureEnabled(
+                        EVPbkLVShowEmailInSendMsg ) )
+            {
+                result.AppendL(R_VPBK_UNIEDITOR_EMAIL_ACTION_SELECTOR);
+            }
+            else
+            {
+                result.AppendL(R_VPBK_UNIEDITOR_ACTION_SELECTOR);
+            }
+            CleanupStack::PopAndDestroy(localVariation);
+            break;
+            }
+        case VPbkFieldTypeSelectorFactory::EEmailEditorSelector:
+            {
+            result.AppendL(R_VPBK_EMAIL_ADDRESS_SELECTOR);
+            break;
+            }
+        case VPbkFieldTypeSelectorFactory::EInstantMessagingSelector:
+            {
+            result.AppendL(R_VPBK_IMPP_SELECTOR);
+            break;
+            }
+        case VPbkFieldTypeSelectorFactory::EVOIPCallSelector:
+            {
+            VoipSelectorsL(result);
+            break;
+            }
+        case VPbkFieldTypeSelectorFactory::EURLSelector:
+            {
+            result.AppendL(R_VPBK_URL_ADDRESS_SELECTOR);
+            break;
+            }
+        case VPbkFieldTypeSelectorFactory::EVideoCallSelector:
+            {
+            result.AppendL(R_VPBK_VIDEO_NUMBER_SELECTOR);
+            result.AppendL(R_VPBK_MOBILE_NUMBER_SELECTOR);
+            break;
+            }
+        case VPbkFieldTypeSelectorFactory::EFindOnMapSelector:
+        case VPbkFieldTypeSelectorFactory::EAssignFromMapSelector:
+            {
+            result.AppendL(R_VPBK_ADDRESS_SELECTOR);
+            break;
+            }
+        }
+
+    CleanupStack::Pop(); // result
+    return result;
+    }
+
+// --------------------------------------------------------------------------
+//
+// --------------------------------------------------------------------------
+//
+TResourceReader CreateSelectorResourceReaderLC(TInt aResourceId, RFs& aFs)
+    {
+    //Read resource file
+    VPbkEngUtils::RLocalizedResourceFile resFile;
+    resFile.OpenLC( aFs, KVPbkRomFileDrive,
+                    KDC_RESOURCE_FILES_DIR,
+                    KVPbkFieldTypeSelectorsResFileName );
+    TResourceReader resReader;
+    HBufC8* selectorBuf = resFile.AllocReadLC( aResourceId );
+    resReader.SetBuffer( selectorBuf );
+    CleanupStack::Pop(); // selectorBuf
+    CleanupStack::PopAndDestroy(); // resFile
+    CleanupStack::PushL(selectorBuf);
+    return resReader;
+    }
+
+/**
+ * Appends a filter for the given field iType selector.
+ *
+ * @param aRessourceId Selector ressource Id.
+ * @param aFieldTypeList Field iType list used to search
+ *                       for the field.
+ * @return A new instance of CVPbkFieldTypeSelector
+ */
+CVPbkFieldTypeSelector* CreateSelectorL(
+                TInt aRessourceId, RFs& aFs, const MVPbkFieldTypeList& aFieldTypeList )
+    {
+    TResourceReader resourceReader = CreateSelectorResourceReaderLC(aRessourceId, aFs);
+
+    //create and return CVPbkFieldTypeSelector
+    CVPbkFieldTypeSelector* returnPtr =  CVPbkFieldTypeSelector::NewL(
+            resourceReader, aFieldTypeList );
+
+    //Cleanup
+    CleanupStack::PopAndDestroy(); // resourReader
+
+    return returnPtr;
+    }
+
+} // namespace
+
+// --------------------------------------------------------------------------
+// VPbkFieldTypeSelectorFactory::BuildFieldTypeSelectorL
+// --------------------------------------------------------------------------
+//
+EXPORT_C CVPbkFieldTypeSelector*
+                VPbkFieldTypeSelectorFactory::BuildFieldTypeSelectorL(
+                TVPbkFieldTypeSelector aType,
+                const MVPbkFieldTypeList& aFieldTypeList)
+    {
+    //Connect fileserver
+    RFs fSrv;
+    User::LeaveIfError( fSrv.Connect() );
+    CleanupClosePushL( fSrv );
+
+    //Map iType to resource
+    TInt resourceId = MapFieldTypeSelectorToRessourceId( aType );
+
+    // leave if no appropriate resource id has not been found
+    User::LeaveIfError(resourceId);
+    CVPbkFieldTypeSelector* result = CreateSelectorL( resourceId, fSrv, aFieldTypeList );
+    CleanupStack::PopAndDestroy(); // fSrv
+    return result;
+    }
+
+// --------------------------------------------------------------------------
+// VPbkFieldTypeSelectorFactory::BuildContactActionTypeSelectorL
+// --------------------------------------------------------------------------
+//
+EXPORT_C CVPbkFieldTypeSelector*
+                VPbkFieldTypeSelectorFactory::BuildContactActionTypeSelectorL(
+                TVPbkContactActionTypeSelector aType,
+                const MVPbkFieldTypeList& aFieldTypeList )
+    {
+    //Connect fileserver
+    RFs fSrv;
+    User::LeaveIfError( fSrv.Connect() );
+    CleanupClosePushL( fSrv );
+
+    RArray<TInt> fieldTypeSelectors = FilteredSelectorsL(aType);
+    CleanupClosePushL(fieldTypeSelectors);
+
+    CVPbkFieldTypeSelector* result = CVPbkFieldTypeSelector::NewL(aFieldTypeList);
+    CleanupStack::PushL(result);
+    result->SetContactActionType(aType);
+    for (TInt i = 0; i < fieldTypeSelectors.Count(); ++i)
+        {
+        TInt resourceId = fieldTypeSelectors[i];
+        if (resourceId != KErrNotFound)
+            {
+            TResourceReader reader = CreateSelectorResourceReaderLC(resourceId, fSrv);
+            result->AppendL(reader);
+            CleanupStack::PopAndDestroy(); // reader
+            }
+        }
+
+    CleanupStack::Pop(); // result
+    CleanupStack::PopAndDestroy(2); // fieldTypeSelectors, fSrv
+    return result;
+    }
+
+// --------------------------------------------------------------------------
+// VPbkFieldTypeSelectorFactory::CreateActionTypeSelectorIdL
+// --------------------------------------------------------------------------
+//
+EXPORT_C VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector
+       VPbkFieldTypeSelectorFactory::CreateActionTypeSelectorIdL( const TInt aID )
+    {
+    if(
+        aID == VPbkFieldTypeSelectorFactory::EEmptySelector ||
+        aID == VPbkFieldTypeSelectorFactory::EVoiceCallSelector ||
+        aID == VPbkFieldTypeSelectorFactory::EUniEditorSelector ||
+        aID == VPbkFieldTypeSelectorFactory::EEmailEditorSelector ||
+        aID == VPbkFieldTypeSelectorFactory::EInstantMessagingSelector ||
+        aID == VPbkFieldTypeSelectorFactory::EVOIPCallSelector ||
+        aID == VPbkFieldTypeSelectorFactory::EURLSelector ||
+        aID == VPbkFieldTypeSelectorFactory::EVideoCallSelector ||
+        aID == VPbkFieldTypeSelectorFactory::EFindOnMapSelector ||
+        aID == VPbkFieldTypeSelectorFactory::EAssignFromMapSelector ||
+        aID == VPbkFieldTypeSelectorFactory::EPocSelector
+       )
+        {
+        return (VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector)aID;
+        }
+    else
+        {
+        User::Leave( KErrNotFound );
+
+        // sloc - Stupid Line Of Code : but compiler expects
+        return VPbkFieldTypeSelectorFactory::EPocSelector;
+        }
+    }
+
+// End of file