contacts_plat/phonebook_2_contact_related_icon_customization_api/tsrc/src/CIconCustomApiTestModuleBlocks.cpp
branchRCL_3
changeset 6 e8e3147d53eb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contacts_plat/phonebook_2_contact_related_icon_customization_api/tsrc/src/CIconCustomApiTestModuleBlocks.cpp	Mon Mar 15 12:39:26 2010 +0200
@@ -0,0 +1,516 @@
+/*
+* Copyright (c) 2008-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 FILES
+
+#include <ecom\ecom.h>
+#include <e32property.h>
+#include <e32cmn.h>
+
+#include <StifParser.h>
+#include <StifTestInterface.h>
+
+#include <CContactCustomIconPluginBase.h>
+#include <CCustomIconIdMap.h>
+#include <CCustomIconDecisionData.h>
+
+#include "CIconCustomApiTestModule.h"
+
+_LIT( KTestPluginDisplayName, "Custom Icon test plugin" );
+
+
+const TInt KExecutableUidIndex = 0;
+
+// -----------------------------------------------------------------------------
+// CleanUpEComInfoArray
+// CleanupStack support for RImplInfoPtrArray.
+// See LoadTestPluginL how it is used
+// -----------------------------------------------------------------------------
+//
+LOCAL_C void CleanUpEComInfoArray( TAny* aInfoArray )
+    {
+    RImplInfoPtrArray* infoArray = (static_cast<RImplInfoPtrArray*>(aInfoArray));
+    infoArray->ResetAndDestroy();
+    infoArray->Close();
+    }
+
+// ----------------------------------------------------------------------------
+// ProcessSID
+// Figure out current process SID (this should be STIFF SID)
+// ----------------------------------------------------------------------------
+//
+LOCAL_C TUid ProcessSID()
+    {
+    RProcess process;
+    TUidType type = process.Type();
+    // current process SID (STIFF executable SID = 0x1000007A)
+    TUid uid = type[KExecutableUidIndex];
+    return uid;
+    }
+
+// -----------------------------------------------------------------------------
+// BuildDecisionDataLC
+// Utility to build decision data object.
+// See LoadTestPluginL how it is used
+// -----------------------------------------------------------------------------
+//
+LOCAL_C CCustomIconDecisionData* BuildDecisionDataLC(  CStifItemParser& aItem )
+    {
+    CCustomIconDecisionData* decisionData =
+        new ( ELeave ) CCustomIconDecisionData();
+    CleanupStack::PushL( decisionData );
+
+    TUid contextParam = ProcessSID();
+
+    TTime* time = new (ELeave) TTime;
+    decisionData->SetTime( time ); // ownership taken
+    time->UniversalTime();
+
+    TPtrC phoneNumber;
+    aItem.GetNextString( phoneNumber );
+    decisionData->SetPhoneNumberL( phoneNumber );
+
+    decisionData->SetContactLinkRef( NULL );
+    decisionData->SetContext( contextParam );
+
+    return decisionData;
+    }
+
+
+// ----------------------------------------------------------------------------
+// ReplaceIconL
+// Find an icon and replace it
+// ----------------------------------------------------------------------------
+//
+LOCAL_C void ReplaceIconL( CCustomIconIdMap* aIcons,
+    CGulIcon* aIcon, TCustomIconId aIconId )
+    {
+    TInt i;
+    TInt count = aIcons->Count();
+    TInt err( KErrNotFound );
+    for( i=0; i<count; i++ )
+        {
+        TCustomIconIdMapItem& item( (*aIcons)[i] );
+        if( item.iId == aIconId )
+            {
+            // Change the icon
+            delete item.iIconPtr;
+            item.iIconPtr = aIcon;
+            err = KErrNone;
+            break;
+            }
+        }
+    User::LeaveIfError( err );
+    }
+
+
+// ============================ MEMBER FUNCTIONS ==============================
+
+// ----------------------------------------------------------------------------
+// CIconCustomApiTestModule::CleanupPsKeys
+// Remove all key definitions and/or values, which have been
+// defined/set by this test module.
+// ----------------------------------------------------------------------------
+//
+void CIconCustomApiTestModule::CleanupPsKeys()
+    {
+    TInt count = iPublishedPsKeys.Count();
+    TInt i;
+    TUid sid = ProcessSID();
+    for( i=0; i<count; i++ )
+        {
+        // Ignore return value, because key may not exist
+        RProperty::Delete( sid, iPublishedPsKeys[i] );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIconCustomApiTestModule::RunMethodL
+// Run specified method. Contains also table of test methods and their names.
+// ----------------------------------------------------------------------------
+//
+TInt CIconCustomApiTestModule::RunMethodL(
+    CStifItemParser& aItem )
+    {
+
+    static TStifFunctionInfo const KFunctions[] =
+        {
+        ENTRY( "LoadTestPluginL", CIconCustomApiTestModule::LoadTestPluginL ),
+        ENTRY( "LoadIconsL", CIconCustomApiTestModule::LoadIconsL ),
+        ENTRY( "LoadIconL", CIconCustomApiTestModule::LoadIconL ),
+        ENTRY( "UpdateIconsWithLastIconIdsL", CIconCustomApiTestModule::UpdateIconsWithLastIconIdsL ),
+        ENTRY( "DeleteIconsL", CIconCustomApiTestModule::DeleteIconsL ),
+        ENTRY( "DeleteIconL", CIconCustomApiTestModule::DeleteIconL ),
+        ENTRY( "IconChoiceL", CIconCustomApiTestModule::IconChoiceL ),
+        ENTRY( "SetPsProperty", CIconCustomApiTestModule::SetPsProperty ),
+        ENTRY( "DeletePsProperty", CIconCustomApiTestModule::DeletePsProperty ),
+        ENTRY( "SetTestCaseAsObserverL", CIconCustomApiTestModule::SetTestCaseAsObserverL ),
+        ENTRY( "CheckIfHasExtensionL", CIconCustomApiTestModule::CheckIfHasExtensionL ),
+        };
+
+    const TInt count = sizeof( KFunctions ) /
+                        sizeof( TStifFunctionInfo );
+
+    return RunInternalL( KFunctions, count, aItem );
+    }
+
+// ----------------------------------------------------------------------------
+// CIconCustomApiTestModule::CustomIconsChangedL
+// Notification handler, called by plugin.
+// ----------------------------------------------------------------------------
+//
+void CIconCustomApiTestModule::CustomIconEvent(
+            CContactCustomIconPluginBase& /*aPlugin*/,
+            TEventType aEventType,
+            const TArray<TCustomIconId>& aIconIds)
+    {
+    iLastEventType = aEventType;
+    TInt signalCode( aEventType );
+
+    TRAPD( err,
+        iLastIconIds.Reset();
+        TInt i;
+        TInt count = aIconIds.Count();
+        for( i=0; i<count; i++ )
+            {
+            iLastIconIds.AppendL( aIconIds[i] );
+            }
+        );
+    if( err )
+        {
+        signalCode = err;
+        }
+    Signal( signalCode );
+    }
+
+
+// ----------------------------------------------------------------------------
+// CIconCustomApiTestModule::LoadTestPluginL
+// ----------------------------------------------------------------------------
+//
+TInt CIconCustomApiTestModule::LoadTestPluginL( CStifItemParser& /*aItem*/ )
+    {
+    if( iTestPlugin )
+        {
+        return KErrAlreadyExists;
+        }
+
+    CContactCustomIconPluginBase* result = NULL;
+
+    RImplInfoPtrArray implementationInfoArray;
+    TCleanupItem cleanup( CleanUpEComInfoArray, &implementationInfoArray );
+    CleanupStack::PushL( cleanup );
+
+    TUid uid( KContactIconCustomizationInterfaceUid );
+
+    REComSession::ListImplementationsL( uid,
+        implementationInfoArray );
+
+    TInt count = implementationInfoArray.Count();
+
+    for( TInt i=0; i<count; i++)
+        {
+        CImplementationInformation* info = implementationInfoArray[i];
+        if( !(info->DisplayName().Compare( KTestPluginDisplayName ) == 0) )
+            {
+            continue;
+            }
+        // Test plugin was found. Try to load it.
+        TUid pluginUid = info->ImplementationUid();
+        TRAPD( err, result = static_cast<CContactCustomIconPluginBase*>
+            (REComSession::CreateImplementationL(pluginUid,
+                                            _FOFF(CContactCustomIconPluginBase,
+                                            iDtorKey)));
+            );
+        if( err )
+            {
+            result = NULL;
+            }
+        break;
+        }
+
+    CleanupStack::PopAndDestroy(&implementationInfoArray);
+
+    iTestPlugin = result;
+
+    if( !iTestPlugin )
+        {
+        return KErrNotFound;
+        }
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CIconCustomApiTestModule::LoadIconsL
+// Load icon array
+// ----------------------------------------------------------------------------
+//
+TInt CIconCustomApiTestModule::LoadIconsL( CStifItemParser& aItem )
+    {
+    User::LeaveIfNull( iTestPlugin );
+    if( iIcons )
+        {
+        User::Leave( KErrAlreadyExists );
+        }
+
+    TInt sizeHint( 0 );
+    aItem.GetNextInt( sizeHint );
+    iIcons = iTestPlugin->IconsL(
+        ProcessSID(), // use SID as context parameter
+        (CContactCustomIconPluginBase::TIconSizeHint)sizeHint );
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CIconCustomApiTestModule::LoadIconL
+// Load individual icon
+// ----------------------------------------------------------------------------
+//
+TInt CIconCustomApiTestModule::LoadIconL( CStifItemParser& aItem )
+    {
+    User::LeaveIfNull( iTestPlugin );
+    if( iIcon )
+        {
+        User::Leave( KErrAlreadyExists );
+        }
+    TInt sizeHint( 0 );
+    aItem.GetNextInt( sizeHint );
+
+    CCustomIconDecisionData* decisionData = BuildDecisionDataLC( aItem );
+
+    iIcon = iTestPlugin->IconL( *decisionData,
+        (CContactCustomIconPluginBase::TIconSizeHint)sizeHint );
+
+    CleanupStack::PopAndDestroy( decisionData );
+    return KErrNone;
+
+    }
+
+// ----------------------------------------------------------------------------
+// CIconCustomApiTestModule::UpdateIconsWithLastIconIdsL
+// Replace current icons with new ones
+// ----------------------------------------------------------------------------
+//
+TInt CIconCustomApiTestModule::UpdateIconsWithLastIconIdsL(
+    CStifItemParser& aItem )
+    {
+    User::LeaveIfNull( iTestPlugin );
+    if( !iIcons )
+        {
+        User::Leave( KErrNotFound );
+        }
+    TInt sizeHint( 0 );
+    aItem.GetNextInt( sizeHint );
+
+    TInt i;
+    TInt count = iLastIconIds.Count();
+    CGulIcon* icon;
+    TCustomIconId iconId;
+    TUid contextParam = ProcessSID(); // use process SID as context parameter
+    for( i=0; i<count; i++ )
+        {
+        iconId = iLastIconIds[i];
+        icon = iTestPlugin->IconL( contextParam,
+            iconId,
+            (CContactCustomIconPluginBase::TIconSizeHint)sizeHint );
+        CleanupStack::PushL( icon );
+        ReplaceIconL( iIcons, icon, iconId ); // Takes ownership
+        CleanupStack::Pop( icon );
+        }
+
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CIconCustomApiTestModule::DeleteIconsL
+// Delete icon array
+// ----------------------------------------------------------------------------
+//
+TInt CIconCustomApiTestModule::DeleteIconsL( CStifItemParser& /*aItem*/ )
+    {
+    if( !iIcons )
+        {
+        User::Leave( KErrNotFound );
+        }
+    delete iIcons;
+    iIcons = NULL;
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CIconCustomApiTestModule::DeleteIconL
+// Delete individual icon instance
+// ----------------------------------------------------------------------------
+//
+TInt CIconCustomApiTestModule::DeleteIconL( CStifItemParser& /*aItem*/ )
+    {
+    if( !iIcon )
+        {
+        User::Leave( KErrNotFound );
+        }
+    delete iIcon;
+    iIcon = NULL;
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CIconCustomApiTestModule::IconChoiceL
+// Query plug-in for a icon choice to the previously given icon array
+// Expect plug-in to provide a icon or otherwise fail
+// ----------------------------------------------------------------------------
+//
+TInt CIconCustomApiTestModule::IconChoiceL( CStifItemParser& aItem )
+    {
+    User::LeaveIfNull( iTestPlugin );
+    User::LeaveIfNull( iIcons );
+
+    CCustomIconDecisionData* decisionData = BuildDecisionDataLC( aItem );
+
+    TInt iconId( 0 );
+    TBool iconFound = iTestPlugin->IconChoiceL( *decisionData, iconId );
+    if( iconFound )
+        {
+        // Plug-in gave us an icon identifier. Now check if we have the
+        // corresponding icon.
+        CGulIcon* icon = NULL;
+        TCustomIconIdMapItem item;
+        for( TInt i=0; i<iIcons->Count(); i++ )
+            {
+            item = iIcons->At( i );
+            if( item.iId == iconId )
+                {
+                icon = item.iIconPtr; // may return NULL
+                break;
+                }
+            }
+        if( !icon )
+            {
+            // icon in the icon array was NULL, or
+            // icon was not found by given icon identifier
+            //
+            User::Leave( KErrNotFound );
+            }
+        }
+    else
+        {
+        User::Leave( KErrNotFound );
+        }
+    CleanupStack::PopAndDestroy( decisionData );
+    return KErrNone;
+    }
+
+// ----------------------------------------------------------------------------
+// CIconCustomApiTestModule::SetPsProperty
+// Define and set publish/subscribe property. This is used for configuring
+// testing environment. For example the test plug-in reads the P/S values
+// on its initialization phase.
+// ----------------------------------------------------------------------------
+//
+TInt CIconCustomApiTestModule::SetPsProperty( CStifItemParser& aItem )
+    {
+    TInt key;
+    TInt value;
+    aItem.GetNextInt( key );
+    aItem.GetNextInt( value );
+    TSecurityPolicy readwritePolicy( TSecurityPolicy::EAlwaysPass );
+
+    TUid sid = ProcessSID();
+    TInt err = RProperty::Define(
+        sid,
+        key,
+        RProperty::EInt,
+        readwritePolicy,
+        readwritePolicy );
+
+    if(err == KErrNone || err == KErrAlreadyExists)
+        {
+        iPublishedPsKeys.Append( key );
+        err = RProperty::Set( sid, key, value );
+        }
+    return err;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CIconCustomApiTestModule::DeletePsProperty
+//
+// -----------------------------------------------------------------------------
+//
+TInt CIconCustomApiTestModule::DeletePsProperty( CStifItemParser& aItem )
+    {
+    TInt key;
+    aItem.GetNextInt( key );
+    TInt err = RProperty::Delete( ProcessSID(), key );
+    if( !err )
+        {
+        TInt index = iPublishedPsKeys.Find ( key );
+        if( index >= 0 )
+            {
+            iPublishedPsKeys.Remove( index );
+            }
+        }
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// CIconCustomApiTestModule::SetTestCaseAsObserver
+//
+// -----------------------------------------------------------------------------
+//
+TInt CIconCustomApiTestModule::SetTestCaseAsObserverL( CStifItemParser& aItem )
+    {
+    TBool setAsObserver;
+    aItem.GetNextInt( setAsObserver );
+    if( setAsObserver )
+        {
+        iTestPlugin->AddObserverL( this );
+        }
+    else
+        {
+        iTestPlugin->RemoveObserver( this );
+        }
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CIconCustomApiTestModule::CheckIfHasExtensionL
+//
+// -----------------------------------------------------------------------------
+//
+TInt CIconCustomApiTestModule::CheckIfHasExtensionL( CStifItemParser& aItem )
+    {
+    TInt extensionUid;
+    TBool expectedResult;
+    User::LeaveIfError( aItem.GetNextInt( extensionUid ) );
+    User::LeaveIfError( aItem.GetNextInt( expectedResult ) );
+    TAny* extension =
+        iTestPlugin->ContactCustomIconExtension( TUid::Uid( extensionUid ) );
+    delete extension;
+    if( expectedResult && extension ||
+        !expectedResult && !extension )
+        {
+        return KErrNone;
+        }
+    else
+        {
+        return KErrGeneral;
+        }
+    }
+
+
+
+
+//  End of File