contentcontrolsrv/hsccclient/hsccapiclient/src/hsccapiclient.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 18 Jan 2010 20:32:13 +0200
changeset 2 b7904b40483f
parent 0 79c6a41cd166
child 11 bd874ee5e5e2
permissions -rw-r--r--
Revision: 201001 Kit: 201003

/*
 * Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
 * Initial Contributors:
 * Nokia Corporation - initial contribution.
 *
 * Contributors:
 *
 * Description:  
 *
 */

// System include files
#include <s32strm.h>
#include <s32mem.h>
#include <hscontentcontrol.h>
#include <hscontentinfo.h>
#include <hscontentinfoarray.h>

// User include files
#include "hsccapiclient.h"
#include "ccresource.h"
#include "ccsrvapi.h"
#include "hsccapi.h"

// Local constants

// ======== MEMBER FUNCTIONS ========

// -----------------------------------------------------------------------------
// CHsCcApiClient::NewL()
// Two-phased constructor.
// -----------------------------------------------------------------------------
EXPORT_C CHsCcApiClient* CHsCcApiClient::NewL(
    MHsContentControl* aControlIf )
    {
    CHsCcApiClient* self = new ( ELeave ) CHsCcApiClient( aControlIf );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return( self ) ;
    }

// -----------------------------------------------------------------------
// CHsCcApiClient::ConstructL()
// -----------------------------------------------------------------------
//
void CHsCcApiClient::ConstructL()
    {
    User::LeaveIfError( iSession.Connect() );
    
    if ( iObserver )
        {
        TPckgBuf<TUint32> provider( ECcHomescreen );
        TPckgBuf<TUint32> address;
        User::LeaveIfError( iSession.RegisterObserver( 
            provider,
            address ) );
        iAddress = address();

        WaitForApiNtfL();
        }
    }

// -----------------------------------------------------------------------
// CHsCcApiClient::CHsCcApiClient()
// -----------------------------------------------------------------------
//
CHsCcApiClient::CHsCcApiClient( 
    MHsContentControl* aControlIf )
    :CActive( EPriorityStandard )
    ,iObserver( aControlIf )
    ,iAddress( 0 )
    ,iApiHeader( NULL )
    ,iApiHeaderPtr( NULL, 0 )
    ,iApiData( NULL )
    ,iApiDataPtr( NULL, 0 )
    {
    CActiveScheduler::Add( this );
    }

// -----------------------------------------------------------------------
// CHsCcApiClient::~CHsCcApiClient()
// -----------------------------------------------------------------------
//
CHsCcApiClient::~CHsCcApiClient()
    {
    Cancel();
    iSession.Close();
    delete iApiHeader;
    delete iApiData;
    }

// -----------------------------------------------------------------------------
// CHsCcApiClient::RunL()
// -----------------------------------------------------------------------------
//
void CHsCcApiClient::RunL()
    {
    if ( !iStatus.Int() )
        {
        // Get received message header
        CCcSrvMsg* message = CCcSrvMsg::NewL();
        CleanupStack::PushL( message );
        RDesReadStream stream( iApiHeaderPtr );
        CleanupClosePushL( stream );
        message->InternalizeHeaderL( stream );
        CleanupStack::PopAndDestroy( &stream );

        switch ( message->MsgId() )
            {
            case EHsCcWidgetListChangedNtf:
                if ( iObserver )
                    {
                    iObserver->NotifyWidgetListChanged();
                    }
                break;
            case EHsCcViewListChangedNtf:
                if ( iObserver )
                    {
                    iObserver->NotifyViewListChanged();
                    }
                break;
            case EHsCcAppListChangedNtf:
                if ( iObserver )
                    {
                    iObserver->NotifyAppListChanged();
                    }
                break;
            default:
                // No action required
                break;
            }
        CleanupStack::PopAndDestroy( message );
        }
    
    // Receive next API notification
    WaitForApiNtfL();

    }

