PECengine/AttributeLibrary2/SrcWVAttributes/CPEngWVClientInfoConstruct.cpp
changeset 0 094583676ce7
--- /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
+
+