telephonyprotocols/pdplayer/src/mbmsengine.cpp
changeset 0 3553901f7fa8
child 15 fc69e1e37771
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyprotocols/pdplayer/src/mbmsengine.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,369 @@
+// Copyright (c) 2008-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:
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include "mbmsengine.h"
+#include "pdpservices.h"
+#include <commsdattypesv1_1.h>
+
+using namespace ESock;
+using namespace ConnectionServ;
+using namespace CommsDat;
+using namespace Messages;
+
+//This function retrieves the phone information.
+void GetPhoneInfoL(RTelServer& aTelServer, const TDesC& aLoadedTsyName, RTelServer::TPhoneInfo& aInfo);
+
+//Constructor for CMBMSEngine
+CMBMSEngine::CMBMSEngine(const TNodeId& aMbmsTMCommsId, MPacketServiceNotifier& aPacketServiceNotifier)
+	:CActive(EPriorityStandard),
+	iMbmsTMCommsId(aMbmsTMCommsId),
+	iPacketServiceNotifier(aPacketServiceNotifier)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+/**
+The NewL factory function for CMBMSEngine.
+@param aMBMSTMCommsId comms Id.
+@param aClientId Node Channel Id.
+@param aRequestType Message Id
+@param aRequestBundleOwner Parameter Bundle.
+@return CMBMSEngine*
+*/
+CMBMSEngine* CMBMSEngine::NewL(const TNodeId& aMbmsTMCommsId, MPacketServiceNotifier& aPacketServiceNotifier)
+	{
+	CMBMSEngine* self = new(ELeave) CMBMSEngine(aMbmsTMCommsId, aPacketServiceNotifier);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+/**
+Destructor for CMBMSEngine.
+*/
+CMBMSEngine::~CMBMSEngine()
+	{
+	iPacketService.Close();
+	iPhone.Close();
+	iTelServer.Close();
+
+	iMBMSRequestList.ResetAndDestroy();
+	}
+/**
+ConstructL for CMBMSEngine.
+*/
+void CMBMSEngine::ConstructL()
+	{
+	InitialisePhoneL();
+	iPendingRequests = EFalse;
+	}
+/**
+This function is used to find the MBMS request from the list based on the client Id.
+@param aClientId The reference to TCFNodeChannelId
+@return TUint
+*/
+TUint CMBMSEngine::GetRequestElementL(const TRuntimeCtxId& aNodeCtxId)
+	{
+	TBool findMBMSRequest = EFalse;
+	TInt index = 0;
+	for (;index < iMBMSRequestList.Count(); index++)
+		{
+		if(aNodeCtxId == iMBMSRequestList[index]->GetClientId())
+			{
+			findMBMSRequest = ETrue;
+			break;
+		    }
+		}
+	if(!findMBMSRequest)
+	   User::Leave(KErrNotFound);
+
+	return index;
+	}
+
+/**
+This function is used to remove requests from the list.
+@param aClientId The  reference to TCFNodeChannelId
+@return void
+*/
+void CMBMSEngine::RemoveFromRequestListL(const Messages::TRuntimeCtxId& aNodeCtxId)
+	{
+	TUint index = GetRequestElementL(aNodeCtxId);
+	DeleteIndexElement(index);
+	}
+/**
+This function is used to delete the request object fron the indexed list.
+@param aIndex TUint
+@return void
+*/
+void CMBMSEngine::DeleteIndexElement(TUint aIndex)
+	{
+	delete iMBMSRequestList[aIndex];
+	iMBMSRequestList[aIndex] = NULL;
+	iMBMSRequestList.Remove(aIndex);
+    iMBMSRequestList.Compress();
+
+    //check for any pending requests
+	CheckPendingRequests();
+	}
+
+/**
+This function is used to cancel any outstanding request and remove it from the list.
+@param aClientId The  reference to TCFNodeChannelId
+@return void
+*/
+void CMBMSEngine::CancelAndRemoveFromRequestListL(const Messages::TRuntimeCtxId& aNodeCtxId)
+	{
+	TUint index = GetRequestElementL(aNodeCtxId);
+	iMBMSRequestList[index]->CancelMessage(KErrCancel);
+	DeleteIndexElement(index);
+	}
+
+/**
+This function is used to check whether any outstanding requests are there or not.
+In case if any outstanding requests are there,active the requests at the head of the list.
+@return void
+*/
+void CMBMSEngine::CheckPendingRequests()
+	{
+	if((iMBMSRequestList.Count() > 0) && (!iMBMSRequestList[0]->IsActive()))
+	 	{
+		//activate the requests at the head of the list.
+		iMBMSRequestList[0]->StartRequest();
+		}
+	}
+
+/**
+This function is used to check whether the MBMS query is valid or not.If valid,
+create an object of CMBMSServiceRequest and store in a list for later use.
+@param aCFMessage The  reference to Messages::TSignatureBase
+@return void
+*/
+void CMBMSEngine::AddToRequestListL(
+		Messages::RNodeInterface* aNodeInterface,
+		const Messages::TRuntimeCtxId& aNodeCtxId,
+		const Messages::TNodeSignal::TMessageId& aRequestType,
+		CRefCountOwnedParameterBundle* aRequestBundleOwner
+			)
+	{
+	TUint mbmsQueryCount = 0;
+	//the below enums are initialised to EBearerAvailability to avoid Armv5 warnings.
+	XMBMSServiceQuerySet::TQueryType previousQuery = XMBMSServiceQuerySet::EBearerAvailability ;
+	XMBMSServiceQuerySet::TQueryType currentQuery  = XMBMSServiceQuerySet::EBearerAvailability;
+
+	const ConnectionServ::CConnectionServParameterBundle* mbmsParamsBundle1 = static_cast<const CConnectionServParameterBundle*>(aRequestBundleOwner->Ptr());
+	if(!mbmsParamsBundle1)
+	   User::Leave(KErrNotFound);
+
+	ConnectionServ::CConnectionServParameterBundle* mbmsParamsBundle = const_cast<CConnectionServParameterBundle *>(mbmsParamsBundle1);
+
+    //get the cout of Containers
+	TUint containerCount = mbmsParamsBundle->CountParamSetContainers();
+
+	//leave if Container is empty
+	if (containerCount == 0)
+		{
+		User::Leave(KErrArgument);
+		}
+
+	TBool checkMBMSQuery = EFalse;
+	for(TUint i = 0; i < containerCount; i++)
+		{
+		CParameterSetContainer* objectPSC = mbmsParamsBundle->GetParamSetContainer(i);
+		XMBMSServiceQuerySet* queryMBMS = XMBMSServiceQuerySet::FindInParamSetContainer(*objectPSC);
+
+		//pick only MBMS Query Types.
+		if(!queryMBMS)
+		   continue;
+
+		if(queryMBMS)
+		   checkMBMSQuery = ETrue;
+
+		//leave if there are more than one type of MBMS query in the bundle.
+		currentQuery = queryMBMS->GetQueryType();
+		//leave if query is not set.
+		if(currentQuery<0)
+		  User::Leave(KErrArgument);
+
+		//check whether the bundle has got only MBMS queries.
+		if(mbmsQueryCount>0)
+		  {
+		  if(currentQuery != previousQuery)
+		   	{
+		   	User::Leave(KErrArgument);
+		   	}
+		  }
+		previousQuery = currentQuery;
+		mbmsQueryCount++;
+		}
+	//leave if no MBMS query found.
+	if(!checkMBMSQuery)
+	  User::Leave(KErrArgument);
+
+	//store the CMBMSServiceRequest in a list.
+	CMBMSServiceRequest* newServiceRequest = CMBMSServiceRequest::NewL(
+			*this,
+			iMbmsTMCommsId,
+			aNodeInterface,
+			aNodeCtxId,
+			aRequestType,
+			aRequestBundleOwner,
+			currentQuery
+			);
+	CleanupStack::PushL(newServiceRequest);
+	iMBMSRequestList.AppendL(newServiceRequest);
+	CleanupStack::Pop(newServiceRequest);
+
+	//start the requests if none of the requests are pending.
+	CheckPendingRequests();
+	}
+/**
+Function to initialize the phone settings
+@return TBool
+*/
+TBool CMBMSEngine::InitialisePhoneL()
+	{
+#ifdef SYMBIAN_NON_SEAMLESS_NETWORK_BEARER_MOBILITY
+	CMDBSession* dbSession = CMDBSession::NewL(KCDVersion1_2);
+#else
+	CMDBSession* dbSession = CMDBSession::NewL(KCDVersion1_1);
+#endif
+    CleanupStack::PushL(dbSession);
+
+	CMDBRecordSet<CCDGlobalSettingsRecord> globalSettingsRecord(KCDTIdGlobalSettingsRecord);
+    TRAPD(err, globalSettingsRecord.LoadL(*dbSession));
+    if(err != KErrNone)
+      {
+      User::Leave(KErrNotFound);
+      }
+
+    CCDModemBearerRecord *modemBearerRecord = static_cast<CCDModemBearerRecord*>(CCDRecordBase::RecordFactoryL(KCDTIdModemBearerRecord));
+    CleanupStack::PushL(modemBearerRecord);
+
+    modemBearerRecord->SetRecordId(((CCDGlobalSettingsRecord*)globalSettingsRecord.iRecords[0])->iModemForPhoneServicesAndSMS);
+    TRAPD(err1,modemBearerRecord->LoadL(*dbSession));
+
+    if(err1 != KErrNone)
+      {
+      User::Leave(KErrNotFound);
+      }
+
+    TName tsyName;
+    tsyName = modemBearerRecord->iTsyName;
+    //leave if not able to read Tsy name.
+    if(tsyName.Length() == 0)
+	  {
+      User::Leave(KErrNotFound);
+	  }
+
+    CleanupStack::PopAndDestroy(modemBearerRecord);
+    CleanupStack::PopAndDestroy(dbSession);
+
+    User::LeaveIfError(iTelServer.Connect());
+	User::LeaveIfError(iTelServer.LoadPhoneModule(tsyName));
+	User::LeaveIfError(iTelServer.SetExtendedErrorGranularity(RTelServer::EErrorExtended));
+
+	//Open telephony server
+	GetPhoneInfoL(iTelServer,tsyName,iPhoneInfo);
+
+	//Open phone
+	User::LeaveIfError(iPhone.Open(iTelServer,iPhoneInfo.iName));
+	//Get phone status
+	iPhone.GetStatus(iPhoneStatus);
+
+	SetActive();
+	iPhoneState = EInitialising;
+
+	TRequestStatus* status = &iStatus;
+	User::RequestComplete(status, KErrNone);
+
+	return ETrue;
+	}
+
+/**
+This is CActive overloaded function.Cancel all outstanding requests.
+@param None
+@return Void
+*/
+void CMBMSEngine::DoCancel()
+	{
+    iPhone.InitialiseCancel();
+	}
+
+/**
+This is CActive overloaded function.
+@param None
+@return TInt
+*/
+TInt CMBMSEngine::RunError(TInt /*aError*/)
+	{
+	Cancel();
+	return KErrNone;
+	}
+
+/**
+This is CActive overloaded function.
+@param None
+@return Void
+*/
+void CMBMSEngine::RunL()
+	{
+	TRequestStatus* status = &iStatus;
+	if (iStatus == KErrNone)
+		{
+		switch(iPhoneState)
+			{
+			case EInitialising:
+				if(iPhoneStatus.iMode==RPhone::EModeUnknown)
+					{
+					iPhone.Initialise(iStatus);
+					}
+				else
+					{
+					User::RequestComplete(status, KErrNone);
+					}
+				SetActive();
+				iPhoneState = ESetAttachMode;
+			break;
+	       	case ESetAttachMode:
+				//Open packet service
+				User::LeaveIfError(iPacketService.Open(iPhone));
+
+				//Put phone is attachwhenpossible mode.
+				//In this mode, the phone will try to attach to the gprs network whenever it can.
+				iPacketService.SetAttachMode(iStatus, RPacketService::EAttachWhenNeeded);
+				iPhoneState = EAttachModeComplete;
+				SetActive();
+			break;
+			case EAttachModeComplete:
+			iPacketServiceNotifier.PacketServiceAttachedCallbackL();
+			break;
+			}
+		}
+	}
+
+/**
+Function to retrieve the RPacketService Instance
+@return RPacketService&
+*/
+RPacketService& CMBMSEngine::GetRPacketService()
+	{
+	return iPacketService;
+	}