// -----------------------------------------------------------------------------
// CHsCcApiClient::DoCancel()
// -----------------------------------------------------------------------------
//
void CHsCcApiClient::DoCancel()
    {
    if ( IsActive() )
        {
        TPckgBuf<TInt> function( ECcWaitForApiNtf );
        iSession.CancelReq( function );
        }
    }

// -----------------------------------------------------------------------------
// CHsCcApiClient::WidgetListL
// -----------------------------------------------------------------------------
//
TInt CHsCcApiClient::WidgetListL( CHsContentInfoArray& aArray )
    {
    TInt err( KErrNone );
    
    // Create WidgetListReq API request
    CCcSrvMsg* reqMsg = CCcSrvMsg::NewL();
    CleanupStack::PushL( reqMsg );
    reqMsg->SetMsgId( EHsCcWidgetListReq );
    reqMsg->SetTrId( 0 );
    reqMsg->SetData( KNullDesC8() );
    
    // Marshal API request
    HBufC8* msgBuf = reqMsg->MarshalL();
    CleanupStack::PushL( msgBuf );
    TPtr8 msgPtr( NULL, 0 );
    msgPtr.Set( msgBuf->Des() );
 
    // Send API request
    // Sender and receiver address not defined -> message is routed
    // according to the provider id
    TPckgBuf<TUint32> provider( ECcHomescreen );
    TPckgBuf<TUint32> sender;
    TPckgBuf<TUint32> receiver;
    err = iSession.Send( ECcApiReq, provider, sender, receiver, msgPtr );
    
    if ( !err )
        {
        // Internalize WidgetListResp API response
        CCcSrvMsg* respMsg = CCcSrvMsg::NewL();
        CleanupStack::PushL( respMsg );
        RDesReadStream respStream( msgPtr );
        CleanupClosePushL( respStream );
        respMsg->InternalizeHeaderL( respStream );
        CleanupStack::PopAndDestroy( &respStream );
        err = respMsg->Status();
        if ( !err )
            {
            if ( respMsg->DataSize() )
                {
                // Get API response data
                HBufC8* dataBuf = HBufC8::NewL( respMsg->DataSize() );
                CleanupStack::PushL( dataBuf );
                TPtr8 dataPtr( NULL, 0 );
                dataPtr.Set( dataBuf->Des() );
                TPckgBuf<TUint32> trId( respMsg->TrId() );
                err = iSession.GetMsgData( trId, dataPtr );
                if ( !err )
                    {
                    // Internalize API response data
                    RDesReadStream dataStream( dataPtr );
                    CleanupClosePushL( dataStream );
                    aArray.InternalizeL( dataStream );                    
                    CleanupStack::PopAndDestroy( &dataStream );
                    }
                CleanupStack::PopAndDestroy( dataBuf );
                }
            }
        CleanupStack::PopAndDestroy( respMsg );
        }

    // Cleanup
    CleanupStack::PopAndDestroy( msgBuf );
    CleanupStack::PopAndDestroy( reqMsg );

    return err;
    }

