PECengine/AttributeLibrary2/SrcWVAttributes/CPEngWVStatusContentModel.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/AttributeLibrary2/SrcWVAttributes/CPEngWVStatusContentModel.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,419 @@
+/*
+* 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 Status content attribute implementation.
+*
+*/
+
+// INCLUDE FILES
+#include "CPEngWVAttributeConstructBase.h"
+#include "CPEngWVAttributeModelBase.h"
+#include "CPEngWVStatusContentModel.h"
+#include "CAsync2Sync.h"
+#include "PEngWVAttributeModelDataHelper.h"
+
+
+
+#include "MPEngXMLSerializer.h"
+#include "MPEngXMLParser.h"
+
+#include <MPEngPresenceAttrModel2.h>
+#include <E32Base.h>
+#include <S32Strm.h>
+#include <imcvcodc.h>
+
+
+
+//LOCAL constants
+namespace
+    {
+    _LIT( KPEngMyLogoModelPanic, "MyLogoMod" );
+    enum TPEngMyLogoModelPanicReasons
+        {
+        EModAlreadyHasNwStatusContent,
+        EModInvalidParamsHandleNewMyLogo
+        };
+
+    void PanicStatusContModel( TPEngMyLogoModelPanicReasons aPanicReason )
+        {
+        User::Panic( KPEngMyLogoModelPanic, aPanicReason );
+        }
+    }
+
+
+// ================= CPEngWVStatusContentModel MEMBER FUNCTIONS =================
+
+// -----------------------------------------------------------------------------
+// CPEngWVStatusContentModel
+// C++ constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CPEngWVStatusContentModel::CPEngWVStatusContentModel( TBool aUserOwnAttribute )
+        : CPEngWVAttributeModelBase( aUserOwnAttribute )
+    {
+    }
+
+
+// Destructor
+CPEngWVStatusContentModel::~CPEngWVStatusContentModel()
+    {
+    delete iMyLogoData;
+    delete iMyLogoMimeType;
+    delete iMyLogoSoureFileName;
+
+    delete iStatusContentNW;
+    delete iMyLogoConverter;    //cancels the active convert if any
+    }
+
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVStatusContentModel::GetData()
+// -----------------------------------------------------------------------------
+//
+TBool CPEngWVStatusContentModel::GetData( TInt* /*aIntData*/,
+                                          TPtrC8* a8Data,
+                                          TPtrC16* a16Data,
+                                          TInt aField,
+                                          TInt aGroup ) const
+    {
+    TBool handled = EFalse;
+
+    if ( aGroup == KPEngDefaultAttrValueGroup )
+        {
+        if ( a16Data && ( aField == EPEngMyLogoDirectContentSourceFileName ) )
+            {
+            DoGetDesc( iMyLogoSoureFileName, *a16Data );
+            handled = ETrue;
+            }
+
+
+        if ( a8Data && ( aField == EPEngMyLogoDirectContentBuffer ) )
+            {
+            DoGetDesc( iMyLogoData, *a8Data );
+            handled = ETrue;
+            }
+        }
+
+    return handled;
+    }
+
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVStatusContentModel::SetDataL()
+// -----------------------------------------------------------------------------
+//
+TBool CPEngWVStatusContentModel::SetDataL( TInt* /*aIntData*/,
+                                           const TDesC8* a8Data,
+                                           const TDesC16* a16Data,
+                                           TInt aField,
+                                           TInt aGroup )
+    {
+    CAsync2Sync* wait = CAsync2Sync::NewLC();
+
+    TBool handled = CPEngWVStatusContentModel::SetDataAsyncL( a8Data,
+                                                              a16Data,
+                                                              wait->RequestStatus(),
+                                                              aField,
+                                                              aGroup );
+    if ( handled )
+        {
+        wait->WaitToComplete();
+
+        //handle all other errors than the cancel by leaving
+        TInt status = wait->RequestStatus().Int();
+        User::LeaveIfError( status );
+        }
+
+    CleanupStack::PopAndDestroy( wait );
+
+    return handled;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVStatusContentModel::SetDataAsyncL()
+// -----------------------------------------------------------------------------
+//
+TBool CPEngWVStatusContentModel::SetDataAsyncL( const TDesC8* a8Data,
+                                                const TDesC16* a16Data,
+                                                TRequestStatus& aRequestStatus,
+                                                TInt aField,
+                                                TInt aGroup )
+    {
+    TBool handled = EFalse;
+
+    if ( aGroup == KPEngDefaultAttrValueGroup )
+        {
+        if ( a16Data && ( aField == EPEngMakeMyLogoDirectContentFromFile ) )
+            {
+            __ASSERT_ALWAYS( !iMyLogoConverter, User::Leave( KErrInUse ) );
+            iMyLogoConverter = CPEngMyLogoConverter::FileNewL( *a16Data, *this );
+            iMyLogoConverter->IssueConvert( aRequestStatus );
+            handled = ETrue;
+            }
+
+
+        else if ( a8Data && ( aField == EPEngMakeMyLogoDirectContentFromBuffer ) )
+            {
+            __ASSERT_ALWAYS( !iMyLogoConverter, User::Leave( KErrInUse ) );
+            iMyLogoConverter = CPEngMyLogoConverter::DataNewL( *a8Data, *this );
+            iMyLogoConverter->IssueConvert( aRequestStatus );
+            handled = ETrue;
+            }
+        }
+
+    return handled;
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVStatusContentModel::CancelSetDataAsync()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVStatusContentModel::CancelSetDataAsync()
+    {
+    delete iMyLogoConverter; //Deleting converter cancels it
+    iMyLogoConverter = NULL;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVStatusContentModel::EncodeDataToXmlL()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVStatusContentModel::EncodeDataToXmlL(
+    MPEngXMLSerializer& aSerializer ) const
+    {
+    TPtrC8 logoData( NULL, 0 );
+    TPtrC8 logoMimeType( NULL, 0 );
+
+    DoGetDesc( iMyLogoData, logoData );
+    DoGetDesc( iMyLogoMimeType, logoMimeType );
+
+
+    if ( ( logoData.Length() > 0 ) && ( logoMimeType.Length() > 0 ) )
+        {
+        //Image & mime type for image are available
+        //==>serialize them to XML
+        aSerializer.StartTagL( KDirectContentXMLTag ).
+        Base64DataL( logoData ).
+        EndTagL( KDirectContentXMLTag );
+
+        aSerializer.StartTagL( KContentTypeXMLTag )
+        .RawValueL( logoMimeType )
+        .EndTagL( KContentTypeXMLTag );
+        }
+
+    else
+        {
+        //write empty data
+        aSerializer.StartTagL( KDirectContentXMLTag ).EndTagL( KDirectContentXMLTag );
+        aSerializer.StartTagL( KContentTypeXMLTag ).EndTagL( KContentTypeXMLTag );
+        }
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVStatusContentModel::DecodeDataFromXmlL()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVStatusContentModel::DecodeDataFromXmlL( MPEngXMLParser& aParser,
+                                                    const TDesC8& aValueBlock )
+    {
+    __ASSERT_ALWAYS( !iStatusContentNW ,
+                     PanicStatusContModel( EModAlreadyHasNwStatusContent ) );
+
+
+    TPtrC8 mimeType( NULL, 0 );
+    TPtrC8 statusContent( NULL, 0 );
+
+    if ( aParser.DecodeL( aValueBlock, KContentTypeXMLTag, EFalse ) )
+        {
+        mimeType.Set( aParser.ResultL() );
+
+        if ( aParser.DecodeL( aValueBlock, KDirectContentXMLTag, EFalse ) )
+            {
+            statusContent.Set( aParser.ResultL() );
+            }
+        }
+
+    //Is status content MyLogo?
+    if ( ( mimeType.CompareF( KPEngWVMyLogoMimeJpeg ) == 0 ) ||
+         ( mimeType.CompareF( KPEngWVMyLogoMimeImageGif ) == 0 ) )
+        {
+
+        //statusContent length is big enough for decoded image
+        //data, because in BASE64 decoding the result shrinks
+        iStatusContentNW = HBufC8::NewL( statusContent.Length() );
+        TPtr8 imageDataNW = iStatusContentNW->Des();
+
+        TImCodecB64 base64Decoder;
+        base64Decoder.Initialise();
+
+        // Decode returns EFalse, if no more data is needed for decoding
+        //==> in that case the decoding was succesful
+        TBool decodeOk = !base64Decoder.Decode( statusContent, imageDataNW );
+        if ( decodeOk )
+            {
+            iStatusContentNW = iStatusContentNW->ReAllocL( iStatusContentNW->Length() );
+            }
+        else
+            {
+            delete iStatusContentNW;
+            iStatusContentNW = NULL;
+            }
+        }
+
+
+    if ( !iStatusContentNW )
+        {
+        ResetDataL();
+        }
+    else
+        {
+        //there is some raw content. Verify & convert it to valid MyLogo
+        TRAPD( err, CheckReceivedStatusContentL() );
+        if ( err == KErrNoMemory )
+            {
+            User::Leave( KErrNoMemory );
+            }
+
+        else if ( ( err != KErrNone ) &&
+                  ( err != KErrCancel ) )
+            {
+            ResetDataL();
+            }
+        }
+
+    delete iStatusContentNW;
+    iStatusContentNW = NULL;
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVStatusContentModel::ResetDataL()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVStatusContentModel::ResetDataL()
+    {
+    delete iMyLogoSoureFileName;
+    delete iMyLogoMimeType;
+    delete iMyLogoData;
+
+    iMyLogoSoureFileName = NULL;
+    iMyLogoMimeType = NULL;
+    iMyLogoData = NULL;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVStatusContentModel::DataExternalizeSize()
+// -----------------------------------------------------------------------------
+//
+TInt CPEngWVStatusContentModel::DataExternalizeSize() const
+    {
+    TInt size = DoGetBufExtSize( iMyLogoData );
+    size += DoGetBufExtSize( iMyLogoMimeType );
+    size += DoGetBufExtSize( iMyLogoSoureFileName );
+
+    return size;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVStatusContentModel::ExternalizeDataL()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVStatusContentModel::ExternalizeDataL( RWriteStream& aStream ) const
+    {
+    DoExtrBufL( iMyLogoData, aStream );
+    DoExtrBufL( iMyLogoMimeType, aStream );
+    DoExtrBufL( iMyLogoSoureFileName, aStream );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVStatusContentModel::InternalizeDataL()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVStatusContentModel::InternalizeDataL( RReadStream& aStream )
+    {
+    TPtr8 typeStrait8( NULL, 0 );
+    DoIntrBufL( iMyLogoData, typeStrait8, aStream );
+    DoIntrBufL( iMyLogoMimeType, typeStrait8, aStream );
+
+    TPtr16 typeStrait16( NULL, 0 );
+    DoIntrBufL( iMyLogoSoureFileName, typeStrait16, aStream );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVStatusContentModel::CheckReceivedStatusContentL()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVStatusContentModel::CheckReceivedStatusContentL()
+    {
+    CAsync2Sync* wait = CAsync2Sync::NewLC();
+    iMyLogoConverter = CPEngMyLogoConverter::DataNewL( *iStatusContentNW, *this );
+    iMyLogoConverter->IssueConvert( wait->RequestStatus() );
+    wait->WaitToComplete();
+    User::LeaveIfError( wait->RequestStatus().Int() );
+    CleanupStack::PopAndDestroy( wait );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVStatusContentModel::HandleNewMyLogo()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVStatusContentModel::HandleNewMyLogo( HBufC8* aImageData,
+                                                 HBufC8* aImageMimeType,
+                                                 HBufC* aImageSoureFileName )
+    {
+    __ASSERT_ALWAYS( aImageData && aImageMimeType && aImageSoureFileName,
+                     PanicStatusContModel( EModInvalidParamsHandleNewMyLogo ) );
+
+    //This must take ownership of the given HBufC's in all cases
+    //so no leaving allowed
+    delete iMyLogoData;
+    delete iMyLogoMimeType;
+    delete iMyLogoSoureFileName;
+
+    iMyLogoData = aImageData;
+    iMyLogoMimeType = aImageMimeType;
+    iMyLogoSoureFileName = aImageSoureFileName;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngWVStatusContentModel::HandleConverterDestroy()
+// -----------------------------------------------------------------------------
+//
+void CPEngWVStatusContentModel::HandleConverterDestroy()
+    {
+    iMyLogoConverter = NULL;
+    }
+
+
+
+//  End of File
+
+