--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ccservices/cmsservices/cmsengine/Client/src/cmspresencedata.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,421 @@
+/*
+* Copyright (c) 2007 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:
+*
+*
+*/
+
+
+// INCLUDES
+#include <fbs.h>
+#include <s32mem.h>
+#include <bitdev.h>
+#include <mbsaccess.h>
+#include <cbsbitmap.h>
+#include <cbsfactory.h>
+#include "cmssession.h"
+#include <AknIconUtils.h>
+#include "cmspresencedata.h"
+#include "cmscommondefines.h"
+
+#include <presencetrafficlights.mbg>
+#include "presencetrafficlighticons.h"
+
+#include <contactpresencebrandids.h>
+
+// This must be in line with contactpresence.dll implementation
+_LIT( KPresenceTrafficLightsMif, "\\resource\\apps\\presencetrafficlights.mif" );
+
+// ----------------------------------------------------
+// CCmsPresenceData::CCmsPresenceData
+//
+// ----------------------------------------------------
+//
+CCmsPresenceData::CCmsPresenceData( RCmsContact& aContact )
+ : iElementIdText(NULL), iContact( aContact )
+ {
+
+ }
+
+// ----------------------------------------------------
+// CCmsPresenceData::NewL
+//
+// ----------------------------------------------------
+//
+CCmsPresenceData* CCmsPresenceData::NewL( RCmsContact& aContact )
+ {
+ CCmsPresenceData* self = new ( ELeave ) CCmsPresenceData( aContact );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+// ----------------------------------------------------
+// CCmsPresenceData::ConstructL
+//
+// ----------------------------------------------------
+//
+void CCmsPresenceData::ConstructL()
+ {
+ }
+
+// ----------------------------------------------------
+// CCmsPresenceData::~CCmsPresenceData
+//
+// ----------------------------------------------------
+//
+EXPORT_C CCmsPresenceData::~CCmsPresenceData()
+ {
+ //The client owns these two guys
+ //delete iMask;
+ //delete iBitmap;
+ delete iBrandId;
+ delete iBrandedText;
+ delete iUserIdentity;
+ delete iElementIdText;
+ delete iElementIdImage;
+ }
+
+// ----------------------------------------------------
+// CCmsPresenceData::Mask
+//
+// ----------------------------------------------------
+//
+EXPORT_C CFbsBitmap* CCmsPresenceData::Mask() const
+ {
+ return iMask;
+ }
+
+// ----------------------------------------------------
+// CCmsPresenceData::~CCmsPresenceData
+//
+// ----------------------------------------------------
+//
+EXPORT_C CFbsBitmap* CCmsPresenceData::Bitmap() const
+ {
+ return iBitmap;
+ }
+
+// ----------------------------------------------------
+// CCmsPresenceData::CompilePresenceDataL
+//
+// ----------------------------------------------------
+//
+EXPORT_C TInt CCmsPresenceData::PreparePresenceDataL( TSize aBitmapSize )
+ {
+ #ifdef _DEBUG
+ RCmsSession::WriteToLog( _L8( "CCmsPresenceData::PreparePresenceDataL()" ) );
+ #endif
+ TInt error = KErrNotFound;
+ CBSFactory* factory = CreateBrandingFactoryL();
+ if( factory )
+ {
+ CleanupStack::PushL( factory );
+
+ //reset brand text here
+ delete iBrandedText;
+ iBrandedText = NULL;
+
+ if ( !iBrandId->Des().Length() )
+ {
+ // presence cache is reset
+ iMask = new ( ELeave ) CFbsBitmap();
+ iBitmap = new ( ELeave ) CFbsBitmap();
+ }
+ else if ( iBrandId->Des().Compare( KTrafficLightService ) )
+ {
+ error = DoGetIconFromBrandSrvL( *factory, aBitmapSize );
+ }
+ else
+ {
+ error = DoGetIconFromFileL( aBitmapSize );
+ }
+ CleanupStack::PopAndDestroy(factory); //factory
+ }
+ return error;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CCmsPresenceIconHandler::ElementIdImage
+//
+// ---------------------------------------------------------------------------
+//
+TPtrC8 CCmsPresenceData::ElementIdImage()
+ {
+ return iElementIdImage ? iElementIdImage->Des() : TPtrC8();
+ }
+
+// ---------------------------------------------------------------------------
+// CCmsPresenceIconHandler::CreateBrandingFactoryL
+//
+// ---------------------------------------------------------------------------
+//
+CBSFactory* CCmsPresenceData::CreateBrandingFactoryL()
+ {
+ CBSFactory* factory = NULL;
+ if( iBrandId )
+ {
+ factory = CBSFactory::NewL( KCPBrandDefaultId, KCPBrandAppId );
+ }
+ else
+ {
+ #ifdef _DEBUG
+ RCmsSession::WriteToLog( _L8( " Brand ID is NULL, cannot create branding factory" ) );
+ #endif
+ }
+ return factory;
+ }
+
+// ---------------------------------------------------------------------------
+// CCmsPresenceIconHandler::CopyBitmapL
+//
+// ---------------------------------------------------------------------------
+//
+CFbsBitmap* CCmsPresenceData::CopyBitmapL( CFbsBitmap& aBitmap )
+ {
+ // Create a temporary bitmap
+ CFbsBitmap* newBitmap = new( ELeave ) CFbsBitmap();
+ CleanupStack::PushL( newBitmap );
+ User::LeaveIfError( newBitmap->Create( aBitmap.SizeInPixels(), aBitmap.DisplayMode() ) );
+ // Create a bitmap device
+ CFbsBitmapDevice* device = CFbsBitmapDevice::NewL( newBitmap );
+ CleanupStack::PushL( device );
+ // Create a bitmap context
+ CBitmapContext* context = NULL;
+ User::LeaveIfError( device->CreateBitmapContext( context ) );
+ CleanupStack::PushL( context );
+ // Copy contents of aBitmap into the new bitmap
+ context->BitBlt( TPoint( 0,0 ), &aBitmap );
+ CleanupStack::PopAndDestroy( 2 ); // context, device
+ CleanupStack::Pop(); //newBitmap
+ return newBitmap;
+ }
+
+// ----------------------------------------------------
+// CCmsPresenceData::BrandedText
+//
+// ----------------------------------------------------
+//
+EXPORT_C TPtrC CCmsPresenceData::BrandedText() const
+ {
+ return iBrandedText ? iBrandedText->Des() : TPtrC();
+ }
+
+// ----------------------------------------------------
+// CCmsPresenceData::UserIdentity
+//
+// ----------------------------------------------------
+//
+EXPORT_C TPtrC8 CCmsPresenceData::UserIdentity() const
+ {
+ return iUserIdentity ? iUserIdentity->Des() : TPtrC8();
+ }
+
+// ----------------------------------------------------
+// CCmsPresenceData::ServiceType
+//
+// ----------------------------------------------------
+//
+EXPORT_C TUint32 CCmsPresenceData::ServiceType() const
+ {
+ return ( TUint32 )iServiceType;
+ }
+
+// ----------------------------------------------------
+// CCmsPresenceData::AssignDataL
+//
+// ----------------------------------------------------
+//
+void CCmsPresenceData::AssignDataL( TInt aFieldType, const TDesC8& aFieldData )
+ {
+ #ifdef _DEBUG
+ RCmsSession::WriteToLog( _L8( "CCmsPresenceData::AssignDataL()" ) );
+ #endif
+ switch( aFieldType )
+ {
+ case KPresenceDataBrandId:
+ delete iBrandId;
+ iBrandId = NULL;
+ iBrandId = aFieldData.AllocL();
+ break;
+ case KPresenceDataElementTextId:
+ delete iElementIdText;
+ iElementIdText = NULL;
+ iElementIdText = aFieldData.AllocL();
+ break;
+ case KPresenceDataElementImageId:
+ delete iElementIdImage;
+ iElementIdImage = NULL;
+ iElementIdImage = aFieldData.AllocL();
+ break;
+ case KPresenceDataLanguageId:
+ {
+ TLex8 lex( aFieldData );
+ lex.Val( iLanguageId );
+ }
+ break;
+ case KPresenceDataServiceType:
+ {
+ TLex8 lex( aFieldData );
+ lex.Val( iServiceType );
+ }
+ break;
+ case KPresenceDataUserIdentity:
+ delete iUserIdentity;
+ iUserIdentity = NULL;
+ iUserIdentity = aFieldData.AllocL();
+ break;
+ default:
+ break;
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CCmsPresenceIconHandler::DoGetIconFromBrandSrvL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CCmsPresenceData::DoGetIconFromBrandSrvL( CBSFactory& aFactory, TSize aBitmapSize )
+ {
+ TLanguage userLang = User::Language();
+ TLanguage defLang = ELangInternationalEnglish;
+
+ //Search for BrandPackage using PhoneLanguage
+ //PhoneLanguage gets the Highest Priority
+ TRAPD(err, DoGetIconFromBrandSrvL( aFactory, aBitmapSize, ( TLanguage ) userLang ));
+
+ if ( ( err ) && ( iLanguageId != KErrNotFound ) && ( iLanguageId != userLang ) )
+ {
+ //The next priority goes to BrandLanguage set in the SpSettings/service table
+ //during provisioning
+ //Search for BrandPackage using this BrandLanguage
+ TRAP( err, DoGetIconFromBrandSrvL( aFactory, aBitmapSize, ( TLanguage ) iLanguageId ) );
+ }
+
+
+ if ( ( err ) && ( userLang != defLang ) && ( iLanguageId != defLang ) )
+ {
+ //Fetching of brand with UserLang & with the one mentioned in the Servicetable
+ //was not successfull.
+ //Finally try with Default Language ID and even if this fails
+ //proceed without any brand icons/texts
+ TRAP( err, DoGetIconFromBrandSrvL( aFactory, aBitmapSize, ( TLanguage ) defLang ) );
+ }
+
+ return err;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CCmsPresenceIconHandler::DoGetIconFromBrandSrvL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CCmsPresenceData::DoGetIconFromBrandSrvL( CBSFactory& aFactory, TSize aBitmapSize, TLanguage aLanguage )
+ {
+ TInt error = KErrNone;
+
+ MBSAccess* access = aFactory.CreateAccessLC( iBrandId->Des(), ( TLanguage )aLanguage );
+
+ CFbsBitmap* mask = NULL;
+ CFbsBitmap* bitmap = NULL;
+
+ TRAP( error, access->GetBitmapL( ElementIdImage(), bitmap, mask ) );
+ if( KErrNone == error )
+ {
+ CleanupStack::PushL( mask );
+ CleanupStack::PushL( bitmap );
+ AknIconUtils::SetSize( mask, aBitmapSize );
+ AknIconUtils::SetSize( bitmap, aBitmapSize );
+ iMask = CopyBitmapL( *mask );
+ iBitmap = CopyBitmapL( *bitmap );
+ CleanupStack::PopAndDestroy( 2 ); //bitmap, mask
+ }
+ else
+ {
+ //instantiate bitmaps
+ iMask = new ( ELeave ) CFbsBitmap();
+ iBitmap = new ( ELeave ) CFbsBitmap();
+ }
+
+ delete iBrandedText;
+ iBrandedText = NULL;
+ if ( iElementIdText && iElementIdText->Length() )
+ {
+ iBrandedText = access->GetTextL( iElementIdText->Des() );
+ }
+
+ CleanupStack::PopAndDestroy(); //access
+ return error;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CCmsPresenceIconHandler::DoGetIconFromFileL
+//
+// ---------------------------------------------------------------------------
+//
+TInt CCmsPresenceData::DoGetIconFromFileL( TSize aBitmapSize )
+ {
+ TInt error = KErrNone;
+
+ CFbsBitmap *bitmap = NULL;
+ CFbsBitmap *mask = NULL;
+
+ TInt bitmapId(0);
+ TInt maskId(0);
+
+ if ( !(ElementIdImage().CompareF( KTrafficOnline )))
+ {
+ bitmapId = EMbmPresencetrafficlightsQgn_prop_im_friend_on;
+ maskId = EMbmPresencetrafficlightsQgn_prop_im_friend_on_mask;
+ }
+ else if ( !(ElementIdImage().CompareF( KTrafficOffline )))
+ {
+ bitmapId = EMbmPresencetrafficlightsQgn_prop_im_friend_off;
+ maskId = EMbmPresencetrafficlightsQgn_prop_im_friend_off_mask;
+ }
+ else
+ {
+ }
+
+ TRAP(error, AknIconUtils::CreateIconL(
+ bitmap,
+ mask,
+ KPresenceTrafficLightsMif,
+ bitmapId,
+ maskId));
+
+ if ( error )
+ {
+ //instantiate bitmaps
+ iMask = new ( ELeave ) CFbsBitmap();
+ iBitmap = new ( ELeave ) CFbsBitmap();
+ }
+ else
+ {
+ AknIconUtils::SetSize( bitmap, aBitmapSize );
+ AknIconUtils::SetSize( mask, aBitmapSize );
+ iBitmap = bitmap;
+ iMask = mask;
+ }
+
+ return error;
+
+ }
+
+// End of File