// -----------------------------------------------------------------------------
// CHsCcApiClient::ViewListL
// -----------------------------------------------------------------------------
//
TInt CHsCcApiClient::ViewListL( CHsContentInfoArray& aArray )
    {
    TInt err( KErrNone );
    
    // Create ViewListReq API request
    CCcSrvMsg* reqMsg = CCcSrvMsg::NewL();
    CleanupStack::PushL( reqMsg );
    reqMsg->SetMsgId( EHsCcViewListReq );
    reqMsg->SetTrId( 0 );
    reqMsg->SetData( KNullDesC8() );
    
    // Marshal API request
    HBufC8* msgBuf = reqMsg->MarshalL();
    CleanupStack::PushL( msgBuf );
    TPtr8 msgPtr( NULL, 0 );
    msgPtr.Set( msgBuf->Des() );
 
    // Send API request
    // Sender and receiver address not defined -> message is routed
    // according to the provider id
    TPckgBuf<TUint32> provider( ECcHomescreen );
    TPckgBuf<TUint32> sender;
    TPckgBuf<TUint32> receiver;
    err = iSession.Send( ECcApiReq, provider, sender, receiver, msgPtr );
    
    if ( !err )
        {
        // Internalize ViewListResp API response
        CCcSrvMsg* respMsg = CCcSrvMsg::NewL();
        CleanupStack::PushL( respMsg );
        RDesReadStream respStream( msgPtr );
        CleanupClosePushL( respStream );
        respMsg->InternalizeHeaderL( respStream );
        CleanupStack::PopAndDestroy( &respStream );
        err = respMsg->Status();
        if ( !err )
            {
            if ( respMsg->DataSize() )
                {
                // Get API response data
                HBufC8* dataBuf = HBufC8::NewL( respMsg->DataSize() );
                CleanupStack::PushL( dataBuf );
                TPtr8 dataPtr( NULL, 0 );
                dataPtr.Set( dataBuf->Des() );
                TPckgBuf<TUint32> trId( respMsg->TrId() );
                err = iSession.GetMsgData( trId, dataPtr );
                if ( !err )
                    {
                    // Internalize API response data
                    RDesReadStream dataStream( dataPtr );
                    CleanupClosePushL( dataStream );
                    aArray.InternalizeL( dataStream );                    
                    CleanupStack::PopAndDestroy( &dataStream );
                    }
                CleanupStack::PopAndDestroy( dataBuf );
                }
            }
        CleanupStack::PopAndDestroy( respMsg );
        }

    // Cleanup
    CleanupStack::PopAndDestroy( msgBuf );
    CleanupStack::PopAndDestroy( reqMsg );

    return err;
    }

// -----------------------------------------------------------------------------
// CHsCcApiClient::AppListL
// -----------------------------------------------------------------------------
//
TInt CHsCcApiClient::AppListL( CHsContentInfoArray& aArray )
    {
    TInt err( KErrNone );
    
    // Create AppListReq API request
    CCcSrvMsg* reqMsg = CCcSrvMsg::NewL();
    CleanupStack::PushL( reqMsg );
    reqMsg->SetMsgId( EHsCcAppListReq );
    reqMsg->SetTrId( 0 );
    reqMsg->SetData( KNullDesC8() );
    
    // Marshal API request
    HBufC8* msgBuf = reqMsg->MarshalL();
    CleanupStack::PushL( msgBuf );
    TPtr8 msgPtr( NULL, 0 );
    msgPtr.Set( msgBuf->Des() );
 
    // Send API request
    // Sender and receiver address not defined -> message is routed
    // according to the provider id
    TPckgBuf<TUint32> provider( ECcHomescreen );
    TPckgBuf<TUint32> sender;
    TPckgBuf<TUint32> receiver;
    err = iSession.Send( ECcApiReq, provider, sender, receiver, msgPtr );
    
    if ( !err )
        {
        // Internalize AppListResp API response
        CCcSrvMsg* respMsg = CCcSrvMsg::NewL();
        CleanupStack::PushL( respMsg );
        RDesReadStream respStream( msgPtr );
        CleanupClosePushL( respStream );
        respMsg->InternalizeHeaderL( respStream );
        CleanupStack::PopAndDestroy( &respStream );
        err = respMsg->Status();
        if ( !err )
            {
            if ( respMsg->DataSize() )
                {
                // Get API response data
                HBufC8* dataBuf = HBufC8::NewL( respMsg->DataSize() );
                CleanupStack::PushL( dataBuf );
                TPtr8 dataPtr( NULL, 0 );
                dataPtr.Set( dataBuf->Des() );
                TPckgBuf<TUint32> trId( respMsg->TrId() );
                err = iSession.GetMsgData( trId, dataPtr );
                if ( !err )
                    {
                    // Internalize API response data
                    RDesReadStream dataStream( dataPtr );
                    CleanupClosePushL( dataStream );
                    aArray.InternalizeL( dataStream );                    
                    CleanupStack::PopAndDestroy( &dataStream );
                    }
                CleanupStack::PopAndDestroy( dataBuf );
                }
            }
        CleanupStack::PopAndDestroy( respMsg );
        }

    // Cleanup
    CleanupStack::PopAndDestroy( msgBuf );
    CleanupStack::PopAndDestroy( reqMsg );

    return err;
    }

