mmappfw_plat/mpx_common_definition_api/inc/mpxcmn.inl
changeset 0 a2952bb97e68
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmappfw_plat/mpx_common_definition_api/inc/mpxcmn.inl	Thu Dec 17 08:55:47 2009 +0200
@@ -0,0 +1,490 @@
+/*
+* Copyright (c) 2006 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:  Common utility functions
+*
+*/
+
+
+// ----------------------------------------------------------------------------
+// Copies elements from one array of objects of type T  to another
+// ----------------------------------------------------------------------------
+//
+template<typename T>
+inline void CopyArrayL(const TArray<T>& aSrc, RArray<T>& aDest)
+    {
+    aDest.Reset();
+    for (TInt i=0; i < aSrc.Count(); ++i)
+        {
+        aDest.AppendL(aSrc[i]);
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// Copies elements from one array of descriptors to another
+// ----------------------------------------------------------------------------
+//
+inline void CopyArrayL(const MDesCArray& aSrc, CDesCArray& aDest)
+    {
+    MPXUser::CopyArrayL(aSrc, aDest);
+    }
+
+// ----------------------------------------------------------------------------
+// Transfer a buffer from server
+// ----------------------------------------------------------------------------
+//
+inline void TransferBufferFromServerL(const RMPXSession& aSess,
+                                      TInt aCmd,
+                                      TInt aSize,
+                                      CBufBase*& aBuffer)
+    {
+    delete aBuffer;
+    aBuffer = NULL;
+    if (aSize==0)
+        {
+        User::Leave(KErrArgument);
+        }
+
+    CBufBase* buffer = MPXUser::CreateBufferLC(aSize);
+    TPtr8 ptr(buffer->Ptr(0));
+    aSess.SendReceiveL(aCmd,TIpcArgs(&ptr));
+    CleanupStack::Pop(buffer);
+    aBuffer = buffer;
+    }
+
+// ----------------------------------------------------------------------------
+// Internalize a pointer array from stream
+// ----------------------------------------------------------------------------
+//
+template<typename T>
+inline void InternalizeL(RPointerArray<T>& aArray, RReadStream& aStream)
+    {
+    TInt n=aStream.ReadInt32L();
+    for (TInt i=0;i<n;++i)
+        {
+        T* entry = new (ELeave) T;
+        CleanupStack::PushL(entry);
+        aStream >> *entry;
+        aArray.AppendL(entry);
+        CleanupStack::Pop(entry);
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// Internalize a pointer array from stream
+// ----------------------------------------------------------------------------
+//
+template<typename T>
+inline void InternalizeCObjectArrayL(
+    RPointerArray<T>& aArray,
+    RReadStream& aStream)
+    {
+    TInt n=aStream.ReadInt32L();
+    for (TInt i=0;i<n;++i)
+        {
+        T* entry = T::NewL();
+        CleanupStack::PushL(entry);
+        aStream >> *entry;
+        aArray.AppendL(entry);
+        CleanupStack::Pop(entry);
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// Internalize an array from stream
+// ----------------------------------------------------------------------------
+//
+template<typename T>
+inline void InternalizeL(RArray<T>& aArray, RReadStream& aStream)
+    {
+    TInt n=aStream.ReadInt32L();
+    for (TInt i=0;i<n;++i)
+        {
+        TPckgBuf<T> item;
+        aStream.ReadL(item);
+        aArray.AppendL(item());
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// Internalize a descriptor array from stream
+// ----------------------------------------------------------------------------
+//
+inline void InternalizeL(CDesCArray& aArray, RReadStream& aStream)
+    {
+    TInt n=aStream.ReadInt32L();
+    for (TInt i=0;i<n;++i)
+        {
+        TInt length=aStream.ReadInt32L();
+        HBufC* item = HBufC::NewLC(length);
+        TPtr ptr = item->Des();
+        aStream.ReadL(ptr, length);
+        aArray.AppendL(*item);
+        CleanupStack::PopAndDestroy(item);
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// Exernalize a pointer array to stream
+// ----------------------------------------------------------------------------
+//
+template<typename T>
+inline void ExternalizeL(const TArray<T*>& aArray, RWriteStream& aStream)
+    {
+    TInt len = aArray.Count();
+    aStream.WriteInt32L(len);
+    for(TInt i = 0;i<len;i++)
+        {
+        T &entry = *aArray[i];
+        aStream << entry;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// Externalize an array to stream
+// ----------------------------------------------------------------------------
+//
+template<typename T>
+inline void ExternalizeL(const TArray<T>& aArray, RWriteStream& aStream)
+    {
+    TInt n=aArray.Count();
+    aStream.WriteInt32L(n);
+    for (TInt i=0;i<n;++i)
+        {
+        TPckgBuf<T> item(aArray[i]);
+        aStream.WriteL(item);
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// Externalize a descriptor array to stream
+// ----------------------------------------------------------------------------
+//
+inline void ExternalizeL(const MDesCArray& aArray, RWriteStream& aStream)
+    {
+    TInt n=aArray.MdcaCount();
+    aStream.WriteInt32L(n);
+    for (TInt i=0;i<n;++i)
+        {
+        TInt length=aArray.MdcaPoint(i).Length();
+        aStream.WriteInt32L(length);
+        aStream.WriteL(aArray.MdcaPoint(i));
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// Helper function to create an array from buf.
+// ----------------------------------------------------------------------------
+//
+template<typename T>
+inline void CreateFromBufferL(const CBufBase &aBuf, CArrayFix<T>*& aArray)
+    {
+    delete aArray;
+    aArray = NULL;
+    RBufReadStream rs(aBuf);
+    CleanupClosePushL(rs);
+    CArrayFix<T>* array=new(ELeave)CArrayFixFlat<T>(1); //magic number
+    CleanupStack::PushL(array);
+    rs >> *array;
+    CleanupStack::Pop(array);
+    aArray = array;
+    CleanupStack::PopAndDestroy(&rs);
+    }
+
+// ----------------------------------------------------------------------------
+// Helper function to create a descriptor array from buf.
+// ----------------------------------------------------------------------------
+//
+inline void CreateFromBufferL(const CBufBase &aBuf, CDesCArray*& aArray)
+    {
+    delete aArray;
+    aArray = NULL;
+    RBufReadStream rs(aBuf);
+    CleanupClosePushL(rs);
+    CDesCArray* array=new(ELeave)CDesCArrayFlat(1); //magic number
+    CleanupStack::PushL(array);
+    InternalizeL(*array, rs);
+    CleanupStack::Pop(array);
+    aArray = array;
+    CleanupStack::PopAndDestroy(&rs);
+    }
+
+// ----------------------------------------------------------------------------
+// Helper function to create an array from buf.
+// ----------------------------------------------------------------------------
+//
+template<typename T>
+inline void CreateFromBufferL(const CBufBase &aBuf, RPointerArray<T>& aArray)
+    {
+    aArray.ResetAndDestroy();
+    RBufReadStream rs(aBuf);
+    CleanupClosePushL(rs);
+    InternalizeL(aArray, rs);
+    CleanupStack::PopAndDestroy(&rs);
+    }
+
+// ----------------------------------------------------------------------------
+// Helper function to create an array from buf.
+// ----------------------------------------------------------------------------
+//
+template<typename T>
+inline void CreateFromBufferL(const CBufBase &aBuf, RArray<T>& aArray)
+    {
+    aArray.Reset();
+    RBufReadStream rs(aBuf);
+    CleanupClosePushL(rs);
+    InternalizeL(aArray, rs);
+    CleanupStack::PopAndDestroy(&rs);
+    }
+
+// ----------------------------------------------------------------------------
+// Retrieves an object of from buffer
+// ----------------------------------------------------------------------------
+//
+template<typename T>
+inline void CreateFromBufferL(const CBufBase &aBuf, T*& aObject)
+    {
+    delete aObject;
+    aObject = NULL;
+    RBufReadStream rs(aBuf);
+    CleanupClosePushL(rs);
+    aObject=new(ELeave)T;
+    CleanupStack::PushL(aObject);
+    rs>>*aObject;
+    CleanupStack::Pop(aObject);
+    CleanupStack::PopAndDestroy(&rs);
+    }
+
+// ----------------------------------------------------------------------------
+// Retrieves an object of from buffer
+// Note: class T must implement T::NewL(RReadStream& aStream) constructor
+// ----------------------------------------------------------------------------
+//
+template<typename T>
+inline void NewFromBufferL(const CBufBase &aBuf, T*& aObject)
+    {
+    delete aObject;
+    aObject = NULL;
+    RBufReadStream rs(aBuf);
+    CleanupClosePushL(rs);
+    aObject=T::NewL();
+    CleanupStack::PushL(aObject);
+    rs>>*aObject;
+    CleanupStack::Pop(aObject);
+    CleanupStack::PopAndDestroy(&rs);
+    }
+
+// ----------------------------------------------------------------------------
+// Retrieves an object of from message buffer
+// ----------------------------------------------------------------------------
+//
+template<typename T>
+inline void CreateFromMessageL(const RMessage2& aMessage,
+                              TInt aMsgSlot,
+                              T*& aObject)
+    {
+    CBufBase* buffer(NULL);
+    MPXUser::CreateBufferL(aMessage, aMsgSlot, buffer);
+    CleanupStack::PushL(buffer);
+    CreateFromBufferL<T>(*buffer, aObject);
+    CleanupStack::PopAndDestroy(buffer);
+    }
+
+// ----------------------------------------------------------------------------
+// Retrieves an object of from message buffer
+// ----------------------------------------------------------------------------
+//
+template<typename T>
+inline void NewFromMessageL(const RMessage2& aMessage,
+                            TInt aMsgSlot,
+                            T*& aObject)
+    {
+    CBufBase* buffer(NULL);
+    MPXUser::CreateBufferL(aMessage, aMsgSlot, buffer);
+    CleanupStack::PushL(buffer);
+    NewFromBufferL<T>(*buffer, aObject);
+    CleanupStack::PopAndDestroy(buffer);
+    }
+
+// ----------------------------------------------------------------------------
+// Copy an object into the buffer
+// ----------------------------------------------------------------------------
+//
+template<typename T>
+inline void CreateBufferL(const T& aObj, CBufBase*& aBuffer)
+    {
+    delete aBuffer;
+    aBuffer = NULL;
+    CBufBase* buffer = CBufFlat::NewL(KMPXBufGranularity);
+    CleanupStack::PushL(buffer);
+    RBufWriteStream ws(*buffer);
+    CleanupClosePushL(ws);
+    ws<<aObj;
+    ws.CommitL();
+    CleanupStack::PopAndDestroy(&ws);
+    buffer->Compress();
+    CleanupStack::Pop(buffer);
+    aBuffer = buffer;
+    }
+
+// ----------------------------------------------------------------------------
+// Create the buffer from an array
+// ----------------------------------------------------------------------------
+//
+template<typename T>
+inline void CreateBufferL(const TArray<T>& aArray, CBufBase*& aBuffer)
+    {
+    delete aBuffer;
+    aBuffer = NULL;
+    TInt size=aArray.Count()*sizeof(TPckgBuf<T>)+sizeof(TInt);
+    CBufBase* buffer = MPXUser::CreateBufferLC(size);
+    RBufWriteStream ws(*buffer);
+    CleanupClosePushL(ws);
+    ExternalizeL(aArray, ws);
+    ws.CommitL();
+    CleanupStack::PopAndDestroy(&ws);
+    buffer->Compress();
+    CleanupStack::Pop(buffer);
+    aBuffer = buffer;
+    }
+
+// ----------------------------------------------------------------------------
+// Create the buffer from an array of object
+// ----------------------------------------------------------------------------
+//
+template<typename T>
+inline void CreateBufferL(const TArray<T*>& aArray, CBufBase*& aBuffer)
+    {
+    delete aBuffer;
+    aBuffer = NULL;
+    CBufBase* buffer = CBufFlat::NewL(KMPXBufGranularity);
+    CleanupStack::PushL(buffer);
+    RBufWriteStream ws(*buffer);
+    CleanupClosePushL(ws);
+    ExternalizeL(aArray, ws);
+    ws.CommitL();
+    CleanupStack::PopAndDestroy(&ws);
+    buffer->Compress();
+    CleanupStack::Pop(buffer);
+    aBuffer = buffer;
+    }
+
+// ----------------------------------------------------------------------------
+// Copy an array from the server
+// ----------------------------------------------------------------------------
+//
+template<typename T>
+void ArrayFromServerL(const RMPXSession& aSess,
+                      TInt aCmd,
+                      TInt aSize,
+                      CArrayFixBase*& aArray)
+    {
+    delete aArray;
+    aArray = NULL;
+
+    CBufBase* buffer(NULL);
+    TransferBufferFromServerL(aSess, aCmd, aSize, buffer);
+    if (!buffer)
+        {
+        CleanupStack::PushL(buffer);
+        CArrayFix<T>* array = NULL;
+        CreateFromBufferL<T>(*buffer, array);
+        aArray = array;
+        CleanupStack::PopAndDestroy(buffer);
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// Copy an array from the server
+// ----------------------------------------------------------------------------
+//
+template<typename T>
+void ArrayFromServerL(const RMPXSession& aSess,
+                      TInt aCmd,
+                      TInt aSize,
+                      RPointerArray<T>& aArray)
+    {
+    CBufBase* buffer(NULL);
+    TransferBufferFromServerL(aSess, aCmd, aSize, buffer);
+    CleanupStack::PushL(buffer);
+    CreateFromBufferL<T>(*buffer, aArray);
+    CleanupStack::PopAndDestroy(buffer);
+    }
+
+// ----------------------------------------------------------------------------
+// Copy an array from the server
+// ----------------------------------------------------------------------------
+//
+template<typename T>
+void ArrayFromServerL(const RMPXSession& aSess,
+                      TInt aCmd,
+                      TInt aSize,
+                      RArray<T>& aArray)
+    {
+    CBufBase* buffer(NULL);
+    TransferBufferFromServerL(aSess, aCmd, aSize, buffer);
+    CleanupStack::PushL(buffer);
+    CreateFromBufferL<T>(*buffer, aArray);
+    CleanupStack::PopAndDestroy(buffer);
+    }
+
+// ----------------------------------------------------------------------------
+//  Packages an object of type T into a descriptor and writes back to the
+//  client space in message slot aMsgSlot of aMessage.
+// ----------------------------------------------------------------------------
+//
+template<typename T> void WriteL(const RMessage2& aMessage,
+                                 TInt aMsgSlot,T aValue)
+    {
+    TPckgC<T> value(aValue);
+    aMessage.WriteL(aMsgSlot,value);
+    }
+
+// ----------------------------------------------------------------------------
+// Default constructor
+// ----------------------------------------------------------------------------
+//
+template <class T>
+inline RMPXPointerArray<T>::RMPXPointerArray()
+        {
+        }
+
+// ----------------------------------------------------------------------------
+// Closes the array and frees all resources;
+// ----------------------------------------------------------------------------
+//
+template <class T>
+inline void RMPXPointerArray<T>::Close()
+        {
+        this->ResetAndDestroy();
+        RPointerArray<T>::Close();
+        }
+
+// ----------------------------------------------------------------------------
+// Destructor
+// ----------------------------------------------------------------------------
+//
+template <class T>
+inline RMPXPointerArray<T>::~RMPXPointerArray()
+    {
+    Close();
+    }
+
+template<typename T>
+inline void DeleteL(const T* aItem, RPointerArray<T>& aArray)
+    {
+    TInt index = aArray.FindL(aItem);
+    aArray.Remove(index);
+    delete aItem;
+    }
+// End of file
\ No newline at end of file