locationcentre/lcservice/src/lcsyncoperation.cpp
branchRCL_3
changeset 16 4721bd00d3da
parent 14 3a25f69541ff
child 21 e15b7f06eba6
--- a/locationcentre/lcservice/src/lcsyncoperation.cpp	Wed Apr 14 15:50:30 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,544 +0,0 @@
-/*
-* 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:  Handles all the Synchronous operations with the Location
-*                Centre Client Session
-*
-*/
-
-
-// SYSTEM INCLUDES
-#include <s32mem.h>
-
-// USER INCLUDES
-#include "lcsyncoperation.h"
-#include "lcclientsession.h"
-#include "lcipcparams.h"
-#include "lcdebug.h"
-
-// CONSTANT DEFINTIONS
-const TInt  KLcLengthofInteger  = 4;
-
-// ----- Member funtions for LcSyncOperation ---------------------------------
-
-// ---------------------------------------------------------------------------
-// CLcLocationAppInfoArray* CLcServiceImpl::GetLocationApplicationsL
-// ---------------------------------------------------------------------------
-//    
-CLcLocationAppInfoArray* LcSyncOperation::GetLocationApplicationsL(
-											  RLcClientSession&   	aSession,
-							            const TLcLocationAppFilter& aLocationAppFilter )
-    {
-    DEBUG("+ LcSyncOperation::GetLocationApplicationsL")
-    DEBUG("Filtering")
-    
-    // This function needs to obtain a list of all applications. This would
-    // first require to obtain the length of the buffer that needs to be
-    // passed from the client to the server to pack the array.
-    CBufFlat* lengthBuf = CBufFlat::NewL( KLcLengthofInteger );
-    CleanupStack::PushL( lengthBuf );
-    
-    // Set the size of this buffer to 4. This is required because we dont
-    // actually fill this buffer but expect the server to fill it. In that case
-    // if we dont set the expected length, the server would fail with
-    // KrrBadDescriptor.
-    lengthBuf->ResizeL( KLcLengthofInteger );
-    
-    // Fill the IPC argument structure with the Length buffer, the server
-    // will write the data onto this buffer.
-    TIpcArgs    args;
-    
-    // Pass the filter parameters to the Location Centre Server
-    TPckg< TLcLocationAppFilter >    filterBuffer( aLocationAppFilter );
-    
-    // By the IPC exchange parameter defintion, this must be the first
-    // argument to the IPC message.
-    args.Set( 0, &filterBuffer );
-    
-    // Set the buffer pointer to the start of the Length buffer
-    TPtr8 bufPtr( const_cast< TUint8 *>( lengthBuf->Ptr( 0 ).Ptr()),
-                  0,
-                  KLcLengthofInteger );
-    
-    // This will be the second argument passed to this IPC message.
-    args.Set( 1, &bufPtr);
-    
-    // Send a synchrnous message to the server to obtain the length. On return the
-    // server is expected to pack the length of the Application information
-    // arrays in the LengthBuffer pointer.
-    User::LeaveIfError( aSession.SendReceive( ELcFilteredAppsBufferLength, args ));
-
-    // If the server has not set the buffer then leave with KErrNotFound
-    if ( !bufPtr.Length())
-        {
-        User::Leave( KErrNotFound );
-        }
-    
-    // Obtain the length from the Length buffer;
-    RBufReadStream  readStream( *lengthBuf, 0 );
-    CleanupClosePushL( readStream );
-    TUint length = readStream.ReadInt32L();
-    CleanupStack::PopAndDestroy( 2, lengthBuf );   // readStream
-    
-    // If the server has returned a length of 0, then there are no applications
-    // registered with Location Centre.
-    if ( !length )
-        {
-        User::Leave( KErrNotFound );
-        }
-    
-    // Now that the length has been obtained. Allocate the descriptor
-    // of suitable length and send it across to the server.
-    CBufFlat* appInfoBuf = CBufFlat::NewL( length );
-    CleanupStack::PushL( appInfoBuf );
-    
-    // Set the actual size to 'length' obtained in the previous IPC. This is required
-    // because we dont actually fill this buffer but expect the server to fill it.
-    // In that case if we dont set the expected length, the server would fail with
-    // KrrBadDescriptor.
-    appInfoBuf->ResizeL( length );
-    
-    // Fill the IPC argument structure with the Application info buffer, the server
-    // will write the data onto this buffer.
-    
-    // Pass the filter parameters to the Location Centre Server
-    // By the IPC exchange parameter defintion, this must be the first
-    // argument to the IPC message.
-    args.Set( 0, &filterBuffer );
-    
-    // Set the buffer pointer to the start of the Length buffer
-    bufPtr.Set( const_cast< TUint8 *>( appInfoBuf->Ptr( 0 ).Ptr()),
-                0,
-                length );
-    
-    // This will be the second argument passed to this IPC message.
-    args.Set( 1, &bufPtr);
-    
-    // Send a synchrnous message to the server to obtain the length. On return the
-    // server is expected to pack the length of the Application information
-    // arrays in the LengthBuffer pointer.
-    TInt error =  aSession.SendReceive( ELcFilteredApps, args );
-    
-	// If the Retrieval function completes with KErrOverflow then there has been
-	// an update to the registry since the time we obtained the length.
-	if ( KErrOverflow == error )
-		{
-		// Cleanup the current state and Re-issue the same request again
-		CleanupStack::PopAndDestroy( appInfoBuf );
-		return GetLocationApplicationsL( aSession, aLocationAppFilter );
-		}
-	else if( error )
-		{
-		User::Leave( error );
-		}
-
-    // If the server has not set the buffer then leave with KErrNotFound
-    if ( !bufPtr.Length())
-        {
-        User::Leave( KErrNotFound );
-        }
-        
-    // Parse the Application information array to obtain the array
-    RBufReadStream  appReadStream( *appInfoBuf, 0 );
-    CleanupClosePushL( appReadStream );
-    
-    CLcLocationAppInfoArray* array = ParseLocAppBufferL( appReadStream );
-    
-    CleanupStack::PopAndDestroy( 2, appInfoBuf );   // appReadStream
-
-    DEBUG("- LcSyncOperation::GetLocationApplicationsL")
-    
-    return array;
-
-    }
-
-// ---------------------------------------------------------------------------
-// CLcLocationAppInfoArray* LcSyncOperation::GetLocationApplicationsL
-// ---------------------------------------------------------------------------
-//     
-CLcLocationAppInfoArray* LcSyncOperation::GetLocationApplicationsL(
-                                      RLcClientSession&   		aSession,
-                                      const RArray<TPtrC>&      aAppArray,
-                                            TBool               aIncludeFlag )
-    {
-        
-    // Obtain the array of Application Identifiers in a buffer
-    RLcIpcAppIdArray        idArray;
-    CleanupStack::PushL( TCleanupItem( RLcIpcAppIdArray::ResetAndDestroyIdArray, &idArray ));
-    
-    // Append all the identifiers to the Array    
-    for ( TInt i = 0; i < aAppArray.Count(); i++ )
-        {
-        // Create a new element
-        HBufC* newElement = HBufC::NewLC( aAppArray[i].Length());
-        
-        // Copy the contents to the buffer and append it to the array
-        newElement->Des().Copy( aAppArray[i] );
-        User::LeaveIfError( idArray.Append( newElement ));
-        
-        // Now that the ownership is transferred, the content can be removed from
-        // the Cleanup stack
-        CleanupStack::Pop();
-        }
-    
-    // Create the buffer for packing the Application Information
-    // structure and pack the contents into this buffer
-    CBufFlat* buffer = CBufFlat::NewL( idArray.BufferLength());
-    CleanupStack::PushL( buffer );
-    
-    RBufWriteStream writeStream( *buffer, 0 );
-    CleanupClosePushL( writeStream );                
-    idArray.ExternalizeL( writeStream );
-    CleanupStack::PopAndDestroy(); // writeStream
-                   
-    // This needs to be popped inorder to Close the idArray;
-    CleanupStack::Pop( 2 ); // buffer, idArray
-    idArray.ResetAndDestroy();
-    idArray.Close();
-    
-    // Now reinsert the App buffer back into the Cleanupstack
-    CleanupStack::PushL( buffer );
-       
-    // This function needs to obtain a list of all applications. This would
-    // first require to obtain the length of the buffer that needs to be
-    // passed from the client to the server to pack the array.
-    
-    TIpcArgs    args;
-        
-    // First pack the application id array to the IPC args
-    // By the IPC exchange parameter defintion, this must be the first
-    // argument to the IPC message.
-    TPtr8 appArrayPtr( buffer->Ptr(0));
-      
-    args.Set( 0, &appArrayPtr );
-     
-    // The second argument is the Include flag
-    args.Set( 1, aIncludeFlag );
-               
-    CBufFlat* lengthBuf = CBufFlat::NewL( KLcLengthofInteger );
-    CleanupStack::PushL( lengthBuf );
-    
-    // Set the size of this buffer to 4. This is required because we dont
-    // actually fill this buffer but expect the server to fill it. In that case
-    // if we dont set the expected length, the server would fail with
-    // KrrBadDescriptor.
-    lengthBuf->ResizeL( KLcLengthofInteger );
- 
-    // Set the buffer pointer to the start of the Length buffer
-    TPtr8 bufPtr( const_cast< TUint8 *>( lengthBuf->Ptr( 0 ).Ptr()),
-                  0,
-                  KLcLengthofInteger );
-    
-    // This will be the third argument passed to this IPC message.
-    args.Set( 2, &bufPtr);
-    
-    // Send a synchrnous message to the server to obtain the length. On return the
-    // server is expected to pack the length of the Application information
-    // arrays in the LengthBuffer pointer.
-    User::LeaveIfError( aSession.SendReceive( ELcSpecifiedAppsBufferLength, args ));
-
-    // If the server has not set the buffer then leave with KErrNotFound
-    if ( !bufPtr.Length())
-        {
-        User::Leave( KErrNotFound );
-        }
-    
-    // Obtain the length from the Length buffer;
-    RBufReadStream  readStream( *lengthBuf, 0 );
-    CleanupClosePushL( readStream );
-    TUint length = readStream.ReadInt32L();
-    CleanupStack::PopAndDestroy( 2, lengthBuf );   // readStream
-    
-    // If the server has returned a length of 0, then there are no applications
-    // registered with Location Centre.
-    if ( !length )
-        {
-        User::Leave( KErrNotFound );
-        }
-    
-    // Now that the length has been obtained. Allocate the descriptor
-    // of suitable length and send it across to the server.
-    CBufFlat* appInfoBuf = CBufFlat::NewL( length );
-    CleanupStack::PushL( appInfoBuf );
-    
-    // Set the actual size to 'length' obtained in the previous IPC. This is required
-    // because we dont actually fill this buffer but expect the server to fill it.
-    // In that case if we dont set the expected length, the server would fail with
-    // KrrBadDescriptor.
-    appInfoBuf->ResizeL( length );
-    
-    // Fill the IPC argument structure with the Application info buffer, the server
-    // will write the data onto this buffer.
-    
-    // Pass the Application ids to the Location Centre Server
-    // By the IPC exchange parameter defintion, this must be the first
-    // argument to the IPC message.
-    args.Set( 0, &appArrayPtr );
-    
-    // The second argument is the Include flag
-    args.Set( 1, aIncludeFlag );
-    
-    // Set the buffer pointer to the start of the Length buffer
-    bufPtr.Set( const_cast< TUint8 *>( appInfoBuf->Ptr( 0 ).Ptr()),
-                0,
-                length );
-    
-    // This will be the third argument passed to this IPC message.
-    args.Set( 2, &bufPtr);
-    
-    // Send a synchrnous message to the server to obtain the length. On return the
-    // server is expected to pack the length of the Application information
-    // arrays in the LengthBuffer pointer.
-    TInt error = aSession.SendReceive( ELcSpecifiedApps, args );
-
-	// If the Retrieval function completes with KErrOverflow then there has been
-	// an update to the registry since the time we obtained the length.
-	if ( KErrOverflow == error )
-		{
-		// Cleanup the current state and Re-issue the same request again
-		CleanupStack::PopAndDestroy( 2, buffer );
-		return GetLocationApplicationsL( aSession, aAppArray, aIncludeFlag );
-		}
-	else if( error )
-		{
-		User::Leave( error );
-		}
-		
-		
-    // If the server has not set the buffer then leave with KErrNotFound
-    if ( !bufPtr.Length())
-        {
-        User::Leave( KErrNotFound );
-        }
-        
-    // Parse the Application information array to obtain the array
-    RBufReadStream  appReadStream( *appInfoBuf, 0 );
-    CleanupClosePushL( appReadStream );
-    
-    CLcLocationAppInfoArray* array = LcSyncOperation::ParseLocAppBufferL( appReadStream );
-    
-    CleanupStack::PopAndDestroy( 3, buffer );   // idArray, appInfoBuf and buffer
-
-    return array;  
-    }
-    
-// ---------------------------------------------------------------------------
-// CLcBasicAppInfo* LcSyncOperation::GetLocationAppInfoL
-// ---------------------------------------------------------------------------
-// 
-CLcBasicAppInfo* LcSyncOperation::GetLocationAppInfoL( 
-									RLcClientSession&   aSession,
-							  const TDesC&				aIdentifier )
-	{
-    // This function needs to obtain the Length of the buffer which needs to be
-    // passed to the Server to pack the Location Application Information.
-    CBufFlat* lengthBuf = CBufFlat::NewL( KLcLengthofInteger );
-    CleanupStack::PushL( lengthBuf );
-    
-    // Set the size of this buffer to 4. This is required because we dont
-    // actually fill this buffer but expect the server to fill it. In that case
-    // if we dont set the expected length, the server would fail with
-    // KrrBadDescriptor.
-    lengthBuf->ResizeL( KLcLengthofInteger );
-    
-    // Fill the IPC argument structure with the Length buffer, the server
-    // will write the data onto this buffer.
-    TIpcArgs    args;
-    
-    // By the IPC exchange parameter defintion, the first argument must the
-    // Identifier name
-    args.Set( 0, &aIdentifier );
-    
-    // Set the buffer pointer to the start of the Length buffer
-    TPtr8 bufPtr( const_cast< TUint8 *>( lengthBuf->Ptr( 0 ).Ptr()),
-                  0,
-                  KLcLengthofInteger );
-    
-    // This will be the second argument passed to this IPC message.
-    args.Set( 1, &bufPtr);
-    
-    // Send a synchrnous message to the server to obtain the length. On return the
-    // server is expected to pack the length of the Application information
-    // arrays in the LengthBuffer pointer.
-    User::LeaveIfError( aSession.SendReceive( ELcAppInfoLength, args ));
-
-    // If the server has not set the buffer then leave with KErrNotFound
-    if ( !bufPtr.Length())
-        {
-        User::Leave( KErrNotFound );
-        }
-    
-    // Obtain the length from the Length buffer;
-    RBufReadStream  readStream( *lengthBuf, 0 );
-    CleanupClosePushL( readStream );
-    TUint length = readStream.ReadInt32L();
-    CleanupStack::PopAndDestroy( 2, lengthBuf );   // readStream
-    
-    // If the server has returned a length of 0, then there are no applications
-    // registered with Location Centre.
-    if ( !length )
-        {
-        User::Leave( KErrNotFound );
-        }
-    
-    // Now that the length has been obtained. Allocate the descriptor
-    // of suitable length and send it across to the server.
-    CBufFlat* appInfoBuf = CBufFlat::NewL( length );
-    CleanupStack::PushL( appInfoBuf );
-    
-    // Set the actual size to 'length' obtained in the previous IPC. This is required
-    // because we dont actually fill this buffer but expect the server to fill it.
-    // In that case if we dont set the expected length, the server would fail with
-    // KrrBadDescriptor.
-    appInfoBuf->ResizeL( length );
-    
-    // Fill the IPC argument structure with the Application info buffer, the server
-    // will write the data onto this buffer.
-    
-    // Pass the Application Identifier to the Location Centre Server
-    // By the IPC exchange parameter defintion, this must be the first
-    // argument to the IPC message.
-    args.Set( 0, &aIdentifier );
-    
-    // Set the buffer pointer to the start of the Length buffer
-    bufPtr.Set( const_cast< TUint8 *>( appInfoBuf->Ptr( 0 ).Ptr()),
-                0,
-                length );
-    
-    // This will be the second argument passed to this IPC message.
-    args.Set( 1, &bufPtr);
-    
-    // Send a synchrnous message to the server to obtain the length. On return the
-    // server is expected to pack the length of the Application information
-    // in the buffer pointer.
-    TInt error = aSession.SendReceive( ELcAppInfo, args );
-
-	// If the Retrieval function completes with KErrOverflow then there has been
-	// an update to the registry since the time we obtained the length.
-	if ( KErrOverflow == error )
-		{
-		// Cleanup the current state and Re-issue the same request again
-		CleanupStack::PopAndDestroy( appInfoBuf );
-		return GetLocationAppInfoL( aSession, aIdentifier );
-		}
-	else if( error )
-		{
-		User::Leave( error );
-		}
-		
-    // If the server has not set the buffer then leave with KErrNotFound
-    if ( !bufPtr.Length())
-        {
-        User::Leave( KErrNotFound );
-        }
-        
-    // Parse the Application information structure to obtain the Application
-    // information structure
-    RBufReadStream  appReadStream( *appInfoBuf, 0 );
-    CleanupClosePushL( appReadStream );
-    
-    CLcBasicAppInfo* appInfo = CLcBasicAppInfo::NewLC();
-    appInfo->InternalizeL( appReadStream );
-    CleanupStack::Pop( appInfo );
-    
-    CleanupStack::PopAndDestroy( 2, appInfoBuf );   // appReadStream
-
-    return appInfo;	
-	}
-	
-// ---------------------------------------------------------------------------
-// CLcLocationAppInfoArray* LcSyncOperation::ParseLocAppBufferL
-// ---------------------------------------------------------------------------
-// 
-CLcLocationAppInfoArray* LcSyncOperation::ParseLocAppBufferL( 
-                                                RReadStream&   aReadStream )
-    {
-    DEBUG("+ LcSyncOperation::ParseLocAppBufferL")
-        
-    CLcLocationAppInfoArray* appArray = CLcLocationAppInfoArray::NewLC();
-    
-    // Parse the contents into RLcIpcAppInfoArray type.
-    RLcIpcAppInfoArray  ipcArray;
-    CleanupStack::PushL( TCleanupItem( RLcIpcAppInfoArray::ResetAndDestroyAppArray, &ipcArray ));
-    
-    // Internalize the array onto the ipcArray structure.
-    ipcArray.InternalizeL( aReadStream );
-
-    // Pack the Application info array
-    for ( TInt i = 0; i < ipcArray.Count(); i++ )
-        {
-        
-        // Form the Application information object corresponding to
-        // this ipcAppInfo.
-        
-        // Create a new Application Information object. This object will
-        // be populated and the appended to the appArray.
-        CLcLocationAppInfo* appInfo = CLcLocationAppInfo::NewLC();
-        
-        // Set the Unique identifer for the application
-        appInfo->SetIdL( ipcArray[i]->Id());
-        
-        // Set the display name of the application
-        appInfo->SetNameL( ipcArray[i]->Name());
-        
-        // Set the Launch Mode for the application
-        // There is no need to check the launch mode and compare it with
-        // the values of TLcLaunchMode. Internally its ensured that the 
-        // server would only set the parameter based in TLcLaunchMode.
-        appInfo->SetLaunchMode( static_cast<CLcLocationAppInfo::
-                            TLcLaunchMode>( ipcArray[i]->LaunchMode()));
-        
-        // Set the Application characteristics
-        appInfo->SetApplicationCharacteristics( 
-                            ipcArray[i]->ApplicationCharacteristics());
-        
-        // Set the system characteristics
-        appInfo->SetSystemCharacteristics( ipcArray[i]->SystemCharacteristics());
-         
-        // Load the application Icon Related Data
-        if ( ipcArray[i]->IconFile().Compare( KNullDesC ))
-        	{
-        	// The Icon file name is specified. So Load the icons from the 
-        	// Icon file. So we can set these values for the Icon file.
-        	appInfo->SetIconL( ipcArray[i]->IconFileType(),
-        					   ipcArray[i]->IconFile(),
-        					   ipcArray[i]->FrameNo());
-        	}
-        else if ( ipcArray[i]->ApplicationType() == ELcNativeApplication )
-        	{
-        	// Only native applications are handled here.
-        	// Here we have to pass the Application UID as the Icon data since
-        	// the Icon will be loaded from the App shell
-        	appInfo->SetIconL( ipcArray[i]->IconFileType(),
-        					   ipcArray[i]->ApplicationData());        	
-        	}
-        		   
-        appArray->AppendL( appInfo );
-        CleanupStack::Pop( appInfo );
-        }
-    CleanupStack::PopAndDestroy(); // ipcArray
-    
-    // If there are no elements in the array then that means that there
-    // are no applications registered with LC. So leave with KErrNotFound
-    if ( !appArray->Count())
-        {
-        User::Leave( KErrNotFound );
-        }
-    
-    CleanupStack::Pop( appArray ); 
-    
-    DEBUG("- LcSyncOperation::ParseLocAppBufferL")
-           
-    return appArray;
-    }	                                                                                                            
-// End of File