// -----------------------------------------------------------------------------
// CHsCcApiClient::AddWidgetL
// -----------------------------------------------------------------------------
//
TInt CHsCcApiClient::AddWidgetL( CHsContentInfo& aInfo )
    {
    TInt err( KErrNone );

    // Create AddWidgetReq API request
    CCcSrvMsg* reqMsg = CCcSrvMsg::NewL();
    CleanupStack::PushL( reqMsg );
    reqMsg->SetMsgId( EHsCcAddWidgetReq );
    reqMsg->SetTrId( 0 );

    // Marshal AddWidgetReq data to a descriptor
    HBufC8* dataBuf = aInfo.MarshalL();
    TPtr8 dataPtr( NULL, 0 );
    dataPtr.Set( dataBuf->Des() );
    reqMsg->SetData( dataPtr );
    
    delete dataBuf;
    dataBuf = NULL;
    
    // Marshal API request
    HBufC8* msgBuf = reqMsg->MarshalL();
    CleanupStack::PushL( msgBuf );
    TPtr8 msgPtr( NULL, 0 );
    msgPtr.Set( msgBuf->Des() );
    
    // Send API request
    // Sender and receiver address not defined -> message is routed
    // according to the provider id
    TPckgBuf<TUint32> provider( ECcHomescreen );
    TPckgBuf<TUint32> sender;
    TPckgBuf<TUint32> receiver;
    err = iSession.Send( ECcApiReq, provider, sender, receiver, msgPtr );
    
    if ( !err )
        {
        // Internalize AddWidgetResp API response
        CCcSrvMsg* respMsg = CCcSrvMsg::NewL();
        CleanupStack::PushL( respMsg );
        RDesReadStream respStream( msgPtr );
        CleanupClosePushL( respStream );
        respMsg->InternalizeHeaderL( respStream );
        CleanupStack::PopAndDestroy( &respStream );
        err = respMsg->Status();
        CleanupStack::PopAndDestroy( respMsg );
        }

    // Cleanup
    CleanupStack::PopAndDestroy( msgBuf );
    CleanupStack::PopAndDestroy( reqMsg );
    
    return err;
    }

// -----------------------------------------------------------------------------
// CHsCcApiClient::RemoveWidgetL
// -----------------------------------------------------------------------------
//
TInt CHsCcApiClient::RemoveWidgetL( CHsContentInfo& aInfo )
    {
    TInt err( KErrNone );

    // Create RemoveWidgetReq API request
    CCcSrvMsg* reqMsg = CCcSrvMsg::NewL();
    CleanupStack::PushL( reqMsg );
    reqMsg->SetMsgId( EHsCcRemoveWidgetReq );
    reqMsg->SetTrId( 0 );

    // Marshal RemoveWidgetReq data to a descriptor
    HBufC8* dataBuf = aInfo.MarshalL();
    TPtr8 dataPtr( NULL, 0 );
    dataPtr.Set( dataBuf->Des() );
    reqMsg->SetData( dataPtr );
    
    delete dataBuf;
    dataBuf = NULL;
    
    // Marshal API request
    HBufC8* msgBuf = reqMsg->MarshalL();
    CleanupStack::PushL( msgBuf );
    TPtr8 msgPtr( NULL, 0 );
    msgPtr.Set( msgBuf->Des() );
    
    // Send API request
    // Sender and receiver address not defined -> message is routed
    // according to the provider id
    TPckgBuf<TUint32> provider( ECcHomescreen );
    TPckgBuf<TUint32> sender;
    TPckgBuf<TUint32> receiver;
    err = iSession.Send( ECcApiReq, provider, sender, receiver, msgPtr );
    
    if ( !err )
        {
        // Internalize RemoveWidgetResp API response
        CCcSrvMsg* respMsg = CCcSrvMsg::NewL();
        CleanupStack::PushL( respMsg );
        RDesReadStream respStream( msgPtr );
        CleanupClosePushL( respStream );
        respMsg->InternalizeHeaderL( respStream );
        CleanupStack::PopAndDestroy( &respStream );
        err = respMsg->Status();
        CleanupStack::PopAndDestroy( respMsg );
        }

    // Cleanup
    CleanupStack::PopAndDestroy( msgBuf );
    CleanupStack::PopAndDestroy( reqMsg );
    
    return err;
    }

