diff -r 000000000000 -r 094583676ce7 PECengine/AttributeLibrary2/SrcWVAttributes/CPEngWVClientInfoConstruct.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/AttributeLibrary2/SrcWVAttributes/CPEngWVClientInfoConstruct.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,638 @@ +/* +* 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 Client Info implementation. +* +*/ + +// INCLUDE FILES +#include "CPEngWVAttributeConstructBase.h" +#include "CPEngWVAttributeModelBase.h" +#include "CPEngWVClientInfoConstruct.h" +#include "PEngWVAttributeModelDataHelper.h" +#include "PresenceAttributeDefValueCRKeys.h" + + +#include "MPEngXMLSerializer.h" +#include "MPEngXMLParser.h" + +#include +#include +#include +#include + + + + +// DATA TYPES +/** + * Client Info CSP name table, + * + * @since 3.0 + */ +const TWVCspAttributeNameEntry KClientInfoCspNameTable[] = + { + { + EWVCspV11, + LIT_AS_DESC8_PTR( KClientInfoXMLTag ), + LIT_AS_DESC8_PTR( KPresenceSubListAttributesNS ) + }, + { + EWVCspV12, + LIT_AS_DESC8_PTR( KClientInfoXMLTag ), + LIT_AS_DESC8_PTR( KPresenceSubListAttributesNS_CSP12 ) + } + }; + +const TInt KClientInfoCspNameTableCount = sizeof( KClientInfoCspNameTable ) / sizeof( TWVCspAttributeNameEntry ); + + + + +/** + * Implemention restriction for maximum device detail + * field length. Used when streaming the device details. + */ +const TInt KDeviceDetailDynamicMaxLength = 512; + + + + +// =============== LOCAL HELPER FUNCTIONS =============== + +// ----------------------------------------------------------------------------- +// CenRepValueL() +// Loads device detail value from CenRep. +// ----------------------------------------------------------------------------- +// +HBufC* CenRepValueL( CRepository& aCenRep, TInt aId ) + { + HBufC* valueBuffer = HBufC::NewLC( KDeviceDetailDynamicMaxLength ); + TPtr value( valueBuffer->Des() ); + + //CenRep load status can be ignored + //If the value isn't found or it doesn't fit to max size buffer + //==> empty value is used + aCenRep.Get( aId, value ); + + HBufC* tmp = value.AllocL(); + CleanupStack::PopAndDestroy( valueBuffer ); + + return tmp; + } + + + +// =============== CPEngWVClientInfoConstruct MEMBER FUNCTIONS =============== + +// ----------------------------------------------------------------------------- +// CPEngWVClientInfoConstruct::NewL() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPEngWVClientInfoConstruct* CPEngWVClientInfoConstruct::NewL( TPEngWVCspVersion aCurrentCspVer ) + { + CPEngWVClientInfoConstruct* self = new ( ELeave ) CPEngWVClientInfoConstruct( + aCurrentCspVer ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + + + +// Destructor +CPEngWVClientInfoConstruct::~CPEngWVClientInfoConstruct() + { + delete iUserDeviceManufacturer; + delete iUserDeviceModel; + delete iUserClientProducer; + delete iUserClientVersion; + delete iUserClientLanguage; + } + + +// ----------------------------------------------------------------------------- +// CPEngWVClientInfoConstruct::CPEngWVClientInfoConstruct +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPEngWVClientInfoConstruct::CPEngWVClientInfoConstruct( TPEngWVCspVersion aCurrentCspVer ) + : CPEngWVAttributeConstructBase( aCurrentCspVer, + KClientInfoCspNameTable, + KClientInfoCspNameTableCount ) + { + } + + +// ----------------------------------------------------------------------------- +// CPEngWVClientInfoConstruct::ConstructL() +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPEngWVClientInfoConstruct::ConstructL() + { + CRepository* cenRep = CRepository::NewLC( KCRUIDPresenceAttributeDefValue ); + + iUserDeviceManufacturer = CenRepValueL( *cenRep, KPAWVClientInfoDevManufacturer ); + iUserDeviceModel = CenRepValueL( *cenRep, KPAWVClientInfoModel ); + + iUserClientProducer = CenRepValueL( *cenRep, KPAWVClientInfoClientProducer ); + + iUserClientVersion = CenRepValueL( *cenRep, KPAWVClientInfoClientVersion ); + iUserClientLanguage = CenRepValueL( *cenRep, KPAWVClientInfoLanguage ); + + CleanupStack::PopAndDestroy(); //cenRep + } + + + + +// ----------------------------------------------------------------------------- +// CPEngWVClientInfoConstruct::NewAttributeInstanceLC() +// ----------------------------------------------------------------------------- +// +MPEngPresenceAttrModelTypeImp* CPEngWVClientInfoConstruct::NewAttributeInstanceLC( + TBool aUserOwnAttribute ) const + { + CPEngWVClientInfoModel* model = new ( ELeave ) CPEngWVClientInfoModel( + *this, + aUserOwnAttribute ); + CleanupStack::PushL( model ); + model->ResetDataL(); + return model; + } + + + + +// ================= CPEngWVClientInfoModel MEMBER FUNCTIONS ================= + +// ----------------------------------------------------------------------------- +// CPEngWVClientInfoConstruct::CPEngWVClientInfoConstruct::CPEngWVClientInfoModel +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPEngWVClientInfoConstruct::CPEngWVClientInfoModel::CPEngWVClientInfoModel( + const CPEngWVClientInfoConstruct& aConstructor, + TBool aUserOwnAttribute ) + : CPEngWVAttributeModelBase( aUserOwnAttribute ), + iConstructor( aConstructor ) + { + } + + +// Destructor +CPEngWVClientInfoConstruct::CPEngWVClientInfoModel::~CPEngWVClientInfoModel() + { + delete iDeviceManufacturer; + delete iClientProducer; + delete iDeviceModel; + delete iClientVersion; + delete iClientLanguage; + } + + +// ----------------------------------------------------------------------------- +// CPEngWVClientInfoConstruct::CPEngWVClientInfoModel::GetData() +// ----------------------------------------------------------------------------- +// +TBool CPEngWVClientInfoConstruct::CPEngWVClientInfoModel::GetData( TInt* aIntData, + TPtrC8* /*a8Data*/, + TPtrC16* a16Data, + TInt aField, + TInt aGroup ) const + { + TBool handled = EFalse; + + if ( aGroup == KPEngDefaultAttrValueGroup ) + { + if ( aIntData && ( aField == EPEngCliInfDeviceType ) ) + { + *aIntData = iDeviceType; + handled = ETrue; + } + + + else if ( a16Data ) + { + switch ( aField ) //from TPEngWVClientInfoDesC16Fields + { + case EPEngCliInfDeviceManufacturer: + { + a16Data->Set( *iDeviceManufacturer ); + handled = ETrue; + break; + } + + case EPEngCliInfClientProducer: + { + a16Data->Set( *iClientProducer ); + handled = ETrue; + break; + } + + case EPEngCliInfDeviceModel: + { + a16Data->Set( *iDeviceModel ); + handled = ETrue; + break; + } + + case EPEngCliInfClientVersion: + { + a16Data->Set( *iClientVersion ); + handled = ETrue; + break; + } + + case EPEngCliInfClientLanguage: + { + a16Data->Set( *iClientLanguage ); + handled = ETrue; + break; + } + }; + } + } + + return handled; + } + + +// ----------------------------------------------------------------------------- +// CPEngWVClientInfoConstruct::CPEngWVClientInfoModel::GetData() +// ----------------------------------------------------------------------------- +// +TBool CPEngWVClientInfoConstruct::CPEngWVClientInfoModel::SetDataL( TInt* /*aIntData*/, + const TDesC8* /*a8Data*/, + const TDesC16* a16Data, + TInt aField, + TInt aGroup ) + { + TBool handled = EFalse; + + if ( aGroup == KPEngDefaultAttrValueGroup ) + { + if ( a16Data ) + { + //check the data length + if ( a16Data->Length() > KPEngMaxWVStatusTextLength ) + { + User::Leave( KErrArgument ); + } + + switch ( aField ) //from TPEngWVClientInfoDesC16Fields + { + case EPEngCliInfDeviceManufacturer: + { + DoSetDescL( iDeviceManufacturer, *a16Data ); + handled = ETrue; + break; + } + + case EPEngCliInfClientProducer: + { + DoSetDescL( iClientProducer, *a16Data ); + handled = ETrue; + break; + } + + case EPEngCliInfDeviceModel: + { + DoSetDescL( iDeviceModel, *a16Data ); + handled = ETrue; + break; + } + + case EPEngCliInfClientVersion: + { + DoSetDescL( iClientVersion, *a16Data ); + handled = ETrue; + break; + } + + case EPEngCliInfClientLanguage: + { + DoSetDescL( iClientLanguage, *a16Data ); + handled = ETrue; + break; + } + }; + } + } + + return handled; + } + + +// ----------------------------------------------------------------------------- +// CPEngWVClientInfoConstruct::CPEngWVClientInfoModel::EncodeDataToXmlL() +// ----------------------------------------------------------------------------- +// +void CPEngWVClientInfoConstruct::CPEngWVClientInfoModel::EncodeDataToXmlL( + MPEngXMLSerializer& aSerializer ) const + { + // Client type + aSerializer.StartTagL( KClientTypeXMLTag ); + { + switch ( iDeviceType ) + { + case EPEngCliDevTypeMobilePhone: + { + aSerializer.RawValueL( KClientTypeMobilePhoneXMLTag ); + break; + } + case EPEngCliDevTypeComputer: + { + aSerializer.RawValueL( KClientTypeComputerXMLTag ); + break; + } + case EPEngCliDevTypePDA: + { + aSerializer.RawValueL( KClientTypePDAXMLTag ); + break; + } + case EPEngCliDevTypeCLI: + { + aSerializer.RawValueL( KClientTypeCLIXMLTag ); + break; + } + case EPEngCliDevTypeOther: + default: + { + aSerializer.RawValueL( KClientTypeOtherXMLTag ); + break; + } + } + } + aSerializer.EndTagL( KClientTypeXMLTag ); + + // Device manufacturer + aSerializer.StartTagL( KDevManufacturerXMLTag ) + .UnicodeTextL( *iDeviceManufacturer ) + .EndTagL( KDevManufacturerXMLTag ); + + // Client Producer + aSerializer.StartTagL( KClientProducerXMLTag ) + .UnicodeTextL( *iClientProducer ) + .EndTagL( KClientProducerXMLTag ); + + // Device Model + aSerializer.StartTagL( KDeviceModelXMLTag ) + .UnicodeTextL( *iDeviceModel ) + .EndTagL( KDeviceModelXMLTag ); + + // Client version + aSerializer.StartTagL( KClientVersionXMLTag ) + .UnicodeTextL( *iClientVersion ) + .EndTagL( KClientVersionXMLTag ); + + // Client language + // Client languages are actually enumerations + // ==> empty string in XML not allowed + if ( iClientLanguage->Length() > 0 ) + { + aSerializer.StartTagL( KClientLanguageXMLTag ) + .UnicodeTextL( *iClientLanguage ) + .EndTagL( KClientLanguageXMLTag ); + } + } + + + +// ----------------------------------------------------------------------------- +// CPEngWVClientInfoConstruct::CPEngWVClientInfoModel::DecodeDataFromXmlL() +// ----------------------------------------------------------------------------- +// +void CPEngWVClientInfoConstruct::CPEngWVClientInfoModel::DecodeDataFromXmlL( + MPEngXMLParser& aParser, + const TDesC8& aValueBlock ) + { + // parse client type first + if ( aParser.DecodeL( aValueBlock, KClientTypeXMLTag, EFalse ) ) + { + if ( aParser.ResultL().CompareF( KClientTypeMobilePhoneXMLTag ) == 0 ) + { + iDeviceType = EPEngCliDevTypeMobilePhone; + } + else if ( aParser.ResultL().CompareF( KClientTypeComputerXMLTag ) == 0 ) + { + iDeviceType = EPEngCliDevTypeComputer; + } + else if ( aParser.ResultL().CompareF( KClientTypePDAXMLTag ) == 0 ) + { + iDeviceType = EPEngCliDevTypePDA; + } + else if ( aParser.ResultL().CompareF( KClientTypeCLIXMLTag ) == 0 ) + { + iDeviceType = EPEngCliDevTypeCLI; + } + else + { + iDeviceType = EPEngCliDevTypeOther; + } + } + + // Parse device manufacturer + if ( aParser.DecodeL( aValueBlock, KDevManufacturerXMLTag, EFalse ) ) + { + HBufC* tmpData = aParser.ResultAsUnicodeTextL(); + delete iDeviceManufacturer; + iDeviceManufacturer = tmpData; + } + + // Parse client producer + if ( aParser.DecodeL( aValueBlock, KClientProducerXMLTag, EFalse ) ) + { + HBufC* tmpData = aParser.ResultAsUnicodeTextL(); + delete iClientProducer; + iClientProducer = tmpData; + } + + // Parse device model + if ( aParser.DecodeL( aValueBlock, KDeviceModelXMLTag, EFalse ) ) + { + HBufC* tmpData = aParser.ResultAsUnicodeTextL(); + delete iDeviceModel; + iDeviceModel = tmpData; + } + + // Parse client version + if ( aParser.DecodeL( aValueBlock, KClientVersionXMLTag, EFalse ) ) + { + HBufC* tmpData = aParser.ResultAsUnicodeTextL(); + delete iClientVersion; + iClientVersion = tmpData; + } + + // Parse client language + if ( aParser.DecodeL( aValueBlock, KClientLanguageXMLTag, EFalse ) ) + { + HBufC* tmpData = aParser.ResultAsUnicodeTextL(); + delete iClientLanguage; + iClientLanguage = tmpData; + } + } + + + +// ----------------------------------------------------------------------------- +// CPEngWVClientInfoConstruct::CPEngWVClientInfoModel::ResetDataL() +// ----------------------------------------------------------------------------- +// +void CPEngWVClientInfoConstruct::CPEngWVClientInfoModel::ResetDataL() + { + HBufC* tmpDeviceManufacturer; + HBufC* tmpDeviceModel; + HBufC* tmpClientProducer; + HBufC* tmpClientVersion; + HBufC* tmpClientLanguage; + + + if ( iUserOwnModel ) + { + tmpDeviceManufacturer = iConstructor.iUserDeviceManufacturer->AllocLC(); + tmpDeviceModel = iConstructor.iUserDeviceModel->AllocLC(); + tmpClientProducer = iConstructor.iUserClientProducer->AllocLC(); + tmpClientVersion = iConstructor.iUserClientVersion->AllocLC(); + tmpClientLanguage = iConstructor.iUserClientLanguage->AllocLC(); + iDeviceType = EPEngCliDevTypeMobilePhone; + } + else + { + tmpDeviceManufacturer = HBufC::NewLC( 0 ); + tmpDeviceModel = HBufC::NewLC( 0 ); + tmpClientProducer = HBufC::NewLC( 0 ); + tmpClientVersion = HBufC::NewLC( 0 ); + tmpClientLanguage = HBufC::NewLC( 0 ); + iDeviceType = EPEngCliDevTypeOther; + } + + + delete iDeviceManufacturer; + delete iClientProducer; + delete iDeviceModel; + delete iClientVersion; + delete iClientLanguage; + + + + iClientLanguage = tmpClientLanguage; + CleanupStack::Pop(); //tmpClientLanguage + + iClientVersion = tmpClientVersion; + CleanupStack::Pop(); //tmpClientVersion + + iDeviceModel = tmpDeviceModel; + CleanupStack::Pop(); //tmpDeviceModel + + iClientProducer = tmpClientProducer; + CleanupStack::Pop(); //tmpClientProducer + + iDeviceManufacturer = tmpDeviceManufacturer; + CleanupStack::Pop(); //tmpDeviceManufacturer + } + + +// ----------------------------------------------------------------------------- +// CPEngWVClientInfoConstruct::CPEngWVClientInfoModel::DataExternalizeSize() +// ----------------------------------------------------------------------------- +// +TInt CPEngWVClientInfoConstruct::CPEngWVClientInfoModel::DataExternalizeSize() const + { + TInt size = 1; //iDeviceType is stored in one byte + + size += iDeviceManufacturer->Size(); + size += 4; //4 bytes for descriptor length + + size += iClientProducer->Size(); + size += 4; //4 bytes for descriptor length + + size += iDeviceModel->Size(); + size += 4; //4 bytes for descriptor length + + size += iClientVersion->Size(); + size += 4; //4 bytes for descriptor length + + size += iClientLanguage->Size(); + size += 4; //4 bytes for descriptor length + + return size; + } + + + +// ----------------------------------------------------------------------------- +// CPEngWVClientInfoConstruct::CPEngWVClientInfoModel::ExternalizeDataL() +// ----------------------------------------------------------------------------- +// +void CPEngWVClientInfoConstruct::CPEngWVClientInfoModel::ExternalizeDataL( + RWriteStream& aStream ) const + { + aStream.WriteInt8L( iDeviceType ); // device type + + aStream << iDeviceManufacturer->Left( KDeviceDetailDynamicMaxLength ); + aStream << iClientProducer->Left( KDeviceDetailDynamicMaxLength ); + aStream << iDeviceModel->Left( KDeviceDetailDynamicMaxLength ); + aStream << iClientVersion->Left( KDeviceDetailDynamicMaxLength ); + aStream << iClientLanguage->Left( KDeviceDetailDynamicMaxLength ); + } + + +// ----------------------------------------------------------------------------- +// CPEngWVClientInfoConstruct::CPEngWVClientInfoModel::InternalizeDataL() +// ----------------------------------------------------------------------------- +// +void CPEngWVClientInfoConstruct::CPEngWVClientInfoModel::InternalizeDataL( + RReadStream& aStream ) + { + iDeviceType = static_cast ( aStream.ReadInt8L() ); + + HBufC* tmpDeviceManufacturer = HBufC::NewLC( aStream, KDeviceDetailDynamicMaxLength ); + HBufC* tmpClientProducer = HBufC::NewLC( aStream, KDeviceDetailDynamicMaxLength ); + HBufC* tmpDeviceModel = HBufC::NewLC( aStream, KDeviceDetailDynamicMaxLength ); + HBufC* tmpClientVersion = HBufC::NewLC( aStream, KDeviceDetailDynamicMaxLength ); + HBufC* tmpClientLanguage = HBufC::NewLC( aStream, KDeviceDetailDynamicMaxLength ); + + delete iDeviceManufacturer; + delete iClientProducer; + delete iDeviceModel; + delete iClientVersion; + delete iClientLanguage; + + iClientLanguage = tmpClientLanguage; + CleanupStack::Pop(); //tmpClientLanguage + + iClientVersion = tmpClientVersion; + CleanupStack::Pop(); //tmpClientVersion + + iDeviceModel = tmpDeviceModel; + CleanupStack::Pop(); //tmpDeviceModel + + iClientProducer = tmpClientProducer; + CleanupStack::Pop(); //tmpClientProducer + + iDeviceManufacturer = tmpDeviceManufacturer; + CleanupStack::Pop(); //tmpDeviceManufacturer + } + + + +// End of File + +