diff -r 000000000000 -r 4e1aa6a622a0 sysstatemgmt/systemstatemgr/cmd/src/cmdsetpandskey.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysstatemgmt/systemstatemgr/cmd/src/cmdsetpandskey.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,331 @@ +// Copyright (c) 2007-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: +// + +#include +#include +#include + +#include "ssmcommandparameters.h" +#include "cmdsetpandskey.h" +#include "ssmdebug.h" +#include "ssmpanic.h" + +#ifdef SYMBIAN_SSM_FLEXIBLE_MERGE +/** +Used to create an instance of CCmdSetPAndSKey class, from given parameters. +This method is used by SsmCommandFactory to create a command. + +@param aSeverity The severity of the command +@param aCategory The UID that identifies the property category. +@param aKey The property sub-key, i.e. the key that identifies the specific property within the category. +@param aValue The new property value. +@param aPriority The priority of the command in the list +@return A pointer to an object of type CCmdSetPAndSKey. +*/ +CCmdSetPAndSKey* CCmdSetPAndSKey::NewL(TCmdErrorSeverity aSeverity, const TUid& aCategory, TUint aKey, TInt aValue, const TUint16 aPriority) + { + CCmdSetPAndSKey* self = new (ELeave) CCmdSetPAndSKey(aSeverity, aCategory, aKey, aValue, aPriority); + return self; + } +#endif + +/** +Used to create an instance of CCmdSetPAndSKey class, from given parameters. +This method is used by SsmCommandFactory to create a command. + +@param aSeverity The severity of the command +@param aCategory The UID that identifies the property category. +@param aKey The property sub-key, i.e. the key that identifies the specific property within the category. +@param aValue The new property value. +@return A pointer to an object of type CCmdSetPAndSKey. +*/ +CCmdSetPAndSKey* CCmdSetPAndSKey::NewL(TCmdErrorSeverity aSeverity, const TUid& aCategory, TUint aKey, TInt aValue) + { + CCmdSetPAndSKey* self = new (ELeave) CCmdSetPAndSKey(aSeverity, aCategory, aKey, aValue); + return self; + } + +/** +Used to create an instance of CCmdSetPAndSKey class from a read stream. +CSsmCommandList::InternalizeL() uses this method to construct a command from stream. + +@param aReadStream Read stream containing data through which object can be created +@return A pointer to an object of type CCmdSetPAndSKey. +*/ +CCmdSetPAndSKey* CCmdSetPAndSKey::NewL(RReadStream& aReadStream) + { + CCmdSetPAndSKey* self = new (ELeave) CCmdSetPAndSKey(); + CleanupStack::PushL(self); + self->ConstructL(aReadStream); + CleanupStack::Pop(self); + return self; + } + +/** +Used to create an instance of CCmdSetPAndSKey class from resource. + +@param aCommandParameters Object data from a resource file +@return A pointer to an object of type CCmdSetPAndSKey. +*/ +CCmdSetPAndSKey* CCmdSetPAndSKey::NewL(TSsmCommandParameters& aCommandParameters) + { + CCmdSetPAndSKey* self = new (ELeave) CCmdSetPAndSKey(); + CleanupStack::PushL(self); + self->ConstructL(aCommandParameters); + CleanupStack::Pop(self); + return self; + } + +/** +Used to create an instance of CCmdSetPAndSKey class from CCmdSetPAndSKey object +Must be used only by CLE +@param aCmdSetPAndSKey CCmdSetPAndSKey reference +@return A pointer to an object of type CCmdSetPAndSKey. +*/ +CCmdSetPAndSKey* CCmdSetPAndSKey::NewLC(const CCmdSetPAndSKey& aCmdSetPAndSKey) + { +#ifdef SYMBIAN_SSM_FLEXIBLE_MERGE + CCmdSetPAndSKey* self = new (ELeave) CCmdSetPAndSKey(aCmdSetPAndSKey.Severity(),aCmdSetPAndSKey.Category(), + aCmdSetPAndSKey.Key(),aCmdSetPAndSKey.Value(),aCmdSetPAndSKey.Priority()); +#else + CCmdSetPAndSKey* self = new (ELeave) CCmdSetPAndSKey(aCmdSetPAndSKey.Severity(),aCmdSetPAndSKey.Category(), + aCmdSetPAndSKey.Key(),aCmdSetPAndSKey.Value()); +#endif + CleanupStack::PushL(self); + self->ConstructL(aCmdSetPAndSKey); + return self; + } + +void CCmdSetPAndSKey::ConstructL(const CCmdSetPAndSKey& aCmdSetPAndSKey) + { + iConditionalResourceId = aCmdSetPAndSKey.ConditionalInformation(); +#ifdef SYMBIAN_SSM_FLEXIBLE_MERGE + if (iConditionalResourceId != 0) + { + SetCommandResourceFileNameL(aCmdSetPAndSKey.GetCommandResourceFileName()); + } +#endif + } + +/** +Returns the version of the BIC +@return The maximum supported version of the BIC +*/ +TInt CCmdSetPAndSKey::MaxSupportedVersion() + { +#ifdef SYMBIAN_SSM_FLEXIBLE_MERGE + return (static_cast(ECmdSetPAndSKeyVersionWithPriority)); +#else + return (static_cast(ECmdSetPAndSKeyInitialVersion)); +#endif + } + +/** +Destructor +*/ +CCmdSetPAndSKey::~CCmdSetPAndSKey() + { + Cancel(); + } + +/** +Execute this command +@param aStatus The TRequestStatus which is completed when value is set either + with KErrNone or with error value. +*/ +void CCmdSetPAndSKey::Execute(TRequestStatus& aStatus) + { + aStatus = KRequestPending; + iExecuteRequest = &aStatus; + + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + } + +/** +Releases resources associated with this BIC +*/ +void CCmdSetPAndSKey::Release() + { + delete this; + } + +/** +Cancels the BIC +*/ +void CCmdSetPAndSKey::ExecuteCancel() + { + //cancel the outstanding request + Cancel(); + //and complete the request with KErrCancel + CompleteExecuteRequest(KErrCancel); + } + +/** +Returns the type of the BIC +@return Type of BIC +*/ +TSsmCommandType CCmdSetPAndSKey::Type() const + { + return (ESsmCmdSetPAndSKey); + } + +/** +Externalises the configuration of the BIC + +@param aWriteStream A write stream to write BIC data to +*/ + void CCmdSetPAndSKey::ExternalizeL(RWriteStream& aWriteStream) const + { + aWriteStream.WriteInt16L(iSeverity); + aWriteStream.WriteUint32L(iCategory.iUid); + aWriteStream.WriteUint32L(iKey); + aWriteStream.WriteInt16L(iValue); +#ifdef SYMBIAN_SSM_FLEXIBLE_MERGE + aWriteStream.WriteUint16L(iPriority); +#endif + } + +void CCmdSetPAndSKey::RunL() + { + TInt err = RProperty::Set(iCategory, iKey, iValue); + DEBUGPRINT3A("Value %d is set with err : %d", iValue, err); + if (KErrNotFound == err) + { + DEBUGPRINT1A("key not defined"); + //try to define + _LIT_SECURITY_POLICY_PASS(KReadPolicy); + _LIT_SECURITY_POLICY_S0(KWritePolicy, RProcess().SecureId()); + DEBUGPRINT1A("Defining key"); + err = RProperty::Define(iCategory, iKey, RProperty::EInt, KReadPolicy, KWritePolicy); + DEBUGPRINT2A("Key defined with err : %d", err); + if (KErrNone == err) + { + DEBUGPRINT1A("Property defined, setting it again"); + // and set it again + err = RProperty::Set(iCategory, iKey, iValue); + DEBUGPRINT2A("Value set with err : %d", err); + } + } + //complete the request + CompleteExecuteRequest(err); + } + +/** +Cancellation of an outstanding request. +*/ +void CCmdSetPAndSKey::DoCancel() + { + // This command need not to cancel as iStatus is always completed before it's SetActive() + } + +/** +Complete the command request with aError. It gets called when RunL leaves. + +@param aError Error code with which RunL has left. +@return KErrNone, as error is handled in this function. +*/ +TInt CCmdSetPAndSKey::RunError(TInt aError) + { + DEBUGPRINT2A("CCmdSetPAndSKey::RunError called with reason %d", aError); + CompleteExecuteRequest(aError); + return KErrNone; + } + +#ifdef SYMBIAN_SSM_FLEXIBLE_MERGE +/** +Overloaded constructor + +@param aSeverity The severity of the command +@param aCategory The UID that identifies the property category. +@param aKey The property sub-key, i.e. the key that identifies the specific property within the + category. +@param aValue The new property value. +@param aPriority The priority of the command in the list +*/ +CCmdSetPAndSKey::CCmdSetPAndSKey(TCmdErrorSeverity aSeverity, const TUid& aCategory, TUint aKey, TInt aValue, const TUint16 aPriority) + : CSsmCommandBase(aSeverity, aPriority), iCategory(aCategory), iKey(aKey), iValue(aValue) + { + } +#endif + +/** +Overloaded constructor + +@param aSeverity The severity of the command +@param aCategory The UID that identifies the property category. +@param aKey The property sub-key, i.e. the key that identifies the specific property within the + category. +@param aValue The new property value. +*/ +CCmdSetPAndSKey::CCmdSetPAndSKey(TCmdErrorSeverity aSeverity, const TUid& aCategory, TUint aKey, TInt aValue) + : CSsmCommandBase(aSeverity), iCategory(aCategory), iKey(aKey), iValue(aValue) + { + } + +/** + Default constructor. + */ +CCmdSetPAndSKey::CCmdSetPAndSKey() + { + } + +/** +Constructs the object through read stream. +@param aReadStream +*/ +void CCmdSetPAndSKey::ConstructL(RReadStream& aReadStream) + { + InternalizeL(aReadStream); + } + +/** +Constructs an object from resource file. + +@param aCommandParameters Object data from a resource file +*/ +void CCmdSetPAndSKey::ConstructL(TSsmCommandParameters& aCommandParameters) + { + RResourceReader& reader = aCommandParameters.MainReader(); + const TSsmCommandType type = static_cast(reader.ReadInt16L()); + SSMLOGLEAVEIFFALSE(type == Type(), KErrNotSupported); + const TInt version = reader.ReadInt16L(); + SSMLOGLEAVEIFFALSE(__COMPARE_VERSION(version, CCmdSetPAndSKey::MaxSupportedVersion()), KErrNotSupported); + iSeverity = static_cast(reader.ReadInt16L()); + iCategory = TUid::Uid(reader.ReadUint32L()); + iKey = reader.ReadUint32L(); + iValue = reader.ReadInt16L(); +#ifdef SYMBIAN_SSM_FLEXIBLE_MERGE + iPriority = (version > ECmdSetPAndSKeyInitialVersion) ? reader.ReadUint16L() : KDefaultCommandPriority; +#endif + } + +/** +Configures the BIC using data contained in a ReadStream + +@param aReadStream A read stream containing BIC data +*/ +void CCmdSetPAndSKey::InternalizeL(RReadStream& aReadStream) + { + iSeverity = static_cast(aReadStream.ReadInt16L()); + iCategory.iUid = aReadStream.ReadUint32L(); + iKey = aReadStream.ReadUint32L(); + iValue = aReadStream.ReadInt16L(); +#ifdef SYMBIAN_SSM_FLEXIBLE_MERGE + iPriority = aReadStream.ReadUint16L(); +#endif + } +