localisation/apparchitecture/apgrfx/APGCLI.CPP
branchSymbian2
changeset 1 8758140453c0
child 6 c108117318cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/localisation/apparchitecture/apgrfx/APGCLI.CPP	Thu Jan 21 12:53:44 2010 +0000
@@ -0,0 +1,3096 @@
+// Copyright (c) 1997-2009 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 "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include "../apserv/APSCLSV.H"
+#include "APGCLI.H"
+#include "APACMDLN.H"
+#include "APGSTD.H"
+#include "APGICNFL.H"
+#include <apsserv.h>
+#include <apmrec.h>
+#include <s32mem.h>
+#include "APGPRIV.H"
+#include <apadef.h>
+#include "apprivate.h"
+
+#if defined(USE_IH_RAISE_EVENT)
+#include <SystemMonitor/RaiseEvent.h>
+#include <test/testinstrumentation.h>
+#endif
+
+class CApaLsSessionExtension;
+
+const TUint KInitialIconBufSize=sizeof(TSize)*6+sizeof(TInt);
+const TUint KInitialViewDataBufSize=sizeof(TApaAppViewInfo)*6+sizeof(TInt);
+const TUint KInitialOwnedFilesBufSize=sizeof(TFileName)*6+sizeof(TInt);
+const TUint KDefaultBufSize = 0x400;
+const TUint KAsyncMessageSlots=4; //one slot each for, RApaLsSession::SetNotify, RApaLsSession::
+                                  //RegisterListPopulationCompleteObserver and RApaLsSession::NotifyOnDataMappingChange
+                                  //CAsyncFileRecognition::Start makes an asynch request of apparc server.
+
+_LIT8(KAllDataTypes,"*");
+
+extern void CleanupServiceArray(TAny* aServiceArray);
+
+IMPORT_C extern const TInt KMinApplicationStackSize;
+
+class MArrayFiller
+	{
+public:
+	virtual void AppendItemL(RReadStream& aReadStream)=0;
+	};
+
+class TSizeArrayFiller : public MArrayFiller
+	{
+public:
+	inline TSizeArrayFiller(CArrayFixFlat<TSize>& aArray) :iArray(aArray) {}
+	virtual void AppendItemL(RReadStream& aReadStream);
+private:
+	CArrayFixFlat<TSize>& iArray;
+	};
+
+class TViewDataArrayFiller : public MArrayFiller
+	{
+public:
+	inline TViewDataArrayFiller(CApaAppViewArray& aArray) :iArray(aArray) {}
+	virtual void AppendItemL(RReadStream& aReadStream);
+private:
+	CApaAppViewArray& iArray;
+	};
+
+class TDesCArrayFiller : public MArrayFiller
+	{
+public:
+	inline TDesCArrayFiller(CDesCArray& aArray) :iArray(aArray) {}
+	virtual void AppendItemL(RReadStream& aReadStream);
+private:
+	CDesCArray& iArray;
+	};
+
+/**
+This class is used to simplify the usage of the asynchronous RApaLsSession::RecognizeFilesL() function.
+@internalComponent
+*/
+class CAsyncFileRecognition : public CActive
+	{
+public:
+	CAsyncFileRecognition(CDataRecognitionResultArray& aResult, TRequestStatus& aUsersRequestStatus, CApaLsSessionExtension& aSession);
+	~CAsyncFileRecognition();
+	void Start(const TDesC& aPath, const TDesC8& aDataType);
+private:
+	void RunL();
+	void DoCancel();
+private: // data
+	TPckgBuf<TUint> iRequiredBufferSizePckg;
+	CDataRecognitionResultArray& iResult;
+	TRequestStatus& iUsersRequestStatus;
+	CApaLsSessionExtension& iSession;
+	const TDesC* iPath;
+	const TDesC8* iDataType;
+	};
+
+/**
+This class is an extension class for RApaLsSession. It was added to reduce the need
+of BC breaks in later releases.
+@internalComponent
+*/
+class CApaLsSessionExtension : public CBase
+	{
+public:
+	CApaLsSessionExtension(RApaLsSession& aSession);
+	~CApaLsSessionExtension();
+
+	void SendReceive(TInt aFunction,const TIpcArgs& aArgs,TRequestStatus& aStatus) const;
+	TInt SendReceive(TInt aFunction,const TIpcArgs& aArgs) const;
+
+	// file recognition functions
+	void RecognizeFilesL(const TDesC& aPath, const TDesC8& aDataType, CDataRecognitionResultArray& aResult, TRequestStatus& aStatus);
+	void CancelRecognizeFiles();
+	void FilesRecognized(const TDesC& aPath, TInt aRequiredBufferSize, CDataRecognitionResultArray& aResult, TRequestStatus& aUsersRequestStatus, const TRequestStatus& aErrorCode);
+	TBool RecognitionActive() const;
+private:
+	RApaLsSession& iSession;	// we are a friend of this class!
+	CAsyncFileRecognition* iAsyncFileRecognition;
+	};
+
+/**
+An entry of a CDataRecognitionResultArray object. Stores TDataRecognitionResult and the file name
+in a compact format.
+@internalComponent
+*/
+class CDataRecognitionResultArrayEntry : public CBase
+	{
+public:
+	CDataRecognitionResultArrayEntry(HBufC* aFileName, HBufC8* aDataType, TUid aUid, TInt aConfidence);
+	~CDataRecognitionResultArrayEntry();
+	void GetDataRecognitionResult(TDataRecognitionResult& aResult) const;
+	const TDesC& FileName() const;
+private:
+	HBufC* iFileName;
+	HBufC8* iDataType;
+	TUid iUid;
+	TInt iConfidence;
+	};
+
+//////////////////////////////
+// CAsyncFileRecognition
+//////////////////////////////
+
+CAsyncFileRecognition::CAsyncFileRecognition(CDataRecognitionResultArray& aResult, TRequestStatus& aUsersRequestStatus, CApaLsSessionExtension& aSession)
+	: CActive(EPriorityStandard),
+	  iResult(aResult),
+	  iUsersRequestStatus(aUsersRequestStatus),
+	  iSession(aSession)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CAsyncFileRecognition::Start(const TDesC& aPath, const TDesC8& aDataType)
+	{
+	iPath = &aPath;
+	iDataType = &aDataType;
+	iStatus = KRequestPending;
+	iSession.SendReceive(EAppListServRecognizeFilesAsync,TIpcArgs(&aPath,&iRequiredBufferSizePckg,&aDataType),iStatus);
+	SetActive();
+	}
+
+CAsyncFileRecognition::~CAsyncFileRecognition()
+	{
+	Cancel();
+	iPath = NULL;
+	iDataType = NULL;
+	}
+
+void CAsyncFileRecognition::RunL()
+	{
+	iSession.FilesRecognized(*iPath, iRequiredBufferSizePckg(), iResult, iUsersRequestStatus, iStatus);
+	}
+
+void CAsyncFileRecognition::DoCancel()
+	{
+	iSession.SendReceive(ECancelRecognizeFiles,TIpcArgs(TIpcArgs::ENothing));
+	TRequestStatus* status = &iUsersRequestStatus;
+	User::RequestComplete( status, KErrCancel );
+	}
+
+//////////////////////////////
+// CApaLsSessionExtension
+//////////////////////////////
+
+CApaLsSessionExtension::CApaLsSessionExtension(RApaLsSession& aSession)
+	: iSession(aSession),
+	  iAsyncFileRecognition(NULL)
+	{
+	}
+
+CApaLsSessionExtension::~CApaLsSessionExtension()
+	{
+	delete iAsyncFileRecognition;
+	}
+
+void CApaLsSessionExtension::SendReceive(TInt aFunction,const TIpcArgs& aArgs,TRequestStatus& aStatus) const
+	{
+	iSession.SendReceive(aFunction,aArgs,aStatus); //lint !e1060 Suppress protected member is not accessible to non-member non-friend
+	}
+
+TInt CApaLsSessionExtension::SendReceive(TInt aFunction,const TIpcArgs& aArgs) const
+	{
+	return iSession.SendReceive(aFunction,aArgs); //lint !e1060 Suppress protected member is not accessible to non-member non-friend
+	}
+
+/**
+Asynchronous recognition of a directory.
+Function uses an internal CAsyncFileRecognition object to hide the 
+second server message (transferring the data to the client) from the user.
+When the path is not correct or the server is already busy with another 
+recognition request, the function completes the request with an error.
+@internalComponent
+*/
+void CApaLsSessionExtension::RecognizeFilesL(const TDesC& aPath, const TDesC8& aDataType, CDataRecognitionResultArray& aResult, TRequestStatus& aStatus)
+	{
+	_LIT(KBackslash,"\\");
+
+	if(aPath.Right(1) != KBackslash)
+		{
+		TRequestStatus* status = &aStatus;
+		User::RequestComplete(status,KErrPathNotFound);
+		}
+	
+	aResult.SetPath(aPath);
+	aStatus = KRequestPending;
+
+	if(!iAsyncFileRecognition)
+		{
+		iAsyncFileRecognition = new (ELeave) CAsyncFileRecognition(aResult, aStatus, *this);
+		iAsyncFileRecognition->Start(aPath, aDataType);
+		}
+	else
+		{
+		TRequestStatus* status = &aStatus;
+		User::RequestComplete(status,KErrInUse);
+		}
+	}
+
+TBool CApaLsSessionExtension::RecognitionActive() const
+	{
+	return iAsyncFileRecognition ? ETrue : EFalse;
+	}
+
+void CApaLsSessionExtension::CancelRecognizeFiles()
+	{
+	if(iAsyncFileRecognition)
+		{
+		iAsyncFileRecognition->Cancel();
+		delete iAsyncFileRecognition;
+		iAsyncFileRecognition = NULL;
+		}
+	}
+
+void CApaLsSessionExtension::FilesRecognized(const TDesC& aPath, TInt aRequiredBufferSize, CDataRecognitionResultArray& aResult, TRequestStatus& aUsersRequestStatus, const TRequestStatus& aErrorCode)
+/**
+Callback function called by an CAsyncFileRecognition object, when an asynchronous
+recognition has finished. If the recognition was successful, the data is transferred
+to the client-side.
+@internalComponent
+*/
+	{
+	TRequestStatus* status = &aUsersRequestStatus;
+	if(aErrorCode == KErrNone)
+		{
+		// transfer the result
+		TRAPD(error,iSession.TransferAndInternalizeDataL(aPath, aRequiredBufferSize, aResult));
+		User::RequestComplete(status, error);
+		}
+	else
+		{
+		User::RequestComplete(status, aErrorCode.Int());
+		}
+	delete iAsyncFileRecognition;
+	iAsyncFileRecognition = 0;
+	}
+
+
+///////////////////////////////////////
+// CDataRecognitionResultArrayEntry
+///////////////////////////////////////
+
+CDataRecognitionResultArrayEntry::CDataRecognitionResultArrayEntry(HBufC* aFileName, HBufC8* aDataType, TUid aUid, TInt aConfidence)
+	: iFileName(aFileName), 
+	  iDataType(aDataType), 
+	  iUid(aUid), 
+	  iConfidence(aConfidence)
+	{
+	}
+
+CDataRecognitionResultArrayEntry::~CDataRecognitionResultArrayEntry()
+	{
+	delete iFileName;
+	delete iDataType;
+	}
+
+void CDataRecognitionResultArrayEntry::GetDataRecognitionResult(TDataRecognitionResult& aResult) const
+	{
+	TDataRecognitionResult result;
+	if(iDataType->Length() != 0)
+		{
+		TDataType dataType(*iDataType);
+		result.iDataType = dataType;
+		}
+	else
+		{
+		TDataType dataType(iUid);
+		result.iDataType = dataType;
+		}
+	result.iConfidence = iConfidence;
+	aResult = result;
+	}
+
+const TDesC& CDataRecognitionResultArrayEntry::FileName() const
+	{
+	if (iFileName == NULL)
+		return KNullDesC;
+	else
+		return *iFileName;
+	}
+
+
+///////////////////////////////////
+// CDataRecognitionResultArray
+///////////////////////////////////
+
+/**
+Constructor
+@publishedAll
+@released
+*/
+EXPORT_C CDataRecognitionResultArray::CDataRecognitionResultArray()
+	{
+	}
+
+/**
+Destructor
+@publishedAll
+@released
+*/
+EXPORT_C CDataRecognitionResultArray::~CDataRecognitionResultArray()
+	{
+	iEntries.ResetAndDestroy();
+	}
+
+/**
+Returns the path of the recognition results.
+@publishedAll
+@released
+@return The path of the recognition results
+*/
+EXPORT_C const TFileName& CDataRecognitionResultArray::Path() const
+	{
+	return iPath;
+	}
+
+/**
+Returns the number of entries in the CDataRecognitionResultArray.
+@publishedAll
+@released
+@return The number of entries in the CDataRecognitionResultArray.
+*/
+EXPORT_C TUint CDataRecognitionResultArray::Count() const
+	{
+	return iEntries.Count();
+	}
+
+/**
+Returns the recognition result of the given index.
+@publishedAll
+@released
+@param aResult On successful completion, this parameter contains the recognition result at the given index.
+@param aIndex The index of the recognition result to be returned. An invalid index causes
+the function to leave with KErrNotFound.
+@return The requested TDataRecognitionResult object
+@leave KErrNotFound An invalid index is passed
+*/
+EXPORT_C void CDataRecognitionResultArray::GetDataRecognitionResultL(TDataRecognitionResult& aResult, const TUint aIndex) const
+	{
+	if( aIndex >= iEntries.Count() )
+		{
+		User::Leave(KErrNotFound);
+		}
+	iEntries[aIndex]->GetDataRecognitionResult(aResult);
+	}
+
+/**
+Returns the file name of the object at the given index.
+@publishedAll
+@released
+@param aFileName On successful completion, this parameter contains the file name of the object at the given index. 
+@param aIndex Specifies which file name to be returned. An invalid index causes
+the function to leave with KErrNotFound.
+@return The requested file name
+@leave KErrNotFound An invalid index is passed
+*/
+EXPORT_C void CDataRecognitionResultArray::GetFileNameL(TFileName& aFileName, const TUint aIndex) const
+	{
+	if( aIndex >= iEntries.Count() )
+		{
+		User::Leave(KErrNotFound);
+		}
+	aFileName.Zero();
+	aFileName.Copy( (iEntries[aIndex]->FileName()) );
+	}
+
+TUint CDataRecognitionResultArray::InternalizeL(const CBufFlat& aBuffer)
+	{
+	RBufReadStream readStream;
+	
+	readStream.Open(aBuffer);
+	const TInt count=readStream.ReadUint32L();
+	for (TInt i=0; i<count; ++i)
+		{
+		const TInt fileNameLength = readStream.ReadUint8L();
+		HBufC* const fileName = HBufC::NewLC(fileNameLength);
+		TPtr fileNamePtr = fileName->Des();
+		readStream.ReadL(fileNamePtr,fileNameLength);
+
+		const TInt dataTypeLength = readStream.ReadUint8L();
+		HBufC8* const dataType = HBufC8::NewLC(dataTypeLength);
+		TPtr8 dataTypePtr = dataType->Des();
+		readStream.ReadL(dataTypePtr,dataTypeLength);
+
+		TUid uid;
+		uid.iUid = readStream.ReadInt32L();
+		
+		TInt const confidence = readStream.ReadInt32L();
+		
+		CDataRecognitionResultArrayEntry* entry = new (ELeave) CDataRecognitionResultArrayEntry(fileName,dataType,uid,confidence);
+		iEntries.Append(entry);
+		
+		CleanupStack::Pop(dataType);	// ownership was transferred to "entry"
+		CleanupStack::Pop(fileName);	// ownership was transferred to "entry"
+		}
+
+	readStream.Close();
+		
+	return KErrNone;
+	}
+
+void CDataRecognitionResultArray::SetPath(const TFileName& aPath)
+	{
+	iPath.Copy(aPath);
+	}
+
+////////////////////////////////////
+//RApaLsSession
+////////////////////////////////////
+
+EXPORT_C RApaLsSession::RApaLsSession()
+	: iExtension(0)
+	{}
+
+
+
+/** Connects a client to the application architecture server, creating a session 
+with it.
+
+@return KErrNone if successful; otherwise, one of the system-wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::Connect()
+	{
+	TInt r=CreateSession(KAppListServerName,Version(),KAsyncMessageSlots);
+	return(r); 
+	}
+
+
+
+/** Gets the version of the application architecture server.
+
+@return The version number. 
+*/
+EXPORT_C TVersion RApaLsSession::Version(void) const
+	{
+	return(TVersion(KAppListServMajorVersionNumber,KAppListServMinorVersionNumber,KAppListServBuildVersionNumber));
+	}
+
+
+
+/** Gets the total number of applications.
+
+Control panel applications are excluded.
+
+@param aCount On return, the total number of applications.
+@return KErrNone if successful, otherwise one of the system-wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::AppCount(TInt& aCount) const
+	{
+	return DoAppCount(aCount,EAppListServAppCount);
+	}
+
+
+
+/** Gets the total number of embeddable applications.
+
+Control panel applications are excluded.
+
+@param aCount On return, the total number of embeddable applications.
+@return KErrNone, if successful, otherwise one of the system-wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::EmbeddableAppCount(TInt& aCount) const
+	{
+	return DoAppCount(aCount,EAppListServEmbedCount);
+	}
+
+TInt RApaLsSession::DoAppCount(TInt& aCount,TInt aCommand) const
+// returns the number of embeddable apps in the server side list
+	{
+	__ASSERT_DEBUG(aCommand==EAppListServEmbedCount || aCommand==EAppListServAppCount,Panic(EDPanicWrongCommand));
+	const TInt returnValue=SendReceiveWithReconnect(aCommand,TIpcArgs());
+	if (returnValue<0)
+		{
+		return returnValue;
+		}
+	aCount=returnValue;
+	return KErrNone;
+	}
+
+
+
+/** Initialises the process of getting all applications in the cached list.
+
+Control panel applications are excluded.
+
+A call to this function is followed by subsequent and repeated calls to GetNextApp() 
+to retrieve all applications in the cached list.
+
+@return KErrNone, if successful, otherwise one of the system-wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::GetAllApps() const
+	{
+	return GetAllApps(0);
+	}
+
+
+
+/** Initialises the process of getting all applications in the cached list.
+
+Control panel applications are excluded.
+
+A call to this function is followed by subsequent and repeated calls to GetNextApp() 
+to retrieve all applications supporting aScreenMode in the cached list.
+
+@param aScreenMode Only applications which define a view supporting aScreenMode
+will be returned by subsequent calls to GetNextApp(). If an application does not
+define views in it's application information file, only screen mode 0 is supported.
+@return KErrNone, if successful, otherwise one of the system-wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::GetAllApps(TInt aScreenMode) const
+	{
+	return GetFilteredApps(TApaAppCapability::EControlPanelItem, 0, aScreenMode); // exclude control panel apps
+	}
+
+
+
+/** Initialises the process of getting all embeddable applications from the cached list.
+
+Control panel applications are excluded.
+
+A call to this function is followed by subsequent and repeated calls to GetNextApp() 
+to retrieve embeddable applications in the cached list.
+
+Only applications which specify KAppEmbeddable or KAppEmbeddableOnly in their
+application information file will be returned by subsequent calls to GetNextApp().
+
+@return KErrNone, if successful, otherwise one of the system-wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::GetEmbeddableApps() const
+	{
+	return GetEmbeddableApps(0);
+	}
+
+
+
+/** Initialises the process of getting embeddable applications from the cached list
+that support the specified screen mode.
+
+Control panel applications are excluded.
+
+A call to this function is followed by subsequent and repeated calls to GetNextApp() 
+to retrieve embeddable applications in the cached list.
+
+Only applications which specify KAppEmbeddable or KAppEmbeddableOnly in their
+application information file will be returned by subsequent calls to GetNextApp().
+
+@param aScreenMode Only embeddable applications which define a view supporting
+aScreenMode will be returned by subsequent calls to GetNextApp(). If an application
+does not define views in it's application information file, only screen mode 0 is supported.
+@return KErrNone, if successful, otherwise one of the system-wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::GetEmbeddableApps(TInt aScreenMode) const
+	{
+	TApaEmbeddabilityFilter filter;
+	filter.AddEmbeddability(TApaAppCapability::EEmbeddable);
+	filter.AddEmbeddability(TApaAppCapability::EEmbeddableOnly);
+	return GetFilteredApps(filter, aScreenMode);
+	}
+
+
+
+/** Initialises the process of getting all applications matching aFilter in the
+cached list.
+
+Control panel applications are excluded.
+
+A call to this function is followed by subsequent and repeated calls to GetNextApp() 
+to retrieve all applications matching aFilter in the cached list.
+
+@param aFilter Defines the filter to be applied to the cached list.
+@return KErrNone, if successful, otherwise one of the system-wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::GetFilteredApps(const TApaEmbeddabilityFilter& aFilter) const
+	{
+	return GetFilteredApps(aFilter, 0);
+	}
+
+
+
+/** Initialises the process of getting all applications matching aFilter in the
+cached list.
+
+Control panel applications are excluded.
+
+A call to this function is followed by subsequent and repeated calls to GetNextApp() 
+to retrieve all applications matching aFilter in the cached list.
+
+@param aFilter Defines the filter to be applied to the cached list.
+@param aScreenMode Only applications which define a view supporting aScreenMode
+will be returned by subsequent calls to GetNextApp(). If an application does not
+define views in it's application information file, only screen mode 0 is supported.
+@return KErrNone, if successful, otherwise one of the system-wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::GetFilteredApps(const TApaEmbeddabilityFilter& aFilter, TInt aScreenMode) const
+	{
+	const TPckgC<TApaEmbeddabilityFilter> filter(aFilter);
+	return SendReceiveWithReconnect(EAppListServInitFilteredEmbedList,TIpcArgs(aScreenMode,&filter));
+	}
+
+
+
+/** Initialises the process of getting all applications matching the specified
+application attributes.
+
+A call to this function is followed by subsequent and repeated calls to GetNextApp() 
+to retrieve all applications matching the filter in the cached list.
+
+Attributes are defined by TApaAppCapability::TCapabilityAttribute
+
+@param aCapabilityAttributeMask Specifies the attributes whose values will be
+used to filter the cached list. If the mask specifies more than one attribute,
+all associated attribute values must match.
+@param aCapabilityAttributeValue Specifies the attribute values for each attribute
+identified by the mask.
+@return KErrNone, if successful, otherwise one of the system-wide error codes.
+@see TCapabilityAttribute 
+*/
+EXPORT_C TInt RApaLsSession::GetFilteredApps(TUint aCapabilityAttributeMask, TUint aCapabilityAttributeValue) const
+	{
+	return GetFilteredApps(aCapabilityAttributeMask, aCapabilityAttributeValue, 0);
+	}
+
+
+
+/** Initialises the process of getting all applications matching the specified
+application attributes.
+
+A call to this function is followed by subsequent and repeated calls to GetNextApp() 
+to retrieve all applications matching the filter in the cached list.
+
+Attributes are defined by TApaAppCapability::TCapabilityAttribute
+
+@param aCapabilityAttributeMask Specifies the attributes whose values will be
+used to filter the cached list. If the mask specifies more than one attribute,
+all associated attribute values must match.
+@param aCapabilityAttributeValue Specifies the attribute values for each attribute
+identified by the mask.
+@param aScreenMode Only applications which define a view supporting aScreenMode
+will be returned by subsequent calls to GetNextApp(). If an application does not
+define views in it's application information file, only screen mode 0 is supported.
+@return KErrNone, if successful, otherwise one of the system-wide error codes.
+@see TCapabilityAttribute 
+*/
+EXPORT_C TInt RApaLsSession::GetFilteredApps(TUint aCapabilityAttributeMask, TUint aCapabilityAttributeValue, TInt aScreenMode) const
+	{
+	return SendReceiveWithReconnect(EAppListServInitAttrFilteredList,TIpcArgs(aScreenMode, aCapabilityAttributeMask, aCapabilityAttributeValue));
+	}
+
+
+
+/** Initialises the process of getting server applications in the cached list.
+
+Control panel applications are excluded.
+
+A call to this function is followed by subsequent and repeated calls to GetNextApp() 
+to retrieve server applications in the cached list.
+
+Only applications which specify one or more services in their application
+information file will be returned by subsequent calls to GetNextApp().
+
+@return KErrNone, if successful, otherwise one of the system-wide error codes.
+@publishedPartner
+@released
+*/
+EXPORT_C TInt RApaLsSession::GetServerApps(TUid aServiceUid) const
+	{
+	return GetServerApps(aServiceUid, 0);
+	}
+
+
+
+/** Initialises the process of getting server applications in the cached list.
+
+Control panel applications are excluded.
+
+A call to this function is followed by subsequent and repeated calls to GetNextApp() 
+to retrieve server applications in the cached list.
+
+Only applications which specify one or more services in their application
+information file will be returned by subsequent calls to GetNextApp().
+
+@param aScreenMode Only server applications which define a view supporting
+aScreenMode will be returned by subsequent calls to GetNextApp(). If an application
+does not define views in its application information file, only screen mode 0 is supported.
+@return KErrNone, if successful, otherwise one of the system-wide error codes.
+@publishedPartner
+@released
+*/
+EXPORT_C TInt RApaLsSession::GetServerApps(TUid aServiceUid, TInt aScreenMode) const
+	{
+	return SendReceiveWithReconnect(EAppListServInitServerAppList,TIpcArgs(aScreenMode, aServiceUid.iUid));
+	}
+
+
+
+/** Gets information about the next application or embeddable application from 
+the cached list.
+
+A sequence of calls to this function must always be preceded by a call to 
+one of GetAllApps(), GetEmbeddableApps() or GetFilteredApps().
+
+@param aInfo On return, contains application information.
+@return KErrNone if successful; ENoMoreAppsInList, if there are no more applications 
+in the list; EAppListInvalid if the server's initial population of the list has
+not completed; otherwise one of the other system wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::GetNextApp(TApaAppInfo& aInfo) const
+	{
+	return GetNextApp(aInfo,0);
+	}
+
+
+
+/** Gets information about the next application or embeddable application from 
+the cached list.
+
+A sequence of calls to this function must always be preceded by a call to 
+one of GetAllApps(), GetEmbeddableApps() or GetFilteredApps().
+
+@param aInfo On return, contains application information.
+@param aScreenMode This parameter is ignored.
+@return KErrNone if successful; ENoMoreAppsInList, if there are no more applications 
+in the list; EAppListInvalid if the server's initial population of the list has
+not completed; otherwise one of the other system wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::GetNextApp(TApaAppInfo& aInfo,TInt aScreenMode) const
+	{
+	TPckg<TApaAppInfo> info(aInfo);
+	TInt ret=SendReceiveWithReconnect(EAppListServGetNextApp,TIpcArgs(aScreenMode,&info));
+	if (ret==KErrNone)
+		aInfo = info();
+	else if (ret==KErrNotFound)
+		ret = ENoMoreAppsInList;
+	else if (ret==KErrCorrupt)
+		ret = EAppListInvalid;
+	return ret;
+	}
+
+
+
+/** Gets information about the application with the specified UID.
+
+@param aInfo On return, contains the application information, if an application 
+with the specified UID is found. If no matching application is found, then 
+this object is not changed.
+@param aAppUid The application specific UID.
+@return KErrNone if successful; KErrNotFound if a matching entry could not be found; 
+otherwise one of the other system wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::GetAppInfo(TApaAppInfo& aInfo,TUid aAppUid) const
+	{
+	TPckg<TApaAppInfo> info(aInfo);
+	return SendReceiveWithReconnect(EAppListServGetAppInfo,TIpcArgs(aAppUid.iUid,&info));
+	} //lint !e1764 Suppress reference parameter 'aInfo' could be declared const ref
+	
+/** Sets the short caption of the application.
+
+Overrides the short caption specified in the localizable resource file for this application.
+Short captions set using this API will only take effect until the next device reset.
+
+@param aShortCaption The short caption of the application. The maximum length allowed is KApaMaxAppCaption.
+@param aLanguage The language corresponding to the caption. If this is ELangNone the caption is used
+for all languages for which a language specific short caption has not been set.
+@param aAppUid The uid of the application.
+@return KErrNone if successful, otherwise one of the system wide error codes.
+*/ 
+EXPORT_C TInt RApaLsSession::SetAppShortCaption(const TDesC& aShortCaption, TLanguage aLanguage, TUid aAppUid)
+	{
+	if (aShortCaption.Length() > KApaMaxAppCaption || aShortCaption.Length() == 0)
+		{
+		return KErrArgument;
+		}
+	return SendReceiveWithReconnect(EAppListServSetAppShortCaption, TIpcArgs(aAppUid.iUid, &aShortCaption, aLanguage));
+	} //lint !e1762 Suppress member function could be made const
+
+/** Gets the default screen-number of the application with the specified UID.
+
+@param aDefaultScreenNumber On return, contains the default screen-number, if an application 
+with the specified UID is found. If no matching application is found, then 
+this object is not changed.
+@param aAppUid The application specific UID.
+@return KErrNone if successful; KErrNotFound if a matching entry could not be found; 
+otherwise one of the other system wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::GetDefaultScreenNumber(TInt& aDefaultScreenNumber, TUid aAppUid) const
+	{
+	const TInt result=SendReceiveWithReconnect(EAppListServGetDefaultScreenNumber, TIpcArgs(aAppUid.iUid));
+	if (result<0)
+		{
+		return result;
+		}
+	aDefaultScreenNumber=result;
+	return KErrNone;
+	}
+
+
+/** Gets the capabilities of the application with the specified UID.
+
+@param aCapabilityBuf A modifiable descriptor that, on return, contains the 
+application's capability information. The data returned in the descriptor 
+is mapped by the TApaAppCapability class. If no matching application is found, 
+then the content of this descriptor is not changed.
+@param aAppUid The application specific UID.
+@return KErrNone, if successful; KErrNotFound, if no matching entry can be found; otherwise 
+one of the other system wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::GetAppCapability(TDes8& aCapabilityBuf,TUid aAppUid) const
+	{
+	return SendReceiveWithReconnect(EAppListServGetAppCapability,TIpcArgs(&aCapabilityBuf,aAppUid.iUid));
+	}
+
+
+
+/** Starts an application defined by the specified command line information.
+    This is an asynchronous method which doesn't wait for the process creation to complete.
+    To be informed of the process creation success, 
+    then appropriate overloaded method taking a TRequestStatus parameter should be used.
+    
+This is only recommended for non document based applications.
+
+View based applications are usually started by activating a specific view 
+using CCoeAppUi::ActivateViewL. Alternatively, using StartApp() to start a 
+view based application will activate the application's default view.
+
+@param aCommandLine The command line.
+@return KErrNone, if successful; KErrNotFound, if the application cannot be 
+found; otherwise one of the other system-wide error codes. 
+@see CCoeAppUi::ActivateViewL() 
+*/
+EXPORT_C TInt RApaLsSession::StartApp(const CApaCommandLine& aCommandLine)
+	{
+	return DoStartApp(aCommandLine, NULL,NULL);
+	}
+	
+/** Starts an application defined by the specified command line information.
+    This is an asynchronous method which doesn't wait for the process creation to complete.
+    To be informed of the process creation success, 
+    then appropriate overloaded method taking a TRequestStatus parameter should be used.
+
+This is only recommended for non document based applications.
+
+View based applications are usually started by activating a specific view 
+using CCoeAppUi::ActivateViewL. Alternatively, using StartApp() to start a 
+view based application will activate the application's default view.
+
+@param aCommandLine The command line.
+@param aThreadId On return, the id of the main thread started.
+@return KErrNone, if successful; KErrNotFound, if the application cannot be 
+found; otherwise one of the other system-wide error codes. 
+@see CCoeAppUi::ActivateViewL() 
+*/	
+EXPORT_C TInt RApaLsSession::StartApp(const CApaCommandLine& aCommandLine,TThreadId& aThreadId)
+	{
+	return DoStartApp(aCommandLine, &aThreadId,NULL);
+	}
+
+	
+/** Starts an application defined by the specified command line information.
+
+This is only recommended for non document based applications.
+
+View based applications are usually started by activating a specific view 
+using CCoeAppUi::ActivateViewL. Alternatively, using StartApp() to start a 
+view based application will activate the application's default view.
+
+@param aCommandLine The command line.
+@param aThreadId On return, the id of the main thread started.
+@param aRequestStatusForRendezvous If not NULL, the asynchronous RProcess::Rendezvous() 
+function is called (being passed this TRequestStatus object) before RProcess::Resume() is called on 
+the new application process. If this function does not return KErrNone, RProcess::Rendezvous() will
+not be called passing aRequestStatusForRendezvous, so in this case the caller must not wait
+on aRequestStatusForRendezvous.
+@return KErrNone, if successful; KErrNotFound, if the application cannot be 
+found; otherwise one of the other system-wide error codes. 
+@see CCoeAppUi::ActivateViewL() 
+*/
+EXPORT_C TInt RApaLsSession::StartApp(const CApaCommandLine& aCommandLine,TThreadId& aThreadId,TRequestStatus* aRequestStatusForRendezvous )
+	{
+	return DoStartApp(aCommandLine, &aThreadId,aRequestStatusForRendezvous);
+	}
+
+
+TInt RApaLsSession::DoStartApp(const CApaCommandLine& aCommandLine, TThreadId* aThreadId,TRequestStatus* aRequestStatusForRendezvous)
+	{
+	TRAPD(error, DoStartAppL(aCommandLine, aThreadId, aRequestStatusForRendezvous));
+	return error;
+	}
+
+void RApaLsSession::DoStartAppL(const CApaCommandLine& aCommandLine, TThreadId* aThreadId,TRequestStatus* aRequestStatusForRendezvous)
+	{
+	// This function does not require "this" object to be connected to the Apparc server,
+	// but if not, it works with some limitations (see the following document for a list
+	// of these limitations: 
+	// generic/app-framework/Documentation/PREQ967_solution_constraints.doc).
+
+#if defined(USE_IH_RAISE_EVENT)
+	const TInt appStartupInstrumentationEventIdBase=aCommandLine.AppStartupInstrumentationEventIdBase();
+	if (appStartupInstrumentationEventIdBase!=0)
+		{
+		IH_DECLARE( lInstrumentationHandler );
+		IH_CREATE( lInstrumentationHandler );
+		IH_RAISE_EVENT( lInstrumentationHandler, appStartupInstrumentationEventIdBase+MTestInstrumentation::TIDOffsetBeginApplicationFirstRedraw );
+		IH_RAISE_EVENT( lInstrumentationHandler, appStartupInstrumentationEventIdBase+MTestInstrumentation::TIDOffsetBeginApplicationReadyForInput );
+		IH_DELETE( lInstrumentationHandler );
+		}
+#endif
+
+ 	// Retrieve the executable name from the CApaCommandLine object passed in.
+	const TPtrC logicalExecutableName(aCommandLine.ExecutableName());
+	// Rule-based app launching is not allowed unless there is a connected RApaLsSession object.
+	if(Handle() != KNullHandle)
+		{
+		// requesting from rule-based plug-ins if we can run an application 
+		// if server fails while requested rule-based plug-ins it returns a negative value - proceed with launching the application in this case
+		TBool okayToRun = SendReceiveWithReconnect(EAppListServRuleBasedLaunching, TIpcArgs(&logicalExecutableName));
+		if(!okayToRun)
+			{
+			User::Leave(KErrCancel);
+			}
+		}
+
+	TFileName nativeExecutableNameOfNonNativeApplication;
+	RProcess process;
+	HBufC8* opaqueData=NULL;
+	CleanupStack::PushL(TCleanupItem(DeletePointerToPointerToTAny, &opaqueData));
+
+	// if we're connected to the Apparc server, try to get the opaque-data and native-executable name
+	// (the latter is only if it's a non-native application that we're launching)
+	if (Handle()!=KNullHandle)
+		{
+		const TInt lengthOfOpaqueData=User::LeaveIfError(SendReceiveWithReconnect(EAppListServGetNativeExecutableNameIfNonNative, TIpcArgs(&nativeExecutableNameOfNonNativeApplication, &logicalExecutableName)));
+		if (lengthOfOpaqueData>0)
+			{
+			User::LeaveIfError(GetOpaqueData(opaqueData, lengthOfOpaqueData));
+			}
+		}
+
+	// try first to create the application process without interacting with the Apparc server at all - 
+	// assumes "logicalExecutableName" is itself a native executable
+	TUidType uidType(KNullUid, KNullUid, KNullUid);
+	TInt err = process.CreateWithStackOverride(logicalExecutableName, KNullDesC, uidType, MinApplicationStackSize(), EOwnerProcess);
+	 
+	// If we haven't been able to create the process using the native executable name from the command line
+	// object, instead try to create it using the native executable name of the non-native application.
+	// Can only do this if apparc is connected and thus this name has been retrieved above and 
+	// nativeExecutableNameOfNonNativeApplication populated.
+	if ((err != KErrNone) && nativeExecutableNameOfNonNativeApplication.Length()>0)
+			{
+			err = process.CreateWithStackOverride(nativeExecutableNameOfNonNativeApplication, KNullDesC, uidType, MinApplicationStackSize(), EOwnerProcess);
+			}
+
+	// if we managed to create the process via either of the two methods attempted above (with the native 
+	// name or the native name of the non-native app), finish setting it up and "resume" it
+	if (err == KErrNone)
+		{
+		CleanupStack::PushL(TCleanupItem(CleanupOperation, &process));
+		if (opaqueData!=NULL)
+			{
+			const_cast<CApaCommandLine&>(aCommandLine).SetOpaqueDataL(*opaqueData);
+			}
+		aCommandLine.SetProcessEnvironmentL(process);
+		if (aThreadId!=NULL)
+			{
+			GetThreadIdL(*aThreadId, process);
+			}
+		if (aRequestStatusForRendezvous!=NULL)
+			{
+			process.Rendezvous(*aRequestStatusForRendezvous);
+			}
+		// Note - must not leave between here and the end of this method because we only expect
+		// the caller to wait on aRequestStatusForRendezvous if this method does not leave.
+		if(aRequestStatusForRendezvous != NULL && *aRequestStatusForRendezvous != KRequestPending)
+			{
+			User::WaitForRequest(*aRequestStatusForRendezvous);
+			User::Leave(aRequestStatusForRendezvous->Int()); // item on cleanupstack terminates and closes the process
+			}
+		else
+			{
+			process.Resume();	
+			}
+		CleanupStack::Pop(&process);	
+		process.Close();
+		}
+	else // Couldn't create a process
+		{
+		if (Handle()==KNullHandle) // not connected to apparc
+			{
+			const TPtrC executableName(aCommandLine.ExecutableName());
+			
+			// Java applications have an empty ExecutableName, as they use the CApaCommandLine's
+			// opaque-data attribute. Not connected to apparc so can't start a non-native app.
+			// Therefore we should handle this case with KErrNotSupported rather than whatever
+			// RProcess::Create returns when passed an empty descriptor.  
+			if (executableName.Length() == 0)
+				{
+				User::Leave(KErrNotSupported);
+				}
+				
+			// Otherwise return the error code from RProcess::Create.
+			User::Leave(err);
+			
+			}
+		else // Handle()!=KNullHandle
+			{
+			// we can only proceed with the remaining option if we're connected to the Apparc server	
+			// as a last resort, try use the legacy file-recognizer framework to launch the application
+			TThreadId dummyThreadId;
+			TPckg<TThreadId> threadId((aThreadId!=NULL)? *aThreadId: dummyThreadId);
+			const TInt opcode=(aThreadId==NULL)?
+									EAppListServStartAppWithoutReturningThreadId:
+									EAppListServStartAppReturningThreadId;
+			TIpcArgs ipcArgs;
+			aCommandLine.GetIpcArgsLC(ipcArgs);
+			if (aThreadId!=NULL)
+				{
+				ipcArgs.Set(CApaCommandLine::EIpcFirstFreeSlot, &threadId);
+				}
+			User::LeaveIfError(SendReceiveWithReconnect(opcode, ipcArgs));
+			if (aRequestStatusForRendezvous!=NULL)
+				{
+				User::RequestComplete(aRequestStatusForRendezvous,KErrNone);
+				}
+			CleanupStack::PopAndDestroy(); // the TIpcArgs
+			}
+		}
+	CleanupStack::PopAndDestroy(&opaqueData);
+	} //lint !e1762 Suppress member function could be made const
+	
+void RApaLsSession::CleanupOperation(TAny* aAny)
+	{
+	RProcess* activeProcess = reinterpret_cast<RProcess*>(aAny);	
+	activeProcess->Terminate(KErrGeneral);
+	activeProcess->Close();
+	}
+	
+void RApaLsSession::GetThreadIdL(TThreadId& aThreadId, const RProcess& aProcess)
+	{ // static
+	TFullName fullName(aProcess.Name());
+	_LIT(KCCMain,"::Main");
+	fullName.Append(KCCMain);
+	RThread thread;
+	User::LeaveIfError(thread.Open(fullName,EOwnerThread));
+	aThreadId=thread.Id();
+	thread.Close();
+	}
+
+void RApaLsSession::DeletePointerToPointerToTAny(TAny* aPointerToPointerToTAny)
+	{ // static
+	__ASSERT_ALWAYS(aPointerToPointerToTAny, Panic(EPanicNullPointer));
+	delete *static_cast<TAny**>(aPointerToPointerToTAny); //lint !e613 Suppress possible use of null pointer
+	} //lint !e818 Suppress pointer parameter could be declared as pointing to const
+
+/**
+Sets up slots 0 and 1 in aIpcArgs - assumes that slots 2 and 3 have already been set up; 
+it then invokes aOpcode
+*/
+TInt RApaLsSession::GetExecutableName(TDes& aNativeExecutableName, TDes& aLogicalExecutableName, HBufC8*& aOpaqueData, TIpcArgs& aIpcArgs, TInt aOpcode) const
+	{
+	aNativeExecutableName.SetLength(0); // if this comes out zero-length from EAppListServExecutableNameForXxx below then use the logicalExecutableName in RProcess::Create (in this case it's a native C++ application)
+	aIpcArgs.Set(0, &aNativeExecutableName);
+	aIpcArgs.Set(1, &aLogicalExecutableName);
+	const TInt lengthOfOpaqueData=SendReceiveWithReconnect(aOpcode, aIpcArgs);
+	if (lengthOfOpaqueData<0)
+		{
+		return lengthOfOpaqueData; // it's an error code
+		}
+	if (lengthOfOpaqueData>0)
+		{
+		return GetOpaqueData(aOpaqueData, lengthOfOpaqueData);
+		}
+	aOpaqueData=NULL;
+	return KErrNone;
+	}
+
+TInt RApaLsSession::GetOpaqueData(HBufC8*& aOpaqueData, TInt aLengthOfOpaqueData) const
+	{
+	HBufC8* const opaqueData=HBufC8::New(aLengthOfOpaqueData);
+	if (opaqueData==NULL)
+		{
+		return KErrNoMemory;
+		}
+	TPtr8 opaqueData_asWritable(opaqueData->Des());
+	const TInt error=SendReceiveWithReconnect(EAppListServGetOpaqueData, TIpcArgs(&opaqueData_asWritable));
+	if (error!=KErrNone)
+		{
+		delete opaqueData;
+		return error;
+		}
+	aOpaqueData=opaqueData;
+	return error;
+	}
+
+TInt RApaLsSession::StartApplicationPassingFileHandle(const TDesC& aNativeExecutableName, const TDesC& aLogicalExecutableName, const TDesC8* aOpaqueData, const RFile& aFile, TThreadId& aThreadId, TRequestStatus* aRequestStatusForRendezvous)
+	{
+	TFileName documentName;
+	aFile.FullName(documentName);
+	CApaCommandLine* commandLine=NULL;	
+	TRAPD(error, commandLine=CApaCommandLine::NewLC();
+			commandLine->SetCommandL(EApaCommandOpen);
+			commandLine->SetExecutableNameL(aLogicalExecutableName);
+			commandLine->SetFileByHandleL(aFile);
+			commandLine->SetDocumentNameL(documentName);
+			if (aOpaqueData!=NULL)
+				{
+				commandLine->SetOpaqueDataL(*aOpaqueData);
+				}
+			StartApplicationL(aNativeExecutableName, *commandLine, aThreadId, aRequestStatusForRendezvous);
+			CleanupStack::PopAndDestroy(commandLine));
+	return error;
+	}
+	
+TInt RApaLsSession::StartApplicationPassingDocumentName(const TDesC& aNativeExecutableName, const TDesC& aLogicalExecutableName, const TDesC8* aOpaqueData, const TDesC& aDocumentName, TThreadId& aThreadId,TApaCommand aCommand, TRequestStatus* aRequestStatusForRendezvous)
+	{
+	CApaCommandLine* commandLine=NULL;
+	TRAPD(error, commandLine=CApaCommandLine::NewLC();
+			commandLine->SetCommandL(aCommand);
+			commandLine->SetExecutableNameL(aLogicalExecutableName);
+			commandLine->SetDocumentNameL(aDocumentName);
+			if (aOpaqueData!=NULL)
+				{
+				commandLine->SetOpaqueDataL(*aOpaqueData);
+				}
+			StartApplicationL(aNativeExecutableName, *commandLine, aThreadId, aRequestStatusForRendezvous);
+			CleanupStack::PopAndDestroy(commandLine));
+	return error;
+	}
+
+void RApaLsSession::StartApplicationL(const TDesC& aNativeExecutableName, const CApaCommandLine& aCommandLine, TThreadId& aThreadId, TRequestStatus* aRequestStatusForRendezvous)
+	{ 
+	RProcess process;
+	TPtrC actualNativeExecutableName(aNativeExecutableName);
+	if (actualNativeExecutableName.Length()==0)
+		{
+		actualNativeExecutableName.Set(aCommandLine.ExecutableName()); // it's a native C++ application, rather than a MIDlet, Python script, etc
+		}
+
+	if(Handle() != KNullHandle)
+		{
+		//requesting from rule-based plug-ins if we can run an application 
+		TBool okayToRun = SendReceiveWithReconnect(EAppListServRuleBasedLaunching, TIpcArgs(&actualNativeExecutableName));
+		//If server fails while requested rule-based plug-ins it returns a negative value. 
+		//We shall proceed with launching an application in this case.
+		if(!okayToRun)
+			{
+			User::Leave(KErrCancel); 
+			}
+		}
+
+	TUidType uidType(KNullUid, KNullUid, KNullUid);
+	User::LeaveIfError(process.CreateWithStackOverride(actualNativeExecutableName, KNullDesC, uidType, MinApplicationStackSize(), EOwnerProcess)); // RProcess::CreateWithStackOveride - TESTED
+		
+	CleanupClosePushL(process);
+	aCommandLine.SetProcessEnvironmentL(process);
+	GetThreadIdL(aThreadId, process);
+	if (aRequestStatusForRendezvous!=NULL)
+		{
+		process.Rendezvous(*aRequestStatusForRendezvous);
+		}
+	process.Resume();
+	CleanupStack::PopAndDestroy(&process);
+	} //lint !e1762 Suppress member function could be made const
+
+
+
+/** Gets the data (MIME) type for data taken from a file with a specified name.
+
+@param aName The full filename, including drive and path, of the file containing the data.
+@param aBuffer A buffer containing data taken from the specified file; typically 
+the data is read from the beginning of the file.
+@param aDataType On return, contains the result of the attempt to recognize 
+data. 
+@return KErrNone, if successful; otherwise one of the other system-wide error 
+codes. 
+*/
+EXPORT_C TInt RApaLsSession::RecognizeData(const TDesC& aName, const TDesC8& aBuffer, TDataRecognitionResult& aDataType) const
+	{
+	TPckg<TDataRecognitionResult> result(aDataType);
+	return SendReceiveWithReconnect(EAppListServRecognizeData,TIpcArgs(&result, &aName, &aBuffer));
+	} //lint !e1764: Suppress reference parameter could be declared const ref
+
+/** Gets the data (MIME) type for data in a file passed by handle.
+
+@param aFile The file containing the data. Before this function can be called,
+the file server session which owns this file handle must first be marked as shareable by 
+calling RFs::ShareProtected().
+@param aDataType On return, contains the result of the attempt to recognize 
+data. 
+@return KErrNone, if successful; otherwise one of the other system-wide error 
+codes. */
+EXPORT_C TInt RApaLsSession::RecognizeData(const RFile& aFile, TDataRecognitionResult& aDataType) const
+	{
+	TPckg<TDataRecognitionResult> result(aDataType);
+	TIpcArgs ipcArgs(&result);
+	const TInt error = aFile.TransferToServer(ipcArgs, 1, 2);
+	if (error != KErrNone)
+		{
+		return error;
+		}
+	return SendReceiveWithReconnect(EAppListServRecognizeDataPassedByFileHandle,ipcArgs);
+	} //lint !e1764 Suppress reference parameter 'aDataType' could be declared const ref
+
+
+
+/** Tests whether data taken from a named file has the specified 
+data (MIME) type.
+
+@param aName The name of the file containing the data.
+@param aBuffer A buffer containing data taken from the specified file; typically 
+the data is read from the beginning of the file.
+@param aDataType The data (MIME) type.
+@param aResult On return, contains the result of the test.
+@return KErrNone, if successful; otherwise one of the other system-wide error 
+codes. 
+*/
+EXPORT_C TInt RApaLsSession::RecognizeSpecificData(const TDesC& aName, const TDesC8& aBuffer, const TDataType& aDataType, TBool& aResult) const
+	{
+	const TPckgC<TDataType> dataType(aDataType);
+	const TInt returnValue=SendReceiveWithReconnect(EAppListServRecognizeSpecificData,TIpcArgs(&dataType, &aName, &aBuffer));
+	if (returnValue<0)
+		{
+		return returnValue;
+		}
+	aResult=returnValue;
+	return KErrNone;
+	}
+	
+EXPORT_C TInt RApaLsSession::RecognizeFilesL(const TDesC& aPath, CDataRecognitionResultArray& aResult) const
+/** 
+Gets the data (MIME) type for files in a specified directory. Because this call may take a long
+time to complete, the asynchronous version is strongly recommended. Furthermore, it is not possible
+to use this synchronous function while an asynchronous request is still active.
+@publishedAll
+@released
+@param aPath A valid path. Note that the path must end with a backslash.
+@param aResult If the call was successful, this parameter contains the recognition result.
+@return KErrNone, if successful; otherwise one of the other system-wide error codes.
+*/
+	{
+	return RecognizeFilesL(aPath, KAllDataTypes, aResult);
+	}
+
+EXPORT_C TInt RApaLsSession::RecognizeFilesL(const TDesC& aPath, const TDesC8& aDataType, CDataRecognitionResultArray& aResult) const
+/** 
+Gets the data (MIME) type for files in a specified directory. Because this call may take a long
+time to complete, the asynchronous version is strongly recommended. Furthermore, it is not possible
+to use this synchronous function while an asynchronous request is still active.
+@publishedAll
+@released
+@param aPath A valid path. Note that the path must end with a backslash.
+@param aDataType A data type filter. Wildcards are allowed. For example, "text*" would also
+add "text/plain" data types to the result.
+@param aResult If the call was successful, this parameter contains the recognition result.
+@return KErrNone, if successful; otherwise one of the other system-wide error codes.
+*/
+	{
+	if(iExtension && iExtension->RecognitionActive())
+		{
+		return KErrInUse;
+		}
+	_LIT(KBackslash,"\\");
+	if(aPath.Right(1) != KBackslash)
+		{
+		return KErrPathNotFound;
+		}
+
+	TPckgBuf<TUint> requiredBufferSizePckg;
+	aResult.SetPath(aPath);
+	TInt error = SendReceiveWithReconnect(EAppListServRecognizeFiles,TIpcArgs(&aPath,&requiredBufferSizePckg,&aDataType));
+	if(KErrNone == error)
+		{
+		error=TransferAndInternalizeDataL(aPath, requiredBufferSizePckg(), aResult);
+		}
+	return error;
+
+	}
+
+EXPORT_C void RApaLsSession::RecognizeFilesL(const TDesC& aPath, CDataRecognitionResultArray& aResult, TRequestStatus& aStatus)
+/** 
+Gets the data (MIME) type for files in a specified directory.
+@publishedAll
+@released
+@param aPath A valid path. Note that the path must end with a backslash.
+@param aResult If the call was successful, this parameter contains the recognition result.
+@param aStatus A request status object.
+*/
+	{
+	RecognizeFilesL(aPath,KAllDataTypes,aResult,aStatus);
+	}
+
+EXPORT_C void RApaLsSession::RecognizeFilesL(const TDesC& aPath, const TDesC8& aDataType, CDataRecognitionResultArray& aResult, TRequestStatus& aStatus)
+/** 
+Gets the data (MIME) type for files in a specified directory.
+@publishedAll
+@released
+@param aPath A valid path. Note that the path must end with a backslash.
+@param aDataType A data type filter. Wildcards are allowed. For example, "text*" would also
+add "text/plain" data types to the result.
+@param aResult If the call was successful, this parameter contains the recognition result.
+@param aStatus A request status object
+*/
+	{
+	if(iExtension == NULL)
+		{
+		iExtension = new (ELeave) CApaLsSessionExtension(*this);
+		}
+	iExtension->RecognizeFilesL(aPath, aDataType, aResult, aStatus);
+	}
+
+TInt RApaLsSession::TransferAndInternalizeDataL(const TDesC& aPath, const TInt aRequiredBufferSize, CDataRecognitionResultArray& aResult) const
+/**
+This function transfers the data to the client-side and "fills" the CDataRecognitionResultArray object. 
+@internalComponent
+*/
+{
+	CBufFlat* const buffer=CBufFlat::NewL(aRequiredBufferSize);
+	CleanupStack::PushL(buffer);
+	buffer->ExpandL(0,aRequiredBufferSize);
+	TPtr8 bufPtr=buffer->Ptr(0);
+
+	// transfer recognition buffer
+	TInt error = SendReceiveWithReconnect(EAppListServTransferRecognitionResult,TIpcArgs(&aPath,&bufPtr,aRequiredBufferSize));
+	if(KErrNone == error)
+		{
+		error = aResult.InternalizeL(*buffer);
+		}
+	CleanupStack::PopAndDestroy(buffer);
+	return error;
+	}
+
+EXPORT_C void RApaLsSession::CancelRecognizeFiles()
+/** 
+Cancels any outstanding asynchronous recognition requests.
+@publishedAll
+@released
+*/
+	{
+	if(iExtension)
+		{
+		iExtension->CancelRecognizeFiles();
+		}
+	}
+
+EXPORT_C void RApaLsSession::Close()
+/** 
+Closes the session. Needs to be called to avoid memory leaks.
+@publishedAll
+@released
+*/
+	{
+	CancelRecognizeFiles();
+	RHandleBase::Close();
+	delete iExtension;
+	iExtension = NULL;
+	}
+
+EXPORT_C TInt RApaLsSession::RecognizeSpecificData(const RFile& aFile, const TDataType& aDataType, TBool& aResult) const
+/** Tests whether data taken from a file passed by handle has the specified 
+data (MIME) type.
+
+@param aFile The file containing the data. Before this function can be called,
+the file server session which owns this file handle must first be marked as shareable by 
+calling RFs::ShareProtected().
+@param aDataType The data (MIME) type.
+@param aResult On return, contains the result of the test.
+@return KErrNone, if successful; otherwise one of the other system-wide error 
+codes. */
+	{
+	const TPckgC<TDataType> dataType(aDataType);
+	TIpcArgs ipcArgs(&dataType);
+	TInt returnValue = aFile.TransferToServer(ipcArgs, 1, 2);
+	if (returnValue == KErrNone)
+		{
+		returnValue=SendReceiveWithReconnect(EAppListServRecognizeSpecificDataPassedByFileHandle,ipcArgs);
+		}
+	if (returnValue < KErrNone)
+		{
+		return returnValue;
+		}
+	aResult=returnValue;
+	return KErrNone;
+	}
+
+
+/** Gets the UID of an application that can handle the specified data (MIME) type.
+
+If no application can be found, the function returns the UID of the preferred 
+default handler. If none of the default handlers can handle the data type, 
+then a NULL UID is returned.
+
+@param aDataType The data (MIME) type.
+@param aAppUid On return, the UID of the application that can handle the data 
+(MIME) type; this may be NULL.
+@return KErrNone, if successful; otherwise one of the other system-wide error 
+codes. 
+*/
+EXPORT_C TInt RApaLsSession::AppForDataType(const TDataType& aDataType, TUid& aAppUid) const
+	{
+	const TPckgC<TDataType> dataType(aDataType);
+	TPckg<TUid> uid(aAppUid);
+	return SendReceiveWithReconnect(EAppListServAppForDataType,TIpcArgs(&dataType,&uid));
+	} //lint !e1764 Suppress reference parameter 'aAppUid' could be declared const ref
+
+
+/** Finds and launches an application to handle the document contained in the specified 
+file.
+
+@param aFileName The document name.
+@param aThreadId On return, the id of the main thread started.
+@param aLaunchType Not used. Reserved for future use.
+@return KErrNone, if successful; EAppListInvalid, if the server's initial population of 
+the list has not completed; KErrNotFound, if a matching entry could not be found; otherwise 
+one of the other system-wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::StartDocument(const TDesC& aFileName, TThreadId& aThreadId, TLaunchType /*aLaunchType*/)
+	{
+	HBufC8* buffer=NULL;
+	TInt error=GetBufferFromFile(buffer, aFileName);
+	if (error!=KErrNone)
+		{
+		return error;
+		}
+	TFileName nativeExecutableName; // the name of the EXE that we pass to RProcess::Create
+	TFileName logicalExecutableName; // the name of the MIDlet, Python script, etc
+	HBufC8* opaqueData=NULL;
+	TIpcArgs ipcArgs;
+	ipcArgs.Set(2, &aFileName);
+	ipcArgs.Set(3, buffer);
+	error=GetExecutableName(nativeExecutableName, logicalExecutableName, opaqueData, ipcArgs, EAppListServGetExecutableNameGivenDocument);
+	if (error!=KErrNone)
+		{
+		delete buffer;
+		return error;
+		}
+	error = StartApplicationPassingDocumentName(nativeExecutableName, logicalExecutableName, opaqueData, aFileName, aThreadId, EApaCommandOpen, NULL);
+	delete opaqueData;
+	if(error!=KErrNone && error!=KErrCancel)
+		{
+		TPckg<TThreadId> threadId(aThreadId);
+		error = SendReceiveWithReconnect(EAppListServStartDocument,TIpcArgs(&threadId, &aFileName, buffer));
+		}
+	delete buffer;
+	return error;
+	}
+
+EXPORT_C TInt RApaLsSession::StartDocument(RFile& aFile, TThreadId& aThreadId, TRequestStatus* aRequestStatusForRendezvous/*=NULL*/)
+/** Finds and launches an application to handle the document contained in the specified file
+
+@param aFile  The file handle. Before this function can be called,
+the file server session which owns this file handle must first be marked as shareable by 
+calling RFs::ShareProtected().
+@param aThreadId On return, the id of the main thread started.
+@param aRequestStatusForRendezvous If not NULL, the asynchronous RProcess::Rendezvous() 
+function is called (being passed this TRequestStatus object) before RProcess::Resume() is called on 
+the new application process.
+@return KErrNone, if successful; KErrNotFound, if no suitable application can 
+be found; otherwise one of the other system-wide error codes. */
+	{
+	TFileName nativeExecutableName; // the name of the EXE that we pass to RProcess::Create
+	TFileName logicalExecutableName; // the name of the MIDlet, Python script, etc
+	HBufC8* opaqueData=NULL;
+	TIpcArgs ipcArgs;
+	TInt error=aFile.TransferToServer(ipcArgs, 2, 3);
+	if (error == KErrNone)
+		{
+		error=GetExecutableName(nativeExecutableName, logicalExecutableName, opaqueData, ipcArgs, EAppListServGetExecutableNameGivenDocumentPassedByFileHandle);
+		}
+	if (error!=KErrNone)
+		{
+		return error;
+		}
+	error=StartApplicationPassingFileHandle(nativeExecutableName, logicalExecutableName, opaqueData, aFile, aThreadId, aRequestStatusForRendezvous);
+	delete opaqueData;
+	return error;
+	} //lint !e1764 Suppress reference parameter could be declared const ref
+
+
+/** Launches an application that can handle the specified data (MIME) type.
+
+The application handles the document contained in the specified file.
+
+@param aFileName The document name.
+@param aDataType The data (MIME) type.
+@param aThreadId On return, the id of the main thread started.
+@param aLaunchType Not used. Reserved for future use.
+@return KErrNone, if successful; EAppListInvalid if the server's initial population of 
+the list has not completed; KErrNotFound, if no suitable application can 
+be found; otherwise one of the other system-wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::StartDocument(const TDesC& aFileName, const TDataType& aDataType, TThreadId& aThreadId, TLaunchType /*aLaunchType*/)
+	{
+	TFileName nativeExecutableName; // the name of the EXE that we pass to RProcess::Create
+	TFileName logicalExecutableName; // the name of the MIDlet, Python script, etc
+	HBufC8* opaqueData=NULL;
+	const TPckgC<TDataType> dataType(aDataType);
+	TIpcArgs ipcArgs;
+	ipcArgs.Set(2, &dataType);
+	TInt error=GetExecutableName(nativeExecutableName, logicalExecutableName, opaqueData, ipcArgs, EAppListServGetExecutableNameGivenDataType);
+	if (error!=KErrNone)
+		{
+		return error;
+		}
+	error = StartApplicationPassingDocumentName(nativeExecutableName, logicalExecutableName, opaqueData, aFileName, aThreadId,EApaCommandOpen,NULL);
+	delete opaqueData;
+	if(error!=KErrNone && error!=KErrCancel)
+		{
+		TPckg<TThreadId> threadId(aThreadId);
+		error = SendReceiveWithReconnect(EAppListServStartDocumentByDataType,TIpcArgs(&threadId, &aFileName, &dataType));
+		}
+	return error;
+	}
+
+EXPORT_C TInt RApaLsSession::StartDocument(RFile& aFile, const TDataType& aDataType, TThreadId& aThreadId, TRequestStatus* aRequestStatusForRendezvous/*=NULL*/)
+/** Finds and launches an application to handle the document contained in the specified file
+
+@param aFile The file handle.
+@param aDataType The data (MIME) type.
+@param aThreadId On return, the id of the main thread started.
+@param aRequestStatusForRendezvous If not NULL, the asynchronous RProcess::Rendezvous() 
+function is called (being passed this TRequestStatus object) before RProcess::Resume() is called on 
+the new application process.
+@return KErrNone, if successful; KErrNotFound, if no suitable application can 
+be found; otherwise one of the other system-wide error codes. */
+	{
+	TFileName nativeExecutableName; // the name of the EXE that we pass to RProcess::Create
+	TFileName logicalExecutableName; // the name of the MIDlet, Python script, etc
+	HBufC8* opaqueData=NULL;
+	const TPckgC<TDataType> dataType(aDataType);
+	TIpcArgs ipcArgs;
+	ipcArgs.Set(2, &dataType);
+	TInt error=GetExecutableName(nativeExecutableName, logicalExecutableName, opaqueData, ipcArgs, EAppListServGetExecutableNameGivenDataType);
+	if (error!=KErrNone)
+		{
+		return error;
+		}
+	error=StartApplicationPassingFileHandle(nativeExecutableName, logicalExecutableName, opaqueData, aFile, aThreadId, aRequestStatusForRendezvous);
+	delete opaqueData;
+	return error;
+	} //lint !e1764 Suppress reference parameter could be declared const ref
+
+EXPORT_C TInt RApaLsSession::StartDocument(const TDesC& aFileName, TUid aAppUid, TThreadId& aThreadId, TLaunchType aLaunchType)
+/** Launches the application identified by the specified UID.
+
+The application handles the document contained in the specified file.
+
+@param aFileName The document name.
+@param aAppUid The application specific UID.
+@param aThreadId On return, the id of the main thread started.
+@param aLaunchType Not used. Reserved for future use.
+@return KErrNone, if successful; EAppListInvalid if the server's initial population of 
+the list has not completed; KErrNotFound, if no suitable application can 
+be found; otherwise one of the other system-wide error codes. */
+	{
+	TFileName nativeExecutableName; // the name of the EXE that we pass to RProcess::Create
+	TFileName logicalExecutableName; // the name of the MIDlet, Python script, etc
+	HBufC8* opaqueData=NULL;
+	TIpcArgs ipcArgs;
+	ipcArgs.Set(2, aAppUid.iUid);
+	TInt error=GetExecutableName(nativeExecutableName, logicalExecutableName, opaqueData, ipcArgs, EAppListServGetExecutableNameGivenAppUid);
+	if (error!=KErrNone)
+		{
+		return error;
+		}
+	error = StartApplicationPassingDocumentName(nativeExecutableName, logicalExecutableName, opaqueData, aFileName, aThreadId,EApaCommandOpen,NULL);
+	delete opaqueData;
+	if(error!=KErrNone && error!=KErrCancel)
+		{
+		error = StartAndCreate(EAppListServStartDocumentByUid,aFileName,aAppUid,aThreadId,aLaunchType);
+		}
+	return error;
+	}
+
+EXPORT_C TInt RApaLsSession::StartDocument(RFile& aFile, TUid aAppUid, TThreadId& aThreadId, TRequestStatus* aRequestStatusForRendezvous/*=NULL*/)
+/** Finds and launches an application to handle the document contained in the specified file
+
+@param aFile The file handle.
+@param aAppUid The application specific UID.
+@param aThreadId On return, the id of the main thread started.
+@param aRequestStatusForRendezvous If not NULL, the asynchronous RProcess::Rendezvous() 
+function is called (being passed this TRequestStatus object) before RProcess::Resume() is called on 
+the new application process.
+@return KErrNone, if successful; KErrNotFound, if no suitable application can 
+be found; otherwise one of the other system-wide error codes. */
+	{
+	TFileName nativeExecutableName; // the name of the EXE that we pass to RProcess::Create
+	TFileName logicalExecutableName; // the name of the MIDlet, Python script, etc
+	HBufC8* opaqueData=NULL;
+	TIpcArgs ipcArgs;
+	ipcArgs.Set(2, aAppUid.iUid);
+	TInt error=GetExecutableName(nativeExecutableName, logicalExecutableName, opaqueData, ipcArgs, EAppListServGetExecutableNameGivenAppUid);
+	if (error!=KErrNone)
+		{
+		return error;
+		}
+	error=StartApplicationPassingFileHandle(nativeExecutableName, logicalExecutableName, opaqueData, aFile, aThreadId, aRequestStatusForRendezvous);
+	delete opaqueData;
+	return error;
+	} //lint !e1764 Suppress reference parameter could be declared const ref
+
+
+/** Launches the application identified by the specified UID and creates a new document.
+
+To create a document file with the passed document name, the application needs to override the 3-parameter
+overload of ProcessCommandParametersL() to call the 2-parameter overload.
+
+Otherwise, a document will be created with the default document name present in the application resource file.
+If default document name is empty or not provided, no document is created.
+
+If the application resource file is not present, a document with application caption name is created.
+
+@param aFileName The document name.
+@param aAppUid The application specific UID. 
+@param aThreadId On return, the id of the main thread started.
+@param aLaunchType Not used. Reserved for future use.
+@return KErrNone, if successful; EAppListInvalid if the server's initial population of 
+the list has not completed; KErrNotFound, if no suitable application can 
+be found; otherwise one of the other system-wide error codes. 
+@see CEikAppUi::ProcessCommandParametersL().
+*/
+EXPORT_C TInt RApaLsSession::CreateDocument(const TDesC& aFileName, TUid aAppUid, TThreadId& aThreadId, TLaunchType aLaunchType)
+	{
+	TFileName nativeExecutableName; // the name of the EXE that we pass to RProcess::Create
+	TFileName logicalExecutableName; // the name of the MIDlet, Python script, etc
+	HBufC8* opaqueData=NULL;
+	TIpcArgs ipcArgs;
+	ipcArgs.Set(2, aAppUid.iUid);
+	TInt error=GetExecutableName(nativeExecutableName, logicalExecutableName, opaqueData, ipcArgs, EAppListServGetExecutableNameGivenAppUid);
+	if (error!=KErrNone)
+		{
+		return error;
+		}
+	error = StartApplicationPassingDocumentName(nativeExecutableName, logicalExecutableName, opaqueData, aFileName, aThreadId,EApaCommandCreate,NULL);
+	delete opaqueData;
+	if(error!=KErrNone && error!=KErrCancel)
+		{
+		error = StartAndCreate(EAppListServCreateDocumentByUid,aFileName,aAppUid,aThreadId,aLaunchType);
+		}
+	return error;
+	}
+	
+TInt RApaLsSession::StartAndCreate(TInt aRqst,const TDesC& aFileName, TUid aAppUid, TThreadId& aThreadId, TLaunchType /*aLaunchType*/)
+	{
+	TPckg<TThreadId> threadId(aThreadId);
+	return SendReceiveWithReconnect(aRqst,TIpcArgs(&threadId, &aFileName, aAppUid.iUid));
+	} 	//lint !e1762 !e1764
+		//Suppress reference parameter 'aThreadId' could be declared const ref
+		//Suppress member function could be made const
+
+
+
+
+/** Gets the available icon sizes for the application with the specified UID.
+
+@param aAppUid The application specific UID.
+@param aArrayToFill On return, the array contains all of the available icon 
+sizes.
+@return KErrNone, if successful; KErrNotFound, if no matching application can 
+be found; KErrNotSupported, if the application provides icons in non-MBM format;
+otherwise one of the other system wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::GetAppIconSizes(TUid aAppUid, CArrayFixFlat<TSize>& aArrayToFill) const
+	{
+	TRAPD(error,DoGetAppIconSizesL(aAppUid,aArrayToFill));
+	return error;
+	}
+
+void RApaLsSession::FetchArrayL(MArrayFiller& aArrayFiller,TUid aAppUid, TInt aOpcode, TInt aInitialBufSize) const
+	{
+	CBufFlat* buffer=CBufFlat::NewL(aInitialBufSize);
+	CleanupStack::PushL(buffer);
+	buffer->ExpandL(0,aInitialBufSize);
+	TPtr8 bufPtr=buffer->Ptr(0);
+	const TInt sizeRequired=User::LeaveIfError(SendReceiveWithReconnect(aOpcode,TIpcArgs(aAppUid.iUid,buffer->Size(),&bufPtr)));
+	if (sizeRequired>0)
+		{
+		__ASSERT_DEBUG(sizeRequired>buffer->Size(),User::Invariant());
+		CleanupStack::PopAndDestroy(buffer);
+		buffer=CBufFlat::NewL(sizeRequired);
+		CleanupStack::PushL(buffer);
+		buffer->ExpandL(0,sizeRequired);
+		bufPtr.Set(buffer->Ptr(0));
+#if defined(_DEBUG)
+		const TInt check=
+#endif
+		User::LeaveIfError(SendReceiveWithReconnect(aOpcode,TIpcArgs(aAppUid.iUid,buffer->Size(),&bufPtr)));
+		__ASSERT_DEBUG(check==0,User::Invariant());
+		}
+	RBufReadStream readStream;
+	readStream.Open(*buffer);
+	const TInt count=readStream.ReadUint32L();
+	for (TInt i=0; i<count; ++i)
+		{
+		aArrayFiller.AppendItemL(readStream);
+		}
+	CleanupStack::PopAndDestroy(buffer);
+	}
+
+void RApaLsSession::DoGetAppIconSizesL(TUid aAppUid, CArrayFixFlat<TSize>& aArrayToFill) const
+	{
+	TSizeArrayFiller arrayFiller(aArrayToFill);
+	FetchArrayL(arrayFiller, aAppUid, EAppListServGetAppIconSizes, KInitialIconBufSize);
+	}
+
+
+
+/** Gets the nearest matching application icon for the application with the specified 
+UID.
+
+The function gets the icon whose size matches the specified size. If there 
+is no exact match, then the function gets the closest smaller icon.
+
+This function should be used in preference to the TInt GetAppIcon(TUid,TInt,CApaMaskedBitmap&); 
+overload.
+
+@param aAppUid The application specific UID.
+@param aSize The required size of the icon.
+@param aAppBitmap On return, the application icon.
+@return KErrNone, if successful; KErrNotFound, if a matching entry could not be found, or no 
+icon equal to or smaller than the specified size can be found; KErrNotSupported, if the
+application provides icons in non-MBM format; otherwise one of the other system wide
+error codes. 
+*/
+EXPORT_C TInt RApaLsSession::GetAppIcon(TUid aAppUid, TSize aSize, CApaMaskedBitmap& aAppBitmap) const
+	{
+	SReturnData_AppIconByUidAndSize returnData = {0,0};
+	TPckg<SReturnData_AppIconByUidAndSize> returnData_asDescriptor(returnData);
+	TInt error=SendReceiveWithReconnect(EAppListServAppIconByUidAndSize,TIpcArgs(aAppUid.iUid,aSize.iWidth,aSize.iHeight,&returnData_asDescriptor));
+	if (error==KErrNone)
+		{
+		error=aAppBitmap.Duplicate(returnData.iIcon);
+		if (error==KErrNone)
+			{
+			error=aAppBitmap.Mask()->Duplicate(returnData.iIconMask);
+			}
+		}
+	return error;
+	}
+
+
+
+/** 
+ gets the bitmap handles from the Server, forms these up into a CApaMaskedBitmap
+
+Sets aAppBitmap to be the small, medium or large app icon of the app with uid 
+aAppUid, when aSize=0, 1 or 2 respectively.
+Panics the caller if a different index is specified.
+The overload which takes a TSize should be used instead.
+
+@deprecated 
+@param aAppUid The application specific UID.
+@param aSize The required size of the icon.
+@param aAppBitmap On return, the application icon.
+@return KErrNone, if successful; KErrNotFound, if a matching entry could not be found, or no 
+icon equal to or smaller than the specified size can be found; KErrNotSupported, if the 
+application provides icons in non-MBM format, otherwise one of the other system wide 
+error codes.
+*/
+EXPORT_C TInt RApaLsSession::GetAppIcon(TUid aAppUid, TInt aSize, CApaMaskedBitmap& aAppBitmap) const
+	{
+	__ASSERT_ALWAYS((aSize>=0) && (aSize<3), Panic(EDPanicBadIconSize));
+	SReturnData_AppIconByUid returnData = {0,0};
+	TPckg<SReturnData_AppIconByUid> returnData_asDescriptor(returnData);
+	TInt error=SendReceiveWithReconnect(EAppListServAppIconByUid,TIpcArgs(aAppUid.iUid,aSize,&returnData_asDescriptor));
+	if (error==KErrNone)
+		{
+		error=aAppBitmap.Duplicate(returnData.iIcon);
+		if (error==KErrNone)
+			{
+			error=aAppBitmap.Mask()->Duplicate(returnData.iIconMask);
+			}
+		}
+	return error;
+	}
+
+
+	
+EXPORT_C TInt RApaLsSession::GetAppIcon(TUid aAppUid, RFile& aFile) const 
+/** Gets an open shareable read only file handle to the application icon file for the 
+application with the specified UID. 
+
+An icon file can only be defined by applications providing an application registration file.
+
+An icon file may be in any graphics format and contain one or more icons.
+
+On entering this function, aFile must be non-open. It is recommended that aFile is 
+pushed onto the cleanup-stack (via CleanupClosePushL()) before this function is called.
+
+@param aAppUid The application specific UID.
+@param aFile On return, a read only open file handle to the icon file.
+@return KErrNone, if successful; KErrNotFound, if a matching application could not be found, 
+or an icon filename was not defined; otherwise one of the other system wide error codes. 
+@see GetAppIcon 
+*/ 
+	{
+	__ASSERT_ALWAYS(aFile.SubSessionHandle() == KNullHandle, Panic(EDPanicHandleAlreadySet));
+	TPckgBuf<TInt> fileHandle;
+	TInt sessionHandleOrErrorCode = SendReceiveWithReconnect(EAppListServAppIconFileHandle, TIpcArgs(aAppUid.iUid, &fileHandle));
+	if (sessionHandleOrErrorCode >= KErrNone)
+	    {
+	    sessionHandleOrErrorCode = aFile.AdoptFromServer(sessionHandleOrErrorCode, fileHandle());
+	    }
+	return sessionHandleOrErrorCode;
+	}   
+
+
+
+EXPORT_C TInt RApaLsSession::AppForDocument(const TDesC& aFileName, TUid& aAppUid, TDataType& aDataType) const
+/** Gets the data (MIME) type of the data in the specified file and gets the UID 
+of an application that can handle this type.
+
+@param aFileName The name of the file containing the data.
+@param aAppUid On return, the UID of the application that can handle the data 
+(MIME) type; this may be NULL.
+@param aDataType On return, the data (MIME) type.
+@return KErrNone, if successful; otherwise one of the other system-wide error 
+codes. */
+	{
+	return DoAppForDocumentOptionallySpecifyingService(aFileName, TUid::Null(), aAppUid, aDataType, EAppListServAppForDocument);
+	}
+
+
+/** Gets the data (MIME) type of the data in the specified file and gets the UID 
+of an application that can handle this type.
+
+@param aFile The file containing the data. Before this function can be called,
+the file server session which owns this file handle must first be marked as shareable by 
+calling RFs::ShareProtected().
+@param aAppUid On return, the UID of the application that can handle the data 
+(MIME) type; this may be NULL.
+@param aDataType On return, the data (MIME) type.
+@return KErrNone, if successful; otherwise one of the other system-wide error 
+codes. 
+*/
+EXPORT_C TInt RApaLsSession::AppForDocument(const RFile& aFile, TUid& aAppUid, TDataType& aDataType) const
+	{
+	return DoAppForDocumentOptionallySpecifyingService(aFile, TUid::Null(), aAppUid, aDataType, EAppListServAppForDocumentPassedByFileHandle);
+	}
+
+/** Tests whether the file is a native executable (DLL or EXE).
+
+@param aFileName The name of the file containing the data.
+@param aProgram On return, true, if the file contains application code; false, 
+otherwise.
+@return KErrNone, if successful; otherwise one of the other system-wide error 
+codes. 
+*/
+EXPORT_C TInt RApaLsSession::IsProgram(const TDesC& aFileName, TBool& aProgram) const
+	{
+	_LIT(KLitSysBin, "\\sys\\bin\\");
+	aProgram=(TParsePtrC(aFileName).Path().CompareF(KLitSysBin)==0);
+	return KErrNone;
+	}
+
+/** Gets the confidence threshold for successful data recognition.
+
+This is the minimum acceptable confidence level that must be reported by a 
+data recognizer for data to be accepted as of a given type.
+
+@param aConfidence On return, the confidence threshold. 
+@return KErrNone, if successful; otherwise one of the other system-wide error 
+codes. 
+*/
+EXPORT_C TInt RApaLsSession::GetAcceptedConfidence(TInt& aConfidence) const
+	{
+	TPckg<TInt> confidence(aConfidence);
+	return SendReceiveWithReconnect(EAppListServGetConfidence,TIpcArgs(&confidence));
+	} //lint !e1764 Suppress reference parameter could be declared const ref
+
+
+
+/** Sets the confidence threshold for successful data recognition.
+
+This is the minimum acceptable confidence level that must be reported by a 
+data recognizer for data to be accepted as of a given type.
+
+@param aConfidence The confidence threshold. Although this is an integer value, 
+data recognizers use the discrete values defined by the CApaDataRecognizerType::TRecognitionConfidence 
+enumeration.
+@return KErrNone, if successful; otherwise one of the other system-wide error 
+codes. 
+@capability WriteDeviceData 
+*/
+EXPORT_C TInt RApaLsSession::SetAcceptedConfidence(TInt aConfidence)
+	{
+	return SendReceiveWithReconnect(EAppListServSetConfidence,TIpcArgs(aConfidence));
+	} //lint !e1762 Suppress member function could be made const
+
+
+EXPORT_C TInt RApaLsSession::GetPreferredBufSize(TInt& aPreferredBufSize) const
+/** Gets the preferred number of bytes of data to read from a file for the purpose 
+of recognizing the data type.
+
+This should be used to determine the size of buffer to pass to the 3-parameter 
+overload of RecognizeData() or to the 4-parameter overload of RecognizeSpecificData().
+
+@param aPreferredBufSize On return, contains either the largest buffer size required 
+by any of the currently installed data-recognizers, or the value that would be 
+returned by GetMaxDataBufSize(), whichever is less.
+@return KErrNone, if successful; otherwise one of the other system-wide error 
+codes.
+@see GetMaxDataBufSize() */
+	{
+	const TInt preferredBufSize=SendReceiveWithReconnect(EAppListServPreferredBufSize, TIpcArgs());
+	if (preferredBufSize<KErrNone)
+		{
+		return preferredBufSize; // it's an error
+		}
+	aPreferredBufSize=preferredBufSize;
+	return KErrNone;
+	}
+
+EXPORT_C TInt RApaLsSession::GetMaxDataBufSize(TInt& aBufSize) const
+/** Gets the maximum size of the data that can be read from a file for the purpose 
+of recognizing the data type.
+
+To determine the size of buffer to pass to the 3-parameter overload of RecognizeData() 
+or to the 4-parameter overload of RecognizeSpecificData(), use GetPreferredBufSize() 
+rather than this function.
+
+@param aBufSize On return, contains the maximum size.
+@return KErrNone, if successful; otherwise one of the other system-wide error 
+codes.
+@see SetMaxDataBufSize()
+@see GetPreferredBufSize() */
+	{
+	const TInt returnValue=SendReceiveWithReconnect(EAppListServGetBufSize,TIpcArgs());
+	if (returnValue<0)
+		{
+		return returnValue;
+		}
+	aBufSize=returnValue;
+	return KErrNone;
+	}
+
+
+
+/** Sets the maximum size of the data that can be read from a file for the purpose 
+of recognizing the data type.
+
+The value is not used when the client explicitly supplies a buffer, for example 
+in calls to RecognizeData() and RecognizeSpecificData(), but is used in the 
+implementation of functions such as StartDocument() and CreateDocument().
+
+Unless explicitly set, a default value of KApaAppListServMaxBuffer is used.
+
+@param aBufSize The maximum size of data to be read.
+@return KErrNone, if successful; otherwise one of the other system-wide error 
+codes. 
+@see CreateDocument()
+@see StartDocument()
+@see RecognizeData()
+@see RecognizeSpecificData() 
+*/
+EXPORT_C TInt RApaLsSession::SetMaxDataBufSize(TInt aBufSize)
+	{
+	return SendReceiveWithReconnect(EAppListServSetBufSize,TIpcArgs(aBufSize));
+	} //lint !e1762 Suppress member function could be made const
+
+
+
+/** Gets a list of recognized data(MIME) types by all recognizers.
+
+@param aDataTypes The array of data (MIME) types.
+@return KErrNone, if successful; otherwise one of the other system-wide error 
+codes. 
+*/
+EXPORT_C TInt RApaLsSession::GetSupportedDataTypesL(CDataTypeArray& aDataTypes) const
+	{
+	// gets the datatype count in terms of buffer length; negative value means one of the system-wide error
+	TInt ret=SendReceiveWithReconnect(EAppListServGetDataTypesPhase1,TIpcArgs());
+	if (ret>0)
+		{
+		CBufFlat* const buf=CBufFlat::NewL(ret);
+		CleanupStack::PushL(buf);
+		buf->ExpandL(0,ret);
+		TPtr8 ptr=buf->Ptr(0);
+		ret=SendReceiveWithReconnect(EAppListServGetDataTypesPhase2,TIpcArgs(&ptr));
+		if (ret==KErrNone)
+			{
+			RBufReadStream readStream(*buf);
+			readStream >> aDataTypes;
+			}
+		CleanupStack::PopAndDestroy(buf);
+		}
+	return ret;
+	}
+
+
+
+/** Gets the icon for the specified view published by the application that has 
+the specified UID.
+
+The icon returned is that which is closest in size to the specified size.
+
+@param aAppUid The application specific UID.
+@param aViewUid The UID identifying the view.
+@param aSize The requested size of the icon.
+@param aViewBitmap On return, the icon that is closest in size to the requested 
+size.
+@return KErrNone, if successful; KErrNotFound, if no matching application nor matching view 
+can be found; KErrNotSupported, if the application provides icons in non-MBM format;
+otherwise one of the other system wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::GetAppViewIcon(TUid aAppUid, TUid aViewUid, const TSize& aSize, CApaMaskedBitmap& aViewBitmap) const
+	{
+	const TApaAppViewIconSizeData appViewIconSizeData(aAppUid, aViewUid, aSize);
+	const TPckgC<TApaAppViewIconSizeData> inputData(appViewIconSizeData);
+	SReturnData_ViewIconByUidAndSize returnData = {0,0};
+	TPckg<SReturnData_ViewIconByUidAndSize> returnData_asDescriptor(returnData);
+	TInt error=SendReceiveWithReconnect(EAppListServViewIconByUidAndSize,TIpcArgs(&inputData,&returnData_asDescriptor));
+	if (error==KErrNone)
+		{
+		error=aViewBitmap.Duplicate(returnData.iIcon);
+		if (error==KErrNone)
+			{
+			error=aViewBitmap.Mask()->Duplicate(returnData.iIconMask);
+			}
+		}
+	return error;
+	}
+
+
+
+/** Gets the views published by the application that has the specified UID.
+
+Information on each view is contained in a TApaAppViewInfo object, and this 
+set of objects is put into the array supplied by the caller.
+
+@param aAppViews On return, the array contains information on all of the views 
+published by the specified application.
+@param aAppUid The application specific UID.
+@return KErrNone, if successful; KErrNotFound, if no matching application can 
+be found; otherwise one of the other system wide error codes.
+@see TApaAppViewInfo 
+*/
+EXPORT_C TInt RApaLsSession::GetAppViews(CApaAppViewArray& aAppViews, TUid aAppUid) const
+	{
+	TRAPD(error,DoGetAppViewsL(aAppViews,aAppUid));
+	return error;
+	}
+
+void RApaLsSession::DoGetAppViewsL(CApaAppViewArray& aArrayToFill, TUid aAppUid) const
+	{
+	TViewDataArrayFiller arrayFiller(aArrayToFill);
+	FetchArrayL(arrayFiller, aAppUid, EAppListServGetAppViews, KInitialViewDataBufSize);
+	}
+
+
+
+/** Gets the list of file names for which the application with the specified 
+UID claims ownership.
+
+The list is written to a descriptor array supplied by the caller.
+
+Note that if the function fails due to lack of memory, the array is left in 
+an undefined state.
+
+@param aAppOwnedFiles On return, the descriptor array contains the file names.
+@param aAppUid The application specific UID.
+@return KErrNone, if successful; KErrNotFound, if no matching application can 
+be found; otherwise one of the other system wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::GetAppOwnedFiles(CDesCArray& aAppOwnedFiles, TUid aAppUid) const
+	{
+	TRAPD(error,DoGetAppOwnedFilesL(aAppOwnedFiles,aAppUid));
+	return error;
+	}
+
+
+
+/** Gets the number of icons defined by the app that has the specified UID
+
+Applications that don't define icons in their application information file will
+return an aCount value of zero when this function is called.
+
+@param aAppUid The application specific UID
+@param aCount On return, contains the number of icons defined by the application
+@return KErrNone, if successful; KErrNotFound, if a matching application could not be found;
+KErrNotSupported, if the application provides icons in non-MBM format; otherwise one of 
+the other system-wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::NumberOfOwnDefinedIcons(TUid aAppUid, TInt& aCount) const
+	{
+	TPckgBuf<TInt> pckg;
+	TInt ret=SendReceiveWithReconnect(EAppListServNumberOfOwnDefinedIcons,TIpcArgs(aAppUid.iUid,&pckg));
+	if (ret==KErrNone)
+		{
+		aCount=pckg();
+		}
+	return ret;
+	}
+
+
+
+/** Gets the full filename of a file containing application icons for the
+application with the specified UID.
+
+An icon file can only be defined by applications providing an application registration file.
+
+An icon file may be in any graphics format and contain one or more icons.
+
+@param aAppUid The application specific UID.
+@param aFullFileName On return, the full filename of a file containing one or more
+application icons. Returns a pointer to the filename and transfers ownership to the caller.
+@return KErrNone, if successful; KErrNotFound, if a matching application could not be found,
+or an icon filename was not defined; KErrNotSupported, if the application does not
+provide an application registration file; otherwise one of the other system wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::GetAppIcon(TUid aAppUid, HBufC*& aFullFileName) const
+	{
+	TFileName fileName;
+	TPckg<TFileName> filenamePckg(fileName);
+	TInt ret=SendReceiveWithReconnect(EAppListServAppIconFileName, TIpcArgs(aAppUid.iUid, &filenamePckg));
+	if (ret==KErrNone)
+		{
+		HBufC* fullFileName = HBufC::New(fileName.Length());
+		if (fullFileName == NULL)
+			{
+			return KErrNoMemory;
+			}
+		else
+			{
+			*fullFileName = fileName;
+			aFullFileName = fullFileName; // ownership transferred to caller
+			}
+		}
+	return ret;
+	}
+
+
+
+/** Gets the full filename of a file containing view-specific icons for the application
+with the specified UID and view.
+
+A file containing view-specific icons can only be defined by applications providing
+an application registration file.
+
+A view icon file may be in any graphics format and contain one or more view icons.
+
+@param aAppUid The application specific UID.
+@param aViewUid The UID identifying the view.
+@param aFullFileName On return, the full filename of a file containing one or more
+view icons. Returns a pointer to the filename and transfers ownership to the caller.
+@return KErrNone, if successful; KErrNotFound, if no matching application nor matching view
+could be found, or a view icon filename was not defined; KErrNotSupported, if the application
+does not provide an application registration file; otherwise one of the other system wide error codes. 
+*/
+EXPORT_C TInt RApaLsSession::GetAppViewIcon(TUid aAppUid, TUid aViewUid, HBufC*& aFullFileName) const
+	{
+	TFileName fileName;
+	TPckg<TFileName> filenamePckg(fileName);
+	TInt ret=SendReceiveWithReconnect(EAppListServAppViewIconFileName, TIpcArgs(aAppUid.iUid, aViewUid.iUid, &filenamePckg));
+	if (ret==KErrNone)
+		{
+		HBufC* fullFileName = HBufC::New(fileName.Length());
+		if (fullFileName == NULL)
+			{
+			return KErrNoMemory;
+			}
+		else
+			{
+			*fullFileName = fileName;
+			aFullFileName = fullFileName; // ownership transferred to caller
+			}
+		}
+	return ret;
+	}
+
+
+
+/** Changes an existing data type mapping, or adds a new one.
+
+If the data type is not currently mapped, a new mapping is added. 
+If the data type is mapped, its mapping is replaced.
+
+@capability WriteDeviceData Prevent addition of data type mappings by malicious programs.
+@param aDataType A new or existing data type.
+@param aPriority The priority with which the application handles the data type.
+@param aUid The UID of the application to associate with the data type.
+@return KErrNone on success, or a system-wide error code. 
+*/
+EXPORT_C TInt RApaLsSession::InsertDataMapping(const TDataType& aDataType, TDataTypePriority aPriority, TUid aUid)
+	{
+	return InsertDataMapping(aDataType, aPriority, aUid, KOpenServiceUid);
+	}
+
+/** Changes an existing data type mapping, or adds a new one.
+
+If the data type is not currently mapped, a new mapping is added. 
+If the data type is mapped, its mapping is replaced.
+
+@capability WriteDeviceData Prevent addition of data type mappings by malicious programs.
+@param aDataType A new or existing data type.
+@param aPriority The priority with which the application handles the data type.
+@param aUid The UID of the application to associate with the data type.
+@param aServiceUid The UID of the service.
+@return KErrNone on success, or a system-wide error code. 
+*/
+EXPORT_C TInt RApaLsSession::InsertDataMapping(const TDataType& aDataType, TDataTypePriority aPriority, 
+	TUid aUid, TUid aServiceUid)
+	{
+	const TPckgC<TDataType> dataType(aDataType);
+	return SendReceiveWithReconnect(EAppListInsertDataMapping, 
+		TIpcArgs(&dataType, TInt(aPriority), aUid.iUid, aServiceUid.iUid));
+	} //lint !e1762 Suppress member function could be made const
+
+/** Changes an existing data type mapping, or adds a new one.
+If the data type is not currently mapped, it is added.
+If the data type is mapped with a priority lower than aPriority, the new mapping replaces the existing one. 
+Otherwise, no change is made.
+
+@capability WriteDeviceData Prevent addition of data type mappings by malicious programs.
+@param aDataType A new or existing data type.
+@param aPriority The priority with which the application handles the data type.
+@param aUid The UID of the application to associate with the data type.
+@param aInserted Non-zero if the new mapping was added or an existing mapping replaced, zero otherwise.
+@return KErrNone on success, or a system-wide error code. 
+*/
+EXPORT_C TInt RApaLsSession::InsertDataMappingIfHigher(const TDataType& aDataType, TDataTypePriority aPriority, TUid aUid, TBool& aInserted)
+	{
+	TPckgBuf<TBool> inserted(EFalse);
+	const TPckgC<TDataType> dataType(aDataType);
+	const TInt ret = SendReceiveWithReconnect(EAppListInsertDataMappingIfHigher, TIpcArgs(&dataType, TInt(aPriority), aUid.iUid, &inserted));
+	if(ret == KErrNone)
+		{
+		aInserted = inserted();
+		}
+	return ret;
+	} //lint !e1762 Suppress member function could be made const
+
+
+
+/** Removes an existing user mapping between an application and data-type made through InsertDataMapping() or InsertDataMappingIfHigher().
+
+@capability WriteDeviceData Prevent removal of data type mappings by malicious programs.
+@param aDataType Data type whose mapping should be removed.
+@panic USER 0 The specified data type cannot be found. Debug builds only.
+@return KErrNone on success, or a system-wide error code. 
+@see InsertDataMapping()
+@see InsertDataMappingIfHigher()
+*/
+EXPORT_C TInt RApaLsSession::DeleteDataMapping(const TDataType& aDataType)
+	{
+	return DeleteDataMapping(aDataType, KOpenServiceUid);
+	}
+
+/** Removes an existing data type mapping.
+
+@capability WriteDeviceData Prevent removal of data type mappings by malicious programs.
+@param aDataType Data type whose mapping should be removed.
+@param aServiceUid The UID of the service.
+@panic USER 0 The specified data type cannot be found. Debug builds only.
+@return KErrNone on success, or a system-wide error code. 
+*/
+EXPORT_C TInt RApaLsSession::DeleteDataMapping(const TDataType& aDataType, TUid aServiceUid)
+	{
+	const TPckgC<TDataType> dataType(aDataType);
+	return SendReceiveWithReconnect(EAppListDeleteDataMapping, TIpcArgs(&dataType, aServiceUid.iUid));
+	} //lint !e1762 Suppress member function could be made const
+	
+/** Gets the application associated with the data type and the service uid from
+the datatype store. 
+
+The function will only look into the datatype store and will not use the 
+default type associations. This is different from the AppForDataTypeAndService() function.
+
+@param aDataType The data (MIME) type.
+@param aAppUid On return, the UID of the application that can handle the data 
+(MIME) type; this may be NULL.
+@param aServiceUid The UID of the service.
+@return KErrNone, if successful; otherwise one of the other system-wide error 
+codes. 
+*/
+EXPORT_C TInt RApaLsSession::GetAppByDataType(const TDataType& aDataType, TUid aServiceUid, TUid& aAppUid) const
+	{
+	const TPckgC<TDataType> dataType(aDataType);
+	TPckg<TUid> uid(aAppUid);
+	const TInt returnValue=SendReceiveWithReconnect(EAppListServGetAppByDataType,TIpcArgs(&dataType, aServiceUid.iUid, &uid));
+	if (returnValue<0)
+		{
+		return returnValue;
+		}
+	if (aAppUid == KNullUid)
+		{
+		return KErrNotFound;
+		}
+	else
+		{
+		return KErrNone;
+		}
+	} //lint !e1764 Suppress reference parameter 'aAppUid' could be declared const ref
+
+/** Determines the current language an application is using to display its
+user interface.
+@param aAppUid The application specific UID.
+@param aLanguage On return, the application language.  
+@return KErrNone, if successful; KErrNotFound, if a matching application could not be found; 
+otherwise one of the other system wide error codes.
+*/
+EXPORT_C TInt RApaLsSession::ApplicationLanguage(TUid aAppUid, TLanguage& aLanguage) const
+	{
+	TPckgBuf<TLanguage> pckg;
+	TInt errVal = SendReceiveWithReconnect(EAppListServApplicationLanguage, TIpcArgs(aAppUid.iUid, &pckg));
+	if (errVal == KErrNone)
+		{
+		aLanguage = pckg();
+		}
+	return errVal;
+	}
+
+/** Gets the services implemented by the application that has the specified
+application UID.
+
+The returned CApaAppServiceInfoArray object contains an array of TApaAppServiceInfo objects.
+
+Information on each service implementation is contained in a TApaAppServiceInfo object.
+
+TApaAppServiceInfo::Uid() returns the service UID of the service implemented by the
+specified application UID.
+
+@param aAppUid The application specific UID.
+@return A pointer to a CApaAppServiceInfoArray object left on the cleanup stack.
+@leave KErrNotFound No matching application can be found, or a matching application
+does not implement any services.
+@leave KErrNotSupported The specified application does not provide an application
+registration file.
+@leave KErrNoMemory There is insufficient memory to perform the operation.
+@see CApaAppServiceInfoArray::Array()
+@see TApaAppServiceInfo
+@publishedPartner
+@released
+*/
+EXPORT_C CApaAppServiceInfoArray* RApaLsSession::GetAppServicesLC(TUid aAppUid) const
+	{
+	CArrayFixFlat<TApaAppServiceInfo>* serviceArray = new(ELeave) CArrayFixFlat<TApaAppServiceInfo>(4);
+	CleanupStack::PushL(TCleanupItem(CleanupServiceArray, serviceArray));
+	CBufBase* buffer = GetServiceBufferLC(EAppListServGetAppServices, aAppUid);
+	RBufReadStream readStream(*buffer);
+	readStream >> *serviceArray;
+	CleanupStack::PopAndDestroy(buffer);
+	CleanupStack::Pop(serviceArray);
+	CApaAppServiceInfoArrayWrapper* wrapper = CApaAppServiceInfoArrayWrapper::NewL(serviceArray); // takes ownership of serviceArray
+	CleanupStack::PushL(wrapper);
+	return wrapper;
+	}
+
+CBufBase* RApaLsSession::GetServiceBufferLC(TInt aOpcode, TUid aUid1, TUid aUid2/*=KNullUid*/) const
+	{
+	CBufFlat* buffer=CBufFlat::NewL(KDefaultBufSize); // allocate buffer with a default size that should be large enough in most cases
+	CleanupStack::PushL(buffer);
+	buffer->ExpandL(0,KDefaultBufSize);
+	TPtr8 bufPtr=buffer->Ptr(0);
+	const TInt sizeRequired=User::LeaveIfError(SendReceiveWithReconnect(aOpcode,TIpcArgs(aUid1.iUid,aUid2.iUid,buffer->Size(),&bufPtr)));
+	if (sizeRequired>0)
+		{
+		CleanupStack::PopAndDestroy(buffer);
+		buffer=CBufFlat::NewL(sizeRequired);
+		CleanupStack::PushL(buffer);
+		buffer->ExpandL(0,sizeRequired);
+		bufPtr.Set(buffer->Ptr(0));
+#if defined(_DEBUG)
+		const TInt check=
+#endif
+		User::LeaveIfError(SendReceiveWithReconnect(aOpcode,TIpcArgs(aUid1.iUid,aUid2.iUid,0,&bufPtr)));
+		__ASSERT_DEBUG(check==0,User::Invariant());
+		}
+	return buffer;
+	}
+	
+CBufBase* RApaLsSession::GetServiceBufferLC(TInt aOpcode, TUid aUid1, const TDataType& aDataType) const
+	{
+	const TPckgC<TDataType> dataType(aDataType);
+	CBufFlat* buffer=CBufFlat::NewL(KDefaultBufSize); // allocate buffer with a default size that should be large enough in most cases
+	CleanupStack::PushL(buffer);
+	buffer->ExpandL(0,KDefaultBufSize);
+	TPtr8 bufPtr=buffer->Ptr(0);
+	const TInt sizeRequired=User::LeaveIfError(SendReceiveWithReconnect(aOpcode,TIpcArgs(aUid1.iUid,&dataType,buffer->Size(),&bufPtr)));
+	if (sizeRequired>0)
+		{
+		CleanupStack::PopAndDestroy(buffer);
+		buffer=CBufFlat::NewL(sizeRequired);
+		CleanupStack::PushL(buffer);
+		buffer->ExpandL(0,sizeRequired);
+		bufPtr.Set(buffer->Ptr(0));
+#if defined(_DEBUG)
+		const TInt check=
+#endif
+		User::LeaveIfError(SendReceiveWithReconnect(aOpcode,TIpcArgs(aUid1.iUid,&dataType,0,&bufPtr)));
+		__ASSERT_DEBUG(check==0,User::Invariant());
+		}
+	return buffer;	
+	}
+
+
+
+/** Gets the service implementations for the specified service UID.
+
+The returned CApaAppServiceInfoArray object contains an array of TApaAppServiceInfo objects.
+
+Information on each implementation is contained in a TApaAppServiceInfo object.
+
+TApaAppServiceInfo::Uid() returns the UID of the application that implements the
+specified service UID.
+
+@param aServiceUid The service UID.
+@return A pointer to a CApaAppServiceInfoArray object left on the cleanup stack.
+@leave KErrNotFound No service implementations for the specified service UID can be found.
+@leave EAppListInvalid The server's initial population of the list has not completed.
+@leave KErrNoMemory There is insufficient memory to perform the operation.
+@see CApaAppServiceInfoArray::Array()
+@see TApaAppServiceInfo
+@publishedPartner
+@released
+*/
+EXPORT_C CApaAppServiceInfoArray* RApaLsSession::GetServiceImplementationsLC(TUid aServiceUid) const
+	{
+	CArrayFixFlat<TApaAppServiceInfo>* serviceArray = new(ELeave) CArrayFixFlat<TApaAppServiceInfo>(4);
+	CleanupStack::PushL(TCleanupItem(CleanupServiceArray, serviceArray));
+	CBufBase* buffer = GetServiceBufferLC(EAppListServGetServiceImplementations, aServiceUid);
+	RBufReadStream readStream(*buffer);
+	readStream >> *serviceArray;
+	CleanupStack::PopAndDestroy(buffer);
+	CleanupStack::Pop(serviceArray);
+	CApaAppServiceInfoArrayWrapper* wrapper = CApaAppServiceInfoArrayWrapper::NewL(serviceArray); // takes ownership of serviceArray
+	CleanupStack::PushL(wrapper);
+	return wrapper;
+	}
+	
+EXPORT_C CApaAppServiceInfoArray* RApaLsSession::GetServiceImplementationsLC(TUid aServiceUid, const TDataType& aDataType) const
+/** Gets the service implementations for the specified service UID. The implementation must also be
+able to handle the data type given as argument.
+
+The returned CApaAppServiceInfoArray object contains an array of TApaAppServiceInfo objects.
+
+Information on each implementation is contained in a TApaAppServiceInfo object.
+
+TApaAppServiceInfo::Uid() returns the UID of the application that implements the
+specified service UID.
+
+@param aServiceUid The service UID.
+@param aDataType The data type that must be supported by the implementation.
+@return A pointer to a CApaAppServiceInfoArray object left on the cleanup stack.
+@leave KErrNotFound No service implementations for the specified service UID can be found.
+@leave EAppListInvalid The server's initial population of the list has not completed.
+@leave KErrNoMemory There is insufficient memory to perform the operation.
+@see CApaAppServiceInfoArray::Array()
+@see TApaAppServiceInfo
+@publishedPartner
+@released
+*/
+	{
+	CArrayFixFlat<TApaAppServiceInfo>* serviceArray = new(ELeave) CArrayFixFlat<TApaAppServiceInfo>(4);
+	CleanupStack::PushL(TCleanupItem(CleanupServiceArray, serviceArray));
+	CBufBase* buffer = GetServiceBufferLC(EAppListServGetServiceImplementationsDataType, aServiceUid, aDataType);
+	RBufReadStream readStream(*buffer);
+	readStream >> *serviceArray;
+	CleanupStack::PopAndDestroy(buffer);
+	CleanupStack::Pop(serviceArray);
+	CApaAppServiceInfoArrayWrapper* wrapper = CApaAppServiceInfoArrayWrapper::NewL(serviceArray); // takes ownership of serviceArray
+	CleanupStack::PushL(wrapper);
+	return wrapper;
+	}
+
+/** Gets the service UIDs implemented by the application with the specified UID.
+
+@param aAppUid The application specific UID.
+@param aServiceUids On return, contains the service UIDs implemented by the specified
+application UID.
+@leave KErrNotFound No matching application can be found, or a matching application
+does not implement any services.
+@leave KErrNotSupported The specified application does not provide an application
+registration file.
+@leave KErrNoMemory There is insufficient memory to perform the operation.
+@publishedPartner
+@released
+*/
+EXPORT_C void RApaLsSession::GetAppServicesL(TUid aAppUid, CArrayFixFlat<TUid>& aServiceUids) const
+	{
+	CBufBase* buffer = GetServiceBufferLC(EAppListServGetAppServiceUids, aAppUid);
+	RBufReadStream readStream(*buffer);
+	readStream >> aServiceUids;
+	CleanupStack::PopAndDestroy(buffer);
+	}
+
+
+
+/** Gets the service implementation's opaque data for the specified application and service.
+
+The specified application may provide more than one implementation of the specified service.
+
+The returned CApaAppServiceInfoArray object contains an array of TApaAppServiceInfo objects,
+each of which provides information on an implementation.
+
+For each TApaAppServiceInfo object, TApaAppServiceInfo::Uid() returns the specified service UID.
+
+@param aAppUid The application specific UID.
+@param aServiceUid The service UID.
+@return A pointer to a CApaAppServiceInfoArray object left on the cleanup stack.
+@leave KErrNotFound No matching application can be found, or a matching application
+does not implement the specified service.
+@leave KErrNotSupported The specified application does not provide an application
+registration file.
+@leave KErrNoMemory There is insufficient memory to perform the operation.
+@see CApaAppServiceInfoArray::Array()
+@see TApaAppServiceInfo
+@publishedPartner
+@released
+*/
+EXPORT_C CApaAppServiceInfoArray* RApaLsSession::GetAppServiceOpaqueDataLC(TUid aAppUid, TUid aServiceUid) const
+	{
+	CArrayFixFlat<TApaAppServiceInfo>* serviceArray = new(ELeave) CArrayFixFlat<TApaAppServiceInfo>(4);
+	CleanupStack::PushL(TCleanupItem(CleanupServiceArray, serviceArray));
+	CBufBase* buffer = GetServiceBufferLC(EAppListServGetAppServiceOpaqueData, aAppUid, aServiceUid);
+	RBufReadStream readStream(*buffer);
+	readStream >> *serviceArray;
+	CleanupStack::PopAndDestroy(buffer);
+	CleanupStack::Pop(serviceArray);
+	CApaAppServiceInfoArrayWrapper* wrapper = CApaAppServiceInfoArrayWrapper::NewL(serviceArray); // takes ownership of serviceArray
+	CleanupStack::PushL(wrapper);
+	return wrapper;
+	}
+
+
+
+/** Gets the UID of an application that can handle the specified data (MIME) type and service.
+
+If no application can be found, the function returns the UID of the preferred 
+default handler. If none of the default handlers can handle the combination
+of data type and service, then a NULL UID is returned in aAppUid.
+
+@param aDataType The data (MIME) type.
+@param aServiceUid The service UID.
+@param aAppUid On return, the UID of the application that can handle the data 
+(MIME) type and service; this may be NULL.
+@return KErrNone, if successful; otherwise one of the other system-wide error 
+codes.
+@publishedPartner
+@released
+*/
+EXPORT_C TInt RApaLsSession::AppForDataTypeAndService(const TDataType& aDataType, TUid aServiceUid, TUid& aAppUid) const
+	{
+	const TPckgC<TDataType> dataType(aDataType);
+	TPckg<TUid> uid(aAppUid);
+	return SendReceiveWithReconnect(EAppListServAppForDataTypeAndService,TIpcArgs(&dataType, aServiceUid.iUid,&uid));
+	} //lint !e1764 Suppress reference parameter 'aAppUid' could be declared const ref
+
+EXPORT_C TInt RApaLsSession::AppForDocumentAndService(const TDesC& aFileName, TUid aServiceUid, TUid& aAppUid, TDataType& aDataType) const
+/** Gets the data (MIME) type of the data in the specified file and gets the UID 
+of an application that can handle this type and service.
+
+@param aFileName The name of the file containing the data.
+@param aServiceUid The service UID
+@param aUid On return, the UID of the application that can handle the data 
+(MIME) type and service; this may be NULL.
+@param aDataType On return, the data (MIME) type.
+@return KErrNone, if successful; otherwise one of the other system-wide error 
+codes.
+@publishedPartner
+@released
+*/
+	{
+	return DoAppForDocumentOptionallySpecifyingService(aFileName, aServiceUid, aAppUid, aDataType, EAppListServAppForDocumentAndService);
+	}
+
+EXPORT_C TInt RApaLsSession::AppForDocumentAndService(const RFile& aFile, TUid aServiceUid, TUid& aAppUid, TDataType& aDataType) const
+/** Gets the data (MIME) type of the data in the specified file and gets the UID 
+of an application that can handle this type and service.
+
+@param aFile The file handle.  Before this function can be called,
+the file server session which owns this file handle must first be marked as shareable by 
+calling RFs::ShareProtected().
+@param aServiceUid The service UID.
+@param aUid On return, the UID of the application that can handle the data 
+(MIME) type and service; this may be NULL.
+@param aDataType On return, the data (MIME) type.
+@return KErrNone, if successful; otherwise one of the other system-wide error 
+codes.
+@publishedPartner
+@released
+*/
+	{
+	return DoAppForDocumentOptionallySpecifyingService(aFile, aServiceUid, aAppUid, aDataType, EAppListServAppForDocumentAndServicePassedByFileHandle);
+	}
+
+TInt RApaLsSession::DoAppForDocumentOptionallySpecifyingService(const TDesC& aFileName, TUid aServiceUid, TUid& aAppUid, TDataType& aDataType, TInt aOpcode) const
+	{
+	if (aFileName.Length()==0)
+		{
+		aAppUid = KNullUid;
+		return KErrNone;
+		}
+	HBufC8* buffer=NULL;
+	TInt error=GetBufferFromFile(buffer, aFileName);
+	if (error!=KErrNone)
+		{
+		return error;
+		}
+	SReturnData_AppForDocument returnData;
+	TPckg<SReturnData_AppForDocument> returnData_asDescriptor(returnData);
+	error=SendReceiveWithReconnect(aOpcode,TIpcArgs(&returnData_asDescriptor, aServiceUid.iUid, &aFileName, buffer));
+	delete buffer;
+	buffer=NULL;
+	if (error==KErrNone)
+		{
+		aAppUid=returnData.iUid;
+		aDataType=returnData.iDataType;
+		}
+	return error;
+	}
+
+TInt RApaLsSession::DoAppForDocumentOptionallySpecifyingService(const RFile& aFile, TUid aServiceUid, TUid& aAppUid, TDataType& aDataType, TInt aOpcode) const
+	{
+	SReturnData_AppForDocument returnData;
+	TPckg<SReturnData_AppForDocument> returnData_asDescriptor(returnData);
+	TIpcArgs ipcArgs(&returnData_asDescriptor, aServiceUid.iUid);
+	TInt error=aFile.TransferToServer(ipcArgs, 2, 3);
+	if (error == KErrNone)
+		{
+		error=SendReceiveWithReconnect(aOpcode, ipcArgs);
+		}
+	if (error==KErrNone)
+		{
+		aAppUid=returnData.iUid;
+		aDataType=returnData.iDataType;
+		}
+	return error;
+	}
+
+TInt RApaLsSession::GetBufferFromFile(HBufC8*& aBuffer, const TDesC& aFileName) const
+	{
+	TInt preferredBufSize=0;
+	const TInt error=GetPreferredBufSize(preferredBufSize);
+	if (error<KErrNone)
+		{
+		return error;
+		}
+	HBufC8* const buffer=HBufC8::New(Max(8, preferredBufSize)); // 8 is a sensible minimum
+	if (buffer==NULL)
+		{
+		return KErrNoMemory;
+		}
+	const RFs* fsSession=FsSession();
+	RFs tempFsSession;
+	if (fsSession==NULL)
+		{
+		const TInt error=tempFsSession.Connect();
+		if (error!=KErrNone)
+			{
+			delete buffer;
+			return error;
+			}
+		fsSession=&tempFsSession;
+		}
+	if (fsSession->IsValidName(aFileName))
+		{
+		TPtr8 buffer_asWritable(buffer->Des());
+		const TInt error=fsSession->ReadFileSection(aFileName, 0, buffer_asWritable, preferredBufSize);
+		if (error!=KErrNone)
+			{
+			delete buffer;
+			tempFsSession.Close();
+			return error;
+			}
+		}
+	if (fsSession==&tempFsSession)
+		{
+		tempFsSession.Close();
+		}
+	aBuffer=buffer;
+	return KErrNone;
+	}
+
+EXPORT_C void RApaLsSession::SetFsSessionL(RFs& aFsSession)
+/**
+@internalTechnology
+*/
+	{ // static
+	User::LeaveIfError(Dll::SetTls(&aFsSession));
+	}
+
+EXPORT_C void RApaLsSession::ClearFsSession()
+/**
+@internalTechnology
+*/
+	{ // static
+	Dll::FreeTls();
+	}
+
+EXPORT_C RFs* RApaLsSession::FsSession()
+/**
+@internalComponent
+*/
+	{ // static
+	return static_cast<RFs*>(Dll::Tls());
+	}
+
+/** @publishedPartner */
+EXPORT_C void RApaLsSession::RegisterNonNativeApplicationTypeL(TUid aApplicationType, const TDesC& aNativeExecutable)
+	{
+	User::LeaveIfError(SendReceiveWithReconnect(EAppListServRegisterNonNativeApplicationType, TIpcArgs(aApplicationType.iUid, &aNativeExecutable)));
+	} //lint !e1762 Suppress member function could be made const
+
+/** @publishedPartner */
+EXPORT_C void RApaLsSession::DeregisterNonNativeApplicationTypeL(TUid aApplicationType)
+	{
+	User::LeaveIfError(SendReceiveWithReconnect(EAppListServDeregisterNonNativeApplicationType, TIpcArgs(aApplicationType.iUid)));
+	} //lint !e1762 Suppress member function could be made const
+	
+/** @publishedPartner */
+EXPORT_C void RApaLsSession::PrepareNonNativeApplicationsUpdatesL()
+	{
+	TIpcArgs ipcArgs(0, 0, 0, 0);
+	User::LeaveIfError(SendReceiveWithReconnect(EAppListServPrepareNonNativeApplicationsUpdates, ipcArgs));
+	} //lint !e1762 Suppress member function could be made const
+
+/** @publishedPartner */
+EXPORT_C void RApaLsSession::RegisterNonNativeApplicationL(TUid aApplicationType, const TDriveUnit& aDrive, CApaRegistrationResourceFileWriter& aRegistrationResourceFile, CApaLocalisableResourceFileWriter* aLocalisableResourceFile, const RFile* aIconFile)
+	{
+	TIpcArgs ipcArgs(0, 0, 0, 0);
+	RBuf8 ipcParameter0;
+	CleanupClosePushL(ipcParameter0);
+	RBuf8 ipcParameter1;
+	CleanupClosePushL(ipcParameter1);
+	if (aLocalisableResourceFile==NULL)
+		{
+		__ASSERT_ALWAYS(aIconFile==NULL, Panic(EPanicIconFileWithoutLocalisableResourceFile));
+		ipcArgs.Set(1, NULL);
+		}
+	else
+		{
+		TParse* const parser=new(ELeave) TParse;
+		CleanupStack::PushL(parser);
+		const TDriveName driveName(aDrive.Name()); // TDriveName is a TBuf<2>
+
+		if (aIconFile!=NULL)
+			{
+			User::LeaveIfError(aIconFile->TransferToServer(ipcArgs, 2, 3));
+
+			TFileName* const fileName=new(ELeave) TFileName;
+			CleanupStack::PushL(fileName);
+			User::LeaveIfError(aIconFile->Name(*fileName));
+			parser->SetNoWild(*fileName, &KLitPathForNonNativeResourceAndIconFiles, &driveName);
+			aLocalisableResourceFile->SetIconFileL(parser->FullName());
+			CleanupStack::PopAndDestroy(fileName);
+			}
+		aLocalisableResourceFile->GenerateFileContentsL(ipcParameter1); // must be done after the aLocalisableResourceFile->SetIconFileL call (if there is one)
+		const TDesC8& ipcParameter1_asConst=ipcParameter1;
+		ipcArgs.Set(1, &ipcParameter1_asConst);
+
+		TBuf<30> fileName;
+		fileName.Format(KLitFormatForLocalisableResourceFile, aRegistrationResourceFile.AppUid().iUid);
+		parser->SetNoWild(fileName, &KLitPathForNonNativeResourceAndIconFiles, &driveName);
+		aRegistrationResourceFile.SetLocalisableResourceFileL(parser->FullName());
+
+		CleanupStack::PopAndDestroy(parser);
+		}
+	aRegistrationResourceFile.GenerateFileContentsL(ipcParameter0); // must be done after the aRegistrationResourceFile.SetLocalisableResourceFileL call (if there is one)
+	SNonNativeApplicationInfo nonNativeApplicationInfo;
+	nonNativeApplicationInfo.iApplicationType=aApplicationType;
+	nonNativeApplicationInfo.iDrive=aDrive;
+	ipcParameter0.ReAllocL(sizeof(SNonNativeApplicationInfo)+ipcParameter0.Length());
+	ipcParameter0.Insert(0, TPckgC<SNonNativeApplicationInfo>(nonNativeApplicationInfo));
+	const TDesC8& ipcParameter0_asConst=ipcParameter0;
+	ipcArgs.Set(0, &ipcParameter0_asConst);
+
+	User::LeaveIfError(SendReceiveWithReconnect(EAppListServRegisterNonNativeApplication, ipcArgs));
+	CleanupStack::PopAndDestroy(2, &ipcParameter0);
+	} //lint !e1762 Suppress member function could be made const
+
+/** @publishedPartner */
+EXPORT_C void RApaLsSession::DeregisterNonNativeApplicationL(TUid aApplication)
+	{
+	User::LeaveIfError(SendReceiveWithReconnect(EAppListServDeregisterNonNativeApplication, TIpcArgs(aApplication.iUid)));
+	} //lint !e1762 Suppress member function could be made const
+	
+/**
+Commits the non-native application updates. This is a synchronous method which waits 
+until the application list is updated.
+	 
+@see ForceCommitNonNativeApplicationsUpdatesL
+@publishedPartner
+@released
+*/
+
+EXPORT_C void RApaLsSession::CommitNonNativeApplicationsUpdatesL()
+	{
+	TIpcArgs ipcArgs(EFalse, 0, 0, 0);
+	User::LeaveIfError(SendReceiveWithReconnect(EAppListServCommitNonNativeApplications, ipcArgs));
+	} //lint !e1762 Suppress member function could be made const
+
+
+/**
+Commits the non-native application updates. This is an asynchronous method which will not wait until 
+the application list is updated. CApaAppListNotifier class should be used to synchronize the completion 
+of updating the application list. 
+ 
+@see CommitNonNativeApplicationsUpdatesL
+@see CApaAppListNotifier
+@publishedPartner
+@released
+*/
+
+EXPORT_C void RApaLsSession::ForceCommitNonNativeApplicationsUpdatesL()
+	{
+	TIpcArgs ipcArgs(ETrue, 0, 0, 0);
+	User::LeaveIfError(SendReceiveWithReconnect(EAppListServCommitNonNativeApplications, ipcArgs));
+	}
+
+/** 
+Rolls back all changes made to the list of installed non-native applications since the last call to
+PrepareNonNativeApplicationsUpdatesL().
+
+This function can be called even if PrepareNonNativeApplicationsUpdatesL() hasn't been called before (in which
+case it does nothing).
+
+@publishedPartner
+*/
+EXPORT_C TInt RApaLsSession::RollbackNonNativeApplicationsUpdates()
+	{
+	TIpcArgs ipcArgs(0, 0, 0, 0);
+	return SendReceiveWithReconnect(EAppListServRollbackNonNativeApplications, ipcArgs);
+	} //lint !e1762 Suppress member function could be made const
+
+EXPORT_C void RApaLsSession::SetNotify(TBool aCompleteImmediatelyIfNoScanImpendingOrInProgress, TRequestStatus& aStatus)
+/**
+@internalTechnology */
+	{
+	SendReceive(ESetNotify,TIpcArgs(aCompleteImmediatelyIfNoScanImpendingOrInProgress),aStatus);
+	} //lint !e1762 Suppress member function could be made const
+
+EXPORT_C void RApaLsSession::CancelNotify()
+/**
+@internalTechnology */
+	{
+	SendReceive(ECancelNotify,TIpcArgs());
+	} //lint !e1762 Suppress member function could be made const
+	
+/**
+Gets the application type of the application. For a native application the type is KNullUid.
+@return A standard error code.
+@publishedPartner
+@released
+@param aTypeUid On return contains the application's type
+@param aAppUid The application's UID passed into TIpcArgs	
+*/
+EXPORT_C TInt RApaLsSession::GetAppType(TUid& aTypeUid, TUid aAppUid) const
+	{
+	TPckg<TUid> uid(aTypeUid);
+	return SendReceiveWithReconnect(EAppListServGetAppType,TIpcArgs(aAppUid.iUid,&uid));
+	} //lint !e1764 Suppress reference parameter 'aTypeUid' could be declared const ref
+	
+/**
+This function is only for use by Software Install.
+
+As part of the fix for defect INC069526, we added a check in apparc. We check if the application has 
+been installed before adding it to the apparc db. A side-effect of this fix is that it is not possible 
+to launch applications that are being installed from the installation process itself. This is a regresssion.
+
+To fix this regression we added this function. It allows Software Install to specify a list of registration
+files that need to be included in apparc's list even if they have not been marked as installed in the
+SISRegistry or JavaRegistry. The list of registration files is cleared once Software Install notifies
+(via P&S) the end of the installation (whether successful or not).
+The function also forces a rescan and only returns when this rescan is complete. This is because 
+Software Install needs to be sure the registration files have been added to apparc's list before 
+trying to launch the recently installed applications.
+
+@param aRegFiles The list of registration files for which the SISRegistry check must be ignored.
+@return A standard error code.
+@internalAll
+@released
+*/
+EXPORT_C TInt RApaLsSession::ForceRegistration(const RPointerArray<TDesC>& aRegFiles)
+	{
+	CBufFlat* buffer = 0;
+	TRAPD(err, buffer = CreateRegFilesBufferL(aRegFiles));
+	if (err != KErrNone)
+		{
+		return err;
+		}
+	TPtr8 ptr = buffer->Ptr(0);
+	const TInt returnValue=SendReceiveWithReconnect(EAppListServForceRegistration,TIpcArgs(&ptr));
+	delete buffer;
+	return returnValue;
+	} //lint !e1762 Suppress member function could be made const
+	
+TInt RApaLsSession::SendReceiveWithReconnect(TInt aFunction,const TIpcArgs& aIpcArgs) const
+	{
+	TInt ret = SendReceive(aFunction, aIpcArgs);
+	if(ret != KErrServerTerminated)
+		{
+		return ret;
+		}
+
+	RApaLsSession ls;
+	TInt err=ls.Connect();
+	if (err==KErrNone)
+		{
+		RApaLsSession* const localThis = const_cast<RApaLsSession*>(this);
+		localThis->Close();
+		localThis->iHandle=ls.iHandle;
+		ret = SendReceive(aFunction, aIpcArgs);
+		}
+	return ret;
+	}
+
+void RApaLsSession::DoGetAppOwnedFilesL(CDesCArray& aArrayToFill, TUid aAppUid) const
+	{
+	TDesCArrayFiller arrayFiller(aArrayToFill);
+	FetchArrayL(arrayFiller, aAppUid, EAppListServGetFileOwnershipInfo, KInitialOwnedFilesBufSize);
+	}
+
+EXPORT_C void RApaLsSession::RegisterListPopulationCompleteObserver(TRequestStatus& aStatus) const
+/** Registers an observer with apparc server to notify when the initial population of applist is completed
+
+@param aStatus Request status object. On successful completion contains KErrNone, otherwise one of the 
+system-wide error codes. 
+@see CancelListPopulationCompleteObserver()
+*/
+	{
+	SendReceive(ERegisterListPopulationCompleteObserver,TIpcArgs(TIpcArgs::ENothing),aStatus);
+	}
+
+EXPORT_C TInt RApaLsSession::CancelListPopulationCompleteObserver() const
+/** Cancels the observer registered with apparc server to notify when the initial population of applist is completed
+ 
+@return KErrNone, if successful; otherwise one of the system-wide error codes. 
+*/
+	{
+	return SendReceiveWithReconnect(ECancelListPopulationCompleteObserver,TIpcArgs(TIpcArgs::ENothing));
+	}
+
+EXPORT_C TInt RApaLsSession::MatchesSecurityPolicy(TBool& aMatches, TUid aAppUid, const TSecurityPolicy& aSecurityPolicy) const
+/** Tests whether the given TSecurityPolicy matches with the application TSecurityPolicy.
+
+@param aMatches On return, contains the result. ETrue if the application TSecurityPolicy matches the given TSecurityPolicy or else EFalse
+@param aAppUid Uid of the application for which the security policy has to be matched
+@param aSecurityPolicy TSecurityPolicy to test whether the application with given uid matches with its TSecurityPolicy or not.
+@return KErrNone, if successful; otherwise one of the other system-wide error codes.
+@see TSecurityPolicy
+*/
+	{
+	const TPckgC<TSecurityPolicy> securityPolicy(aSecurityPolicy);
+	const TInt result = SendReceiveWithReconnect(EMatchesSecurityPolicy,TIpcArgs(aAppUid.iUid, &securityPolicy));
+
+	if (result>=0)
+		{
+		aMatches = result;
+		}
+	return result;
+	}
+
+EXPORT_C void RApaLsSession::RApaLsSession_Reserved1()
+	{
+	}
+	
+EXPORT_C void RApaLsSession::RApaLsSession_Reserved2()
+	{
+	}
+	
+EXPORT_C void RApaLsSession::NotifyOnDataMappingChange(TRequestStatus& aRequestStatus)
+/** Notification of changes in data-type mapping
+
+This asynchronous function (whose corresponding "cancel" operation is CancelNotifyOnDataTypeMappingChange) completes when any data-type / application-UID association changes, i.e. when the default application handling a particular MIME-type changes.
+
+@param aRequestStatus As is normal for an asynchronous operation, this object is set to something other than KRequestPending when the asynchronous operation that has been triggered by this function completes.
+@see CancelNotifyOnDataTypeMappingChange
+*/
+	{
+	SendReceive(ENotifyOnDataMappingChange,TIpcArgs(), aRequestStatus);
+ 	} //lint !e1762 Suppress member function could be made const
+ 	
+EXPORT_C void RApaLsSession::CancelNotifyOnDataMappingChange()
+/** Cancellation of notification of changes in data-type mapping
+
+This cancels the outstanding the NotifyOnDataTypeMappingChange issued by this client, if there is one outstanding. Otherwise it does nothing.
+@see NotifyOnDataTypeMappingChange
+*/
+	{
+	SendReceive(ECancelNotifyOnDataMappingChange,TIpcArgs());
+	} //lint !e1762 Suppress member function could be made const
+
+CBufFlat* RApaLsSession::CreateRegFilesBufferL(const RPointerArray<TDesC>& aRegFiles)
+	{
+	// Serialize the array
+	// Format of the buffer is :
+	// 4 bytes for array item count
+	// for each item : 4 bytes for length and then the string contents
+	const TInt count = aRegFiles.Count();
+	TInt requiredBufferSize = 4;	// For the array item count
+	for (TInt index = 0; index < count; ++index)
+		{
+		requiredBufferSize += 4;	// For the string length
+		requiredBufferSize += aRegFiles[index]->Size();
+		}
+	
+	CBufFlat* const buffer = CBufFlat::NewL(requiredBufferSize);
+	CleanupStack::PushL(buffer);
+	buffer->ExpandL(0,requiredBufferSize);
+	RBufWriteStream writeStream;
+	writeStream.Open(*buffer);
+	CleanupClosePushL(writeStream);
+	writeStream.WriteUint32L(count);
+	for (TInt index = 0; index < count; ++index)
+		{
+		writeStream.WriteUint32L(aRegFiles[index]->Length());
+		writeStream.WriteL(*aRegFiles[index]);
+		}
+	writeStream.CommitL();
+	CleanupStack::PopAndDestroy(&writeStream);
+	CleanupStack::Pop(buffer);
+	return buffer;
+	}
+
+// TSizeArrayFiller
+
+void TSizeArrayFiller::AppendItemL(RReadStream& aReadStream)
+	{
+	TSize size;
+	size.iWidth =aReadStream.ReadUint32L();
+	size.iHeight=aReadStream.ReadUint32L();
+	iArray.AppendL(size);
+	}
+
+
+
+// TViewDataArrayFiller
+
+void TViewDataArrayFiller::AppendItemL(RReadStream& aReadStream)
+	{
+	TApaAppViewInfo info;
+	aReadStream >> info;
+	iArray.AppendL(info);
+	}
+
+
+
+// TDesCArrayFiller
+
+void TDesCArrayFiller::AppendItemL(RReadStream& aReadStream)
+	{
+	TFileName info;
+	aReadStream >> info;
+	iArray.AppendL(info);
+	}
+
+/* @internalComponent
+*/
+EXPORT_C TUint MinApplicationStackSize()
+	{
+	return KMinApplicationStackSize;
+	}