upnpsharing/applicationengine/src/upnpfilesharingengineao.cpp
changeset 0 7f85d04be362
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpsharing/applicationengine/src/upnpfilesharingengineao.cpp	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,645 @@
+/*
+* Copyright (c) 2006-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:      CUPnPFileSharingEngineAO class implementation
+ *
+*/
+
+
+
+
+
+
+// INCLUDE FILES
+// System
+#include <s32file.h>
+#include <f32file.h>
+#include <pathinfo.h>
+#include <e32property.h>
+#include <centralrepository.h>
+
+// upnp stack api
+#include <upnpstring.h>
+#include <upnpmediaserverclient.h>
+
+// upnpframework / avcontroller api
+#include "upnpavcontrollerfactory.h"
+
+// upnpframework / internal api's
+#include "upnpsecaccesscontroller.h"
+
+// homemedia internal
+#include "upnpfilesharingengineao.h"
+#include "upnpfilesharingengine.h"
+#include "upnpapplicationcrkeys.h" //KUPnPAppMediaServerIcon
+#include "upnpfileutilitytypes.h" //KJpegMime2
+#include "upnpiconconfigurator.h"
+
+_LIT( KComponentLogfile, "applicationengine.txt");
+#include "upnplog.h"
+
+
+// ============================ MEMBER FUNCTIONS ============================
+
+// --------------------------------------------------------------------------
+// CUPnPFileSharingEngineAO::CUPnPFileSharingEngineAO
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// --------------------------------------------------------------------------
+//
+CUPnPFileSharingEngineAO::CUPnPFileSharingEngineAO(
+    CUPnPFileSharingEngine& aEngine,
+    RUpnpContentServerClient& aContentServer )
+    : CActive(CActive::EPriorityStandard),
+      iEngine( aEngine ),
+      iContentServer( aContentServer )
+    {
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO:: \
+            CUPnPFileSharingEngineAO");
+    CActiveScheduler::Add( this );
+    }
+
+
+// --------------------------------------------------------------------------
+// CUPnPFileSharingEngineAO::~CUPnPFileSharingEngineAO()
+// Destructor
+// --------------------------------------------------------------------------
+//
+CUPnPFileSharingEngineAO::~CUPnPFileSharingEngineAO()
+    {
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO:: \
+            ~CUPnPFileSharingEngineAO");
+
+    if ( IsActive() )
+        {
+        __LOG( "CUPnPFileSharingEngineAO destructor: IsActive==TRUE!" );
+        iState = ENotActive;
+        TRequestStatus* stat = &iStatus;
+        User::RequestComplete( stat, KErrNone );
+        }
+
+    Cancel();
+    iMediaServer.Close();
+
+    delete iIconConfigurator;
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPFileSharingEngineAO::RunL
+// Called when asyncronous request is ready
+// --------------------------------------------------------------------------
+//
+void CUPnPFileSharingEngineAO::RunL()
+    {
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::RunL begin");
+
+    TInt err( iStatus.Int() );
+    if ( err )
+        {
+        __LOG1( "iStatus err =%d",err );
+        }
+    switch ( iState )
+        {
+        case ENotActive :
+            {
+            if ( err )
+                {
+                // Inform Observer to handle the error.
+                if ( iEngine.Observer() )
+                    {
+                    iEngine.Observer()->
+                        HandleSharingStatus( iEngine, err, EFalse );
+                    }
+                }
+            break;
+            }
+        // Show files outside
+    case ECheckIcon :
+        {
+        if( !err )
+            {
+            __LOG1( "[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::ECheckIcon\
+err=%d", err );
+            iState = EStartSharing;
+            // callback SetIconComplete
+            iIconConfigurator->ConfigureIconsL();
+            }
+        else
+            {
+            iState = ENotActive;
+            if ( iEngine.Observer() )
+                {
+                iEngine.Observer()->
+                    HandleSharingStatus( iEngine, err, ETrue );
+                }
+            }
+        }
+        break;
+    case EStartSharing :
+        {
+        iMediaServer.Close();
+
+        if ( !err )
+            {
+            iVisibility = EOnline;
+            iEngine.SetConMonStateL( ETrue, iStatus );
+            SetActive();
+            iState = EWaitSetConMonStateTrue;
+            }
+        else
+            {
+            iState = ENotActive;
+            if ( iEngine.Observer() )
+                {
+                iEngine.Observer()->
+                    HandleSharingStatus( iEngine, err, ETrue );
+                }
+            }
+        break;
+        }
+    case EWaitSetConMonStateTrue:
+        {
+        iState = ENotActive;
+        if ( iEngine.Observer() )
+            {
+            iEngine.Observer()->
+                HandleSharingStatus( iEngine, err, ETrue );
+            }
+        break;
+        }
+    case EStopSharing :
+        {
+        if ( !err )
+            {
+            iEngine.SetConMonStateL( EFalse, iStatus );
+            SetActive();
+            iState = EWaitSetConMonStateFalse;
+            }
+        else
+            {
+            iState = ENotActive;
+            if ( iEngine.Observer() )
+                {
+                iEngine.Observer()->
+                    HandleSharingStatus( iEngine, err, EFalse );
+                }
+            }
+        }
+        break;
+    case EWaitSetConMonStateFalse:
+        {
+        iState = ENotActive;
+        if ( iEngine.Observer() )
+            {
+            iEngine.Observer()->
+                HandleSharingStatus( iEngine, err, EFalse );
+            }
+        break;
+        }
+    default :
+        {
+        __PANICD( __FILE__, __LINE__ );
+        break;
+        }
+        }
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::RunL end");
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPFileSharingEngineAO::RunError
+// Handles a leave occurring in the request completion event handler
+// --------------------------------------------------------------------------
+//
+TInt CUPnPFileSharingEngineAO::RunError( TInt aError )
+    {
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::RunL begin");
+    TState state ( iState );
+    iState = ENotActive;
+    if ( iEngine.Observer() )
+        {
+        TBool phase( EFalse );
+        if( state == EStartSharing ||
+            state == ECheckIcon ||
+            state == EWaitSetConMonStateTrue )
+            {
+            phase = ETrue;
+            }
+
+        iEngine.Observer()->
+            HandleSharingStatus( iEngine, aError, phase );
+        }
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::RunL end");
+    return KErrNone;
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPFileSharingEngineAO::DoCancel
+// Cancels active object
+// --------------------------------------------------------------------------
+//
+void CUPnPFileSharingEngineAO::DoCancel()
+    {
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::DoCancel begin");
+    if ( iIconConfigurator )
+        {
+        iIconConfigurator->Cancel();
+        }
+
+    if ( iEngine.Observer() &&
+         iState != ENotActive )
+        {
+        TBool phase( EFalse );
+        if( iState == EStartSharing ||
+            iState == ECheckIcon ||
+            iState == EWaitSetConMonStateTrue )
+            {
+            phase = ETrue;
+            }
+
+        iEngine.Observer()->
+            HandleSharingStatus( iEngine, KErrCancel, phase );
+        }
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::DoCancel end");
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPSettingsEngineAO::SetSharingState
+// Starts or stops file sharing
+// --------------------------------------------------------------------------
+//
+void CUPnPFileSharingEngineAO::SetSharingStateL( TBool aState )
+    {
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::SetSharingState \
+ begin");
+
+    if ( IsActive() )
+        {
+        User::Leave ( KErrInUse );
+        }
+
+    // Open file sharing session from mediaserver
+    TBool started = SharingStateL();
+    TInt err = OpenMediaServer();
+
+    if ( aState && !started )
+        {
+        __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::\
+SetSharingState: StartSharing");
+
+        // check media server availibility
+        if ( !err )
+            {
+            EnableUpnpSecurityL();
+
+            CheckMediaserverIconsL();
+
+            if ( !UPnPAVControllerFactory::MSServicesInUse() )
+                {
+                if ( !HasDiskSpace() )
+                    {
+                    err = KErrDiskFull;
+                    }
+                }
+            else
+                {
+                err = KErrInUse;
+                }
+            }
+        if ( !err )
+            {
+            iMediaServer.Start( iStatus );
+            SetActive();
+            }
+        else
+            {
+            SetActive();
+            TRequestStatus* stat = &iStatus;
+            User::RequestComplete( stat, err );
+            }
+        }
+    else if ( !aState && started )
+        {
+        __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::\
+SetSharingState: StopSharing");
+        iState = EStopSharing;
+        // Ask current state of content server
+        TUpnpProgress totalProgress;
+        TPckgBuf<TUpnpProgress> progressBuf( totalProgress );
+        TInt pubErr = RProperty::Get( KUpnpContentServerCat,
+                                      ESharingProgress, progressBuf );
+        TBool sharingOngoing( EFalse );
+        if ( !pubErr )
+            {
+            Mem::Copy( &totalProgress,
+                       progressBuf.Ptr(), sizeof( TUpnpProgress ) );
+            if( totalProgress.iImageVideoProgress.iProgressType !=
+                TUpnpProgressInfo::EVisualStatus ||
+                totalProgress.iMusicProgress.iProgressType !=
+                TUpnpProgressInfo::EVisualStatus )
+                {
+                sharingOngoing = ETrue;
+                }
+            }
+
+        if( !err )
+            {
+            if ( !sharingOngoing )
+                {
+                // no sharing operations ongoing, stop possible
+                err = iMediaServer.Stop();
+                }
+            else
+                {
+                __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::\
+->Offline");
+                err = iMediaServer.StartOffline();
+                }
+
+            if ( err != KErrNone )
+                {
+                __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO:: \
+Error: iMediaServer");
+                err = KErrGeneral;
+                // if the MediaServer lost, setting iVisibility = EUnknown 
+                // will insure the function SharingState() to start the
+                // MediaServer session again.
+                iVisibility = EUnknown;
+                }
+            else
+                {
+                iVisibility = EOffline;
+                }
+
+            iMediaServer.Close();
+            }
+        SetActive();
+        TRequestStatus* stat = &iStatus;
+        User::RequestComplete( stat, err );
+        }
+    else
+        {
+        //do nothing, it's already started
+        iState = EStopSharing;
+        if ( aState )
+            {
+            iState = EStartSharing;
+            }
+        SetActive();
+        TRequestStatus* status = &iStatus;
+        User::RequestComplete( status, KErrNone );
+        }
+
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::SetSharingState \
+ end");
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPFileSharingEngineAO::SharingState
+// Gets file sharing status.
+// --------------------------------------------------------------------------
+//
+TBool CUPnPFileSharingEngineAO::SharingStateL()
+    {
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::SharingState begin");
+
+    TBool status( EFalse );
+    if ( iVisibility == EUnknown )
+        {
+        // Start media server session
+        TInt err( OpenMediaServer() );
+        if ( err == KErrNoMemory )
+            {
+            User::Leave( KErrNoMemory );
+            }
+        
+        if ( !err )
+            {
+            TInt s( 0 );
+            err = iMediaServer.Status( s );
+            if ( s == RUpnpMediaServerClient::EStartedOnline )
+                {
+                status = ETrue;
+                }
+            iMediaServer.Close();
+            }
+        if ( status && !err )
+            {
+            iVisibility = EOnline;
+            }
+        else
+            {
+            iVisibility = EOffline;
+            }
+        }
+     else if( iVisibility == EOffline ) 
+        {
+        TInt err( OpenMediaServer() );
+        if ( err == KErrNoMemory )
+            User::Leave( KErrNoMemory );  
+        if ( !err )
+            {
+            TInt s( 0 );
+            err = iMediaServer.Status( s );
+            if ( s == RUpnpMediaServerClient::EStartedOnline )
+                {
+                status = ETrue;
+                }
+            iMediaServer.Close();
+            }
+        }     
+    else if ( iVisibility == EOnline )
+        {
+        status = ETrue;
+        }
+
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::SharingState end");
+    return status;
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPFileSharingEngineAO::ConnectionLost
+// Gets file sharing status.
+// --------------------------------------------------------------------------
+//
+void CUPnPFileSharingEngineAO::ConnectionLost()
+    {
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::\
+ConnectionLost begin");
+    iVisibility = EOffline;
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::\
+ConnectionLost end");
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPFileSharingEngineAO::HasDiskSpace
+// Check that there is enough disk space in c drive
+// --------------------------------------------------------------------------
+//
+TBool CUPnPFileSharingEngineAO::HasDiskSpace()
+    {
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::\
+HasDiskSpace begin");
+    const TInt KDiskSpaceThreshold( 4096 ); //4kB
+    RFs fileServer;
+    TInt error = fileServer.Connect();
+    TBool retVal( EFalse );
+    TVolumeInfo freeVol;
+    if( !error )
+        {
+        error = fileServer.SetSessionPath( PathInfo::PhoneMemoryRootPath() );
+        if( !error )
+            {
+            error = fileServer.Volume( freeVol );
+            }
+        }
+    fileServer.Close();
+
+    if( !error )
+        {
+        if( freeVol.iFree > KDiskSpaceThreshold )
+            {
+            __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO:\
+disk space:OK!");
+            retVal = ETrue;
+            }
+        }
+
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::\
+HasDiskSpace end");
+    return retVal;
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPFileSharingEngineAO::SetIconComplete
+// callback from icon configurator
+// --------------------------------------------------------------------------
+//
+void CUPnPFileSharingEngineAO::SetIconComplete( TInt aError )
+    {
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::\
+SetIconComplete begin");
+    
+    if ( aError != KErrNone )
+        {
+        iMediaServer.Stop();  
+        }
+    
+    // delete iconConfigurator as not needed anymore
+    delete iIconConfigurator;
+    iIconConfigurator = NULL;
+
+    // continue sharing
+    iState = EStartSharing;
+    __ASSERTD( !IsActive(), __FILE__, __LINE__ );
+    SetActive();
+    TRequestStatus* stat = &iStatus;
+    User::RequestComplete( stat, aError );
+
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::\
+SetIconComplete end");
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPFileSharingEngineAO::OpenMediaServer
+// Creates connection to mediaserver
+// --------------------------------------------------------------------------
+//
+TInt CUPnPFileSharingEngineAO::OpenMediaServer()
+    {
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::\
+OpenMediaServer start");
+
+    TInt error = iMediaServer.Connect();
+    if ( error == KErrNoMemory )
+        {
+        return error;
+        }
+    
+    if ( error != KErrNone )
+        {
+        __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::\
+OpenMediaServer: Connect FAILed");
+
+        // try to reconnect
+        iMediaServer.Close();
+        error = iMediaServer.Connect();
+        if( error )
+            {
+            __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::\
+OpenMediaServer: ReConnect FAILed");
+            }
+
+        }
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::\
+OpenMediaServer end");
+    return error;
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPFileSharingEngineAO::EnableUpnpSecurityL
+// store the cenrep value
+// --------------------------------------------------------------------------
+//
+void CUPnPFileSharingEngineAO::EnableUpnpSecurityL()
+    {
+    // Check if the stack's security is enabled
+    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::\
+EnableUpnpSecurityL: Checking the state of stack's security manager");
+    TBool upnpSecurityEnabled = EFalse;
+    TRAPD( secCheckError,
+           upnpSecurityEnabled =
+           CUpnpSecAccessController::IsMediaServerSecurityEnabledL());
+
+    // If the security is not enabled, enable it now
+    if( !secCheckError &&
+        !upnpSecurityEnabled )
+        {
+        __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::\
+EnableUpnpSecurityL: Activating stack's security manager");
+        TRAPD( secEnableError,
+               CUpnpSecAccessController::EnableMediaServerSecurityL());
+        if( secEnableError )
+            {
+            __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngineAO::\
+EnableUpnpSecurityL: Failed to activate stack's security manager");
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPFileSharingEngineAO::CheckMediaserverIconsL
+// Checks whether icons should be configured
+// --------------------------------------------------------------------------
+//
+void CUPnPFileSharingEngineAO::CheckMediaserverIconsL()
+    {
+    // Create the icon configurator and see if icons must be configured.
+    // If they need to, start asynchronous icon configuration process.
+    delete iIconConfigurator;
+    iIconConfigurator = NULL;
+    iIconConfigurator = new (ELeave )
+        CUPnPIconConfigurator( iMediaServer, *this );
+    if ( iIconConfigurator->NeedToConfigureIcons() )
+        {
+        iState = ECheckIcon;
+        }
+    else
+        {
+        // icons already configured, go directly to sharing state
+        delete iIconConfigurator;
+        iIconConfigurator = NULL;
+        iState = EStartSharing;
+        }
+    }
+
+// End of file