menucontentsrv/srvsrc/mcsdrmhandler.cpp
changeset 0 79c6a41cd166
child 118 8baec10861af
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/menucontentsrv/srvsrc/mcsdrmhandler.cpp	Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,234 @@
+/*
+* Copyright (c) 2002-2005 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:  Used for receive SIM Application name, icon or 
+*                visibility information.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <sacls.h>
+#include <javaregistry.h>
+#include <javaregistrypackageentry.h>
+#include <javaregistryapplicationentry.h>
+#include <javadomainpskeys.h>
+#include "mcsdrmhandler.h"
+#include "mcsdrmscanner.h"
+#include "mcsmenunotifier.h"
+#include "menueng.h"
+#include "menusrveng.h"
+#include "menusrvengutils.h"
+#include "mcscachehandler.h"
+#include "mcsdef.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+// -----------------------------------------------------------------------------
+// CMcsDrmHandler::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+
+CMcsDrmHandler* CMcsDrmHandler::NewL( 
+    CMenuSrvEng& aSrvEng,
+    CMenuSrvEngUtils& aUtils,
+    CMcsCacheHandler& aCacheHandler )
+    {
+    CMcsDrmHandler* self = new( ELeave ) 
+            CMcsDrmHandler( aSrvEng, aUtils, aCacheHandler );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------    
+// Destructor
+// -----------------------------------------------------------------------------
+CMcsDrmHandler::~CMcsDrmHandler()
+    {
+    delete iInstallNotifier;
+    delete iScanner;
+    iObserversManager.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// CMcsDrmHandler::CMcsDrmHandler
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CMcsDrmHandler::CMcsDrmHandler( 
+    CMenuSrvEng& aSrvEng,
+    CMenuSrvEngUtils& aUtils,
+    CMcsCacheHandler& aCacheHandler ): 
+    iObserversManager( aUtils ), iSrvEng( aSrvEng ),
+    iUtils( aUtils ), iCacheHandler( aCacheHandler )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CMcsDrmHandler::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CMcsDrmHandler::ConstructL()
+    {
+    iScanner = CMcsDrmScanner::NewL( *this, iSrvEng, iUtils );
+	iInstallNotifier = CMcsInstallNotifier::NewL(*this, KPSUidJavaLatestInstallation);
+
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//    
+TInt CMcsDrmHandler::AppFolderIdL( TUid aUid )
+    {
+    RArray<TMenuItem> mcsItems; 
+    CleanupClosePushL( mcsItems );
+    
+    TInt root;
+    iSrvEng.Engine().RootFolderL( root );
+    TMenuSrvTypeAttrFilter appFilter;
+    appFilter.SetType( KMenuTypeApp() );   
+    
+    TBuf<KUidChars> uidString;
+    MenuSrvUtil::UidToStringL( aUid.iUid, uidString, 0, EHex );
+    
+    appFilter.SetAttr( KMenuAttrUid(), uidString );
+    iSrvEng.Engine().GetItemsL( mcsItems, root, &appFilter, ETrue );
+    
+    TInt folderId = KErrNotFound;
+    if (mcsItems.Count())
+        {
+        folderId = mcsItems[0].Parent();
+        iCacheHandler.HandleRemoveAttribute(mcsItems[0].Id(), KMenuAttrDrmProtection);
+        }
+    
+    CleanupStack::PopAndDestroy( &mcsItems );
+    return folderId;
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//     
+void CMcsDrmHandler::HandleDrmEvent( TUid aUid )
+    {
+    TRAP_IGNORE(
+    		iSrvEng.Engine().AppendNotifyL( AppFolderIdL( aUid ), 
+    				RMenuNotifier::EItemAttributeChanged );
+    		iScanner->RemoveObserverAndScanL( aUid );
+				);
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//     
+void CMcsDrmHandler::HandleDrmAppEvent()
+    {
+    TRAP_IGNORE( AddRemoveObserversL(
+        iScanner->DrmProtectedAppArray() ) );     
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//     
+void CMcsDrmHandler::AddRemoveObserversL( 
+	const RArray<TUid>& aDrmProtectedArray )
+    {
+    iObserversManager.RemoveMissingObservers( aDrmProtectedArray );    
+    iObserversManager.CreateObserversL( aDrmProtectedArray, *this );
+    }    
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//        
+void CMcsDrmHandler::EngineEvents( TInt /*aFolder*/, TInt aEvents )
+    {
+    if ( aEvents & RMenuNotifier::EItemsAddedRemoved )
+        {
+        iScanner->Scan();
+        }    
+    }
+
+// ---------------------------------------------------------
+// CMcsDrmHandler::HandleInstallNotifyL
+// ---------------------------------------------------------
+//
+void CMcsDrmHandler::HandleInstallNotifyL( TInt aPackageUid )
+	{
+	RArray<TUid> uids;
+	CleanupClosePushL( uids );
+
+	Java::CJavaRegistry* javaRegistry;
+	javaRegistry = Java::CJavaRegistry::NewLC();
+
+	Java::CJavaRegistryEntry* regEntry = 
+		javaRegistry->RegistryEntryL( TUid::Uid(aPackageUid) );
+
+	if( regEntry )
+		{
+	CleanupStack::PushL( regEntry );
+
+	Java::TJavaRegistryEntryType entryType = regEntry->Type();
+	
+	if ( ( entryType >= Java::EGeneralPackage ) && 
+			(entryType < Java::EGeneralApplication) )
+		{
+		//package entry
+		Java::CJavaRegistryPackageEntry* regPackageEntry = 
+					static_cast<Java::CJavaRegistryPackageEntry*>( regEntry );
+			regPackageEntry->GetEmbeddedEntries( uids );
+			}
+		else 
+			{
+			//application entry
+			uids.AppendL( regEntry->Uid() );
+			}
+		
+		CleanupStack::PopAndDestroy( regEntry );
+	    for ( TInt i = 0; i< uids.Count(); i++ )
+	        {
+	        if ( ( iScanner->DrmExpiredAppArray()).Find(uids[i]) != KErrNotFound )
+	            {
+	            HandleDrmEvent( uids[i] );
+	            }
+	        else
+	            {
+	            iObserversManager.RefreshObserverL( iScanner->DrmProtectedAppArray(), 
+	                    uids[i], *this );
+	            }
+	        }
+		}
+	else
+	    {
+	    for ( TInt i = 0; i< iScanner->DrmProtectedAppArray().Count(); i++ )
+	        {
+            iObserversManager.RefreshObserverL( iScanner->DrmProtectedAppArray(), 
+        		   iScanner->DrmProtectedAppArray()[i], *this );
+	        }
+	    for ( TInt i = 0; i< iScanner->DrmExpiredAppArray().Count(); i++ )
+	        {
+	        HandleDrmEvent( iScanner->DrmExpiredAppArray()[i] );
+	        }	    
+	    }
+	
+	
+	CleanupStack::PopAndDestroy( javaRegistry );
+	CleanupStack::PopAndDestroy( &uids );
+    }
+
+
+//  End of File