upnpsharing/applicationengine/src/upnpfilesharingengine.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) 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:      CUPnPFileSharingEngine class implementation
 *
*/






//  Include Files
#include <upnpcontainer.h>
#include <f32file.h>
#include <upnpstring.h>
#include <s32file.h>

#include <upnpmediaserverclient.h>
#include "upnpfilesharingengine.h"
#include "upnpfilesharingengineao.h"
#include "upnpcontentrequestao.h"
#include "upnpcontentshareao.h"
#include "upnpcontentserverclient.h"
#include "upnpsettingsengine.h"
#include "upnpprogresswatcher.h"
#include "upnpcommonutils.h"
#include "upnpdownloaditemresolver.h"
#include "upnpcontentshareao.h"
#include "upnpconnectionmonitor.h"
#include "upnpiconconfigurator.h"

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

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

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::CUPnPFileSharingEngine
// C++ default constructor can NOT contain any code, that
// might leave.
// --------------------------------------------------------------------------
//
CUPnPFileSharingEngine::CUPnPFileSharingEngine()
    {
    iShareFileState = EFalse;
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::ConstructL
// Symbian 2nd phase constructor can leave.
// --------------------------------------------------------------------------
//
void CUPnPFileSharingEngine::ConstructL()
    {
    iContentServer.OpenL();
    iAO = new (ELeave) CUPnPFileSharingEngineAO( *this, iContentServer );
    iContentSharer = CUpnpContentShareAO::NewL( *this, iContentServer );    
    UPnPCommonUtils::DeleteTempFilesL();
    CUPnPDownloadItemResolver::DeleteTempDownloadFilesL();
    iContentRequestor = new (ELeave) CUpnpContentRequestAO( 
        *this, iContentServer );

    // create connection monitor, so we can receive wlan lost notifications
    // immideatly and observe connection if application was restarted 
    CUPnPSettingsEngine* settings = CUPnPSettingsEngine::NewLC();
    TInt iap( 0 );
    User::LeaveIfError( settings->GetAccessPoint( iap ) );
    CleanupStack::PopAndDestroy( settings );
    iConnMon = CUPnPConnectionMonitor::NewL( *this, iap );

    //set flag that icons hasn't been set
    CUPnPIconConfigurator::MarkIconsAddedL( EFalse );
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::NewL
// Two-phased constructor.
// --------------------------------------------------------------------------
//
EXPORT_C CUPnPFileSharingEngine* CUPnPFileSharingEngine::NewL()
    {
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::NewL begin");
    CUPnPFileSharingEngine* self = CUPnPFileSharingEngine::NewLC();
    CleanupStack::Pop( self );
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::NewL end");
    return self;
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::NewLC
// Two-phased constructor.
// --------------------------------------------------------------------------
//
EXPORT_C CUPnPFileSharingEngine* CUPnPFileSharingEngine::NewLC()
    {
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::NewLC begin");
    CUPnPFileSharingEngine* self = new (ELeave) CUPnPFileSharingEngine;
    CleanupStack::PushL( self );
    self->ConstructL();
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::NewLC end");
    return self;
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::~CUPnPFileSharingEngine
// Destructor
// --------------------------------------------------------------------------
//
EXPORT_C CUPnPFileSharingEngine::~CUPnPFileSharingEngine()
    {
    __LOG("[UPNP_ENGINE]\tCUPnPFileSharingEngine::~CUPnPFileSharingEngine\
 begin");

    delete iConnMon;
    delete iAO;
    delete iContentSharer;

    delete iImageSelections;
    delete iMusicSelections;
    delete iContentRequestor;


    iContentServer.Close();
    delete iProgress;

    __LOG("[UPNP_ENGINE]\tCUPnPFileSharingEngine::~CUPnPFileSharingEngine\
 end");
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::SetObserver
// Set observer
// --------------------------------------------------------------------------
//
EXPORT_C void CUPnPFileSharingEngine::SetObserver(
    MUPnPFileSharingEngineObserver* aObserver )
    {
    iObserver = aObserver;
    if ( !iObserver )
        {
        if ( iProgress )
            {
            iProgress->Stop();
            }
        }
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::Observer
// ( other items are commented in header )
// --------------------------------------------------------------------------
//
EXPORT_C MUPnPFileSharingEngineObserver* CUPnPFileSharingEngine::Observer()
    {
    return iObserver;
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::SetSharingState
// Starts/Stops file sharing using UPnP Media server API
// --------------------------------------------------------------------------
//
EXPORT_C void CUPnPFileSharingEngine::SetSharingStateL( TBool aState )
    {
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::SetSharingState \
begin");
    if ( iProgress && iShareFileState )
        {
        iProgress->Stop();
        }
    iAO->SetSharingStateL( aState );

    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::SetSharingState \
end");
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::SharingState
// Gets file sharing status.
// --------------------------------------------------------------------------
//
EXPORT_C TBool CUPnPFileSharingEngine::SharingStateL()
    {
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::SharingState \
begin");

    TBool status( EFalse );
    if ( iAO )
        {
        status = iAO->SharingStateL();
        }

    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::SharingState \
end");
    return status;
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::ShareMediaL
// Starts sharing process
// --------------------------------------------------------------------------
//
EXPORT_C void CUPnPFileSharingEngine::ShareMediaL(
    THomeConnectMediaType aType )
    {
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::ShareMediaL begin");

    switch ( aType )
        {
    case EImageAndVideo :
        {
        iContentSharer->ChangeSharedContentL( 
            UpnpContentServer::TUpnpMediaType( aType ),
            *iImageSelections );
        }
        break;
    case EPlaylist:
        {
        iContentSharer->ChangeSharedContentL( 
            UpnpContentServer::TUpnpMediaType( aType ),
            *iMusicSelections );
        }
        break;
    default :
        User::Leave( KErrArgument );
        break;
        }

    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::ShareMediaL end");
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::RefreshSharedMediaL
// Updates shared objects
// --------------------------------------------------------------------------
//
EXPORT_C void CUPnPFileSharingEngine::RefreshSharedMediaL( 
    THomeConnectMediaType aType )
    {
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::RefreshSharedMediaL\
 begin");

    // clear UI cache
    delete iImageSelections;
    iImageSelections = NULL;
    delete iMusicSelections;
    iMusicSelections = NULL;


    iContentSharer->RefreshSharedContentL( 
        UpnpContentServer::TUpnpMediaType( aType ) );
    RequestSharingProgressL();

    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::RefreshSharedMediaL\
 end");
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::RequestSelectionIndexesL
// Gets the selected albums/playlist indexes
// --------------------------------------------------------------------------
//
EXPORT_C void CUPnPFileSharingEngine::RequestSelectionIndexesL(
    THomeConnectMediaType aType ) const
    {
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::RequestSelectionIndexesL\
 begin");

    iContentRequestor->RequestSelectionIndexesL( 
        UpnpContentServer::TUpnpMediaType( aType ) );

    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::RequestSelectionIndexesL\
 end");
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::GetSelectionIndexes
// Gets the selected albums/playlist indexes
// --------------------------------------------------------------------------
//
EXPORT_C void CUPnPFileSharingEngine::GetSelectionIndexesL(
    CArrayFix<TInt>& aMarkedItems ) const
    {
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::GetSelectionIndexesL\
 begin");

    iContentRequestor->GetSelectionIndexesL( aMarkedItems );

    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::GetSelectionIndexesL\
 end");
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::SetSelectionIndexes
// Sets the user selections
// --------------------------------------------------------------------------
//
EXPORT_C void CUPnPFileSharingEngine::SetSelectionIndexesL(
    THomeConnectMediaType aType,
    const CArrayFix<TInt>& aMarkedItems )
    {
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::SetSelectionIndexesL\
 begin");

    switch ( aType )
        {
    case EImageAndVideo:
        {
        delete iImageSelections;
        iImageSelections = NULL;
        iImageSelections = new (ELeave) CArrayFixFlat<TInt>
            (aMarkedItems.Count());
        CopyTintArrayL( aMarkedItems, *iImageSelections );
        }
        break;
    case EPlaylist:
        {
        delete iMusicSelections;
        iMusicSelections = NULL;
        iMusicSelections = new (ELeave) CArrayFixFlat<TInt>
            (aMarkedItems.Count());
        CopyTintArrayL( aMarkedItems, *iMusicSelections );

        }
        break;
    default:
        User::Leave( KErrArgument );
        break;
        }

    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::SetSelectionIndexesL\
 end");
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::RequestSelectionContentL
// Requests the album /playlist names
// --------------------------------------------------------------------------
//
EXPORT_C void CUPnPFileSharingEngine::RequestSelectionContentL(
    THomeConnectMediaType aType )
    {
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::RequestSelectionContentL\
 begin");

    iContentRequestor->RequestSelectionContentL( 
        UpnpContentServer::TUpnpMediaType( aType ) );

    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::RequestSelectionContentL\
 begin");
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::GetSelectionContentL
// Get all albums/playlists identifiers from Media gallery
// --------------------------------------------------------------------------
//
EXPORT_C void CUPnPFileSharingEngine::GetSelectionContentL(
    CDesCArray& aArray ) const
    {
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine:: \
GetSelectionContentL begin");

    iContentRequestor->GetSelectionContentL( aArray );

    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine:: \
GetSelectionContentL end");
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::RequestSharingProgressL
// ( other items are commented in header )
// --------------------------------------------------------------------------
//
EXPORT_C void CUPnPFileSharingEngine::RequestSharingProgressL()
    {
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::\
RequestSharingProgressL begin");
    if( !iProgress )
        {
        iProgress = CUpnpProgressWatcher::NewL( *this );
        }
    iProgress->StartL();

    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::\
RequestSharingProgressL end");
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::StartUploadListenerL
// ( other items are commented in header )
// --------------------------------------------------------------------------
//
EXPORT_C void CUPnPFileSharingEngine::StartUploadListenerL()
    {
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::\
StartUploadListenerL begin");
    iContentServer.StartUploadListenerL();
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::\
StartUploadListenerL end");
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::StopUploadListenerL
// ( other items are commented in header )
// --------------------------------------------------------------------------
//
EXPORT_C void CUPnPFileSharingEngine::StopUploadListenerL()
    {
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::\
StopUploadListenerL begin");
    iContentServer.StopUploadListenerL();
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::\
StopUploadListenerL end");
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::SetConMonState
// ( other items are commented in header )
// --------------------------------------------------------------------------
//
void CUPnPFileSharingEngine::SetConMonStateL( 
    TBool aState, TRequestStatus& aStatus )
    {
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::\
SetConMonState begin");

    delete iConnMon;
    iConnMon = NULL;

    if ( aState )
        {
        // (Re)Start
        CUPnPSettingsEngine* settings = CUPnPSettingsEngine::NewLC();
        TInt iap( KErrNotFound );
        User::LeaveIfError( settings->GetAccessPoint( iap ) );
        iConnMon = CUPnPConnectionMonitor::NewL( *this, iap );
        CleanupStack::PopAndDestroy( settings );
        iContentServer.StartConnectionMonitorL( iap, aStatus );
        }
    else
        {
        iContentServer.StopConnectionMonitorL( aStatus );
        }

    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::\
SetConMonState end");
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::ConnectionLost
// ( other items are commented in header )
// --------------------------------------------------------------------------
//
void CUPnPFileSharingEngine::ConnectionLost()
    {
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::\
ConnectionLost begin");
    if( iAO->SharingStateL() )
        {
        iAO->ConnectionLost();
        if ( iObserver )
            {
            iObserver->HandleSharingConnectionLost( *this );
            }
        }
    __LOG("[UPNP_ENGINE]\t CUPnPFileSharingEngine::\
ConnectionLost end");
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::CopyTintArrayL
// ( other items are commented in header )
// --------------------------------------------------------------------------
//
void CUPnPFileSharingEngine::CopyTintArrayL( const CArrayFix<TInt>& aSrc,
    CArrayFix<TInt>& aDst ) const
    {
    for ( TInt i(0); i<aSrc.Count();i++ )
        {
        aDst.AppendL(aSrc.At(i));
        }
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::CopyCdescArray
// ( other items are commented in header )
// --------------------------------------------------------------------------
//
void CUPnPFileSharingEngine::CopyCdescArrayL( 
    const CDesCArray& aSrc,
    CDesCArray& aDst ) const
    {
    for ( TInt i(0); i<aSrc.Count();i++ )
        {
        aDst.AppendL( aSrc[ i ] );
        }
    }

// --------------------------------------------------------------------------
// CUPnPFileSharingEngine::SetShareFileComplete
// ( other items are commented in header )
// --------------------------------------------------------------------------
//
void CUPnPFileSharingEngine::SetShareFileComplete( 
    TBool aShareState )
    { 
    iShareFileState = aShareState; 
    }

// End of file