locationcentre/lcservice/src/lclocationappinfo.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 00:16:03 +0200
changeset 0 522cd55cc3d7
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* 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:  Location Application Information structures.
*
*/


// SYSTEM INCLUDES
#include <gulicon.h>					// Gul Icon
#include <fbs.h>                        // Bitmap

// USER INCLUDES
#include "lclocationappinfo.h"
#include "lcnativeapps.hrh"
#include "lcerrors.h"
#include "lciconloader.h"
#include "lcipcparams.h"

// CONSTANT DEFINTIONS
// Maximum value that the UID field can take in S60
const TUint32   KUidMaxValue = 0xFFFFFFFF;

// ----- Member funtions for CLcLocationAppInfo ------------------

// ---------------------------------------------------------------------------
// CLcLocationAppInfo::CLcLocationAppInfo
// ---------------------------------------------------------------------------
//
CLcLocationAppInfo::CLcLocationAppInfo( 
                        const CLcLocationAppInfo&     aLCAppInfo )
    {
    // C++ Copy constructor. No allocations or functions which can Leave
    // should be called from here.
    
    // Set only those parameters which dont require memory allocation.
    iLaunchMode = aLCAppInfo.iLaunchMode;
    iSystemCharacteristics = aLCAppInfo.iSystemCharacteristics;
    iAppCharacteristics = aLCAppInfo.iAppCharacteristics;
    }
 
// ---------------------------------------------------------------------------
// CLcLocationAppInfo::CLcLocationAppInfo
// ---------------------------------------------------------------------------
//
CLcLocationAppInfo::CLcLocationAppInfo()
    :iLaunchMode( EDefaultMode )
    {
    // C++ Default constructor. No allocations or functions which can Leave
    // should be called from here.
    }
                         
// ---------------------------------------------------------------------------
// CLcLocationAppInfo::~CLcLocationAppInfo
// ---------------------------------------------------------------------------
//
EXPORT_C CLcLocationAppInfo::~CLcLocationAppInfo()
    {
    // C++ Destructor. Free all resources associated with this class.
    
    // Delete the buffer containing the Identifier
    delete iId;
    
    // Delete the buffer containing the name of the Location application
    delete iApplicationName;
    
    // Delete the Application Icon
    delete iApplicationIconData;
    }
        
// ---------------------------------------------------------------------------
// CLcLocationAppInfo* CLcLocationAppInfo::NewL
// ---------------------------------------------------------------------------
//
EXPORT_C CLcLocationAppInfo* CLcLocationAppInfo::NewL()
    {
    CLcLocationAppInfo* self = NewLC();
    CleanupStack::Pop( self );
    return self;         
    }

// ---------------------------------------------------------------------------
// CLcLocationAppInfo* CLcLocationAppInfo::NewLC
// ---------------------------------------------------------------------------
//
EXPORT_C CLcLocationAppInfo* CLcLocationAppInfo::NewLC()
    {
    // Symbian Two phased constructor. Leaves the object on the Clean-up
    // stack.
    CLcLocationAppInfo* self = 
                new ( ELeave )CLcLocationAppInfo();
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;         
    }

// ---------------------------------------------------------------------------
// CLcLocationAppInfo* CLcLocationAppInfo::NewL
// ---------------------------------------------------------------------------
//
EXPORT_C CLcLocationAppInfo* CLcLocationAppInfo::NewL(
                                    const CLcLocationAppInfo&  aLocAppInfo )
    {
    CLcLocationAppInfo* self = NewLC( aLocAppInfo );
    CleanupStack::Pop( self );
    return self;         
    }

// ---------------------------------------------------------------------------
// CLcLocationAppInfo* CLcLocationAppInfo::NewLC
// ---------------------------------------------------------------------------
//
EXPORT_C CLcLocationAppInfo* CLcLocationAppInfo::NewLC(
                                    const CLcLocationAppInfo&  aLocAppInfo )
    {
    // Symbian Two phased constructor. Leaves the object on the Clean-up
    // stack.
    CLcLocationAppInfo* self = 
                new ( ELeave )CLcLocationAppInfo( aLocAppInfo );
    CleanupStack::PushL( self );
    self->ConstructL( aLocAppInfo );
    return self;         
    }
    
