phonebookui/Phonebook2/xSPExtensionManager/src/CxSPViewIdChanger.cpp
changeset 0 e686773b3f54
child 21 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/xSPExtensionManager/src/CxSPViewIdChanger.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,264 @@
+/*
+* Copyright (c) 2006 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: 
+*       xSP view id changer
+*
+*/
+
+
+// INCLUDE FILES
+#include <coemain.h>
+#include <barsread.h>
+#include <centralrepository.h>
+
+
+#include "CxSPViewIdChanger.h"
+#include "MxSPFactory.h"
+#include "MxSPViewInfo.h"
+#include "ExtensionManager.hrh"
+#include "CxSPViewInfo.h"
+#include <ExtensionManagerRes.rsg>
+#include "ExtensionManagerUID.H"
+#include "xSPOrderOrganizer.h"
+#include "Phonebook2PrivateCRKeys.h"
+
+
+// CONSTANTS
+
+// ==================== MEMBER FUNCTIONS ====================
+CxSPViewIdChanger::CxSPViewIdChanger()
+    {
+    }
+
+CxSPViewIdChanger::~CxSPViewIdChanger()
+    {
+    iViewIdMap.ResetAndDestroy();
+    iViewIdMap.Close();
+    iTabViewNewIds.Close();
+    iNonTabViewNewIds.Close();
+    }
+
+CxSPViewIdChanger* CxSPViewIdChanger::NewL()
+    {
+    CxSPViewIdChanger* self = new (ELeave) CxSPViewIdChanger;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+void CxSPViewIdChanger::ConstructL()
+    {
+    // construct iTabViewNewIds from constants
+    for( TInt id = EExtensionManagerTabViewStartId; id <= EExtensionManagerTabViewMaxId; id++ )
+    	{
+    	User::LeaveIfError( iTabViewNewIds.Append( TNewViewIdInfo( id )));
+    	}
+    
+    // construct iNonTabViewNewIds from constants
+    for( TInt id = EExtensionManagerViewStartId; id <= EExtensionManagerViewMaxId; id++ )
+    	{
+    	User::LeaveIfError( iNonTabViewNewIds.Append( TNewViewIdInfo( id )));
+    	}
+    }
+
+void CxSPViewIdChanger::ChangeViewIdsL( CArrayPtrFlat<MxSPFactory>& aFactories )
+	{
+	for( TInt i = 0; i < aFactories.Count(); i++ )
+		{
+		TInt res = aFactories[i]->ViewInfoResource();
+		if( res != KErrNotFound )
+			{
+			TResourceReader reader;
+			CCoeEnv::Static()->CreateResourceReaderLC( reader, res );
+			TInt resCount = reader.ReadInt16();
+			for( TInt j = 0; j < resCount; j++ )
+				{
+				CxSPViewInfo* viewInfo = NULL;
+				viewInfo = CxSPViewInfo::NewLC( reader, aFactories[i]->Id() );
+				User::LeaveIfError( iViewIdMap.Append( viewInfo ) );
+				CleanupStack::Pop(); // viewInfo
+				}
+			CleanupStack::PopAndDestroy(); // reader
+			aFactories[i]->RegisterViewMapper( *this );	
+			}
+		else
+			{
+			TInt viewInfoCount = aFactories[i]->ViewInfoCount();
+			for( TInt j = 0; j < viewInfoCount; j++ )
+				{
+				CxSPViewInfo* viewInfo = NULL;
+				const MxSPViewInfo* info = aFactories[i]->ViewInfo( j );
+				if( info )
+					{
+					viewInfo = CxSPViewInfo::NewLC( *info, aFactories[i]->Id() );
+					User::LeaveIfError( iViewIdMap.Append( viewInfo ) );
+					CleanupStack::Pop(); // viewInfo
+					}
+				}
+			aFactories[i]->RegisterViewMapper( *this );
+			}			
+		}
+		
+	xSPOrderOrganizer::OrderCheck( iViewIdMap );
+	
+	for( TInt i = 0; i < iViewIdMap.Count(); i++ )
+		{
+		CxSPViewInfo& viewInfo = *iViewIdMap[i];
+		if( viewInfo.TabView() )
+			{
+			User::LeaveIfError( viewInfo.SetNewId( iTabViewNewIds ) );
+			}
+		else
+			{
+			User::LeaveIfError( viewInfo.SetNewId( iNonTabViewNewIds ) );
+			}
+		}
+	}
+
+void CxSPViewIdChanger::ChangeManagerViewIdsL()
+	{
+	TInt res = R_EXTENSION_MANAGER_VIEW_INFO;
+	TResourceReader reader;
+	CCoeEnv::Static()->CreateResourceReaderLC( reader, res );
+	TInt resCount = reader.ReadInt16();
+	for( TInt j = 0; j < resCount; j++ )
+		{
+		CxSPViewInfo* viewInfo = CxSPViewInfo::NewLC( reader, KEXTENSIONMANAGERIMPLEMENTATIONUID );
+		User::LeaveIfError( viewInfo->SetNewId( iNonTabViewNewIds ) );										
+		User::LeaveIfError( iViewIdMap.Append( viewInfo ) );
+		CleanupStack::Pop(); // viewInfo
+		}
+	CleanupStack::PopAndDestroy(); // reader
+	}
+
+
+TInt CxSPViewIdChanger::GetOldView( TUint32 aId, TInt aNewView, TInt& aOldView ) const
+	{
+	TInt mapCount = iViewIdMap.Count();
+	TInt err( KErrNotFound );
+	for( TInt i = 0; i < mapCount && err; i++ )
+		{
+		CxSPViewInfo* info = iViewIdMap[i];
+		if( info->Id() == aId && info->NewViewId() == aNewView )
+			{
+			aOldView = info->OldViewId();
+			err = KErrNone;
+			}
+		}
+	return err;
+	}
+
+TInt CxSPViewIdChanger::GetNewView( TUint32 aId, TInt aOldView, TInt& aNewView ) const
+	{
+	TInt mapCount = iViewIdMap.Count();
+	TInt err( KErrNotFound );
+	for( TInt i = 0; i < mapCount && err; i++ )
+		{
+		CxSPViewInfo* info = iViewIdMap[i];
+		if( info->Id() == aId && info->OldViewId() == aOldView )
+			{
+			aNewView = info->NewViewId();
+			err = KErrNone;
+			}
+		}
+	return err;
+	}
+
+void CxSPViewIdChanger::GetViewCount( TInt &aTabs, TInt &aOthers ) const
+	{
+	aTabs = 0;
+	aOthers = 0;
+	TInt mapCount = iViewIdMap.Count();
+	for( TInt i = 0; i < mapCount; i++ )
+		{
+		CxSPViewInfo* info = iViewIdMap[i];
+		if( info->TabView() )
+			{
+			aTabs++;
+			}
+		else
+			{
+			aOthers++;
+			}
+		}
+	}
+
+void CxSPViewIdChanger::GetTabViewInfoL( TUint32 aId, 
+										 RPointerArray<CxSPViewInfo>& aInfoArray ) const
+	{
+	TInt mapCount = iViewIdMap.Count();
+	for( TInt i = 0; i < mapCount; i++ )
+		{
+		CxSPViewInfo* info = iViewIdMap[i];
+		if( info->TabView() && info->Id() == aId )
+			{
+			User::LeaveIfError( aInfoArray.Append( info ) );
+			}
+		}
+	}
+	
+void CxSPViewIdChanger::GetTabViewInfoL( RPointerArray<CxSPViewInfo>& aInfoArray ) const
+	{
+	TInt mapCount = iViewIdMap.Count();
+	for( TInt i = 0; i < mapCount; i++ )
+		{
+		CxSPViewInfo* info = iViewIdMap[i];
+		if( info->TabView() )
+			{
+			User::LeaveIfError( aInfoArray.Append( info ) );
+			}
+		}
+	}	
+
+void CxSPViewIdChanger::WriteTabViewNamesToRepositoryL()
+    {
+    HBufC* nameStr = HBufC::NewLC(NCentralRepositoryConstants::KMaxUnicodeStringLength);
+    TPtr namePtr = nameStr->Des();
+    TInt cenRepError = KErrNone;
+    
+    CRepository* repository = CRepository::NewLC( TUid::Uid(KCRUidPhonebook) );
+        
+    // delete anyway even though aError==KErrNone
+    cenRepError = repository->Delete( KPhonebooksXPExtensionPluginsName ); 
+    // create a new CenRep by KPhonebooksXPExtensionPluginsName
+    cenRepError = repository->Create(KPhonebooksXPExtensionPluginsName, namePtr);    
+    
+    if ( cenRepError==KErrNone )
+        {
+        for( TInt i = 0; i < iViewIdMap.Count(); i++ )
+            {
+            CxSPViewInfo* info = iViewIdMap[i];   
+            TInt len = namePtr.Length();
+            TInt maxLen = namePtr.MaxLength();
+            TInt viewNameLen = info->Name().Length();
+            if( info && info->TabView() && viewNameLen > 0 && 
+                // use > instead of >=, one more char "|" need to be appended
+                ( maxLen - len ) > viewNameLen )
+                {
+                // append service tab view name to CenRep Key
+                namePtr.Append(info->Name());
+                namePtr.Append( '|' ); // used for seperator   
+                }
+            }
+        
+        // set sXPExtension service tab view name string to Cenrep. 
+        // this string looks like "View1Name|View2Name|View3Name|...."
+        cenRepError = repository->Set( KPhonebooksXPExtensionPluginsName, namePtr );
+        }
+  
+    CleanupStack::PopAndDestroy( repository );
+    CleanupStack::PopAndDestroy( nameStr );
+    }
+// end of file