--- /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 <e32base.h>
+#include <e32cons.h>
+#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<UpnpString::KMaxIntLength> 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<UpnpString::KMaxAddrOutputLength> addrBuf;
+ CUpnpHttpMessage::AddrOutput( aAddr, addrBuf );
+
+ TBuf<UpnpString::KMaxIntLength> 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