messagingappbase/msgavkon/muiu_internal/flagger/src/MuiuFlagger.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/msgavkon/muiu_internal/flagger/src/MuiuFlagger.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,238 @@
+/*
+* 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:  MuiuFlagger implementation
+*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <e32base.h>        
+#include <featmgr.h>            // Feature Manager
+#include <centralrepository.h>  // CRepository
+#include "MuiuFlagger.h"        // CMuiuFlags
+
+
+// EXTERNAL DATA STRUCTURES
+// EXTERNAL FUNCTION PROTOTYPES  
+// CONSTANTS
+const TInt KMuiuFlaggerMaxFlags = 64;
+_LIT( KMuiuFlaggerPanic, "MuiuFlagger" );
+
+// MACROS
+// LOCAL CONSTANTS AND MACROS
+// MODULE DATA STRUCTURES
+// LOCAL FUNCTION PROTOTYPES
+// FORWARD DECLARATIONS
+
+// ============================ MEMBER FUNCTIONS ==============================
+
+
+// ------------------------------ CONSTRUCTORS --------------------------------
+
+
+// ----------------------------------------------------------------------------
+// CMuiuFlags::CMuiuFlags()
+// ----------------------------------------------------------------------------
+//
+CMuiuFlags::CMuiuFlags()
+    {    
+    }
+
+// ----------------------------------------------------------------------------
+// CMuiuFlags::~CMuiuFlags()
+// ----------------------------------------------------------------------------
+//
+EXPORT_C CMuiuFlags::~CMuiuFlags()
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CMuiuFlags::NewL()
+// ----------------------------------------------------------------------------
+//
+EXPORT_C CMuiuFlags* CMuiuFlags::NewL(
+    const TMuiuGlobalFeatureArray* aGlobalFeatures,
+    const TMuiuLocalFeatureArray* aLocalFeatures,
+    const TMuiuFlagArray* aFlags )
+    {
+    CMuiuFlags* self = NewLC( aGlobalFeatures, aLocalFeatures, aFlags );
+    CleanupStack::Pop( self );
+    
+    return self;
+    }
+    
+// ----------------------------------------------------------------------------
+// CMuiuFlags::NewLC()
+// ----------------------------------------------------------------------------
+//
+EXPORT_C CMuiuFlags* CMuiuFlags::NewLC(
+    const TMuiuGlobalFeatureArray* aGlobalFeatures,
+    const TMuiuLocalFeatureArray* aLocalFeatures,
+    const TMuiuFlagArray* aFlags )
+    { 
+    CMuiuFlags* self = new ( ELeave ) CMuiuFlags();  
+    
+    CleanupStack::PushL( self );
+    self->ConstructL( aGlobalFeatures, aLocalFeatures, aFlags );
+    
+    return self;
+    }    
+
+        
+// ----------------------------------------------------------------------------
+// CMuiuFlags::ConstructL()
+// ----------------------------------------------------------------------------
+//
+void CMuiuFlags::ConstructL(
+    const TMuiuGlobalFeatureArray* aGlobalFeatures,
+    const TMuiuLocalFeatureArray* aLocalFeatures,
+    const TMuiuFlagArray* aFlags )
+    {
+    if ( aGlobalFeatures )
+        {
+        PrepareGlobalFeaturesL( *aGlobalFeatures );
+        }
+    
+    // Local features
+    if ( aLocalFeatures )
+        {
+        PrepareLocalFeaturesL( *aLocalFeatures );
+        }
+
+    // Normal flags
+    if ( aFlags )
+        {
+        PrepareGeneralFlags( *aFlags );
+        }
+    }
+    
+    
+// ----------------------------- FLAG HANDLERS --------------------------------
+    
+        
+// ----------------------------------------------------------------------------
+// CMuiuFlags::PrepareGlobalFeaturesL()
+// ----------------------------------------------------------------------------
+//    
+void CMuiuFlags::PrepareGlobalFeaturesL( 
+    const TMuiuGlobalFeatureArray& aGlobalFeatures )
+    {
+    TUint64 feature = aGlobalFeatures.Count();
+    
+    // Compare the number of given features against the maximum number
+    // of featureflags possible. Panic if the number of flags has been 
+    // exceeded.
+    __ASSERT_ALWAYS( 
+        feature <= KMuiuFlaggerMaxFlags, 
+        User::Panic( KMuiuFlaggerPanic, KErrOverflow ) );
+    
+    FeatureManager::InitializeLibL();
+    
+    // Check all the features in array from feature manager and set
+    // the flags in the same order as in the array
+    while ( feature-- > 0 )
+        {
+        ChangeGF( feature, 
+            FeatureManager::FeatureSupported( 
+                aGlobalFeatures[feature] ) );      
+        }
+              
+    FeatureManager::UnInitializeLib();
+    }
+
+// ----------------------------------------------------------------------------
+// CMuiuFlags::PrepareLocalFeaturesL()
+// ----------------------------------------------------------------------------
+//
+void CMuiuFlags::PrepareLocalFeaturesL(
+    const TMuiuLocalFeatureArray& aLocalFeatures )
+    {
+    TUint64 feature = aLocalFeatures.Count();
+    
+    // Compare the number of given features against the maximum number
+    // of featureflags possible. Panic if the number of flags has been 
+    // exceeded.
+    __ASSERT_ALWAYS( 
+        feature <= KMuiuFlaggerMaxFlags, 
+        User::Panic( KMuiuFlaggerPanic, KErrOverflow ) );              
+    
+    TInt value = 0;
+    
+    // Get Next CenRep session
+    while ( feature-- > 0 )
+        {
+        // Create temporary structure for the feature
+        TMuiuLocalFeatureItem localFeature = aLocalFeatures[feature];
+        
+        // Create the connection
+        CRepository* cenrep = 
+            CRepository::NewLC( localFeature.iUid );
+            
+        // Get the value from repository
+        User::LeaveIfError( 
+            cenrep->Get( localFeature.iKeyId, value ) );
+                    
+        // Define the feature flag
+        if ( !localFeature.iIsFlag )
+            {
+            // The value in iFlag is actually an index, so roll on to right
+            // and mask the other flags
+            ChangeLF( feature, ( value >> localFeature.iFlag ) & 0x01 );
+            }
+        else
+            {
+            // The value in iFlag is a real flag, so do the normal 
+            // and -operation and check if the bit is on
+            ChangeLF( feature, ( value & localFeature.iFlag ) > 0 );
+            }            
+                            
+        // Destroy the object
+        CleanupStack::PopAndDestroy( cenrep );
+        cenrep = NULL;
+        }         
+    }
+    
+
+// ----------------------------------------------------------------------------
+// CMuiuFlags::PrepareGeneralFlags()
+// ----------------------------------------------------------------------------
+//
+void CMuiuFlags::PrepareGeneralFlags(
+    const TMuiuFlagArray& aFlags )
+    {
+    TUint64 feature = aFlags.Count();
+    
+    // Compare the number of given features against the maximum number
+    // of featureflags possible. Panic if the number of flags has been 
+    // exceeded.
+    __ASSERT_ALWAYS( 
+        feature <= KMuiuFlaggerMaxFlags, 
+        User::Panic( KMuiuFlaggerPanic, KErrOverflow ) );  
+        
+    // Check all the flags in array and set the flags in the 
+    // same order as in the array
+    while ( feature-- > 0 )
+        {
+        ChangeFlag( feature, 
+            FeatureManager::FeatureSupported( 
+                aFlags[feature] ) );
+        }
+    }    
+    
+    
+// End of File
+
+