upnpavcontroller/upnpavcontrollerserver/src/upnpfilesharingactive.cpp
changeset 0 7f85d04be362
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpavcontroller/upnpavcontrollerserver/src/upnpfilesharingactive.cpp	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,246 @@
+/*
+* 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 "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:      AO for file sharing operations
+*
+*/
+
+
+
+
+
+
+// INCLUDE FILES
+// upnp stack api
+#include <upnpfilesharing.h>
+#include <upnpitem.h>
+
+// upnpframework / avcontroller helper api
+#include "upnpconstantdefs.h" // for upnp-specific stuff
+#include "upnpitemutility.h" // for GetResElements
+
+// upnpframework / internal api's
+#include "upnpsecaccesscontroller.h"
+
+// avcontroller internal
+#include "upnpfilesharingactive.h"
+
+_LIT( KComponentLogfile, "upnpavcontrollerserver.txt");
+#include "upnplog.h"
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// --------------------------------------------------------------------------
+// CUPnPFileSharingActive::NewL
+// See upnpfilesharingactive.h
+// --------------------------------------------------------------------------
+CUPnPFileSharingActive* CUPnPFileSharingActive::NewL()
+    {
+    CUPnPFileSharingActive* self = new (ELeave) CUPnPFileSharingActive();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPFileSharingActive::CUPnPFileSharingActive
+// See upnpfilesharingactive.h
+// --------------------------------------------------------------------------
+CUPnPFileSharingActive::CUPnPFileSharingActive():
+    CActive( EPriorityStandard )//,
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPFileSharingActive::~CUPnPFileSharingActive
+// See upnpfilesharingactive.h
+// --------------------------------------------------------------------------
+CUPnPFileSharingActive::~CUPnPFileSharingActive()
+    {
+    Cancel();
+    delete iFileSharing;
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPFileSharingActive::ConstructL
+// See upnpfilesharingactive.h
+// --------------------------------------------------------------------------
+void CUPnPFileSharingActive::ConstructL()
+    {
+    __LOG( "CUPnPFileSharingActive::ConstructL" );
+    
+    iFileSharing = CUpnpFileSharing::NewL();    
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPFileSharingActive::RunL
+// See upnpfilesharingactive.h
+// --------------------------------------------------------------------------
+void CUPnPFileSharingActive::RunL()
+    {
+    CActiveScheduler::Stop(); 
+    }
+    
+// --------------------------------------------------------------------------
+// CUPnPFileSharingActive::DoCancel
+// See upnpfilesharingactive.h
+// --------------------------------------------------------------------------
+void CUPnPFileSharingActive::DoCancel()
+    {
+    __LOG( "CUPnPFileSharingActive::DoCancel" );   
+    }
+    
+// --------------------------------------------------------------------------
+// CUPnPFileSharingActive::RunError
+// See upnpfilesharingactive.h
+// --------------------------------------------------------------------------
+TInt CUPnPFileSharingActive::RunError( TInt /*aError*/ )
+    {
+    
+    return KErrNone;
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPFileSharingActive::ShareItemL
+// See upnpfilesharingactive.h
+// --------------------------------------------------------------------------
+void CUPnPFileSharingActive::ShareItemL( CUpnpItem& aItem )
+    {
+    __LOG( "CUPnPFileSharingActive::ShareItemL" );
+
+    TInt status = KErrNone;
+
+    // Allow access to the files listed in res-elements
+    SetAccesstoItemResourcesL( aItem, ETrue );
+
+    // Share the item
+    TRAP( status,
+          iFileSharing->ShareItemL( KContainerIdRoot, aItem, iStatus ) );
+    if( status == KErrNone )
+        {
+        SetActive();
+        CActiveScheduler::Start();
+        status = iStatus.Int();
+        }
+
+    // If the sharing failed
+    if( status != KErrNone )
+        {
+        // Deny access to the files listed in res-elements
+        SetAccesstoItemResourcesL( aItem, EFalse );
+        }
+
+    // Leave if the was an error
+    if( status != KErrNone )
+        {
+        User::Leave( status );
+        }
+
+    __LOG( "CUPnPFileSharingActive::ShareItemL - end" );
+    }
+    
+// --------------------------------------------------------------------------
+// CUPnPFileSharingActive::UnShareItemL
+// See upnpfilesharingactive.h
+// --------------------------------------------------------------------------
+void CUPnPFileSharingActive::UnShareItemL( const TDesC8& aId )
+    {
+    __LOG( "CUPnPFileSharingActive::ConstructL" );
+
+    TLex8 lex( aId );
+    TInt id;
+    User::LeaveIfError( lex.Val( id ) );
+    TInt status = KErrNone;
+
+    // Get the shared items data via Metadata API
+    CUpnpItem* item = CUpnpItem::NewL();
+    CleanupStack::PushL( item );
+    iFileSharing->GetSharedItemL( id, *item, iStatus );
+    SetActive();
+    CActiveScheduler::Start();
+    status = iStatus.Int();
+
+    // If the item's metadata was resolved succesfully
+    if( status == KErrNone )
+        {
+        // Unshare the item
+        TRAP( status, iFileSharing->UnshareItemL( id, iStatus ) );
+        if( status == KErrNone )
+            {
+            SetActive();
+            CActiveScheduler::Start();
+            status = iStatus.Int();
+            }
+        }
+
+    // If the unsharing succeeded
+    if( status == KErrNone )
+        {
+        // Deny access to the files listed in res-elements
+        SetAccesstoItemResourcesL( *item, EFalse );
+        }
+
+    // Clean up
+    CleanupStack::PopAndDestroy( item );
+    item = NULL;
+
+    // Leave if error
+    if( status != KErrNone )
+        {
+        User::LeaveIfError( status );
+        }
+
+    __LOG( "CUPnPFileSharingActive::UnShareItemL - end" );
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPFileSharingActive::SetAccesstoItemResourcesL
+// See upnpfilesharingactive.h
+// --------------------------------------------------------------------------
+void CUPnPFileSharingActive::SetAccesstoItemResourcesL(
+                                                CUpnpItem& aItem,
+                                                TBool aAccessAllowed )
+    {
+    __LOG( "CUPnPFileSharingActive::SetAccesstoItemResourcesL" );
+
+    // Create security access controller
+    CUpnpSecAccessController* accessController = 
+                                    CUpnpSecAccessController::NewL();
+    CleanupStack::PushL( accessController );
+
+    // Get all filenames and set the access for those.
+    RUPnPElementsArray resElements;
+    UPnPItemUtility::GetResElements( aItem, resElements );
+    for( TInt i=0; i<resElements.Count(); i++ )
+        {
+        if( aAccessAllowed )
+            {
+            accessController->AddAllowedFile( resElements[i]->FilePath() );
+            }
+        else
+            {
+            accessController->RemoveAllowedFile(
+                                        resElements[i]->FilePath() );
+            }
+        }
+
+    // Clean up
+    resElements.Close();
+    CleanupStack::PopAndDestroy( accessController );
+    accessController = NULL;
+    }
+
+// End of file