accessoryservices/accessoryserver/src/PolicyDB/AccPolicyDB.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/accessoryservices/accessoryserver/src/PolicyDB/AccPolicyDB.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,521 @@
+/*
+* Copyright (c) 2002-2008 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 class implements the Accessory Policy DB interface.
+*
+*/
+
+
+// INCLUDE FILES
+#include "AccPolicyDB.h"
+#include "AccPolicyDBNames.h"
+#include "AccPolCapabilityStorage.h"
+#include "acc_debug.h"
+#include <AccPolSubblockNameArray.h>
+#include <AccPolCommonNameValuePairs.h>
+#include <AccPolGIDHeader.h>
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+_LIT( KSQLSelect, "SELECT " );
+_LIT( KSQLFrom, " FROM " );
+_LIT( KSQLAsterisk, " * " );
+_LIT( KSQLWhere, " WHERE " );
+_LIT( KSQLEquals, " = ");
+_LIT( KSQLAnd, " AND ");
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAccPolicyDB::CAccPolicyDB
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CAccPolicyDB::CAccPolicyDB()
+    {
+
+    }
+
+// -----------------------------------------------------------------------------
+// CAccPolicyDB::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CAccPolicyDB::ConstructL()
+    {
+    COM_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::ConstructL()" );
+
+    User::LeaveIfError( iFsSession.Connect() );
+
+    COM_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::ConstructL() return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccPolicyDB::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAccPolicyDB* CAccPolicyDB::NewL()
+    {
+    API_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::NewL()" );
+
+    CAccPolicyDB* self = new( ELeave ) CAccPolicyDB;
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    API_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::NewL() return" );
+    return self;
+    }
+
+// Destructor
+EXPORT_C CAccPolicyDB::~CAccPolicyDB()
+    {
+    API_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::~CAccPolicyDB()" );
+
+    iView.Close();
+    CloseDB();
+    iFsSession.Close();
+
+    API_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::~CAccPolicyDB() return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccPolicyDB::OpenDBL
+// Opens the database
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAccPolicyDB::OpenDBL()
+    {
+    API_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::OpenDBL()" );
+    
+    TInt       err( KErrNone );
+    TFileName  romFullPath;
+    TDriveName zDrive = TDriveUnit( EDriveZ ).Name();
+    romFullPath.Append( zDrive );
+    romFullPath.Append( KDBPath );
+
+    err = iDb.Open(iFsSession, romFullPath, KAccDbSecureFormat(), RDbNamedDatabase::EReadOnly );
+
+    COM_TRACE_1( "[ACCPOLICYDB] CAccPolicyDB::OpenDBL - Open DB: %d", err);
+
+    User::LeaveIfError( err );
+
+    API_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::OpenDBL - return void" );    
+    }
+
+// -----------------------------------------------------------------------------
+// CAccPolicyDB::CloseDB
+// Closes the database connection
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAccPolicyDB::CloseDB()
+    {
+    API_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::CloseDB()" );
+
+    iDb.Close();
+
+    API_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::CloseDB() return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccPolicyDB::FindGIDIntL
+// Search if DeviceID has a GIDInteger defined in DB
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAccPolicyDB::FindGIDIntL(
+    const TUint64& aDeviceID,
+    TDes8& aGIDInt )
+    {
+    API_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::FindGIDIntL()" );
+
+    TInt res( 0 );
+
+    iSQL = KSQLSelect;
+    iSQL.Append( KACCDBGIDIntGIDCol );
+    iSQL.Append( KSQLFrom );
+    iSQL.Append( KACCDBGIDIntTable );
+    iSQL.Append( KSQLWhere );
+    iSQL.Append( KACCDBGIDIntDeviceIDCol );
+    iSQL.Append( KSQLEquals );
+    iSQL.AppendNum( aDeviceID );
+   
+
+    iView.Close();
+
+    iView.Prepare( iDb, TDbQuery( iSQL ) );
+    if ( iView.Unevaluated() )
+        {
+        iView.EvaluateAll();
+        }
+
+#ifdef _DEBUG
+
+    TRAPD( firstLErr, res = iView.FirstL() )
+    COM_TRACE_1( "[ACCPOLICYDB] CAccPolicyDB::FindGIDIntL firstLErr: %d", firstLErr );
+    User::LeaveIfError( firstLErr );
+
+#else
+
+    res = iView.FirstL();
+
+#endif // _DEBUG
+
+    if ( res ) // Check if found a hit
+        {
+        COM_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::FindGIDIntL() A GIDInt for this Device ID was found" );
+        RDbColReadStream in;
+        CDbColSet* colSet = iView.ColSetL();
+        CleanupStack::PushL( colSet );
+        TDbColNo col = colSet->ColNo( KACCDBGIDIntGIDCol );
+        iView.GetL();
+        in.OpenL( iView, col );
+        in.PushL();
+        in.ReadL( aGIDInt, iView.ColLength( col ) );
+        in.Pop();
+        in.Close();
+        CleanupStack::PopAndDestroy( colSet );
+        }
+
+    iView.Reset();
+    iView.Close();
+
+    API_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::FindGIDIntL() return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccPolicyDB::FindGIDIntL
+// Search if DeviceID has a GIDInteger defined in DB
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAccPolicyDB::FindGIDIntL(
+    const TUint64& aDeviceID,
+    TDes8& aGIDInt,
+    TAccGIDtype aType )
+    {
+    API_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::FindGIDIntL()" );
+
+    TInt res( 0 );
+
+    iSQL = KSQLSelect;
+    iSQL.Append( KACCDBGIDIntGIDCol );
+    iSQL.Append( KSQLFrom );
+    iSQL.Append( KACCDBGIDIntTable );
+    iSQL.Append( KSQLWhere );
+    iSQL.Append( KACCDBGIDIntDeviceIDCol );
+    iSQL.Append( KSQLEquals );
+    iSQL.AppendNum( aDeviceID );
+    iSQL.Append( KSQLAnd );
+    iSQL.Append( KACCDBGIDIntKeyIDCol );
+    iSQL.Append( KSQLEquals );
+    iSQL.AppendNum( aType );
+
+    iView.Close();
+
+    iView.Prepare( iDb, TDbQuery( iSQL ) );
+    if ( iView.Unevaluated() )
+        {
+        iView.EvaluateAll();
+        }
+
+#ifdef _DEBUG
+
+    TRAPD( firstLErr, res = iView.FirstL() )
+    COM_TRACE_1( "[ACCPOLICYDB] CAccPolicyDB::FindGIDIntL firstLErr: %d", firstLErr );
+    User::LeaveIfError( firstLErr );
+
+#else
+
+    res = iView.FirstL();
+
+#endif // _DEBUG
+
+    if ( res ) // Check if found a hit
+        {
+        COM_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::FindGIDIntL() A GIDInt for this Device ID was found" );
+        RDbColReadStream in;
+        CDbColSet* colSet = iView.ColSetL();
+        CleanupStack::PushL( colSet );
+        TDbColNo col = colSet->ColNo( KACCDBGIDIntGIDCol );
+        iView.GetL();
+        in.OpenL( iView, col );
+        in.PushL();
+        in.ReadL( aGIDInt, iView.ColLength( col ) );
+        in.Pop();
+        in.Close();
+        CleanupStack::PopAndDestroy( colSet );
+        }
+
+    iView.Reset();
+    iView.Close();
+
+    API_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::FindGIDIntL() return void" );
+    }    
+
+// -----------------------------------------------------------------------------
+// CAccPolicyDB::ReadAllCriticalCapabilitiesL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CAccPolicyDB::ReadAllCriticalCapabilitiesL()
+    {
+    API_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::ReadAllCriticalCapabilitiesL()" );
+    
+    iSQL = KSQLSelect;
+    iSQL.Append( KSQLAsterisk );
+    iSQL.Append( KSQLFrom );
+    iSQL.Append( KACCDBCapRulesTable );
+    
+    iView.Close();
+    iView.Prepare( iDb, TDbQuery( iSQL ) );
+    
+    if ( iView.Unevaluated() )
+        {
+        iView.EvaluateAll();
+        }
+
+	API_TRACE_1( "[ACCPOLICYDB] CAccPolicyDB::ReadAllCriticalCapabilitiesL - return %d ", iView.CountL() );        
+
+	return iView.CountL();
+    }
+
+// -----------------------------------------------------------------------------
+// CAccPolicyDB::GetNextCriticalCapabilityL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAccPolicyDB::GetNextCriticalCapabilityL( 
+    TUint32& aName, 
+    TInt32& aValue )
+    {    
+    API_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::GetNextCriticalCapabilityL()" );
+    TBuf8<KSBMaxValueLength> bufValue;
+    
+    if ( iView.NextL() ) // Check if found a hit
+        {  
+        RDbColReadStream in;
+        CDbColSet* colSet = iView.ColSetL();
+        CleanupStack::PushL( colSet );
+                
+        TDbColNo col = colSet->ColNo( KACCDBCapRulesName );
+        iView.GetL();
+        in.OpenL( iView, col );
+        in.PushL();
+        aName = in.ReadUint32L();
+        in.Pop();
+        in.Close();
+        
+        col = colSet->ColNo( KACCDBCapRulesValue );       
+        iView.GetL();
+        in.OpenL( iView, col );
+        in.PushL();        
+        in.ReadL( bufValue, iView.ColLength( col ) );        
+        TLex8 lex( bufValue);
+        User::LeaveIfError( lex.Val( aValue ) );        
+        in.Pop();
+        in.Close();
+        
+        CleanupStack::PopAndDestroy( colSet );        
+        }
+     else
+     	{
+    	iView.Reset();
+    	iView.Close(); 	
+     	}
+
+    API_TRACE_2( "[ACCPOLICYDB] CAccPolicyDB::GetNextCriticalCapabilityL - name=0x%x value=%d - return void", aName, aValue );
+    }
+
+// -----------------------------------------------------------------------------
+// CAccPolicyDB::
+// 
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CAccPolicyDB::FilterGIDByTypeL(
+    TAccGIDtype aType)
+    {
+
+	API_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::FilterGIDByType()" );
+    
+    iSQL = KSQLSelect;
+    iSQL.Append( KSQLAsterisk );
+    iSQL.Append( KSQLFrom );
+    iSQL.Append( KACCDBGIDIntTable );
+    iSQL.Append( KSQLWhere );
+    iSQL.Append( KACCDBGIDIntKeyIDCol );
+    iSQL.Append( KSQLEquals );
+    iSQL.AppendNum( aType );
+
+    iView.Close();
+
+    iView.Prepare( iDb, TDbQuery( iSQL ) );
+    if ( iView.Unevaluated() )
+        {
+        iView.EvaluateAll();
+        }
+
+	API_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::FilterGIDByType() return " );        
+
+	return iView.CountL();
+    }
+
+// -----------------------------------------------------------------------------
+// CAccPolicyDB::
+// 
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAccPolicyDB::GetNextGIDL(
+    TUint64& aHWDeviceID,
+    TDes8& aGIDInt )
+    {
+
+	API_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::GetNextGID()" );
+    
+    if ( iView.NextL() ) // Check if found a hit
+        {      
+        
+        RDbColReadStream in;
+        CDbColSet* colSet = iView.ColSetL();
+        CleanupStack::PushL( colSet );
+                
+        TDbColNo col = colSet->ColNo( KACCDBGIDIntDeviceIDCol );
+        iView.GetL();
+        in.OpenL( iView, col );
+        in.PushL();
+        aHWDeviceID = in.ReadInt32L();
+        in.Pop();
+        in.Close();
+        
+        col = colSet->ColNo( KACCDBGIDIntGIDCol );       
+        iView.GetL();
+        in.OpenL( iView, col );
+        in.PushL();
+        in.ReadL( aGIDInt, iView.ColLength( col ) );
+        in.Pop();
+        in.Close();
+        
+        CleanupStack::PopAndDestroy( colSet );        
+        }
+     else
+     	{
+    	iView.Reset();
+    	iView.Close(); 	
+     	}
+
+    API_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::GetNextGID() return void" );
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CAccPolicyDB::
+// 
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAccPolicyDB::GetSelectionsL(
+    TUint32 ruleIndex,
+    TUint32& aSelectionListBitMask,
+    TBool aGetAllDeviceTypes )
+    {
+
+    API_TRACE_2( "[ACCPOLICYDB] CAccPolicyDB::GetSelectionsL(rule index=%d GetAll=%d)", ruleIndex, aGetAllDeviceTypes );
+    
+    iSQL = KSQLSelect;
+    
+    if( !aGetAllDeviceTypes )
+        {        
+        iSQL.Append( KSQLAsterisk );
+        iSQL.Append( KSQLFrom );
+        iSQL.Append( KACCDBSelectionTable );
+        iSQL.Append( KSQLWhere );
+        iSQL.Append( KACCDBSelectionIndex );
+        iSQL.Append( KSQLEquals );
+        iSQL.AppendNum( ruleIndex );
+        }
+    else
+        {        
+        iSQL.Append( KSQLAsterisk );
+        iSQL.Append( KSQLFrom );
+        iSQL.Append( KACCDBSelectionTable );
+        }
+    
+    iView.Close();
+
+    iView.Prepare( iDb, TDbQuery( iSQL ) );
+    if ( iView.Unevaluated() )
+        {
+        iView.EvaluateAll();
+        }
+
+	if ( iView.FirstL() ) // Check if found a hit
+        {
+
+        RDbColReadStream in;
+
+        CDbColSet* colSet = iView.ColSetL();
+        CleanupStack::PushL( colSet );
+        TDbColNo col = colSet->ColNo( KACCDBCapSelectionValue ); // Ordinal position of value column
+        while( !iView.AtEnd() )
+            {
+			TUint32 value;
+
+            iView.GetL();
+            in.OpenL( iView, col );
+            in.PushL();
+            value = in.ReadUint32L();
+            in.Pop();
+            in.Close();
+            iView.NextL();
+
+			User::LeaveIfError( value );
+			            
+            aSelectionListBitMask = aSelectionListBitMask | value;
+            
+            }
+        CleanupStack::PopAndDestroy( colSet );
+        COM_TRACE_1( "[ACCPOLICYDB] CAccPolicyDB::GetSelectionsL() - selection list = 0b%b", aSelectionListBitMask );
+        }
+    else
+        {
+        COM_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::GetSelectionsL() - No values(s) specified for this rule" );
+        }
+
+    iView.Reset();
+    iView.Close();
+
+    API_TRACE_( "[ACCPOLICYDB] CAccPolicyDB::GetSelectionsL() - return" );    
+    
+    }
+			    
+//  End of File