voiceui/aiwpbkinfoviewprovider/src/aiwpbkinfoviewprovider.cpp
branchRCL_3
changeset 19 e36f3802f733
parent 0 bf1d17376201
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/voiceui/aiwpbkinfoviewprovider/src/aiwpbkinfoviewprovider.cpp	Wed Sep 01 12:29:17 2010 +0100
@@ -0,0 +1,391 @@
+/*
+* Copyright (c) 2002-2005 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:  AIW provider for pbkinfoview.
+*
+*/
+
+
+#include "pbkinfoviewapi.h"
+#include "rubydebug.h"
+
+#include <AiwMenu.h>
+#include <CVPbkContactManager.h>
+#include <CVPbkContactLinkArray.h>
+#include <MVPbkContactLink.h>
+#include <CVPbkContactStoreUriArray.h>
+#include <CVPbkContactIdConverter.h>
+#include <MVPbkContactStoreListObserver.h>
+#include <VPbkContactStoreUris.h>
+#include <VPbkContactStoreUris.h>
+#include <TVPbkContactStoreUriPtr.h>
+#include <MVPbkContactStoreList.h>
+#include <MVPbkContactStore.h>
+#include <MVPbkContactStoreProperties.h>
+
+#include <implementationproxy.h>
+
+#include <data_caging_path_literals.hrh>  // for resource and bitmap directories
+
+#include <aiwpbkinfoviewprovider.rsg>
+#include "aiwpbkinfoviewprovider.h"
+#include "aiwpbkinfoviewprovideruids.hrh"
+#include "aiwpbkinfoviewprovider.rh"
+
+_LIT( KResFileName, "z:aiwpbkinfoviewprovider.rsc" );
+const TInt32 KVoiceTaglessContactId = -2;
+
+// -----------------------------------------------------------------------------
+// CAiwPbkInfoViewProvider::NewL
+//
+// -----------------------------------------------------------------------------
+//
+CAiwPbkInfoViewProvider* CAiwPbkInfoViewProvider::NewL()
+	{
+	CAiwPbkInfoViewProvider* self = new (ELeave) CAiwPbkInfoViewProvider();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CAiwPbkInfoViewProvider::Constructor
+//
+// -----------------------------------------------------------------------------
+//
+CAiwPbkInfoViewProvider::CAiwPbkInfoViewProvider()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CAiwPbkInfoViewProvider::Destructor
+//
+// -----------------------------------------------------------------------------
+//
+CAiwPbkInfoViewProvider::~CAiwPbkInfoViewProvider()
+	{
+	delete iInfoViewApi;
+	iInfoViewApi = NULL;
+	delete iWait;
+	iWait = NULL;
+	}
+
+// -----------------------------------------------------------------------------
+// CAiwPbkInfoViewProvider::ConstructL
+//
+// -----------------------------------------------------------------------------
+//
+void CAiwPbkInfoViewProvider::ConstructL()
+    {
+	iInfoViewApi = CPbkInfoViewApi::NewL();
+	iWait = new (ELeave) CActiveSchedulerWait();
+    } 
+
+// -----------------------------------------------------------------------------
+// CAiwPbkInfoViewProvider::InitialiseL (from CAiwServiceIfBase)
+//
+// -----------------------------------------------------------------------------
+//
+void CAiwPbkInfoViewProvider::InitialiseL( 
+                                  MAiwNotifyCallback& /*aFrameworkCallback*/,
+	                              const RCriteriaArray& /*aInterest*/ )
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CAiwPbkInfoViewProvider::HandleServiceCmdL (from CAiwServiceIfBase)
+//
+// -----------------------------------------------------------------------------
+//
+void CAiwPbkInfoViewProvider::HandleServiceCmdL(
+                                  const TInt& /*aCmdId*/,
+                                  const CAiwGenericParamList& /*aInParamList*/,
+                                  CAiwGenericParamList& /*aOutParamList*/,
+                                  TUint /*aCmdOptions*/,
+                                  const MAiwNotifyCallback* /*aCallback*/ )
+	{
+	User::Leave( KErrNotSupported );
+	}
+
+// -----------------------------------------------------------------------------
+// CAiwPbkInfoViewProvider::InitializeMenuPaneL (from CAiwServiceIfMenu)
+// Initialises menu pane by adding provider specific menu items. The AIW
+// framework gives the parameters to be used in addition.
+// @param aMenuPane Menu pane handle
+// @param aIndex position of item where to add menu items.
+// @param aCascadeId ID of cascade menu item.
+// @param aInParamList input parameter list for provider's parameters checking
+// -----------------------------------------------------------------------------
+//
+void CAiwPbkInfoViewProvider::InitializeMenuPaneL(
+                                  CAiwMenuPane& aMenuPane,
+			                      TInt aIndex,
+								  TInt /*aCascadeId*/,
+                                  const CAiwGenericParamList& aInParamList )
+	{
+	TFileName resFile;
+	GetResFileName( resFile );
+
+    TInt serviceCommand = GetServiceCommandId( aInParamList );
+    
+    if ( serviceCommand == KErrNotFound )
+        {
+        User::Leave( KErrArgument );
+    	}
+       	
+    if ( serviceCommand == KAiwCmdSindInfoView )
+    	{
+        aMenuPane.AddMenuItemsL( resFile, R_PBKINFOVIEWPROVIDER_SUBMENU,
+    	                         KAiwCmdSindInfoView, aIndex );
+    	}
+	}
+
+// -----------------------------------------------------------------------------
+// CAiwPbkInfoViewProvider::HandleMenuCmdL (from CAiwServiceIfMenu)
+// Handles a menu command invoked by the Handler.
+// @param aMenuCmdId Command ID for the menu command,
+//        defined by the provider when adding the menu commands.
+// @param aInParamList Input parameters, could be empty list
+// @param aOutParamList Output parameters, could be empty list
+// @param aCmdOptions Options for the command, see KAiwCmdOpt* constants.
+// @param aCallback callback if asynchronous command handling is wanted by consumer.
+//        The provider may or may not support this, leaves with KErrNotSupported
+//        if not.
+// -----------------------------------------------------------------------------
+//
+void CAiwPbkInfoViewProvider::HandleMenuCmdL( 
+                                  TInt aMenuCmdId, 
+                                  const CAiwGenericParamList& aInParamList,
+                                  CAiwGenericParamList& /*aOutParamList*/,
+                                  TUint /*aCmdOptions*/,
+                                  const MAiwNotifyCallback* /*aCallback*/ )
+	{
+	RUBY_DEBUG_BLOCK( "CAiwPbkInfoViewProvider::HandleMenuCmdL" );
+	
+	if( aMenuCmdId == EPbkInfoViewProviderCmd )
+		{
+		TInt contactId = GetContactIdL( aInParamList );
+		
+        iInfoViewApi->ShowInfoViewL( contactId );
+		}
+	}
+	
+
+// -----------------------------------------------------------------------------
+// CAiwPbkInfoViewProvider::OpenComplete (from MVPbkContactStoreObserver)
+//
+// -----------------------------------------------------------------------------
+//	
+void CAiwPbkInfoViewProvider::StoreReady( MVPbkContactStore& /*aContactStore*/ )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CAiwPbkInfoViewProvider::OpenComplete (from MVPbkContactStoreObserver)
+//
+// -----------------------------------------------------------------------------
+//
+void CAiwPbkInfoViewProvider::StoreUnavailable( MVPbkContactStore& /*aContactStore*/, 
+        TInt /*aReason*/ )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CAiwPbkInfoViewProvider::OpenComplete (from MVPbkContactStoreObserver)
+//
+// -----------------------------------------------------------------------------
+//
+void CAiwPbkInfoViewProvider::HandleStoreEventL( MVPbkContactStore& /*aContactStore*/,
+        TVPbkContactStoreEvent /*aStoreEvent*/ )
+    {
+    }
+// -----------------------------------------------------------------------------
+// CAiwPbkInfoViewProvider::OpenComplete (from MVPbkContactStoreListObserver)
+//
+// -----------------------------------------------------------------------------
+//
+void CAiwPbkInfoViewProvider::OpenComplete()
+	{
+    // Continue with GetContactIdL-method
+    if ( iWait && iWait->IsStarted() )
+        {
+        iWait->AsyncStop();
+        }
+	}
+
+// -----------------------------------------------------------------------------
+// CAiwPbkInfoViewProvider::GetContactIdL
+// Gets the contact id from AIW parameter list.
+// @param aInParamList AIW parameter list.
+// @return Contact id.
+// -----------------------------------------------------------------------------
+//
+TInt CAiwPbkInfoViewProvider::GetContactIdL(
+                                  const CAiwGenericParamList& aInParamList )
+	{
+	RUBY_DEBUG_BLOCK( "CAiwPbkInfoViewProvider::GetContactIdL" );
+	
+	TInt index( 0 );
+	TInt32 contactId( KVoiceTaglessContactId );
+	
+    const TAiwGenericParam* param
+        = aInParamList.FindFirst( index, EGenericParamContactLinkArray );
+        
+    if( param )
+        {
+        // Get the externalized contact link array
+        TPtrC8 packedLinkArray = param->Value().AsData();
+        
+        CVPbkContactStoreUriArray* uriArray = CVPbkContactStoreUriArray::NewLC();
+
+        uriArray->AppendL( TVPbkContactStoreUriPtr( VPbkContactStoreUris::DefaultCntDbUri() ) );
+
+        CVPbkContactManager* contactManager = CVPbkContactManager::NewL( *uriArray );
+        CleanupStack::PushL( contactManager );
+        
+        // Open contact stores
+        MVPbkContactStoreList& storeList = contactManager->ContactStoresL();
+        storeList.OpenAllL( *this );
+        
+        // Let's synchronize the OpenAllL call
+        if ( iWait && !iWait->IsStarted() )
+            {
+            iWait->Start();
+            }
+        
+        // Internalize contact link array
+        CVPbkContactLinkArray* links = CVPbkContactLinkArray::NewLC(
+            packedLinkArray, contactManager->ContactStoresL() );
+        
+        if( links->Count() > 0 )
+            {
+            // There should only be one link in the array
+            const MVPbkContactLink& link = links->At( 0 );
+            
+            MVPbkContactStore& store = link.ContactStore();
+            
+            // Get the contact id    
+            CVPbkContactIdConverter* idConverter
+                = CVPbkContactIdConverter::NewL( store );
+            CleanupStack::PushL( idConverter );
+            
+            contactId = idConverter->LinkToIdentifier( link ); 
+            
+            CleanupStack::PopAndDestroy( idConverter );  
+            }
+
+        CleanupStack::PopAndDestroy( links );
+        CleanupStack::PopAndDestroy( contactManager );
+        CleanupStack::PopAndDestroy( uriArray );
+        }
+
+    RUBY_DEBUG1( "Contact id: %d", contactId );
+	return contactId;
+	}
+
+// -----------------------------------------------------------------------------
+// CAiwPbkInfoViewProvider::GetServiceCommandId
+// Gets service command id from AIW parameter list.
+// @param aInParamList AIW parameter list.
+// @return TInt Service command id.
+// -----------------------------------------------------------------------------
+//
+TInt CAiwPbkInfoViewProvider::GetServiceCommandId(
+                                  const CAiwGenericParamList& aInParamList)
+	{
+	TInt index( 0 );
+	TInt32 num( 0 );
+	
+	const TAiwGenericParam* param
+	    = aInParamList.FindFirst( index, EGenericParamServiceCommand );
+
+	const TAiwVariant& val = param->Value();
+	if ( !val.Get( num ) )
+		{
+		num = KErrNotFound;
+		}
+	return num;
+	}
+
+// -----------------------------------------------------------------------------
+// CAiwPbkInfoViewProvider::GetResFileName
+// Gets this plugin resource file name.
+// @param aText Resource file name.
+// -----------------------------------------------------------------------------
+//
+void CAiwPbkInfoViewProvider::GetResFileName( TDes& aText )
+	{
+	TParse parse;
+	parse.Set( KResFileName, &KDC_RESOURCE_FILES_DIR, NULL );
+	StrCopy( aText, parse.FullName() );
+	}
+
+// -----------------------------------------------------------------------------
+// CAiwPbkInfoViewProvider::StrCopy
+//
+// String copy with lenght check.
+// @param TDes& aTarget Copied text will be put to this variable.
+// @param TDesC8& aSource Includes the text to be copied.
+// -----------------------------------------------------------------------------
+//
+void CAiwPbkInfoViewProvider::StrCopy( TDes& aTarget, const TDesC& aSource )
+    {
+	TInt len = aTarget.MaxLength();
+    if( len < aSource.Length() ) 
+	    {
+		aTarget.Copy( aSource.Left( len ) );
+		return;
+	    }
+	aTarget.Copy( aSource );
+    }
+
+//
+// Rest of the file is for ECom initialization. 
+//
+
+// -----------------------------------------------------------------------------
+// Map the interface UIDs to implementation factory functions
+//
+// -----------------------------------------------------------------------------
+//
+const TImplementationProxy ImplementationTable[] =
+    {
+    IMPLEMENTATION_PROXY_ENTRY( KAspInfoViewProviderImplUid,
+                                CAiwPbkInfoViewProvider::NewL )
+    };
+
+// -----------------------------------------------------------------------------
+// Exported proxy for instantiation method resolution
+//
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+{
+    aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy );
+
+    return ImplementationTable;
+}
+
+//
+// DLL entry point
+//
+#ifndef EKA2
+GLDEF_C TInt E32Dll(TDllReason /*aReason*/)
+	{
+	return KErrNone;
+	}
+#endif
+
+// End of file