--- /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 <MPEngPresenceAttrModel2.h>
+#include <E32Base.h>
+#include <S32Strm.h>
+#include <centralrepository.h>
+
+
+
+
+// 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<TPEngWVCliInfDeviceTypeValues> ( 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
+
+