diff -r 000000000000 -r f5a58ecadc66 upnp/upnpstack/serviceframework/src/upnpsubscriberlibrary.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnp/upnpstack/serviceframework/src/upnpsubscriberlibrary.cpp Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,252 @@ +/** @file +* Copyright (c) 2005-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: CUpnpSubscriberLibrary +* +*/ + + + +// INCLUDE FILES +#include "upnpsubscriberlibrary.h" +#include "upnpgenamessage.h" +#include "upnpcommonupnplits.h" +#define KLogFile _L("UPnPStack.txt") +#include "upnpcustomlog.h" +#include "upnpsubscriberlibraryobserver.h" +#include "upnpsubscriberlibraryelement.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibrary::CUpnpSubscriberLibrary +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CUpnpSubscriberLibrary::CUpnpSubscriberLibrary( + MUpnpSubscriberLibraryObserver& aObserver ) + : iObserver( aObserver ) +{ + +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibrary::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CUpnpSubscriberLibrary::ConstructL() +{ + +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibrary::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CUpnpSubscriberLibrary* CUpnpSubscriberLibrary::NewL( + MUpnpSubscriberLibraryObserver& aObserver ) +{ + CUpnpSubscriberLibrary* self = new (ELeave) CUpnpSubscriberLibrary( aObserver ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; +} + +// Destructor +CUpnpSubscriberLibrary::~CUpnpSubscriberLibrary() +{ + iElementArray.ResetAndDestroy(); + iElementArray.Close(); +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibrary::SubscriberLibrary +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +RPointerArray + CUpnpSubscriberLibrary::SubscriberLibrary() const +{ + return iElementArray; +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibrary::AddInfoL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TUpnpErrorCode CUpnpSubscriberLibrary::AddInfoL( + CUpnpGenaMessage* aMessage, + CUpnpSubscriberLibraryElement** aElement ) +{ + if ( !aMessage || !aElement ) + { + return EUndefined; + } + LOGS("CUpnpSubscriberLibrary::AddInfoL"); + + + if ( ( aMessage->Nt().Compare(KNoHeader) != 0 + || aMessage->Callback().Compare(KNoHeader) != 0 ) + && aMessage->Sid().Compare(KNoHeader) != 0 ) + { + return EBadRequest; + } + + TInt index = Find( aMessage->Sid() ); + TUpnpErrorCode error; + + if ( index != KErrNotFound ) + { + // already a subscriber -> renew + CUpnpSubscriberLibraryElement* element = iElementArray[index]; + *aElement = element; + error = element->RenewSubscriberL( aMessage ); + + return error; + } + else + { + // not found -> new subscriber + CUpnpSubscriberLibraryElement* element = + CUpnpSubscriberLibraryElement::NewL( *this ); + CleanupStack::PushL( element ); + *aElement = element; + error = element->AddSubscriberL( aMessage ); + + if ( error == EHttpOk ) + { + User::LeaveIfError(iElementArray.Append( *aElement )); + CleanupStack::Pop( element ); + } + else + { + CleanupStack::PopAndDestroy( element ); + *aElement = NULL; + } + + return error; + } +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibrary::Find +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CUpnpSubscriberLibrary::Find( const TDesC8& aSid ) +{ + if ( aSid.Length() > 0 ) + { + for ( TInt i = 0; i < iElementArray.Count(); i++ ) + { + if ( aSid.Compare( iElementArray[i]->Sid() ) == 0 ) + { + return i; + } + } + } + return KErrNotFound; +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibrary::Remove +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TUpnpErrorCode CUpnpSubscriberLibrary::Remove( const TDesC8& aSid ) +{ + LOGS("CUpnpSubscriberLibrary::Remove"); + + + TInt result = Find( aSid ); + + if ( result != KErrNotFound ) + { + CUpnpSubscriberLibraryElement* elem = iElementArray[result]; + + iElementArray.Remove( result ); + iElementArray.GranularCompress(); + + iObserver.SubscriberRemoved( elem , result ); + + delete elem; + LOGS1(" removed, count: %i", iElementArray.Count()); + + return EHttpOk; + } + return EPreconditionFailed; +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibrary::TimeoutExpiredL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpSubscriberLibrary::TimeoutExpiredL( CUpnpTimeoutElement* aElement ) +{ + + if ( !aElement ) + { + return; + } + CUpnpSubscriberLibraryElement* elem + = static_cast(aElement); + + LOGS("CUpnpSubscriberLibrary::TimeoutExpiredL"); + + switch ( elem->Renew() ) + { + case CUpnpTimeoutElement::ERenew: + { + LOGS(" is \"Infinite\", renewed"); + + elem->SetTimeout( KMaxRenewTimeout ); + } + break; + + case CUpnpTimeoutElement::EOnce: + { + for ( TInt i = 0; i < iElementArray.Count(); i++ ) + { + if ( elem == iElementArray[i] ) + { + iElementArray.Remove(i); + iElementArray.GranularCompress(); + + iObserver.SubscriberRemoved( elem, i ); + + LOGS1(" expired, count: %i", iElementArray.Count()); + delete elem; + } + } + } + break; + + default: + break; + } +} + +// End of File