wmdrm/wmdrmengine/wmdrmagent/src/wmdrmagentcontent.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:52:27 +0200
changeset 0 95b198f216e5
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2009 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: 
*
*/



// INCLUDE FILES
#include <caf.h>
#include <bitset.h>
#include <attribute.h>
#include <caf/attributeset.h>
#include <caf/stringattributeset.h>
#include <e32test.h>
#include <utf.h>
#include "wmdrmagentcontent.h"
#include "wmdrmagentattributes.h"
#include "asf.h"
#include "logfn.h"

using namespace ContentAccess;

// LOCAL FUNCTION PROTOTYPES
LOCAL_C TInt MapContentShareMode(TContentShareMode aMode);
template<class S>
LOCAL_C void PointerArrayResetDestroyAndClose(TAny* aPtr);

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

// -----------------------------------------------------------------------------
// MapContentShareMode
// Maps the CAF specific file share mode to the RFs/RFile sharing mode
// -----------------------------------------------------------------------------
//
TInt MapContentShareMode(TContentShareMode aMode)
    {
    TInt r = EFileRead | EFileShareAny;

    switch (aMode)
        {
        case EContentShareReadOnly:
            r = EFileRead | EFileShareReadersOnly;
            break;
        case EContentShareReadWrite:
            r = EFileRead | EFileShareReadersOrWriters;
            break;
        case EContentShareExclusive:
            r = EFileRead | EFileShareExclusive;
            break;
        }
    return r;
    }

// -----------------------------------------------------------------------------
// PointerArrayResetDestroyAndClose
// Template method used to push RPointerArrays to the cleanup stack. Takes
// care of deleting all pointers in the array.
// -----------------------------------------------------------------------------
//
template<class S>
void PointerArrayResetDestroyAndClose(TAny* aPtr)
    {
    (reinterpret_cast<RPointerArray<S>*>(aPtr))->ResetAndDestroy();
    (reinterpret_cast<RPointerArray<S>*>(aPtr))->Close();
    }

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

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::CWmDrmAgentContent
// Reset all member variables
// -----------------------------------------------------------------------------
//
CWmDrmAgentContent::CWmDrmAgentContent():
    iURI(NULL),
    iAsf(NULL)
    {
    LOGFN( "CWmDrmAgentContent::CWmDrmAgentContent" );
    }

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::NewL
// Two-phased constructors
// -----------------------------------------------------------------------------
//
CWmDrmAgentContent* CWmDrmAgentContent::NewL(const TDesC& aURI, TContentShareMode aShareMode)
    {
    LOGFN( "CWmDrmAgentContent::NewL" );
    CWmDrmAgentContent* self = new (ELeave) CWmDrmAgentContent();
    CleanupStack::PushL(self);
    self->ConstructL(aURI, aShareMode);
    CleanupStack::Pop(self);
    return self;
    }

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::NewLC
// Two-phased constructors
// -----------------------------------------------------------------------------
//
CWmDrmAgentContent* CWmDrmAgentContent::NewLC(
    const TDesC& aUri,
    TContentShareMode aShareMode)
    {
    LOGFN( "CWmDrmAgentContent::NewLC" );
    CWmDrmAgentContent* self = new (ELeave) CWmDrmAgentContent();
    CleanupStack::PushL(self);
    self->ConstructL(aUri, aShareMode);
    return self;
    }


// -----------------------------------------------------------------------------
// CWmDrmAgentContent::NewL
// Two-phased constructors
// -----------------------------------------------------------------------------
//
//

CWmDrmAgentContent* CWmDrmAgentContent::NewL(RFile& aFile)
    {
    LOGFN( "CWmDrmAgentContent::NewL (2)" );
    CWmDrmAgentContent* self = new (ELeave) CWmDrmAgentContent();
    CleanupStack::PushL(self);
    self->ConstructL(aFile);
    CleanupStack::Pop(self);
    return self;
    }

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::NewLC
// Two-phased constructors
// -----------------------------------------------------------------------------
//
//

CWmDrmAgentContent* CWmDrmAgentContent::NewLC(RFile& aFile)
    {
    LOGFN( "CWmDrmAgentContent::NewLC (2)" );
    CWmDrmAgentContent* self = new (ELeave) CWmDrmAgentContent();
    CleanupStack::PushL(self);
    self->ConstructL(aFile);
    return self;
    }



