upnpmediaserver/contentdirectoryservice/src/upnpelementbean.cpp
author samhuttu
Mon, 01 Nov 2010 12:37:49 +0200
branchnew development branch with rendering state machine and other goodies
changeset 38 5360b7ddc251
parent 27 03808033c9a2
permissions -rw-r--r--
New development branch with e.g. rendering state machine and a simple Qt example application using it.

/** @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:  Element table data handler
*
*/



// INCLUDE FILES
#include <xmlengdom.h>
#include "upnpelementbean.h"
#include "upnpcontentdirectoryglobals.h"
#include "upnpcdutils.h"
#include <upnpelement.h>
#include <upnpobject.h>
#include <uriutils.h>
#include "upnpstring.h"

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CUpnpElementBean::CUpnpElementBean
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CUpnpElementBean::CUpnpElementBean()
{
}

// -----------------------------------------------------------------------------
// CUpnpElementBean::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CUpnpElementBean::ConstructL()
{
	iElmValue = KNullString8().AllocL();
}
// -----------------------------------------------------------------------------
// CUpnpElementBean::NewLC
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CUpnpElementBean* CUpnpElementBean::NewLC()
{
    CUpnpElementBean* self = new( ELeave ) CUpnpElementBean;
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;
}
// -----------------------------------------------------------------------------
// CUpnpElementBean::NewLC
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CUpnpElementBean* CUpnpElementBean::NewLC(const RDbRowSet& aRowSet)
{
    CUpnpElementBean* self = NewLC();
    self->SetL(aRowSet);
    return self;
}    
// -----------------------------------------------------------------------------
// CUpnpElementBean::~CUpnpElementBean
// Destructor
// -----------------------------------------------------------------------------
//
CUpnpElementBean::~CUpnpElementBean()
{
    delete iElmName;
    delete iElmValue;
}

// -----------------------------------------------------------------------------
// CUpnpElementBean::SetL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CUpnpElementBean::SetL(const RDbRowSet& aRowSet)
{
    // get cols' ids
    CDbColSet* colSet = aRowSet.ColSetL();
    CleanupStack::PushL(colSet);
    const TInt  idColNo         = colSet->ColNo(KElmIdColName);
    const TInt  nameColNo       = colSet->ColNo(KElmNameColName);
    const TInt  hasAttrColNo    = colSet->ColNo(KElmHasAttrColName);
    const TInt  objIdColNo      = colSet->ColNo(KElmObjIdColName);
    const TInt  isRequiredColNo = colSet->ColNo(KElmIsRequiredColName);
    const TInt  valueColNo      = colSet->ColNo(KElmValueColName);
    CleanupStack::PopAndDestroy(colSet);
    
    // for each column call setter
    if( idColNo != KDbNullColNo )
    {
        SetElmId( aRowSet.ColInt(idColNo) );
    }
    if( nameColNo != KDbNullColNo )
    {
        SetElmNameL( aRowSet.ColDes8(nameColNo) );
    }
    if( hasAttrColNo != KDbNullColNo )
    {
        SetElmHasAttribute( aRowSet.ColUint8(hasAttrColNo) );
    }
    if( objIdColNo != KDbNullColNo )
    {
        SetElmObjId( aRowSet.ColInt(objIdColNo) );
    }
    if( isRequiredColNo != KDbNullColNo )
    {
        SetElmIsRequired( aRowSet.ColUint8(isRequiredColNo) );
    }
    if( valueColNo != KDbNullColNo )
    {
        SetElmValueL(aRowSet, valueColNo);
    }
}
// -----------------------------------------------------------------------------
// CUpnpElementBean::SetElmNameL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CUpnpElementBean::SetElmNameL(const TDesC8& aElmName)
{
    delete iElmName;
    iElmName = NULL;
    iElmName = aElmName.AllocL();
}
// -----------------------------------------------------------------------------
// CUpnpElementBean::SetElmValueL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CUpnpElementBean::SetElmValueL(const RDbRowSet& aRowSet, const TInt aColNo)
{
    delete iElmValue;
    iElmValue = NULL;
    iElmValue = ReadLongTextColL(aRowSet, aColNo);
}
// -----------------------------------------------------------------------------
// CUpnpElementBean::SetElmValueL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CUpnpElementBean::SetElmValueL(const TDesC8& aVal)
{
	delete iElmValue;
	iElmValue = NULL;
	iElmValue = aVal.AllocL();
}
// -----------------------------------------------------------------------------
// CUpnpElementBean::ElmName
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TDesC8& CUpnpElementBean::ElmName() const
{
    return *iElmName;
}
// -----------------------------------------------------------------------------
// CUpnpElementBean::AttachToXmlElmL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TXmlEngElement CUpnpElementBean::AttachElmL(TXmlEngElement aElement) const
{
    // new element
    TXmlEngElement element;
    
    // Check if it's local name or if it has a namespace prefix also
    TInt pos = iElmName->Find( KColon8 );
    if( pos == KErrNotFound )
    { //local name
        element = aElement.AddNewElementL( *iElmName );
    }
    else    
    { //local name with prefix
        element = aElement.AddNewElementUsePrefixL( 
                    iElmName->Right( iElmName->Length() - pos - 1 ), // name
                    iElmName->Left( pos ) ); // prefix
    }

    // value     
    element.SetValueL( *iElmValue );

    return element;
}
// -----------------------------------------------------------------------------
// CUpnpElementBean::ValAsUriL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
HBufC8* CUpnpElementBean::ValAsUriL() const 
{    
    // uris have to be properly escaped
    HBufC* tmp = UpnpCdUtils::Des8ToDesLC(*iElmValue);        
    TUriParser uripar;
    uripar.Parse(*tmp);
    CUri8* uri = uri = UriUtils::ConvertToInternetFormL(uripar);
    CleanupStack::PopAndDestroy(tmp);        
    if (uri->Uri().UriDes().Length())
    {                
        HBufC8* tmp2 = UpnpString::StringReplaceL(uri->Uri().UriDes(),KHash8,KHashASCII8);        
        delete uri;
        return tmp2;                         
    }
    HBufC8* uriDes = uri->Uri().UriDes().Alloc();
    delete uri;
    return uriDes;
        
}

// -----------------------------------------------------------------------------
// CUpnpElementBean::AttachElmL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
CUpnpElement* CUpnpElementBean::AttachElmL(CUpnpObject* aObj)
{
    // create element
    CUpnpElement* elm = CUpnpElement::NewLC(*iElmName);
	
	// copy values
    elm->SetValueL(*iElmValue);

	// is required
	elm->SetIsRequired( ElmIsRequired() );
	// attach
	aObj->AddElementL(elm);
	
	// clean up
	CleanupStack::Pop(elm);
	
	return elm;
}


//  End of File