homescreenpluginsrv/hspsmanager/client/hspsrequestclient.cpp
changeset 0 79c6a41cd166
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenpluginsrv/hspsmanager/client/hspsrequestclient.cpp	Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,599 @@
+/*
+* 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:  Client-side API implementation of Client Request Services of
+*                hsps Application Management Service APIs. 
+*                For details, see hspsThemeManagement.h.
+*
+*
+*/
+
+
+#include <e32svr.h>
+#include <s32strm.h>
+#include <s32mem.h>
+#include <e32cmn.h> 
+#include <f32file.h>
+#include <s32file.h>
+
+#include "hspsrequestclient.h"
+#include "hspsodt.h"
+#include "hspsresource.h"
+#include "hspsresult.h"
+#include "hspsreqnotifparam.h"
+#include "hspsdomdocument.h"
+#include "hspsdomnode.h"
+#include "hspsdomdepthiterator.h"
+#include "hsps_builds_cfg.hrh"
+#ifdef _hsps_PERFORMANCE_TEST_
+#include "hspstimemon.h"
+#endif
+
+#ifdef HSPS_LOG_ACTIVE
+#include <hspslogbus.h>
+#endif
+
+_LIT( KPrivateFolderPrefix, "c:\\private\\" ); 
+_LIT( KDoubleBackSlash, "\\" );
+
+// ========================= MEMBER FUNCTIONS ==================================
+
+// -----------------------------------------------------------------------------
+// ChspsRequestClient::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+EXPORT_C ChspsRequestClient* ChspsRequestClient::NewL( MhspsClientRequestServiceObserver& aObserver )
+    {
+    ChspsRequestClient* self = NewLC( aObserver );
+    CleanupStack::Pop( self );
+    return( self ) ;
+    }
+
+// -----------------------------------------------------------------------------
+// ChspsRequestClient::NewLC()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+EXPORT_C ChspsRequestClient* ChspsRequestClient::NewLC( MhspsClientRequestServiceObserver& aObserver )
+    {
+#ifdef _hsps_PERFORMANCE_TEST_
+    ChspsTimeMon::PrintUserMem( _L("ChspsRequestClient::NewLC(): - initialising..") );
+#endif//_hsps_PERFORMANCE_TEST_
+    ChspsRequestClient* self = new ( ELeave ) ChspsRequestClient( aObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+#ifdef _hsps_PERFORMANCE_TEST_
+    ChspsTimeMon::PrintUserMem( _L("CLIENT: - ChspsRequestClient::NewLC(): - done.") );
+#endif//_hsps_PERFORMANCE_TEST_    
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// ChspsRequestClient::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void ChspsRequestClient::ConstructL()
+    {
+#ifdef HSPS_LOG_ACTIVE
+    if( iLogBus )
+        {
+        iLogBus->LogText( _L( "ChspsRequestClient::ConstructL(): - connecting to hspsThemeServer .." ) );
+        }
+#endif
+    
+    User::LeaveIfError( iSession.Connect() );
+
+#ifdef HSPS_LOG_ACTIVE
+    if( iLogBus )
+        {
+        iLogBus->LogText( _L( "ChspsRequestClient::ConstructL(): - connected." ) );
+        }
+#endif
+    
+    iODTValid = EFalse;
+    iResult = ChspsResult::NewL();
+    iReqNotifParams = ChspsRequestNotificationParams::NewL();
+    }
+
+// -----------------------------------------------------------------------------
+// ChspsRequestClient::ChspsRequestClient()
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+ChspsRequestClient::ChspsRequestClient( MhspsClientRequestServiceObserver& aObserver)
+    : CActive( EPriorityStandard ), iObserver( aObserver )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// -----------------------------------------------------------------------------
+// ChspsRequestClient::~ChspsRequestClient()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+ChspsRequestClient::~ChspsRequestClient()
+    {
+    Cancel(); // Causes call to DoCancel()
+    iSession.Close();
+    delete iElement;
+    delete iResult;
+    delete iReqNotifParams;
+    }
+
+// -----------------------------------------------------------------------------
+// ChspsRequestClient::hspsGetODT()
+// Sends a request to the server for getting ODT for application.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C ThspsServiceCompletedMessage ChspsRequestClient::hspsGetODT(TInt aAppUid, ChspsODT& aODT)
+    {
+    ThspsServiceCompletedMessage ret = EhspsGetODTFailed;
+    
+    iODTValid = EFalse;    
+    
+    // Cancel any possibly outstanding requests
+   // hspsCancelGetODTUpdate();
+
+   
+    // Input validation
+    if ( aAppUid > 0 )
+    	{
+        	        
+	    // Trying to find a theme configuration with the specified application uid,
+	    // active theme is not known yet (fetched from cenrep at server side)
+	    ThspsConfiguration configuration;
+	    configuration.rootUid = aAppUid;
+	    configuration.themeUid = 0;
+	    configuration.type = EhspsAppConfiguration;
+	    
+	    // Retrieve the application configuration	    
+	    TRAPD( err, CallGetOdtInFileL( configuration, aODT ) );
+	    if ( !err )
+	        {
+	        ret = EhspsGetODTSuccess;    
+	        }
+    	}
+           
+    return ret;
+    }
+    
+// -----------------------------------------------------------------------------
+// ChspsRequestClient::hspsGetODTUpdate()
+// Sends a request to the server
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C ThspsServiceCompletedMessage ChspsRequestClient::hspsGetODTUpdate()
+    {
+    ThspsServiceCompletedMessage ret = EhspsServiceRequestError;
+    
+    iResult->ResetData();
+    iReqNotifParams->ResetData();
+    
+    if ( !IsActive() && iODTValid )
+        {
+        iStatus = KRequestPending;
+        SetActive();          
+                
+        
+        iSession.GetODTUpdate( iResultData, iReqNotifData, iHeaderData,  iStatus );
+        
+#ifdef _hsps_PERFORMANCE_TEST_
+    ChspsTimeMon::PrintUserMem( _L("ChspsRequestClient::hspsGetODTUpdate(): - theme changes subscribed.") );
+#endif//_hsps_PERFORMANCE_TEST_
+        ret = EhspsServiceRequestSheduled; 
+        }
+    else
+    	{
+#ifdef HSPS_LOG_ACTIVE
+    	if( iLogBus )
+    	    {
+    	    if ( iODTValid )
+    	        {
+                iLogBus->LogText( _L( "ChspsRequestClient::hspsGetODTUpdate(): - error, theme is not valid." ) );
+                }
+    	    else
+    	        {
+    	        iLogBus->LogText( _L( "ChspsRequestClient::hspsGetODTUpdate(): - error, allready subscribed." ) );
+    	        }
+    	    }
+#endif
+		ret = EhspsServiceRequestError; 
+    	}
+
+    return ret;
+    } 
+    
+    
+// -----------------------------------------------------------------------------
+// ChspsRequestClient::hspsCancelGetODTUpdate()
+// Sends a cancel request to the server ...
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+
+EXPORT_C ThspsServiceCompletedMessage ChspsRequestClient::hspsCancelGetODTUpdate()
+    {
+    ThspsServiceCompletedMessage ret = EhspsServiceRequestCanceled; 
+    iResult->ResetData();
+    iReqNotifParams->ResetData();
+    if ( IsActive() )
+        {
+        Cancel();
+        
+#ifdef HSPS_LOG_ACTIVE
+	    if( iLogBus )
+	        {
+	        iLogBus->LogText( _L( "ChspsRequestClient::hspsCancelGetODTUpdate(): - subscription cancelled." ) );
+	        }
+#endif
+        
+        ret = EhspsServiceRequestCanceled;
+        }
+    return ret; 
+    }   
+
+
+// -----------------------------------------------------------------------------
+// ChspsRequestClient::hspsAccessResourceFile()
+// Sends a request to the server to get access to a resource file
+// Access a private file in the hspsThemeServer private area
+// This function cooperates with the server to get a file handle
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C ThspsServiceCompletedMessage ChspsRequestClient::hspsAccessResourceFile( 
+		const TDesC& aResourceFileName, 
+		const ThspsConfiguration& aConfiguration, 
+		RFile& aFile )
+    {                    
+#ifdef HSPS_LOG_ACTIVE
+    if( iLogBus )
+        {
+        iLogBus->LogText( 
+            _L( "ChspsRequestClient::hspsAccessResourceFile(): - %S." ),
+            &aResourceFileName 
+            );
+        }
+#endif   
+    
+    // Get the file handle and fileserver handle for the file we want from the server
+    TInt fileSubSessionHandle;
+    TInt fileServerHandle = iSession.AccessResourceFile( 
+    		iResultData, 
+    		aConfiguration, 
+    		aResourceFileName, 
+    		fileSubSessionHandle);
+                            
+    // If we got valid handles
+    TInt errorCode = KErrNotFound;
+    if ( fileServerHandle > 0 && fileSubSessionHandle > 0 )
+        {
+        // Adopt the file
+        errorCode = aFile.AdoptFromServer( fileServerHandle, fileSubSessionHandle );
+        }            
+    
+    ThspsServiceCompletedMessage ret = EhspsServiceRequestError;
+    if ( !errorCode )
+        {
+        // Success
+        UpdatehspsResult();
+        ret = EhspsAccessResourceFileSuccess;
+        }
+    else
+        {         
+        // Failure        
+        iResult->iSystemError = errorCode;
+        iResult->iXuikonError = errorCode;
+        }
+    
+    return ret;
+    } 
+     
+// -----------------------------------------------------------------------------
+// ChspsRequestClient::GethspsResultL
+// Fetch latest result data on service request return.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void ChspsRequestClient::GethspsResult(ChspsResult& aResult)
+    {
+    aResult.iSystemError = iResult->iSystemError; 
+    aResult.iXuikonError = iResult->iXuikonError; 
+    aResult.iIntValue1 = iResult->iIntValue1;
+    aResult.iIntValue2 = iResult->iIntValue2;  
+    }  
+             
+// -----------------------------------------------------------------------------
+// ChspsRequestClient::SetLogBus
+// Set log bus.
+// -----------------------------------------------------------------------------
+#ifdef HSPS_LOG_ACTIVE
+EXPORT_C void ChspsRequestClient::SetLogBus( void* aLogBus )
+    {
+    iLogBus = (ChspsLogBus*)aLogBus;
+    }
+#else
+EXPORT_C void ChspsRequestClient::SetLogBus( void* /*aLogBus*/ )
+    {
+    }
+#endif
+
+// -----------------------------------------------------------------------------
+// ChspsRequestClient::UpdatehspsResultL
+// Constructs hspsResult-object from return data.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void ChspsRequestClient::UpdatehspsResult()
+    {
+    TInt errorCode = KErrNone;
+    if ( iResultData.Length() )
+    	{
+	    RDesReadStream readBuf( iResultData );
+	    TRAP( errorCode, iResult->InternalizeL( readBuf ) );
+	    readBuf.Close();
+	    if ( errorCode )
+	    	{
+	    	iResult->ResetData();
+	    	}
+    	}
+    else
+    	{
+    	iResult->ResetData();
+    	}
+    }  
+
+// -----------------------------------------------------------------------------
+// ChspsRequestClient::UpdatehspsResultL
+// Constructs hspsResult-object from return data.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void ChspsRequestClient::UpdatehspsReqNotifParams()
+    {
+    TInt errorCode = KErrNone;
+    if ( iReqNotifData.Length() )
+    	{
+	    RDesReadStream readBuf(iReqNotifData);
+	    TRAP (errorCode, iReqNotifParams->InternalizeL(readBuf));
+	    readBuf.Close();
+	    if ( errorCode )
+	    	{
+	    	iReqNotifParams->ResetData();
+	    	}
+    	}
+    else
+    	{
+    	iReqNotifParams->ResetData();
+    	}
+    }  
+
+// -----------------------------------------------------------------------------
+// ChspsRequestClient::CallGetOdtInFileL()
+// -----------------------------------------------------------------------------
+//
+void ChspsRequestClient::CallGetOdtInFileL( 		
+		const ThspsConfiguration& aConfiguration, 
+		ChspsODT& aODT )
+    {
+    iODT = &aODT;         
+    HBufC8* requestData = aODT.MarshalHeaderL();
+    CleanupStack::PushL(requestData);
+        
+    TFileName odtPath;
+    ThspsServiceCompletedMessage ret = (ThspsServiceCompletedMessage) iSession.GetODT( 
+    			iResultData, 
+    			aConfiguration, 
+    			requestData->Des(), 
+    			odtPath );    
+    
+    CleanupStack::Pop(requestData); 
+    delete requestData;
+    
+    if ( ret != EhspsGetODTSuccess )
+        {
+        User::Leave( EhspsGetODTFailed );
+        }
+    
+    // Constructs or resets iResult -object from iResultData data
+    UpdatehspsResult();
+    
+    iODTValid = ETrue;
+    
+    // Get a handle to the file object
+    RFile odtfile;
+    ret = hspsAccessResourceFile( odtPath, aConfiguration, odtfile );
+    if ( ret != EhspsAccessResourceFileSuccess )
+        {
+        User::Leave( EhspsAccessResourceFileFailed );
+        }        
+    CleanupClosePushL( odtfile );
+    
+    // set stream on file
+    CFileStore* store = CDirectFileStore::FromLC( odtfile );
+    RStoreReadStream instream;
+    CleanupClosePushL( instream );
+
+    // stream in the ODT
+	instream.OpenLC( *store, store->Root() );	
+	instream >> aODT;
+    
+    CleanupStack::PopAndDestroy( 2, &instream ); // stream object and instream
+	CleanupStack::PopAndDestroy( 2, &odtfile ); // store, odtfile     
+      
+    // copy resources if found
+	if( aODT.ResourceCount() )
+		{        		
+		/* c:\\private\\"application uid"\\resources\\ */
+		TPath destinationPath( KPrivateFolderPrefix );
+		destinationPath.AppendNum( aODT.RootUid(), EHex ); 	// application uid
+		destinationPath.Append( KDoubleBackSlash );
+
+		// Copy resource files        		 
+		ret = (ThspsServiceCompletedMessage)iSession.CopyResourceFiles( 
+		             iResultData, 
+		             odtPath, 
+		             destinationPath );
+		if( ret != EhspsResourceCopySuccess )
+			{
+			User::Leave( EhspsResourceCopyFailed );
+			}
+		}        
+    }
+ 
+// -----------------------------------------------------------------------------
+// ChspsRequestClient::RunError
+// From CActive. Called when error occurred in asynchronous request
+// Notifies the observer
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt ChspsRequestClient::RunError( TInt aError )
+    {
+    iResult->iSystemError = aError;
+    iResult->iXuikonError = aError;
+    TRAPD( err, iObserver.HandlehspsRequestClientMessageL( EhspsServiceRequestError, *iReqNotifParams) ) ;
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// ChspsRequestClient::RunL()
+// Invoked to handle responses from the server.
+// -----------------------------------------------------------------------------
+//
+void ChspsRequestClient::RunL()
+    {
+    switch ( iStatus.Int() )
+        {
+        case EhspsGetODTUpdateSuccess:
+        	{
+            // server informs that the update process has completed successfully
+            UpdatehspsResult();
+            UpdatehspsReqNotifParams();
+            // inform observer
+            iObserver.HandlehspsRequestClientMessageL(EhspsGetODTUpdateSuccess, *iReqNotifParams);
+        	}
+            break;   
+            
+        case EhspsGetODTUpdateFailed:
+        	{
+            // server informs that the update process has failed
+            UpdatehspsResult();
+            UpdatehspsReqNotifParams();
+            // inform observer
+            iObserver.HandlehspsRequestClientMessageL(EhspsGetODTUpdateFailed, *iReqNotifParams);
+        	}
+            break;        
+             
+        case EhspsGetODTUpdateStatus:
+        	{
+            // server ask to reload the theme, possible activation lost or other change in status
+#ifdef HSPS_LOG_ACTIVE
+            if( iLogBus )
+                {
+                iLogBus->LogText( _L( "ChspsRequestClient::RunL(): - EhspsGetODTUpdateStatus received." ) );
+                }
+#endif
+            
+            UpdatehspsResult();
+            UpdatehspsReqNotifParams();
+            // inform observer
+            iObserver.HandlehspsRequestClientMessageL(EhspsGetODTUpdateStatus, *iReqNotifParams);
+        	}
+            break;   
+            
+        case EhspsGetODTUpdateHot:
+        case EhspsSetActivePluginSuccess:
+        	{
+            // hot update, new theme available on server, reload
+#ifdef HSPS_LOG_ACTIVE
+            if( iLogBus )
+                {
+                iLogBus->LogText( _L( "ChspsRequestClient::RunL(): - EhspsGetODTUpdateHot received." ) );
+                }
+#endif
+            
+            UpdatehspsResult();
+            UpdatehspsReqNotifParams();
+            // inform observer
+            iObserver.HandlehspsRequestClientMessageL(EhspsGetODTUpdateHot, *iReqNotifParams);
+        	}
+            break;   
+
+        case EhspsGetODTUpdateEmpty:
+        	{
+        	UpdatehspsResult();
+        	UpdatehspsReqNotifParams();
+        	// no update available
+            iObserver.HandlehspsRequestClientMessageL(EhspsGetODTUpdateEmpty, *iReqNotifParams);
+        	}
+            break ;
+            
+        case EhspsServiceRequestCanceled:
+            // the request was canceled
+            // flow through
+        case EhspsServiceNotSupported:
+        	{
+            // the request was not supported
+            UpdatehspsResult();
+            UpdatehspsReqNotifParams();
+            iObserver.HandlehspsRequestClientMessageL(EhspsServiceRequestCanceled, *iReqNotifParams);
+        	}
+            break;        
+        case EhspsSettingsUpdated:
+        	{
+            // server informs that the update process has completed successfully
+            UpdatehspsResult();
+            UpdatehspsReqNotifParams();
+            // inform observer
+            iObserver.HandlehspsRequestClientMessageL(EhspsSettingsUpdated, *iReqNotifParams);
+        	}
+            break;
+        case EhspsSetPluginSettingsSuccess:    
+        case EhspsAddPluginSuccess:
+        case EhspsReplacePluginSuccess:
+        case EhspsRemovePluginSuccess:
+            {
+            // server informs that the update process has completed successfully
+            UpdatehspsResult();
+            UpdatehspsReqNotifParams();
+            // inform observer
+            iObserver.HandlehspsRequestClientMessageL(EhspsGetODTUpdateHot, *iReqNotifParams);
+            }
+            break;
+        default:
+        	{
+            UpdatehspsResult();
+            UpdatehspsReqNotifParams();
+            iObserver.HandlehspsRequestClientMessageL(EhspsServiceRequestError, *iReqNotifParams);
+        	}
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// ChspsRequestClient::DoCancel()
+// Cancels any outstanding operation.
+// -----------------------------------------------------------------------------
+//
+void ChspsRequestClient::DoCancel()
+    {
+    // rootUid (application or interface uid) is not used at the server side, thus passed as zero
+    const TInt rootUid = 0;
+    iSession.CancelRequest( (TInt) EhspsCancelGetODTUpdate, iResultData, rootUid );
+    iResult->ResetData();
+    iReqNotifParams->ResetData();
+    }
+    
+// End of File