commondrm/drmutility/src/rdrmhelperclient.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 15 Mar 2010 12:41:43 +0200
branchRCL_3
changeset 18 8a03a285ab14
parent 0 95b198f216e5
child 84 b09186059647
permissions -rw-r--r--
Revision: 201009 Kit: 201010

/*
* Copyright (c) 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:  Implementation of the DRMHelperServer Client
*                session functionality
*
*/


// INCLUDE FILES
#include <e32std.h>
#include <e32math.h>
#include "DRMHelperCommon.h"
#include "DRMHelperServer.h"
#include "rdrmhelperclient.h"

// LOCAL CONSTANTS AND MACROS

// Number of message slots to reserve for this client server session.
// Since we only communicate synchronously here, we never have any
// outstanding asynchronous requests.

const TUint KDefaultMessageSlots = 0;
const TUid KServerUid3 = {0x101F6DC5};


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

// -----------------------------------------------------------------------------
// AutomatedServiceTypeToHs Converts AutomatedUsage service type
//                           to HelperServer.
// -----------------------------------------------------------------------------
//
LOCAL_C TInt AutomatedServiceTypeToHs(
    const DRM::TDrmAutomatedServiceType aServiceType,
    TInt& aHsServiceType )
    {
    if ( aServiceType == DRM::EAUActive )
        {
        aHsServiceType = CDRMHelperServer::EActive;
        return KErrNone;
        }
    if ( aServiceType == DRM::EAUPassive )
        {
        aHsServiceType = CDRMHelperServer::EPassive;
        return KErrNone;
        }
  return KErrArgument;
  }

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

// -----------------------------------------------------------------------------
// RDrmHelperClient::RDrmHelperClient
// C++ default constructor can NOT contain any code, that might leave.
// -----------------------------------------------------------------------------
//
RDrmHelperClient::RDrmHelperClient() : RSessionBase()
    {
    }

// -----------------------------------------------------------------------------
// RDrmHelperClient::Connect
//
// Connect to the server session
// -----------------------------------------------------------------------------
//
TInt RDrmHelperClient::Connect()
    {
    TInt error = StartServer();

    if ( !error )
        {
        error = CreateSession( KDRMHelperServerName,
                               Version(),
                               KDefaultMessageSlots );
        }
    return error;
    }

// -----------------------------------------------------------------------------
// RDrmHelperClient::Version
//
// return server version
// -----------------------------------------------------------------------------
//
TVersion RDrmHelperClient::Version() const
    {
    return ( TVersion( KDRMHSMajorVersionNumber,
                       KDRMHSMinorVersionNumber,
                       KDRMHSBuildVersionNumber ) );
    }

// -----------------------------------------------------------------------------
// RDrmHelperClient::SetAutomated
//
// Register one content uri to the helper server
// -----------------------------------------------------------------------------
//
TInt RDrmHelperClient::SetAutomated(
    const TDesC8& aUri,
    const DRM::TDrmAutomatedType aAutomatedType,
    const ContentAccess::TIntent aIntent,
    const DRM::TDrmAutomatedServiceType aServiceType ) const
    {
    TInt ret( KErrNone );
    TInt drmHsServiceType( 0 );

    ret = AutomatedServiceTypeToHs( aServiceType, drmHsServiceType );
    if ( ret )
        {
        return ret;
        }

    // Create descriptor to enable copying data between
    // client and server. Note: This can be local since
    // this is a synchronous call.
    // Note : Using TPtr8 since this is binary information
    TPtrC8 descriptor( aUri );

    // This call waits for the server to complete the request before
    // proceeding.
    return SendReceive( ERegister,
                        TIpcArgs( aIntent,
                                  drmHsServiceType,
                                  aAutomatedType,
                                  &descriptor ) );
    }

// -----------------------------------------------------------------------------
// RDrmHelperClient::RemoveAutomated
//
// Unregister one content uri
// -----------------------------------------------------------------------------
//
TInt RDrmHelperClient::RemoveAutomated(
    const TDesC8& aUri,
    const DRM::TDrmAutomatedType aAutomatedType,
    const ContentAccess::TIntent aIntent,
    const DRM::TDrmAutomatedServiceType aServiceType ) const
    {
    TInt ret( KErrNone );
    TInt drmHsServiceType( 0 );

    ret = AutomatedServiceTypeToHs( aServiceType, drmHsServiceType );
    if( ret )
        {
        return ret;
        }

    // Create descriptor to enable copying data between
    // client and server. Note: This can be local since
    // this is a synchronous call.
    // Note : Using TPtr8 since this is binary information
    TPtrC8 descriptor( aUri );

    // This call waits for the server to complete the request before
    // proceeding.
    ret = SendReceive( ERemove,
                       TIpcArgs( aIntent,
                                 drmHsServiceType,
                                 aAutomatedType,
                                 &descriptor ) );

    if ( ret == KErrNotFound )
        {
        // content was never actually registered
        ret = KErrNone;
        }
    return ret;
    }

