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