hwrmhaptics/hapticspluginmanager/src/hwrmhapticsuid.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hwrmhaptics/hapticspluginmanager/src/hwrmhapticsuid.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,257 @@
+/*
+* Copyright (c) 2008-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:  Haptics uid implementation.
+*
+*/
+
+
+#include <s32file.h>
+#include <f32file.h>
+#include <pathinfo.h>
+#include "hwrmhapticsuid.h"
+#include "hwrmhapticstrace.h"
+
+//drive char and colon string length, e.g. "c:"
+const TInt KDriveAndColon = 2; 
+
+// Maximum uid file line length
+const TInt KMaxLineLength( 100 );
+
+// New line character used to terminate each line in uid file
+const TInt KNewLine( '\n' );
+
+
+// format specifier used to match valid UIDs
+_LIT8( KMatchUid, "0x????????" );
+
+// format specifier used to match valid enabled sign
+_LIT8( KMatchPlusSign, "+" );
+
+// valid vendor id definition
+_LIT8( KVid, "VID" );
+
+// valid secure id definition
+_LIT8( KSid, "SID" );
+
+
+
+// ---------------------------------------------------------------------------
+// C++ constructor
+// ---------------------------------------------------------------------------
+//
+TUidItem::TUidItem( const TDesC8& aUidType, TUid aUid, TBool aAllowed )
+            : iUidType( aUidType ), iUid( aUid ), iAllowed( aAllowed )
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CHWRMHapticsUid* CHWRMHapticsUid::NewL( const TDesC& aFilename )
+    {
+    CHWRMHapticsUid* self = NewLC( aFilename );
+    CleanupStack::Pop( self );
+    
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor. Leaves instance on the cleanup stack.
+// ---------------------------------------------------------------------------
+//
+CHWRMHapticsUid* CHWRMHapticsUid::NewLC( const TDesC& aFilename )
+    {
+    CHWRMHapticsUid* self = new( ELeave ) CHWRMHapticsUid();
+    
+    CleanupStack::PushL( self );
+    self->ConstructL( aFilename );
+    
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CHWRMHapticsUid::~CHWRMHapticsUid()
+    {
+    // Delete all the array objects
+    iUidArray.Close();
+    }
+
+
+// ---------------------------------------------------------------------------
+// C++ constructor
+// ---------------------------------------------------------------------------
+//
+CHWRMHapticsUid::CHWRMHapticsUid()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// By default Symbian 2nd phase constructor is private.
+// ---------------------------------------------------------------------------
+//
+void CHWRMHapticsUid::ConstructL( const TDesC& aFilename )
+    {
+    RFs fs;
+    User::LeaveIfError( fs.Connect() );
+    CleanupClosePushL( fs );
+    
+    // Buffer to store the full path and filename
+    TFileName filename;
+    
+    // Get private file path
+    User::LeaveIfError( fs.PrivatePath( filename ) );
+
+    // add the filename to path
+    filename.Insert( 0, PathInfo::RomRootPath().Left( KDriveAndColon ) );
+    filename.Append( aFilename );
+    
+    // Parse the file and construct the array of UIDs
+    ParseUidFileL( fs, filename );
+
+    CleanupStack::PopAndDestroy( &fs );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Checks if automated license setting is allowed for VID/SID combination
+// found from aMessage. If definition for SID is found then VID checking
+// is omitted.
+// ---------------------------------------------------------------------------
+//
+TBool CHWRMHapticsUid::LicenseAutoSetAllowed( const RMessage2& aMessage )
+    {
+    TUid sid = aMessage.SecureId();
+    TUid vid = aMessage.VendorId();
+    TBool allowed = EFalse;
+    TBool sidFound = EFalse;
+
+    for ( TInt n=0; n < iUidArray.Count(); n++ )
+        {
+        if ( iUidArray[n].iUidType == KSid &&
+             sid == iUidArray[n].iUid )
+            {
+            allowed = iUidArray[n].iAllowed;
+            sidFound = ETrue;
+            }
+
+        if ( !sidFound && 
+             iUidArray[n].iUidType == KVid &&
+             vid == iUidArray[n].iUid )
+            {
+            allowed = iUidArray[n].iAllowed;
+            }
+        }
+
+    return allowed;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Method constructs the array of UIDs from the given file.
+// A valid line in the file contains only UID
+// ---------------------------------------------------------------------------
+//
+void CHWRMHapticsUid::ParseUidFileL( RFs& aFs, 
+                                     const TDesC& aFilename )
+    {
+    TLex8 lex;
+    TPtrC8 sign;
+    TPtrC8 uidType;
+    TPtrC8 id;
+    TUid uid;
+    TInt err( KErrNone );
+    
+    // Buffer to read each line of the file into
+    TBuf8<KMaxLineLength> fileline;
+    TChar newLine( KNewLine );  
+    RFileReadStream stream;    
+    
+    COMPONENT_TRACE( ( _L( "CHWRMHapticsUid::ParseUidFileL - Opening UID 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( "CHWRMHapticsUid::ParseUidFileL - UID 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 );
+            sign.Set( lex.NextToken() );            
+            uidType.Set( lex. NextToken() );
+            id.Set( lex.NextToken() );
+            TBool allowed = EFalse;
+            if( sign.Match( KMatchPlusSign ) == 0 )
+                {
+                allowed = ETrue;
+                }
+            if( id.Match( KMatchUid ) == 0 )
+                {
+                // convert it
+                if( ConvertId( id, uid ) != KErrCorrupt )
+                    {
+                    // add UID to array
+                    iUidArray.AppendL( TUidItem( uidType, uid, allowed ) );
+                    }
+                }
+            }
+
+        // Close stream
+        CleanupStack::PopAndDestroy( &stream );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// Helper method to convert and validate UID from a descriptor
+// ---------------------------------------------------------------------------
+//
+TInt CHWRMHapticsUid::ConvertId( const TDesC8& aUidDes, 
+                                    TUid& aUid ) const
+    {
+    TInt ret( KErrNone );
+    TUint32 id;
+
+    // this is a matching id
+    TLex8 lex( aUidDes.Right( 8 ) );
+    
+    if( lex.Val( id, EHex ) != KErrNone )
+        {
+        // Failed to convert to int
+        ret = KErrCorrupt;
+        }
+    else
+        {
+        // conversion ok so set the uid
+        aUid.iUid = id;
+        }
+
+    return ret;
+    }
+
+
+// End of File