omadrm/drmengine/server/src/DRMRightsCleaner.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 16 Apr 2010 15:14:55 +0300
changeset 23 493788a4a8a4
parent 0 95b198f216e5
permissions -rw-r--r--
Revision: 201011 Kit: 201015

/*
* Copyright (c) 2003 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:  Implementation of the DRM Rights Database
*
*/



// INCLUDE FILES

#include <e32std.h>     // RPointerArray
#include <e32def.h>     // Type definitions

#include <caf/caf.h>
#include "DRMCommon.h"  // DRM Error messages
#include "DRMRightsCleaner.h"
#include "drmrightsdb.h"
#include "drmlog.h"


// EXTERNAL DATA STRUCTURES

// EXTERNAL FUNCTION PROTOTYPES

// CONSTANTS

// MACROS

// LOCAL CONSTANTS AND MACROS

const TInt KMaxDirs = 16;

// MODULE DATA STRUCTURES

// LOCAL FUNCTION PROTOTYPES

// FORWARD DECLARATIONS

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


// -----------------------------------------------------------------------------
// CDRMRightsCleaner::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CDRMRightsCleaner* CDRMRightsCleaner::NewL( RFs& aFs,
                                            CDRMRightsDB* aDatabase,
                                            TRequestStatus& aStatus,
                                            const TDesC& aDatabasePath,
                                            const TTime& aTime )
    {
    CDRMRightsCleaner* self = new( ELeave ) CDRMRightsCleaner( aFs,
                                                        aDatabase, aStatus,
                                                        aDatabasePath, aTime );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop();

    return self;
    }


// -----------------------------------------------------------------------------
// Destructor
// -----------------------------------------------------------------------------
//
CDRMRightsCleaner::~CDRMRightsCleaner()
    {
    // just in case
    Deque();

    if( iCurrentDirectory )
        {
        delete iCurrentDirectory;
        iCurrentDirectory = NULL;
        }
    };

// -----------------------------------------------------------------------------
// CDRMRightsCleaner::ExecuteCleanupLD
// -----------------------------------------------------------------------------
//
void CDRMRightsCleaner::ExecuteCleanupLD()
    {
    TRequestStatus* status = 0;

    if( !IsAdded() )
        {
        CActiveScheduler::Add(this);
        }
    if ( !IsActive() )
        {
        SetActive();
        }

    iOperationStatus = KRequestPending;
    status = &iStatus;
    User::RequestComplete(status,KErrNone);
    };

// -----------------------------------------------------------------------------
// Default Constructor - First phase.
// -----------------------------------------------------------------------------
//
CDRMRightsCleaner::CDRMRightsCleaner( RFs& aFs,
                                      CDRMRightsDB* aDatabase,
                                      TRequestStatus& aStatus,
                                      const TDesC& aDatabasePath,
                                      const TTime& aTime ) :
    CActive( EPriorityLow ),
    iFileServer( aFs ),
    iRightsDb( aDatabase ),
    iOperationStatus( aStatus ),
    iDatabasePath( aDatabasePath ),
    iExpirationTime( aTime ),
    iCurrentDirectory( NULL ),
    iDirIndex( 0 ),
    iCurrentFile( 0 )
    {

    };


// -----------------------------------------------------------------------------
// CDRMRightsCleaner::ConstructL
// -----------------------------------------------------------------------------
//
void CDRMRightsCleaner::ConstructL()
    {
    };

// -----------------------------------------------------------------------------
// CDRMRightsCleaner::RunError
// More or less just ignore all errors and call RunL again
// -----------------------------------------------------------------------------
//
TInt CDRMRightsCleaner::RunError(TInt aError)
    {
    TRequestStatus* status = 0;

    if( aError == KErrCancel )
        {
        // we are complete:
        status = &iOperationStatus;
        User::RequestComplete( status, KErrNone );
        delete this;
        return KErrNone;
        }

    SetActive();
    status = &iStatus;
    User::RequestComplete(status,KErrNone);

    return KErrNone;
    };

// -----------------------------------------------------------------------------
// CDRMRightsCleaner::RunL
// -----------------------------------------------------------------------------
//
void CDRMRightsCleaner::RunL()
    {
    TRequestStatus* status = 0;
    TInt error = KErrNone;
    TFileName path;
    TInt modIndex = 0;
    TInt removeFile = EFalse;

    // If the status of the cleaning is other than KErrNone
    User::LeaveIfError( iStatus.Int() );

    if( !iCurrentDirectory ||
        iCurrentFile >= iCurrentDirectory->Count() )
        {

        if( iDirIndex >= KMaxDirs )
            {
            // we are complete:
            status = &iOperationStatus;
            User::RequestComplete( status, KErrNone );
            delete this;
            return;
            }

        // if it exists, delete it
        if( iCurrentDirectory )
            {
            delete iCurrentDirectory;
            iCurrentDirectory = 0;
            }

        TFileName path = iDatabasePath;


        path.Append(iDirIndex < 10 ? iDirIndex + '0' : iDirIndex + 'a' - 10);
        path.Append('\\');


        error =  iFileServer.GetDir(path, KEntryAttDir, ESortNone, iCurrentDirectory);

        DRMLOG(_L("Entering directory:"));
        DRMLOG( path );

        // increase the dir counter
        iDirIndex++;
        iCurrentFile = 0;
        }

    if( !error && iCurrentDirectory->Count() )
        {
        modIndex = iDirIndex-1;

        path = iDatabasePath;
        path.Append(modIndex < 10 ? modIndex + '0' : modIndex + 'a' - 10);
        path.Append('\\');

        path.Append((*iCurrentDirectory)[iCurrentFile].iName);

        DRMLOG(_L("Checking file:"));
        DRMLOG( path );

        // increase the file counter
        iCurrentFile++;

        TRAP( error, removeFile = iRightsDb->DeleteExpiredL( path, iExpirationTime ) );
        if( error != KErrNone )
            {
            DRMLOG2( _L( "CDRMRightsCleaner: error %d cleaning:" ), error );
            DRMLOG( path );
            }
        else
            {
            if ( removeFile )
                {
                DRMLOG(_L("Deleting file:"));
                DRMLOG( path );
                iFileServer.Delete( path );
                }
            }
        }

    SetActive();
    status = &iStatus;
    User::RequestComplete(status, KErrNone);
    };

// -----------------------------------------------------------------------------
// CDRMRightsCleaner::DoCancel
// -----------------------------------------------------------------------------
//
void CDRMRightsCleaner::DoCancel()
    {
    };


// -----------------------------------------------------------------------------
// CDRMRightsCleaner::DoCleanup
// -----------------------------------------------------------------------------
//
void CDRMRightsCleaner::DoCleanup()
    {
    TRequestStatus* status = 0;
    if( iCancel <= 0 )
        {
        Cancel();
        iCancel = 1;
        SetActive();
        status = &iStatus;
        User::RequestComplete(status, KErrCancel);
        }
    };