--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/remotelock/RemotelockSettings/Src/RemoteLockSettings.cpp Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,403 @@
+/*
+* Copyright (c) 2006 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 RemoteLock Settings API
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <RemoteLockSettings.h>
+#include <hash.h>
+#include <centralrepository.h>
+#include "RemoteLockPrivateCRKeys.h"
+#include "RemoteLockTrace.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+_LIT( KRLockLeadingHexZero, "0" );
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+// -----------------------------------------------------------------------------
+// CRemoteLockSettings::NewL
+// Two-Phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CRemoteLockSettings* CRemoteLockSettings::NewL(
+ MRemoteLockSettingsHandler* aHandler )
+ {
+ RL_TRACE_PRINT(" [ rlsetting.dll ] NewL() ");
+
+ CRemoteLockSettings* self = CRemoteLockSettings::NewLC( aHandler );
+
+ CleanupStack::Pop( self );
+ RL_TRACE_PRINT(" [ rlsetting.dll ] exit NewL() ");
+ return self;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CRemoteLockSettings::NewLC
+// Two-Phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CRemoteLockSettings* CRemoteLockSettings::NewLC(
+ MRemoteLockSettingsHandler* aHandler )
+ {
+
+ CRemoteLockSettings* self = new ( ELeave ) CRemoteLockSettings( aHandler );
+
+ CleanupStack::PushL( self );
+
+ self->ConstructL();
+ return self;
+ }
+
+
+// ----------------------------------------------------------------------------
+// Destructor
+// ----------------------------------------------------------------------------
+EXPORT_C CRemoteLockSettings::~CRemoteLockSettings()
+ {
+ if ( iNotifyHandler )
+ {
+ iNotifyHandler->StopListening();
+ delete iNotifyHandler;
+ }
+
+ delete iSession;
+ }
+
+
+// ----------------------------------------------------------------------
+// CRemoteLockSettings::GetLockCode
+// Gets remote lock code
+// Returns: ETrue
+// EFalse
+// ----------------------------------------------------------------------
+//
+EXPORT_C TBool CRemoteLockSettings::GetLockCode( TDes& aLockCode ) const
+ {
+ RL_TRACE_PRINT(" [ rlsetting.dll ] Getlockcode() ");
+ TInt err = iSession->Get( KRLLockCode, aLockCode );
+ RL_TRACE_PRINT(" [ rlsetting.dll ] exit Getlockcode() ");
+ return ( err == KErrNone );
+ }
+
+
+// ----------------------------------------------------------------------
+// CRemoteLockSettings::GetLockCode
+// Gets remote lock code and trimmed remote lock code
+// Returns: ETrue
+// EFalse
+// ----------------------------------------------------------------------
+//
+EXPORT_C TBool CRemoteLockSettings::GetLockCode(
+ TDes& aLockCode,
+ TDes& aLockCodeTrimmed ) const
+ {
+ RL_TRACE_PRINT(" [ rlsetting.dll ] Getlockcode() ");
+ TInt err = iSession->Get( KRLLockCode, aLockCode );
+
+ if ( err != KErrNone )
+ {
+ return EFalse;
+ }
+
+ err = iSession->Get( KRLLockCode2, aLockCodeTrimmed );
+
+ if ( err == KErrNone )
+ {
+ RL_TRACE_PRINT(" [ rlsetting.dll ] exit Getlockcode() noError");
+ return ETrue;
+ }
+ else
+ {
+ RL_TRACE_PRINT(" [ rlsetting.dll ] exit Getlockcode() Error");
+ return EFalse;
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CRemoteLockSettings::SetEnabled
+// Enables and sets remote lock code
+// Returns ETrue
+// EFalse
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CRemoteLockSettings::SetEnabledL( const TDesC& aLockCode )
+ {
+ RL_TRACE_PRINT(" [ rlsetting.dll ] SetEnabledL() ");
+ if ( aLockCode.Length() > KRLockMaxLockCodeLength )
+ {
+ return EFalse;
+ }
+
+ // Creates MD5 object.
+ CMD5* hash = CMD5::NewL();
+ CleanupStack::PushL( hash );
+
+ TBuf<KRLockMaxLockCodeLength> tempBuf;
+ tempBuf = aLockCode;
+
+ HBufC8* hashBuf = HBufC8::NewLC( KRLockMaxLockCodeLength * 2 );
+ TPtr8 tempPtr = hashBuf->Des();
+ tempPtr.Copy( tempBuf );
+
+ // Calculate the digest.
+ TPtrC8 hashPtr = hash->Hash( *hashBuf );
+ HBufC* storeBuf = HBufC::NewLC( hash->HashSize());
+ storeBuf->Des().Copy( hashPtr );
+
+ // Convert digest into hexadecimal representation
+ HBufC* hexStoreBuf = HBufC::NewLC( storeBuf->Length() * 2);
+ TBuf<2> singleHex;
+ TInt i = 0;
+ for ( i = 0; i < storeBuf->Length(); i++ )
+ {
+ singleHex.Num( storeBuf->Des()[i], EHex );
+ if ( singleHex.Length() == 1 )
+ hexStoreBuf->Des().Append( KRLockLeadingHexZero );
+ hexStoreBuf->Des().Append( singleHex );
+ }
+
+ // Saves the digest into repository file.
+ TInt err = 0;
+ err = iSession->Set( KRLLockCode, *hexStoreBuf );
+
+ if ( err != KErrNone )
+ {
+ CleanupStack::PopAndDestroy( 4 );
+ return EFalse;
+ }
+
+ // Then process the trimmed password the same way.
+ tempBuf.TrimAll();
+ tempPtr.Copy( tempBuf );
+ // Calculate the digest.
+ hash->Reset();
+ TPtrC8 hashPtr1 = hash->Hash( *hashBuf );
+ storeBuf->Des().Copy( hashPtr1 );
+ // Convert digest into hexadecimal representation
+ hexStoreBuf->Des().Zero();
+ for ( i = 0; i < storeBuf->Length(); i++ )
+ {
+ singleHex.Num( storeBuf->Des()[i], EHex );
+ if ( singleHex.Length() == 1 )
+ hexStoreBuf->Des().Append( KRLockLeadingHexZero );
+ hexStoreBuf->Des().Append( singleHex );
+ }
+
+ // Saves the digest into ini file.
+ err = iSession->Set( KRLLockCode2, *hexStoreBuf );
+
+ if ( err != KErrNone )
+ {
+ RL_TRACE_PRINT(" [ rlsetting.dll ] SetenabledL() exit Error ");
+ CleanupStack::PopAndDestroy( 4 );
+ return EFalse;
+ }
+
+ err = iSession->Set( KRLEnable, 1 );
+
+ if ( err != KErrNone )
+ {
+ RL_TRACE_PRINT(" [ rlsetting.dll ] SetenabledL() exit Error ");
+ CleanupStack::PopAndDestroy( 4 );
+ return EFalse;
+ }
+ RL_TRACE_PRINT(" [ rlsetting.dll ] SetenabledL() exit no Error ");
+ CleanupStack::PopAndDestroy( 4 );//MD5, 3 Heap buffer
+ return ETrue;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CRemoteLockSettings::SetDisabled
+// Disables remote lock
+// Returns ETrue
+// EFalse
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CRemoteLockSettings::SetDisabled()
+ {
+ RL_TRACE_PRINT(" [ rlsetting.dll ] SetDisabled() ");
+ TInt err;
+ err = iSession->Set( KRLEnable, 0 );
+ RL_TRACE_PRINT(" [ rlsetting.dll ] exit SetDisabled() ");
+ return ( err == KErrNone );
+ }
+
+// -----------------------------------------------------------------------------
+// CRemoteLockSettings::GetEnabled
+// Returns whether remote lock is enabled or disabled
+// Returns ETrue
+// EFalse
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CRemoteLockSettings::GetEnabled( TBool& aEnable ) const
+ {
+ RL_TRACE_PRINT(" [ rlsetting.dll ] GetEnabled() ");
+ TInt err;
+ err = iSession->Get( KRLEnable, aEnable );
+ RL_TRACE_PRINT(" [ rlsetting.dll ] Exit GetEnabled() ");
+ return ( err == KErrNone );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CRemoteLockSettings::CompareLockCodes
+// Compares the given remote lock code to the stored one.
+// Returns ETrue
+// EFalse
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CRemoteLockSettings::CompareLockCodesL(
+ const TDesC& aLockCode,
+ const TDesC& aCorrectLockCode ) const
+ {
+ RL_TRACE_PRINT(" [ rlsetting.dll ] CompareLockCodesL() ");
+ if ( aLockCode.Length() > KRLockMaxLockCodeLength ||
+ aCorrectLockCode.Length() > KRLockStoredLockCodeLength )
+ {
+ RL_TRACE_PRINT(" [ rlsetting.dll ] exit CompareLockCodeL() lockcode length is illegal ");
+ return EFalse;
+ }
+
+ // Creates MD5 object.
+ CMD5* hash = CMD5::NewL();
+ CleanupStack::PushL( hash );
+
+ HBufC8* hashBuf = HBufC8::NewLC( KRLockMaxLockCodeLength * 2 );
+ TPtr8 tempPtr = hashBuf->Des();
+ tempPtr.Copy( aLockCode );
+
+ // Hashes data.
+ TPtrC8 hashPtr = hash->Hash( *hashBuf );
+
+ HBufC* lockCode = HBufC::NewLC( hash->HashSize() );
+
+ // Copies hashPtr to lockCode.
+ lockCode->Des().Copy( hashPtr );
+
+ // Convert digest into hexadecimal representation
+ HBufC* hexLockCode = HBufC::NewLC( lockCode->Length() * 2);
+ TBuf<2> singleHex;
+ for ( TInt i = 0; i < lockCode->Length(); i++ )
+ {
+ singleHex.Num( lockCode->Des()[i], EHex );
+ if ( singleHex.Length() == 1 )
+ hexLockCode->Des().Append( KRLockLeadingHexZero );
+ hexLockCode->Des().Append( singleHex );
+ }
+
+ RL_TRACE_PRINT(" [ rlsetting.dll ] CompareLockCodeL() compare ");
+ if ( hexLockCode->Compare( aCorrectLockCode ) == 0 )
+ {
+ // When two hash results matches each other.
+ RL_TRACE_PRINT(" [ rlsetting.dll ] ComparelockcodeL() match ");
+ CleanupStack::PopAndDestroy( 4 );
+ return ETrue;
+ }
+ else
+ {
+ RL_TRACE_PRINT(" [ rlsetting.dll ] CompareLockCodeL() dismatch ");
+ CleanupStack::PopAndDestroy( 4 );
+ return EFalse;
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CRemoteLockSettings::RemoteLockNotifyL
+// Setup RemoteLock notifier
+// Returns: ETrue
+// EFalse
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CRemoteLockSettings::RemoteLockNotifyL(
+ const TBool aNotifyEnable )
+ {
+ RL_TRACE_PRINT(" [ rlsetting.dll ] RemotelockNotifyL() ");
+ if ( !iNotifyHandler )
+ {
+ iNotifyHandler = CCenRepNotifyHandler::NewL( *this, *iSession );
+ }
+
+ if ( aNotifyEnable )
+ {
+ iNotifyHandler->StartListeningL();
+ }
+ else
+ {
+ iNotifyHandler->StopListening();
+ }
+ RL_TRACE_PRINT(" [ rlsetting.dll ] exit RemotelockNotifyL() ");
+ return ETrue;
+ }
+
+// ----------------------------------------------------------------------------
+// CRemoteLockSettings::CRemoteLockSettings
+// default constructor
+// ----------------------------------------------------------------------------
+CRemoteLockSettings::CRemoteLockSettings( MRemoteLockSettingsHandler* aHandler )
+ {
+ iHandler = aHandler;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CRemoteLockSettings::ConstructL
+// Symbian 2nd phase constructor can leave
+//------------------------------------------------------------------------------
+//
+void CRemoteLockSettings::ConstructL()
+ {
+ RL_TRACE_PRINT(" [ rlsetting.dll ] ConstructL() ");
+ iSession = CRepository::NewL( KCRUidRemoteLock );
+ RL_TRACE_PRINT(" [ rlsetting.dll ] exit ConstructL() ");
+ }
+
+
+// -----------------------------------------------------------------------------
+// CRemoteLockSettings::HandleNotifyGeneric
+// Notify handler
+//
+// -----------------------------------------------------------------------------
+//
+void CRemoteLockSettings::HandleNotifyGeneric(
+ TUint32 /*aId*/ )
+ {
+ RL_TRACE_PRINT(" [ rlsetting.dll ] HandleNotifyGeneric() ");
+ TRAPD( error, iHandler->HandleRemoteLockNotifyL() );
+ error = error;
+ RL_TRACE_PRINT(" [ rlsetting.dll ] exit HandleNotifyGeneric() ");
+ }
+
+