diff -r 000000000000 -r 164170e6151a remotelock/RemotelockSettings/Src/RemoteLockSettings.cpp --- /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 +#include +#include +#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 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() "); + } + +