psln/pslnengine/src/PslnDiskUtil.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 13 Oct 2010 14:50:15 +0300
branchRCL_3
changeset 72 a5e7a4f63858
parent 0 2f259fa3e83a
permissions -rw-r--r--
Revision: 201039 Kit: 201041

/*
* Copyright (c) 2003-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:  Disk service utility for Psln.
*
*/


// INCLUDE FILES

// General.
#include <coemain.h>
#include <DRMHelper.h>
#include <DRMRights.h>
#include <AknsSrvClient.h>
#include <pathinfo.h> 
#include <caf/manager.h>

// Psln specific.
#include "PslnDiskUtil.h"
#include "PslnFeatures.h"
#include "PslnConst.h"
#include "PslnDebug.h"

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

// -----------------------------------------------------------------------------
// PslnDiskUtil::MmcStatus
// -----------------------------------------------------------------------------
//
TInt PslnDiskUtil::MmcStatus()
    {
    PSLN_TRACE_DEBUG("PslnDiskUtil::MmcStatus");
    if( !PslnFeatures::IsMMCSupported() )
        {
        PSLN_TRACE_DEBUG("PslnDiskUtil::MmcStatus Not Supported");
        return KErrNotSupported;
        }

    RFs& fs = CCoeEnv::Static()->FsSession();

    TInt error = KErrNone;
    TDriveInfo driveInfo;
    TInt res = 0;
    fs.CharToDrive( PathInfo::MemoryCardRootPath()[0], res );
    error = fs.Drive( driveInfo, res  );
    if( error )
        {
        PSLN_TRACE_DEBUG1("PslnDiskUtil::MmcStatus Error=%d", error );
        return error;
        }

    // MMC is locked
    if( driveInfo.iMediaAtt & KMediaAttLocked )
        {
        PSLN_TRACE_DEBUG("PslnDiskUtil::MmcStatus Locked");
        return KErrLocked;
        }

    // MMC is not present or of unknown type
    if ( driveInfo.iType == EMediaNotPresent ||
         driveInfo.iType == EMediaUnknown )
        {
        PSLN_TRACE_DEBUG("PslnDiskUtil::MmcStatus Not present");
        return KErrNotFound;
        }

    if( driveInfo.iMediaAtt & KMediaAttWriteProtected )
        {
        PSLN_TRACE_DEBUG("PslnDiskUtil::MmcStatus Read Only");
        return KPslnDiskUtilReadOnly;
        }
    PSLN_TRACE_DEBUG("PslnDiskUtil::MmcStatus Ok");
    return KErrNone;
    }

// ---------------------------------------------------------------------------
// PslnDiskUtil::QueryAndSetAutomatedL
// ---------------------------------------------------------------------------
//
TBool PslnDiskUtil::QueryAndSetAutomatedL(
    RAknsSrvSession& aSkinSrvSession, const TDesC& aFileName)
    {
    PSLN_TRACE_DEBUG("PslnDiskUtil::QueryAndSetAutomatedL");

    TBool isProtected = EFalse;
    TInt value = KErrNone;

    TInt fileserverhandle;
    TInt filehandle;
    fileserverhandle = aSkinSrvSession.OpenBitmapFile( aFileName, filehandle );
    RFile file;
    User::LeaveIfError( file.AdoptFromServer( fileserverhandle, filehandle ) );
    CleanupClosePushL( file );

    CContent* content = CContent::NewLC( file );
    User::LeaveIfError( content->GetAttribute( EIsProtected, value ) );
    if ( value )
        {
        isProtected = ETrue;
        }
    CleanupStack::PopAndDestroy( content );

    PSLN_TRACE_DEBUG1("PslnDiskUtil::QueryAndSetAutomatedL prot=%d", isProtected );
    PSLN_TRACE_DEBUG1("PslnDiskUtil::QueryAndSetAutomatedL value=%d", value );

    TBool set = ETrue;
    if ( isProtected )
        {
        CDRMHelper* helper = CDRMHelper::NewLC();
        CDRMHelperRightsConstraints* playconst = NULL;
        CDRMHelperRightsConstraints* dispconst = NULL;
        CDRMHelperRightsConstraints* execconst = NULL;
        CDRMHelperRightsConstraints* printconst = NULL;
        TBool expired = EFalse;
        TBool sendingallowed = EFalse;
        helper->GetRightsDetailsL( 
            file, 
            CDRMRights::EDisplay, 
            expired, 
            sendingallowed, 
            playconst, 
            dispconst, 
            execconst, 
            printconst ); 
        delete playconst;
        delete execconst;
        delete printconst;
        CleanupStack::PushL( dispconst );

        // Talkin' 'bout themes here
        helper->SetAutomatedType( CDRMHelper::EAutomatedTypeTheme );

        if ( dispconst && dispconst->FullRights() )
            {
            set = ETrue;
            // Set the Fullrights content as automated also
            // and ignore the result....            
            helper->SetAutomated( file );
            }
        else
            {
            TInt res = KErrNone;           
            res = helper->SetAutomated( file );           
            PSLN_TRACE_DEBUG1("PslnDiskUtil::QueryAndSetAutomatedL res=%d", res );

            if ( res == KErrCancel )
                {
                set = EFalse;
                }
            else 
                {
                User::LeaveIfError( res );
                TInt err = helper->ConsumeFile2( file, CDRMRights::EPlay, CDRMHelper::EStart );
                PSLN_TRACE_DEBUG1("PslnDiskUtil::QueryAndSetAutomatedL 1 err=%d", err );
                err = helper->ConsumeFile2( file, CDRMRights::EPlay, CDRMHelper::EFinish );
                PSLN_TRACE_DEBUG1("PslnDiskUtil::QueryAndSetAutomatedL 2 err=%d", err );
                err = helper->ConsumeFile2( file, CDRMRights::EDisplay, CDRMHelper::EStart );
                PSLN_TRACE_DEBUG1("PslnDiskUtil::QueryAndSetAutomatedL 3 err=%d", err );
                err = helper->ConsumeFile2( file, CDRMRights::EDisplay, CDRMHelper::EFinish );
                PSLN_TRACE_DEBUG1("PslnDiskUtil::QueryAndSetAutomatedL 4 err=%d", err );
                err = helper->ConsumeFile2( file, CDRMRights::EExecute, CDRMHelper::EStart );
                PSLN_TRACE_DEBUG1("PslnDiskUtil::QueryAndSetAutomatedL 5 err=%d", err );
                err = helper->ConsumeFile2( file, CDRMRights::EExecute, CDRMHelper::EFinish );
                PSLN_TRACE_DEBUG1("PslnDiskUtil::QueryAndSetAutomatedL 6 err=%d", err );
                set = ETrue;
                }
            }
        CleanupStack::PopAndDestroy( 2, helper );
        }
    CleanupStack:: PopAndDestroy(); // file
    PSLN_TRACE_DEBUG1("PslnDiskUtil::QueryAndSetAutomatedL set=%d", (TInt) set );
    return set;
    }

//  End of File