diff -r 000000000000 -r 4e1aa6a622a0 mediator/src/Server/MediatorServerObjects.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mediator/src/Server/MediatorServerObjects.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,1315 @@ +/* +* Copyright (c) 2005 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: Domain, category, event & command object implementations +* +*/ + + +// INCLUDE FILES +#include + +#include "MediatorServerObjects.h" +#include "MediatorCommon.h" +#include "MediatorServer.h" +#include "MediatorServiceDefs.h" +#include "Debug.h" + +// ============================================================================= +// ============================ DOMAIN FUNCTIONS =============================== +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CDomain::CDomain +// ----------------------------------------------------------------------------- +// +CDomain::CDomain() + { + } + +// ----------------------------------------------------------------------------- +// CDomain::ConstructL +// ----------------------------------------------------------------------------- +// +void CDomain::ConstructL( TUid aDomain ) + { + iDomain = aDomain; + iSearchCategory = CCategory::NewL( TUid() ); // just assign some arbitrary domain, updated in search + } + +// ----------------------------------------------------------------------------- +// CDomain::NewL +// ----------------------------------------------------------------------------- +// +CDomain* CDomain::NewL( TUid aDomain ) + { + CDomain* self = new( ELeave ) CDomain; + + CleanupStack::PushL( self ); + self->ConstructL( aDomain ); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CDomain::~CDomain +// ----------------------------------------------------------------------------- +// +CDomain::~CDomain() + { + iCategoryList.ResetAndDestroy(); + delete iSearchCategory; + } + +// ----------------------------------------------------------------------------- +// CDomain::DomainUid +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TUid CDomain::DomainUid() const + { + return iDomain; + } + +// ----------------------------------------------------------------------------- +// CDomain::SetDomainUid +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CDomain::SetDomainUid( TUid aDomain ) + { + iDomain = aDomain; + } + +// ----------------------------------------------------------------------------- +// CDomain::AddCategoryL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CDomain::AddCategoryL( const CCategory* aNewCategory ) + { + __ASSERT_DEBUG( aNewCategory, CMediatorServer::PanicServer( EMediatorServerIllegalParameter ) ); + TInt index = 0; // not used here + if ( FindCategory( aNewCategory->CategoryUid(), index ) ) + { + ERROR_TRACE(Print(_L("CDomain::AddCategoryL: category %d already exists in domain %d\n"), aNewCategory->CategoryUid().iUid, + iDomain.iUid ) ); + User::Leave( KErrAlreadyExists ); + } + iCategoryList.AppendL( aNewCategory ); + } + +// ----------------------------------------------------------------------------- +// CDomain::AddCategoryL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CCategory* CDomain::AddCategoryL( const TUid aCategory ) + { + CCategory* newCategory = CCategory::NewL( aCategory ); + CleanupStack::PushL( newCategory ); + + TInt index = 0; + if ( FindCategory( newCategory, index ) ) + { + ERROR_TRACE(Print(_L("CDomain::AddCategoryL: category %d already exists in domain %d\n"), aCategory.iUid, + iDomain.iUid ) ); + User::Leave( KErrAlreadyExists ); + } + iCategoryList.AppendL( newCategory ); + CleanupStack::Pop( newCategory ); // ownership is changed + return newCategory; + } + +// ----------------------------------------------------------------------------- +// CDomain::RemoveCategory +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CDomain::RemoveCategory( const TUid aCategory ) + { + TInt error = KErrMediatorCategoryNotFound; + // Find the category + TInt index = 0; + CCategory* category = FindCategory( aCategory, index ); + + if ( category ) + { + // Make temporary pointer to it, remove it from list and delete. + CCategory* category = iCategoryList[ index ]; + iCategoryList.Remove( index ); + delete category; + error = KErrNone; + } + return error; + } + +// ----------------------------------------------------------------------------- +// CDomain::GetCategory +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +const CCategory* CDomain::GetCategory( const TUid aCategory ) + { + TInt index = 0; + return FindCategory( aCategory, index ); + } + +// ----------------------------------------------------------------------------- +// CDomain::GetCategory +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CCategory* CDomain::GetCategory( TInt aIndex ) + { + CCategory* categoryPtr = NULL; + if ( aIndex >= 0 && aIndex < CategoryCount() ) + { + categoryPtr = iCategoryList[aIndex]; + } + return categoryPtr; + } + +// ----------------------------------------------------------------------------- +// CDomain::CategoryCount +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CDomain::CategoryCount() + { + return iCategoryList.Count(); + } + +// ----------------------------------------------------------------------------- +// CDomain::FindCategory +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CCategory* CDomain::FindCategory( const TUid aCategory, TInt& aIndex ) + { + iSearchCategory->SetCategoryUid( aCategory ); + + return FindCategory( iSearchCategory, aIndex ); + } + +// ----------------------------------------------------------------------------- +// CDomain::FindCategory +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CCategory* CDomain::FindCategory( const CCategory* aCategory, TInt& aIndex ) + { + // Create utilities to be used in find + TIdentityRelation relation( CompareCategories ); + + // Find the item from array + aIndex = iCategoryList.Find( aCategory, relation ); + // Then return it, if found. + CCategory* category = NULL; + if ( aIndex != KErrNotFound ) + { + category = iCategoryList[aIndex]; + } + return category; + } + +// ----------------------------------------------------------------------------- +// CDomain::GetCategoriesL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CDomain::GetCategoriesL( RCategoryList& aCategories ) + { + // Loop through category list and append to return list. + for ( TInt index = 0; index < iCategoryList.Count(); index++ ) + { + aCategories.AppendL( iCategoryList[index]->CategoryUid() ); + } + } + +// ----------------------------------------------------------------------------- +// CDomain::CompareCategories +// Compares categories and returns boolean according to comparison +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CDomain::CompareCategories( const CCategory& aLeftCategory, + const CCategory& aRightCategory ) + { + return aLeftCategory.CategoryUid() == aRightCategory.CategoryUid(); + } + +// ============================================================================= +// ============================ CATEGORY FUNCTIONS ============================= +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CCategory::CCategory() +// ----------------------------------------------------------------------------- +// +CCategory::CCategory() + { + } + +// ----------------------------------------------------------------------------- +// CCategory::ConstructL +// ----------------------------------------------------------------------------- +// +void CCategory::ConstructL( TUid aCategory ) + { + iCategory = aCategory; + iSearchCommand = CCommand::NewL(0); // arbitrary id, updated in search + iSearchEvent = CEvent::NewL(0); // arbitrary id, updated in search + } + +// ----------------------------------------------------------------------------- +// CCategory::NewL +// ----------------------------------------------------------------------------- +// +CCategory* CCategory::NewL( TUid aCategory ) + { + CCategory* self = new( ELeave ) CCategory; + + CleanupStack::PushL( self ); + self->ConstructL( aCategory ); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CCategory::~CCategory +// ----------------------------------------------------------------------------- +// +CCategory::~CCategory() + { + iEventList.ResetAndDestroy(); + iCommandList.ResetAndDestroy(); + delete iSearchCommand; + delete iSearchEvent; + } + +// ----------------------------------------------------------------------------- +// CCategory::CategoryUid +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TUid CCategory::CategoryUid() const + { + return iCategory; + } + +// ----------------------------------------------------------------------------- +// CCategory::SetCategoryUid +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCategory::SetCategoryUid( TUid aCategory ) + { + iCategory = aCategory; + } + +// ----------------------------------------------------------------------------- +// CCategory::AddEventL +// Adds new event to eventlist +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CCategory::AddEvent( const CEvent* aNewEvent ) + { + __ASSERT_DEBUG( aNewEvent, CMediatorServer::PanicServer( EMediatorServerIllegalParameter ) ); + + TInt error = FindEvent( *aNewEvent ); + if ( error == KErrNotFound ) + { +#ifdef _DEBUG + TRACE(Print(_L("[Mediator Server]\t CCategory::AddEvent id %d\n"), aNewEvent->Id() )); + for ( TInt index = 0; index < ECapability_Limit; index ++ ) + { + TCapabilitySet caps = aNewEvent->Policy(); + TBool required = caps.HasCapability( (TCapability) index ); + if ( required ) + { + TRACE(Print(_L("[Mediator] CCategory::AddEvent: Capability %d required\n"), index )); + } + } +#endif // _DEBUG + error = iEventList.Append( aNewEvent ); + } + else + { + error = KErrMediatorEventAlreadyExists; + } + return error; + } + +// ----------------------------------------------------------------------------- +// CCategory::AddCommandL +// Adds new command to commandList +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CCategory::AddCommand( const CCommand* aNewCommand ) + { + __ASSERT_DEBUG( aNewCommand, CMediatorServer::PanicServer( EMediatorServerIllegalParameter ) ); + + TInt error = FindCommand( *aNewCommand ); + if ( error == KErrNotFound ) + { +#ifdef _DEBUG + TRACE(Print(_L("[Mediator Server]\t CCategory::AddCommand id %d\n"), aNewCommand->Id() )); + for ( TInt index = 0; index < ECapability_Limit; index ++ ) + { + TCapabilitySet caps = aNewCommand->Policy(); + TBool required = caps.HasCapability( (TCapability) index ); + if ( required ) + { + TRACE(Print(_L("[Mediator] CCategory::AddCommand: Capability %d required\n"), index )); + } + } +#endif // _DEBUG + error = iCommandList.Append( aNewCommand ); + } + else + { + error = KErrMediatorCommandAlreadyExists; + } + return error; + } + +// ----------------------------------------------------------------------------- +// CCategory::RemoveEvent +// Removes item from the category +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCategory::RemoveEvent( TInt aIndex ) + { + if ( aIndex >= 0 && aIndex < iEventList.Count() ) + { + iEventList.Remove( aIndex ); + } + } + +// ----------------------------------------------------------------------------- +// CCategory::RemoveCommand +// Removes item from the category +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCategory::RemoveCommand( TInt aIndex ) + { + if ( aIndex >= 0 && aIndex < iCommandList.Count() ) + { + iCommandList.Remove( aIndex ); + } + } + +// ----------------------------------------------------------------------------- +// CCategory::FindEvent +// Returns item specified by Id +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CEvent* CCategory::FindEvent( const TInt aId, TInt& aIndex ) + { + iSearchEvent->SetId( aId ); + + aIndex = FindEvent( *iSearchEvent ); + + // Then return it, if found. + CEvent* event = NULL; + if ( aIndex != KErrNotFound ) + { + event = iEventList[aIndex]; + } + + return event; + } + +// ----------------------------------------------------------------------------- +// CCategory::GetEvent +// Returns item specified by index +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CEvent* CCategory::GetEvent( TInt aIndex ) + { + CEvent* eventPtr = NULL; + if ( aIndex >= 0 && aIndex < EventCount() ) + { + eventPtr = iEventList[aIndex]; + } + return eventPtr; + } + +// ----------------------------------------------------------------------------- +// CCategory::GetCommand +// Returns item specified by index +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CCommand* CCategory::GetCommand( TInt aIndex ) + { + CCommand* commandPtr = NULL; + if ( aIndex >= 0 && aIndex < CommandCount() ) + { + commandPtr = iCommandList[aIndex]; + } + return commandPtr; + } + +// ----------------------------------------------------------------------------- +// CCategory::FindCommand +// Returns item specified by Id +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CCommand* CCategory::FindCommand( const TInt aId, TInt& aIndex ) + { + iSearchCommand->SetId( aId ); + + aIndex = FindCommand( *iSearchCommand ); + + // Then return it, if found. + CCommand* command = NULL; + if ( aIndex != KErrNotFound ) + { + command = iCommandList[aIndex]; + } + + return command; + } + + +// ----------------------------------------------------------------------------- +// CCategory::FindEvent +// Finds event from the event list +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CCategory::FindEvent( const CEvent& aEvent ) + { + // Create utilities to be used in find + TIdentityRelation relation( CompareEvents ); + + // Find the event from array + return iEventList.Find( &aEvent, relation ); + } + +// ----------------------------------------------------------------------------- +// CCategory::FindCommand +// Finds item from the item list +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CCategory::FindCommand( const CCommand& aCommand ) + { + // Create utilities to be used in find + TIdentityRelation relation( CompareCommands ); + + // Find the command from array + return iCommandList.Find( &aCommand, relation ); + } + +// ----------------------------------------------------------------------------- +// CCategory::GetEventsL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCategory::GetEventsL( REventList& aEvents ) + { + // Loop thought category's event list and append those to returned + // event list. + for ( TInt index = 0; index < iEventList.Count(); index++ ) + { + CEvent* event = iEventList[index]; + if ( event ) + { + aEvents.AppendL( event->Event() ); + } + } + } + +// ----------------------------------------------------------------------------- +// CCategory::GetCommandsL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCategory::GetCommandsL( RCommandList& aCommands ) + { + // Loop thought category's event list and append those to returned + // event list. + for ( TInt index = 0; index < iCommandList.Count(); index++ ) + { + CCommand* command = iCommandList[index]; + if ( command ) + { + aCommands.AppendL( command->Command() ); + } + } + } + +// ----------------------------------------------------------------------------- +// CCategory::EventCount +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CCategory::EventCount() + { + return iEventList.Count(); + } + +// ----------------------------------------------------------------------------- +// CCategory::CommandCount +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CCategory::CommandCount() + { + return iCommandList.Count(); + } + +// ----------------------------------------------------------------------------- +// CCategory::CompareCommands +// Compares two commands +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CCategory::CompareCommands( const CCommand& aLeftCommand, + const CCommand& aRightCommand ) + { + return aLeftCommand.Id() == aRightCommand.Id(); + } + +// ----------------------------------------------------------------------------- +// CCategory::CompareEvents +// Compares two commands +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CCategory::CompareEvents( const CEvent& aLeftEvent, + const CEvent& aRightEvent ) + { + return aLeftEvent.Id() == aRightEvent.Id(); + } + + +// ----------------------------------------------------------------------------- +// CCategory::CommitCommands +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCategory::CommitCommands() + { + // iterate through command list + CCommand* command; + + for ( TInt i = iCommandList.Count() - 1; i >= 0; i-- ) // iterage in reverse order because count may change + { + command = iCommandList[i]; + + if ( command->CommitState() == CItem::EAdded ) + { + // if item state is Added -> set to Committed + command->SetCommitState( CItem::ECommitted ); + } + else if ( command->CommitState() == CItem::ERemoved ) + { + // if item state is Removed -> remove item and release reserved memory + iCommandList.Remove( i ); + delete command; + } + } + } + + +// ----------------------------------------------------------------------------- +// CCategory::RollbackCommands +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCategory::RollbackCommands() + { + CCommand* command; + + // iterate through command list + for ( TInt i = iCommandList.Count() - 1; i >= 0; i-- ) // iterage in reverse order because count may change + { + command = iCommandList[i]; + + if ( command->CommitState() == CItem::EAdded ) + { + // if item state is Added -> remove item and release reserved memory + iCommandList.Remove( i ); + delete command; + } + else if ( command->CommitState() == CItem::ERemoved ) + { + // if item state is Removed -> set back to Committed + command->SetCommitState( CItem::ECommitted ); + } + } + } + +// ----------------------------------------------------------------------------- +// CCategory::CommitEvents +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCategory::CommitEvents() + { + CEvent* event; + + // iterate through event list + for ( TInt i = iEventList.Count() - 1; i >= 0; i-- ) // iterage in reverse order because count may change + { + event = iEventList[i]; + + if ( event->CommitState() == CItem::EAdded ) + { + // if item state is Added -> set to Committed + event->SetCommitState( CItem::ECommitted ); + } + else if ( event->CommitState() == CItem::ERemoved ) + { + // if item state is Removed -> remove item and release reserved memory + iEventList.Remove( i ); + delete event; + } + } + } + +// ----------------------------------------------------------------------------- +// CCategory::RollbackEvents +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCategory::RollbackEvents() + { + CEvent* event; + + // iterate through command list + for ( TInt i = iEventList.Count() - 1; i >= 0; i-- ) // iterage in reverse order because count may change + { + event = iEventList[i]; + + if ( event->CommitState() == CItem::EAdded ) + { + // if item state is Added -> remove item and release reserved memory + iEventList.Remove( i ); + delete event; + } + else if ( event->CommitState() == CItem::ERemoved ) + { + // if item state is Removed -> set back to Committed + event->SetCommitState( CItem::ECommitted ); + } + } + } + +// ============================================================================= +// ============================ ITEM FUNCTIONS ================================= +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CItem::CItem +// ----------------------------------------------------------------------------- +// +CItem::CItem() + { + } + +// ----------------------------------------------------------------------------- +// CItem::~CItem +// ----------------------------------------------------------------------------- +// +CItem::~CItem() + { + delete iData; + } + +// ----------------------------------------------------------------------------- +// CItem::Id +// Returns id of the item +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CItem::Id() const + { + return iId; + } + +// ----------------------------------------------------------------------------- +// CItem::SetId +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CItem::SetId( TInt aId ) + { + iId = aId; + } + +// ----------------------------------------------------------------------------- +// CItem::SetDomain +// Sets domain to item +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CItem::SetDomain( TUid aDomain ) + { + iDomain = aDomain; + } + +// ----------------------------------------------------------------------------- +// CItem::Domain +// Gets item domain +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TUid CItem::Domain() const + { + return iDomain; + } + +// ----------------------------------------------------------------------------- +// CItem::SetCategory +// Sets category to item +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CItem::SetCategory( TUid aCategory ) + { + iCategory = aCategory; + } + +// ----------------------------------------------------------------------------- +// CItem::Category +// Gets item category +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TUid CItem::Category() const + { + return iCategory; + } + +// ----------------------------------------------------------------------------- +// CItem::Policy +// Returns the required capability set for the item (command or event) +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TCapabilitySet CItem::Policy() const + { + return iPolicy; + } + + +// ----------------------------------------------------------------------------- +// CItem::SetVersion +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CItem::SetVersion( TVersion aVersion ) + { + iVersion = aVersion; + } + +// ----------------------------------------------------------------------------- +// CItem::Version +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TVersion CItem::Version() const + { + return iVersion; + } + + +// ----------------------------------------------------------------------------- +// CItem::SetSecureId +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CItem::SetSecureId( TSecureId aSecureId ) + { + iSecureId = aSecureId; + } + +// ----------------------------------------------------------------------------- +// CItem::SecureId +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TSecureId CItem::SecureId() const + { + return iSecureId; + } + + +// ----------------------------------------------------------------------------- +// CItem::SetParameterDataL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CItem::SetParameterDataL( const TDesC8& aData ) + { + // Empty existing just to be sure + delete iData; + iData = NULL; + + iData = aData.AllocL(); + } + +// ----------------------------------------------------------------------------- +// CItem::ParameterData +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +const TDesC8& CItem::ParameterData() const + { + if ( iData ) + { + return *iData; + } + else + { + return KNullDesC8; + } + } + +// ----------------------------------------------------------------------------- +// CItem::CommitState +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CItem::TCommitState CItem::CommitState() const + { + return iCommitState; + } + +// ----------------------------------------------------------------------------- +// CItem::SetCommitState +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CItem::SetCommitState( TCommitState aState ) + { + iCommitState = aState; + } + +// ============================================================================= +// ============================ EVENT FUNCTIONS ================================ +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CEvent::CEvent +// ----------------------------------------------------------------------------- +// +CEvent::CEvent( const TInt aId ) + { + iId = aId; + } + +// ----------------------------------------------------------------------------- +// CEvent::CEvent +// ----------------------------------------------------------------------------- +// +CEvent::CEvent( const TEvent aEvent ) + { + iId = aEvent.iEventId; + iPolicy = aEvent.iCaps; + iVersion = aEvent.iVersion; + } + + +// ----------------------------------------------------------------------------- +// CEvent::ConstructL +// ----------------------------------------------------------------------------- +// +void CEvent::ConstructL() + { + } + +// ----------------------------------------------------------------------------- +// CEvent::NewL +// ----------------------------------------------------------------------------- +// +CEvent* CEvent::NewL( const TInt aId ) + { + CEvent* self = new( ELeave ) CEvent( aId ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CEvent::NewL +// ----------------------------------------------------------------------------- +// +CEvent* CEvent::NewL( const TEvent aEvent ) + { + CEvent* self = new( ELeave ) CEvent( aEvent ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CEvent::~CEvent +// ----------------------------------------------------------------------------- +// +CEvent::~CEvent() + { + } + +// ----------------------------------------------------------------------------- +// CEvent::Type +// Returns EItemEvent +// ----------------------------------------------------------------------------- +// +TItemType CEvent::Type() const + { + return EItemEvent; + } + +// ----------------------------------------------------------------------------- +// CEvent::AddObserver +// +// ----------------------------------------------------------------------------- +// +TInt CEvent::AddObserver( MMediatorServerEventObserver* aObserver ) + { + TInt error = KErrNone; + // Check that observer does not exists already for this event + TBool found = EFalse; + for (TInt index = 0; index < iObservers.Count() && !found; index++ ) + { + if ( iObservers[index] == aObserver ) + { + error = KErrMediatorAlreadySubscribed; + found = ETrue; + } + } + // Add observer in case no errors + if ( error == KErrNone ) + { + error = iObservers.Append( aObserver ); + } + return error; + } + +// ----------------------------------------------------------------------------- +// CEvent::RemoveObserver +// +// ----------------------------------------------------------------------------- +// +TInt CEvent::RemoveObserver( MMediatorServerEventObserver* aObserver ) + { + TInt error = KErrNone; + TBool found = EFalse; + for (TInt index = 0; index < iObservers.Count() && !found; index++ ) + { + // Remove the fond observer + if ( iObservers[index] == aObserver ) + { + iObservers.Remove( index ); + found = ETrue; + } + } + if ( !found ) + { + error = KErrMediatorNoSubscription; + } + return error; + } + +// ----------------------------------------------------------------------------- +// CEvent::GetObservers +// +// ----------------------------------------------------------------------------- +// +RPointerArray& CEvent::GetObservers() + { + return iObservers; + } + +// ----------------------------------------------------------------------------- +// CEvent::AddObservers +// +// ----------------------------------------------------------------------------- +// +void CEvent::AddObservers( RPointerArray& aObservers ) + { + // Check that observer does not exists already for this event + for (TInt index = 0; index < aObservers.Count(); index++ ) + { + iObservers.Append( aObservers[index] ); + } + } + +// ----------------------------------------------------------------------------- +// CEvent::Event +// Returns EItemEvent +// ----------------------------------------------------------------------------- +// +MediatorService::TEvent CEvent::Event() const + { + MediatorService::TEvent event; + event.iEventId = Id(); + event.iVersion = Version(); + event.iCaps = Policy(); + return event; + } + + +// ============================================================================= +// ============================ COMMAND FUNCTIONS ============================== +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CCommand::CCommand +// ----------------------------------------------------------------------------- +// +CCommand::CCommand( const TInt aId ) + { + iId = aId; + iStatus = ECommandPending; // pending command by default + } + +// ----------------------------------------------------------------------------- +// CCommand::CCommand +// ----------------------------------------------------------------------------- +// +CCommand::CCommand( const TCommand aCommand ) + { + iId = aCommand.iCommandId; + iPolicy = aCommand.iCaps; + iVersion = aCommand.iVersion; + iTimeout = aCommand.iTimeout; + iStatus = ECommandPending; // pending command by default + } + +// ----------------------------------------------------------------------------- +// CCommand::ConstructL +// ----------------------------------------------------------------------------- +// +void CCommand::ConstructL() + { + iCommandTimer = CMediatorCommandTimer::NewL(); + } + +// ----------------------------------------------------------------------------- +// CCommand::NewL +// ----------------------------------------------------------------------------- +// +CCommand* CCommand::NewL( const TInt aId ) + { + CCommand* self = new( ELeave ) CCommand( aId ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CCommand::NewL +// ----------------------------------------------------------------------------- +// +CCommand* CCommand::NewL( const TCommand aCommand ) + { + CCommand* self = new( ELeave ) CCommand( aCommand ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CCommand::~CCommand +// ----------------------------------------------------------------------------- +// +CCommand::~CCommand() + { + if ( iCommandTimer ) + { + iCommandTimer->Cancel(); + } + delete iCommandTimer; + } + +// ----------------------------------------------------------------------------- +// CCommand::Type +// Returns EItemCommand +// ----------------------------------------------------------------------------- +// +TItemType CCommand::Type() const + { + return EItemCommand; + } + +// ----------------------------------------------------------------------------- +// CCommand::SetTimeOut +// +// ----------------------------------------------------------------------------- +// +void CCommand::SetTimeout( TInt aTimeout ) + { + iTimeout = aTimeout; + } + +// ----------------------------------------------------------------------------- +// CCommand::TimeOut +// +// ----------------------------------------------------------------------------- +// +TInt CCommand::Timeout() const + { + return iTimeout; + } + +// ----------------------------------------------------------------------------- +// CCommand::Command +// +// ----------------------------------------------------------------------------- +// +MediatorService::TCommand CCommand::Command() const + { + MediatorService::TCommand command; + command.iCommandId = Id(); + command.iVersion = Version(); + command.iTimeout = Timeout(); + command.iCaps = Policy(); + return command; + } + +// ----------------------------------------------------------------------------- +// CCommand::SetObserver +// +// ----------------------------------------------------------------------------- +// +void CCommand::SetObserver( MMediatorCommandObserver* aObserver ) + { + iObserver = aObserver; + } + +// ----------------------------------------------------------------------------- +// CCommand::Observer +// +// ----------------------------------------------------------------------------- +// +MMediatorCommandObserver* CCommand::Observer() + { + return iObserver; + } + +// ----------------------------------------------------------------------------- +// CCommand::SetResponseObserver +// +// ----------------------------------------------------------------------------- +// +void CCommand::SetResponseObserver( MMediatorCommandResponseObserver* aObserver ) + { + iResponseObserver = aObserver; + } + +// ----------------------------------------------------------------------------- +// CCommand::ResponseObserver +// +// ----------------------------------------------------------------------------- +// +MMediatorCommandResponseObserver* CCommand::ResponseObserver() + { + return iResponseObserver; + } + +// ----------------------------------------------------------------------------- +// CCommand::StartTimer +// +// ----------------------------------------------------------------------------- +// +TInt CCommand::StartTimer( MMediatorTimerCallback* aCallBack ) + { + // Start timer + return iCommandTimer->StartTimer( aCallBack, Domain(), Category(), Id(), Timeout() ); + } + +// ----------------------------------------------------------------------------- +// CCommand::CancelTimer +// +// ----------------------------------------------------------------------------- +// +void CCommand::CancelTimer() + { + iCommandTimer->Cancel(); + } + +// ----------------------------------------------------------------------------- +// CCommand::SetStatus +// +// ----------------------------------------------------------------------------- +// +void CCommand::SetStatus( TCommandStatus aStatus ) + { + iStatus = aStatus; + } + +// ----------------------------------------------------------------------------- +// CCommand::Status +// +// ----------------------------------------------------------------------------- +// +TCommandStatus CCommand::Status() const + { + return iStatus; + } + +// End of File