// -----------------------------------------------------------------------------
// CHsCcApiClient::AddViewL
// -----------------------------------------------------------------------------
//
TInt CHsCcApiClient::AddViewL( CHsContentInfo& aInfo )
    {
    TInt err( KErrNone );

    // Create AddViewReq API request
    CCcSrvMsg* reqMsg = CCcSrvMsg::NewL();
    CleanupStack::PushL( reqMsg );
    reqMsg->SetMsgId( EHsCcAddViewReq );
    reqMsg->SetTrId( 0 );

    // Marshal AddViewReq data to a descriptor
    HBufC8* dataBuf = aInfo.MarshalL();
    TPtr8 dataPtr( NULL, 0 );
    dataPtr.Set( dataBuf->Des() );
    reqMsg->SetData( dataPtr );
    
    delete dataBuf;
    dataBuf = NULL;
    
    // Marshal API request
    HBufC8* msgBuf = reqMsg->MarshalL();
    CleanupStack::PushL( msgBuf );
    TPtr8 msgPtr( NULL, 0 );
    msgPtr.Set( msgBuf->Des() );
    
    // Send API request
    // Sender and receiver address not defined -> message is routed
    // according to the provider id
    TPckgBuf<TUint32> provider( ECcHomescreen );
    TPckgBuf<TUint32> sender;
    TPckgBuf<TUint32> receiver;
    err = iSession.Send( ECcApiReq, provider, sender, receiver, msgPtr );
    
    if ( !err )
        {
        // Internalize AddViewResp API response
        CCcSrvMsg* respMsg = CCcSrvMsg::NewL();
        CleanupStack::PushL( respMsg );
        RDesReadStream respStream( msgPtr );
        CleanupClosePushL( respStream );
        respMsg->InternalizeHeaderL( respStream );
        CleanupStack::PopAndDestroy( &respStream );
        err = respMsg->Status();
        CleanupStack::PopAndDestroy( respMsg );
        }

    // Cleanup
    CleanupStack::PopAndDestroy( msgBuf );
    CleanupStack::PopAndDestroy( reqMsg );
    
    return err;
    }

