--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/xSPExtensionManager/src/CxSPViewIdChanger.cpp Wed Sep 01 12:29:52 2010 +0100
@@ -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