// ---------------------------------------------------------------------------
// void CLcLocationAppInfo::ConstructL
// ---------------------------------------------------------------------------
//
void CLcLocationAppInfo::ConstructL()
    {
    }
 
// ---------------------------------------------------------------------------
// void CLcLocationAppInfo::ConstructL
// ---------------------------------------------------------------------------
//
void CLcLocationAppInfo::ConstructL( const CLcLocationAppInfo&   aLCAppInfo )
    {
    // Copy the Identifier from the Argument Location Application App info.
    iId = aLCAppInfo.Id().AllocL();
    
    // Copy the Name from the Argument Location Application App info.
    iApplicationName = aLCAppInfo.Name().AllocL();
    
    // Create the Icon related objects.
    if ( aLCAppInfo.iApplicationIconData )
    	{
    	iApplicationIconData = aLCAppInfo.iApplicationIconData->Des().Alloc();
    	}
    iApplicationIconType = 	aLCAppInfo.iApplicationIconType;
	iIconId = aLCAppInfo.iIconId;
    }
     
// ---------------------------------------------------------------------------
// TUint32 CLcLocationAppInfo::IdL
// ---------------------------------------------------------------------------
//
EXPORT_C TPtrC CLcLocationAppInfo::Id() const
    {
    // Check whether the UID exists, incase it doesnt exist then return a
    // NULL string.
    if( !iId )
        {
        return TPtrC();
        }
        
    // Return the UID.
    return *iId;
    }
 
// ---------------------------------------------------------------------------
// TDesC& CLcLocationAppInfo::NameL
// ---------------------------------------------------------------------------
//
EXPORT_C TPtrC CLcLocationAppInfo::Name() const
    {
    // Check whether the application name exists, incase it doesnt exist then
    // return a NULL string.
    if( !iApplicationName )
        {
        return TPtrC();
        }
    // Return the Application Name.
    return *iApplicationName;
    }

// ---------------------------------------------------------------------------
// CGulIcon& CLcLocationAppInfo::IconL
// ---------------------------------------------------------------------------
//
EXPORT_C CGulIcon* CLcLocationAppInfo::IconL() const
    {
    CGulIcon* icon = NULL;
    // If there is no Icon file present, then we have to load the default
    // Icon for the Application
    if ( iApplicationIconData )
    	{
    	switch( iApplicationIconType )
    		{
    		case CLcAppInfo::EIconfromApp:
    			{        	      	
	            // Since the request is for a Native S60 application, the Identifer
	            // contains an UID. Obtain it using Lexer
	            TLex lexer( iApplicationIconData->Des());
	            TUint32 uidValue;	            
	            User::LeaveIfError( lexer.BoundedVal( uidValue, EHex, KUidMaxValue ));
	                    	
				// Obtain the Location Icon.	                    	
	        	icon = LcIconLoader::LoadApplicationIconL( TUid::Uid( uidValue ));
    			
    			break;
    			}
    		case CLcAppInfo::EMifFile:
    			{
    			icon = LcIconLoader::LoadMifFileIconL( iApplicationIconData->Des(),
    												    iIconId );
    			break;
    			}
    		default:
    			{
    			icon = LcIconLoader::LoadDefaultIconL();
    			break;
    			}
    		}
    	}
	else
		{
		icon = LcIconLoader::LoadDefaultIconL();  
		}    	
  	return icon;
    }

// ---------------------------------------------------------------------------
// CLcLocationAppInfo::TLcLaunchMode
//                  CLcLocationAppInfo::LocationApplicationIconL
// ---------------------------------------------------------------------------
//
EXPORT_C CLcLocationAppInfo::TLcLaunchMode CLcLocationAppInfo::LaunchMode() const
    {
    return iLaunchMode;
    }

// ---------------------------------------------------------------------------
// TUint32 CLcLocationAppInfo::SystemCharacteristics
// ---------------------------------------------------------------------------
// 
EXPORT_C TUint32 CLcLocationAppInfo::SystemCharacteristics() const
    {
    return iSystemCharacteristics;
    }
 
