remotecontrol/remotecontrolfw/common/utils.h
author hgs
Wed, 13 Oct 2010 16:20:29 +0300
changeset 51 20ac952a623c
permissions -rw-r--r--
201040_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51
20ac952a623c 201040_02
hgs
parents:
diff changeset
     1
// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
20ac952a623c 201040_02
hgs
parents:
diff changeset
     2
// All rights reserved.
20ac952a623c 201040_02
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
20ac952a623c 201040_02
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
20ac952a623c 201040_02
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
20ac952a623c 201040_02
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
20ac952a623c 201040_02
hgs
parents:
diff changeset
     7
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
     8
// Initial Contributors:
20ac952a623c 201040_02
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    10
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
    11
// Contributors:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    12
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
    13
// Description:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    14
// Utilities for Rem Con server.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    15
// 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    16
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
    17
20ac952a623c 201040_02
hgs
parents:
diff changeset
    18
/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
    19
 @file
20ac952a623c 201040_02
hgs
parents:
diff changeset
    20
 @internalComponent
20ac952a623c 201040_02
hgs
parents:
diff changeset
    21
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    22
20ac952a623c 201040_02
hgs
parents:
diff changeset
    23
#ifndef REMCONUTILS_H
20ac952a623c 201040_02
hgs
parents:
diff changeset
    24
#define REMCONUTILS_H
20ac952a623c 201040_02
hgs
parents:
diff changeset
    25
20ac952a623c 201040_02
hgs
parents:
diff changeset
    26
#include <e32base.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    27
#include <ecom/ecom.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    28
#include <s32strm.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    29
#include <s32buf.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    30
20ac952a623c 201040_02
hgs
parents:
diff changeset
    31
// In debug, using checking forms of CleanupStack::Pop. In release builds, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    32
// use the non-checking form to save a little bit of ROM.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    33
#ifdef _DEBUG
20ac952a623c 201040_02
hgs
parents:
diff changeset
    34
#define CLEANUPSTACK_POP1(a)		CleanupStack::Pop(a);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    35
#define CLEANUPSTACK_POP2(a, b) 	CleanupStack::Pop(a, b);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    36
#else
20ac952a623c 201040_02
hgs
parents:
diff changeset
    37
#define CLEANUPSTACK_POP1(a)		CleanupStack::Pop();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    38
#define CLEANUPSTACK_POP2(a, b) 	CleanupStack::Pop(2);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    39
#endif // _DEBUG
20ac952a623c 201040_02
hgs
parents:
diff changeset
    40
20ac952a623c 201040_02
hgs
parents:
diff changeset
    41
// Used for cleanup stack-based cleanup of RImplInfoPtrArrays.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    42
void CleanupResetAndDestroyPushL(RImplInfoPtrArray& aArray);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    43
// Used for cleanup stack-based cleanup of temporary heaps.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    44
void CleanupSwitchHeapPushL(RHeap& aHeap);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    45
20ac952a623c 201040_02
hgs
parents:
diff changeset
    46
20ac952a623c 201040_02
hgs
parents:
diff changeset
    47
template <class T>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    48
class CleanupDeleteAndNull
20ac952a623c 201040_02
hgs
parents:
diff changeset
    49
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    50
public:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    51
	inline static void PushL(T*& aRef) {CleanupStack::PushL(TCleanupItem(&DeleteAndNull,&aRef));};
20ac952a623c 201040_02
hgs
parents:
diff changeset
    52
private:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    53
	static void DeleteAndNull(TAny *aPtr) {T*& ptr = *static_cast<T**>(aPtr); delete ptr; ptr = NULL;};
20ac952a623c 201040_02
hgs
parents:
diff changeset
    54
	};
20ac952a623c 201040_02
hgs
parents:
diff changeset
    55
template <class T>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    56
inline void CleanupDeleteAndNullPushL(T*& aRef)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    57
	{CleanupDeleteAndNull<T>::PushL(aRef);}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    58
20ac952a623c 201040_02
hgs
parents:
diff changeset
    59
template <class T>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    60
class CleanupReset
20ac952a623c 201040_02
hgs
parents:
diff changeset
    61
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    62
public:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    63
	inline static void PushL(T& aRef) {CleanupStack::PushL(TCleanupItem(&Reset,&aRef));};
20ac952a623c 201040_02
hgs
parents:
diff changeset
    64
private:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    65
	static void Reset(TAny *aPtr) {(static_cast<T*>(aPtr))->Reset();};
20ac952a623c 201040_02
hgs
parents:
diff changeset
    66
	};
20ac952a623c 201040_02
hgs
parents:
diff changeset
    67
template <class T>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    68
inline void CleanupResetPushL(T& aRef)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    69
	{CleanupReset<T>::PushL(aRef);}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    70
20ac952a623c 201040_02
hgs
parents:
diff changeset
    71
template <class T>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    72
class CleanupSignal
20ac952a623c 201040_02
hgs
parents:
diff changeset
    73
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    74
public:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    75
	inline static void PushL(T& aRef) {CleanupStack::PushL(TCleanupItem(&Signal,&aRef));};
