videofeeds/provisioningappui/Src/IptvProvisioningAppUi.cpp
changeset 0 96612d01cf9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videofeeds/provisioningappui/Src/IptvProvisioningAppUi.cpp	Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,1161 @@
+/*
+* Copyright (c) 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: 
+*
+*/
+
+
+
+
+// INCLUDES
+#include <eikdoc.h>
+#include "IptvDebug.h"
+#include "CIptvIapList.h"
+#include "CIptvUtil.h"
+#include <StringLoader.h>
+#include <AknQueryDialog.h>
+#include <IptvProvisioningApp.rsg>
+#include <aknnotewrappers.h>
+#include <apgcli.h> // RApaLsSession
+#include <bautils.h>
+
+#include "CIptvService.h"
+#include "CIptvServiceManagementClient.h"
+#include "CIptvProvisioningProcessor.h"
+#include "IptvProvisioningAppUi.h"
+#include "IptvProvisioningApp.h"
+#include "IptvProvisioningDocument.h"
+#include "iptvlocalisationliterals.h"
+#include <videoplayeractivationmessage.h>
+
+// CONSTANTS
+const TUid KUidMpxVideoPlayerApplication = { 0x200159B2 };
+const TUid KMessageUid = { 10500 };
+
+// ============================ MEMBER FUNCTIONS ==============================
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::CIptvProvisioningAppUi()
+// ----------------------------------------------------------------------------
+//
+CIptvProvisioningAppUi::CIptvProvisioningAppUi()
+    {
+    // None
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::ConstructL()
+// ----------------------------------------------------------------------------
+
+void CIptvProvisioningAppUi::ConstructL()
+    {
+    // Call base classes ConstructL method.
+    BaseConstructL( ENoScreenFurniture | EAknEnableMSK );
+
+    StatusPane()->MakeVisible( EFalse );
+    HideApplicationFromFSW( ETrue );
+    iEcomSession = REComSession::OpenL();
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::~CIptvProvisioningAppUi()
+// ----------------------------------------------------------------------------
+//
+CIptvProvisioningAppUi::~CIptvProvisioningAppUi()
+    {
+    iEcomSession.Close();
+    REComSession::FinalClose();
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::HandleKeyEventL( )
+// ----------------------------------------------------------------------------
+//
+TKeyResponse CIptvProvisioningAppUi::HandleKeyEventL(
+    const TKeyEvent& /*aKeyEvent*/,
+    TEventCode /*aType*/ )
+    {
+    // Do not consume any keyevents in here
+    return EKeyWasNotConsumed;
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::HandleCommandL( TInt aCommand)
+// ----------------------------------------------------------------------------
+//
+void CIptvProvisioningAppUi::HandleCommandL( TInt /*aCommand*/ )
+    {
+    // Since there is no menubars etc there is no need for the
+    // implementation of this method
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::ProcessCommandParametersL( TInt aCommand)
+// ----------------------------------------------------------------------------
+//
+TBool CIptvProvisioningAppUi::ProcessCommandParametersL(
+    TApaCommand /*aCommand*/,
+    TFileName& /*aDocumentName*/,
+    const TDesC8& /*aTail*/ )
+    {
+    // Always return ETrue to make CIptvProvisioningDocument's
+    // OpenFileL to be called.
+    return ETrue;
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::HandleFileL( TInt aCommand)
+// ----------------------------------------------------------------------------
+//
+void CIptvProvisioningAppUi::HandleFileL( RFile& aFile )
+    {
+    IPTVLOGSTRING_LOW_LEVEL("CIptvProvisioningAppUi::HandleFileL");
+    // Create instance of the processor which takes care of
+    // parsing the content of the xml file.
+    CIptvProvisioningProcessor* processor = CIptvProvisioningProcessor::NewL();
+    CleanupStack::PushL( processor );
+
+    // Ask processor to handle aFile that is opened by the framework.
+    CIptvServices* services = NULL;
+    TInt errorCode = KErrNone;
+    TRAPD( provisioningError,
+           services = processor->ExternalProvisionL( aFile, errorCode ) );
+    aFile.Close();
+
+    // If leave happened, set the error status so that note will be shown.
+    if ( errorCode == KErrNone && provisioningError != KErrNone )
+        {
+        errorCode = provisioningError;
+        }
+
+    // Since processor is not needed in here any more, we can destroy
+    // it now
+    CleanupStack::PopAndDestroy( processor );
+
+    // If there was something wrong while parsing the provisioning data
+    // just stop things immediatelly. Xml file MUST be constructed in
+    // the way that processor wont get any error messages during parsing.
+    if ( errorCode != KErrNone )
+        {
+        if ( services )
+            {
+            delete services;
+            }
+
+        if ( errorCode == KIptvInvalidServiceType )
+            {
+            ShowInvalidServiceTypeNoteL();
+            }
+        else
+            {
+            ShowInvalidDataNoteL();
+            }
+
+        User::Exit( 0 );
+        }
+
+    if ( services )
+        {
+        CleanupStack::PushL( services );
+        HandleServicesAdditionL( services );
+        CleanupStack::PopAndDestroy( services );
+        }
+
+    // Finally close this app since our job here is done
+    User::Exit( 0 );
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::HandleServiceAdditionL()
+// ----------------------------------------------------------------------------
+//
+void CIptvProvisioningAppUi::HandleServicesAdditionL( CIptvServices* aServices )
+    {
+    IPTVLOGSTRING_LOW_LEVEL( "CIptvProvisioningAppUi::HandleServicesAdditionL" );
+
+    if ( !aServices )
+        {
+        IPTVLOGSTRING_LOW_LEVEL( "Leave: NULL argument aServices" );
+        User::Leave( KErrArgument );
+        }
+
+    IPTVLOGSTRING2_LOW_LEVEL( "Received %d services", aServices->Count() );
+
+    TInt counter( ( aServices->Count() > KMaxNumberOfServices ) ?
+        KMaxNumberOfServices : aServices->Count() );
+    CIptvService* service = NULL;
+    TInt32 launchId( KErrNotFound );
+    TUint32 receivedGgroupId( 0 );
+    TUint32 lauchGroupId( 0 );
+
+    // Create instance of service management client
+    CIptvServiceManagementClient* client =
+        CIptvServiceManagementClient::NewL( *this );
+    CleanupStack::PushL( client );
+
+    // Array for existing group items
+    RArray<TUint32> existingGroupIds;
+    CleanupClosePushL( existingGroupIds );
+    FindExistingGroupedIdsL( client, existingGroupIds );
+
+    // Orginal group items order
+    RArray<TUint32> groupItemsOrder;
+    CleanupClosePushL( groupItemsOrder );
+
+    // Add new services
+    for ( TInt i = 0; i < counter; i++ )
+        {
+        service = aServices->GetServiceL( i );
+        CleanupStack::PushL( service );
+
+        // Check that plugin for service exist and user want's to install
+        // service before proceeding
+        if ( IsServiceValidL( *service ) )
+            {
+            if ( VerifyServiceGroupL(
+                client, *service, receivedGgroupId, lauchGroupId ) )
+                {
+                CIptvServices* tempServices = CIptvServices::NewL();
+                CleanupStack::PushL( tempServices );
+                TInt err( client->GetServicesL(
+                    service->GetProviderId(), *tempServices ) );
+
+                // If get services was successful and there
+                // was no service for serviceId found, we can add new
+                // service to the database.
+                if ( err == KErrNone )
+                    {
+                    TBool feed( EFalse );
+                    TBool noNote( service->GetGroupId() > 0 &&
+                        service->GetType() != CIptvService::EServiceGroup );
+                    TRespStatus status( EEmpty );
+
+                    if ( tempServices->Count() == 0 )
+                        {
+                        // Add new service
+                        if ( noNote || DoesUserWantToInstallServiceL( *service ) )
+                            {
+                            IPTVLOGSTRING_LOW_LEVEL("Calling client->AddServiceL");
+
+                            // Before adding the service to service list, check if has
+                            // any IAPs defined. If doesn't, add some if we are allowed.
+                            if ( ( service->GetIapList().Count() == 0 ) &&
+                                !( service->GetFlags() & CIptvService::EReadOnlyIaps ) )
+                                {
+                                CIptvIapList* iapList = CIptvIapList::NewL();
+                                CleanupStack::PushL( iapList );
+
+                                // Get IAP list for the new service.
+                                if ( GetIapListForNewServiceL( client, *iapList ) == KErrNone )
+                                    {
+                                    service->SetIapListL( *iapList );
+                                    }
+
+                                CleanupStack::PopAndDestroy( iapList );
+                                }
+
+                            // Send request to add parsed service to the database
+                            err = client->AddServiceL( *service, status );
+
+                            // Save orginal order of services in vcfg
+                            if ( noNote && err == KErrNone )
+                                {
+                                groupItemsOrder.Append(
+                                    GetServiceIdByProviderIdL(
+                                        client, service->GetProviderId() ) );
+                                }
+
+                            // Only vod & vodcast & servicegroup services are not installed to main level.
+                            if ( service->GetType() == CIptvService::EVod ||
+                                 service->GetType() == CIptvService::EVodCast ||
+                                 service->GetType() == CIptvService::EServiceGroup )
+                                {
+                                feed = ETrue;
+                                }
+
+                            // First new added succesfully, store the serviceId for query.
+                            if ( err == KErrNone && status == ESucceeded  &&
+                                 launchId == KErrNotFound && feed && !noNote )
+                                {
+                                launchId = GetServiceIdByProviderIdL(
+                                    client, service->GetProviderId() );
+                                }
+                            }
+                        else
+                            {
+                            err = KErrCancel;
+                            }
+                        }
+                    else if ( tempServices->Count() == 1 ) // Update
+                        {
+                        if ( noNote || OverwriteExistingServiceL( service->GetName() ) )
+                            {
+                            IPTVLOGSTRING_LOW_LEVEL("Calling client->UpdateServiceL");
+
+                            // Get the service and dig out the auto-increment service-id
+                            // from existing service and set it to the one to be updated
+                            CIptvService* existingService = tempServices->GetServiceL( 0 );
+                            CleanupStack::PushL( existingService );
+
+                            const TInt existingId( existingService->GetId() );
+                            service->SetId( existingId );
+                            const TInt existingGroup( existingGroupIds.Find( existingId ) );
+                            if ( existingGroup > KErrNotFound )
+                                {
+                                existingGroupIds.Remove( existingGroup );
+                                }
+
+                            // Before updating service, chech if it has any IAPs defined.
+                            // If it doesn't, take IAPs from old service if we are allowed.
+                            if ( ( service->GetIapList().Count() == 0 ) &&
+                                !( service->GetFlags() & CIptvService::EReadOnlyIaps ) )
+                                {
+                                service->SetIapListL( existingService->GetIapList() );
+                                }
+
+                            err = client->UpdateServiceL( *service, status );
+
+                            // Save orginal order of services in vcfg
+                            if ( noNote && err == KErrNone )
+                                {
+                                groupItemsOrder.Append( existingId );
+                                }
+
+                            // Only vod & vodcast services are not installed to main level.
+                            if ( service->GetType() == CIptvService::EVod ||
+                                 service->GetType() == CIptvService::EVodCast ||
+                                 service->GetType() == CIptvService::EServiceGroup )
+                                {
+                                feed = ETrue;
+                                }
+
+                            // First one updated succesfully, store the serviceId for query.
+                            if ( err == KErrNone && status == ESucceeded &&
+                                 launchId == KErrNotFound && feed && !noNote )
+                                {
+                                IPTVLOGSTRING2_LOW_LEVEL("CIptvProvisioningAppUi::HandleServicesAdditionL update id:%d", existingService->GetId() );
+                                launchId = existingService->GetId();
+                                }
+
+                            CleanupStack::PopAndDestroy( existingService );
+                            }
+                        else
+                            {
+                            err = KErrCancel;
+                            }
+                        }
+                    else
+                        {
+                        // What if there is two services found from db with
+                        // same ProvidedId.
+                        // Situation might be that two separate service providers
+                        // deliver their provisioning xml files and they have same
+                        // ProviderId. This situation should be rather rare case
+                        // because ProviderId is usually a url pointing to some
+                        // provider specific address.
+                        }
+
+                    // Check, everything go right. Currently there is no feedback defined
+                    // to be shown for the user was the operation successful or not
+                    if ( err == KErrNone && status == ESucceeded )
+                        {
+                        // Everything went just fine. If in the future there is a need
+                        // to display note to the user about successful operation,
+                        // add it here
+                        IPTVLOGSTRING_LOW_LEVEL("Add/Update service: err = KErrNone, status = ESucceeded");
+                        if ( !noNote && !feed )
+                            {
+                            // Done note shown only if not feed type
+                            ShowDoneNoteL( feed );
+                            }
+                        }
+                    else
+                        {
+                        // Service was not installed to the service database. If user
+                        // needs to be notified about the error situation, do it here.
+                        IPTVLOGSTRING3_LOW_LEVEL("Add/Update service: err = %d, status = %d", err, status );
+                        }
+                    }
+
+                CleanupStack::PopAndDestroy( tempServices );
+                }
+            }
+
+        CleanupStack::PopAndDestroy( service );
+        }
+
+    // Handle grouped items
+    if ( receivedGgroupId > 0 )
+        {
+        // Update parsed indication of group feed
+        SetGroupReceivedL( client, receivedGgroupId );
+        // Remove existing non updated group services
+        DeleteExistingGroupedIdsL( client, existingGroupIds, receivedGgroupId );
+        // Verify and force order of group items
+        ForceOrderOfGroupedServicesL( client, groupItemsOrder );
+        }
+
+    CleanupStack::PopAndDestroy( &groupItemsOrder );
+    CleanupStack::PopAndDestroy( &existingGroupIds );
+    CleanupStack::PopAndDestroy( client );
+
+    // All db modification made. Now show query to open first added feed.
+    if ( launchId > KErrNotFound )
+        {
+        QueryAddedServiceOpenL( launchId, lauchGroupId );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::GetIapListForNewServiceL()
+// Gathers list of IAPs from other user defined services.
+// -----------------------------------------------------------------------------
+//
+TInt CIptvProvisioningAppUi::GetIapListForNewServiceL(
+    CIptvServiceManagementClient* aClient,
+    CIptvIapList& aIapList ) const
+    {
+    if ( !aClient )
+        {
+        IPTVLOGSTRING_LOW_LEVEL( "Leave: NULL argument aClient" );
+        User::Leave( KErrArgument );
+        }
+
+    MIptvServiceManagementClientObserver::TRespStatus respStatus;
+    CDesC8ArraySeg* services = NULL;
+
+    TInt error = aClient->GetServicesL( 0,
+                    CIptvServiceManagementClient::EDisplayOrderAscending,
+                    services,
+                    respStatus );
+
+    if ( error == KErrNone && services )
+        {
+        CleanupStack::PushL( services );
+
+        CIptvService* service = CIptvService::NewL();
+        CleanupStack::PushL( service );
+
+        // Go through all services.
+        for (TInt i = 0; i < services->Count(); i++ )
+            {
+            service->SetL( services->MdcaPoint(i) );
+
+            TUint32 flags = service->GetFlags();
+
+            // Only copy IAPs from user modifiable services (not provisioned).
+            if ( ! (flags & CIptvService::EReadOnlyIaps) )
+                {
+                // Go through all IAPs for this service.
+                for ( TUint8 j = 0; j < service->iIapList->Count(); j++ )
+                    {
+                    TIptvIap& existingIap = service->iIapList->IapL( j );
+
+                    // Check that this IAP is not already on user's list.
+                    TBool bFound = EFalse;
+                    for ( TUint8 k = 0; k < aIapList.Count(); k++ )
+                        {
+                        TIptvIap& userIap = aIapList.IapL( k );
+
+                        if ( userIap.iId == existingIap.iId )
+                            {
+                            bFound = ETrue;
+                            break;
+                            }
+                        }
+
+                    // Add IAP to user's list.
+                    if ( ! bFound )
+                        {
+                        aIapList.AddIap( existingIap );
+                        }
+                    }
+                }
+            }
+
+        CleanupStack::PopAndDestroy( service );
+        services->Reset();
+        CleanupStack::PopAndDestroy( services );
+
+        if ( aIapList.Count() > 0 )
+            {
+            return KErrNone;
+            }
+        }
+    return KErrNotFound;
+    }
+
+// ---------------------------------------------------------------------------
+// CIptvProvisioningAppUi::DoesUserWantToInstallServiceL( CIptvService& )
+// ---------------------------------------------------------------------------
+//
+TBool CIptvProvisioningAppUi::DoesUserWantToInstallServiceL(
+    CIptvService& aService ) const
+    {
+    IPTVLOGSTRING_LOW_LEVEL(
+        "CIptvProvisioningAppUi::DoesUserWantToInstallServiceL" );
+
+    TBool install( EFalse );
+
+    // Create confirmation text combining resourse text and localised name
+    // of the service.
+    HBufC* confirmationText;
+    HBufC* localisedServiceName( NULL );
+    if ( 0 == aService.GetName().CompareF( KQtnIptvVideoStoreList ) )
+        {
+        localisedServiceName = StringLoader::LoadLC( R_IPTV_VIDEO_STORE_LIST );
+        confirmationText = StringLoader::LoadLC(
+                            R_IPTV_INSTALL_PROVISIONING_SERVICE,
+                            *localisedServiceName );
+        }
+    else
+        {
+        confirmationText = StringLoader::LoadLC(
+                            R_IPTV_INSTALL_PROVISIONING_SERVICE,
+                            aService.GetName() );
+        }
+
+    CAknQueryDialog* dialog = new( ELeave ) CAknQueryDialog(
+                                *confirmationText,
+                                CAknQueryDialog::ENoTone );
+
+    // Kick the dialog to the screen and wait for an answer.
+    if ( dialog->ExecuteLD( R_IPTV_PROVISIONING_QUERY_INSTALL_SERVICE )
+      == EAknSoftkeyOk )
+        {
+        install = ETrue;
+        }
+
+    // Destroy the text allocated by string loader
+    CleanupStack::PopAndDestroy( confirmationText );
+    if ( localisedServiceName )
+        {
+        CleanupStack::PopAndDestroy( localisedServiceName );
+        }
+
+    return install;
+    }
+
+// ---------------------------------------------------------------------------
+// CIptvProvisioningAppUi::OverwriteExistingServiceL( )
+// ---------------------------------------------------------------------------
+//
+TBool CIptvProvisioningAppUi::OverwriteExistingServiceL(
+    const TDesC& aServiceName ) const
+    {
+    IPTVLOGSTRING_LOW_LEVEL(
+        "CIptvProvisioningAppUi::OverwriteExistingServiceL" );
+    TBool overWrite( EFalse );
+
+    // Create confirmation text combining resourse text and name of the
+    // service.
+    HBufC* confirmationText;
+    HBufC* localisedServiceName( NULL );
+    if ( 0 == aServiceName.CompareF( KQtnIptvVideoStoreList ) )
+        {
+        localisedServiceName = StringLoader::LoadLC( R_IPTV_VIDEO_STORE_LIST );
+        confirmationText = StringLoader::LoadLC(
+            R_IPTV_RESET_EXISTING_SERVICE, *localisedServiceName );
+        }
+    else
+        {
+        confirmationText = StringLoader::LoadLC(
+            R_IPTV_RESET_EXISTING_SERVICE, aServiceName );
+        }
+
+    CAknQueryDialog* dialog = new( ELeave ) CAknQueryDialog(
+            *confirmationText,
+            CAknQueryDialog::ENoTone );
+
+    // Display the dialog to the screen and wait for an answer.
+    if ( dialog->ExecuteLD(
+        R_IPTV_PROVISIONING_VOD_RESET_EXISTING_SERVICE ) == EAknSoftkeyOk )
+        {
+        overWrite = ETrue;
+        }
+
+    // Destroy the text allocated by string loader.
+    CleanupStack::PopAndDestroy( confirmationText );
+    if ( localisedServiceName )
+        {
+        CleanupStack::PopAndDestroy( localisedServiceName );
+        }
+
+    return overWrite;
+  }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::ShowInvalidDataNoteL
+// ----------------------------------------------------------------------------
+//
+void CIptvProvisioningAppUi::ShowInvalidDataNoteL() const
+    {
+    IPTVLOGSTRING_LOW_LEVEL("CIptvProvisioningAppUi::ShowInvalidDataNoteL");
+
+    HBufC* text = StringLoader::LoadLC( R_IPTV_INVALID_DATA );
+    CAknErrorNote* note = new( ELeave ) CAknErrorNote( R_AKN_ERROR_NOTE );
+
+    note->ExecuteLD(*text);
+    CleanupStack::PopAndDestroy(text);
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::ShowInvalidServiceTypeNoteL
+// ----------------------------------------------------------------------------
+//
+void CIptvProvisioningAppUi::ShowInvalidServiceTypeNoteL() const
+    {
+    IPTVLOGSTRING_LOW_LEVEL("CIptvProvisioningAppUi::ShowInvalidServiceTypeNoteL");
+
+    HBufC* text = StringLoader::LoadLC( R_IPTV_INVALID_SERVICE_TYPE );
+    CAknErrorNote* note = new( ELeave ) CAknErrorNote( R_AKN_ERROR_NOTE );
+
+    note->ExecuteLD( *text );
+    CleanupStack::PopAndDestroy( text );
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::ShowDoneNoteL
+// ----------------------------------------------------------------------------
+//
+void CIptvProvisioningAppUi::ShowDoneNoteL( TBool aFeed ) const
+    {
+    IPTVLOGSTRING_LOW_LEVEL("CIptvProvisioningAppUi::ShowDoneNoteL");
+
+    HBufC* text;
+    if ( aFeed )
+        {
+        text = StringLoader::LoadLC( R_IPTV_INSTALLED );
+        }
+    else
+        {
+        text = StringLoader::LoadLC( R_IPTV_DONE );
+        }
+
+    CAknInformationNote* note =
+        new( ELeave ) CAknInformationNote( R_AKN_INFORMATION_NOTE );
+
+    note->ExecuteLD( *text );
+    CleanupStack::PopAndDestroy( text );
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::GetServiceIdByProviderIdL
+// ----------------------------------------------------------------------------
+//
+TUint32 CIptvProvisioningAppUi::GetServiceIdByProviderIdL(
+    CIptvServiceManagementClient* aClient,
+    const TDesC& aProviderId )
+    {
+    CIptvServices* services = CIptvServices::NewL();
+    CleanupStack::PushL( services );
+    User::LeaveIfError( aClient->GetServicesL( aProviderId, *services ) );
+    TUint32 serviceId( services->GetServiceRefL( 0 ).GetId() );
+    CleanupStack::PopAndDestroy( services );
+    return serviceId;
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::QueryAddedServiceOpenL
+// ----------------------------------------------------------------------------
+//
+void CIptvProvisioningAppUi::QueryAddedServiceOpenL(
+    TUint32 aServiceId, TUint32 aGroupId )
+    {
+    IPTVLOGSTRING_LOW_LEVEL( "CIptvProvisioningAppUi::QueryAddedServiceOpenL" );
+
+    HBufC* confirmationText = StringLoader::LoadLC(
+            R_IPTV_ADDED_SERVICE_OPEN );
+
+    CAknQueryDialog* dialog = new( ELeave ) CAknQueryDialog(
+            *confirmationText, CAknQueryDialog::ENoTone );
+
+    // Display the dialog to the screen and wait for an answer.
+
+    TInt result = dialog->ExecuteLD( R_IPTV_PROVISIONING_VOD_QUERY_ADDED_SERVICE_OPEN );
+    
+    if( result == EAknSoftkeyYes || result == EAknSoftkeyOk )
+        {
+        CleanupStack::PopAndDestroy( confirmationText );
+
+        // Start / send message to Main application
+
+        RWsSession session;
+        User::LeaveIfError( session.Connect() );
+        TApaTaskList taskList( session );
+        TApaTask task = taskList.FindApp( KUidMpxVideoPlayerApplication );
+
+        if( task.Exists() )
+            {
+            // VC is open.
+            task.BringToForeground();
+
+            TVideoPlayerActivationMessage params;
+            params.iMsgType = TVideoPlayerActivationMessage::ELaunchServiceById;
+            params.iMsgSender = TVideoPlayerActivationMessage::ENotification;
+            params.iServiceId = aServiceId;
+            params.iGroupId = aGroupId;
+            params.iActive = 1;
+            params.iSingle = ETrue;
+            params.iFileId = 0;
+            params.iDrive = 0;
+            params.iFullPath = KNullDesC;
+
+            TPckg<TVideoPlayerActivationMessage> message( params );
+            TInt error = task.SendMessage( KMessageUid, message );
+
+            IPTVLOGSTRING2_LOW_LEVEL( "CIptvVodNotificationLauncher::send message error = %d", error );
+            }
+        else
+            {
+            // Task doesn't exist, launch a new instance of an application
+            RApaLsSession lsSession;
+            // connect to AppArc server
+            User::LeaveIfError( lsSession.Connect() );
+
+            TApaAppInfo appInfo;
+            if ( lsSession.GetAppInfo( appInfo, KUidMpxVideoPlayerApplication ) == KErrNone )
+                {
+                CApaCommandLine* cmdLine = CApaCommandLine::NewLC();
+                cmdLine->SetExecutableNameL( appInfo.iFullName );
+
+                TVideoPlayerActivationMessage params;
+                params.iMsgType = TVideoPlayerActivationMessage::ELaunchServiceById;
+                params.iMsgSender = TVideoPlayerActivationMessage::ENotification;
+                params.iServiceId = aServiceId;
+                params.iGroupId = aGroupId;
+                params.iActive = 1;
+                params.iSingle = ETrue;
+                params.iFileId = 0;
+                params.iDrive = 0;
+                params.iFullPath = KNullDesC;
+                TPckg<TVideoPlayerActivationMessage> message( params );
+                cmdLine->SetTailEndL( message );
+                User::LeaveIfError( lsSession.StartApp( *cmdLine ) );
+                CleanupStack::PopAndDestroy( cmdLine );
+                }
+            }
+        }
+    else
+        {
+        CleanupStack::PopAndDestroy( confirmationText );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::IsServiceValidL
+// ----------------------------------------------------------------------------
+//
+TBool CIptvProvisioningAppUi::IsServiceValidL( CIptvService& aService )
+    {
+    IPTVLOGSTRING_LOW_LEVEL("CIptvProvisioningAppUi::IsServiceValidL");
+
+    TBool liveIncluded( EFalse );
+     
+    TBool valid = EFalse;
+    RImplInfoPtrArray vodArray;
+    CleanupClosePushL( vodArray );
+    iEcomSession.ListImplementationsL( KRssPluginInterfaceUid, vodArray );
+    RImplInfoPtrArray xmlTvArray;
+    CleanupClosePushL( xmlTvArray );
+    iEcomSession.ListImplementationsL( KXmlTvPluginInterfaceUid, xmlTvArray );
+
+    // Here we check:
+    // 1) There is at least one implementation for the pluginuid defined in
+    //    service object
+    // 2) Service type is either Vod OR
+    // 3) Service type is Live AND live is included in the build AND there is a
+    //    plugin for live tv available (either smart vision plugin or xml tv plugin
+    // 4) Service type is Browser, Search or Upload
+    if ( ( aService.GetType() == CIptvService::EVod ||
+           aService.GetType() == CIptvService::EServiceGroup ||
+         ( aService.GetType() == CIptvService::EVodCast &&
+             vodArray.Count() > 0 ) ) ||
+         ( aService.GetType() == CIptvService::ELiveTv &&
+             liveIncluded && xmlTvArray.Count() > 0 ) ||
+         ( aService.GetType() == CIptvService::EBrowser ||
+           aService.GetType() == CIptvService::ESearch ||
+           aService.GetType() == CIptvService::EUpload ) )
+        {
+        valid = ETrue;
+        }
+
+    CleanupStack::PopAndDestroy( &xmlTvArray );
+    CleanupStack::PopAndDestroy( &vodArray );
+    return valid;
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::FindExistingGroupedIdsL()
+// ----------------------------------------------------------------------------
+//
+void CIptvProvisioningAppUi::FindExistingGroupedIdsL(
+    CIptvServiceManagementClient* aClient,
+    RArray<TUint32>& aExistingGroupIds )
+    {
+    IPTVLOGSTRING_LOW_LEVEL( "CIptvProvisioningAppUi::FindExistingGroupedIdsL" );
+
+    // Find exisitng group feeds
+    CDesC8ArraySeg* services = NULL;
+    MIptvServiceManagementClientObserver::TRespStatus respStatus;
+    aClient->GetServicesL(
+        CIptvServiceManagementClient::EGroupedServices,
+        CIptvServiceManagementClient::EDateAscending,
+        services, respStatus );
+
+    // Found any
+    if ( services )
+        {
+        CleanupStack::PushL( services );
+        CIptvService* service = CIptvService::NewL();
+        CleanupStack::PushL( service );
+
+        // Go through all grouped services
+        for ( TInt i( 0 ); i < services->Count(); i++ )
+            {
+            service->SetL( services->MdcaPoint( i ) );
+            aExistingGroupIds.Append( service->GetId() );
+            }
+
+        CleanupStack::PopAndDestroy( service );
+        CleanupStack::PopAndDestroy( services );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::DeleteExistingGroupedIdsL()
+// ----------------------------------------------------------------------------
+//
+void CIptvProvisioningAppUi::DeleteExistingGroupedIdsL(
+    CIptvServiceManagementClient* aClient,
+    RArray<TUint32>& aExistingGroupIds,
+    const TUint32 aReceivedGroup )
+    {
+    IPTVLOGSTRING_LOW_LEVEL( "CIptvProvisioningAppUi::DeleteExistingGroupedIdsL" );
+
+    if ( aExistingGroupIds.Count() > 0 )
+        {
+        // Find exisitng group feeds
+        CDesC8ArraySeg* services = NULL;
+        MIptvServiceManagementClientObserver::TRespStatus respStatus;
+        aClient->GetServicesL(
+            CIptvServiceManagementClient::EGroupedServices,
+            CIptvServiceManagementClient::EDateAscending,
+            services, respStatus );
+
+        // Found any
+        if ( services )
+            {
+            CleanupStack::PushL( services );
+            CIptvService* service = CIptvService::NewL();
+            CleanupStack::PushL( service );
+            // File server for icons deleting
+            RFs fs;
+            CleanupClosePushL( fs );
+            User::LeaveIfError( fs.Connect() );
+
+            // Go through all services
+            for ( TInt i( 0 ); i < services->Count(); i++ )
+                {
+                service->SetL( services->MdcaPoint( i ) );
+                if ( service->GetGroupId() == aReceivedGroup )
+                    {
+                    const TInt index(
+                        aExistingGroupIds.Find( service->GetId() ) );
+                    if ( index > KErrNotFound )
+                        {
+                        // Delete icon file if downloaded and exist
+                        if ( service->GetIconPath() != KIptvEmptyDes )
+                            {
+                            if ( BaflUtils::FileExists( fs, service->GetIconPath() ) )
+                                {
+                                fs.Delete( service->GetIconPath() );
+                                }
+                            }
+
+                        // Selete service
+                        aClient->DeleteServiceL( aExistingGroupIds[index], respStatus );
+                        if ( respStatus != MIptvServiceManagementClientObserver::ESucceeded )
+                            {
+                            IPTVLOGSTRING_LOW_LEVEL( "Error during deleting existing grouped service !" );
+                            User::Leave( KErrGeneral );
+                            }
+                        }
+                    }
+                }
+
+            // Verify grouped services items order
+            CleanupStack::PopAndDestroy( &fs );
+            CleanupStack::PopAndDestroy( service );
+            CleanupStack::PopAndDestroy( services );
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::ForceOrderOfGroupedServicesL()
+// ----------------------------------------------------------------------------
+//
+void CIptvProvisioningAppUi::ForceOrderOfGroupedServicesL(
+    CIptvServiceManagementClient* aClient,
+    RArray<TUint32>& aGroupItemsOrder )
+    {
+    IPTVLOGSTRING_LOW_LEVEL( "CIptvProvisioningAppUi::ForceOrderOfGroupedServicesL" );
+
+    // Find exisitng group feeds
+    CDesC8ArraySeg* services = NULL;
+    MIptvServiceManagementClientObserver::TRespStatus respStatus;
+    aClient->GetServicesL(
+        CIptvServiceManagementClient::EGroupedServices,
+        CIptvServiceManagementClient::EDisplayOrderAscending,
+        services, respStatus );
+
+    // Found any
+    if ( services )
+        {
+        CleanupStack::PushL( services );
+
+        for ( TInt i( 0 ); i < aGroupItemsOrder.Count(); i++ )
+            {
+            const TUint expectedId( aGroupItemsOrder[i] );
+            CIptvService* service = CIptvService::NewL();
+            CleanupStack::PushL( service );
+            service->SetL( services->MdcaPoint( i ) );
+
+            // Verify order
+            TBool needUpdate( EFalse );
+            if ( service->GetId() != expectedId )
+                {
+                // Find missplaced service
+                for ( TInt j( 0 ); j < services->Count(); j++ )
+                    {
+                    CIptvService* second = CIptvService::NewL();
+                    CleanupStack::PushL( second );
+                    second->SetL( services->MdcaPoint( j ) );
+                    if ( second->GetId() == expectedId )
+                        {
+                        // Swap those two service display order
+                        TRespStatus status( EEmpty );
+                        second->SetDisplayOrder( service->GetDisplayOrder() );
+                        TInt err( aClient->UpdateServiceL( *second, status ) );
+
+                        // Verify status
+                        if ( err != KErrNone || status != ESucceeded )
+                            {
+                            IPTVLOGSTRING3_LOW_LEVEL(
+                                "CIptvProvisioningAppUi::ForceOrderOfGroupedServicesL(), err: %d, status: %d",
+                                err, status );
+                            User::Leave( KErrCompletion );
+                            }
+
+                        // Swap done
+                        needUpdate = ETrue;
+                        j = services->Count();
+                        }
+
+                    CleanupStack::PopAndDestroy( second );
+                    }
+                }
+
+            CleanupStack::PopAndDestroy( service );
+
+            // Local services list need to be updated when display order swapped
+            if ( needUpdate )
+                {
+                CleanupStack::Pop( services );
+                delete services; services = NULL;
+                aClient->GetServicesL(
+                    CIptvServiceManagementClient::EGroupedServices,
+                    CIptvServiceManagementClient::EDisplayOrderAscending,
+                    services, respStatus );
+                CleanupStack::PushL( services );
+                }
+            }
+
+        CleanupStack::PopAndDestroy( services );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::VerifyServiceGroupL()
+// ----------------------------------------------------------------------------
+//
+TBool CIptvProvisioningAppUi::VerifyServiceGroupL(
+    CIptvServiceManagementClient* aClient,
+    CIptvService& aService,
+    TUint32& aGroupId,
+    TUint32& aLaunchId )
+    {
+    IPTVLOGSTRING_LOW_LEVEL( "CIptvProvisioningAppUi::VerifyServiceGroupL" );
+
+    const TUint32 groupId( aService.GetGroupId() );
+    if ( groupId == 0 ||
+       ( groupId > 0 && aService.GetType() == CIptvService::EServiceGroup ) )
+        {
+        // Group id for service lauch
+        if ( groupId > 0 && aLaunchId == 0 )
+            {
+            aLaunchId = groupId;
+            }
+
+        return ETrue; // Not grouped feed
+        }
+
+    // Find group feeds
+    CDesC8ArraySeg* services = NULL;
+    MIptvServiceManagementClientObserver::TRespStatus respStatus;
+    aClient->GetServicesL(
+        CIptvServiceManagementClient::EServiceGroup,
+        CIptvServiceManagementClient::EDateAscending,
+        services, respStatus );
+
+    // Found any
+    TBool found( EFalse );
+    if ( services )
+        {
+        CleanupStack::PushL( services );
+        CIptvService* service = CIptvService::NewL();
+        CleanupStack::PushL( service );
+
+        // Go through all services
+        for ( TInt i( 0 ); !found && i < services->Count(); i++ )
+            {
+            service->SetL( services->MdcaPoint( i ) );
+            if ( service->GetGroupId() == groupId )
+                {
+                found = ETrue; // ok to install
+                aGroupId = groupId;
+                }
+            }
+
+        CleanupStack::PopAndDestroy( service );
+        CleanupStack::PopAndDestroy( services );
+        }
+
+    return found;
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::SetGroupReceivedL()
+// ----------------------------------------------------------------------------
+//
+void CIptvProvisioningAppUi::SetGroupReceivedL(
+    CIptvServiceManagementClient* aClient,
+    const TUint32& aGroupId )
+    {
+    IPTVLOGSTRING_LOW_LEVEL( "CIptvProvisioningAppUi::SetGroupReceivedL" );
+
+    // Find group feeds
+    CDesC8ArraySeg* services = NULL;
+    MIptvServiceManagementClientObserver::TRespStatus respStatus;
+    aClient->GetServicesL(
+        CIptvServiceManagementClient::EServiceGroup,
+        CIptvServiceManagementClient::EDateAscending,
+        services, respStatus );
+
+    // Find and update flag
+    if ( services )
+        {
+        CleanupStack::PushL( services );
+        CIptvService* service = CIptvService::NewL();
+        CleanupStack::PushL( service );
+
+        // Go through all services
+        for ( TInt i( 0 ); i < services->Count(); i++ )
+            {
+            service->SetL( services->MdcaPoint( i ) );
+            if ( service->GetGroupId() == aGroupId )
+                {
+                service->SetFlags(
+                    service->GetFlags() | CIptvService::EGroupReceived );
+                TRespStatus status( EEmpty );
+                User::LeaveIfError(
+                    aClient->UpdateServiceL( *service, status ) );
+                i = services->Count();
+                }
+            }
+
+        CleanupStack::PopAndDestroy( service );
+        CleanupStack::PopAndDestroy( services );
+        }
+    }
+
+// Methods implemented to fullfill inheritance of
+// MIptvServiceManagementClientObserver. Implementation of the inherited
+// methods is empty since we do not use asynchorous versions of the methods
+// but nevertheless CIptvServiceManagementClient requires the observer to
+// be given for the NewL
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::AddServiceResp( TRespStatus )
+// ----------------------------------------------------------------------------
+//
+void CIptvProvisioningAppUi::AddServiceResp(
+    TRespStatus /*aRespStatus*/)
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::UpdateServiceResp( TRespStatus )
+// ----------------------------------------------------------------------------
+//
+void CIptvProvisioningAppUi::UpdateServiceResp(
+    TRespStatus /*aRespStatus*/)
+    {
+    }
+
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::DeleteServiceResp( TRespStatus )
+// ----------------------------------------------------------------------------
+//
+void CIptvProvisioningAppUi::DeleteServiceResp(
+    TRespStatus /*aRespStatus*/ )
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::GetServicesResp( TRespStatus, CDesC8ArraySeg* )
+// ----------------------------------------------------------------------------
+//
+void CIptvProvisioningAppUi::GetServicesResp(
+    TRespStatus /*aRespStatus*/,
+    CDesC8ArraySeg* /*aServicesArray*/ )
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::GetUsedIapResp( TUInt,
+//                                         const TDesC&,
+//                                         TConnectionPermission,
+//                                         TRespStatus )
+// ----------------------------------------------------------------------------
+//
+void CIptvProvisioningAppUi::GetUsedIapResp(
+    TUint32 /*aIapId*/,
+    const TDesC& /*aIapName*/,
+    CIptvNetworkSelection::TConnectionPermission /*aConnectionPermission*/,
+    TBool /*aWlanWhenGPRS*/,
+    CIptvNetworkSelection::TRespStatus /*aRespStatus*/ )
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CIptvProvisioningAppUi::ServerShutdownResp( TRespStatus )
+// ----------------------------------------------------------------------------
+//
+void CIptvProvisioningAppUi::ServerShutdownResp(
+    TRespStatus /*aRespStatus*/ )
+    {
+    }