--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/accessoryservices/remotecontrolfw/common/utils.h Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,165 @@
+// Copyright (c) 2004-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:
+// Utilities for Rem Con server.
+//
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#ifndef REMCONUTILS_H
+#define REMCONUTILS_H
+
+#include <e32base.h>
+#include <ecom/ecom.h>
+#include <s32strm.h>
+#include <s32buf.h>
+
+// In debug, using checking forms of CleanupStack::Pop. In release builds,
+// use the non-checking form to save a little bit of ROM.
+#ifdef _DEBUG
+#define CLEANUPSTACK_POP1(a) CleanupStack::Pop(a);
+#define CLEANUPSTACK_POP2(a, b) CleanupStack::Pop(a, b);
+#else
+#define CLEANUPSTACK_POP1(a) CleanupStack::Pop();
+#define CLEANUPSTACK_POP2(a, b) CleanupStack::Pop(2);
+#endif // _DEBUG
+
+// Used for cleanup stack-based cleanup of RImplInfoPtrArrays.
+void CleanupResetAndDestroyPushL(RImplInfoPtrArray& aArray);
+// Used for cleanup stack-based cleanup of temporary heaps.
+void CleanupSwitchHeapPushL(RHeap& aHeap);
+
+
+template <class T>
+class CleanupDeleteAndNull
+ {
+public:
+ inline static void PushL(T*& aRef) {CleanupStack::PushL(TCleanupItem(&DeleteAndNull,&aRef));};
+private:
+ static void DeleteAndNull(TAny *aPtr) {T*& ptr = *static_cast<T**>(aPtr); delete ptr; ptr = NULL;};
+ };
+template <class T>
+inline void CleanupDeleteAndNullPushL(T*& aRef)
+ {CleanupDeleteAndNull<T>::PushL(aRef);}
+
+template <class T>
+class CleanupReset
+ {
+public:
+ inline static void PushL(T& aRef) {CleanupStack::PushL(TCleanupItem(&Reset,&aRef));};
+private:
+ static void Reset(TAny *aPtr) {(static_cast<T*>(aPtr))->Reset();};
+ };
+template <class T>
+inline void CleanupResetPushL(T& aRef)
+ {CleanupReset<T>::PushL(aRef);}
+
+template <class T>
+class CleanupSignal
+ {
+public:
+ inline static void PushL(T& aRef) {CleanupStack::PushL(TCleanupItem(&Signal,&aRef));};
+private:
+ static void Signal(TAny *aPtr) {(static_cast<T*>(aPtr))->Signal();};
+ };
+template <class T>
+inline void CleanupSignalPushL(T& aRef)
+ {CleanupSignal<T>::PushL(aRef);}
+
+template <class T>
+class CleanupNull
+ {
+public:
+ inline static void PushL(T*& aRef) {CleanupStack::PushL(TCleanupItem(&Null,&aRef));};
+private:
+ static void Null(TAny *aPtr) {T*& ptr = *static_cast<T**>(aPtr); ptr = NULL;};
+ };
+template <class T>
+inline void CleanupNullPushL(T*& aRef)
+ {CleanupNull<T>::PushL(aRef);}
+
+
+
+/**
+A wrapper class around an RFastLock that enables locks to be nested.
+*/
+NONSHARABLE_CLASS(RNestableLock)
+ {
+public:
+ RNestableLock();
+ TInt CreateLocal();
+ void Close();
+
+ void Wait();
+ void Signal();
+
+private:
+ static const TUint32 KInvalidThreadId = ~0u;
+
+private:
+ RFastLock iLock;
+ RFastLock iMetaLock;
+ TThreadId iThreadId;
+ TInt iRefCount;
+ };
+
+
+class CSpecificThreadCallBackBody;
+
+NONSHARABLE_CLASS(RSpecificThreadCallBack)
+ {
+public:
+ RSpecificThreadCallBack();
+
+ TInt Create(const TCallBack& aCallBack, TInt aPriority);
+ void Close();
+
+ TInt Start();
+ TInt CallBack();
+ void Cancel();
+
+private:
+ CSpecificThreadCallBackBody* iBody;
+ };
+
+
+NONSHARABLE_CLASS(RCountSizeWriteStream)
+ : public RWriteStream
+ , public MStreamBuf
+ {
+public:
+ using RWriteStream::Close;
+ RCountSizeWriteStream();
+ TInt Size() const;
+ void Reset();
+
+private: // MStreamBuf
+ void DoRelease();
+ void DoSynchL();
+ TInt DoReadL(TAny* aPtr,TInt aMaxLength);
+ TInt DoReadL(TDes8& aDes,TInt aMaxLength,TRequestStatus& aStatus);
+ TStreamTransfer DoReadL(MStreamInput& anInput,TStreamTransfer aTransfer);
+ void DoWriteL(const TAny* aPtr,TInt aLength);
+ TInt DoWriteL(const TDesC8& aDes,TInt aMaxLength,TRequestStatus& aStatus);
+ TStreamTransfer DoWriteL(MStreamOutput& anOutput,TStreamTransfer aTransfer);
+ TStreamPos DoSeekL(TMark aMark,TStreamLocation aLocation,TInt anOffset);
+
+private:
+ TInt iSize;
+ };
+
+#endif // REMCONUTILS_H