diff -r 000000000000 -r 4e1aa6a622a0 hwrmhaptics/hapticspluginmanager/src/hwrmhapticspolicy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hwrmhaptics/hapticspluginmanager/src/hwrmhapticspolicy.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,445 @@ +/* +* 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: Haptics policy implementation. +* +*/ + + +#include +#include +#include // min and max device priority values +#include + +#include "hwrmhapticspolicy.h" +#include "hwrmhapticstrace.h" + +// Internal policy filename prefix +_LIT( KInternalPolicyPrefix, "internal" ); + +//drive char and colon string length, e.g. "c:" +const TInt KDriveAndColon = 2; + +// Maximum policy file line length +const TInt KMaxLineLength( 100 ); + +// New line character used to terminate each line in policy file +const TInt KNewLine( '\n' ); + +// format specifier used to check for feedback clients +_LIT8( KFeedback, "FEEDBACK" ); + +// format specifier used to match valid UIDs or SIDs +_LIT8( KMatchUid, "0x????????" ); + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CHWRMHapticsPolicy* CHWRMHapticsPolicy::NewL( const TDesC& aFilename ) + { + CHWRMHapticsPolicy* self = NewLC( aFilename ); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------------------------- +// Two-phased constructor. Leaves instance on the cleanup stack. +// --------------------------------------------------------------------------- +// +CHWRMHapticsPolicy* CHWRMHapticsPolicy::NewLC( const TDesC& aFilename ) + { + CHWRMHapticsPolicy* self = new( ELeave ) CHWRMHapticsPolicy(); + + CleanupStack::PushL( self ); + self->ConstructL( aFilename ); + + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CHWRMHapticsPolicy::~CHWRMHapticsPolicy() + { + // Delete all the array objects + iClientArray.ResetAndDestroy(); + iClientArray.Close(); + } + +// --------------------------------------------------------------------------- +// Method to retrieve the priority of a client with the given ID and if +// it is trusted or not. +// --------------------------------------------------------------------------- +// +void CHWRMHapticsPolicy::GetPriority( const TSecureId aSid, + TBool& aTrusted, + TInt& aPriority ) const + { + TInt ret( KErrNotFound ); + + // by default not found, i.e. not trusted + aTrusted = EFalse; + + // find the client + TInt pos = FindClient( aSid ); + + if( pos != KErrNotFound ) + { + // if client exists return the priority + ret = iClientArray[pos]->Priority(); + aTrusted = ETrue; + } + + aPriority = ret; + } + +// --------------------------------------------------------------------------- +// C++ constructor +// --------------------------------------------------------------------------- +// +CHWRMHapticsPolicy::CHWRMHapticsPolicy() + { + } + +// --------------------------------------------------------------------------- +// By default Symbian 2nd phase constructor is private. +// --------------------------------------------------------------------------- +// +void CHWRMHapticsPolicy::ConstructL( const TDesC& aFilename ) + { + RFs fs; + User::LeaveIfError( fs.Connect() ); + CleanupClosePushL( fs ); + + // Buffer to store the full path and filename + TFileName filename; + TFileName internalFilename; + + // Get private file path + User::LeaveIfError( fs.PrivatePath( filename ) ); + + // add the filename to path + internalFilename.Append( PathInfo::RomRootPath().Left( KDriveAndColon ) ); + internalFilename.Append( filename ); // private-folder of haptics server + internalFilename.Append( KInternalPolicyPrefix ); // "Internal" -prefix + internalFilename.Append( aFilename ); // actual filename + filename.Insert( 0, PathInfo::RomRootPath().Left( KDriveAndColon ) ); + filename.Append( aFilename ); + + // Parse the file and construct the array of policy clients + // Add product specific file first if they need to change priorieties of + // S60 defined processes. + ParsePriorityFileL( fs, filename ); + ParsePriorityFileL( fs, internalFilename ); + + CleanupStack::PopAndDestroy( &fs ); + } + +// --------------------------------------------------------------------------- +// Method constructs the array of policy clients from the +// given file +// A valid line in the file contains priority, id and app name +// priority must be a valid integer from KLowestPriority to KHighestPriority. +// id must be a valid SID or ALL indicating the priority for all clients +// not specified in the file. +// app name can be any string indicating the name of the client. +// --------------------------------------------------------------------------- +// +void CHWRMHapticsPolicy::ParsePriorityFileL( RFs& aFs, + const TDesC& aFilename ) + { + TLex8 lex; + TInt priority; + TPtrC8 id; + TSecureId sid; + TPtrC8 feedback; + TBool feedbackClient; + TPtrC8 appname( KNullDesC8 ); + TInt err( KErrNone ); + + // Buffer to read each line of the file into + TBuf8 fileline; + TChar newLine( KNewLine ); + RFileReadStream stream; + + COMPONENT_TRACE( ( _L( "CHWRMHapticsPolicy::ParsePriorityFileL - Opening policy file: %S" ), &aFilename ) ); + + // Open the file and attach to stream + err = stream.Open( aFs, aFilename, EFileRead ); + + // Return without error if file is not found + if ( err != KErrNone ) + { + COMPONENT_TRACE( ( _L( "CHWRMHapticsPolicy::ParsePriorityFileL - Policy file open failed: %S, error: %d" ), &aFilename, err ) ); + } + else + { + CleanupClosePushL( stream ); + + while( err != KErrEof ) + { + // read from the file upto the newline character + TRAP( err, stream.ReadL( fileline, newLine ) ); + + lex.Assign( fileline ); + if( lex.Val( priority ) == KErrNone ) + { + // got the priority now validate it + if( priority >= KHWRMHapticsMinDevicePriority && + priority <= KHWRMHapticsMaxDevicePriority ) + { + // get the id + id.Set( lex.NextToken() ); + + // convert it + if( ConvertId( id, sid ) != KErrCorrupt ) + { + feedbackClient = EFalse; + + // check whether feedback client (may be empty) + feedback.Set( lex.NextToken() ); + if( feedback.MatchF( KFeedback ) == 0 ) + { + feedbackClient = ETrue; + } + + // now get the appname (may be empty) + appname.Set( lex.NextToken() ); + + // if last token was empty and previous not, but it was + // not feedback token, then it must be appname + if( appname.Size() == 0 && + ( feedback.Size() != 0 && !feedbackClient ) ) + { + appname.Set( feedback ); + } + + // Create the policy + AddPolicyClientL( priority, sid, + feedbackClient, appname ); + } + } + } + } + + // Close stream + CleanupStack::PopAndDestroy( &stream ); + } + } + +// --------------------------------------------------------------------------- +// Helper method to convert and validate SID from a descriptor +// --------------------------------------------------------------------------- +// +TInt CHWRMHapticsPolicy::ConvertId( const TDesC8& aSidDes, + TSecureId& aSid ) const + { + TInt ret( KErrNone ); + TUint32 id; + + if( aSidDes.Match( KMatchUid ) == 0 ) + { + // this is a matching id + TLex8 lex( aSidDes.Right( 8 ) ); + + if( lex.Val( id, EHex ) != KErrNone ) + { + // Failed to convert to int + ret = KErrCorrupt; + } + else + { + // conversion ok so set the sid + aSid.iId = id; + } + } + else + { + ret = KErrCorrupt; + } + + return ret; + } + +// --------------------------------------------------------------------------- +// Adds a policy client to the array, first checks that no other +// client has been registered with the identical sid. +// If one already exists KErrAlreadyExists is returned. +// --------------------------------------------------------------------------- +// +TInt CHWRMHapticsPolicy::AddPolicyClientL( const TInt aPriority, + const TSecureId& aSid, + const TBool aFeedbackClient, + const TDesC8& aAppName ) + { + TInt ret( KErrNone ); + + // search for existing client + if( FindClient( aSid ) == KErrNotFound ) + { + // does not already exist so create and add to the array + COMPONENT_TRACE( ( _L( "CHWRMHapticsPolicy::AddPolicyClientL - adding client with sid=0x%x" ), aSid.iId ) ); + + // create new client to be added to the array and put on cleanup stack + CPolicyClient* ptrClient = CPolicyClient::NewLC( aPriority, aSid, + aFeedbackClient, + aAppName ); + + // append the new client to the array + iClientArray.AppendL( ptrClient ); + + // array now owns the new client so pop it off the cleanup stack + CleanupStack::Pop( ptrClient ); + } + else + { + // client already exists so return KErrAlreadyExists + COMPONENT_TRACE( ( _L( "CHWRMHapticsPolicy::AddPolicyClientL - client already exists with sid=0x%x" ), aSid.iId ) ); + ret = KErrAlreadyExists; + } + + return ret; + } + +// --------------------------------------------------------------------------- +// Searches for client with the given sid. +// --------------------------------------------------------------------------- +// +TInt CHWRMHapticsPolicy::FindClient( const TSecureId& aSid ) const + { + TInt index = KErrNotFound; + + for( TInt i = 0; i < iClientArray.Count() && index == KErrNotFound; i++ ) + { + if( aSid == iClientArray[i]->Sid() ) + { + COMPONENT_TRACE( ( _L( "CHWRMHapticsPolicy::FindClient - client found with sid=0x%x" ), aSid.iId ) ); + index = i; + } + } + + return index; + } + +// ====================== Embedded CPolicyClient class ======================= + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CHWRMHapticsPolicy::CPolicyClient* +CHWRMHapticsPolicy::CPolicyClient::NewL( const TInt aPriority, + const TSecureId& aSid, + const TBool aFeedbackClient, + const TDesC8& aAppName ) + { + CHWRMHapticsPolicy::CPolicyClient* self = NewLC( aPriority, aSid, + aFeedbackClient, + aAppName ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Two-phased constructor. Leaves instance on the cleanup stack. +// --------------------------------------------------------------------------- +// +CHWRMHapticsPolicy::CPolicyClient* +CHWRMHapticsPolicy::CPolicyClient::NewLC( const TInt aPriority, + const TSecureId& aSid, + const TBool aFeedbackClient, + const TDesC8& aAppName) + { + CHWRMHapticsPolicy::CPolicyClient* self = + new( ELeave ) CHWRMHapticsPolicy::CPolicyClient( aPriority, aSid, + aFeedbackClient ); + + CleanupStack::PushL( self ); + self->ConstructL( aAppName ); + + return self; + } + +// --------------------------------------------------------------------------- +// Destructor. +// --------------------------------------------------------------------------- +// +CHWRMHapticsPolicy::CPolicyClient::~CPolicyClient() + { + delete iAppName; + } + +// --------------------------------------------------------------------------- +// Returns the clients priority. +// --------------------------------------------------------------------------- +// +TInt CHWRMHapticsPolicy::CPolicyClient::Priority() const + { + return iPriority; + } + +// --------------------------------------------------------------------------- +// Returns the clients ID. +// --------------------------------------------------------------------------- +// +TSecureId CHWRMHapticsPolicy::CPolicyClient::Sid() const + { + return iSid; + } + +// --------------------------------------------------------------------------- +// Returns ETrue if feedback client. +// --------------------------------------------------------------------------- +// +TBool CHWRMHapticsPolicy::CPolicyClient::FeedbackClient() const + { + return iFeedbackClient; + } + +// --------------------------------------------------------------------------- +// Returns the client application name. +// --------------------------------------------------------------------------- +// +const TDesC& CHWRMHapticsPolicy::CPolicyClient::AppName() const + { + return *iAppName; + } + +// --------------------------------------------------------------------------- +// C++ constructor. +// --------------------------------------------------------------------------- +// +CHWRMHapticsPolicy::CPolicyClient::CPolicyClient( TInt aPriority, + const TSecureId& aSid, + const TBool aFeedbackClient) + : iPriority( aPriority ), iSid( aSid ), iFeedbackClient( aFeedbackClient ) + { + } + +// --------------------------------------------------------------------------- +// By default Symbian 2nd phase constructor is private. +// --------------------------------------------------------------------------- +// +void CHWRMHapticsPolicy::CPolicyClient::ConstructL( const TDesC8& aAppName ) + { + // create the descriptor for the appname + iAppName = HBufC::NewL( aAppName.Length() ); + + // and copy the 8 bit descriptor into it + iAppName->Des().Copy( aAppName ); + } + +// End of File