// -----------------------------------------------------------------------------
// CHsCcApiClient::RemoveViewL
// -----------------------------------------------------------------------------
//
TInt CHsCcApiClient::RemoveViewL( CHsContentInfo& aInfo )
    {
    TInt err( KErrNone );

    // Create RemoveViewReq API request
    CCcSrvMsg* reqMsg = CCcSrvMsg::NewL();
    CleanupStack::PushL( reqMsg );
    reqMsg->SetMsgId( EHsCcRemoveViewReq );
    reqMsg->SetTrId( 0 );

    // Marshal RemoveViewReq data to a descriptor
    HBufC8* dataBuf = aInfo.MarshalL();
    TPtr8 dataPtr( NULL, 0 );
    dataPtr.Set( dataBuf->Des() );
    reqMsg->SetData( dataPtr );
    
    delete dataBuf;
    dataBuf = NULL;
    
    // Marshal API request
    HBufC8* msgBuf = reqMsg->MarshalL();
    CleanupStack::PushL( msgBuf );
    TPtr8 msgPtr( NULL, 0 );
    msgPtr.Set( msgBuf->Des() );
    
    // Send API request
    // Sender and receiver address not defined -> message is routed
    // according to the provider id
    TPckgBuf<TUint32> provider( ECcHomescreen );
    TPckgBuf<TUint32> sender;
    TPckgBuf<TUint32> receiver;
    err = iSession.Send( ECcApiReq, provider, sender, receiver, msgPtr );
    
    if ( !err )
        {
        // Internalize RemoveViewResp API response
        CCcSrvMsg* respMsg = CCcSrvMsg::NewL();
        CleanupStack::PushL( respMsg );
        RDesReadStream respStream( msgPtr );
        CleanupClosePushL( respStream );
        respMsg->InternalizeHeaderL( respStream );
        CleanupStack::PopAndDestroy( &respStream );
        err = respMsg->Status();
        CleanupStack::PopAndDestroy( respMsg );
        }

    // Cleanup
    CleanupStack::PopAndDestroy( msgBuf );
    CleanupStack::PopAndDestroy( reqMsg );
    
    return err;
    }

// -----------------------------------------------------------------------------
// CHsCcApiClient::ActivateViewL
// -----------------------------------------------------------------------------
//
TInt CHsCcApiClient::ActivateViewL( CHsContentInfo& aInfo )
    {
    TInt err( KErrNone );

    // Create ActivateViewReq API request
    CCcSrvMsg* reqMsg = CCcSrvMsg::NewL();
    CleanupStack::PushL( reqMsg );
    reqMsg->SetMsgId( EHsCcActivateViewReq );
    reqMsg->SetTrId( 0 );

    // Marshal ActivateViewReq data to a descriptor
    HBufC8* dataBuf = aInfo.MarshalL();
    TPtr8 dataPtr( NULL, 0 );
    dataPtr.Set( dataBuf->Des() );
    reqMsg->SetData( dataPtr );
    
    delete dataBuf;
    dataBuf = NULL;
    
    // Marshal API request
    HBufC8* msgBuf = reqMsg->MarshalL();
    CleanupStack::PushL( msgBuf );
    TPtr8 msgPtr( NULL, 0 );
    msgPtr.Set( msgBuf->Des() );
    
    // Send API request
    // Sender and receiver address not defined -> message is routed
    // according to the provider id
    TPckgBuf<TUint32> provider( ECcHomescreen );
    TPckgBuf<TUint32> sender;
    TPckgBuf<TUint32> receiver;
    err = iSession.Send( ECcApiReq, provider, sender, receiver, msgPtr );
    
    if ( !err )
        {
        // Internalize ActivateViewResp API response
        CCcSrvMsg* respMsg = CCcSrvMsg::NewL();
        CleanupStack::PushL( respMsg );
        RDesReadStream respStream( msgPtr );
        CleanupClosePushL( respStream );
        respMsg->InternalizeHeaderL( respStream );
        CleanupStack::PopAndDestroy( &respStream );
        err = respMsg->Status();
        CleanupStack::PopAndDestroy( respMsg );
        }

    // Cleanup
    CleanupStack::PopAndDestroy( msgBuf );
    CleanupStack::PopAndDestroy( reqMsg );
    
    return err;
    }

