--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videofeeds/clientapi/src/CIptvServiceManagementClient.cpp Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,1364 @@
+/*
+* 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: Provides interface to Service Management and Network Selection*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <e32svr.h>
+#include "IptvDebug.h"
+
+#include "IptvClientServerCommon.h"
+#include "CIptvService.h"
+#include "CIptvServices.h"
+#include "CIptvServiceManagementClient.h"
+#include "MIptvServiceManagementClientObserver.h"
+#include "CIptvServiceManager.h"
+#include "IptvServer.pan"
+#include "CIptvSmEvent.h"
+#include "CIptvEventListener.h"
+
+// ========================= MEMBER FUNCTIONS ==================================
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+EXPORT_C CIptvServiceManagementClient* CIptvServiceManagementClient::NewL(MIptvServiceManagementClientObserver& aClient)
+ {
+ CIptvServiceManagementClient* self =
+ new ( ELeave ) CIptvServiceManagementClient(aClient);
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return( self ) ;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CIptvServiceManagementClient::ConstructL()
+ {
+ User::LeaveIfError( iSession.Connect() );
+ iMsg = NULL;
+
+ CIptvSmEvent* event = CIptvSmEvent::NewL();
+ CleanupStack::PushL(event); // 1->
+ iEventListener = CIptvEventListener::NewL( *this,
+ event /* ownership moves */,
+ EIptvEngineSmGetEventSizeReq,
+ EIptvEngineSmGetEventData,
+ EIptvEngineSmCancelGetEventSizeReq );
+ CleanupStack::Pop(event); // <-1
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::CIptvServiceManagementClient()
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+EXPORT_C CIptvServiceManagementClient::CIptvServiceManagementClient(MIptvServiceManagementClientObserver& aClient)
+: CIptvClientBase(), iClient(aClient), iMsgPtr((unsigned char*)0, 0)
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::~CIptvServiceManagementClient()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CIptvServiceManagementClient::~CIptvServiceManagementClient()
+ {
+ IPTVLOGSTRING_LOW_LEVEL("~CIptvServiceManagementClient()");
+
+ delete iEventListener;
+
+ Cancel(); // Causes call to DoCancel() if there is message pending
+
+ iSession.Close();
+
+ delete iMsg;
+ iMsg = NULL;
+ IPTVLOGSTRING_LOW_LEVEL("~CIptvServiceManagementClient() exit");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::AddServiceReq()
+// Adds a service to Service data base.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvServiceManagementClient::AddServiceReqL(CIptvService& aService)
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::AddServiceReq()");
+
+ if ( IsActive() )
+ {
+ return KErrNotReady;
+ }
+
+ BuildAddServiceReqL( aService );
+
+ //send it
+ iSession.SendRequest( EIptvEngineSmAddServiceReq, iMsgPtr, iStatus );
+ SetActive();
+ iRequestPendingFor = EServiceManagerRequestPending;
+ iResponseMsgId = EIptvEngineSmAddServiceResp;
+
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::AddServiceReq() exit");
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::AddServiceL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvServiceManagementClient::AddServiceL(
+ CIptvService& aService,
+ MIptvServiceManagementClientObserver::TRespStatus& aRespStatus)
+ {
+ BuildAddServiceReqL( aService );
+ TInt err = iSession.SendRequest( EIptvEngineSmAddServiceReq, iMsgPtr );
+ if ( err == KErrNone )
+ {
+ aRespStatus = GetRespStatusL();
+ }
+ else
+ {
+ aRespStatus = MIptvServiceManagementClientObserver::EGeneralError;
+ }
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::UpdateServiceReqL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvServiceManagementClient::UpdateServiceReqL(CIptvService& aService)
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::UpdateServiceReq()");
+
+ if(IsActive())
+ {
+ return KErrNotReady;
+ }
+
+ BuildUpdateServiceReqL(aService);
+
+ //send it
+ iSession.SendRequest(EIptvEngineSmUpdateServiceReq, iMsgPtr, iStatus);
+ SetActive();
+ iRequestPendingFor = EServiceManagerRequestPending;
+ iResponseMsgId = EIptvEngineSmUpdateServiceResp;
+
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::UpdateServiceReq() exit");
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::UpdateServiceL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvServiceManagementClient::UpdateServiceL(CIptvService& aService,
+ MIptvServiceManagementClientObserver::TRespStatus& aRespStatus)
+ {
+ BuildUpdateServiceReqL(aService);
+ TInt err = iSession.SendRequest(EIptvEngineSmUpdateServiceReq, iMsgPtr);
+ if(err == KErrNone)
+ {
+ aRespStatus = GetRespStatusL();
+ }
+ else
+ {
+ aRespStatus = MIptvServiceManagementClientObserver::EGeneralError;
+ }
+
+ delete iMsg;
+ iMsg = NULL;
+
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::GetServicesReq()
+// Requests services from the database. The request is done in 2 phases, first
+// request gets only data size, second transaction gets the data.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvServiceManagementClient::GetServicesReqL(TUint32 aSearchLimitFlags,
+ TOrder aOrder)
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::GetServicesReqL(aSearchLimitFlags, aOrder)");
+
+ if(IsActive())
+ {
+ return KErrNotReady;
+ }
+
+ BuildGetServicesSizeReqL(aSearchLimitFlags, aOrder);
+
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: Sending EIptvEngineGetServicesSizeReq");
+ iSession.SendRequest(EIptvEngineSmGetServicesSizeReq, iMsgPtr, iStatus);
+ SetActive();
+ iRequestPendingFor = EServiceManagerRequestPending;
+ iResponseMsgId = EIptvEngineSmGetServicesSizeResp;
+
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::GetServicesReqL(aSearchLimitFlags, aOrder) exit");
+ return KErrNone;
+ }
+
+EXPORT_C TInt CIptvServiceManagementClient::GetServicesL(
+ TUint32 aSearchLimitFlags,
+ TOrder aOrder,
+ CDesC8ArraySeg*& aServicesArray,
+ MIptvServiceManagementClientObserver::TRespStatus& aRespStatus )
+ {
+ BuildGetServicesSizeReqL( aSearchLimitFlags, aOrder );
+
+ TInt err = iSession.SendRequest( EIptvEngineSmGetServicesSizeReq, iMsgPtr );
+ if ( err != KErrNone )
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: GetServicesL() error when requesting size");
+ aRespStatus = MIptvServiceManagementClientObserver::EGeneralError;
+ return err;
+ }
+ else
+ {
+ RDesReadStream readStream;
+ readStream.Open( iMsgPtr);
+ CleanupClosePushL( readStream );
+ TUint8 status = readStream.ReadUint8L();
+ TUint32 size = readStream.ReadUint32L();
+ CleanupStack::PopAndDestroy( &readStream );
+
+ if ( status != MIptvServiceManagementClientObserver::ESucceeded )
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: GetServicesL() error when requesting size");
+ aRespStatus = ( MIptvServiceManagementClientObserver::TRespStatus )status;
+ return KErrGeneral;
+ }
+
+ IPTVLOGSTRING2_LOW_LEVEL("CIptvServiceManagementClient:: Size: %d", size);
+
+ if ( iMsg )
+ {
+ delete iMsg;
+ iMsg = NULL;
+ }
+
+ iMsg = HBufC8::NewL( size );
+ iMsgPtr.Set( iMsg->Des() );
+
+ err = iSession.SendRequest( EIptvEngineSmGetServicesDataReq, iMsgPtr );
+ if ( err != KErrNone )
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: EIptvEngineSmGetServicesDataReq failed");
+ aRespStatus = MIptvServiceManagementClientObserver::EGeneralError;
+ return err;
+ }
+ else
+ {
+ CDesC8ArraySeg* services = NULL;
+ TRAPD( err, services = InternalizeGetServicesDataRespL() );
+ if ( err != KErrNone )
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: failed to internalize GetServicesDataResp ipc msg");
+ aRespStatus = MIptvServiceManagementClientObserver::EGeneralError;
+ return err;
+ }
+ aRespStatus = MIptvServiceManagementClientObserver::ESucceeded;
+ aServicesArray = services;
+ return KErrNone;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::GetServicesReqL()
+// Gets service entries from Services database. Request is done asynchronously.
+// GetServicesResp is the callback function.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvServiceManagementClient::GetServicesReqL(TUint32 aStartId, TUint32 aEndId)
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::GetServicesReqL(aStartId, aEndId)");
+
+ if(IsActive())
+ {
+ return KErrNotReady;
+ }
+
+ BuildGetServicesUsingIndexSizeReqL(aStartId, aEndId);
+
+ IPTVLOGSTRING_HIGH_LEVEL("CIptvServiceManagementClient:: Sending EIptvEngineGetServicesUsingIdSizeReq");
+
+ iSession.SendRequest(EIptvEngineSmGetServicesUsingIdSizeReq, iMsgPtr, iStatus);
+ SetActive();
+ iRequestPendingFor = EServiceManagerRequestPending;
+ iResponseMsgId = EIptvEngineSmGetServicesUsingIdSizeResp;
+
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::GetServicesReqL(aStartId, aEndId) exit");
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::GetServices()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvServiceManagementClient::GetServicesL(TUint32 aStartId,
+ TUint32 aEndId,
+ CDesC8ArraySeg*& aServicesArray,
+ MIptvServiceManagementClientObserver::TRespStatus& aRespStatus)
+ {
+ BuildGetServicesUsingIndexSizeReqL(aStartId, aEndId);
+
+ TInt err = iSession.SendRequest(EIptvEngineSmGetServicesUsingIdSizeReq, iMsgPtr);
+ if (err != KErrNone)
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: Error in SendRequest");
+ aRespStatus = MIptvServiceManagementClientObserver::EGeneralError;
+ aServicesArray = NULL;
+ return err;
+ }
+
+ TUint8 status;
+ TUint32 size;
+
+ RDesReadStream readStream;
+ readStream.Open(iMsgPtr);
+ CleanupClosePushL( readStream );
+ status = readStream.ReadUint8L();
+
+ if(status != MIptvServiceManagementClientObserver::ESucceeded)
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: Error");
+ iClient.GetServicesResp((MIptvServiceManagementClientObserver::TRespStatus)status, NULL);
+ CleanupStack::PopAndDestroy( &readStream );
+ return KErrGeneral;
+ }
+
+ size = readStream.ReadUint32L();
+ CleanupStack::PopAndDestroy( &readStream );
+
+ IPTVLOGSTRING2_LOW_LEVEL("CIptvServiceManagementClient:: Size: %d", size);
+
+ if (iMsg)
+ {
+ delete iMsg;
+ iMsg = NULL;
+ }
+
+ iMsg = HBufC8::NewL(size);
+ iMsgPtr.Set(iMsg->Des());
+
+ err = iSession.SendRequest(EIptvEngineSmGetServicesUsingIdDataReq, iMsgPtr);
+
+ if (err != KErrNone)
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: EIptvEngineSmGetServicesUsingIdDataReq failed");
+ aRespStatus = MIptvServiceManagementClientObserver::EGeneralError;
+ return err;
+ }
+ else
+ {
+ CDesC8ArraySeg* services = NULL;
+
+ TRAPD(err, services = InternalizeGetServicesDataRespL());
+ if (err != KErrNone)
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: failed to internalize GetServicesDataResp ipc msg");
+ aRespStatus = MIptvServiceManagementClientObserver::EGeneralError;
+ return err;
+ }
+ aRespStatus = MIptvServiceManagementClientObserver::ESucceeded;
+ aServicesArray = services;
+ return KErrNone;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::DeleteServiceReqL()
+// Deletes a service from the database.
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C TInt CIptvServiceManagementClient::DeleteServiceReqL(TUint32 aId)
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::DeleteServiceReqL()");
+
+ if(IsActive())
+ {
+ return KErrNotReady;
+ }
+
+ BuildDeleteServiceReqL(aId);
+
+ IPTVLOGSTRING2_LOW_LEVEL("CIptvServiceManagementClient:: Making delete request for ID: %d", aId);
+
+ iSession.SendRequest(EIptvEngineSmDeleteServiceReq, iMsgPtr, iStatus);
+ SetActive();
+ iRequestPendingFor = EServiceManagerRequestPending;
+ iResponseMsgId = EIptvEngineSmDeleteServiceResp;
+
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::DeleteServiceReq() exit");
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::DeleteServiceL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvServiceManagementClient::DeleteServiceL(TUint32 aId,
+ MIptvServiceManagementClientObserver::TRespStatus& aRespStatus)
+ {
+ BuildDeleteServiceReqL(aId);
+ IPTVLOGSTRING2_LOW_LEVEL("CIptvServiceManagementClient:: Making delete request for ID: %d", aId);
+ TInt err = iSession.SendRequest(EIptvEngineSmDeleteServiceReq, iMsgPtr);
+ if (err != KErrNone)
+ {
+ aRespStatus = MIptvServiceManagementClientObserver::EGeneralError;
+ }
+ else
+ {
+ aRespStatus = GetRespStatusL();
+ }
+ return err;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::ServerShutDownReq()
+// Requests server to shutdown itself.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvServiceManagementClient::ServerShutdownReq()
+ {
+ if(IsActive())
+ {
+ return KErrNotReady;
+ }
+
+ iSession.SendRequest(EIptvEngineServerShutdownReq, iStatus);
+ SetActive();
+ iRequestPendingFor = EServerRequestPending;
+ iResponseMsgId = EIptvEngineShutdownResp;
+
+ return KErrNone;
+ }
+
+EXPORT_C TInt CIptvServiceManagementClient::ServerShutdown(MIptvServiceManagementClientObserver::TRespStatus& /*aRespStatus*/)
+ {
+ return KErrNotSupported;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::CancelRequest()
+// Cancels an outstanding request.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvServiceManagementClient::CancelRequest()
+ {
+ Cancel() ; // Causes call to DoCancel() if there is message pending
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::RunL()
+// Invoked to handle responses from Iptv server.
+// -----------------------------------------------------------------------------
+//
+void CIptvServiceManagementClient::RunL()
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::RunL()");
+
+ iRequestPendingFor = ENoRequestPending;
+ TInt error = iStatus.Int();
+
+ if(error != KErrNone)
+ {
+ IPTVLOGSTRING2_LOW_LEVEL("CIptvServiceManagementClient:: error received from server: %d", error);
+ }
+
+ switch ( iResponseMsgId )
+ {
+ case EIptvEngineShutdownResp:
+ IPTVLOGSTRING_HIGH_LEVEL("CIptvServiceManagementClient:: EIptvEngineShutdownResp");
+ iClient.ServerShutdownResp(GetRespStatusL());
+ break;
+
+ case EIptvEngineSmGetServicesSizeResp:
+ IPTVLOGSTRING_HIGH_LEVEL("CIptvServiceManagementClient:: EIptvEngineSmGetServicesSizeResp");
+ HandleGetServicesSizeRespL(EIptvEngineSmGetServicesSizeResp);
+ break;
+ case EIptvEngineSmGetServicesDataResp:
+ IPTVLOGSTRING_HIGH_LEVEL("CIptvServiceManagementClient:: EIptvEngineSmGetServicesDataResp");
+ HandleGetServicesDataRespL(EIptvEngineSmGetServicesDataResp);
+ break;
+
+ case EIptvEngineSmGetServicesUsingIdSizeResp:
+ IPTVLOGSTRING_HIGH_LEVEL("CIptvServiceManagementClient:: EIptvEngineSmGetServicesUsingIdSizeResp");
+ HandleGetServicesSizeRespL(EIptvEngineSmGetServicesUsingIdSizeResp);
+ break;
+ case EIptvEngineSmGetServicesUsingIdDataResp:
+ IPTVLOGSTRING_HIGH_LEVEL("CIptvServiceManagementClient:: EIptvEngineSmGetServicesUsingIdDataResp");
+ HandleGetServicesDataRespL(EIptvEngineSmGetServicesUsingIdDataResp);
+ break;
+
+ case EIptvEngineSmAddServiceResp:
+ IPTVLOGSTRING_HIGH_LEVEL("CIptvServiceManagementClient:: EIptvEngineSmAddServiceResp");
+ iClient.AddServiceResp(GetRespStatusL());
+ break;
+
+ case EIptvEngineSmDeleteServiceResp:
+ IPTVLOGSTRING_HIGH_LEVEL("CIptvServiceManagementClient:: EIptvEngineSmDeleteServiceResp");
+ iClient.DeleteServiceResp(GetRespStatusL());
+ break;
+
+ case EIptvEngineSmUpdateServiceResp:
+ IPTVLOGSTRING_HIGH_LEVEL("CIptvServiceManagementClient:: EIptvEngineSmUpdateServiceResp");
+ iClient.UpdateServiceResp(GetRespStatusL());
+ break;
+
+ case EIptvEngineNsGetUsedIapResp:
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: EIptvEngineNsGetUsedIapResp");
+
+ TUint32 iapId;
+ TBuf<KIptvNsIapNameMaxLength> iapName;
+ CIptvNetworkSelection::TConnectionPermission connPerm;
+ CIptvNetworkSelection::TRespStatus respStatus;
+ TUint8 wlanWhenGprs;
+
+ if ( iStatus.Int() == KErrNone )
+ {
+ HandleGetUsedIapRespL( iapId, iapName, connPerm, wlanWhenGprs, respStatus );
+ }
+ else
+ {
+ IPTVLOGSTRING2_HIGH_LEVEL("CIptvServiceManagementClient:: message completed with error: %d", iStatus.Int());
+ respStatus = CIptvNetworkSelection::EGeneralError;
+ }
+ iClient.GetUsedIapResp(iapId, iapName, connPerm, wlanWhenGprs, respStatus);
+ }
+ break;
+
+ default:
+ IPTVLOGSTRING_HIGH_LEVEL("CIptvServiceManagementClient:: UNKNOWN MESSAGE, PANICING");
+ User::Panic( KIptvServiceManagementClient, EIptvUnknownMessage ); // Unexpected error
+ break;
+ }
+
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::RunL() exit");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::DoCancel()
+// Cancels any outstanding operation.
+// -----------------------------------------------------------------------------
+//
+void CIptvServiceManagementClient::DoCancel()
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::DoCancel()");
+
+ switch(iRequestPendingFor)
+ {
+ case EServerRequestPending:
+ iSession.SendRequest(EIptvEngineServerCancel); //sync
+ break;
+
+ case EServiceManagerRequestPending:
+ iSession.SendRequest(EIptvEngineSmCancel); //sync
+ break;
+
+ case ENetworkSelectionRequestPending:
+ {
+ TInt err = iSession.SendRequest(EIptvEngineNsCancel); //sync
+ if(err == KErrNone)
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: EIptvEngineNsCancel successful");
+ }
+ else
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: EIptvEngineNsCancel failed");
+ }
+ }
+ break;
+
+ default:
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: there was no message pending, ignoring cancel req");
+ break;
+ }
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::DoCancel() exit");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::HandleGetServicesSizeRespL()
+// Handles EIptvEngineGetServicesSizeResp and EIptvEngineGetServicesUsingIdSizeResp
+// messages.
+// Allocates new iMsg of the size fetched from the incoming message and sends
+// corresponding data request message to server.
+// -----------------------------------------------------------------------------
+//
+void CIptvServiceManagementClient::HandleGetServicesSizeRespL(TUint8 aMsgId)
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::HandleGetServicesSizeResp()");
+
+ if(iStatus.Int() != KErrNone)
+ {
+ //operation leaved on server side -> mark request as failed
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: operation leaved on server side->EGeneralError");
+ iClient.GetServicesResp(MIptvServiceManagementClientObserver::EGeneralError, NULL);
+ return;
+ }
+
+ TUint8 status;
+ TUint32 size;
+
+ RDesReadStream readStream;
+ readStream.Open(iMsgPtr);
+ CleanupClosePushL( readStream );
+ status = readStream.ReadUint8L();
+
+ if(status != MIptvServiceManagementClientObserver::ESucceeded)
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: Error");
+ iClient.GetServicesResp((MIptvServiceManagementClientObserver::TRespStatus)status, NULL);
+ CleanupStack::PopAndDestroy( &readStream );
+ return;
+ }
+
+ size = readStream.ReadUint32L();
+ CleanupStack::PopAndDestroy( &readStream );
+
+ IPTVLOGSTRING2_LOW_LEVEL("CIptvServiceManagementClient:: Size: %d", size);
+
+ delete iMsg;
+ iMsg = NULL;
+ iMsg = HBufC8::NewL(size);
+ iMsgPtr.Set(iMsg->Des());
+
+ switch(aMsgId)
+ {
+ case EIptvEngineSmGetServicesSizeResp:
+ iSession.SendRequest(EIptvEngineSmGetServicesDataReq, iMsgPtr, iStatus);
+ iResponseMsgId = EIptvEngineSmGetServicesDataResp;
+ break;
+ case EIptvEngineSmGetServicesUsingIdSizeResp:
+ iSession.SendRequest(EIptvEngineSmGetServicesUsingIdDataReq, iMsgPtr, iStatus);
+ iResponseMsgId = EIptvEngineSmGetServicesUsingIdDataResp;
+ break;
+ }
+
+ SetActive();
+ iRequestPendingFor = EServiceManagerRequestPending;
+
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::HandleGetServicesSizeRespL() exit");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::HandleGetServicesDataReqCompletes()
+// Handles EIptvEngineGetServicesDataResp and EIptvEngineGetServicesUsingIdDataResp
+// messages.
+// Unpacks data from stream format(externalize/internalize) and sends services to
+// client as an array of data descriptors fetched from CIptvService::GetL().
+// -----------------------------------------------------------------------------
+//
+void CIptvServiceManagementClient::HandleGetServicesDataRespL(TUint8 aMsgId)
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::HandleGetServicesDataRespL()");
+
+ if(iStatus.Int() != KErrNone)
+ {
+ //operation leaved on server side -> mark request as failed
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: operation leaved on server side->EGeneralError");
+ iClient.GetServicesResp(MIptvServiceManagementClientObserver::EGeneralError, NULL);
+ return;
+ }
+
+ CDesC8ArraySeg* services = NULL;
+
+ TRAPD(err, services = InternalizeGetServicesDataRespL());
+ if (err != KErrNone)
+ {
+ iClient.GetServicesResp(MIptvServiceManagementClientObserver::EGeneralError, NULL);
+ return;
+ }
+
+ switch(aMsgId)
+ {
+ case EIptvEngineSmGetServicesDataResp:
+ iClient.GetServicesResp(MIptvServiceManagementClientObserver::ESucceeded, services);
+ break;
+ case EIptvEngineSmGetServicesUsingIdDataResp:
+ iClient.GetServicesResp(MIptvServiceManagementClientObserver::ESucceeded, services);
+ break;
+ default:
+ break;
+ }
+
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::HandleGetServicesDataRespL() exit");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::SetUsedIapL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvServiceManagementClient::SetUsedIapL(TUint32 aIapId,
+ TUint32 aServiceId,
+ TBool aSetToDefaultForService,
+ CIptvNetworkSelection::TRespStatus& aRespStatus)
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::SetUsedIapL()");
+
+ if(IsActive())
+ {
+ User::Leave(KErrNotReady);
+ }
+
+ delete iMsg;
+ iMsg = NULL;
+
+ /* EIptvEngineNsSetUsedIap message format:
+ * -------------------------------
+ * TUint32 aIapId
+ * TUint32 aServiceId
+ * TUint8 aSetToDefaultForService
+ * -------------------------------
+ */
+
+ /* EIptvEngineNsSetUsedIap response message format
+ * --------------------
+ * TUint8 aRespStatus
+ * --------------------
+ */
+
+ iMsg = HBufC8::NewL(4+4+1);
+ iMsgPtr.Set(iMsg->Des());
+
+ RDesWriteStream writeStream;
+ writeStream.Open(iMsgPtr);
+ CleanupClosePushL( writeStream );
+ writeStream.WriteUint32L(aIapId);
+ writeStream.WriteUint32L(aServiceId);
+ writeStream.WriteUint8L(static_cast<TUint8>(aSetToDefaultForService));
+ writeStream.WriteUint8L(static_cast<TUint8>(aRespStatus));
+ CleanupStack::PopAndDestroy( &writeStream );
+ TInt err( KErrNotReady );
+ if ( !iSession.IsNull() )
+ {
+ err = iSession.SendRequest(EIptvEngineNsSetUsedIap, iMsgPtr);
+ }
+
+ if(err == KErrNone)
+ {
+ RDesReadStream readStream;
+ readStream.Open(iMsgPtr);
+ CleanupClosePushL( readStream );
+ aRespStatus = static_cast<CIptvNetworkSelection::TRespStatus>(readStream.ReadUint8L());
+ CleanupStack::PopAndDestroy( &readStream );
+ }
+ else
+ {
+ IPTVLOGSTRING2_LOW_LEVEL("CIptvServiceManagementClient:: SendRequest(EIptvEngineNsSetUsedIap) failed, error code = %d", err);
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: aRespStatus set to CIptvNetworkSelection::EGeneralError");
+ aRespStatus = CIptvNetworkSelection::EGeneralError;
+ }
+
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::SetUsedIapL() exit");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::ClearUsedIap()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvServiceManagementClient::ClearUsedIap()
+ {
+ return iSession.SendRequest(EIptvEngineNsClearUsedIap);
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::GetUsedIapReqL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvServiceManagementClient::GetUsedIapReqL( TUint32 aServiceId )
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::GetUsedIapReqL()");
+
+ if ( IsActive() )
+ {
+ User::Leave( KErrNotReady );
+ }
+ BuildGetUsedIapReqL( aServiceId );
+
+ iSession.SendRequest(EIptvEngineNsGetUsedIapReq, iMsgPtr, iStatus);
+ SetActive();
+ iRequestPendingFor = ENetworkSelectionRequestPending;
+ iResponseMsgId = EIptvEngineNsGetUsedIapResp;
+
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::GetUsedIapReqL() exit");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::GetUsedIapL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvServiceManagementClient::GetUsedIapL( TUint32 aServiceId,
+ TUint32& aIapId,
+ TDes& aIapName,
+ CIptvNetworkSelection::TConnectionPermission& aConnectionPermission,
+ CIptvNetworkSelection::TRespStatus& aRespStatus )
+ {
+ BuildGetUsedIapReqL( aServiceId );
+
+ IPTVLOGSTRING2_LOW_LEVEL("CIptvServiceManagementClient:: sending EIptvEngineNsGetUsedIapReq for service %d", aServiceId);
+ TInt err = iSession.SendRequest( EIptvEngineNsGetUsedIapReq, iMsgPtr );
+
+ if ( err != KErrNone )
+ {
+ User::Leave( err );
+ }
+ else
+ {
+ TUint8 temp; // Not used syncronous call
+ HandleGetUsedIapRespL( aIapId, aIapName, aConnectionPermission, temp, aRespStatus );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::IsConnectionAllowedL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvServiceManagementClient::IsConnectionAllowedL(TUint32 aServiceId,
+ CIptvNetworkSelection::TConnectionPermission& aConnectionPermission,
+ CIptvNetworkSelection::TRespStatus& aRespStatus)
+ {
+
+ if(IsActive())
+ {
+ User::Leave(KErrNotReady);
+ }
+
+ delete iMsg;
+ iMsg = NULL;
+
+ /* EIptvEngineNsIsConnectionAllowed message format:
+ * -------------------
+ * TUint32 aServiceId
+ * -------------------
+ */
+
+ /* EIptvEngineNsIsConnectionAllowed response message format:
+ * -----------------------------
+ * TUint8 aRespStatus
+ * TUint8 aConnectionPermission
+ * -----------------------------
+ */
+
+ iMsg = HBufC8::NewL(4);
+ iMsgPtr.Set(iMsg->Des());
+
+ RDesWriteStream writeStream;
+ writeStream.Open(iMsgPtr);
+ CleanupClosePushL( writeStream );
+ writeStream.WriteUint32L(aServiceId);
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ TInt error = iSession.SendRequest(EIptvEngineNsIsConnectionAllowed, iMsgPtr);
+ if(error == KErrNone)
+ {
+ RDesReadStream readStream;
+ readStream.Open(iMsgPtr);
+ CleanupClosePushL( readStream );
+ aRespStatus = static_cast<CIptvNetworkSelection::TRespStatus>(readStream.ReadUint8L());
+ aConnectionPermission = static_cast<CIptvNetworkSelection::TConnectionPermission>(readStream.ReadUint8L());
+ CleanupStack::PopAndDestroy( &readStream );
+ }
+ else
+ {
+ aRespStatus = CIptvNetworkSelection::EGeneralError;
+ }
+
+ User::LeaveIfError(error);
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::SetConnectionAllowedL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvServiceManagementClient::SetConnectionAllowedL(TBool aConnectionAllowed,
+ TUint32 aIapId,
+ CIptvNetworkSelection::TRespStatus& aRespStatus)
+ {
+
+ if(IsActive())
+ {
+ User::Leave(KErrNotReady);
+ }
+
+ delete iMsg;
+ iMsg = NULL;
+
+ /* EIptvEngineNsSetConnectionAllowed message format:
+ * --------------------------
+ * TUint8 aConnectionAllowed
+ * TUint32 aIapId
+ * --------------------------
+ */
+
+ /* response message format:
+ * -------------------
+ * TUint8 aRespStatus
+ * -------------------
+ */
+
+ iMsg = HBufC8::NewL(1+4);
+ iMsgPtr.Set(iMsg->Des());
+
+ RDesWriteStream writeStream;
+ writeStream.Open(iMsgPtr);
+ CleanupClosePushL( writeStream );
+ writeStream.WriteUint8L(aConnectionAllowed);
+ writeStream.WriteUint32L(aIapId);
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ TInt error = iSession.SendRequest(EIptvEngineNsSetConnectionAllowed, iMsgPtr);
+
+ if(error == KErrNone)
+ {
+ RDesReadStream readStream;
+ readStream.Open(iMsgPtr);
+ CleanupClosePushL( readStream );
+ aRespStatus = static_cast<CIptvNetworkSelection::TRespStatus>(readStream.ReadUint8L());
+ CleanupStack::PopAndDestroy( &readStream );
+ }
+ else
+ {
+ aRespStatus = CIptvNetworkSelection::EGeneralError;
+ }
+
+ User::LeaveIfError(error);
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::GetRespStatusL()
+// -----------------------------------------------------------------------------
+//
+MIptvServiceManagementClientObserver::TRespStatus CIptvServiceManagementClient::GetRespStatusL()
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::GetRespStatusL()");
+
+ if(iStatus.Int() != KErrNone)
+ {
+ //operation leaved on server side -> mark request as failed
+ IPTVLOGSTRING2_LOW_LEVEL("CIptvServiceManagementClient:: operation leaved on server side (error code = %d)->EGeneralError", iStatus.Int());
+ return MIptvServiceManagementClientObserver::EGeneralError;
+ }
+
+ RDesReadStream readStream;
+ readStream.Open(iMsgPtr);
+ CleanupClosePushL( readStream );
+ MIptvServiceManagementClientObserver::TRespStatus respStatus = MIptvServiceManagementClientObserver::EGeneralError;
+
+ TRAPD(err,
+ respStatus = static_cast<MIptvServiceManagementClientObserver::TRespStatus>(readStream.ReadUint8L());
+ );
+
+ if (err != KErrNone)
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: failed to read status!");
+ respStatus = MIptvServiceManagementClientObserver::EGeneralError;
+ }
+
+ CleanupStack::PopAndDestroy( &readStream );
+
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::GetRespStatusL() exit");
+ return respStatus;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::GetServicesL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CIptvServiceManagementClient::GetServicesL(const TDesC& aProviderId,
+ CIptvServices& aServices)
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::GetServicesL(aProviderId)");
+
+ if(IsActive())
+ {
+ return KErrNotReady;
+ }
+
+ /* EIptvEngineSmGetServiceSizeUsingProviderId client->server message format:
+ * ------------------------------------
+ * TUint32 aProviderIdLength
+ * TBuf<aProviderIdLength> aProviderId
+ * ------------------------------------
+ */
+
+ /* EIptvEngineSmGetServiceSizeUsingProviderId server->client message format:
+ * -------------------------------
+ * TUint32 aSize
+ * -------------------------------
+ */
+
+ /* EIptvEngineSmGetServiceDataUsingProviderId client->server message format:
+ * --------------------
+ * --------------------
+ */
+
+ /* EIptvEngineSmGetServiceDataUsingProviderId server->client message format:
+ * ---------------------------------------------
+ * CIptvServices object in binary format
+ * ---------------------------------------------
+ */
+
+ //build EIptvEngineSmGetServiceSizeUsingProviderId client->server
+ HBufC8* ipcMsg = HBufC8::NewL(4 + aProviderId.Length()*2);
+ CleanupStack::PushL(ipcMsg);
+ TPtr8 ipcMsgPtr(ipcMsg->Des());
+ ipcMsgPtr.Zero();
+
+ RDesWriteStream writeStream;
+ writeStream.Open(ipcMsgPtr);
+ CleanupClosePushL( writeStream );
+ writeStream.WriteUint32L(aProviderId.Length());
+ TInt i;
+ for(i = 0; i < aProviderId.Length(); i++)
+ {
+ writeStream.WriteInt16L(aProviderId[i]);
+ }
+
+ CleanupStack::PopAndDestroy( &writeStream );
+
+ //send size request
+ TInt resp = iSession.SendRequest(EIptvEngineSmGetServiceSizeUsingProviderId, ipcMsgPtr);
+
+ if(resp != KErrNone)
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: size resp error");
+ CleanupStack::PopAndDestroy(ipcMsg);
+ return resp;
+ }
+
+ //build data request
+ TUint32 dataSize;
+ RDesReadStream readStream;
+ readStream.Open(ipcMsgPtr);
+ CleanupClosePushL( readStream );
+ dataSize = readStream.ReadUint32L();
+ CleanupStack::PopAndDestroy( &readStream );
+ CleanupStack::PopAndDestroy(ipcMsg);
+ ipcMsg = NULL;
+ ipcMsg = HBufC8::NewL(dataSize);
+ CleanupStack::PushL(ipcMsg);
+ ipcMsgPtr.Set(ipcMsg->Des());
+
+ //send data request
+ resp = iSession.SendRequest(EIptvEngineSmGetServiceDataUsingProviderId, ipcMsgPtr);
+
+ if(resp != KErrNone)
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: data resp error");
+ CleanupStack::PopAndDestroy(ipcMsg);
+ return resp;
+ }
+
+ //read services data
+ readStream.Open(ipcMsgPtr);
+ CleanupClosePushL( readStream );
+ aServices.InternalizeL(readStream);
+ CleanupStack::PopAndDestroy( &readStream );
+
+ CleanupStack::PopAndDestroy(ipcMsg); // <-1
+
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: Get services using provider id successful.");
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::GetServicesL(aProviderId) exit");
+ return resp;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::SetAllIapsReqL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvServiceManagementClient::SetAllIapsReqL(CIptvIapList& /* aIapList */,
+ TBool /*aIgnoreReadOnlyFlag*/)
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::SetAllIapsReqL()");
+
+ if(IsActive())
+ {
+ User::Leave(KErrNotReady);
+ }
+
+ delete iMsg;
+ iMsg = NULL;
+
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: !!! Not Supported Yet!!!");
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::SetAllIapsReqL() exit");
+ User::Leave(KErrNotSupported); //not supported yet
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::SetAllIapsL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CIptvServiceManagementClient::SetAllIapsL(
+ CIptvIapList& /*aIapList*/,
+ TBool /*aIgnoreReadOnlyFlag*/,
+ MIptvServiceManagementClientObserver::TRespStatus& /*aRespStatus*/)
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::SetAllIapsL()");
+
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient:: !!! Not Supported Yet!!!");
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::SetAllIapsL() exit");
+ User::Leave( KErrNotSupported );
+ }
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::HandleEvent()
+// -----------------------------------------------------------------------------
+//
+void CIptvServiceManagementClient::HandleEvent( MIptvEvent& aEvent )
+ {
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::HandleEvent()");
+
+ //this event is never routed to synchronizer
+ iClient.HandleSmEvent( static_cast<CIptvSmEvent&>( aEvent ) );
+
+ IPTVLOGSTRING_LOW_LEVEL("CIptvServiceManagementClient::HandleEvent() exit");
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::BuildAddServiceReqL()
+// -----------------------------------------------------------------------------
+//
+void CIptvServiceManagementClient::BuildAddServiceReqL( CIptvService& aService )
+ {
+ delete iMsg;
+ iMsg = NULL;
+ iMsg = HBufC8::NewL( aService.CountExternalizeSize() );
+ iMsgPtr.Set( iMsg->Des() );
+ iMsgPtr.Zero();
+
+ //initialize stream object to use ipc msg as a data buffer
+ RDesWriteStream writeStream;
+ writeStream.Open( iMsgPtr );
+ CleanupClosePushL( writeStream );
+ aService.ExternalizeL( writeStream );
+ CleanupStack::PopAndDestroy( &writeStream );
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::BuildUpdateServiceReqL()
+// -----------------------------------------------------------------------------
+//
+void CIptvServiceManagementClient::BuildUpdateServiceReqL( CIptvService& aService )
+ {
+ delete iMsg;
+ iMsg = NULL;
+ iMsg = HBufC8::NewL( aService.CountExternalizeSize() );
+ iMsgPtr.Set( iMsg->Des() );
+
+ iMsgPtr.Zero();
+
+ RDesWriteStream writeStream;
+
+ //initialize stream object to use ipc msg as a data buffer
+ writeStream.Open( iMsgPtr );
+ CleanupClosePushL( writeStream );
+ aService.ExternalizeL(writeStream);
+ CleanupStack::PopAndDestroy( &writeStream );
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::BuildGetServicesReqL()
+// -----------------------------------------------------------------------------
+//
+void CIptvServiceManagementClient::BuildGetServicesSizeReqL(
+ TUint32 aSearchLimitFlags,
+ TOrder aOrder)
+ {
+ delete iMsg;
+ iMsg = NULL;
+ iMsg = HBufC8::NewL(4 /* TUint32 aSearchLimitFlags*/ + 1 /* TUint8 aOrder*/);
+ iMsgPtr.Set( iMsg->Des() );
+ iMsgPtr.Zero();
+
+ RDesWriteStream writeStream;
+ writeStream.Open( iMsgPtr );
+ CleanupClosePushL( writeStream );
+ writeStream.WriteUint32L( aSearchLimitFlags );
+ writeStream.WriteUint8L( aOrder );
+ CleanupStack::PopAndDestroy( &writeStream );
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::InternalizeGetServicesDataRespL()
+// -----------------------------------------------------------------------------
+//
+CDesC8ArraySeg* CIptvServiceManagementClient::InternalizeGetServicesDataRespL()
+ {
+ RDesReadStream readStream;
+ readStream.Open(iMsgPtr); // open
+ CleanupClosePushL( readStream );
+ TUint8 status = readStream.ReadUint8L();
+
+ if(status != MIptvServiceManagementClientObserver::ESucceeded)
+ {
+ IPTVLOGSTRING2_LOW_LEVEL("CIptvServiceManagementClient:: get services data req failed: %d", status);
+ CleanupStack::PopAndDestroy( &readStream );
+ User::Leave(KErrGeneral);
+ }
+
+ TUint32 itemCount = readStream.ReadUint32L();
+ TUint32 i;
+
+ CDesC8ArraySeg* stringArray;
+ stringArray = new (ELeave) CDesC8ArraySeg(10);
+ CleanupStack::PushL(stringArray);
+
+ CIptvService* service = CIptvService::NewL();
+ CleanupStack::PushL(service);
+
+ for(i = 0; i < itemCount; i++)
+ {
+ service->InternalizeL(readStream);
+ HBufC8* serviceData = service->GetL();
+ CleanupStack::PushL(serviceData);
+ stringArray->AppendL(serviceData->Des());
+ CleanupStack::PopAndDestroy(serviceData);
+ }
+
+ CleanupStack::PopAndDestroy(service);
+ CleanupStack::Pop(stringArray); // don't delete since it's given to caller
+ CleanupStack::PopAndDestroy( &readStream );
+
+ delete iMsg;
+ iMsg = NULL;
+
+ return stringArray;
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::BuildDeleteServiceReqL()
+// -----------------------------------------------------------------------------
+//
+void CIptvServiceManagementClient::BuildDeleteServiceReqL(TUint32 aId)
+ {
+ delete iMsg;
+ iMsg = NULL;
+ iMsg = HBufC8::NewL(4);
+ iMsgPtr.Set(iMsg->Des());
+
+ RDesWriteStream writeStream;
+ writeStream.Open(iMsgPtr);
+ CleanupClosePushL( writeStream );
+ writeStream.WriteUint32L(aId);
+ CleanupStack::PopAndDestroy( &writeStream );
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::BuildGetServicesUsingIndexSizeReq()
+// -----------------------------------------------------------------------------
+//
+void CIptvServiceManagementClient::BuildGetServicesUsingIndexSizeReqL(TUint32 aStartId, TUint32 aEndId)
+ {
+ delete iMsg;
+ iMsg = NULL;
+ iMsg = HBufC8::NewL(4 /* TUint32 aStartId */ + 4 /* TUint32 aEndId */);
+ iMsgPtr.Set(iMsg->Des());
+
+ RDesWriteStream writeStream;
+ writeStream.Open(iMsgPtr);
+ CleanupClosePushL( writeStream );
+ writeStream.WriteUint32L(aStartId); //+4
+ writeStream.WriteUint32L(aEndId); //+4
+ CleanupStack::PopAndDestroy( &writeStream );
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::BuildGetUsedIapReqL()
+// -----------------------------------------------------------------------------
+//
+void CIptvServiceManagementClient::BuildGetUsedIapReqL( TUint32 aServiceId )
+ {
+ delete iMsg;
+ iMsg = NULL;
+
+ /* EIptvEngineNsGetUsedIapReq message format:
+ * ------------------
+ * TUint32 aServiceId
+ * ------------------
+ */
+
+ /* EIptvEngineNsGetUsedIapResp message format:
+ * -------------------
+ * TUint8 aRespStatus
+ * TUint32 aIapId
+ * TUint16 aIapNameLength
+ * <aIapNameLength * TUint16> aIapNameData (contains SSID if iapname not found)
+ * TUint8 aConnectionPermission
+ * -------------------
+ */
+
+ iMsg = HBufC8::NewL( 1+4+2+(KIptvNsIapNameMaxLength*2)+1 );
+ iMsgPtr.Set( iMsg->Des() );
+
+ RDesWriteStream writeStream;
+ writeStream.Open(iMsgPtr);
+ CleanupClosePushL( writeStream );
+ writeStream.WriteUint32L( aServiceId );
+ CleanupStack::PopAndDestroy( &writeStream );
+ }
+
+// -----------------------------------------------------------------------------
+// CIptvServiceManagementClient::HandleGetUsedIapRespL()
+// -----------------------------------------------------------------------------
+//
+void CIptvServiceManagementClient::HandleGetUsedIapRespL( TUint32& aIapId,
+ TDes& aIapName,
+ CIptvNetworkSelection::TConnectionPermission& aConnectionPermission,
+ TUint8& aWlanWhenGprs,
+ CIptvNetworkSelection::TRespStatus& aRespStatus )
+ {
+ /* EIptvEngineNsGetUsedIapReq message format:
+ * ------------------
+ * TUint32 aServiceId
+ * ------------------
+ */
+
+ /* EIptvEngineNsGetUsedIapResp message format:
+ * -------------------
+ * TUint8 aRespStatus
+ * TUint32 aIapId
+ * TUint16 aIapNameLength
+ * <aIapNameLength * TUint16> aIapNameData (contains SSID if iapname not found)
+ * TUint8 aConnectionPermission
+ * TUint8 aWlanWhenGprs
+ * -------------------
+ */
+
+ RDesReadStream readStream;
+ readStream.Open( iMsgPtr );
+ CleanupClosePushL( readStream );
+ aRespStatus
+ = static_cast<CIptvNetworkSelection::TRespStatus>(readStream.ReadUint8L());
+ aIapId = readStream.ReadUint32L();
+ CIptvUtil::ReadDesFromStreamL( aIapName, readStream );
+ aConnectionPermission =
+ static_cast<CIptvNetworkSelection::TConnectionPermission>( readStream.ReadUint8L() );
+ aWlanWhenGprs = readStream.ReadUint8L();
+ CleanupStack::PopAndDestroy( &readStream );
+ }