sl@0
|
1 |
/*
|
sl@0
|
2 |
* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
|
sl@0
|
3 |
* All rights reserved.
|
sl@0
|
4 |
* This component and the accompanying materials are made available
|
sl@0
|
5 |
* under the terms of the License "Eclipse Public License v1.0"
|
sl@0
|
6 |
* which accompanies this distribution, and is available
|
sl@0
|
7 |
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
|
sl@0
|
8 |
*
|
sl@0
|
9 |
* Initial Contributors:
|
sl@0
|
10 |
* Nokia Corporation - initial contribution.
|
sl@0
|
11 |
*
|
sl@0
|
12 |
* Contributors:
|
sl@0
|
13 |
*
|
sl@0
|
14 |
* Description:
|
sl@0
|
15 |
*
|
sl@0
|
16 |
*/
|
sl@0
|
17 |
|
sl@0
|
18 |
|
sl@0
|
19 |
|
sl@0
|
20 |
|
sl@0
|
21 |
/**
|
sl@0
|
22 |
@file
|
sl@0
|
23 |
@internalTechnology
|
sl@0
|
24 |
*/
|
sl@0
|
25 |
|
sl@0
|
26 |
#ifndef _FSRUNPACKAGE_H
|
sl@0
|
27 |
#define _FSRUNPACKAGE_H
|
sl@0
|
28 |
|
sl@0
|
29 |
#include <e32base.h>
|
sl@0
|
30 |
|
sl@0
|
31 |
// Disable WINS warning for symbol being too long (especially for template
|
sl@0
|
32 |
// instantiations)
|
sl@0
|
33 |
#ifdef __WINS__
|
sl@0
|
34 |
#pragma warning(disable : 4786)
|
sl@0
|
35 |
#endif
|
sl@0
|
36 |
|
sl@0
|
37 |
// The CRunPackage class allows a CActive derived object to "callback"
|
sl@0
|
38 |
// a member function with given parameters when the RunL function is called.
|
sl@0
|
39 |
//
|
sl@0
|
40 |
// It packages up the function call and the parameters into an object.
|
sl@0
|
41 |
// This saves you on having to have all these different member variables
|
sl@0
|
42 |
// to store parameters in an async call.
|
sl@0
|
43 |
//
|
sl@0
|
44 |
// The way this works is to create a member CRunPackage contained in
|
sl@0
|
45 |
// your class. Your RunL would simply be
|
sl@0
|
46 |
//
|
sl@0
|
47 |
// if (iRunPackage)
|
sl@0
|
48 |
// {
|
sl@0
|
49 |
// iRunPackage->ExecuteL();
|
sl@0
|
50 |
// }
|
sl@0
|
51 |
//
|
sl@0
|
52 |
// And you set your iRunPackage by doing
|
sl@0
|
53 |
// iRunPackage = CRunPackage2<....>(this, function, param1, param2);
|
sl@0
|
54 |
//
|
sl@0
|
55 |
// In addition, CRunPackage encapsulates transient variables allocated on
|
sl@0
|
56 |
// the heap which must be destroyed when the CRunPackage object is destroyed.
|
sl@0
|
57 |
//
|
sl@0
|
58 |
// These objects can be added by calling the AddDeleteOnly, AddCloseDelete,
|
sl@0
|
59 |
// and AddReleaseOnly methods. When CRunPackage is destroyed, these objects
|
sl@0
|
60 |
// will be deleted.
|
sl@0
|
61 |
class CRunPackage : public CBase
|
sl@0
|
62 |
{
|
sl@0
|
63 |
private:
|
sl@0
|
64 |
// Private classes derived from CBase whose destructors release transient
|
sl@0
|
65 |
// resources when the RunPackage is destroyed
|
sl@0
|
66 |
template <class T>
|
sl@0
|
67 |
class CDeleteOnly : public CBase
|
sl@0
|
68 |
{
|
sl@0
|
69 |
public:
|
sl@0
|
70 |
CDeleteOnly(T* aPtr) : iPtr(aPtr) {}
|
sl@0
|
71 |
~CDeleteOnly() { delete iPtr; }
|
sl@0
|
72 |
|
sl@0
|
73 |
private:
|
sl@0
|
74 |
T* iPtr;
|
sl@0
|
75 |
};
|
sl@0
|
76 |
|
sl@0
|
77 |
// Close and delete an object - this is required for pointers to R classes
|
sl@0
|
78 |
template <class T>
|
sl@0
|
79 |
class CCloseDelete : public CBase
|
sl@0
|
80 |
{
|
sl@0
|
81 |
public:
|
sl@0
|
82 |
CCloseDelete(T* aPtr) : iPtr(aPtr) {}
|
sl@0
|
83 |
~CCloseDelete()
|
sl@0
|
84 |
{
|
sl@0
|
85 |
iPtr->Close();
|
sl@0
|
86 |
delete iPtr;
|
sl@0
|
87 |
}
|
sl@0
|
88 |
|
sl@0
|
89 |
private:
|
sl@0
|
90 |
T* iPtr;
|
sl@0
|
91 |
};
|
sl@0
|
92 |
|
sl@0
|
93 |
// Release an object
|
sl@0
|
94 |
template <class T>
|
sl@0
|
95 |
class CReleaseOnly : public CBase
|
sl@0
|
96 |
{
|
sl@0
|
97 |
public:
|
sl@0
|
98 |
CReleaseOnly(T* aPtr) : iPtr(aPtr) {}
|
sl@0
|
99 |
~CReleaseOnly() { iPtr->Release(); }
|
sl@0
|
100 |
|
sl@0
|
101 |
private:
|
sl@0
|
102 |
T* iPtr;
|
sl@0
|
103 |
};
|
sl@0
|
104 |
|
sl@0
|
105 |
public:
|
sl@0
|
106 |
// when the destructor is invoked, if there is an iDeleteAction, its
|
sl@0
|
107 |
// destructor will be invoked
|
sl@0
|
108 |
virtual ~CRunPackage();
|
sl@0
|
109 |
virtual void ExecuteL() = 0;
|
sl@0
|
110 |
|
sl@0
|
111 |
// Operations to add delete operations
|
sl@0
|
112 |
template <class T>
|
sl@0
|
113 |
TInt AddDeleteOnly(T* aPtr)
|
sl@0
|
114 |
{
|
sl@0
|
115 |
return AddDeleteAction(new CDeleteOnly<T>(aPtr));
|
sl@0
|
116 |
}
|
sl@0
|
117 |
|
sl@0
|
118 |
// adds a pointer which is to be closed and deleted
|
sl@0
|
119 |
template <class T>
|
sl@0
|
120 |
TInt AddCloseDelete(T* aPtr)
|
sl@0
|
121 |
{
|
sl@0
|
122 |
return AddDeleteAction(new CCloseDelete<T>(aPtr));
|
sl@0
|
123 |
}
|
sl@0
|
124 |
|
sl@0
|
125 |
// adds a pointer which is to be released
|
sl@0
|
126 |
template <class T>
|
sl@0
|
127 |
TInt AddReleaseOnly(T* aPtr)
|
sl@0
|
128 |
{
|
sl@0
|
129 |
return AddDeleteAction(new CReleaseOnly<T>(aPtr));
|
sl@0
|
130 |
}
|
sl@0
|
131 |
|
sl@0
|
132 |
private:
|
sl@0
|
133 |
// Adds a deleted action
|
sl@0
|
134 |
TInt AddDeleteAction(CBase* aAction);
|
sl@0
|
135 |
|
sl@0
|
136 |
private:
|
sl@0
|
137 |
RPointerArray<CBase> iDeleteActions;
|
sl@0
|
138 |
};
|
sl@0
|
139 |
|
sl@0
|
140 |
// Implementation of RunPackage where callback takes no parameters
|
sl@0
|
141 |
template <class T>
|
sl@0
|
142 |
class CRunPackage0 : public CRunPackage
|
sl@0
|
143 |
{
|
sl@0
|
144 |
public:
|
sl@0
|
145 |
typedef void (T::*TRunFn)();
|
sl@0
|
146 |
|
sl@0
|
147 |
CRunPackage0(T& aParent, TRunFn aRunFn)
|
sl@0
|
148 |
: iParent(aParent), iRunFn(aRunFn) {}
|
sl@0
|
149 |
|
sl@0
|
150 |
void ExecuteL()
|
sl@0
|
151 |
{
|
sl@0
|
152 |
(iParent.*iRunFn)();
|
sl@0
|
153 |
}
|
sl@0
|
154 |
|
sl@0
|
155 |
private:
|
sl@0
|
156 |
T& iParent;
|
sl@0
|
157 |
TRunFn iRunFn;
|
sl@0
|
158 |
};
|
sl@0
|
159 |
|
sl@0
|
160 |
|
sl@0
|
161 |
// implementation which takes one parameter
|
sl@0
|
162 |
template <class T, class P1>
|
sl@0
|
163 |
class CRunPackage1 : public CRunPackage
|
sl@0
|
164 |
{
|
sl@0
|
165 |
public:
|
sl@0
|
166 |
typedef void (T::*TRunFn)(P1);
|
sl@0
|
167 |
|
sl@0
|
168 |
CRunPackage1(T& aParent, TRunFn aRunFn, P1 aP1)
|
sl@0
|
169 |
: iParent(aParent), iRunFn(aRunFn), iP1(aP1) {}
|
sl@0
|
170 |
|
sl@0
|
171 |
void ExecuteL()
|
sl@0
|
172 |
{
|
sl@0
|
173 |
(iParent.*iRunFn)(iP1);
|
sl@0
|
174 |
}
|
sl@0
|
175 |
|
sl@0
|
176 |
private:
|
sl@0
|
177 |
T& iParent;
|
sl@0
|
178 |
TRunFn iRunFn;
|
sl@0
|
179 |
P1 iP1;
|
sl@0
|
180 |
};
|
sl@0
|
181 |
|
sl@0
|
182 |
// implementation which takes two parameters
|
sl@0
|
183 |
template <class T, class P1, class P2>
|
sl@0
|
184 |
class CRunPackage2 : public CRunPackage
|
sl@0
|
185 |
{
|
sl@0
|
186 |
public:
|
sl@0
|
187 |
typedef void (T::*TRunFn)(P1, P2);
|
sl@0
|
188 |
|
sl@0
|
189 |
CRunPackage2(T& aParent, TRunFn aRunFn, P1 aP1, P2 aP2)
|
sl@0
|
190 |
: iParent(aParent), iRunFn(aRunFn), iP1(aP1), iP2(aP2) {}
|
sl@0
|
191 |
|
sl@0
|
192 |
void ExecuteL()
|
sl@0
|
193 |
{
|
sl@0
|
194 |
(iParent.*iRunFn)(iP1, iP2);
|
sl@0
|
195 |
}
|
sl@0
|
196 |
|
sl@0
|
197 |
private:
|
sl@0
|
198 |
T& iParent;
|
sl@0
|
199 |
TRunFn iRunFn;
|
sl@0
|
200 |
P1 iP1;
|
sl@0
|
201 |
P2 iP2;
|
sl@0
|
202 |
};
|
sl@0
|
203 |
|
sl@0
|
204 |
// implementation which takes three parameters
|
sl@0
|
205 |
template <class T, class P1, class P2, class P3>
|
sl@0
|
206 |
class CRunPackage3 : public CRunPackage
|
sl@0
|
207 |
{
|
sl@0
|
208 |
public:
|
sl@0
|
209 |
typedef void (T::*TRunFn)(P1, P2, P3);
|
sl@0
|
210 |
|
sl@0
|
211 |
CRunPackage3(T& aParent, TRunFn aRunFn, P1 aP1, P2 aP2, P3 aP3)
|
sl@0
|
212 |
: iParent(aParent), iRunFn(aRunFn), iP1(aP1), iP2(aP2), iP3(aP3) {}
|
sl@0
|
213 |
|
sl@0
|
214 |
void ExecuteL()
|
sl@0
|
215 |
{
|
sl@0
|
216 |
(iParent.*iRunFn)(iP1, iP2, iP3);
|
sl@0
|
217 |
}
|
sl@0
|
218 |
|
sl@0
|
219 |
private:
|
sl@0
|
220 |
T& iParent;
|
sl@0
|
221 |
TRunFn iRunFn;
|
sl@0
|
222 |
P1 iP1;
|
sl@0
|
223 |
P2 iP2;
|
sl@0
|
224 |
P3 iP3;
|
sl@0
|
225 |
};
|
sl@0
|
226 |
|
sl@0
|
227 |
// implementation which takes four parameters
|
sl@0
|
228 |
template <class T, class P1, class P2, class P3, class P4>
|
sl@0
|
229 |
class CRunPackage4 : public CRunPackage
|
sl@0
|
230 |
{
|
sl@0
|
231 |
public:
|
sl@0
|
232 |
typedef void (T::*TRunFn)(P1, P2, P3, P4);
|
sl@0
|
233 |
|
sl@0
|
234 |
CRunPackage4(T& aParent, TRunFn aRunFn, P1 aP1, P2 aP2, P3 aP3, P4 aP4)
|
sl@0
|
235 |
: iParent(aParent), iRunFn(aRunFn), iP1(aP1), iP2(aP2), iP3(aP3), iP4(aP4) {}
|
sl@0
|
236 |
|
sl@0
|
237 |
void ExecuteL()
|
sl@0
|
238 |
{
|
sl@0
|
239 |
(iParent.*iRunFn)(iP1, iP2, iP3, iP4);
|
sl@0
|
240 |
}
|
sl@0
|
241 |
|
sl@0
|
242 |
private:
|
sl@0
|
243 |
T& iParent;
|
sl@0
|
244 |
TRunFn iRunFn;
|
sl@0
|
245 |
P1 iP1;
|
sl@0
|
246 |
P2 iP2;
|
sl@0
|
247 |
P3 iP3;
|
sl@0
|
248 |
P4 iP4;
|
sl@0
|
249 |
};
|
sl@0
|
250 |
|
sl@0
|
251 |
// implementation which takes four parameters
|
sl@0
|
252 |
template <class T, class P1, class P2, class P3, class P4, class P5>
|
sl@0
|
253 |
class CRunPackage5 : public CRunPackage
|
sl@0
|
254 |
{
|
sl@0
|
255 |
public:
|
sl@0
|
256 |
typedef void (T::*TRunFn)(P1, P2, P3, P4, P5);
|
sl@0
|
257 |
|
sl@0
|
258 |
CRunPackage5(T& aParent, TRunFn aRunFn, P1 aP1, P2 aP2, P3 aP3, P4 aP4, P5 aP5)
|
sl@0
|
259 |
: iParent(aParent), iRunFn(aRunFn), iP1(aP1), iP2(aP2), iP3(aP3),
|
sl@0
|
260 |
iP4(aP4), iP5(aP5) {}
|
sl@0
|
261 |
|
sl@0
|
262 |
void ExecuteL()
|
sl@0
|
263 |
{
|
sl@0
|
264 |
(iParent.*iRunFn)(iP1, iP2, iP3, iP4, iP5);
|
sl@0
|
265 |
}
|
sl@0
|
266 |
|
sl@0
|
267 |
private:
|
sl@0
|
268 |
T& iParent;
|
sl@0
|
269 |
TRunFn iRunFn;
|
sl@0
|
270 |
P1 iP1;
|
sl@0
|
271 |
P2 iP2;
|
sl@0
|
272 |
P3 iP3;
|
sl@0
|
273 |
P4 iP4;
|
sl@0
|
274 |
P5 iP5;
|
sl@0
|
275 |
};
|
sl@0
|
276 |
|
sl@0
|
277 |
// implementation which takes four parameters
|
sl@0
|
278 |
template <class T, class P1, class P2, class P3, class P4, class P5, class P6>
|
sl@0
|
279 |
class CRunPackage6 : public CRunPackage
|
sl@0
|
280 |
{
|
sl@0
|
281 |
public:
|
sl@0
|
282 |
typedef void (T::*TRunFn)(P1, P2, P3, P4, P5, P6);
|
sl@0
|
283 |
|
sl@0
|
284 |
CRunPackage6(T& aParent, TRunFn aRunFn, P1 aP1, P2 aP2, P3 aP3, P4 aP4, P5 aP5, P6 aP6)
|
sl@0
|
285 |
: iParent(aParent), iRunFn(aRunFn), iP1(aP1), iP2(aP2), iP3(aP3),
|
sl@0
|
286 |
iP4(aP4), iP5(aP5), iP6(aP6) {}
|
sl@0
|
287 |
|
sl@0
|
288 |
void ExecuteL()
|
sl@0
|
289 |
{
|
sl@0
|
290 |
(iParent.*iRunFn)(iP1, iP2, iP3, iP4, iP5, iP6);
|
sl@0
|
291 |
}
|
sl@0
|
292 |
|
sl@0
|
293 |
private:
|
sl@0
|
294 |
T& iParent;
|
sl@0
|
295 |
TRunFn iRunFn;
|
sl@0
|
296 |
P1 iP1;
|
sl@0
|
297 |
P2 iP2;
|
sl@0
|
298 |
P3 iP3;
|
sl@0
|
299 |
P4 iP4;
|
sl@0
|
300 |
P5 iP5;
|
sl@0
|
301 |
P6 iP6;
|
sl@0
|
302 |
};
|
sl@0
|
303 |
|
sl@0
|
304 |
|
sl@0
|
305 |
#endif
|