diff -r 5f0182e07bfb -r 5456b4e8b3a8 taskswitcher/contextengine/tsfswserver/engine/src/tscpsnotifier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/taskswitcher/contextengine/tsfswserver/engine/src/tscpsnotifier.cpp Wed Sep 01 12:32:46 2010 +0100 @@ -0,0 +1,348 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Internal class definition for WidgetUI application. +* +*/ + + +#include "tscpsnotifier.h" +#include "tsfswengine.h" +#include +#include +#include +#include +#include + +_LIT8( KCPService, "Service.ContentPublishing" ); +_LIT8( KCPInterface, "IDataSource" ); + +_LIT8( KType, "type" ); +_LIT( KCpData, "cp_data" ); + +_LIT8( KPublisherId, "publisher" ); +_LIT8( KContentType, "content_type" ); +_LIT8( KContentId, "content_id" ); + +_LIT8( KGetList, "GetList"); +_LIT8( KDataMap, "data_map" ); +_LIT8( KWidgetId, "widget_id"); +_LIT8( KBitmapHandle, "bitmap_handle"); + +_LIT( KWidgetUi, "widget_ui"); +_LIT( KScreenshot, "screenshot"); + +_LIT8( KFilter, "filter" ); +_LIT8( KResults, "results"); +_LIT8( KOperation, "operation" ); +_LIT8( KRequestNotification, "RequestNotification" ); +_LIT( KUpdate, "update" ); +_LIT( K16Add, "add" ); +_LIT( KAddUpdate, "add:update" ); +_LIT8( KChangeInfo, "change_info" ); + +_LIT( KAll, "all"); + +// ================= MEMBER FUNCTIONS ======================= + +// -------------------------------------------------------------------------- +// CTSCpsNotifier::NewL +// -------------------------------------------------------------------------- +// +CTSCpsNotifier* CTSCpsNotifier::NewL(CTsFswEngine& aEngine ) + { + CTSCpsNotifier* self = new (ELeave) CTSCpsNotifier(aEngine); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// -------------------------------------------------------------------------- +// CTSCpsNotifier::~CTSCpsNotifier +// -------------------------------------------------------------------------- +// +CTSCpsNotifier::~CTSCpsNotifier() + { + TRAP_IGNORE(ExecuteRegistrationCommandL( KLiwOptCancel )); + + if( iCpsInterface ) + { + iCpsInterface->Close(); + iCpsInterface = NULL; + } + if( iServiceHandler ) + { + iServiceHandler->Reset(); + delete iServiceHandler; + iServiceHandler = NULL; + } + } + +// -------------------------------------------------------------------------- +// CTSCpsNotifier::CTSCpsNotifier +// -------------------------------------------------------------------------- +// +CTSCpsNotifier::CTSCpsNotifier(CTsFswEngine& aEngine): + iEngine(aEngine) + { + } + +// -------------------------------------------------------------------------- +// CTSCpsNotifier::ConstructL +// -------------------------------------------------------------------------- +// +void CTSCpsNotifier::ConstructL() + { + InitCpsInterfaceL(); + ExecuteRegistrationCommandL( 0 ); + } + +// -------------------------------------------------------------------------- +// CTSCpsNotifier::WidgetFilterLC +// -------------------------------------------------------------------------- +// +CLiwDefaultMap* CTSCpsNotifier::WidgetFilterLC() + { + //Create filter criteria for requested entries in form of LIW map: + CLiwDefaultMap* filter = CLiwDefaultMap::NewLC(); + filter->InsertL( KPublisherId, TLiwVariant( KWidgetUi )); + filter->InsertL( KContentType, TLiwVariant( KScreenshot )); + return filter; + } + +// -------------------------------------------------------------------------- +// CTSCpsNotifier::ExecuteRegistrationCommandL +// -------------------------------------------------------------------------- +// +void CTSCpsNotifier::ExecuteRegistrationCommandL( + TUint aOption ) + { + CLiwDefaultMap* filter = WidgetFilterLC(); + filter->InsertL( KContentId, TLiwVariant( KAll )); + filter->InsertL( KOperation, TLiwVariant( KAddUpdate )); + + CLiwGenericParamList& inParamList = iServiceHandler->InParamListL(); + CLiwGenericParamList& outParamList = iServiceHandler->OutParamListL(); + + // Fill in input list for RequestNotification command + inParamList.AppendL( TLiwGenericParam( KType, TLiwVariant( KCpData ))); + inParamList.AppendL( TLiwGenericParam( KFilter, TLiwVariant( filter ))); + + iCpsInterface->ExecuteCmdL( + KRequestNotification, + inParamList, + outParamList, + aOption, + this ); + + outParamList.Reset(); + inParamList.Reset(); + CleanupStack::PopAndDestroy( filter ); + } + +// -------------------------------------------------------------------------- +// CTSCpsNotifier::HandleNotifyL +// -------------------------------------------------------------------------- +// +TInt CTSCpsNotifier::HandleNotifyL( + TInt /*aCmdId*/, + TInt /*aEventId*/, + CLiwGenericParamList& aEventParamList, + const CLiwGenericParamList& /*aInParamList*/ ) + { + TInt pos(0); + aEventParamList.FindFirst( pos, KChangeInfo ); + if (pos != KErrNotFound) + { + // Get list of maps + TLiwVariant variant = ( aEventParamList )[pos].Value(); + variant.PushL(); + const CLiwList* changeMapsList = variant.AsList(); + + TPtrC operation; + // Iter through list content + for (TInt i = 0; i < changeMapsList->Count(); ++i) + { + if ( changeMapsList->AtL( i, variant )) + { + const CLiwMap* changeMap = variant.AsMap(); + // Check what triggered a notification + if ( changeMap->FindL( KOperation, variant )) + { + operation.Set( variant.AsDes()); + } + if (!operation.Compare(KUpdate) || !operation.Compare(K16Add)) + { + HandleWidgetUpdateL( *changeMap ); + } + } + } + CleanupStack::PopAndDestroy( &variant ); + } + return KErrNone; + } + +// -------------------------------------------------------------------------- +// CTSCpsNotifier::InitCpsInterfaceL +// -------------------------------------------------------------------------- +// +void CTSCpsNotifier::InitCpsInterfaceL() + { + if( !iServiceHandler ) + { + iServiceHandler = CLiwServiceHandler::NewL(); + } + + CLiwGenericParamList& inParam = iServiceHandler->InParamListL(); + CLiwGenericParamList& outParam = iServiceHandler->OutParamListL(); + + CLiwCriteriaItem* crit = CLiwCriteriaItem::NewLC( KLiwCmdAsStr, KCPInterface, + KCPService ); + crit->SetServiceClass( TUid::Uid(KLiwClassBase) ); + + RCriteriaArray a; + a.AppendL(crit); + iServiceHandler->AttachL( a ); + CleanupStack::Pop(crit); + iServiceHandler->ExecuteServiceCmdL( *crit, inParam, outParam ); + delete crit; + a.Reset(); + + // find service interface + TInt pos = 0; + MLiwInterface* msgInterface = NULL; + outParam.FindFirst( pos, KCPInterface ); + if ( pos != KErrNotFound ) + { + msgInterface = (outParam)[pos].Value().AsInterface(); + } + + outParam.Reset(); + inParam.Reset(); + iCpsInterface = msgInterface; + } + +// -------------------------------------------------------------------------- +// CTSCpsNotifier::HandleWidgetUpdateL +// -------------------------------------------------------------------------- +// +void CTSCpsNotifier::HandleWidgetUpdateL(const CLiwMap& aChangeMap) + { + //ectract content_id which is widget bundled name + TPtrC contentid; + TLiwVariant contentIdVar; + contentIdVar.PushL(); + if (aChangeMap.FindL(KContentId, contentIdVar)) + { + contentid.Set( contentIdVar.AsDes()); + } + + TInt widgetId(0); + TInt bitmapHandle(0); + GetWidgetDataL(contentid, widgetId, bitmapHandle); + iEngine.HandleWidgetUpdateL(widgetId, bitmapHandle ); + CleanupStack::PopAndDestroy( &contentIdVar ); + } + +// -------------------------------------------------------------------------- +// CTSCpsNotifier::GetWidgetData +// -------------------------------------------------------------------------- +// +void CTSCpsNotifier::GetWidgetDataL(const TDesC& aContentId, TInt& aWidgetId, + TInt& aBitmapHandle) + { + CLiwGenericParamList* inParamList = &iServiceHandler->InParamListL(); + CLiwGenericParamList* outParamList = &iServiceHandler->OutParamListL(); + + TLiwGenericParam type( KType, TLiwVariant( KCpData ) ); + inParamList->AppendL( type ); + + //append filter to input param + CLiwDefaultMap* filter = WidgetFilterLC(); + filter->InsertL(KContentId, TLiwVariant(aContentId)); + TLiwGenericParam item( KFilter, filter); + inParamList->AppendL( item ); + + // It is assumed that interface is already initiated + iCpsInterface->ExecuteCmdL( KGetList, *inParamList, *outParamList); + + type.Reset(); + item.Reset(); + inParamList->Reset(); + + //extracts data map + TInt pos = 0; + outParamList->FindFirst( pos, KResults ); + if( pos != KErrNotFound ) + // results present + { + //extract iterator on results list + TLiwVariant variant = (*outParamList)[pos].Value(); + CLiwIterable* iterable = variant.AsIterable(); + iterable->Reset(); + + //get next result + if( iterable->NextL( variant ) ) + { + //extract content map + CLiwDefaultMap *map = CLiwDefaultMap::NewLC(); + variant.Get( *map ); + if( map && map->FindL( KDataMap, variant) ) + { + CLiwDefaultMap *dataMap = CLiwDefaultMap::NewLC(); + variant.Get( *dataMap ); + if( dataMap ) + { + GetWidgetDataFromDataMapL(*dataMap, aWidgetId, aBitmapHandle); + } + CleanupStack::PopAndDestroy( dataMap ); + } + variant.Reset(); + CleanupStack::PopAndDestroy( map ); + } + iterable->Reset(); + } + outParamList->Reset(); + CleanupStack::PopAndDestroy( filter ); + } + +// -------------------------------------------------------------------------- +// CTSCpsNotifier::GetWidgetDataFromDataMap +// -------------------------------------------------------------------------- +// +void CTSCpsNotifier::GetWidgetDataFromDataMapL(const CLiwMap& aDataMap, + TInt& aWidgetId, TInt& aBitmapHandle) + { + TLiwVariant bitmapHandleVar; + bitmapHandleVar.PushL(); + if( aDataMap.FindL( KBitmapHandle, bitmapHandleVar )) + { + aBitmapHandle = bitmapHandleVar.AsTInt32(); + } + CleanupStack::PopAndDestroy(&bitmapHandleVar); + + TLiwVariant widgetIdVar; + widgetIdVar.PushL(); + if( aDataMap.FindL( KWidgetId, widgetIdVar )) + { + aWidgetId = widgetIdVar.AsTInt32(); + } + CleanupStack::PopAndDestroy(&widgetIdVar); + } + +// END OF FILE + + + +