upnpsharing/applicationengine/src/upnpprogresswatcher.cpp
changeset 0 7f85d04be362
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpsharing/applicationengine/src/upnpprogresswatcher.cpp	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,311 @@
+/*
+* 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