upnpmediaserver/contentdirectoryservice/src/upnpcontentdirectoryservice.cpp
changeset 0 7f85d04be362
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpmediaserver/contentdirectoryservice/src/upnpcontentdirectoryservice.cpp	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,489 @@
+/** @file
+* Copyright (c) 2005-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:  Content Directory factory class
+ *
+*/
+
+
+// INCLUDE FILES
+#include "upnpcontentdirectoryservice.h"
+#include "upnpcontentdirectory.h"   
+#include "upnpcddbfactory.h"
+#include "upnpcontentdirectoryglobals.h"
+#include "upnplocalstorage.h"
+#include "upnpmetadatastorage.h"
+#include "upnpitem.h"
+#include "upnpelement.h"
+#include "upnpattribute.h"
+#include "upnpcontentdirectoryeventobserver.h"
+#include "upnpsender.h"
+#include "upnpfiletransfer.h"
+#include "upnptransferhandler.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CContentDirectoryService::CContentDirectoryService
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CUpnpContentDirectoryService::CUpnpContentDirectoryService()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CUpnpContentDirectoryService::ConstructL( TUpnpCdSettings aSettings )
+    {
+    // create offline part
+    ConstructL( );
+
+    if ( !aSettings.iTransfer ) //create default transfer handler
+        {
+        iTransferHandler = CUpnpTransferHandler::NewL( );
+
+        // create content directory 
+        iCd = CUpnpContentDirectory::NewL( aSettings, iMetadataStorage,
+            iTransferHandler );
+        iTransferHandler->SetObserver( iCd );
+        }
+    else //use external transfer handler  
+        {
+        iCd = CUpnpContentDirectory::NewL( aSettings, iMetadataStorage,
+            aSettings.iTransfer );
+        }
+
+    iLocalStorage->SetStateHandler( iCd->StateHandler( ) );
+    // sender    
+    iSender = CUpnpCdsSender::NewL( iCd );
+    iCd->SetSender( iSender );
+    }
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CUpnpContentDirectoryService::ConstructL()
+    {
+    CUpnpCdDbFactory* cdf = CUpnpCdDbFactory::NewLC( );
+
+    // database file name
+    RFs fs;
+    CleanupClosePushL( fs );
+    User::LeaveIfError( fs.Connect( ) );
+
+    TFileName path;
+    User::LeaveIfError( fs.PrivatePath( path ) );
+    TParse fp;
+    fp.Set( KDatabaseFileName( ), &path, 0 );
+    path = fp.FullName( );
+
+    // create metastorage
+    iMetadataStorage = cdf->CreateMetadataStorageL( path );
+
+    // create localstorage
+    iLocalStorage = CUpnpLocalStorage::NewL( iMetadataStorage );
+
+    CleanupStack::PopAndDestroy( &fs );
+    CleanupStack::PopAndDestroy( cdf );
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpContentDirectoryService*
+CUpnpContentDirectoryService::NewL( TUpnpCdSettings aSettings )
+    {
+    CUpnpContentDirectoryService* self =
+    CUpnpContentDirectoryService::NewLC( aSettings );
+
+    CleanupStack::Pop(self);
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpContentDirectoryService*
+CUpnpContentDirectoryService::NewLC( TUpnpCdSettings aSettings )
+    {
+    CUpnpContentDirectoryService* self = new( ELeave ) CUpnpContentDirectoryService();
+
+    CleanupStack::PushL( self );
+    self->ConstructL(aSettings);
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpContentDirectoryService* CUpnpContentDirectoryService::NewL()
+    {
+    CUpnpContentDirectoryService* self = CUpnpContentDirectoryService::NewLC();
+    CleanupStack::Pop(self);
+    return self;
+    }
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpContentDirectoryService* CUpnpContentDirectoryService::NewLC()
+    {
+    CUpnpContentDirectoryService* self =
+    new( ELeave ) CUpnpContentDirectoryService();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::~CUpnpContentDirectoryService
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CUpnpContentDirectoryService::~CUpnpContentDirectoryService()
+    {
+    delete iTransferHandler;
+    delete iLocalStorage;
+    delete iCd;
+    delete iMetadataStorage;
+    delete iSender;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::SetDownloadDirectoryL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpContentDirectoryService::SetDownloadDirectoryL(
+    const TDesC& aDownloadDir )
+    {
+    if ( IsOnlineMode() )
+        {
+        iCd->SetDownloadDirectoryL( aDownloadDir );
+        }
+    else
+        {
+        User::Leave( KErrNotReady );
+        }
+
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::SetThumbnailDirectoryL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpContentDirectoryService::SetThumbnailDirectoryL(
+    const TDesC& aDownloadDir )
+    {
+    if ( IsOnlineMode() )
+        {
+        iCd->SetThumbnailDirectoryL( aDownloadDir );
+        }
+    else
+        {
+        User::Leave( KErrNotReady );
+        }
+
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::SetThumbnailDirectoryL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpContentDirectoryService::ShareObjectL( CUpnpObject* aItem )
+    {
+    CheckDbL( );
+    TRAPD( error, iLocalStorage->ShareObjectL( aItem ) );
+    HandleDbErrorL( error );
+    if ( error )
+        {
+        TRAP( error, iLocalStorage->ShareObjectL( aItem ) );
+        RecreateDbL( error );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::ShareReferenceL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpContentDirectoryService::ShareReferenceL( CUpnpItem* aItem )
+    {
+    CheckDbL( );
+    TRAPD( error, iLocalStorage->ShareReferenceL( aItem ) );
+    HandleDbErrorL( error );
+    if ( error )
+        {
+        TRAP( error, iLocalStorage->ShareReferenceL( aItem ) );
+        RecreateDbL( error );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::ShareReferenceListL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpContentDirectoryService::ShareReferenceListL(
+    CUpnpItemList* aItemList, TInt* aExecutionStatus )
+    {
+    CheckDbL( );
+    TRAPD( error, iLocalStorage->ShareReferenceListL( aItemList,
+        aExecutionStatus ) );
+    HandleDbErrorL( error );
+    if ( error )
+        {
+        TRAP( error, iLocalStorage->ShareReferenceListL( aItemList,
+            aExecutionStatus ) );
+        RecreateDbL( error );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::UnshareItemL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpContentDirectoryService::UnshareItemL( TInt aItemId )
+    {
+    CheckDbL( );
+    TRAPD( error, iLocalStorage->UnshareItemL( aItemId ) );
+    HandleDbErrorL( error );
+    if ( error )
+        {
+        TRAP( error, iLocalStorage->UnshareItemL( aItemId ) );
+        RecreateDbL( error );
+        }
+    }
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::UnshareContainerL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpContentDirectoryService::UnshareContainerL(
+    TInt aContainerId )
+    {
+    CheckDbL( );
+    TRAPD( error, iLocalStorage->UnshareContainerL( aContainerId ) );
+    HandleDbErrorL( error );
+    if ( error )
+        {
+        TRAP( error, iLocalStorage->UnshareContainerL( aContainerId ) );
+        RecreateDbL( error );
+        }
+    }
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::SetThumbnailDirectoryL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpItem* CUpnpContentDirectoryService::GetSharedItemL( TInt aItemId )
+    {
+    CheckDbL();
+    CUpnpItem* item = NULL;
+    TRAPD( error, item = iLocalStorage->GetSharedItemL( aItemId ) );
+    HandleDbErrorL( error );
+    if ( error )
+        {
+        TRAP( error, item = iLocalStorage->GetSharedItemL( aItemId ) );
+        RecreateDbL( error );
+        }
+    return item;
+    }
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::SetThumbnailDirectoryL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpContentDirectoryService::ShareItemListL(
+    CUpnpItemList* aItemList, TInt* aExecutionStatus )
+    {
+    CheckDbL( );
+    TRAPD( error, iLocalStorage->ShareItemListL( aItemList, aExecutionStatus ) );
+    HandleDbErrorL( error );
+    if ( error )
+        {
+        TRAP( error, iLocalStorage->ShareItemListL( aItemList,
+            aExecutionStatus ) );
+        RecreateDbL( error );
+        }
+    }
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::SetThumbnailDirectoryL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpContentDirectoryService::UnshareItemListL(
+    RArray<TInt>& aItemList, TInt* aExecutionStatus )
+    {
+    CheckDbL( );
+    TRAPD( error, iLocalStorage->UnshareItemListL( aItemList,
+        aExecutionStatus ) );
+    HandleDbErrorL( error );
+    if ( error )
+        {
+        TRAP( error, iLocalStorage->UnshareItemListL( aItemList,
+            aExecutionStatus ) );
+        RecreateDbL( error );
+        }
+    }
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::SetThumbnailDirectoryL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpContentDirectoryService::GetItemListL( TInt aContainerId,
+    CUpnpBrowseCriteria* aBrowseCriteria, TInt* aTotalMatches,
+    CUpnpItemList* aItemList )
+    {
+    CheckDbL( );
+    TRAPD( error, iLocalStorage->GetItemListL( aContainerId, aBrowseCriteria,
+        aTotalMatches, aItemList ) );
+    HandleDbErrorL( error );
+    if ( error )
+        {
+        TRAP( error, iLocalStorage->GetItemListL( aContainerId,
+            aBrowseCriteria, aTotalMatches, aItemList ) );
+        RecreateDbL( error );
+        }
+    }
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::GetContainerListL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpContentDirectoryService::GetContainerListL(
+    TInt aContainerId, CUpnpBrowseCriteria* aBrowseCriteria,
+    TInt* aTotalMatches, CUpnpContainerList* aContainerList )
+    {
+    CheckDbL( );
+    TRAPD( error, iLocalStorage->GetContainerListL( aContainerId,
+        aBrowseCriteria, aTotalMatches, aContainerList ) );
+    HandleDbErrorL( error );
+    if ( error )
+        {
+        TRAP( error, iLocalStorage->GetContainerListL( aContainerId,
+            aBrowseCriteria, aTotalMatches, aContainerList ) );
+        RecreateDbL( error );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::SetThumbnailDirectoryL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpContainer* CUpnpContentDirectoryService::GetSingleContainerL(
+        TInt aContainerId)
+    {
+    CheckDbL();
+    CUpnpContainer* container = NULL;
+    TRAPD( error, container = iLocalStorage->GetSingleContainerL( aContainerId ) );
+    HandleDbErrorL( error );
+    if ( error )
+        {
+        TRAP( error, container = iLocalStorage->GetSingleContainerL( aContainerId ) );
+        RecreateDbL( error );
+        }
+    return container;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::GetAddress
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInetAddr CUpnpContentDirectoryService::GetAddress()
+    {
+    if ( IsOnlineMode() )
+        {
+        return iCd->GetAddress();
+        }
+    else
+        {
+        // no address available in offline mode
+        return TInetAddr( INET_ADDR(0,0,0,0) );
+        }
+    }    
+    
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::GetContentDirectory
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpContentDirectory* CUpnpContentDirectoryService::GetContentDirectory()
+    {
+    return iCd;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::HandleDbErrorL
+// -----------------------------------------------------------------------------
+//
+void CUpnpContentDirectoryService::HandleDbErrorL( TInt aError )
+    {
+    TInt error = iMetadataStorage->HandleDbError( aError );
+    if ( error != KErrNone )
+        {
+        User::Leave( error );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::RecreateDbL
+// -----------------------------------------------------------------------------
+//
+void CUpnpContentDirectoryService::RecreateDbL( TInt aError )
+    {
+    if ( aError == KErrCorrupt )
+        {
+        iMetadataStorage->RecreateDatabaseFileL( );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::CheckDbL
+// -----------------------------------------------------------------------------
+//            
+void CUpnpContentDirectoryService::CheckDbL()
+    {
+    if ( !iMetadataStorage->IsDbCreated( ) )
+        {
+        HandleDbErrorL( KErrCorrupt );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::IsOnlineMode
+// -----------------------------------------------------------------------------
+//            
+TBool CUpnpContentDirectoryService::IsOnlineMode()
+    {
+    return reinterpret_cast<TBool>( iCd );
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpContentDirectoryService::AddressChangeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpContentDirectoryService::AddressChangeL()
+    {
+    if ( IsOnlineMode() )
+        {
+        iCd->AddressChangeL();
+        }
+    }
+//  End of File