menucontentsrv/srvsrc/mcsdrmscanner.cpp
changeset 0 79c6a41cd166
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/menucontentsrv/srvsrc/mcsdrmscanner.cpp	Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,385 @@
+/*
+* Copyright (c) 2008 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:  The API supports attributes not present in MCS from SAT Api
+*
+*/
+
+
+#include "mcsdrmscanner.h"
+#include "menueng.h"
+#include "menusrveng.h"
+#include "menuengobject.h"
+#include "menusrvengutils.h"
+
+// ============================ MEMBER FUNCTIONS =============================
+
+// ---------------------------------------------------------------------------
+// Creates an instance of CMcsDrmScanner implementation
+// ---------------------------------------------------------------------------
+//
+CMcsDrmScanner* CMcsDrmScanner::NewL( 
+    MMcsDrmAppScanner& aObserver, 
+    CMenuSrvEng& aSrvEng,
+    CMenuSrvEngUtils& aUtils )
+    {
+    CMcsDrmScanner* self = new (ELeave) CMcsDrmScanner( 
+        aObserver, aSrvEng, aUtils );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CMcsDrmScanner::~CMcsDrmScanner()
+    {
+    Cancel();
+    iSrvEng.Engine().DequeueOperation( *this );
+    iNotProtectedAppArray.Close();
+    iDrmExpiredAppArray.Close();
+    iDrmProtectedAppArray.Close();
+    iChangedAppArray.Close();
+    }
+    
+// -----------------------------------------------------------------------------
+// CMcsDrmScanner::CMcsDrmScanner
+// C++ default constructor
+// -----------------------------------------------------------------------------
+//
+CMcsDrmScanner::CMcsDrmScanner( 
+    MMcsDrmAppScanner& aObserver, 
+    CMenuSrvEng& aSrvEng,
+    CMenuSrvEngUtils& aUtils ): 
+    CActive( EPriorityNormal ), iObserver( aObserver ), 
+    iSrvEng( aSrvEng ), iUtils( aUtils )
+    {    
+    CActiveScheduler::Add( this );
+    iOpStatus = EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CMcsDrmScanner::ConstructL
+// S2nd phase constructor.
+// -----------------------------------------------------------------------------
+//
+void CMcsDrmScanner::ConstructL()
+    {
+    Scan();
+    }
+
+// ---------------------------------------------------------------------------
+// CMcsDrmScanner::DoCancel
+// ---------------------------------------------------------------------------
+//
+void CMcsDrmScanner::DoCancel()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CMcsDrmScanner::RunL
+// ---------------------------------------------------------------------------
+//
+void CMcsDrmScanner::RunL()
+    {
+    User::LeaveIfError( iStatus.Int() ); // Handle errors in RunL.
+    iSrvEng.Engine().QueueOperationL( *this );    
+    }    
+
+// ---------------------------------------------------------
+// CMcsDrmScanner::RunError()
+// ---------------------------------------------------------
+//
+TInt CMcsDrmScanner::RunError( TInt /*aError*/ )
+    {
+    // Ignore the error (what else could we do?).
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
+// CMcsDrmScanner::RunMenuEngOperationL
+// ---------------------------------------------------------
+//
+void CMcsDrmScanner::RunMenuEngOperationL()
+    {
+    ScanDrmApplicationsL();
+    iOpStatus = EFalse;
+    }  
+    
+// ---------------------------------------------------------
+// CMcsDrmScanner::CompletedMenuEngOperation
+// ---------------------------------------------------------
+//
+void CMcsDrmScanner::CompletedMenuEngOperation( TInt /*aErr*/ )
+    {
+    }          
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+void CMcsDrmScanner::GetAppItemsL( 
+    RArray<TMenuItem>& aItemArray, 
+    RArray<TAppItem>& aAppItemArray )
+    {
+    //for every item in apaAndCrItems array
+    CMenuEng& eng = iSrvEng.Engine();
+    for ( TInt i = 0; i<aItemArray.Count(); i++ )
+        {        
+        TUid appUid;
+        if ( KErrNone == 
+            CMenuSrvEngUtils::GetAppUid( 
+            	eng.ObjectL(aItemArray[i].Id()), appUid) )
+            {
+            TAppItem appItem( aItemArray[i].Id(), appUid );
+            aAppItemArray.AppendL(appItem);        
+            }        
+        }
+    }
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+void CMcsDrmScanner::GetUidsL( 
+    RArray<TAppItem>& aAppItemArray, 
+    RArray<TUid>& aUidArray )
+    {
+    for ( TInt i = 0; i<aAppItemArray.Count(); i++ )
+        {  
+        aUidArray.AppendL( aAppItemArray[i].Uid() );               
+        }
+    }
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+TBool CMcsDrmScanner::RemoveNotExistingApps( 
+    RArray<TUid>& aArrayToModify, 
+    const RArray<TUid>& aUidArray )
+    {  
+    TInt index = 0;
+    TBool changed = EFalse;
+    while ( index < aArrayToModify.Count() )
+        {
+        if ( aUidArray.Find( aArrayToModify[index] ) == KErrNotFound )
+            {
+            aArrayToModify.Remove( index );
+            changed = ETrue;
+            }
+        else
+            {
+            index++;
+            }       
+        }
+    return changed;
+    }        
+
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+TBool CMcsDrmScanner::RemoveChangedApps( )
+    {   
+    TBool changed = EFalse;
+    for( TInt i = 0; i< iChangedAppArray.Count(); i++ )
+    	{
+    	TInt index = iDrmExpiredAppArray.Find( iChangedAppArray[i] );
+        if ( index != KErrNotFound )
+               {
+               iDrmExpiredAppArray.Remove( index );
+               changed = ETrue;
+               }
+    	index = iDrmProtectedAppArray.Find( iChangedAppArray[i] );
+        if ( index != KErrNotFound )
+               {
+               iDrmProtectedAppArray.Remove( index );
+               changed = ETrue;
+               }   	
+    	}
+    iChangedAppArray.Reset();
+    return changed;
+    }
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+TBool CMcsDrmScanner::RemoveMissingApps( const RArray<TUid>& aUidArray )
+    {    
+    RemoveNotExistingApps( iNotProtectedAppArray, aUidArray );    
+    
+    TBool expiredChanged = 
+        RemoveNotExistingApps( iDrmExpiredAppArray, aUidArray );    
+        
+    TBool protectedChanged = 
+        RemoveNotExistingApps( iDrmProtectedAppArray, aUidArray );    
+
+    TInt changed = EFalse;
+    if ( expiredChanged || protectedChanged )
+        {
+        changed = ETrue;
+        }
+    return changed;
+    }
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+TBool CMcsDrmScanner::CheckDrmAppsL( const RArray<TAppItem>& aUidArray )
+    {    
+    TInt changed = EFalse;
+    
+    for ( TInt i = 0; i<aUidArray.Count(); i++ )
+        {                        
+        if ( iNotProtectedAppArray.Find( aUidArray[i].Uid() ) == KErrNotFound )
+            {
+            if ( iDrmProtectedAppArray.Find( aUidArray[i].Uid() ) == KErrNotFound &&
+                iDrmExpiredAppArray.Find( aUidArray[i].Uid() ) == KErrNotFound )
+                {
+		        TBool attrExists;
+		        RBuf attrVal;
+        	    attrVal.CleanupClosePushL();
+        	    attrVal.CreateL(KMenuMaxAttrValueLen);
+        	    
+                iSrvEng.GetAttributeL( 
+                    aUidArray[i].Id(), 
+                    KMenuAttrDrmProtection,
+                    attrExists,
+                    attrVal );
+
+                if ( attrVal == KMenuDrmProtected )
+                    {                       
+                    iDrmProtectedAppArray.AppendL( aUidArray[i].Uid() );
+                    changed = ETrue;
+                    }
+                else if ( attrVal == KMenuDrmRightsExpired )
+                    {       
+                    iDrmExpiredAppArray.AppendL( aUidArray[i].Uid() );
+                    changed = ETrue;    
+                    }
+                else
+                    {
+                    iNotProtectedAppArray.AppendL( aUidArray[i].Uid() );        
+                    }     
+                CleanupStack::PopAndDestroy( &attrVal );                   
+                }                                    
+            }
+        }
+    
+    return changed;
+    }
+    
+// ---------------------------------------------------------
+// CMcsDrmScanner::GetMcsItemsL
+// ---------------------------------------------------------
+//
+void CMcsDrmScanner::ScanDrmApplicationsL()
+    {    
+    RArray<TMenuItem> mcsItems; 
+    CleanupClosePushL( mcsItems );
+    GetMcsAppItemsL( mcsItems );
+          
+    RArray<TAppItem> appArray;
+    CleanupClosePushL( appArray );
+    
+    GetAppItemsL( mcsItems, appArray );
+    
+    RArray<TUid> uidArray;
+    CleanupClosePushL( uidArray );
+    
+    GetUidsL( appArray, uidArray );
+    
+    TBool removeChanged = RemoveChangedApps( );     
+    
+    TBool removeMissing = RemoveMissingApps( uidArray );     
+    
+    TBool drmChanged = CheckDrmAppsL( appArray );
+    
+    CleanupStack::PopAndDestroy( &uidArray );        
+    CleanupStack::PopAndDestroy( &appArray );
+    CleanupStack::PopAndDestroy( &mcsItems );
+    
+    if ( removeChanged || removeMissing || drmChanged )
+        {
+        iObserver.HandleDrmAppEvent();    
+        }        
+    iOpStatus = EFalse;
+    }
+
+// ---------------------------------------------------------
+// CMcsDrmScanner::GetMcsItemsL
+// ---------------------------------------------------------
+//
+void CMcsDrmScanner::GetMcsAppItemsL( RArray<TMenuItem>& aArray )
+    {
+    TInt root;
+    iSrvEng.Engine().RootFolderL( root );
+    TMenuSrvTypeFilter appFilter;
+    appFilter.SetType( KMenuTypeApp() );
+    iSrvEng.Engine().GetItemsL( aArray, root, &appFilter, ETrue );
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+const RArray<TUid>& CMcsDrmScanner::DrmExpiredAppArray()
+    {
+    return iDrmExpiredAppArray;
+    }
+
+// ---------------------------------------------------------
+//
+// ---------------------------------------------------------
+//
+const RArray<TUid>& CMcsDrmScanner::DrmProtectedAppArray()
+    {
+    return iDrmProtectedAppArray;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CMcsDrmScanner::Scan()
+    {
+    if ( !IsActive() && !iOpStatus )
+        {
+        iOpStatus = ETrue;
+        TRequestStatus* ownStatus = &iStatus;
+        *ownStatus = KRequestPending;
+        SetActive();
+        User::RequestComplete( ownStatus, KErrNone );
+        } 
+    }  
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void CMcsDrmScanner::RemoveObserverAndScanL( TUid aUid )
+    {
+    iChangedAppArray.AppendL( aUid );
+    Scan( );
+    }
+    
+// End of File