diff -r 000000000000 -r f5a58ecadc66 upnp/upnpstack/controlpointbase/src/upnpserviceinfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnp/upnpstack/controlpointbase/src/upnpserviceinfo.cpp Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,316 @@ +/** @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: Declares ServiceInfi class. +* +*/ + + +// INCLUDE FILES + +#include +#include +#include "upnpdevice.h" +#include "upnpserviceinfo.h" +#include "upnpcontrolpoint.h" +#include "upnpcommonupnplits.h" +#include "upnpgenamessagefactory.h" + +#undef KLogFile +#define KLogFile _L("UPnPCP.txt") +#include "upnpcustomlog.h" +using namespace UpnpHTTP; + +static const TInt KSubscriptionRenewalTimeWindow = 3; +static const TInt KSubscriptionRenewalMinimalTime = 6; +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CUpnpAction::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CUpnpServiceInfo* CUpnpServiceInfo::NewLC( + CUpnpControlPoint* aControlPoint, + CUpnpService* aService ) + { + CUpnpServiceInfo* self = new (ELeave) CUpnpServiceInfo( + aControlPoint, + aService ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CUpnpServiceInfo::ConstructL +// ----------------------------------------------------------------------------- +// +void CUpnpServiceInfo::ConstructL() + { + iResubscribeTimer = CUpnpNotifyTimer::NewL( this ); + } + +// ----------------------------------------------------------------------------- +// CUpnpServiceInfo::CUpnpServiceInfo +// ----------------------------------------------------------------------------- +// +CUpnpServiceInfo::CUpnpServiceInfo( CUpnpControlPoint* aControlPoint, + CUpnpService* aService ): + iService( aService ), + iControlPoint( aControlPoint ), + iTimeOut( CUpnpControlPoint::KDefaultSubscriptionTimeout ) + { + } + +// ----------------------------------------------------------------------------- +// CUpnpServiceInfo::~CUpnpServiceInfo +// ----------------------------------------------------------------------------- +// +CUpnpServiceInfo::~CUpnpServiceInfo() + { + delete iResubscribeTimer; + delete iSid; + } + +// ----------------------------------------------------------------------------- +// CUpnpServiceInfo::TimerEventL +// Callback function +// ----------------------------------------------------------------------------- +// +void CUpnpServiceInfo::TimerEventL( CUpnpNotifyTimer* /*aTimer*/ ) + { + ResubscribeL(); + } + +// ----------------------------------------------------------------------------- +// CUpnpServiceInfo::StartTimerL +// ----------------------------------------------------------------------------- +// +void CUpnpServiceInfo::StartTimerL( const TDesC8& aTimeout ) + { + if ( aTimeout.FindC( KSeconds() ) != KErrNotFound ) + { + TLex8 lex( aTimeout ); + static const TInt KLengthOfWordSecondMinus = 7; + lex.Inc( KLengthOfWordSecondMinus ); + TInt tOutValue; + TInt err( lex.Val( tOutValue ) ); + User::LeaveIfError( err ); + iTimeOut = tOutValue; + } + else + { + iTimeOut = + CUpnpControlPoint::KDefaultSubscriptionTimeout ; + } +//prevention from too frequent subscriptions + if ( iTimeOut < KSubscriptionRenewalMinimalTime ) + { + iTimeOut = KSubscriptionRenewalMinimalTime; + } + iResubscribeTimer->AfterSeconds( + iTimeOut - KSubscriptionRenewalTimeWindow); + } + +// ----------------------------------------------------------------------------- +// CUpnpServiceInfo::SessionId +// ----------------------------------------------------------------------------- +// +TInt CUpnpServiceInfo::SessionId() + { + return iSessionId; + } + +// ----------------------------------------------------------------------------- +// CUpnpServiceInfo::Service +// ----------------------------------------------------------------------------- +// +CUpnpService* CUpnpServiceInfo::Service() + { + return iService; + } + +// ----------------------------------------------------------------------------- +// CUpnpServiceInfo::Sid +// ----------------------------------------------------------------------------- +// +const TDesC8& CUpnpServiceInfo::Sid() const + { + if ( iSid ) + { + return *iSid; + } + else + { + return KNullDesC8; + } + } + +// ----------------------------------------------------------------------------- +// CUpnpServiceInfo::SetSidL +// ----------------------------------------------------------------------------- +// +void CUpnpServiceInfo::SetSidL( const TDesC8& aSid ) + { + delete iSid; + iSid = NULL; + iSid = aSid.AllocL(); + } + +// ----------------------------------------------------------------------------- +// CUpnpServiceInfo::SetSeq +// Sets sequence +// ----------------------------------------------------------------------------- +// +void CUpnpServiceInfo::SetSeq( TUint32 aSeq ) + { + iSeq = aSeq; + } + +// ----------------------------------------------------------------------------- +// CUpnpServiceInfo::Seq +// +// ----------------------------------------------------------------------------- +// +TUint32 CUpnpServiceInfo::Seq() const + { + return iSeq; + } + +// ----------------------------------------------------------------------------- +// CUpnpServiceInfo::CreateSubscribtionMessageL +// ----------------------------------------------------------------------------- +// +CUpnpGenaMessage* CUpnpServiceInfo::CreateSubscriptionMessageL( + THTTPMsgType aType) + { + return CreateSubscriptionMessageL( *iSid, aType ); + } + +// ----------------------------------------------------------------------------- +// CUpnpServiceInfo::CreateSubscribtionMessageL +// ----------------------------------------------------------------------------- +// +CUpnpGenaMessage* CUpnpServiceInfo::CreateSubscriptionMessageL( + const TDesC8& aPath, THTTPMsgType aType) + { + CUpnpGenaMessage* result = NULL; + + TBuf8 timeoutBuf; + timeoutBuf.Num( iTimeOut ); + + CUpnpDevice& device = iService->Device(); + + TInetAddr servAddress = iService->Address(); + TPtrC8 subscribe = iService->SubscriptionUrl(); + + // check if path is not absolute + if( subscribe.Find( KHttp() ) == 0 ) + { + subscribe.Set( subscribe.Mid( KHttp().Length() ) ); + TInt slashPos = subscribe.Find( UpnpString::KSlash() ); + if( slashPos != KErrNotFound ) + { + servAddress = iControlPoint->GiveAddressL( subscribe.Left( slashPos )); + subscribe.Set( subscribe.Mid( slashPos ) ); + } + } + + switch( aType ) + { + case ESubscription: + { + result = RUpnpGenaMessageFactory::SubscribeL( + subscribe, servAddress, aPath, timeoutBuf ); + break; + } + case EResubscription: + { + result = RUpnpGenaMessageFactory::ResubscribeL( + subscribe, servAddress, aPath, timeoutBuf ); + break; + } + case EUnSubscription: + { + result = RUpnpGenaMessageFactory::UnsubscribeL( + subscribe, servAddress, aPath); + break; + } + default: + { + // Undefined. Should not come here at all! + User::Leave(KErrArgument); + break; + } + } + if(result == NULL) + { + // To avoid Coverity FORWARD_NULL errors + User::Leave(KErrArgument); + } + + result->SetType( aType ); + iSessionId = result->SessionId(); + + return result; + } + +// ----------------------------------------------------------------------------- +// CUpnpServiceInfo::ResubscribeL +// ----------------------------------------------------------------------------- +// +void CUpnpServiceInfo::ResubscribeL() + { + LOGS( "CUpnpServiceInfo::ResubscribeL - start" ); + iControlPoint->ResubscribeL( this ); + LOGS( "CUpnpServiceInfo::ResubscribeL - end" ); + } + +// ----------------------------------------------------------------------------- +// CUpnpServiceInfo::ConstructSubscribtionPathLC +// +// ----------------------------------------------------------------------------- +// +HBufC8* CUpnpServiceInfo::ConstructSubscribtionPathLC( const TDesC8& aPath, + TInetAddr& aAddr ) + { + TBuf8 addrBuf; + CUpnpHttpMessage::AddrOutput( aAddr, addrBuf ); + + TBuf port; + port.Num( aAddr.Port() ); + + HBufC8* longPath = HBufC8::NewLC( + 1 + KHTTPUrl().Length() + // "<" + addrBuf.Length() + 1 + // ":" + port.Length() + 1 + // "\" + aPath.Length() + 1 + // "\" + aPath.Length() + 1 ); // ">" + + TPtr8 longPathPtr( longPath->Des() ); + longPathPtr.Append( KLessThan8() ); + longPathPtr.Append( KHTTPUrl() ); + longPathPtr.Append( addrBuf ); + longPathPtr.Append( UpnpString::KColon() ); + longPathPtr.Append( port ); + longPathPtr.Append( UpnpString::KSlash() ); + longPathPtr.Append( aPath ); + longPathPtr.Append( UpnpString::KSlash() ); + longPathPtr.Append( aPath ); + longPathPtr.Append( KGreaterThan8() ); + + return longPath; + } + +//end of file