// ---------------------------------------------------------------------------
// TUint32 CLcLocationAppInfo::ApplicationCharacteristics
// ---------------------------------------------------------------------------
// 
EXPORT_C TUint32 CLcLocationAppInfo::ApplicationCharacteristics() const
    {
    return iAppCharacteristics;
    }
                    
// ---------------------------------------------------------------------------
// TUint32 CLcLocationAppInfo::SetIdL
// ---------------------------------------------------------------------------
//
void CLcLocationAppInfo::SetIdL( const TDesC& aId )
    {
    // Incase, the UID already exists then Leave with KErrAlreadyExists
    if( iId )
        {
        User::Leave( KErrAlreadyExists );
        }
        
    // Copy the Identifier from the Argument Location Application App info.
    iId = aId.AllocL();
    
    }
    
// ---------------------------------------------------------------------------
// void CLcLocationAppInfo::SetNameL
// ---------------------------------------------------------------------------
//
void CLcLocationAppInfo::SetNameL( const TDesC& aName )
    {
    // Incase, the application name exists then Leave with KErrAlreadyExists.
    if( iApplicationName )
        {
        User::Leave( KErrAlreadyExists );
        }
        
    // Copy the Name from the Argument Location Application App info.
    iApplicationName = aName.AllocL();  
    }

// ---------------------------------------------------------------------------
// void CLcLocationAppInfo::SetIconL
// ---------------------------------------------------------------------------
//
void CLcLocationAppInfo::SetIconL( 		 TInt		aIconType,
				   				   const TDesC&		aIconData,
				   		 				 TInt		aIconId )
    {	    
    // Incase, the application icon exists then Leave with KErrAlreadyExists.
    if( iApplicationIconData )
        {
        User::Leave( KErrAlreadyExists );
        }
    
    if( !aIconData.Length())
        {
        User::Leave( KErrArgument );
        }
                    
    // Create the Icon related objects.
    iApplicationIconData = aIconData.Alloc();
    iApplicationIconType = 	aIconType;
	iIconId = aIconId;
    }

// ---------------------------------------------------------------------------
// void CLcLocationAppInfo::SetLocationApplicationLaunchMode
// ---------------------------------------------------------------------------
//
void CLcLocationAppInfo::SetLaunchMode(
                            CLcLocationAppInfo::TLcLaunchMode aLaunchMode )
    {
    iLaunchMode = aLaunchMode;
    }
 

// ---------------------------------------------------------------------------
// void CLcLocationAppInfo::SetSystemCharacteristics
// ---------------------------------------------------------------------------
//    
void CLcLocationAppInfo::SetSystemCharacteristics( 
                            TUint32   aSysCharacteristics )
    {
    iSystemCharacteristics = aSysCharacteristics;
    }                            

// ---------------------------------------------------------------------------
// void CLcLocationAppInfo::SetApplicationCharacteristics
// ---------------------------------------------------------------------------
//    
void CLcLocationAppInfo::SetApplicationCharacteristics( 
                            TUint32   aAppCharacteristics )
    {
    iAppCharacteristics = aAppCharacteristics;
    } 
        
// ----- Member funtions for CLcLocationAppInfoArray -------------
 
// ---------------------------------------------------------------------------
// CLcLocationAppInfoArray::CLcLocationAppInfoArray
// ---------------------------------------------------------------------------
//
CLcLocationAppInfoArray::CLcLocationAppInfoArray()
    {
    // C++ Default constructor. No allocations or functions which can Leave
    // should be called from here.
    }
      
// ---------------------------------------------------------------------------
// CLcLocationAppInfoArray::~CLcLocationAppInfoArray
// ---------------------------------------------------------------------------
//
EXPORT_C CLcLocationAppInfoArray::~CLcLocationAppInfoArray()
    {
    // C++ Destructor. Free all resources associated with this class.
    
    // Delete all the the associated Location application information objects.
	while ( iAppInfoArray.Count() > 0 )
		{
		// Remove the first item
		CLcLocationAppInfo* item = iAppInfoArray[0];
		iAppInfoArray.Remove( 0 );
		
		// Delete the element
		delete item;
		item = NULL;
		}
	iAppInfoArray.Reset();
	iAppInfoArray.Close();    
    }
        