// -----------------------------------------------------------------------------
// CHsCcApiClient::ActivateAppL
// -----------------------------------------------------------------------------
//
TInt CHsCcApiClient::ActivateAppL( CHsContentInfo& aInfo )
    {
    TInt err( KErrNone );

    // Create ActivateAppReq API request
    CCcSrvMsg* reqMsg = CCcSrvMsg::NewL();
    CleanupStack::PushL( reqMsg );
    reqMsg->SetMsgId( EHsCcActivateAppReq );
    reqMsg->SetTrId( 0 );

    // Marshal ActivateAppReq data to a descriptor
    HBufC8* dataBuf = aInfo.MarshalL();
    TPtr8 dataPtr( NULL, 0 );
    dataPtr.Set( dataBuf->Des() );
    reqMsg->SetData( dataPtr );
    
    delete dataBuf;
    dataBuf = NULL;
    
    // Marshal API request
    HBufC8* msgBuf = reqMsg->MarshalL();
    CleanupStack::PushL( msgBuf );
    TPtr8 msgPtr( NULL, 0 );
    msgPtr.Set( msgBuf->Des() );
    
    // Send API request
    // Sender and receiver address not defined -> message is routed
    // according to the provider id
    TPckgBuf<TUint32> provider( ECcHomescreen );
    TPckgBuf<TUint32> sender;
    TPckgBuf<TUint32> receiver;
    err = iSession.Send( ECcApiReq, provider, sender, receiver, msgPtr );
    
    if ( !err )
        {
        // Internalize ActivateAppResp API response
        CCcSrvMsg* respMsg = CCcSrvMsg::NewL();
        CleanupStack::PushL( respMsg );
        RDesReadStream respStream( msgPtr );
        CleanupClosePushL( respStream );
        respMsg->InternalizeHeaderL( respStream );
        CleanupStack::PopAndDestroy( &respStream );
        err = respMsg->Status();
        CleanupStack::PopAndDestroy( respMsg );
        }

    // Cleanup
    CleanupStack::PopAndDestroy( msgBuf );
    CleanupStack::PopAndDestroy( reqMsg );
    
    return err;
    }

// -----------------------------------------------------------------------------
// CHsCcApiClient::ActiveViewL
// -----------------------------------------------------------------------------
//
TInt CHsCcApiClient::ActiveViewL( CHsContentInfo& aInfo )
    {
    TInt err( KErrNone );

    // Create ActiveViewReq API request
    CCcSrvMsg* reqMsg = CCcSrvMsg::NewL();
    CleanupStack::PushL( reqMsg );
    reqMsg->SetMsgId( EHsCcActiveViewReq );
    reqMsg->SetTrId( 0 );
    reqMsg->SetData( KNullDesC8() );
    
    // Marshal API request
    HBufC8* msgBuf = reqMsg->MarshalL();
    CleanupStack::PushL( msgBuf );
    TPtr8 msgPtr( NULL, 0 );
    msgPtr.Set( msgBuf->Des() );
 
    // Send API request
    // Sender and receiver address not defined -> message is routed
    // according to the provider id
    TPckgBuf<TUint32> provider( ECcHomescreen );
    TPckgBuf<TUint32> sender;
    TPckgBuf<TUint32> receiver;
    err = iSession.Send( ECcApiReq, provider, sender, receiver, msgPtr );
    
    if ( !err )
        {
        // Internalize AppListResp API response
        CCcSrvMsg* respMsg = CCcSrvMsg::NewL();
        CleanupStack::PushL( respMsg );
        RDesReadStream respStream( msgPtr );
        CleanupClosePushL( respStream );
        respMsg->InternalizeHeaderL( respStream );
        CleanupStack::PopAndDestroy( &respStream );
        err = respMsg->Status();
        if ( !err )
            {
            if ( respMsg->DataSize() )
                {
                // Get API response data
                HBufC8* dataBuf = HBufC8::NewL( respMsg->DataSize() );
                CleanupStack::PushL( dataBuf );
                TPtr8 dataPtr( NULL, 0 );
                dataPtr.Set( dataBuf->Des() );
                TPckgBuf<TUint32> trId( respMsg->TrId() );
                err = iSession.GetMsgData( trId, dataPtr );
                if ( !err )
                    {
                    // Internalize API response data
                    RDesReadStream dataStream( dataPtr );
                    CleanupClosePushL( dataStream );
                    aInfo.InternalizeL( dataStream );                    
                    CleanupStack::PopAndDestroy( &dataStream );
                    }
                CleanupStack::PopAndDestroy( dataBuf );
                }
            }
        CleanupStack::PopAndDestroy( respMsg );
        }

    // Cleanup
    CleanupStack::PopAndDestroy( msgBuf );
    CleanupStack::PopAndDestroy( reqMsg );
    
    return err;
    }

