diff -r 000000000000 -r 96612d01cf9f videofeeds/server/IptvNetworkSelection/src/CIptvNetworkSelectionMsgHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videofeeds/server/IptvNetworkSelection/src/CIptvNetworkSelectionMsgHandler.cpp Mon Jan 18 20:21:12 2010 +0200 @@ -0,0 +1,397 @@ +/* +* Copyright (c) 2005-2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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 + +#include "IptvClientServerCommon.h" +#include "CIptvNetworkSelection.h" +#include "CIptvNetworkSelectionMsgHandler.h" +#include "MIptvServiceManagementClientObserver.h" +#include "CIptvServer.h" +#include "IptvDebug.h" + +// EXTERNAL DATA STRUCTURES +// EXTERNAL FUNCTION PROTOTYPES +// CONSTANTS +// MACROS +// LOCAL CONSTANTS AND MACROS +// MODULE DATA STRUCTURES +// LOCAL FUNCTION PROTOTYPES + +// FORWARD DECLARATIONS + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CIptvNetworkSelectionMsgHandler::CIptvNetworkSelectionMsgHandler +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CIptvNetworkSelectionMsgHandler::CIptvNetworkSelectionMsgHandler(CIptvServer& aServer) +: iServer(aServer) + { + iMsgPending = EIptvEngineNone; + } + +// ----------------------------------------------------------------------------- +// CIptvNetworkSelectionMsgHandler::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CIptvNetworkSelectionMsgHandler* CIptvNetworkSelectionMsgHandler::NewL(CIptvServer& aServer) + { + CIptvNetworkSelectionMsgHandler* self = + new( ELeave ) CIptvNetworkSelectionMsgHandler( aServer ); + + return self; + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +// +CIptvNetworkSelectionMsgHandler::~CIptvNetworkSelectionMsgHandler() + { + delete iIpcMsg; + } + +// ------------------------------------------------------------------ +// CIptvNetworkSelectionMsgHandler::HandleMsgL +// ------------------------------------------------------------------ +// +void CIptvNetworkSelectionMsgHandler::HandleMsgL(const RMessage2& aMessage) + { + IPTVLOGSTRING_LOW_LEVEL("CIptvNetworkSelectionMsgHandler::HandleMsgL()"); + + switch ( aMessage.Function() ) + { + + case EIptvEngineNsSetUsedIap: + { + /* EIptvEngineNsSetUsedIap message format: + * ------------------------------- + * TUint32 aIapId + * TUint32 aServiceId + * TUint8 aSetToDefaultForService + * ------------------------------- + */ + + /* EIptvEngineNsSetUsedIap response message format + * -------------------- + * TUint8 aRespStatus + * -------------------- + */ + + /* Get IPC message */ + TUint32 ipcMsgSize = aMessage.GetDesLengthL(0); + HBufC8* ipcMsg; + ipcMsg = HBufC8::NewL(ipcMsgSize); + CleanupStack::PushL(ipcMsg); // 1-> + ipcMsg->Des().Zero(); + TPtr8 ipcMsgPtr(ipcMsg->Des()); + aMessage.ReadL(0, ipcMsgPtr, 0); + + /* read message data */ + RDesReadStream readStream; + readStream.Open(ipcMsg->Des()); + CleanupClosePushL( readStream ); + TUint32 iapId = readStream.ReadInt32L(); + TUint32 serviceId = readStream.ReadInt32L(); + TUint8 setToDefaultForService = readStream.ReadInt8L(); + CleanupStack::PopAndDestroy( &readStream ); + + CIptvNetworkSelection::TRespStatus resp; + + //this is trapped in CIptvServerSession::ServiceL() + iServer.iNetworkSelection->SetUsedIapL(iapId, serviceId, setToDefaultForService, resp); + + /* send resp */ + ipcMsgPtr.Zero(); + RDesWriteStream writeStream; + writeStream.Open(ipcMsgPtr); + CleanupClosePushL( writeStream ); + writeStream.WriteUint8L(static_cast(resp)); + CleanupStack::PopAndDestroy( &writeStream ); + aMessage.WriteL(0, ipcMsgPtr, 0); + aMessage.Complete(KErrNone); + CleanupStack::PopAndDestroy(ipcMsg); // <-1 + } + break; + + case EIptvEngineNsGetUsedIapReq: + { + /* EIptvEngineNsGetUsedIapReq message format: + * ------------------ + * TUint32 aServiceId + * ------------------ + */ + + /* EIptvEngineNsGetUsedIapResp message format: + * ------------------- + * TUint8 aRespStatus + * TUint32 aIapId + * TUint16 aIapNameLength + * aIapNameData (contains SSID if iapname not found) + * TUint8 aConnectionPermission + * ------------------- + */ + + iMsgPending = EIptvEngineNsGetUsedIapReq; + + //Store aMessage for later use (GetUsedIapResp()) + iMessage = aMessage; + + /* Get IPC message */ + TUint32 ipcMsgSize = aMessage.GetDesLengthL( 0 ); + + delete iIpcMsg; + iIpcMsg = NULL; + + iIpcMsg = HBufC8::NewL( ipcMsgSize ); + iIpcMsg->Des().Zero(); + TPtr8 ipcMsgPtr( iIpcMsg->Des() ); + aMessage.ReadL( 0, ipcMsgPtr, 0 ); + + /* read message data */ + RDesReadStream readStream; + readStream.Open( iIpcMsg->Des() ); + CleanupClosePushL( readStream ); + TUint32 serviceId = readStream.ReadInt32L(); + CleanupStack::PopAndDestroy( &readStream ); + + /* call network selection */ + iGetUsedIapReq.iNsObserver = this; + iGetUsedIapReq.iServiceId = serviceId; + iServer.iNetworkSelection->GetUsedIapReqL( &iGetUsedIapReq ); + + if ( iGetUsedIapReq.iRespStatus == CIptvNetworkSelection::EDoingWlanScan ) + { + //Start waiting for call to GetUsedIapResp() + //Client shouldnt send anything to us meanwhile + } + else + { + //NS responded synchronously, lets handle the resp message + GetUsedIapResp( &iGetUsedIapReq ); + } + } + break; + + case EIptvEngineNsClearUsedIap: + { + iServer.iNetworkSelection->ClearUsedIap(); + aMessage.Complete(KErrNone); + } + break; + + case EIptvEngineNsSetConnectionAllowed: + { + + /* EIptvEngineNsSetConnectionAllowed message format: + * -------------------------- + * TUint8 aConnectionAllowed + * TUint32 aIapId + * -------------------------- + */ + + /* response message format: + * ------------------- + * TUint8 aRespStatus + * ------------------- + */ + + /* Get IPC message */ + TUint32 ipcMsgSize = aMessage.GetDesLengthL(0); + HBufC8* ipcMsg; + ipcMsg = HBufC8::NewL(ipcMsgSize); + CleanupStack::PushL(ipcMsg); // 1-> + ipcMsg->Des().Zero(); + TPtr8 ipcMsgPtr(ipcMsg->Des()); + aMessage.ReadL(0, ipcMsgPtr, 0); + + /* read message data */ + RDesReadStream readStream; + readStream.Open(ipcMsg->Des()); + CleanupClosePushL( readStream ); + TUint8 connectionAllowed = readStream.ReadInt8L(); + TUint32 iapId = readStream.ReadInt32L(); + CleanupStack::PopAndDestroy( &readStream ); + + /* call network selection */ + CIptvNetworkSelection::TRespStatus respStatus; + iServer.iNetworkSelection->SetConnectionAllowedL(connectionAllowed, iapId, respStatus); + + /* write resp */ + ipcMsgPtr.Zero(); + RDesWriteStream writeStream; + writeStream.Open(ipcMsgPtr); + CleanupClosePushL( writeStream ); + writeStream.WriteUint8L(static_cast(respStatus)); + CleanupStack::PopAndDestroy( &writeStream ); + aMessage.WriteL(0, ipcMsgPtr, 0); + + /* send resp */ + aMessage.Complete(KErrNone); + CleanupStack::PopAndDestroy(ipcMsg); // <-1 + } + break; + + case EIptvEngineNsIsConnectionAllowed: + { + + /* EIptvEngineNsIsConnectionAllowed message format: + * ------------------- + * TUint32 aServiceId + * ------------------- + */ + + /* EIptvEngineNsIsConnectionAllowed response message format: + * ----------------------------- + * TUint8 aRespStatus + * TUint8 aConnectionPermission + * ----------------------------- + */ + + /* Get IPC message */ + TUint32 ipcMsgSize = aMessage.GetDesLengthL(0); + HBufC8* ipcMsg; + ipcMsg = HBufC8::NewL(ipcMsgSize); + CleanupStack::PushL(ipcMsg); // 1-> + ipcMsg->Des().Zero(); + TPtr8 ipcMsgPtr(ipcMsg->Des()); + aMessage.ReadL(0, ipcMsgPtr, 0); + + /* read message data */ + RDesReadStream readStream; + readStream.Open(ipcMsg->Des()); + CleanupClosePushL( readStream ); + TUint32 serviceId = readStream.ReadUint32L(); + CleanupStack::PopAndDestroy( &readStream ); + + /* call network selection */ + CIptvNetworkSelection::TRespStatus respStatus = CIptvNetworkSelection::ESucceeded; + CIptvNetworkSelection::TConnectionPermission connectionPermission; + connectionPermission = iServer.iNetworkSelection->IsConnectionAllowedL(serviceId); + + /* write resp */ + RDesWriteStream writeStream; + writeStream.Open(ipcMsgPtr); + CleanupClosePushL( writeStream ); + writeStream.WriteUint8L(static_cast(respStatus)); + writeStream.WriteUint8L(static_cast(connectionPermission)); + CleanupStack::PopAndDestroy( &writeStream ); + aMessage.WriteL(0, ipcMsgPtr, 0); + + /* send resp */ + aMessage.Complete(KErrNone); + CleanupStack::PopAndDestroy(ipcMsg); // <-1 + } + break; + + case EIptvEngineNsCancel: + { + switch(iMsgPending) + { + case EIptvEngineNsGetUsedIapReq: + { + TInt err( iServer.iNetworkSelection->CancelGetUsedIapReq( this ) ); + aMessage.Complete( err ); + } + break; + + default: + aMessage.Complete(KErrNotFound); + break; + } + iMsgPending = EIptvEngineNone; + } + break; + } + + IPTVLOGSTRING_LOW_LEVEL("CIptvNetworkSelectionMsgHandler::HandleMsgL() exit"); + } + +// ------------------------------------------------------------------ +// CIptvNetworkSelectionMsgHandler::GetUsedIapResp +// ------------------------------------------------------------------ +// +void CIptvNetworkSelectionMsgHandler::GetUsedIapResp(TIptvGetUsedIapReq* /*aRequestOb*/) + { + IPTVLOGSTRING_LOW_LEVEL("CIptvNetworkSelectionMsgHandler::GetUsedIapResp()"); + + TRAPD( err, GetUsedIapRespL() ); + + IPTVLOGSTRING2_LOW_LEVEL("CIptvNetworkSelectionMsgHandler::GetUsedIapResp() trap err:%d", err); + iMessage.Complete( err ); + + iMsgPending = EIptvEngineNone; + IPTVLOGSTRING_LOW_LEVEL("CIptvNetworkSelectionMsgHandler::GetUsedIapResp() exit"); + } + +// ------------------------------------------------------------------ +// CIptvNetworkSelectionMsgHandler::GetUsedIapRespL +// ------------------------------------------------------------------ +// +void CIptvNetworkSelectionMsgHandler::GetUsedIapRespL() + { + /* EIptvEngineNsGetUsedIapResp message format: + * ------------------- + * TUint8 aRespStatus + * TUint32 aIapId + * TUint16 aIapNameLength + * aIapNameData (contains SSID if iapname not found) + * TUint8 aConnectionPermission + * TUint8 aWlanWhenGprs + * ------------------- + */ + + TBuf8<1+4+2+(KIptvNsIapNameMaxLength*2)+1> resp; + /* write resp */ + RDesWriteStream writeStream; + + writeStream.Open( resp ); + CleanupClosePushL( writeStream ); // 1-> + writeStream.WriteUint8L( iGetUsedIapReq.iRespStatus ); + writeStream.WriteUint32L( iGetUsedIapReq.iIapId ); + + IPTVLOGSTRING2_LOW_LEVEL("CIptvNetworkSelectionMsgHandler:: IAP ID = %d", iGetUsedIapReq.iIapId); + + //iap name + TUint16 iapNameLength = iGetUsedIapReq.iIapName.Length(); + writeStream.WriteUint16L( iapNameLength ); + TInt i; + for ( i = 0; i < iapNameLength; i++ ) + { + writeStream.WriteUint16L( iGetUsedIapReq.iIapName[i] ); + } + + writeStream.WriteUint8L( iGetUsedIapReq.iConnectionPermission ); + + writeStream.WriteUint8L( iGetUsedIapReq.iWLANWhenGPRS ); + + writeStream.Close(); + CleanupStack::Pop( &writeStream ); // <-1 + + /* send resp */ + iMessage.WriteL( 0, resp, 0 ); + }