diff -r 000000000000 -r f5a58ecadc66 upnp/upnpstack/serviceframework/src/upnpsubscriberlibraryelement.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnp/upnpstack/serviceframework/src/upnpsubscriberlibraryelement.cpp Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,431 @@ +/** @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: CUpnpSubscriberLibraryElement +* +*/ + + + +// INCLUDE FILES +#include +#include +#include "upnpsubscriberlibraryelement.h" +#include "upnpgenamessage.h" +#include "upnpstring.h" +#include "upnpcommonupnplits.h" +#include "upnpcommonstructs.h" + +// CONSTANTS +_LIT8(KCallbackPrefix, "ConstructL(); + CleanupStack::Pop( self ); + + return self; +} + +// Destructor +CUpnpSubscriberLibraryElement::~CUpnpSubscriberLibraryElement() +{ + delete iSid; + delete iCallbackPath; + delete iTimeout; + + Cancel(); +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibraryElement::Sid +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TDesC8& CUpnpSubscriberLibraryElement::Sid() +{ + return *iSid; +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibraryElement::CallbackAddress +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInetAddr& CUpnpSubscriberLibraryElement::CallbackAddress() +{ + return iCallbackAddress; +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibraryElement::CallbackPath +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TDesC8& CUpnpSubscriberLibraryElement::CallbackPath() +{ + return *iCallbackPath; +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibraryElement::Seq +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TUint32 CUpnpSubscriberLibraryElement::Seq() const +{ + return iSeq; +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibraryElement::Timeout +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TDesC8& CUpnpSubscriberLibraryElement::Timeout() +{ + return *iTimeout; +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibraryElement::AddSubscriberL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TUpnpErrorCode CUpnpSubscriberLibraryElement::AddSubscriberL( + CUpnpGenaMessage* aMessage) + { + if (aMessage == NULL) + { + return EUndefined; + } + + // Errors: Missing or invalid CALLBACK + if (aMessage->Callback().Compare(KNoHeader) == 0) + { + return EPreconditionFailed; + } + + // Errors: Invalid NT + if (aMessage->Nt().Compare(UpnpGENA::KDefaultNt) != 0) + { + return EPreconditionFailed; + } + + TPtrC8 temp; + TPtrC8 sid(KNullDesC8); + TPtrC8 timeout; + + // only 1 address allowed with this method + temp.Set( aMessage->Callback() ); + if ( temp.Find( KCallbackPrefix ) != KErrNotFound + && temp.Length() < KUrlMaxLength ) + { + temp.Set( temp.Mid( temp.Find( KLessThan8 ) + 1 ) ); + if ( temp.Find( KGreaterThan8 ) != KErrNotFound ) + { + temp.Set( temp.Left( temp.Find( KGreaterThan8 ) ) ); + } + else + { + return EPreconditionFailed; + } + } + else + { + return EPreconditionFailed; + } + + + TPtrC8 callbackIp; + TPtrC8 callbackPort; + TPtrC8 callbackPath; + + TUriParser8 uriParser; + if ( !uriParser.Parse(temp) ) + { + callbackIp.Set( uriParser.Extract( EUriHost ) ); + if ( callbackIp == KNullDesC8() ) + { + return EPreconditionFailed; + } + callbackPort.Set( uriParser.Extract( EUriPort ) ); + if ( callbackPort == KNullDesC8() ) + { + callbackPort.Set(KDefaultHostPort); + } + callbackPath.Set( uriParser.Extract( EUriPath ) ); + } + else + { + // invalid callback + return EPreconditionFailed; + } + + temp.Set(aMessage->Timeout()); + + if (temp.Find(KTimeoutPrefix) != KErrNotFound) + { + timeout.Set( temp.Mid( temp.Find( KTimeoutPrefix) + + KTimeoutPrefix().Length() ) ); + } + else + { + // timeout according to DLNA recommendation: 300 seconds + timeout.Set(KDefaultTimeout); + } + + AddInfoL(sid, + callbackIp, + callbackPort, + callbackPath, + timeout); + + return EHttpOk; + } + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibraryElement::RenewSubscriberL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TUpnpErrorCode CUpnpSubscriberLibraryElement::RenewSubscriberL( + CUpnpGenaMessage* aMessage ) +{ + TPtrC8 temp; + // Errors: Incompatible headers (SID already found) + + if (aMessage == NULL) + { + return EUndefined; + } + + if (aMessage->Nt().Compare(KNoHeader) != 0) + { + return EBadRequest; + } + else if (aMessage->Callback().Compare(KNoHeader) != 0) + { + return EBadRequest; + } + else + { + } + + TPtrC8 timeout; + temp.Set(aMessage->Timeout()); + + if (temp.Find(KTimeoutPrefix) != KErrNotFound) + { + timeout.Set( temp.Mid( temp.Find(KTimeoutPrefix) + + KTimeoutPrefix().Length() ) ); + } + else + { + // timeout according to DLNA recommendation: 300 seconds + timeout.Set(KDefaultTimeout); + } + + SetTimeoutL(timeout); + + return EHttpOk; +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibraryElement::AddInfoL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpSubscriberLibraryElement::AddInfoL( const TDesC8& aSid, + const TDesC8& aCallbackIp, + const TDesC8& aCallbackPort, + const TDesC8& aCallbackPath, + const TDesC8& aTimeout) +{ + // Adding subscriber information + + SetSidL(aSid); + SetCallbackAddress(aCallbackIp, aCallbackPort); + SetCallbackPathL(aCallbackPath); + SetTimeoutL(aTimeout); + SetSeq(0); +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibraryElement::SetSidL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpSubscriberLibraryElement::SetSidL(const TDesC8& aSid) +{ + delete iSid; + iSid = NULL; + iSid = aSid.AllocL(); +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibraryElement::SetCallbackAddress +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpSubscriberLibraryElement::SetCallbackAddress(const TDesC8& aIp, + const TDesC8& aPort) +{ + CUpnpHttpMessage::AddrInput(iCallbackAddress, aIp); + + TLex8 lex(aPort); + TInt port; + lex.Val(port); + + iCallbackAddress.SetPort(port); + iCallbackAddress.SetFamily(KAfInet); +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibraryElement::SetCallbackPathL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpSubscriberLibraryElement::SetCallbackPathL( const TDesC8& aCallbackPath) +{ + delete iCallbackPath; + iCallbackPath = NULL; + iCallbackPath = aCallbackPath.AllocL(); +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibraryElement::SetSeq +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpSubscriberLibraryElement::SetSeq(TUint32 aSeq) +{ + iSeq = aSeq; +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibraryElement::IncreaseSeq +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpSubscriberLibraryElement::IncreaseSeq() +{ + if (iSeq < KMaxSeq) + { + iSeq++; + } + else + { + iSeq = KMinSeq; + } +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibraryElement::SetSessId +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpSubscriberLibraryElement::SetSessId(TInt aSessId) +{ + iSessId = aSessId; +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibraryElement::SessId +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CUpnpSubscriberLibraryElement::SessId() +{ + return iSessId; +} + +// ----------------------------------------------------------------------------- +// CUpnpSubscriberLibraryElement::SetTimeoutL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpSubscriberLibraryElement::SetTimeoutL(const TDesC8& /*aTimeout*/) +{ + + + + // 7.2.22.1 UPnP devices must send events to all properly subscribed + // UPnP control points. + // The device must enforce a subscription TIMEOUT value of 5 minutes. + SetTimeout( KDefaultTimeoutValue ); + SetRenew(CUpnpTimeoutElement::EOnce); + + // set text-formed timeout + delete iTimeout; + iTimeout = NULL; + iTimeout = KDefaultTimeout().AllocL(); + +} + +// End of File