PECengine/AttributeLibrary2/SrcWVAttributes/CPEngWVInfoLinkConstruct.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/AttributeLibrary2/SrcWVAttributes/CPEngWVInfoLinkConstruct.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,631 @@
+/*
+* Copyright (c) 2004 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:  WV InfoLink implementation.
+*
+*/
+
+// INCLUDE FILES
+#include "CPEngWVAttributeConstructBase.h"
+#include "CPEngWVAttributeModelBase.h"
+#include "CPEngWVInfoLinkConstruct.h"
+#include "PEngWVAttributeModelDataHelper.h"
+
+#include "MPEngXMLSerializer.h"
+#include "MPEngXMLParser.h"
+
+#include <MPEngPresenceAttrModel2.h>
+#include <PEngWVPresenceAttributes2.h>
+
+#include <E32Base.h>
+#include <S32Strm.h>
+
+
+
+//  DATA TYPES
+/**
+ * InfoLink WV CSP name table and size.
+ */
+const TWVCspAttributeNameEntry KInfoLinkCspNameTable[] =
+    {
+        {
+        EWVCspV12,
+        LIT_AS_DESC8_PTR( KInfoLinkXMLTag ),
+        LIT_AS_DESC8_PTR( KPresenceSubListAttributesNS_CSP12 )
+        }
+    };
+
+const TInt KInfoLinkCspNameTableCount = sizeof( KInfoLinkCspNameTable ) / sizeof( TWVCspAttributeNameEntry );
+
+
+
+
+// =============== CPEngWVInfoLinkConstruct MEMBER FUNCTIONS ===============
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLinkConstruct
+// C++ constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CPEngWVInfoLinkConstruct::CPEngWVInfoLinkConstruct( TPEngWVCspVersion aCurrentCspVer )
+        : CPEngWVAttributeConstructBase( aCurrentCspVer,
+                                         KInfoLinkCspNameTable,
+                                         KInfoLinkCspNameTableCount )
+    {
+    }
+
+
+// Destructor
+CPEngWVInfoLinkConstruct::~CPEngWVInfoLinkConstruct()
+    {
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::NewAttributeInstanceLC()
+// -----------------------------------------------------------------------------
+//
+MPEngPresenceAttrModelTypeImp* CPEngWVInfoLinkConstruct::NewAttributeInstanceLC(
+    TBool aUserOwnAttribute ) const
+    {
+    CPEngWVInfoLinkModel* model = new ( ELeave ) CPEngWVInfoLinkModel(
+        aUserOwnAttribute );
+    CleanupStack::PushL( model );
+    model->ResetDataL();
+    return model;
+    }
+
+
+
+
+
+
+
+// ================= CPEngWVInfoLink MEMBER FUNCTIONS =================
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLink::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CPEngWVInfoLinkConstruct::CPEngWVInfoLink*
+CPEngWVInfoLinkConstruct::CPEngWVInfoLink::NewLC()
+    {
+    CPEngWVInfoLink* self = new ( ELeave ) CPEngWVInfoLink();
+    CleanupStack::PushL( self );
+    return self;
+    }
+
+CPEngWVInfoLinkConstruct::CPEngWVInfoLink*
+CPEngWVInfoLinkConstruct::CPEngWVInfoLink::NewLC( RReadStream& aStream )
+    {
+    CPEngWVInfoLink* self = new ( ELeave ) CPEngWVInfoLink();
+    CleanupStack::PushL( self );
+    self->InternalizeL( aStream );
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLink::CPEngWVInfoLink
+// C++ constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CPEngWVInfoLinkConstruct::CPEngWVInfoLink::CPEngWVInfoLink()
+    {
+    }
+
+
+// Destructor
+CPEngWVInfoLinkConstruct::CPEngWVInfoLink::~CPEngWVInfoLink()
+    {
+    delete iInfoLink;
+    delete iInfoLinkDescr;
+    delete iInfoLinkMimeType;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLink::SetUrlL()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVInfoLinkConstruct::CPEngWVInfoLink::SetUrlL( const TDesC& aUrl )
+    {
+    DoSetDescL( iInfoLink, aUrl );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLink::SetDescriptionL()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVInfoLinkConstruct::CPEngWVInfoLink::SetDescriptionL( const TDesC& aDescr )
+    {
+    DoSetDescL( iInfoLinkDescr, aDescr );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLink::SetMimeTypeL()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVInfoLinkConstruct::CPEngWVInfoLink::SetMimeTypeL( const TDesC& aMimeType )
+    {
+    DoSetDescL( iInfoLinkMimeType, aMimeType );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLink::GetUrl()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVInfoLinkConstruct::CPEngWVInfoLink::GetUrl( TPtrC16& aUrl ) const
+    {
+    DoGetDesc( iInfoLink, aUrl );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLink::GetDescription()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVInfoLinkConstruct::CPEngWVInfoLink::GetDescription( TPtrC16& aDescr ) const
+    {
+    DoGetDesc( iInfoLinkDescr, aDescr );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLink::GetMimeType()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVInfoLinkConstruct::CPEngWVInfoLink::GetMimeType( TPtrC16& aMimeType ) const
+    {
+    DoGetDesc( iInfoLinkMimeType, aMimeType );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLink::ExternalizeSize()
+// -----------------------------------------------------------------------------
+//
+TInt CPEngWVInfoLinkConstruct::CPEngWVInfoLink::ExternalizeSize() const
+    {
+    TInt size = DoGetBufExtSize( iInfoLink );
+    size += DoGetBufExtSize( iInfoLinkDescr );
+    size += DoGetBufExtSize( iInfoLinkMimeType );
+    return size;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLink::ExternalizeL()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVInfoLinkConstruct::CPEngWVInfoLink::ExternalizeL(
+    RWriteStream& aStream ) const
+    {
+    DoExtrBufL( iInfoLink, aStream );
+    DoExtrBufL( iInfoLinkDescr, aStream );
+    DoExtrBufL( iInfoLinkMimeType, aStream );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLink::InternalizeL()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVInfoLinkConstruct::CPEngWVInfoLink::InternalizeL( RReadStream& aStream )
+    {
+    TPtr16 dataStrait( NULL, 0 );
+    DoIntrBufL( iInfoLink, dataStrait, aStream );
+    DoIntrBufL( iInfoLinkDescr, dataStrait, aStream );
+    DoIntrBufL( iInfoLinkMimeType, dataStrait, aStream );
+    }
+
+
+
+
+
+
+// ================= CPEngWVInfoLinkModel MEMBER FUNCTIONS =================
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel
+// C++ constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::CPEngWVInfoLinkModel(
+    TBool aUserOwnAttribute )
+        : CPEngWVAttributeModelBase( aUserOwnAttribute )
+    {
+    }
+
+
+// Destructor
+CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::~CPEngWVInfoLinkModel()
+    {
+    iInfoLinks.ResetAndDestroy();
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::SetDataL()
+// -----------------------------------------------------------------------------
+//
+TBool CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::SetDataL( TInt* aIntData,
+                                                                const TDesC8* /*a8Data*/,
+                                                                const TDesC16* a16Data,
+                                                                TInt aField,
+                                                                TInt aGroup )
+    {
+    TBool handled = EFalse;
+
+    if ( a16Data )
+        {
+        //Updating infoLink struct contents
+
+        if ( aGroup == iInfoLinks.Count() )
+            {
+            // initialize the cell where the new data is about to be put
+            CPEngWVInfoLink* link = CPEngWVInfoLink::NewLC();
+            handled = SetInfoLinkDataL( *link, *a16Data, aField );
+            if ( handled )
+                {
+                iInfoLinks.AppendL( link );
+                CleanupStack::Pop( link );
+                }
+            else
+                {
+                CleanupStack::PopAndDestroy( link );
+                }
+            }
+        else
+            {
+            CPEngWVInfoLink* link = iInfoLinks[ aGroup ];
+            handled = SetInfoLinkDataL( *link, *a16Data, aField );
+            }
+        }
+
+
+
+    else if ( aIntData )
+        {
+        //Editing infoLink struct amount
+        if ( ( aGroup == EPEngInfoLinkOperations ) &&
+             ( aField == EPEngInfoLinkOpDeleteGroup ) )
+            {
+            TInt index = *aIntData;
+
+            //If client gives special index -1, all existing infolinks are deleted
+            if ( index == -1 )
+                {
+                iInfoLinks.ResetAndDestroy();
+                }
+            else
+                {
+                delete iInfoLinks[ *aIntData ];
+                iInfoLinks.Remove( *aIntData );
+                }
+            handled = ETrue;
+            }
+        }
+
+    return handled;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::GetData()
+// -----------------------------------------------------------------------------
+//
+TBool CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::GetData( TInt* aIntData,
+                                                               TPtrC8* /*a8Data*/,
+                                                               TPtrC16* a16Data,
+                                                               TInt aField,
+                                                               TInt aGroup ) const
+    {
+    TBool handled = EFalse;
+
+    if ( a16Data )
+        {
+        const CPEngWVInfoLink& infoLink = *iInfoLinks[ aGroup ];
+        handled = GetInfoLinkData( infoLink, aField, *a16Data );
+        }
+
+    else if ( aIntData )
+        {
+        if ( ( aGroup == EPEngInfoLinkOperations ) &&
+             ( aField == EPEngInfoLinkOpGetGroupCount ) )
+            {
+            *aIntData = iInfoLinks.Count();
+            handled = ETrue;
+            }
+        }
+
+
+    return handled;
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::EncodeDataToXmlL()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::EncodeDataToXmlL(
+    MPEngXMLSerializer& aSerializer ) const
+    {
+    const TInt infLinkCount = iInfoLinks.Count();
+    for ( TInt ix = 0; ix < infLinkCount; ix++ )
+        {
+        const CPEngWVInfoLink& infoLink = *iInfoLinks[ ix ];
+        TPtrC16 data( NULL, 0 );
+
+        aSerializer.StartTagL( KInfoLinkXMLTagInf );
+
+        infoLink.GetUrl( data );
+        aSerializer.StartTagL( KInfoLinkXMLTagLink )
+        .UnicodeTextL( data )
+        .EndTagL( KInfoLinkXMLTagLink );
+
+        infoLink.GetDescription( data );
+        aSerializer.StartTagL( KInfoLinkXMLTagText )
+        .UnicodeTextL( data )
+        .EndTagL( KInfoLinkXMLTagText );
+
+        infoLink.GetMimeType( data );
+        aSerializer.StartTagL( KContentTypeXMLTag )
+        .UnicodeTextL( data )
+        .EndTagL( KContentTypeXMLTag );
+
+
+        aSerializer.EndTagL( KInfoLinkXMLTagInf );
+        }
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::DecodeDataFromXmlL()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::DecodeDataFromXmlL(
+    MPEngXMLParser& aParser,
+    const TDesC8& aValueBlock )
+    {
+    RArray<TPtrC8> infoLinkDataBlocks;
+    CleanupClosePushL( infoLinkDataBlocks );
+
+    iInfoLinks.ResetAndDestroy();
+
+    // parse the InfoLink attribute values
+    if ( aParser.DecodeL( aValueBlock, KInfoLinkXMLTagInf, ETrue ) )
+        {
+        const TInt resCount( aParser.Count() );
+        TInt ix;
+        for ( ix = 0; ix < resCount; ix++ )
+            {
+            User::LeaveIfError( infoLinkDataBlocks.Append( aParser.ResultL( ix ) ) );
+            }
+
+
+        for ( ix = 0; ix < resCount; ix++ )
+            {
+            TPtrC8 infoLinkBlock( infoLinkDataBlocks[ ix ] );
+            CPEngWVInfoLink* infoLink = CPEngWVInfoLink::NewLC();
+
+            TBool mandatoryFieldsFound = EFalse;
+            if ( aParser.DecodeL( infoLinkBlock, KInfoLinkXMLTagLink, EFalse ) )
+                {
+                HBufC* tmp = aParser.ResultAsUnicodeTextL();
+
+                CleanupStack::PushL( tmp );
+                infoLink->SetUrlL( *tmp );
+                CleanupStack::PopAndDestroy(); // tmp
+
+                mandatoryFieldsFound = ETrue;
+                }
+
+
+            if ( aParser.DecodeL( infoLinkBlock, KInfoLinkXMLTagText, EFalse ) )
+                {
+                HBufC* tmp = aParser.ResultAsUnicodeTextL();
+
+                CleanupStack::PushL( tmp );
+                infoLink->SetDescriptionL( *tmp );
+                CleanupStack::PopAndDestroy(); // tmp
+                }
+
+
+            if ( aParser.DecodeL( infoLinkBlock, KContentTypeXMLTag, EFalse ) )
+                {
+                HBufC* tmp = aParser.ResultAsUnicodeTextL();
+
+                CleanupStack::PushL( tmp );
+                infoLink->SetMimeTypeL( *tmp );
+                CleanupStack::PopAndDestroy(); // tmp
+                }
+
+            if ( mandatoryFieldsFound )
+                {
+                iInfoLinks.AppendL( infoLink );
+                CleanupStack::Pop( infoLink );
+                }
+            else
+                {
+                CleanupStack::PopAndDestroy( infoLink );
+                }
+            }
+        }
+
+    CleanupStack::PopAndDestroy(); // infoLinks
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::ResetDataL()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::ResetDataL()
+    {
+    iInfoLinks.ResetAndDestroy();
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::DataExternalizeSize()
+// -----------------------------------------------------------------------------
+//
+TInt CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::DataExternalizeSize() const
+    {
+    TInt dataSize = 4; // 4 is the max size of the count
+
+    const TInt infLinkCount( iInfoLinks.Count() );
+    for ( TInt ix = 0; ix < infLinkCount; ix++ )
+        {
+        dataSize += iInfoLinks[ ix ]->ExternalizeSize();
+        }
+
+    return dataSize;
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::ExternalizeDataL()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::ExternalizeDataL(
+    RWriteStream& aStream ) const
+    {
+    const TInt infLinkCount( iInfoLinks.Count() );
+    aStream << TCardinality( infLinkCount );
+
+    for ( TInt ix = 0; ix < infLinkCount; ix++ )
+        {
+        iInfoLinks[ ix ]->ExternalizeL( aStream );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::InternalizeDataL()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::InternalizeDataL(
+    RReadStream& aStream )
+    {
+    iInfoLinks.ResetAndDestroy();
+
+    TCardinality c;
+    aStream >> c;   //read the length bits
+    const TInt infLinkCount = c;
+    for ( TInt ix = 0 ; ix < infLinkCount; ix++ )
+        {
+        CPEngWVInfoLink* infoLink = CPEngWVInfoLink::NewLC( aStream );
+        User::LeaveIfError( iInfoLinks.Append( infoLink ) );
+        CleanupStack::Pop( infoLink );
+        }
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::SetInfoLinkDataL()
+// -----------------------------------------------------------------------------
+//
+TBool CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::SetInfoLinkDataL(
+    CPEngWVInfoLink& aInfoLink,
+    const TDesC16& aData,
+    TInt aInfoLinkFieldId )
+    {
+    TBool handled = EFalse;
+    switch ( aInfoLinkFieldId )
+        {
+        case EPEngInfoLinkLink:
+            {
+            aInfoLink.SetUrlL( aData );
+            handled = ETrue;
+            break;
+            }
+
+        case EPEngInfoLinkDesc:
+            {
+            aInfoLink.SetDescriptionL( aData );
+            handled = ETrue;
+            break;
+            }
+
+        case EPEngInfoLinkMimeType:
+            {
+            aInfoLink.SetMimeTypeL( aData );
+            handled = ETrue;
+            break;
+            }
+        }
+
+    return handled;
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::GetInfoLinkData()
+// -----------------------------------------------------------------------------
+//
+TBool CPEngWVInfoLinkConstruct::CPEngWVInfoLinkModel::GetInfoLinkData(
+    const CPEngWVInfoLink& aInfoLink,
+    TInt aInfoLinkFieldId,
+    TPtrC16& aData ) const
+    {
+    TBool handled = EFalse;
+    switch ( aInfoLinkFieldId )
+        {
+        case EPEngInfoLinkLink:
+            {
+            aInfoLink.GetUrl( aData );
+            handled = ETrue;
+            break;
+            }
+
+        case EPEngInfoLinkDesc:
+            {
+            aInfoLink.GetDescription( aData );
+            handled = ETrue;
+            break;
+            }
+
+        case EPEngInfoLinkMimeType:
+            {
+            aInfoLink.GetMimeType( aData );
+            handled = ETrue;
+            break;
+            }
+        }
+
+    return handled;
+    }
+
+
+//  End of File
+
+
+