// ---------------------------------------------------------------------------
// CLcLocationAppInfoArray* 
//                      CLcLocationAppInfoArray::NewL
// ---------------------------------------------------------------------------
//
EXPORT_C CLcLocationAppInfoArray* 
                                CLcLocationAppInfoArray::NewL()
    {
    CLcLocationAppInfoArray* self = NewLC();
    CleanupStack::Pop( self );
    return self;         
    }

// ---------------------------------------------------------------------------
// CLcLocationAppInfoArray* 
//                      CLcLocationAppInfoArray::NewLC
// ---------------------------------------------------------------------------
//
EXPORT_C CLcLocationAppInfoArray* 
                                CLcLocationAppInfoArray::NewLC()
    {
    // Symbian Two phased constructor. Leaves the object on the Clean-up
    // stack.
    CLcLocationAppInfoArray* self = 
                new ( ELeave )CLcLocationAppInfoArray();
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;         
    }

// ---------------------------------------------------------------------------
// void CLcLocationAppInfoArray::ConstructL
// ---------------------------------------------------------------------------
//
void CLcLocationAppInfoArray::ConstructL()
    {
    // Second phase of the two phase constructor.
    }

// ---------------------------------------------------------------------------
// void CLcLocationAppInfoArray::Count
// ---------------------------------------------------------------------------
//
EXPORT_C TInt CLcLocationAppInfoArray::Count() const
    {
    // Return the number of elements in the Application information array.
    return  iAppInfoArray.Count();      
    }

// ---------------------------------------------------------------------------
// void CLcLocationAppInfoArray::AppendL
// ---------------------------------------------------------------------------
//
EXPORT_C void CLcLocationAppInfoArray::AppendL( 
                            CLcLocationAppInfo*     aLCAppInfo )
    {
    // Check if the element passed as an argument is NULL. If its NULL, then
    // Leave with KErrArgument
    // Not using User::LeaveIfNull because in that case, the leave would happen
    // with KErrNoMemory which conveys the wrong behaviour.
    if( !aLCAppInfo )
        {
        User::Leave( KErrArgument );
        }
    
    // Append the new element into the array;
    iAppInfoArray.AppendL( aLCAppInfo );     
    }

// ---------------------------------------------------------------------------
// CLcLocationAppInfo* CLcLocationAppInfoArray::RemoveL
// ---------------------------------------------------------------------------
//
EXPORT_C CLcLocationAppInfo* CLcLocationAppInfoArray::Remove( TInt  aIndex )
    {
    // Check if the element requested is out of array bounds
    if( aIndex < 0 || aIndex >= iAppInfoArray.Count())
        {
        User::Panic( KLcPanicCategory, ELcInvalidIndex );
        }
        
    // Since, the remove method is expected to return back the reference
    // of the element removed, first store the element at the aIndex
    // position and return it back                            
    CLcLocationAppInfo* item = iAppInfoArray[ aIndex ];
    iAppInfoArray.Remove( aIndex );
    return item;
    }

// ---------------------------------------------------------------------------
// CLcLocationAppInfo* CLcLocationAppInfoArray::Reset
// ---------------------------------------------------------------------------
//
EXPORT_C void CLcLocationAppInfoArray::Reset()
    {
    // Reset the entire array so that its ok for resuse.
    iAppInfoArray.ResetAndDestroy();
    }
    
// ---------------------------------------------------------------------------
// CLcLocationAppInfo& CLcLocationAppInfoArray::
//                            operator[]
// ---------------------------------------------------------------------------
//     
EXPORT_C CLcLocationAppInfo& CLcLocationAppInfoArray::
                                operator[]( TInt aIndex ) const
    {
    // Check if the element requested is out of array bounds
    if( aIndex < 0 || aIndex >= iAppInfoArray.Count())
        {
        User::Panic( KLcPanicCategory, ELcInvalidIndex );
        }

    // Return only a reference of the object. The ownership is not be 
    // transferred.
    return *(iAppInfoArray[ aIndex ]);    
    }
        
// End of File