diff -r 000000000000 -r f5a58ecadc66 upnp/upnpstack/serviceframework/src/upnpmoderatedeventqueuemanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnp/upnpstack/serviceframework/src/upnpmoderatedeventqueuemanager.cpp Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,213 @@ +/** @file +* Copyright (c) 2008-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: Implements algoritms for modereted events +* +*/ + + +#include "upnpmoderatedeventqueuemanager.h" +#include "upnpgenamessagefactory.h" +#include "upnpsubscriberlibraryelement.h" +#include "upnphttpmoderatedeventtransaction.h" +#include "upnpnotifytimer.h" + +// ----------------------------------------------------------------------------- +// CUpnpModeratedEventQueueManager::CUpnpModeratedEventQueueManager +// ----------------------------------------------------------------------------- +// +CUpnpModeratedEventQueueManager::CUpnpModeratedEventQueueManager( + CUpnpServiceImplementation& aServiceImpl, + CUpnpEventController& aEventController, + CUpnpSubscriberLibrary* aSubscriberLibrary + ) + :CUpnpEventQueueManagerBase( aServiceImpl, aEventController , aSubscriberLibrary ) + { + // No implementation required + } + +// ----------------------------------------------------------------------------- +// CUpnpModeratedEventQueueManager::~CUpnpModeratedEventQueueManager +// ----------------------------------------------------------------------------- +// +CUpnpModeratedEventQueueManager::~CUpnpModeratedEventQueueManager() + { + delete iModerationTimer; + } + +// ----------------------------------------------------------------------------- +// CUpnpModeratedEventQueueManager::CUpnpModeratedEventQueueManager +// ----------------------------------------------------------------------------- +// +CUpnpModeratedEventQueueManager* CUpnpModeratedEventQueueManager::NewLC( + CUpnpServiceImplementation& aServiceImpl, + CUpnpEventController& aEventController, + CUpnpSubscriberLibrary* aSubscriberLibrary + ) + { + CUpnpModeratedEventQueueManager* self = + new (ELeave) CUpnpModeratedEventQueueManager( aServiceImpl, + aEventController, + aSubscriberLibrary + ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CUpnpModeratedEventQueueManager::NewL +// ----------------------------------------------------------------------------- +// +CUpnpModeratedEventQueueManager* CUpnpModeratedEventQueueManager::NewL( + CUpnpServiceImplementation& aServiceImpl, + CUpnpEventController& aEventController, + CUpnpSubscriberLibrary* aSubscriberLibrary + ) + { + CUpnpModeratedEventQueueManager* self= + CUpnpModeratedEventQueueManager::NewLC( aServiceImpl, + aEventController, + aSubscriberLibrary ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CUpnpModeratedEventQueueManager::ConstructL +// ----------------------------------------------------------------------------- +// +void CUpnpModeratedEventQueueManager::ConstructL() + { + BaseConstructL(); + iModerationTimer = CUpnpNotifyTimer::NewL( this ); + } + +// ----------------------------------------------------------------------------- +// CUpnpModeratedEventQueueManager::StartSendingEventL +// ----------------------------------------------------------------------------- +// +void CUpnpModeratedEventQueueManager::StartSendingEventL() + { + if ( !iSubscriberLibrary->SubscriberLibrary().Count() ) + { + return; + } + + if ( iIsSending ) + { + iNewValuesWaitingToBeSend = ETrue; + return; + } + + iIsSending = ETrue; + + iCurrentSubscriberIndex = 0; + for ( TInt i = 0; i < iServiceImpl.EventedStateVariables().Count(); i++ ) + { + if ( iServiceImpl.EventedStateVariables()[i]->MaxEventRate() > 0 ) + { + iServiceImpl.EventedStateVariables()[i]->EventTick(); + } + } + + delete iBody; + iBody = NULL; + + iBody = CreateEventL( iServiceImpl.StateVariableList() ); + ClearVariables(); + + PrepareTransactionAndStartSendingL( KFirstSubscriberInQueue ); + } + +// ----------------------------------------------------------------------------- +// CUpnpModeratedEventQueueManager::SendEvent +// ----------------------------------------------------------------------------- +// +void CUpnpModeratedEventQueueManager::SendEvent() + { + if ( ! iSubscriberLibrary->SubscriberLibrary().Count() ) + { + return; + } + + iModerationTimer->Cancel(); + iModerationTimer->After( KMaxEventRate ); + } + +// ----------------------------------------------------------------------------- +// CUpnpModeratedEventQueueManager::CreateTransactionL +// ----------------------------------------------------------------------------- +// +CUpnpHttpTransaction* CUpnpModeratedEventQueueManager::CreateTransactionL( CUpnpHttpMessage* aMessage ) + { + return CUpnpHttpModeratedEventTransaction::NewL( aMessage, *this ); + } + +// ----------------------------------------------------------------------------- +// CUpnpModeratedEventQueueManager::WaitBeforeSending +// ----------------------------------------------------------------------------- +// +void CUpnpModeratedEventQueueManager::WaitBeforeSending() + { + iModerationTimer->Cancel(); + iModerationTimer->After( KMaxEventRate ); + } + +// ----------------------------------------------------------------------------- +// CUpnpModeratedEventQueueManager::FillEventBodyL +// ----------------------------------------------------------------------------- +// +TInt CUpnpModeratedEventQueueManager::FillEventBodyL( TDes8& aEvent, + const RPointerArray& aVariableList + ) + { + TInt eventableVariableCount(0); + for ( TInt i = 0; i < aVariableList.Count(); i++ ) + { + if ( aVariableList[i]->Eventable().CompareF( KYes() ) == 0 + && aVariableList[i]->ReadyForEventing() + && aVariableList[i]->IsModerated() ) + { + AddVariableToEventBody( aEvent , aVariableList[i] ); + + iServiceImpl.StateVariableEvented( aVariableList[i]->Name() ); + eventableVariableCount++; + } + } + return eventableVariableCount; + } + +// ----------------------------------------------------------------------------- +// CUpnpModeratedEventQueueManager::TimerEventL +// ----------------------------------------------------------------------------- +// +void CUpnpModeratedEventQueueManager::TimerEventL( CUpnpNotifyTimer* /*aTimer*/ ) + { + if ( iModerationTimer->iStatus.Int() == KErrNone ) + { + if ( !iIsSending ) + { + TRAPD( err ,StartSendingEventL() ); + if( err ) + { + SendingCompleted(); + } + } + else + { + WaitBeforeSending(); + } + } + } +//end of file