phonebookui/Phonebook/PbkExt/src/CPbkExtensionScanner.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook/PbkExt/src/CPbkExtensionScanner.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,118 @@
+/*
+* Copyright (c) 2002 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: 
+*       Scanner that finds extensions.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbkExtensionScanner.h"
+#include <ecom/ecom.h>
+#include "CPbkExtGlobals.h"
+#include <ExtensionUID.h>
+#include "CPbkExtensionLoader.h"
+#include "PbkUID.h"
+
+#include <PbkDebug.h>        // Phonebook debugging support
+#include "PbkProfiling.h"
+
+
+// Unnamed namespace for local definitions
+namespace {
+
+void CleanupResetAndDestroy(TAny* aObj)
+    {
+    if (aObj)
+        {
+        static_cast<RImplInfoPtrArray*>(aObj)->ResetAndDestroy();
+        }
+    }
+
+} // namespace
+
+// ==================== MEMBER FUNCTIONS ====================                 
+CPbkExtensionScanner::CPbkExtensionScanner(CPbkExtensionArray& aExtensions) :
+    iExtensions(aExtensions)
+    {
+	}	
+
+CPbkExtensionScanner::~CPbkExtensionScanner()
+    {
+    }
+
+
+CPbkExtensionScanner*
+CPbkExtensionScanner::NewLC(CPbkExtensionArray& aExtensions)
+    {
+    CPbkExtensionScanner* self = 
+        new (ELeave) CPbkExtensionScanner(aExtensions);
+    CleanupStack::PushL( self );
+    return self;
+    }
+
+void CPbkExtensionScanner::ScanL()
+    {
+    __PBK_PROFILE_START(PbkProfiling::EEComUiExtensionScanPrepare);
+    RImplInfoPtrArray implementations;
+    TEComResolverParams resolverParams;
+
+    resolverParams.SetWildcardMatch(ETrue);
+    _LIT8(KPbkExtension, KPbkUiExtensionDefaultDataString);
+    resolverParams.SetDataType(KPbkExtension);
+
+    __PBK_PROFILE_END(PbkProfiling::EEComUiExtensionScanPrepare);
+    PBK_DEBUG_PRINT(PBK_DEBUG_STRING("Start ECom extension scan"));
+    __PBK_PROFILE_START(PbkProfiling::EEComUiExtensionScan);
+
+    // Use ROM only resolver
+    REComSession::ListImplementationsL
+        (TUid::Uid(KPbkUiExtensionInterfaceDefinitionUID), 
+         resolverParams,         
+         implementations);
+
+    __PBK_PROFILE_END(PbkProfiling::EEComUiExtensionScan);
+    PBK_DEBUG_PRINT(PBK_DEBUG_STRING("Done Ecom extension scan"));
+
+    __PBK_PROFILE_START(PbkProfiling::EEComUiExtensionLoadPrepare);
+    CleanupStack::PushL(TCleanupItem(CleanupResetAndDestroy, 
+                                     &implementations));
+
+    const TInt count = implementations.Count();
+    iExtensions.SetReserveL(iExtensions.Count() + count);
+    __PBK_PROFILE_END(PbkProfiling::EEComUiExtensionLoadPrepare);
+    for (TInt i = count-1; i >= 0; --i)
+        {
+        __PBK_PROFILE_START(PbkProfiling::EEComUiExtensionLoadPrepare);
+        CImplementationInformation* implInfo = implementations[i];
+        CleanupStack::PushL(implInfo);
+        implementations.Remove(i);
+        __PBK_PROFILE_END(PbkProfiling::EEComUiExtensionLoadPrepare);
+        
+        CPbkExtensionLoader* extension = NULL;
+        TRAPD(err,
+              extension = CPbkExtensionLoader::NewL(implInfo->ImplementationUid()));
+        if (err == KErrNone)
+            {
+            CleanupStack::PushL(extension);
+            iExtensions.AppendL(extension);
+            CleanupStack::Pop(extension);
+            }
+
+        CleanupStack::PopAndDestroy(implInfo);
+        }
+    CleanupStack::PopAndDestroy(); // implementations
+    }
+
+// End of File