20ac952a623c 201040_02
hgs
parents:
diff changeset
    76
private:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    77
	static void Signal(TAny *aPtr) {(static_cast<T*>(aPtr))->Signal();};
20ac952a623c 201040_02
hgs
parents:
diff changeset
    78
	};
20ac952a623c 201040_02
hgs
parents:
diff changeset
    79
template <class T>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    80
inline void CleanupSignalPushL(T& aRef)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    81
	{CleanupSignal<T>::PushL(aRef);}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    82
20ac952a623c 201040_02
hgs
parents:
diff changeset
    83
template <class T>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    84
class CleanupNull
20ac952a623c 201040_02
hgs
parents:
diff changeset
    85
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    86
public:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    87
	inline static void PushL(T*& aRef) {CleanupStack::PushL(TCleanupItem(&Null,&aRef));};
20ac952a623c 201040_02
hgs
parents:
diff changeset
    88
private:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    89
	static void Null(TAny *aPtr) {T*& ptr = *static_cast<T**>(aPtr); ptr = NULL;};
20ac952a623c 201040_02
hgs
parents:
diff changeset
    90
	};
20ac952a623c 201040_02
hgs
parents:
diff changeset
    91
template <class T>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    92
inline void CleanupNullPushL(T*& aRef)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    93
	{CleanupNull<T>::PushL(aRef);}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    94
20ac952a623c 201040_02
hgs
parents:
diff changeset
    95
20ac952a623c 201040_02
hgs
parents:
diff changeset
    96
20ac952a623c 201040_02
hgs
parents:
diff changeset
    97
/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
    98
A wrapper class around an RFastLock that enables locks to be nested.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    99
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   100
NONSHARABLE_CLASS(RNestableLock)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   101
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   102
public:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   103
	RNestableLock();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   104
	TInt CreateLocal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   105
	void Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   106
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   107
	void Wait();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   108
	void Signal();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   109
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   110
private:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   111
	static const TUint32 KInvalidThreadId = ~0u;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   112
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   113
private:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   114
	RFastLock	iLock;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   115
	RFastLock	iMetaLock;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   116
	TThreadId	iThreadId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   117
	TInt		iRefCount;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   118
	};
20ac952a623c 201040_02
hgs
parents:
diff changeset
   119
20ac952a623c 201040_02
hgs
parents:
diff changeset
   120
20ac952a623c 201040_02
hgs
parents:
diff changeset
   121
class CSpecificThreadCallBackBody;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   122
20ac952a623c 201040_02
hgs
parents:
diff changeset
   123
NONSHARABLE_CLASS(RSpecificThreadCallBack)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   124
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   125
public:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   126
	RSpecificThreadCallBack();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   127
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   128
	TInt Create(const TCallBack& aCallBack, TInt aPriority);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   129
	void Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   130
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   131
	TInt Start();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   132
	TInt CallBack();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   133
	void Cancel();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   134
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   135
private:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   136
	CSpecificThreadCallBackBody*	iBody;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   137
	};
20ac952a623c 201040_02
hgs
parents:
diff changeset
   138
20ac952a623c 201040_02
hgs
parents:
diff changeset
   139
20ac952a623c 201040_02
hgs
parents:
diff changeset
   140
NONSHARABLE_CLASS(RCountSizeWriteStream)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   141
	: public RWriteStream
20ac952a623c 201040_02
hgs
parents:
diff changeset
   142
	, public MStreamBuf
20ac952a623c 201040_02
hgs
parents:
diff changeset
   143
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   144
public:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   145
	using RWriteStream::Close;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   146
	RCountSizeWriteStream();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   147
	TInt Size() const;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   148
	void Reset();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   149
20ac952a623c 201040_02
hgs
parents:
diff changeset
   150
private: // MStreamBuf
20ac952a623c 201040_02
hgs
parents:
diff changeset
   151
	void DoRelease();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   152
	void DoSynchL();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   153
	TInt DoReadL(TAny* aPtr,TInt aMaxLength);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   154
	TInt DoReadL(TDes8& aDes,TInt aMaxLength,TRequestStatus& aStatus);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   155
	TStreamTransfer DoReadL(MStreamInput& anInput,TStreamTransfer aTransfer);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   156
	void DoWriteL(const TAny* aPtr,TInt aLength);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   157
	TInt DoWriteL(const TDesC8& aDes,TInt aMaxLength,TRequestStatus& aStatus);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   158
	TStreamTransfer DoWriteL(MStreamOutput& anOutput,TStreamTransfer aTransfer);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   159
	TStreamPos DoSeekL(TMark aMark,TStreamLocation aLocation,TInt anOffset);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   160
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   161
private:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   162
	TInt iSize;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   163
	};
20ac952a623c 201040_02
hgs
parents:
diff changeset
   164
20ac952a623c 201040_02
hgs
parents:
diff changeset
   165
#endif // REMCONUTILS_H