upnpsharing/applicationengine/src/upnpprogresswatcher.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 04 Oct 2010 00:34:14 +0300
changeset 35 f37b1259bd7b
parent 0 7f85d04be362
permissions -rw-r--r--
Revision: 201037 Kit: 201039

/*
* Copyright (c) 2007 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:      CUpnpProgressWatcher class implementation
 *
*/







//  Include Files
#include <e32property.h>
#include <e32debug.h>
#include <upnpstring.h>
#include "upnpprogresswatcher.h"
#include "upnpfilesharingengine.h"

_LIT( KComponentLogfile, "applicationengine.txt");
#include "upnplog.h"


// CONSTANTS
// The maximum numbers of sharingrequests that can be currently received
const TInt KMaxSharingReqs = 2;

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

// --------------------------------------------------------------------------
// CUpnpProgressWatcher::CUpnpProgressWatcher
// C++ default constructor can NOT contain any code, that
// might leave.
// --------------------------------------------------------------------------
//
CUpnpProgressWatcher::CUpnpProgressWatcher( CUPnPFileSharingEngine& aEngine )
    : CActive(CActive::EPriorityStandard),
      iEngine( aEngine )
    {
    __LOG("[UPNP_ENGINE]\t CUpnpProgressWatcher::CUpnpProgressWatcher");
    }

// --------------------------------------------------------------------------
// CUpnpProgressWatcher::NewL
// Two-phased constructor.
// --------------------------------------------------------------------------
//
CUpnpProgressWatcher* CUpnpProgressWatcher::NewL( 
    CUPnPFileSharingEngine& aEngine )
    {
    __LOG("[UPNP_ENGINE]\t CUpnpProgressWatcher::NewL");
    CUpnpProgressWatcher* self = 
        new ( ELeave ) CUpnpProgressWatcher( aEngine );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }

// --------------------------------------------------------------------------
// CUpnpProgressWatcher::ConstructL
// Symbian 2nd phase constructor can leave.
// --------------------------------------------------------------------------
//
void CUpnpProgressWatcher::ConstructL()
    {
    __LOG("[UPNP_ENGINE]\t CUpnpProgressWatcher::ConstructL");

    User::LeaveIfError( 
        iProgressInfo.Attach( KUpnpContentServerCat, ESharingProgress ) );
    CActiveScheduler::Add(this);
    }

// --------------------------------------------------------------------------
// CUpnpProgressWatcher::~CUpnpProgressWatcher
// Destructor
// --------------------------------------------------------------------------
//
CUpnpProgressWatcher::~CUpnpProgressWatcher()
    {
    __LOG("[UPNP_ENGINE]\t CUpnpProgressWatcher::~CUpnpProgressWatcher");

    Cancel();
    iProgressInfo.Close();
    }

// --------------------------------------------------------------------------
// CUpnpProgressWatcher::StartL
// Starts active object
// --------------------------------------------------------------------------
//
void CUpnpProgressWatcher::StartL()
    {
    __LOG("[UPNP_ENGINE]\t CUpnpProgressWatcher::StartL begin");

    TUpnpProgress totalProgress;
    TPckgBuf<TUpnpProgress> progressBuf( totalProgress );
    TInt pubErr = iProgressInfo.Get( progressBuf );
    iEngine.SetShareFileComplete( EFalse );
    if ( !pubErr )
        {
        Mem::Copy( &totalProgress, 
                   progressBuf.Ptr(), sizeof( TUpnpProgress ) );

        // update UI
        SetShowCompleteNote( totalProgress );
        TProgressInfos progressArr( KMaxSharingReqs );
        progressArr.Append( totalProgress.iImageVideoProgress );
        progressArr.Append( totalProgress.iMusicProgress );
        CleanupClosePushL( progressArr );
        if ( iEngine.Observer() )
            {
            iEngine.Observer()->HandleSharingProgress( 
                iEngine, progressArr );
            }
        CleanupStack::PopAndDestroy( &progressArr );
        }

    if ( !IsActive() && SharingOngoing( totalProgress ) )
        {
        // start periodical reporting of progress
        RunL();
        }

    __LOG("[UPNP_ENGINE]\t CUpnpProgressWatcher::StartL end");
    }

// --------------------------------------------------------------------------
// CUpnpProgressWatcher::Stop
// Stops active object
// --------------------------------------------------------------------------
//
void CUpnpProgressWatcher::Stop()
    {
    __LOG("[UPNP_ENGINE]\t CUpnpProgressWatcher::Stop");
    Cancel();
    }

