upnp/upnpstack/serviceframework/src/upnpsubscriberlibraryelement.cpp
changeset 0 f5a58ecadc66
--- /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 <e32base.h>
+#include <uri8.h> 
+#include "upnpsubscriberlibraryelement.h"
+#include "upnpgenamessage.h"
+#include "upnpstring.h"
+#include "upnpcommonupnplits.h"
+#include "upnpcommonstructs.h"
+
+// CONSTANTS
+_LIT8(KCallbackPrefix, "<http://");
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CUpnpSubscriberLibraryElement::CUpnpSubscriberLibraryElement
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CUpnpSubscriberLibraryElement::CUpnpSubscriberLibraryElement( 
+                                    MUpnpTimeoutElementParent& aParent)
+                : CUpnpTimeoutElement(aParent)
+{
+
+}
+
+// -----------------------------------------------------------------------------
+// CUpnpSubscriberLibraryElement::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CUpnpSubscriberLibraryElement::ConstructL()
+{
+    BaseConstructL();
+    iSid = HBufC8::NewL(0);
+    iCallbackPath = HBufC8::NewL(0);
+    iTimeout = HBufC8::NewL(0);
+}
+
+// -----------------------------------------------------------------------------
+// CUpnpSubscriberLibraryElement::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CUpnpSubscriberLibraryElement* CUpnpSubscriberLibraryElement::NewL(
+                                    MUpnpTimeoutElementParent& aParent )
+{
+    CUpnpSubscriberLibraryElement* self = new (ELeave) 
+                                        CUpnpSubscriberLibraryElement(aParent);
+    
+    CleanupStack::PushL( self );
+    self->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