// -----------------------------------------------------------------------------
// RDrmHelperClient::RemoveAutomatedAll
//
// Unregister one content uri
// -----------------------------------------------------------------------------
//
TInt RDrmHelperClient::RemoveAutomatedAll(
    const TDesC8& aUri,
    const DRM::TDrmAutomatedType aAutomatedType,
    const ContentAccess::TIntent aIntent,
    const DRM::TDrmAutomatedServiceType aServiceType ) const
    {
    TPtrC8 descriptor( aUri );
    TInt ret( KErrNone );
    TInt drmHsServiceType( 0 );

    ret = AutomatedServiceTypeToHs( aServiceType, drmHsServiceType );
    if ( ret )
        {
        return ret;
        }

    TBool automated( EFalse );

    // This call waits for the server to complete the request before
    // proceeding.
    ret = SendReceive( ERemove,
                       TIpcArgs( aIntent,
                                 drmHsServiceType,
                                 aAutomatedType,
                                 &descriptor ) );

    ret = IsAutomated( aUri,
                       aAutomatedType,
                       aIntent,
                       aServiceType,
                       automated );

    while ( automated )
        {
        // unregister all
        ret = SendReceive( ERemove,
                           TIpcArgs( aIntent,
                                     drmHsServiceType,
                                     aAutomatedType,
                                     &descriptor ) );

        IsAutomated( aUri, aAutomatedType, aIntent, aServiceType, automated );
        }

    if ( ret == KErrNotFound )
        {
        ret = KErrNone;
        }
    return ret;
    }

// -----------------------------------------------------------------------------
// RDrmHelperClient::IndicateIdle
// -----------------------------------------------------------------------------
//
TInt RDrmHelperClient::IndicateIdle() const
    {
    return SendReceive( EIndicateIdle, TIpcArgs() );
    }

// -----------------------------------------------------------------------------
// RDrmHelperClient::IsAutomated
// -----------------------------------------------------------------------------
//
TInt RDrmHelperClient::IsAutomated(
    const TDesC8& aUri,
    const DRM::TDrmAutomatedType aAutomatedType,
    const ContentAccess::TIntent aIntent,
    const DRM::TDrmAutomatedServiceType aServiceType,
    TBool& aAutomated ) const
    {
    TPtr8 flag( reinterpret_cast< TUint8* >( &aAutomated ), 0, sizeof( TInt ) );
    TInt ret( KErrNone );
    TInt drmHsServiceType( 0 );

    ret = AutomatedServiceTypeToHs( aServiceType, drmHsServiceType );
    if ( ret )
        {
        return ret;
        }

    TInt type( CDRMHelperServer::EActive );

    // Create descriptor to enable copying data between
    // client and server. Note: This can be local since
    // this is a synchronous call.
    // Note : Using TPtr8 since this is binary information
    TPtrC8 descriptor( aUri );

    // This call waits for the server to complete the request before
    // proceeding.
    ret = SendReceive( EIsRegistered,
                       TIpcArgs( aIntent,
                                 type,
                                 aAutomatedType,
                                 &descriptor ) );
    if ( !ret )
        {
        type = CDRMHelperServer::EPassive;

        ret = SendReceive( EIsRegistered,
                           TIpcArgs( aIntent,
                                     type,
                                     aAutomatedType,
                                     &descriptor ) );
        }
    aAutomated = ret ? ETrue : EFalse;
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// RDrmHelperClient::StartServer
// -----------------------------------------------------------------------------
//
TInt RDrmHelperClient::StartServer()
    {
    TInt result(0);

    TFindServer findHelperServer( KDRMHelperServerName );
    TFullName name;

    result = findHelperServer.Next( name );
    if ( !result )
        {
        // Server already running
        return KErrNone;
        }

    RSemaphore semaphore;
    result = semaphore.CreateGlobal( KDRMHelperServerSemaphoreName, 0 );
    if ( result )
        {
        return result;
        }

    result = CreateServerProcess();
    if ( result )
        {
        return result;
        }

    semaphore.Wait();
    semaphore.Close();

    return KErrNone;
    }

// -----------------------------------------------------------------------------
// RDrmHelperClient::CreateServerProcess
// -----------------------------------------------------------------------------
//
TInt RDrmHelperClient::CreateServerProcess()
    {
    TInt result( 0 );
    const TUidType serverUid( KNullUid, KNullUid, KServerUid3 );

    RProcess server;
    result = server.Create( KDRMHSServerFileName, _L(""), serverUid );
    if ( result )
        {
        return result;
        }

    server.Resume();
    server.Close();

    return KErrNone;
    }

// ========================== OTHER EXPORTED FUNCTIONS =========================


//  End of File