upnp/upnpstack/serviceframework/src/upnpiconcontenthandler.cpp
changeset 0 f5a58ecadc66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/upnp/upnpstack/serviceframework/src/upnpiconcontenthandler.cpp	Tue Feb 02 01:12:20 2010 +0200
@@ -0,0 +1,205 @@
+/** @file
+* Copyright (c) 2007 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:  Implements the CUpnpIconContentHandler class
+ *
+*/
+
+
+#include "upnpiconcontenthandler.h"
+#include "upnpcontenthandlerscontroller.h"
+#include "upnpicon.h"
+#include "upnpdeviceliterals.h"
+
+//const TUint8 KReqiuredTagsBoundary(31) //first five bits
+enum TFlagsPositions
+    {
+    EMimetypePos = 0,
+    EWidthPos,
+    EHeightPos,
+    EDepthPos,
+    EUrlPos //all required
+    };
+
+// -----------------------------------------------------------------------------
+// CUpnpIconContentHandler::NewL
+// Two-phased constructor
+// -----------------------------------------------------------------------------
+//
+CUpnpIconContentHandler* CUpnpIconContentHandler::NewL(
+    CUpnpContentHandlersController& aController, CUpnpIcon& aResultIcon )
+    {
+    CUpnpIconContentHandler* iconContentHandler = 
+        CUpnpIconContentHandler::NewLC( aController, aResultIcon );
+    CleanupStack::Pop( iconContentHandler );
+    return iconContentHandler;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpIconContentHandler::NewLC
+// Two-phased constructor. Leaves teh object on the CleanupStack
+// -----------------------------------------------------------------------------
+//
+CUpnpIconContentHandler* CUpnpIconContentHandler::NewLC(
+    CUpnpContentHandlersController& aController, CUpnpIcon& aResultIcon )
+    {
+    CUpnpIconContentHandler* iconContentHandler = 
+        new (ELeave) CUpnpIconContentHandler( aController, aResultIcon );
+    CleanupStack::PushL( iconContentHandler );
+    return iconContentHandler;
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpIconContentHandler::~CUpnpIconContentHandler
+// Destructor of CUpnpIconContentHandler class 
+// -----------------------------------------------------------------------------
+//
+CUpnpIconContentHandler::~CUpnpIconContentHandler()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpIconContentHandler::CUpnpIconContentHandler
+// Constructor
+// -----------------------------------------------------------------------------
+//
+CUpnpIconContentHandler::CUpnpIconContentHandler(
+    CUpnpContentHandlersController& aController, CUpnpIcon& aResultIcon ) :
+    CUpnpContentHandler( aController ), iResultIcon( aResultIcon ),
+            iCurrentState( EInitial )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpIconContentHandler::OnStartElementL
+// This method is a callback to indicate an element has been parsed.
+// -----------------------------------------------------------------------------
+//
+void CUpnpIconContentHandler::OnStartElementL( const RTagInfo& aElement,
+    const RAttributeArray& /*aAttributes*/)
+    {
+    if ( EInitial == iCurrentState  )
+        {
+        const TDesC8& elementName(aElement.LocalName().DesC() );
+        if ( elementName.Compare( KUpnpMimetype ) == 0 )
+            {
+            //            RepeatedTagCheckL( EMimetypePos, iFoundTags ) NIY
+            iCurrentState = EMimeType;
+            }
+        else if ( elementName.Compare( KUpnpWidth ) == 0 )
+            {
+            //            RepeatedTagCheckL( EWidthPos, iFoundTags )    NIY
+            iCurrentState = EWidth;
+            }
+        else if ( elementName.Compare( KUpnpHeight ) == 0 )
+            {
+            //            RepeatedTagCheckL( EHeightPos, iFoundTags )   NIY
+            iCurrentState = EHeight;
+            }
+        else if ( elementName.Compare( KUpnpDepth ) == 0 )
+            {
+            //            RepeatedTagCheckL( EDepthPos, iFoundTags )    NIY
+            iCurrentState = EDepth;
+            }
+        else if ( elementName.Compare( KUpnpUrl ) == 0 )
+            {
+            //            RepeatedTagCheckL( EUrlPos, iFoundTags )      NIY
+            iCurrentState = EUrl;
+            }
+        else
+            {
+            SetIgnoreHandlerL();
+            }
+        }
+    else
+        {
+        //User::Leave( KErrArgument )    
+        SetIgnoreHandlerL();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpIconContentHandler::OnEndElementL
+// This method is a callback to indicate the end of the element has been reached.
+// -----------------------------------------------------------------------------
+//
+void CUpnpIconContentHandler::OnEndElementL( const RTagInfo& aElement )
+    {
+    switch ( iCurrentState )
+        {
+        case EInitial:
+            ASSERT( aElement.LocalName().DesC().Compare( KUpnpIcon )==0 );
+            //if ( (iFoundTags.iFlags & KReqiuredTagsBoundary) == KReqiuredTagsBoundary )
+            //{
+            iController.SetPreviousContentHandler();
+            //}
+            //else
+            //{
+            //User::Leave( KErrArgument )    //required tag not found
+            //}
+            break;
+        default:
+            iCurrentState = EInitial;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpIconContentHandler::OnContentL
+// This method is a callback that sends the content of the element.
+// -----------------------------------------------------------------------------
+//
+void CUpnpIconContentHandler::OnContentL( const TDesC8& aBytes )
+    {
+    switch ( iCurrentState )
+        {
+        case EMimeType:
+            iResultIcon.SetMimeTypeL( aBytes );
+            break;
+        case EWidth:
+            iResultIcon.SetWidthL( ParseIntL( aBytes ) );
+            break;
+        case EHeight:
+            iResultIcon.SetHeightL( ParseIntL( aBytes ) );
+            break;
+        case EDepth:
+            iResultIcon.SetDepthL( ParseIntL( aBytes ) );
+            break;
+        case EUrl:
+            iResultIcon.SetUrlL( aBytes );
+            break;
+        default:
+            ASSERT( EInitial == iCurrentState );
+            //User::Leave(KErrArgument) 
+            break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CUpnpIconContentHandler::ParseIntL
+// Parses and returns int value stored in descriptor, or leaves with KErrArgument
+// if parsing failes.
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpIconContentHandler::ParseIntL( const TDesC8& aToParse )
+    {
+    TLex8 val(aToParse);
+    TInt ret(0);
+    TInt err = val.Val( ret );
+    //    if ( err )
+    //        {
+    //        User::Leave( KErrArgument ) no error checking for now
+    //        }
+    return ret;
+    }
+
+//  End of File