diff -r 000000000000 -r 094583676ce7 PECengine/AttributeLibrary2/SrcWVAttributes/CPEngWVInfoLinkConstruct.cpp --- /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 +#include + +#include +#include + + + +// 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 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 + + +