idlehomescreen/xmluicontroller/src/contentpublisher.cpp
changeset 0 f72a12da539e
child 1 5315654608de
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/xmluicontroller/src/contentpublisher.cpp	Thu Dec 17 08:40:49 2009 +0200
@@ -0,0 +1,430 @@
+/*
+* 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 "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:  Content Publishing Service interface.
+*
+*/
+
+#include "contentpublisher.h"
+#include "globalqueryhandler.h"
+
+#include <LiwServiceHandler.h>
+#include <LiwVariant.h>
+#include <LiwGenericParam.h>
+#include <AknQueryDialog.h>
+#include <ai3xmlui.rsg>
+#include "xmluicontroller.h"
+#include <AknGlobalConfirmationQuery.h>
+#include <StringLoader.h> // StringLoader
+
+using namespace AiXmlUiController;
+
+_LIT8( KCPService, "Service.ContentPublishing" );
+_LIT8( KCPInterface, "IDataSource" );
+
+_LIT8( KType, "type" );
+_LIT( KCpData, "cp_data" );
+
+_LIT8( KPublisherId, "publisher" );
+_LIT8( KContentTypeId, "content_type" );
+_LIT8( KContentId, "content_id" );
+_LIT8( KResults, "results" );
+
+_LIT(KAI3HSPublisher,"ai3homescreen");
+_LIT(KContentType,"wideimage");
+
+_LIT8( KAPStatus, "apstatus");
+_LIT(KNetwork, "network");
+
+_LIT( KDisConnected, "disconnected");
+_LIT( KConnected, "connected");
+
+_LIT(KPublisher16, "publisher");
+
+
+_LIT8( KRequestNotification, "RequestNotification" );
+_LIT8( KDataMap, "data_map" );
+
+_LIT8( KItem, "item" );
+_LIT8( KAdd, "Add" );
+_LIT8( KGetList, "GetList" );
+_LIT8( KFilter,        "filter" );
+_LIT8( KWidth, "width");
+_LIT8( KHeight, "height");
+_LIT8( KChangeInfo,    "change_info" );
+// ============================ LOCAL FUNCTIONS ===============================
+
+
+static void DoResetAndDestroy( TAny* aPtr )
+    {
+    __ASSERT_DEBUG( aPtr, User::Invariant() );
+    reinterpret_cast< RCriteriaArray* >( aPtr )->ResetAndDestroy();
+    }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// Two-phased constructor. Can leave.
+// -----------------------------------------------------------------------------
+// 
+CContentPublisher* CContentPublisher::NewL(CXmlUiController& aUiController)
+    {
+    CContentPublisher* self = new (ELeave) CContentPublisher(aUiController);
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+//   
+CContentPublisher::~CContentPublisher()
+    {
+    TRAP_IGNORE(UnRegisterListenerL());
+    if( iCpsInterface )
+        {
+        iCpsInterface->Close();
+        iCpsInterface = NULL;
+        }
+    if( iServiceHandler )
+        {
+        iServiceHandler->Reset();
+        delete iServiceHandler;
+        iServiceHandler = NULL;
+        }
+    delete iGlobalQueryHandler;
+    delete iGlobalConfirmationQuery;    
+    }
+
+// -----------------------------------------------------------------------------
+// C++ default constructor. Must not leave.
+// -----------------------------------------------------------------------------
+//
+CContentPublisher::CContentPublisher(CXmlUiController& aUiController): iUiController( aUiController )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// 2nd phase constructor. Can leave.
+// -----------------------------------------------------------------------------
+//
+void CContentPublisher::ConstructL()
+    {
+    InitCpsInterfaceL();
+    RegisterListenerL();
+    iGlobalQueryHandler = CGlobalQueryHandler::NewL(iUiController);
+    iGlobalConfirmationQuery = CAknGlobalConfirmationQuery::NewL();
+    
+    }
+
+// -----------------------------------------------------------------------------
+// Publishes a given width and height to Content Publishing Service
+// -----------------------------------------------------------------------------
+//
+void CContentPublisher::PublishSizeL( const TDesC& aElementName,
+        TInt aWidth, TInt aHeight )
+    {
+    AddDataL( KAI3HSPublisher() ,KContentType(), aElementName,
+            aWidth, KWidth, aHeight, KHeight );
+    }
+
+// -----------------------------------------------------------------------------
+// Uses the CPS interface to add given data
+// -----------------------------------------------------------------------------
+//
+void CContentPublisher::AddDataL( 
+        const TDesC& aPublisherId, const TDesC& aContentType, const TDesC& aContentId,
+        const TInt aData1, const TDesC8& aDataKey1,
+        const TInt aData2, const TDesC8& aDataKey2 )
+    {
+    CLiwGenericParamList& inparam = iServiceHandler->InParamListL();
+    CLiwGenericParamList& outparam = iServiceHandler->OutParamListL();
+
+    TLiwGenericParam cptype( KType, TLiwVariant( KCpData ));
+    cptype.PushL();
+    
+    inparam.AppendL( cptype );
+    
+    CLiwDefaultMap* cpdatamap = CLiwDefaultMap::NewLC();
+    CLiwDefaultMap* map = CLiwDefaultMap::NewLC();
+    
+    // Add data to data map
+    map->InsertL( aDataKey1,  TLiwVariant( aData1 ));
+    map->InsertL( aDataKey2,  TLiwVariant( aData2 ));
+
+    // Create content data map
+    cpdatamap->InsertL( KPublisherId, TLiwVariant( aPublisherId ));
+    cpdatamap->InsertL( KContentTypeId, TLiwVariant( aContentType )); 
+    cpdatamap->InsertL( KContentId, TLiwVariant( aContentId ));
+    cpdatamap->InsertL( KDataMap, TLiwVariant(map) );
+            
+    TLiwGenericParam item( KItem, TLiwVariant( cpdatamap ));     
+    item.PushL(); 
+       
+    inparam.AppendL( item );
+    
+    iCpsInterface->ExecuteCmdL( KAdd , inparam, outparam);
+
+    CleanupStack::PopAndDestroy( &item );
+    CleanupStack::PopAndDestroy( map );
+    CleanupStack::PopAndDestroy( cpdatamap );
+    CleanupStack::PopAndDestroy( &cptype );
+
+    outparam.Reset();
+    inparam.Reset();
+    }
+
+// -----------------------------------------------------------------------------
+// Uses the CPS interface to get data
+// -----------------------------------------------------------------------------
+//
+void CContentPublisher::GetDataL( 
+        const TDesC& aPublisherId, const TDesC& aContentType, const TDesC& aContentId,
+        CLiwDefaultMap* aOutDataMap)
+    {
+    CLiwGenericParamList& inParamList  = iServiceHandler->InParamListL();
+	CLiwGenericParamList& outParamList = iServiceHandler->OutParamListL();
+	
+	TLiwGenericParam type( KType, TLiwVariant( KCpData ) );
+	inParamList.AppendL( type );
+	
+	CLiwDefaultMap* cpdatamap = CLiwDefaultMap::NewLC();
+
+	// Create content data map
+	cpdatamap->InsertL( KPublisherId, TLiwVariant( aPublisherId ));
+	cpdatamap->InsertL( KContentTypeId, TLiwVariant( aContentType )); 
+	cpdatamap->InsertL( KContentId, TLiwVariant( aContentId ));
+	  
+	//append filter to input param
+	TLiwGenericParam item( KFilter, TLiwVariant( cpdatamap ));
+	inParamList.AppendL( item );
+    CleanupStack::PopAndDestroy( cpdatamap );
+	 
+    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();
+		variant.PushL();
+		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->FindL( KDataMap, variant) )
+				{
+				 variant.Get( *aOutDataMap );
+				}
+			CleanupStack::PopAndDestroy( map );
+			}
+		iterable->Reset();
+		CleanupStack::PopAndDestroy( &variant );
+		variant.Reset();
+		}
+	outParamList.Reset();
+    	
+    }
+
+// -----------------------------------------------------------------------------
+// Gets the CPS messaging interface
+// -----------------------------------------------------------------------------
+//
+void CContentPublisher::InitCpsInterfaceL()
+    {
+    if( !iServiceHandler )
+        {
+        iServiceHandler = CLiwServiceHandler::NewL();
+        }
+    
+    CLiwGenericParamList& inParam = iServiceHandler->InParamListL();
+    CLiwGenericParamList& outParam = iServiceHandler->OutParamListL();
+    
+    RCriteriaArray a;
+    TCleanupItem item( DoResetAndDestroy, &a );
+    CleanupStack::PushL( item );
+    
+    CLiwCriteriaItem* crit = CLiwCriteriaItem::NewLC( KLiwCmdAsStr, KCPInterface,
+        KCPService  );
+    crit->SetServiceClass( TUid::Uid(KLiwClassBase) );
+    
+    a.AppendL(crit);    
+    
+    CleanupStack::Pop( crit );
+    
+    iServiceHandler->AttachL(a);
+    iServiceHandler->ExecuteServiceCmdL( *crit, inParam, outParam ); 
+    
+    CleanupStack::PopAndDestroy(); // item;
+        
+    // 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;
+    }
+
+void CContentPublisher::RegisterListenerL()
+	{
+	CLiwGenericParamList& inparam = iServiceHandler->InParamListL();
+	CLiwGenericParamList& outparam =  iServiceHandler->OutParamListL();
+	CLiwDefaultMap*  reqFilter = CLiwDefaultMap::NewLC();
+	
+	// Listen all the information(contentId) from publisher 
+	reqFilter->InsertL( KPublisherId, TLiwVariant( KAI3HSPublisher ));
+	reqFilter->InsertL( KContentTypeId, TLiwVariant(KPublisher16 ));
+	
+	// Type of the registry  (content registry)
+	inparam.AppendL(TLiwGenericParam(KType, TLiwVariant(KCpData)));
+	// fill in input list for RequestNotification command
+	inparam.AppendL(TLiwGenericParam(KFilter, TLiwVariant(reqFilter)));
+   
+	TRAP_IGNORE( iCpsInterface->ExecuteCmdL( 
+			KRequestNotification,
+				inparam,
+				outparam,
+				0,
+				this ) );
+	
+	outparam.Reset();
+	inparam.Reset();
+	CleanupStack::PopAndDestroy(reqFilter );  
+	}
+
+void CContentPublisher::UnRegisterListenerL()
+	{
+	CLiwGenericParamList& inparam = iServiceHandler->InParamListL();
+	CLiwGenericParamList& outparam =  iServiceHandler->OutParamListL();
+ 
+	// Unregister the reuqest notification 
+	TRAP_IGNORE( iCpsInterface->ExecuteCmdL( 
+			KRequestNotification,
+				inparam,
+				outparam,
+				KLiwOptCancel,
+				this ) ); 
+	
+	outparam.Reset();
+	inparam.Reset();
+	}
+
+TInt CContentPublisher::HandleNotifyL(
+        TInt aErrorCode,
+        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();
+    // Iter through list content
+    for (TInt i = 0; i < changeMapsList->Count() ; ++i)
+	    {
+ 		if ( changeMapsList->AtL(i, variant) ) 
+ 			{
+			const CLiwMap* map  = variant.AsMap();
+			if( map->FindL( KPublisherId, variant) )
+				 {
+				 HBufC* publisher = variant.AsDes().AllocLC();
+				 if ( publisher && ( publisher->Des() == KAI3HSPublisher ) 
+					  && map->FindL( KContentTypeId, variant) )
+					{
+					 HBufC* contentType = variant.AsDes().AllocLC();
+					 if ( contentType && ( contentType->Des() ==  KPublisher16 )
+						  && map->FindL( KContentId, variant ) )
+						 {
+						 HBufC* contentId = variant.AsDes().AllocLC();
+						 if ( contentId )
+							 {
+							 HandlePublisherInfoL( *contentId );
+							 }
+						 CleanupStack::PopAndDestroy( contentId );
+						 }
+					 CleanupStack::PopAndDestroy( contentType );
+					}
+			  CleanupStack::PopAndDestroy( publisher );
+				 }
+			}
+	   }
+    CleanupStack::PopAndDestroy(&variant); 
+    }
+   return aErrorCode;
+   }
+
+void CContentPublisher::HandlePublisherInfoL( const TDesC& aPubInfo)
+	{
+	//Currently HS will handle only network status update form publisher
+	if ( aPubInfo == KNetwork )
+		{
+		CLiwDefaultMap *outDataMap = CLiwDefaultMap::NewLC();
+		GetDataL( KAI3HSPublisher(), KPublisher16, KNetwork(), outDataMap );
+		TLiwVariant variant;
+		variant.PushL();
+		if ( outDataMap->FindL(KAPStatus, variant))
+			{
+			HBufC16* netStatus = variant.AsDes().AllocLC();
+            if ( netStatus->Des() == KDisConnected() )
+                {
+                ShowGlobalQueryL(R_QTN_HS_DISABLE_NETWORK, EFalse );
+                }
+            else if ( netStatus->Des() == KConnected() )
+                {
+                ShowGlobalQueryL(R_QTN_HS_SWITCH_ONLINE, ETrue );
+                }
+			CleanupStack::PopAndDestroy( netStatus );
+			}
+		CleanupStack::PopAndDestroy( &variant );
+		CleanupStack::PopAndDestroy(outDataMap);
+		}
+    }
+
+
+void CContentPublisher::ShowGlobalQueryL( TInt aResourceId, TBool aSetOnline )
+    {
+    if ( !iGlobalQueryHandler->IsActive() )
+        {
+        HBufC* confirmationText = StringLoader::LoadLC(aResourceId);
+        iGlobalConfirmationQuery->ShowConfirmationQueryL(
+                iGlobalQueryHandler->iStatus,
+            *confirmationText, 
+            R_AVKON_SOFTKEYS_YES_NO);
+        iGlobalQueryHandler->SetOnlineParamAndActivate(aSetOnline);
+        CleanupStack::PopAndDestroy(); //confirmationText
+        }
+    }
+// END OF FILE