os/security/cryptoservices/filebasedcertificateandkeystores/source/generic/server/FSRunPackage.h
First public contribution.
2 * Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
4 * This component and the accompanying materials are made available
5 * under the terms of the License "Eclipse Public License v1.0"
6 * which accompanies this distribution, and is available
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
9 * Initial Contributors:
10 * Nokia Corporation - initial contribution.
26 #ifndef _FSRUNPACKAGE_H
27 #define _FSRUNPACKAGE_H
31 // Disable WINS warning for symbol being too long (especially for template
34 #pragma warning(disable : 4786)
37 // The CRunPackage class allows a CActive derived object to "callback"
38 // a member function with given parameters when the RunL function is called.
40 // It packages up the function call and the parameters into an object.
41 // This saves you on having to have all these different member variables
42 // to store parameters in an async call.
44 // The way this works is to create a member CRunPackage contained in
45 // your class. Your RunL would simply be
49 // iRunPackage->ExecuteL();
52 // And you set your iRunPackage by doing
53 // iRunPackage = CRunPackage2<....>(this, function, param1, param2);
55 // In addition, CRunPackage encapsulates transient variables allocated on
56 // the heap which must be destroyed when the CRunPackage object is destroyed.
58 // These objects can be added by calling the AddDeleteOnly, AddCloseDelete,
59 // and AddReleaseOnly methods. When CRunPackage is destroyed, these objects
61 class CRunPackage : public CBase
64 // Private classes derived from CBase whose destructors release transient
65 // resources when the RunPackage is destroyed
67 class CDeleteOnly : public CBase
70 CDeleteOnly(T* aPtr) : iPtr(aPtr) {}
71 ~CDeleteOnly() { delete iPtr; }
77 // Close and delete an object - this is required for pointers to R classes
79 class CCloseDelete : public CBase
82 CCloseDelete(T* aPtr) : iPtr(aPtr) {}
95 class CReleaseOnly : public CBase
98 CReleaseOnly(T* aPtr) : iPtr(aPtr) {}
99 ~CReleaseOnly() { iPtr->Release(); }
106 // when the destructor is invoked, if there is an iDeleteAction, its
107 // destructor will be invoked
108 virtual ~CRunPackage();
109 virtual void ExecuteL() = 0;
111 // Operations to add delete operations
113 TInt AddDeleteOnly(T* aPtr)
115 return AddDeleteAction(new CDeleteOnly<T>(aPtr));
118 // adds a pointer which is to be closed and deleted
120 TInt AddCloseDelete(T* aPtr)
122 return AddDeleteAction(new CCloseDelete<T>(aPtr));
125 // adds a pointer which is to be released
127 TInt AddReleaseOnly(T* aPtr)
129 return AddDeleteAction(new CReleaseOnly<T>(aPtr));
133 // Adds a deleted action
134 TInt AddDeleteAction(CBase* aAction);
137 RPointerArray<CBase> iDeleteActions;
140 // Implementation of RunPackage where callback takes no parameters
142 class CRunPackage0 : public CRunPackage
145 typedef void (T::*TRunFn)();
147 CRunPackage0(T& aParent, TRunFn aRunFn)
148 : iParent(aParent), iRunFn(aRunFn) {}
161 // implementation which takes one parameter
162 template <class T, class P1>
163 class CRunPackage1 : public CRunPackage
166 typedef void (T::*TRunFn)(P1);
168 CRunPackage1(T& aParent, TRunFn aRunFn, P1 aP1)
169 : iParent(aParent), iRunFn(aRunFn), iP1(aP1) {}
173 (iParent.*iRunFn)(iP1);
182 // implementation which takes two parameters
183 template <class T, class P1, class P2>
184 class CRunPackage2 : public CRunPackage
187 typedef void (T::*TRunFn)(P1, P2);
189 CRunPackage2(T& aParent, TRunFn aRunFn, P1 aP1, P2 aP2)
190 : iParent(aParent), iRunFn(aRunFn), iP1(aP1), iP2(aP2) {}
194 (iParent.*iRunFn)(iP1, iP2);
204 // implementation which takes three parameters
205 template <class T, class P1, class P2, class P3>
206 class CRunPackage3 : public CRunPackage
209 typedef void (T::*TRunFn)(P1, P2, P3);
211 CRunPackage3(T& aParent, TRunFn aRunFn, P1 aP1, P2 aP2, P3 aP3)
212 : iParent(aParent), iRunFn(aRunFn), iP1(aP1), iP2(aP2), iP3(aP3) {}
216 (iParent.*iRunFn)(iP1, iP2, iP3);
227 // implementation which takes four parameters
228 template <class T, class P1, class P2, class P3, class P4>
229 class CRunPackage4 : public CRunPackage
232 typedef void (T::*TRunFn)(P1, P2, P3, P4);
234 CRunPackage4(T& aParent, TRunFn aRunFn, P1 aP1, P2 aP2, P3 aP3, P4 aP4)
235 : iParent(aParent), iRunFn(aRunFn), iP1(aP1), iP2(aP2), iP3(aP3), iP4(aP4) {}
239 (iParent.*iRunFn)(iP1, iP2, iP3, iP4);
251 // implementation which takes four parameters
252 template <class T, class P1, class P2, class P3, class P4, class P5>
253 class CRunPackage5 : public CRunPackage
256 typedef void (T::*TRunFn)(P1, P2, P3, P4, P5);
258 CRunPackage5(T& aParent, TRunFn aRunFn, P1 aP1, P2 aP2, P3 aP3, P4 aP4, P5 aP5)
259 : iParent(aParent), iRunFn(aRunFn), iP1(aP1), iP2(aP2), iP3(aP3),
260 iP4(aP4), iP5(aP5) {}
264 (iParent.*iRunFn)(iP1, iP2, iP3, iP4, iP5);
277 // implementation which takes four parameters
278 template <class T, class P1, class P2, class P3, class P4, class P5, class P6>
279 class CRunPackage6 : public CRunPackage
282 typedef void (T::*TRunFn)(P1, P2, P3, P4, P5, P6);
284 CRunPackage6(T& aParent, TRunFn aRunFn, P1 aP1, P2 aP2, P3 aP3, P4 aP4, P5 aP5, P6 aP6)
285 : iParent(aParent), iRunFn(aRunFn), iP1(aP1), iP2(aP2), iP3(aP3),
286 iP4(aP4), iP5(aP5), iP6(aP6) {}
290 (iParent.*iRunFn)(iP1, iP2, iP3, iP4, iP5, iP6);