// -----------------------------------------------------------------------------
// CWmDrmAgentContent::~CWmDrmAgentContent
// -----------------------------------------------------------------------------
//
CWmDrmAgentContent::~CWmDrmAgentContent()
    {
    LOGFN( "CWmDrmAgentContent::~CWmDrmAgentContent" );
    iFile.Close();
    iFs.Close();
    delete iURI;
    delete iAsf;
    }

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::ConstructL
// Initialize the agent from a URI (file name) and file mode, opens the
// the file and takes membership of the handle
// -----------------------------------------------------------------------------
//
void CWmDrmAgentContent::ConstructL(const TDesC& aUri, TContentShareMode aShareMode)
    {
    LOGFN( "CWmDrmAgentContent::ConstructL" );
    iURI = aUri.AllocL();
    User::LeaveIfError(iFs.Connect());
    User::LeaveIfError(iFile.Open(iFs, aUri, MapContentShareMode(aShareMode)));
    iAsf = CAsf::NewL(iFile);
    }

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::ConstructL
// Initialize the agent from a file handle, duplicates the handle
// -----------------------------------------------------------------------------
//
void CWmDrmAgentContent::ConstructL(RFile& aFile)
    {
    TFileName name;

    LOGFN( "CWmDrmAgentContent::ConstructL (2)" );
    User::LeaveIfError(iFile.Duplicate(aFile));
    User::LeaveIfError(iFs.Connect());
    iFile.Name(name);
    iURI = name.AllocL();
    iAsf = CAsf::NewL(iFile);
    }

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::OpenContainer
// -----------------------------------------------------------------------------
//

TInt CWmDrmAgentContent::OpenContainer(const TDesC&)
    {
    LOGFN( "CWmDrmAgentContent::OpenContainer" );
    return KErrNotFound;
    }

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::CloseContainer
// -----------------------------------------------------------------------------
//

TInt CWmDrmAgentContent::CloseContainer()
    {
    LOGFN( "CWmDrmAgentContent::CloseContainer" );
    return KErrNotFound;
    }

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::GetEmbeddedObjectsL
// -----------------------------------------------------------------------------
//

void CWmDrmAgentContent::GetEmbeddedObjectsL(RStreamablePtrArray<CEmbeddedObject>& /*aArray*/)
    {
    LOGFN( "CWmDrmAgentContent::GetEmbeddedObjectsL" );
    User::Leave(KErrNotSupported);
    }

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::GetEmbeddedObjectsL
// -----------------------------------------------------------------------------
//

void CWmDrmAgentContent::GetEmbeddedObjectsL(RStreamablePtrArray<CEmbeddedObject>& aArray, TEmbeddedType aType)
    {
    LOGFN( "CWmDrmAgentContent::GetEmbeddedObjectsL" );
    // the only embedded object is the file itself
    if(aType == EContentObject)
        {
        // just get the default object since there is only one content object
        GetEmbeddedObjectsL(aArray);
        }
    }

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::Search
// -----------------------------------------------------------------------------
//

TInt CWmDrmAgentContent::Search(RStreamablePtrArray<CEmbeddedObject>& /*aArray*/, const TDesC8& /*aMimeType*/, TBool )
    {
    LOGFN( "CWmDrmAgentContent::Search" );
    return KErrNotSupported;
    }

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::GetAttribute
// -----------------------------------------------------------------------------
//

TInt CWmDrmAgentContent::GetAttribute(TInt aAttribute, TInt& aValue, const TDesC& aUniqueId)
    {
    TInt r = KErrNone;
    TInt err = KErrNone;

    LOGFN( "CWmDrmAgentContent::GetAttribute" );
    TRAP(err, r = TWmDrmAgentAttributes::GetAttributeL(
              iAsf, aAttribute, aValue, TVirtualPathPtr(*iURI, aUniqueId)));
    if (err != KErrNone)
        {
        r = err;
        }
    return r;
    }

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::GetAttributeSet
// -----------------------------------------------------------------------------
//

TInt CWmDrmAgentContent::GetAttributeSet(RAttributeSet& aAttributeSet, const TDesC& aUniqueId)
    {
    TInt r = KErrNone;
    TInt err = KErrNone;

    LOGFN( "CWmDrmAgentContent::GetAttributeSet" );
    TRAP(err,r = TWmDrmAgentAttributes::GetAttributeSetL(iAsf, aAttributeSet,
        TVirtualPathPtr(*iURI, aUniqueId)));
    if (err != KErrNone)
        {
        r = err;
        }
    return r;
    }


// -----------------------------------------------------------------------------
// CWmDrmAgentContent::GetStringAttribute
// -----------------------------------------------------------------------------
//