// -----------------------------------------------------------------------------
// CHsCcApiClient::ActiveAppL
// -----------------------------------------------------------------------------
//
TInt CHsCcApiClient::ActiveAppL( CHsContentInfo& aInfo )
    {
    TInt err( KErrNone );

    // Create ActiveViewReq API request
    CCcSrvMsg* reqMsg = CCcSrvMsg::NewL();
    CleanupStack::PushL( reqMsg );
    reqMsg->SetMsgId( EHsCcActiveAppReq );
    reqMsg->SetTrId( 0 );
    reqMsg->SetData( KNullDesC8() );
    
    // Marshal API request
    HBufC8* msgBuf = reqMsg->MarshalL();
    CleanupStack::PushL( msgBuf );
    TPtr8 msgPtr( NULL, 0 );
    msgPtr.Set( msgBuf->Des() );
 
    // Send API request
    // Sender and receiver address not defined -> message is routed
    // according to the provider id
    TPckgBuf<TUint32> provider( ECcHomescreen );
    TPckgBuf<TUint32> sender;
    TPckgBuf<TUint32> receiver;
    err = iSession.Send( ECcApiReq, provider, sender, receiver, msgPtr );
    
    if ( !err )
        {
        // Internalize AppListResp API response
        CCcSrvMsg* respMsg = CCcSrvMsg::NewL();
        CleanupStack::PushL( respMsg );
        RDesReadStream respStream( msgPtr );
        CleanupClosePushL( respStream );
        respMsg->InternalizeHeaderL( respStream );
        CleanupStack::PopAndDestroy( &respStream );
        err = respMsg->Status();
        if ( !err )
            {
            if ( respMsg->DataSize() )
                {
                // Get API response data
                HBufC8* dataBuf = HBufC8::NewL( respMsg->DataSize() );
                CleanupStack::PushL( dataBuf );
                TPtr8 dataPtr( NULL, 0 );
                dataPtr.Set( dataBuf->Des() );
                TPckgBuf<TUint32> trId( respMsg->TrId() );
                err = iSession.GetMsgData( trId, dataPtr );
                if ( !err )
                    {
                    // Internalize API response data
                    RDesReadStream dataStream( dataPtr );
                    CleanupClosePushL( dataStream );
                    aInfo.InternalizeL( dataStream );                    
                    CleanupStack::PopAndDestroy( &dataStream );
                    }
                CleanupStack::PopAndDestroy( dataBuf );
                }
            }
        CleanupStack::PopAndDestroy( respMsg );
        }

    // Cleanup
    CleanupStack::PopAndDestroy( msgBuf );
    CleanupStack::PopAndDestroy( reqMsg );
    
    return err;
    }

// -----------------------------------------------------------------------------
// CHsCcApiClient::WaitForApiNtfL()
// -----------------------------------------------------------------------------
//
void CHsCcApiClient::WaitForApiNtfL()
    {

    if ( iApiHeader )
        {
        delete iApiHeader;
        iApiHeader = NULL;
        }
    iApiHeader = HBufC8::NewL( KCcHeaderSize );
    iApiHeaderPtr.Set( iApiHeader->Des() );
    
    TPckgBuf<TUint32> provider( ECcHomescreen );
    iPckgSender = 0;
    iPckgReceiver = 0;
    
    iSession.WaitForApiNtf( provider, iPckgSender, iPckgReceiver, iApiHeaderPtr, iStatus );
    SetActive();
    
    }

// End of file