upnp/upnpstack/controlpointbase/src/upnpserviceinfo.cpp
changeset 0 f5a58ecadc66
child 9 e84a4b44b2e8
--- /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