appfw/apparchitecture/apgrfx/apgrecog.cpp
changeset 0 2e3d3ce01487
child 46 eea20ed08f4b
child 47 312d2b433792
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/appfw/apparchitecture/apgrfx/apgrecog.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,679 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// apgrecog.cpp
+//
+
+
+#include "../apserv/APSCLSV.H"
+#include "APGCLI.H"
+#include "APGPRIV.H"
+
+class CAsyncFileRecognition;
+
+_LIT8(KAllDataTypes,"*");
+
+
+/**
+This class is an extension class for RApaLsSession. It was added to reduce the need
+of BC breaks in later releases.
+@internalComponent
+*/
+NONSHARABLE_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;
+	};
+
+/**
+This class is used to simplify the usage of the asynchronous RApaLsSession::RecognizeFilesL() function.
+@internalComponent
+*/
+NONSHARABLE_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;
+	};
+
+/**
+An entry of a CDataRecognitionResultArray object. Stores TDataRecognitionResult and the file name
+in a compact format.
+@internalComponent
+*/
+NONSHARABLE_CLASS(CDataRecognitionResultArray::CItem) : public CBase
+	{
+public:
+	CItem(HBufC* aFileName, HBufC8* aDataType, TUid aUid, TInt aConfidence);
+	~CItem();
+	void GetDataRecognitionResult(TDataRecognitionResult& aResult) const;
+	const TDesC& FileName() const;
+private:
+	HBufC* iFileName;
+	HBufC8* iDataType;
+	TUid iUid;
+	TInt iConfidence;
+	};
+
+
+//
+// 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
+	}
+
+
+
+//
+// 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 );
+	}
+
+
+/**
+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;
+		}
+	}
+
+/**
+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
+*/
+void CApaLsSessionExtension::FilesRecognized(const TDesC& aPath, TInt aRequiredBufferSize, CDataRecognitionResultArray& aResult, TRequestStatus& aUsersRequestStatus, const TRequestStatus& aErrorCode)
+	{
+	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;
+	}
+
+
+//
+// CItem
+//
+
+CDataRecognitionResultArray::CItem::CItem(HBufC* aFileName, HBufC8* aDataType, TUid aUid, TInt aConfidence)
+	: iFileName(aFileName), 
+	  iDataType(aDataType), 
+	  iUid(aUid), 
+	  iConfidence(aConfidence)
+	{
+	}
+
+CDataRecognitionResultArray::CItem::~CItem()
+	{
+	delete iFileName;
+	delete iDataType;
+	}
+
+void CDataRecognitionResultArray::CItem::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& CDataRecognitionResultArray::CItem::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()
+	{
+	iItems.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 iItems.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 >= iItems.Count() )
+		User::Leave(KErrNotFound);
+
+	iItems[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 >= iItems.Count() )
+		User::Leave(KErrNotFound);
+
+	aFileName.Zero();
+	aFileName.Copy( (iItems[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();
+		
+		CItem* entry = new (ELeave) CItem(fileName,dataType,uid,confidence);
+		iItems.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
+//
+
+/** Gets the data (MIME) type of data passed by buffer.
+
+@param aBuffer A buffer containing data 
+@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 TDesC8& aBuffer, TDataRecognitionResult& aDataType) const
+    {
+    return RecognizeData(KNullDesC,aBuffer,aDataType);
+    }
+
+/** 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)
+		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;
+	}
+	
+/** 
+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.
+*/
+EXPORT_C TInt RApaLsSession::RecognizeFilesL(const TDesC& aPath, CDataRecognitionResultArray& aResult) const
+	{
+	return RecognizeFilesL(aPath, KAllDataTypes, aResult);
+	}
+
+/** 
+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.
+*/
+EXPORT_C TInt RApaLsSession::RecognizeFilesL(const TDesC& aPath, const TDesC8& aDataType, CDataRecognitionResultArray& aResult) const
+	{
+	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(!error)
+		error=TransferAndInternalizeDataL(aPath, requiredBufferSizePckg(), aResult);
+
+	return error;
+
+	}
+
+/** 
+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.
+*/
+EXPORT_C void RApaLsSession::RecognizeFilesL(const TDesC& aPath, CDataRecognitionResultArray& aResult, TRequestStatus& aStatus)
+	{
+	RecognizeFilesL(aPath,KAllDataTypes,aResult,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
+*/
+EXPORT_C void RApaLsSession::RecognizeFilesL(const TDesC& aPath, const TDesC8& aDataType, CDataRecognitionResultArray& aResult, TRequestStatus& aStatus)
+	{
+	if(!iExtension)
+		iExtension = new (ELeave) CApaLsSessionExtension(*this);
+
+	iExtension->RecognizeFilesL(aPath, aDataType, aResult, aStatus);
+	}
+
+/**
+This function transfers the data to the client-side and "fills" the CDataRecognitionResultArray object. 
+@internalComponent
+*/
+TInt RApaLsSession::TransferAndInternalizeDataL(const TDesC& aPath, const TInt aRequiredBufferSize, CDataRecognitionResultArray& aResult) const
+	{
+	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(!error)
+		error = aResult.InternalizeL(*buffer);
+
+	CleanupStack::PopAndDestroy(buffer);
+	return error;
+	}
+
+/** 
+Cancels any outstanding asynchronous recognition requests.
+@publishedAll
+@released
+*/
+EXPORT_C void RApaLsSession::CancelRecognizeFiles()
+	{
+	if(iExtension)
+		iExtension->CancelRecognizeFiles();
+	
+	delete iExtension;
+	iExtension = NULL;
+	}
+
+/** 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. */
+EXPORT_C TInt RApaLsSession::RecognizeSpecificData(const RFile& aFile, const TDataType& aDataType, TBool& aResult) const
+	{
+	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 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
+
+
+/** 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;
+	}
+
+