TInt CWmDrmAgentContent::GetStringAttribute(TInt aAttribute, TDes& aValue, const TDesC& aUniqueId)
    {

    TInt r = KErrNone;
    TInt err = KErrNone;

    LOGFN( "CWmDrmAgentContent::GetStringAttribute" );
    TRAP(err, r = TWmDrmAgentAttributes::GetStringAttributeL(iAsf, aAttribute,
        aValue, TVirtualPathPtr(*iURI, aUniqueId)));
    if (err != KErrNone)
        {
        r = err;
        }
    return r;

    }

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::GetStringAttributeSet
// -----------------------------------------------------------------------------
//

TInt CWmDrmAgentContent::GetStringAttributeSet(RStringAttributeSet& aStringAttributeSet, const TDesC& aUniqueId)
    {
    TInt r = KErrNone;
    TInt err = KErrNone;

    LOGFN( "CWmDrmAgentContent::GetStringAttributeSet" );
    TRAP(err,r = TWmDrmAgentAttributes::GetStringAttributeSetL(
        iAsf, aStringAttributeSet,
        TVirtualPathPtr(*iURI, aUniqueId)));
    if (err != KErrNone)
        {
        r = err;
        }
    return r;

    }

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::AgentSpecificCommand
// -----------------------------------------------------------------------------
//
TInt CWmDrmAgentContent::AgentSpecificCommand(
    TInt /*aCommand*/,
    const TDesC8& /*aInputBuffer*/,
    TDes8& /*aOutputBuffer*/)
    {
    LOGFN( "CWmDrmAgentContent::AgentSpecificCommand" );
    return KErrCANotSupported;
    }

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::AgentSpecificCommand
// -----------------------------------------------------------------------------
//
void CWmDrmAgentContent::AgentSpecificCommand(
    TInt aCommand,
    const TDesC8& aInputBuffer,
    TDes8& aOutputBuffer,
    TRequestStatus& aStatus)
    {
    LOGFN( "CWmDrmAgentContent::AgentSpecificCommand (2)" );
    TRequestStatus *ptr = &aStatus;
    User::RequestComplete(ptr, AgentSpecificCommand(aCommand, aInputBuffer,
        aOutputBuffer));
    }

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::NotifyStatusChange
// -----------------------------------------------------------------------------
//
void CWmDrmAgentContent::NotifyStatusChange(TEventMask , TRequestStatus& aStatus, const TDesC& )
    {
    LOGFN( "CWmDrmAgentContent::NotifyStatusChange" );
    TRequestStatus* ptr = &aStatus;
    User::RequestComplete(ptr, KErrCANotSupported);
    }

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::CancelNotifyStatusChange
// -----------------------------------------------------------------------------
//
TInt CWmDrmAgentContent::CancelNotifyStatusChange(
    TRequestStatus& /*aStatus*/,
    const TDesC& /*aUniqueId*/)
    {
    LOGFN( "CWmDrmAgentContent::CancelNotifyStatusChange" );
    return KErrCANotSupported;
    }

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::RequestRights
// -----------------------------------------------------------------------------
//
void CWmDrmAgentContent::RequestRights(TRequestStatus& aStatus, const TDesC& )
    {
    LOGFN( "CWmDrmAgentContent::RequestRights" );
    TRequestStatus* ptr = &aStatus;
    User::RequestComplete(ptr, KErrCANotSupported);
    }

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::CancelRequestRights
// -----------------------------------------------------------------------------
//
TInt CWmDrmAgentContent::CancelRequestRights(
    TRequestStatus& aStatus,
    const TDesC& /*aUniqueId*/)
    {
    LOGFN( "CWmDrmAgentContent::CancelRequestRights" );
    TRequestStatus *ptr = &aStatus;
    User::RequestComplete(ptr, KErrCANotSupported);
    return KErrCANotSupported;
    }

// -----------------------------------------------------------------------------
// CWmDrmAgentContent::DisplayInfoL
// -----------------------------------------------------------------------------
//
void CWmDrmAgentContent::DisplayInfoL(
    TDisplayInfo /*aDisplayInfo*/,
    const TDesC& /*aUniqueId*/)
    {
    LOGFN( "CWmDrmAgentContent::DisplayInfoL" );
    User::Leave(KErrCANotSupported);
    }


// -----------------------------------------------------------------------------
// CWmDrmAgentContent::SetProperty
// Reset all member variables
// -----------------------------------------------------------------------------
//
TInt CWmDrmAgentContent::SetProperty(
    TAgentProperty /*aProperty*/,
    TInt /*aValue*/)
    {
    LOGFN( "CWmDrmAgentContent::SetProperty" );
    return KErrCANotSupported;
    }