// --------------------------------------------------------------------------
// CUpnpProgressWatcher::RunL
// Called when asyncronous request is ready
// --------------------------------------------------------------------------
//
void CUpnpProgressWatcher::RunL()
    {
    __LOG("[UPNP_ENGINE]\t CUpnpProgressWatcher::RunL");

    // resubscribe before processing new value to prevent missing updates
    iProgressInfo.Subscribe( iStatus );
    SetActive();

    TUpnpProgress totalProgress;
    TPckgBuf< TUpnpProgress > paramspkg( totalProgress );


    // get value
    if ( iProgressInfo.Get(
             KUpnpContentServerCat, 
             ESharingProgress, 
             paramspkg ) == KErrNotFound )
        {
        // property deleted, do necessary actions here...
        }
    else
        {
        Mem::Copy( &totalProgress, paramspkg.Ptr(), sizeof( TUpnpProgress ) );


        TProgressInfos progressArr( KMaxSharingReqs );

        progressArr.Append( totalProgress.iImageVideoProgress );
        progressArr.Append( totalProgress.iMusicProgress );

        CleanupClosePushL( progressArr );
        if ( totalProgress.iError )
            {
            HandleErrorL( totalProgress );
            }
        else
            {
            if ( iEngine.Observer() )
                {
                // update UI
                iEngine.Observer()->HandleSharingProgress( 
                    iEngine, progressArr );
                }
            if ( progressArr.Count() )
                {
                __LOG2( "ProgressCallbackL: cout:%d progress:%d\n",
                    progressArr.Count(), 
                    progressArr[0].iProgress );
                }
            else
                {
                __LOG( "progressArr empty" );
                }

            SetShowCompleteNote( totalProgress );

            if ( iShowCompleteNote && !SharingOngoing( totalProgress ) )
                {
                // no sharing operations ongoing, stop query
                Cancel();
                // inform UI to show final note
                if ( iEngine.Observer() && iShowCompleteNote )
                    {
                    iShowCompleteNote = EFalse;
                    iEngine.Observer()->HandleSharingDone( 
                        iEngine, KErrNone );
                    }
                }
            }
        CleanupStack::PopAndDestroy( &progressArr );
        }
    }

// --------------------------------------------------------------------------
// CUpnpProgressWatcher::DoCancel
// Cancels active object
// --------------------------------------------------------------------------
//
void CUpnpProgressWatcher::DoCancel()
    {
    __LOG("[UPNP_ENGINE]\t CUpnpProgressWatcher::DoCancel");
    iEngine.SetShareFileComplete( ETrue );
    iProgressInfo.Cancel();
    }

// --------------------------------------------------------------------------
// CUpnpProgressWatcher::SetShowCompleteNote
// determine need to show complete note, handle errors
// --------------------------------------------------------------------------
//
void CUpnpProgressWatcher::SetShowCompleteNote( 
    const TUpnpProgress& aProgress )
    {
    __LOG("[UPNP_ENGINE]\t CUpnpProgressWatcher::SetShowCompleteNote");

    if( !iShowCompleteNote )
        {
        if( aProgress.iImageVideoProgress.iProgressType != 
            TUpnpProgressInfo::EVisualStatus ||
            aProgress.iMusicProgress.iProgressType != 
            TUpnpProgressInfo::EVisualStatus)
            {
            iShowCompleteNote = ETrue;
            }
        }
    }

// --------------------------------------------------------------------------
// CUpnpProgressWatcher::SharingOngoing
// determine need to show complete note, handle errors
// --------------------------------------------------------------------------
//
TBool CUpnpProgressWatcher::SharingOngoing( const TUpnpProgress& aProgress )
    {
    __LOG("[UPNP_ENGINE]\t CUpnpProgressWatcher::SharingOngoing");
    TBool ret( EFalse );

    if( aProgress.iImageVideoProgress.iProgressType != 
        TUpnpProgressInfo::EVisualStatus ||
        aProgress.iMusicProgress.iProgressType !=
        TUpnpProgressInfo::EVisualStatus)
        {
        ret = ETrue;
        }
    return ret;
    }

// --------------------------------------------------------------------------
// CUpnpProgressWatcher::HandleErrorL
// determine need to show complete note, handle errors
// --------------------------------------------------------------------------
//
void CUpnpProgressWatcher::HandleErrorL( const TUpnpProgress& aProgress )
    {
    __LOG("[UPNP_ENGINE]\t CUpnpProgressWatcher::HandleIfErrorL");
    Cancel();
    if( aProgress.iError == KErrNoMemory || 
        aProgress.iError == KErrDiskFull )
        {
        // update UI
        TProgressInfos progressArr( KMaxSharingReqs );
        CleanupClosePushL( progressArr );
        progressArr.Append( aProgress.iImageVideoProgress );
        progressArr.Append( aProgress.iMusicProgress );
        
        if ( iEngine.Observer() )
            {
            iEngine.Observer()->HandleSharingProgress( 
                iEngine, progressArr );
            }
        CleanupStack::PopAndDestroy( &progressArr );
        iShowCompleteNote = EFalse;
        User::Leave( aProgress.iError );
        }
    }

// End of file