accessoryservices/tspclientmapper/src/tspclientmapperimpl.cpp
changeset 0 4e1aa6a622a0
child 10 66ecddbca914
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/accessoryservices/tspclientmapper/src/tspclientmapperimpl.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,619 @@
+/*
+* 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:  This interface is used to add mappings between the process
+*                that listens the remote control and is assosiated with
+*                another function.
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32property.h>
+#include "RemConDebug.h"
+#include "tspclientmapperimpl.h"
+#include "tspclientmapperprivatepskeys.h"
+
+_LIT( KTspClientMapperSynch, "TspClientMapperSynch_10282CD6" );
+// ============================ MEMBER FUNCTIONS ===============================
+_LIT_SECURITY_POLICY_C1(KNoCapability, ECapability_None);
+
+// -----------------------------------------------------------------------------
+// CTspClientMapperImpl::CRemConTspController
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+
+CTspClientMapperImpl::CTspClientMapperImpl()
+	{
+	COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::CTspClientMapperImpl()" );
+    COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::CTspClientMapperImpl() - return" );
+	}
+
+// Destructor
+CTspClientMapperImpl::~CTspClientMapperImpl()
+	{
+	COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::~CTspClientMapperImpl()" );
+    CloseMutex();
+    }
+
+// -----------------------------------------------------------------------------
+// CTspClientMapperImpl::NewL
+// -----------------------------------------------------------------------------
+//
+CTspClientMapperImpl* CTspClientMapperImpl::NewL()
+    {
+	COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::NewL()" );
+	CTspClientMapperImpl* self = new( ELeave ) CTspClientMapperImpl();
+	CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::NewL() - return" );
+    
+    return self;
+    }
+    
+// -----------------------------------------------------------------------------
+// CTspClientMapperImpl::ConstructL
+// Constructor function. 
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CTspClientMapperImpl::ConstructL()
+    {
+    COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::ConstructL()" );
+    
+    OpenMutexL();
+    
+    TTspClientMapperSynch synchObj( iMutex );
+    
+    TFixedArray< TProcessId, 10 > arrayCheck;
+    TPckg< TFixedArray< TProcessId, 10 > > bufCheck( arrayCheck );
+    TInt err = RProperty::Get(
+                KTspClientMapperProperty,
+                KTspClientMapperKeyPlaying,
+                bufCheck );
+    if( err == KErrNotFound )
+        {
+        COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::ConstructL() - Define the P&S keys, this should only be done in the boot" );
+        RProperty::Define(
+                    KTspClientMapperProperty,
+                    KTspClientMapperKeyPlaying,
+                    RProperty::EByteArray,
+                    KNoCapability, 
+                    KNoCapability,
+                    RProperty::KMaxPropertySize );
+        RProperty::Define(
+                        KTspClientMapperProperty,
+                        KTspClientMapperKeyRegistered,
+                        RProperty::EByteArray,
+                        KNoCapability, 
+                        KNoCapability,
+                        RProperty::KMaxPropertySize );
+        RProperty::Define(
+                        KTspClientMapperProperty,
+                        KTspClientMapperKeyStopped,
+                        RProperty::EByteArray,
+                        KNoCapability, 
+                        KNoCapability,
+                        RProperty::KMaxPropertySize );
+        
+        TFixedArray< TProcessId, 10 > array;
+        TPckg< TFixedArray< TProcessId, 10 > > buf( array );
+        const TProcessId processIdNull( 0 );
+        for( TInt i = 0; i != 10; i++ )
+            {
+            array[ i ] = processIdNull;
+            }
+        err = RProperty::Set(
+                    KTspClientMapperProperty,
+                    KTspClientMapperKeyPlaying,
+                    buf );
+        err = RProperty::Set(
+                    KTspClientMapperProperty,
+                    KTspClientMapperKeyRegistered,
+                    buf );
+        err = RProperty::Set(
+                    KTspClientMapperProperty,
+                    KTspClientMapperKeyStopped,
+                    buf );
+        }
+    
+    COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::ConstructL() - return" );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CTspClientMapperImpl::SetTargetClient
+// Provides implementation of this (TSP) interface. 
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CTspClientMapperImpl::SetTspTargetClient(
+    TTspClientMappingType aMappingType,
+    TProcessId aProcessId )
+	{
+    COM_TRACE_2( "[TspClientMapperImpl] CTspClientMapperImpl::SetTspTargetClient() aMappingType=%d, aProcessId=%d", aMappingType, (TInt)aProcessId );
+    
+    if( aMappingType > EStoppedClients )
+        {
+        COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::SetTspTargetClient() EPlayingClients - Enumeration not in range" );
+        return;
+        }
+    
+    TTspClientMapperSynch synchObj( iMutex );
+    
+    TFixedArray< TProcessId, 10 > array;
+    TPckg< TFixedArray< TProcessId, 10 > > buf( array );
+    TFixedArray< TProcessId, 10 > array1;
+    const TProcessId processIdNull( 0 );
+    switch( aMappingType )
+        {
+        case EPlayingClients:
+            {
+            COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::SetTspTargetClient() EPlayingClients " );
+            
+            TInt err = RProperty::Get(
+                KTspClientMapperProperty,
+                KTspClientMapperKeyPlaying,
+                buf );
+            COM_TRACE_1( "Error in get play is %d ", err );
+            if( err == KErrNotFound )
+                {
+                // Hasn't been set yet so define the key
+                TInt err1 = RProperty::Define(
+                    KTspClientMapperProperty,
+                    KTspClientMapperKeyPlaying,
+                    RProperty::EByteArray,
+                    KNoCapability, 
+                    KNoCapability,
+                    RProperty::KMaxPropertySize  );
+                COM_TRACE_1( "[TspClientMapperImpl] CTspClientMapperImpl::SetTspTargetClient() Error in play define is %d ", err1 );
+                }
+            COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::SetTspTargetClient() Before append " );
+            
+            array1.Reset();
+            array1[ 0 ] = aProcessId;
+            if( err != KErrNotFound )
+                {
+                for( TInt i = 0; i != buf().Count() - 1; i++ )
+                    {
+                    if( ( aProcessId != buf().operator[]( i ) )
+                     || ( aProcessId == processIdNull ) )
+                        {
+                        array1[ i + 1 ] = buf().operator[]( i );
+                        }
+                    else
+                        {
+                        buf().operator[]( i ) = processIdNull;
+                        i--;
+                        }
+                    }
+                }
+            TPckg< TFixedArray< TProcessId, 10 > > buf1( array1 );
+            COM_TRACE_1( "Appended process id %d ", (TInt)buf1().operator[]( 0 ) );
+            err = RProperty::Set(
+                KTspClientMapperProperty,
+                KTspClientMapperKeyPlaying,
+                buf1 );
+            if( err != KErrNone )
+                {
+                COM_TRACE_1( "Error in play set is %d ", err );
+                }
+            COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::SetTspTargetClient() EPlayingClients Set " );
+            break;
+            }
+        case ERegisteredClients:
+            {
+            COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::SetTspTargetClient() ERegisteredClients " );
+            
+            TInt err = RProperty::Get(
+                KTspClientMapperProperty,
+                KTspClientMapperKeyRegistered,
+                buf );
+            if( err == KErrNotFound )
+                {
+                // Hasn't been set yet so define the key
+                err = RProperty::Define(
+                    KTspClientMapperProperty,
+                    KTspClientMapperKeyRegistered,
+                    RProperty::EByteArray,
+                    KNoCapability, 
+                    KNoCapability,
+                    RProperty::KMaxPropertySize  );
+                COM_TRACE_1( "Error in register define is %d ", err );
+                }
+            array1.Reset();
+            array1[ 0 ] = aProcessId;
+            if( err != KErrNotFound )
+                {
+                for( TInt i = 0; i != buf().Count() - 1; i++ )
+                    {
+                    if( ( aProcessId != buf().operator[]( i ) )
+                     || ( aProcessId == processIdNull ) )
+                        {
+                        array1[ i + 1 ] = buf().operator[]( i );
+                        }
+                    else
+                        {
+                        buf().operator[]( i ) = processIdNull;
+                        i--;
+                        }
+                    }
+                }
+            TPckg< TFixedArray< TProcessId, 10 > > buf1( array1 );
+            RProperty::Set(
+                KTspClientMapperProperty,
+                KTspClientMapperKeyRegistered,
+                buf1 );
+            COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::SetTspTargetClient() ERegisteredClients Set " );
+            break;
+            }
+        case EStoppedClients:
+            {
+            COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::SetTspTargetClient() EStoppedClients " );
+            TInt err = RProperty::Get(
+                KTspClientMapperProperty,
+                KTspClientMapperKeyStopped,
+                buf );
+            if( err == KErrNotFound )
+                {
+                // Hasn't been set yet so define the key
+                err = RProperty::Define(
+                    KTspClientMapperProperty,
+                    KTspClientMapperKeyStopped,
+                    RProperty::EByteArray,
+                    KNoCapability, 
+                    KNoCapability,
+                    RProperty::KMaxPropertySize  );
+                COM_TRACE_1( "Error in stop define is %d ", err );
+                }
+            array1.Reset();
+            array1[ 0 ] = aProcessId;
+            if( err != KErrNotFound )
+                {
+                for( TInt i = 0; i != buf().Count() - 1; i++ )
+                    {
+                    if( ( aProcessId != buf().operator[]( i ) )
+                     || ( aProcessId == processIdNull ) )
+                        {
+                        array1[ i + 1 ] = buf().operator[]( i );
+                        }
+                    else
+                        {
+                        buf().operator[]( i ) = processIdNull;
+                        i--;
+                        }
+                    }
+                }
+            TPckg< TFixedArray< TProcessId, 10 > > buf1( array1 );
+            RProperty::Set(
+                KTspClientMapperProperty,
+                KTspClientMapperKeyStopped,
+                buf1 );
+            COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::SetTspTargetClient() EStoppedClients Set " );
+            break;
+            }
+        default:
+            {
+            COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::SetTspTargetClient() Switch case - Default " );
+            }
+        }
+    
+    COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::SetTspTargetClient() - return" );
+	}
+	
+// -----------------------------------------------------------------------------
+// CTspClientMapperImpl::SetTspTargetClientToOtherType
+// Provides implementation of this (TSP) interface. 
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CTspClientMapperImpl::SetTspTargetClientToOtherType( 
+    TTspClientMappingType aMappingType,
+    TProcessId aProcessId )
+	{
+    COM_TRACE_2( "[TspClientMapperImpl] CTspClientMapperImpl::SetTspTargetClientToOtherType() aMappingType=%d, aProcessId=%d", aMappingType, (TInt)aProcessId );
+    TInt returnErr( KErrNone );
+    if( aMappingType > EStoppedClients )
+        {
+        returnErr = KErrNotSupported;
+        return returnErr;
+        }
+    
+    TTspClientMapperSynch synchObj( iMutex );
+    
+    TInt err = RemoveTspTargetClient( EPlayingClients, aProcessId );
+    if( err == KErrNotFound )
+        {
+        err = RemoveTspTargetClient( ERegisteredClients, aProcessId );
+        if( err == KErrNotFound )
+            {
+            err = RemoveTspTargetClient( EStoppedClients, aProcessId );
+            if( err == KErrNotFound )
+                {
+                return err;
+                }
+            }
+        }
+    
+    SetTspTargetClient( aMappingType, aProcessId );
+    
+	COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::SetTspTargetClientToOtherType() - return" );
+	return returnErr;
+	}	
+
+// -----------------------------------------------------------------------------
+// CTspClientMapperImpl::RemoveTspTargetClientL
+// Provides implementation of this (TSP) interface. 
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CTspClientMapperImpl::RemoveTspTargetClient(
+    TTspClientMappingType aMappingType,
+    TProcessId aProcessId )
+	{
+	const TProcessId processIdNull( 0 );
+	TInt returnErr( KErrNone ); 
+	COM_TRACE_2( "[TspClientMapperImpl] CTspClientMapperImpl::RemoveTspTargetClientL() aMappingType=%d, aProcessId=%d", aMappingType, (TInt)aProcessId );
+    if( aMappingType > EStoppedClients )
+        {
+        returnErr = KErrNotSupported;
+        }
+    TFixedArray< TProcessId, 10 > array;
+    array.Reset();
+    TPckg< TFixedArray< TProcessId, 10 > > buf( array );
+    TInt position( KErrNotFound );
+    
+    TTspClientMapperSynch synchObj( iMutex );
+    
+    switch( aMappingType )
+        {
+        case EPlayingClients:
+            {
+            COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::RemoveTspTargetClientL() EPlayingClients " );
+            
+            returnErr = RProperty::Get(
+                KTspClientMapperProperty,
+                KTspClientMapperKeyPlaying,
+                buf );
+            if( returnErr != KErrNotFound )
+                {
+                for( TInt aaa = 0; aaa != buf().Count(); aaa++ )
+                    {
+                    if( aProcessId == buf().operator[]( aaa ) )
+                        {
+                        position = aaa;
+                        buf().operator[]( aaa ) = processIdNull;
+                        }
+                    }
+                if( position != KErrNotFound )
+                    {
+                    returnErr = RProperty::Set(
+                        KTspClientMapperProperty,
+                        KTspClientMapperKeyPlaying,
+                        buf );
+                    }
+                else
+                    {
+                    returnErr = KErrNotFound;
+                    }
+                }
+            break;
+            }
+        case ERegisteredClients:
+            {
+            COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::RemoveTspTargetClientL() ERegisteredClients " );
+            
+            returnErr = RProperty::Get(
+                KTspClientMapperProperty,
+                KTspClientMapperKeyRegistered,
+                buf );
+            if( returnErr != KErrNotFound )
+                {
+                for( TInt aaa = 0; aaa != buf().Count(); aaa++ )
+                    {
+                    if( aProcessId == buf().operator[]( aaa ) )
+                        {
+                        position = aaa;
+                        buf().operator[]( aaa ) = processIdNull;
+                        }
+                    }
+                if( position != KErrNotFound )
+                    {
+                    returnErr = RProperty::Set(
+                        KTspClientMapperProperty,
+                        KTspClientMapperKeyRegistered,
+                        buf );
+                    }
+                else
+                    {
+                    returnErr = KErrNotFound;
+                    }
+                }
+            break;
+            }
+        case EStoppedClients:
+            {
+            
+            COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::RemoveTspTargetClientL() EStoppedClients " );
+            returnErr = RProperty::Get(
+                KTspClientMapperProperty,
+                KTspClientMapperKeyStopped,
+                buf );
+            if( returnErr != KErrNotFound )
+                {
+                for( TInt aaa = 0; aaa != buf().Count(); aaa++ )
+                    {
+                    if( aProcessId == buf().operator[]( aaa ) )
+                        {
+                        position = aaa;
+                        buf().operator[]( aaa ) = processIdNull;
+                        }
+                    }
+                if( position != KErrNotFound )
+                    {
+                    returnErr = RProperty::Set(
+                        KTspClientMapperProperty,
+                        KTspClientMapperKeyStopped,
+                        buf );
+                    }
+                else
+                    {
+                    returnErr = KErrNotFound;
+                    }
+                }
+            break;
+            }
+        default:
+            {
+            
+            COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::RemoveTspTargetClientL() Default - LEAVE " );
+            returnErr = KErrGeneral;
+            }
+        }
+	COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::RemoveTspTargetClientL() - return" );
+	return returnErr;
+	}
+	
+// -----------------------------------------------------------------------------
+// CTspClientMapperImpl::GetTspTargetClientsL
+// Provides implementation of this (TSP) interface. 
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CTspClientMapperImpl::GetTspTargetClients( 
+    TTspClientMappingType aMappingType,
+    RArray< TProcessId >& aPidArray )
+	{
+	TInt returnErr( KErrNone );
+	if( aMappingType > EStoppedClients )
+        {
+        returnErr = KErrNotSupported;
+        }
+    TFixedArray< TProcessId, 10 > array;
+    TPckg< TFixedArray< TProcessId, 10 > > buf( array );
+    COM_TRACE_1( "[TspClientMapperImpl] CTspClientMapperImpl::GetTspTargetClientsL() aMappingType = %d", aMappingType );
+	TInt count( 0 );
+    
+	TTspClientMapperSynch synchObj( iMutex );
+	
+    if( aMappingType == EPlayingClients )
+        {
+        COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::GetTspTargetClientsL() - Getting playing clients" );
+        returnErr = RProperty::Get(
+            KTspClientMapperProperty,
+            KTspClientMapperKeyPlaying,
+            buf );
+        COM_TRACE_1( "[TspClientMapperImpl] CTspClientMapperImpl::GetTspTargetClientsL() playing clients count = %d", buf().Count() );
+        count = buf().Count();
+        }
+   if( aMappingType == ERegisteredClients )
+        {
+        COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::GetTspTargetClientsL() - Getting registered clients" );
+        returnErr = RProperty::Get(
+            KTspClientMapperProperty,
+            KTspClientMapperKeyRegistered,
+            buf );
+        COM_TRACE_1( "[TspClientMapperImpl] CTspClientMapperImpl::GetTspTargetClientsL() registered clients count = %d", buf().Count() );
+        count = buf().Count();
+        }
+    if( aMappingType == EStoppedClients )
+        {
+        COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::GetTspTargetClientsL() - Getting stopped clients" );
+        returnErr = RProperty::Get(
+            KTspClientMapperProperty,
+            KTspClientMapperKeyStopped,
+            buf );
+        COM_TRACE_1( "[TspClientMapperImpl] CTspClientMapperImpl::GetTspTargetClientsL() stopped clients count = %d", buf().Count() );
+        count = buf().Count();
+        }
+        
+    for ( TInt i = 0; i < count; i++ )
+        {
+        if ( (TInt)buf().operator[]( i ) != 0 ) // count of registered clients is lost with TFixedArray, so rely on id being different from 0
+            {
+            COM_TRACE_1( "[TspClientMapperImpl] CTspClientMapperImpl::GetTspTargetClientsL() first client's Pid = %d", (TInt)buf().operator[]( i ) );
+            aPidArray.Append( buf().operator[]( i ) );
+            }
+        }
+	COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::GetTspTargetClientsL() - return" );
+	return returnErr;
+	
+	}
+
+// -----------------------------------------------------------------------------
+// CTspClientMapperImpl::OpenMutexL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CTspClientMapperImpl::OpenMutexL()
+    {
+    COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::InitilizeMutexL()" );
+    
+    TInt err( iMutex.CreateGlobal( KTspClientMapperSynch ) );
+    
+    if ( err != KErrNone )
+        {
+        if ( err == KErrAlreadyExists )
+            {
+            err = iMutex.OpenGlobal( KTspClientMapperSynch );
+            
+            if ( err != KErrNone )
+                {
+                COM_TRACE_1( "[TspClientMapperImpl] CTspClientMapperImpl::InitilizeMutexL(): OpenGlobal err=%d", err );
+                User::Leave( err );
+                }
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CTspClientMapperImpl::CloseMutex
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CTspClientMapperImpl::CloseMutex()
+    {
+    COM_TRACE_( "[TspClientMapperImpl] CTspClientMapperImpl::CloseMutexL()" );
+    
+    if ( iMutex.IsHeld() )
+            {
+            iMutex.Signal();
+            }
+    iMutex.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// TTspClientMapperSynch::TTspClientMapperSynch
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CTspClientMapperImpl::TTspClientMapperSynch::TTspClientMapperSynch( RMutex& aMutex ) : iMutex( aMutex )
+    {
+    COM_TRACE_( "[TspClientMapperImpl] TTspClientMapperSynch::TTspClientMapperSynch()" );
+    iMutex.Wait();
+    }
+// -----------------------------------------------------------------------------
+// TTspClientMapperSynch::TTspClientMapperSynch
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CTspClientMapperImpl::TTspClientMapperSynch::~TTspClientMapperSynch()
+    {
+    COM_TRACE_( "[TspClientMapperImpl] TTspClientMapperSynch::~TTspClientMapperSynch()" );
+    iMutex.Signal();
+    }
+
+// End of file