telephonyserverplugins/common_tsy/commontsy/src/mmpacket/cmmmbmsmonitoredlist.cpp
changeset 0 3553901f7fa8
child 19 630d2f34d719
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/common_tsy/commontsy/src/mmpacket/cmmmbmsmonitoredlist.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,456 @@
+// Copyright (c) 2006-2009 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:
+//
+
+
+
+// INCLUDE FILES
+#include <etelpckt.h>
+#include <pcktlist.h>
+#include "mbmstypes.h"
+#include "cmmmbmsmonitoredlist.h"
+#include <ctsy/tflogger.h>
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+CMmMBMSMonitoredList::CMmMBMSMonitoredList()
+    {
+    }
+    
+CMmMBMSMonitoredList* CMmMBMSMonitoredList::NewL(
+    CMmPacketServiceTsy* aMmPacketService,
+    TInt aMaxEntries )
+    {
+    CMmMBMSMonitoredList* monitoredList = new ( ELeave ) CMmMBMSMonitoredList();
+
+    CleanupStack::PushL( monitoredList );
+    
+    monitoredList->ConstructL(aMmPacketService, aMaxEntries);
+    CleanupStack::Pop();
+    
+    return monitoredList;            
+    }
+    
+void CMmMBMSMonitoredList::ConstructL(CMmPacketServiceTsy* aMmPacketService, TInt aMaxEntries)    
+    {
+    iMmPacketService = aMmPacketService;
+    iServiceList = CPcktMbmsMonitoredServiceList::NewL(); 
+    iServiceList->SetMaxNumberEntries(aMaxEntries);
+    }
+
+CMmMBMSMonitoredList::~CMmMBMSMonitoredList()
+    {
+    if(iServiceList != NULL)
+    	{
+        delete iServiceList;
+        iServiceList = NULL;
+    	}
+    if(iMbmsMonitoredListData.iListOfChanges != NULL)
+    	{
+    	delete iMbmsMonitoredListData.iListOfChanges;
+    	iMbmsMonitoredListData.iListOfChanges = NULL;   
+    	}
+    }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSMonitoredList::SaveReqUpdValues
+// Save changes to temp list
+// ---------------------------------------------------------------------------
+// 
+TInt CMmMBMSMonitoredList::SaveUpdateValuesToTempL( 
+	TDes8* aList, 
+	TMbmsAction aAction )
+	{
+	TInt ret( KErrNone );	
+
+	iMbmsMonitoredListData.iActionType = aAction;
+	iMbmsMonitoredListData.iServiceList = iServiceList;
+	
+	if(iMbmsMonitoredListData.iListOfChanges == NULL)
+		{
+		iMbmsMonitoredListData.iListOfChanges = CPcktMbmsMonitoredServiceList::NewL();	
+		}
+
+	if( aList == NULL )
+		{
+		while( iMbmsMonitoredListData.iListOfChanges->Enumerate() > 0 )
+			{
+			iMbmsMonitoredListData.iListOfChanges->DeleteEntryL(0);
+			}
+		}
+	else
+		{
+		iMbmsMonitoredListData.iListOfChanges->RestoreL(*aList);
+		
+		if( ( EAddEntries == aAction ) || ( ERemoveEntries == aAction ))
+			{
+			RPacketService::TMbmsServiceAvailabilityV1 entry;
+			TInt i = 0;
+			while(i != iMbmsMonitoredListData.iListOfChanges->Enumerate() )
+			    {
+				entry = iMbmsMonitoredListData.iListOfChanges->GetEntryL(i);
+	            // check if entry already exists in service list
+	            if( ( ( EntryExistL( entry ) ) && ( EAddEntries == aAction )) ||
+	            	( (!EntryExistL( entry ) ) && ( ERemoveEntries == aAction)))
+	            	{
+	            	iMbmsMonitoredListData.iListOfChanges->DeleteEntryL(i);
+	                }
+	             else
+	            	{
+		            i++;                	
+		            }
+	            }
+	        if( 0 == iMbmsMonitoredListData.iListOfChanges->Enumerate())	
+		        {
+		        ret = KErrAlreadyExists;
+		        ResetTempListL();
+		        }
+			}
+		}
+	
+	return ret;
+	
+	}
+
+// ---------------------------------------------------------------------------
+// CMmMBMSMonitoredList::PackData()
+// Pack data to send to the LTSY
+// ---------------------------------------------------------------------------
+// 
+TInt CMmMBMSMonitoredList::PackDataL()
+ 	{
+ 	
+    TInt ret( KErrNone );
+
+ 	CMmDataPackage dataPackage;
+ 	switch( iMbmsMonitoredListData.iActionType )
+ 		{
+ 		case ERemoveAllEntries:
+ 			// pack data (old list + action)
+ 			ResetTempListL(); 
+ 			//No break since we stll need to pack
+ 		case EAddEntries:
+ 		case ERemoveEntries:
+ 			// Pack data (old list + change list + action)
+       		dataPackage.PackData( &iMbmsMonitoredListData ); 
+       		 ret = iMmPacketService->MessageManager()->HandleRequestL(EPacketUpdateMbmsMonitorServiceList, &dataPackage);
+ 			break;
+ 		default:
+            ret = KErrNotSupported;  
+            break;
+ 		}
+ 	if( KErrNone != ret )
+	 	{
+	 	ResetTempListL();
+	 	}
+ 		
+ 	return ret;
+ 	}
+
+// ---------------------------------------------------------------------------
+// CMmMBMSMonitoredList::ProcessEntriesL
+// Packet Data specific functionality of CMmPacketContextTsy::ExtFunc
+// ---------------------------------------------------------------------------
+//         
+TInt CMmMBMSMonitoredList::ProcessEntriesL( 
+    const CPcktMbmsMonitoredServiceList *aList, 
+    TMbmsAction aAction )
+    {    
+    TInt ret( KErrNone );
+    
+    switch( aAction )
+        {
+        case EAddEntries:
+            ret = AddTempEntriesToCacheL( aList );
+            break;
+        case ERemoveEntries:
+            DeleteEntriesL( aList );
+            break;
+        case ERemoveAllEntries: 
+            ClearListL( iServiceList );
+            break;
+        default:
+            ret = KErrNotSupported;
+            break;                   
+        }
+    return ret;
+    }
+    
+// ---------------------------------------------------------------------------
+// CMmMBMSMonitoredList::AddEntries
+// Add new entry/entries into monitored service list
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//    
+TInt CMmMBMSMonitoredList::AddEntriesL( const CPcktMbmsMonitoredServiceList *aList )    
+    {
+    // verify we dont cause overflow
+    if(iServiceList->Enumerate() + aList->Enumerate() >= iServiceList->MaxNumberEntries() )
+    	{
+    	return KErrOverflow;
+    	}
+    TInt size = aList->Enumerate();
+    for( TInt i = 0; i < size; ++i)
+    	{
+    	if( EntryExistL( aList->GetEntryL(i) ) )
+    		{
+    		return KErrAlreadyExists;
+    		}
+    	}
+    for( TInt i = 0; i < size; ++i)
+    	{
+    	iServiceList->AddEntryL( aList->GetEntryL(i) );
+    	}
+    return KErrNone;
+    }
+    
+   
+// ---------------------------------------------------------------------------
+// CMmMBMSMonitoredList::DeleteEntriesL
+// Remove entry/entries from monitored service list
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//     
+void CMmMBMSMonitoredList::DeleteEntriesL( const CPcktMbmsMonitoredServiceList *aList )  
+    {
+    
+    if( iMbmsMonitoredListData.iListOfChanges == NULL )
+    	{
+    	return ;
+    	}
+    // those entries should not be removed
+    if( aList )
+	    {
+	   	// check if entries could not be added 
+		if( aList->Enumerate() > 0 )
+			{
+			
+			//iterate through failed entries vs. iMbmsMonitoredListData.iListOfChanges
+	    	for( TInt i = 0; i < iMbmsMonitoredListData.iListOfChanges->Enumerate(); i++ )
+			    {
+			    for(TInt j = 0; j < aList->Enumerate(); j++ )
+				    {
+				    //if entry could not be removed -> remove it from temp list
+				    //if no match found. leave it into temp list
+			       	if( iMbmsMonitoredListData.iListOfChanges->GetEntryL(i).iTmgi.GetServiceId() == aList->GetEntryL(j).iTmgi.GetServiceId() )
+			            {
+			            iMbmsMonitoredListData.iListOfChanges->DeleteEntryL(i);
+			           	j= aList->Enumerate();
+			           	i--;
+					    }
+				    }
+			    }
+			}
+	    }
+
+	// temp list is up-to-date
+    // remove entries in temp list from the main list
+    for( TInt i = 0; i < iMbmsMonitoredListData.iListOfChanges->Enumerate(); i++ )
+		{
+		//iterate through temo list vs. main list
+    	for( TInt ii = 0; ii < iServiceList->Enumerate(); )
+		    {
+		    //if entry could not be removed -> remove it from services list
+		    //if no match found. leave it into temp list
+	       	if( iMbmsMonitoredListData.iListOfChanges->GetEntryL(i).iTmgi.GetServiceId() == 
+	       		iServiceList->GetEntryL(ii).iTmgi.GetServiceId())
+	            {
+	           	iServiceList->DeleteEntryL(ii);
+			    }
+	       	else
+	       		{
+	       		++ii;
+	       		}
+		    }
+		
+		}
+    }
+
+	    
+	        
+// ---------------------------------------------------------------------------
+// CMmMBMSMonitoredList::ClearListL
+// Clear given service list
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//      
+void CMmMBMSMonitoredList::ClearListL( CPcktMbmsMonitoredServiceList *aList )    
+    {
+    
+	while(aList->Enumerate() > 0 )
+		{
+		aList->DeleteEntryL(0);	
+		}
+    }
+   
+// ---------------------------------------------------------------------------
+// CMmMBMSMonitoredList::EntryExistL
+// Clear given service list
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//      
+TBool CMmMBMSMonitoredList::EntryExistL( const RPacketService::TMbmsServiceAvailabilityV1 &aEntry )    
+    {
+    
+    for( TInt i = 0; i < iServiceList->Enumerate(); i++ )
+        {
+        if( aEntry.iTmgi.GetServiceId() == iServiceList->GetEntryL(i).iTmgi.GetServiceId() )
+            {
+            return ETrue;
+            }        
+        }
+    return EFalse;
+    
+    }
+  
+// ---------------------------------------------------------------------------
+// CMmMBMSMonitoredList::NumberOfMonitoredList
+// This function returns the number of monitored service list.
+// ---------------------------------------------------------------------------
+//
+TInt CMmMBMSMonitoredList::NumberOfMonitoredList() 
+    {
+    return iServiceList->Enumerate();
+    }
+
+// ---------------------------------------------------------------------------
+// CMmMBMSMonitoredList::SetServicesAvailabilityL
+// This function sets the availability status of the service list.
+// ---------------------------------------------------------------------------
+//  
+void CMmMBMSMonitoredList::SetServicesAvailabilityL(CPcktMbmsMonitoredServiceList *aAvailableList)
+	{
+	if ( aAvailableList )
+		{
+#ifndef USING_CTSY_DISPATCHER
+		//if the available list is empty (i.e. no services) then all entries in
+		//the service list should be marked unavailable
+		//the header says aAvailableList is  "a list of services that should be set to available (the rest will be unavailable)"
+		//this check prevents the the services being marked unavilable in the case the list is empty
+		if (aAvailableList->Enumerate() > 0)
+#endif //USING_CTSY_DISPATCHER
+			{
+			RPacketService::TMbmsServiceAvailabilityV1 updEntry;
+			RPacketService::TMbmsServiceAvailabilityV1 origEntry;
+			
+			//Set available status to EMbmsUnavailable
+			for( TInt index1 = 0; index1 < iServiceList->Enumerate(); index1++ )
+				{
+				origEntry = iServiceList->GetEntryL(index1);
+				origEntry.iMbmsAvailabilityStatus = EMbmsUnavailable;
+				iServiceList->ChangeEntryL(index1, origEntry);
+				}
+			
+			// check throught the updated monitor list
+			for( TInt index2 = 0; index2 < aAvailableList->Enumerate(); index2++ )
+				{
+				updEntry = aAvailableList->GetEntryL(index2);
+				
+				// Seach same entry to original list
+				for( TInt index3 = 0; index3 < iServiceList->Enumerate(); index3++ )
+					{
+					origEntry = iServiceList->GetEntryL(index3);
+					
+					if (origEntry.iTmgi.GetServiceId() == updEntry.iTmgi.GetServiceId())
+						{
+						// availability status is EMbmsAvailable
+						origEntry.iMbmsAvailabilityStatus = EMbmsAvailable;
+						iServiceList->ChangeEntryL(index3, origEntry);
+						}
+					}
+				}
+			}
+		}
+	}
+	
+// ---------------------------------------------------------------------------
+// CMmMBMSMonitoredList::AddTempEntriesToCache
+// This function add the succesfully added monitor entries to main monitor service
+// list
+// ---------------------------------------------------------------------------
+//  	
+TInt CMmMBMSMonitoredList::AddTempEntriesToCacheL(const CPcktMbmsMonitoredServiceList* aFailedMonitorEntries)
+	{
+	
+	if(iMbmsMonitoredListData.iListOfChanges == NULL)
+		{
+		return KErrNone;
+		}
+	// some entries could not be removed->update temp list for 
+    if( aFailedMonitorEntries )
+	    {
+	    //iterate through failed entries vs. iMbmsMonitoredListData.iListOfChanges
+	    for(TInt j = 0; j < aFailedMonitorEntries->Enumerate(); j++ )
+	    	{
+	    	for( TInt i = 0; i < iMbmsMonitoredListData.iListOfChanges->Enumerate(); i++ )
+	    		{
+	    		//if entry could not be removed -> remove it from temp list
+	    		//if no match found. leave it into temp list
+	    		if( iMbmsMonitoredListData.iListOfChanges->GetEntryL(i).iTmgi.GetServiceId() ==	    		
+	    			aFailedMonitorEntries->GetEntryL(j).iTmgi.GetServiceId() )
+	    			{
+	    			//delete failed entry fom temp list before append them to main list
+	    			iMbmsMonitoredListData.iListOfChanges->DeleteEntryL(i);
+	    			i = iMbmsMonitoredListData.iListOfChanges->Enumerate();
+	    			}
+	    		}
+	    	}
+	    }
+	
+    if( iMbmsMonitoredListData.iListOfChanges->Enumerate() + iServiceList->Enumerate() >= 
+    		iServiceList->MaxNumberEntries() )
+    	{
+    	return KErrOverflow;
+    	}
+	// temp list is up-to-date
+    // temporary saved entries can be added to the main list
+	for(TInt i=0;i < iMbmsMonitoredListData.iListOfChanges->Enumerate(); i++)
+		{
+		iServiceList->AddEntryL(iMbmsMonitoredListData.iListOfChanges->GetEntryL(i));
+		}
+	ResetTempListL();
+	return  KErrNone;
+	}
+	
+// ---------------------------------------------------------------------------
+// CMmMBMSMonitoredList::ResetTempListL
+// This function clears the temporary monitors service list e.g. in case of timeout
+// 
+// ---------------------------------------------------------------------------
+//  		
+void CMmMBMSMonitoredList::ResetTempListL()
+	{
+	if(iMbmsMonitoredListData.iListOfChanges != NULL)
+		{
+		ClearListL(iMbmsMonitoredListData.iListOfChanges);	 
+		delete iMbmsMonitoredListData.iListOfChanges;
+		iMbmsMonitoredListData.iListOfChanges = NULL;
+		}
+	}
+		
+
+// ---------------------------------------------------------------------------
+// CMmMBMSMonitoredList::ServiceList
+// This function return a pointer to the service list
+// 
+// ---------------------------------------------------------------------------
+//  		
+CPcktMbmsMonitoredServiceList* CMmMBMSMonitoredList::ServiceList()
+	{
+	return iServiceList;
+	}
+
+//  End of File 
+