phonebookui/Phonebook2/remotecontactlookup/engine/src/cpbk2remotecontactlookupaccounts.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/remotecontactlookup/engine/src/cpbk2remotecontactlookupaccounts.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,218 @@
+/*
+* Copyright (c) 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: Implementation of the class Pbk2RemoteContactLookupFactory.
+*
+*/
+
+
+#include <cpbk2remotecontactlookupaccounts.h>
+
+#include "pbkxrclutils.h"
+#include "cpbkxrclprotocolenvimpl.h"
+#include "cpbkxremotecontactlookupprotocoladapter.h"
+
+void CleanupResetAndDestroyInfoArray(TAny* aObj)
+ {
+ if (aObj)
+ {
+ static_cast<RImplInfoPtrArray*>(aObj)->ResetAndDestroy();
+ }
+ }
+
+void CleanupResetAndDestroyAccArray(TAny* aObj)
+ {
+ if (aObj)
+ {
+ static_cast<RPointerArray<CPbkxRemoteContactLookupProtocolAccount>*>(aObj)->ResetAndDestroy();
+ }
+ }
+
+
+// ======== MEMBER FUNCTIONS ========
+
+
+EXPORT_C CPbk2RemoteContactLookupAccounts* CPbk2RemoteContactLookupAccounts::NewL()
+ {
+ CPbk2RemoteContactLookupAccounts* self = CPbk2RemoteContactLookupAccounts::NewLC();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+
+EXPORT_C CPbk2RemoteContactLookupAccounts* CPbk2RemoteContactLookupAccounts::NewLC()
+ {
+ CPbk2RemoteContactLookupAccounts* self = new (ELeave) CPbk2RemoteContactLookupAccounts();
+ CleanupStack::PushL( self );
+ return self;
+ }
+
+
+
+CPbk2RemoteContactLookupAccounts::~CPbk2RemoteContactLookupAccounts()
+ {
+ iAdapters.ResetAndDestroy();
+ delete iProtocolEnv;
+ }
+
+
+
+EXPORT_C TPbkxRemoteContactLookupProtocolAccountId CPbk2RemoteContactLookupAccounts::DefaultAccountIdL()
+ {
+ return PbkxRclUtils::DefaultProtocolAccountIdL();
+ }
+
+
+
+EXPORT_C CPbkxRemoteContactLookupProtocolAccount* CPbk2RemoteContactLookupAccounts::GetAccountL(
+ const TPbkxRemoteContactLookupProtocolAccountId& aProtocolAccountId )
+ {
+ CPbkxRclProtocolEnvImpl* protocolEnv = CPbkxRclProtocolEnvImpl::NewLC();
+
+ CPbkxRemoteContactLookupProtocolAccount* account = NULL;
+
+ // Need load the plugin
+ CPbkxRemoteContactLookupProtocolAdapter* adapter = NULL;
+ TRAP_IGNORE( adapter = CPbkxRemoteContactLookupProtocolAdapter::NewL(
+ aProtocolAccountId.iProtocolUid,
+ *protocolEnv ) );
+ if ( adapter )
+ {
+ CleanupStack::PushL( adapter );
+
+ // Delegate to the plugin
+ account = adapter->NewProtocolAccountL( aProtocolAccountId );
+ CleanupStack::PopAndDestroy( adapter );
+ }
+ CleanupStack::PopAndDestroy(); // protocolEnv
+ return account;
+ }
+
+
+
+EXPORT_C void CPbk2RemoteContactLookupAccounts::LoadProtocolPluginsL()
+ {
+ iAdapters.ResetAndDestroy();
+ if ( !iProtocolEnv )
+ {
+ iProtocolEnv = CPbkxRclProtocolEnvImpl::NewL();
+ }
+
+ RImplInfoPtrArray implArray;
+ TCleanupItem cleanupItem(CleanupResetAndDestroyInfoArray, &implArray);
+ CleanupStack::PushL( cleanupItem );
+ REComSession::ListImplementationsL( TUid::Uid(KPbkxRemoteContactLookupAdapterIfUid), implArray );
+
+ //TODO Need to also keep track of the plugin protocol UIDs. ???
+ // Also impl. UIDS to avoid unnecessary loading?
+ // The plugin interface doesn't have a method for asking the protocol UID!!
+
+ // Now create all the protocol adapters.
+ // The actual ECom loading is implemented in CPbkxRemoteContactLookupProtocolAdapter.
+ for ( TInt i = 0; i < implArray.Count(); i++ )
+ {
+ CPbkxRemoteContactLookupProtocolAdapter* adapter = NULL;
+ adapter = CPbkxRemoteContactLookupProtocolAdapter::NewL(
+ implArray[i]->ImplementationUid(), *iProtocolEnv );
+ CleanupStack::PushL( adapter );
+ User::LeaveIfError( iAdapters.Append( adapter ) );
+ CleanupStack::Pop( adapter );
+ }
+ CleanupStack::PopAndDestroy(); // cleanupItem
+ }
+
+
+
+EXPORT_C void CPbk2RemoteContactLookupAccounts::GetAllAccountsL(
+ RPointerArray<CPbkxRemoteContactLookupProtocolAccount>& aAccounts )
+ {
+ if ( iAdapters.Count() == 0 )
+ {
+ // No plugins were loaded.
+ LoadProtocolPluginsL();
+ }
+
+ // Loop through all the plugins and collect all the accounts
+ const TInt protocolAdapterCount = iAdapters.Count();
+ for ( TInt n = 0; n < protocolAdapterCount; n++ )
+ {
+ CPbkxRemoteContactLookupProtocolAdapter& adapter = *iAdapters[n];
+ // Using a temp array, just to avoid an adapter resetting the main array
+ RPointerArray<CPbkxRemoteContactLookupProtocolAccount> protocolAccountsTmp;
+ TCleanupItem cleanupItemAcc(CleanupResetAndDestroyAccArray, &protocolAccountsTmp);
+ CleanupStack::PushL(cleanupItemAcc);
+ adapter.GetAllProtocolAccountsL( protocolAccountsTmp );
+
+ // Move accounts from temp array to main array
+
+ // First expand the main array so that we can move ownership in one go.
+ // TODO OOPS, METHOD NOT AVAILABLE iAdapters.SetReserveL( iAdapters.Count() + protocolAccountsTmp.Count() );
+
+
+ // Don't need the cleanup item anymore since iAdapters will take ownership,
+ // and the iAdapters has already been expanded.
+ CleanupStack::Pop(); // cleanupItemAcc
+ for ( TInt x = 0; x < protocolAccountsTmp.Count(); x++ )
+ {
+ // Ownership is passed
+ User::LeaveIfError( aAccounts.Append( protocolAccountsTmp[ x ] ) );
+ }
+ // just let protocolAccountsTmp pass out of scope. It doesn't own anything now.
+ }
+ }
+
+
+
+EXPORT_C void CPbk2RemoteContactLookupAccounts::GetAccountsL(
+ RPointerArray<CPbkxRemoteContactLookupProtocolAccount>& aAccounts,
+ const TUid& aProtocol )
+ {
+ //TODO Should optimise this.
+
+ RPointerArray<CPbkxRemoteContactLookupProtocolAccount> protocolAccounts;
+ TCleanupItem cleanupItemAcc(CleanupResetAndDestroyAccArray, &protocolAccounts);
+ CleanupStack::PushL(cleanupItemAcc);
+
+ GetAllAccountsL( protocolAccounts );
+
+ // Collect the accounts which have correct protocol
+ for ( TInt j = protocolAccounts.Count() - 1; j >= 0; j-- )
+ {
+ CPbkxRemoteContactLookupProtocolAccount* account = protocolAccounts[j];
+ if( account->Id().iProtocolUid == aProtocol )
+ {
+ // Transfer ownership
+ User::LeaveIfError( aAccounts.Append( account ) );
+ }
+ else
+ {
+ // Wrong account. Don't need it.
+ delete account;
+ }
+ protocolAccounts.Remove( j );
+ }
+ CleanupStack::Pop(); // cleanupItemAcc
+ }
+
+CPbk2RemoteContactLookupAccounts::CPbk2RemoteContactLookupAccounts()
+ {
+ }
+
+EXPORT_C void CPbk2RemoteContactLookupAccounts::SetDefaultAccountIdL(
+ const TPbkxRemoteContactLookupProtocolAccountId& aAccountId )
+ {
+ PbkxRclUtils::StoreDefaultProtocolAccountIdL( aAccountId );
+ }
+
+// end of file