williamr@4
|
1 |
// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
|
williamr@4
|
2 |
// All rights reserved.
|
williamr@4
|
3 |
// This component and the accompanying materials are made available
|
williamr@4
|
4 |
// under the terms of "Eclipse Public License v1.0"
|
williamr@4
|
5 |
// which accompanies this distribution, and is available
|
williamr@4
|
6 |
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
|
williamr@4
|
7 |
//
|
williamr@4
|
8 |
// Initial Contributors:
|
williamr@4
|
9 |
// Nokia Corporation - initial contribution.
|
williamr@4
|
10 |
//
|
williamr@4
|
11 |
// Contributors:
|
williamr@4
|
12 |
//
|
williamr@4
|
13 |
// Description:
|
williamr@4
|
14 |
// Generic parameter bundles:
|
williamr@4
|
15 |
// Serialisable containers for structured custom data.
|
williamr@4
|
16 |
// Bundle
|
williamr@4
|
17 |
// has 0..n
|
williamr@4
|
18 |
// Parameter Set Containers
|
williamr@4
|
19 |
// each of which has 0..n
|
williamr@4
|
20 |
// ParameterSets
|
williamr@4
|
21 |
// This can be seen as loosely mapping to a "table" of data,
|
williamr@4
|
22 |
// where the
|
williamr@4
|
23 |
// "table"
|
williamr@4
|
24 |
// has 0..n
|
williamr@4
|
25 |
// "rows"
|
williamr@4
|
26 |
// each of which has 0..n
|
williamr@4
|
27 |
// "groups of columns"
|
williamr@4
|
28 |
// Custom data is implemented as ParameterSet-derived classes in ECom plugins. See esock/conn_params for an example
|
williamr@4
|
29 |
//
|
williamr@4
|
30 |
//
|
williamr@4
|
31 |
// Note: Every effort should be made to ensure that the classes forming this API be kept consistent with each other
|
williamr@4
|
32 |
// When making changes to these classes also see the files es_parameterbundle.h, es_parameterfamily.h,
|
williamr@4
|
33 |
// ss_parameterfamilybundle.h
|
williamr@4
|
34 |
//
|
williamr@4
|
35 |
//
|
williamr@4
|
36 |
|
williamr@4
|
37 |
|
williamr@4
|
38 |
/**
|
williamr@4
|
39 |
@file
|
williamr@4
|
40 |
@internalTechnology
|
williamr@4
|
41 |
*/
|
williamr@4
|
42 |
|
williamr@4
|
43 |
|
williamr@4
|
44 |
#ifndef ES_PARAMETERBUNDLE_H
|
williamr@4
|
45 |
#define ES_PARAMETERBUNDLE_H
|
williamr@4
|
46 |
|
williamr@4
|
47 |
#include <comms-infras/metacontainer.h>
|
williamr@4
|
48 |
#include <comms-infras/metatype.h>
|
williamr@4
|
49 |
#include <es_sock.h>
|
williamr@4
|
50 |
#include <comms-infras/es_parameterset.h>
|
williamr@4
|
51 |
|
williamr@4
|
52 |
class CParameterBundleBase;
|
williamr@4
|
53 |
|
williamr@4
|
54 |
|
williamr@4
|
55 |
class CParameterSetContainer : public CBase, public Meta::MMetaType
|
williamr@4
|
56 |
/**
|
williamr@4
|
57 |
* A container for 0..n Parameter Sets.
|
williamr@4
|
58 |
* Can be seen as a "row" or "record" of information,
|
williamr@4
|
59 |
* with its own 32 bit Id to be used as a key to the set if required
|
williamr@4
|
60 |
* */
|
williamr@4
|
61 |
{
|
williamr@4
|
62 |
public:
|
williamr@4
|
63 |
IMPORT_C static CParameterSetContainer* NewL(CParameterBundleBase& aBundle, TUint32 aContainerId = 0);
|
williamr@4
|
64 |
IMPORT_C static CParameterSetContainer* LoadL(CParameterBundleBase& aBundle, TPtrC8& aBuffer);
|
williamr@4
|
65 |
|
williamr@4
|
66 |
IMPORT_C static CParameterSetContainer* NewL(TUint32 aContainerId = 0); // Use this constructor if the container is to live independently of a bundle
|
williamr@4
|
67 |
IMPORT_C static CParameterSetContainer* LoadL(TPtrC8& aBuffer);
|
williamr@4
|
68 |
|
williamr@4
|
69 |
public:
|
williamr@4
|
70 |
IMPORT_C virtual ~CParameterSetContainer();
|
williamr@4
|
71 |
|
williamr@4
|
72 |
inline TUint32 Id() const
|
williamr@4
|
73 |
{
|
williamr@4
|
74 |
return iContainerId;
|
williamr@4
|
75 |
}
|
williamr@4
|
76 |
|
williamr@4
|
77 |
IMPORT_C void AddParameterSetL(XParameterSetBase* aParameterSet); // ownership of object is passed
|
williamr@4
|
78 |
IMPORT_C TInt AddParameterSet(XParameterSetBase* aParameterSet); // ownership of object is passed
|
williamr@4
|
79 |
|
williamr@4
|
80 |
/**
|
williamr@4
|
81 |
Searches a container for a parameter set of the given type.
|
williamr@4
|
82 |
@param aSetId The STypeId of the set
|
williamr@4
|
83 |
@return Pointer to the set if found, otherwise a NULL pointer.
|
williamr@4
|
84 |
*/
|
williamr@4
|
85 |
IMPORT_C XParameterSetBase* FindParameterSet(const Meta::STypeId& aSetId);
|
williamr@4
|
86 |
|
williamr@4
|
87 |
const XParameterSetBase* FindParameterSet(const Meta::STypeId& aSetId) const
|
williamr@4
|
88 |
{
|
williamr@4
|
89 |
return const_cast<CParameterSetContainer*>(this)->FindParameterSet(aSetId);
|
williamr@4
|
90 |
}
|
williamr@4
|
91 |
|
williamr@4
|
92 |
/**
|
williamr@4
|
93 |
Searches a container for a specific parameter set instance.
|
williamr@4
|
94 |
@param aRhs The parameter set to find
|
williamr@4
|
95 |
@return ETrue if set was found in parameter set container.
|
williamr@4
|
96 |
*/
|
williamr@4
|
97 |
IMPORT_C TBool FindParameterSet(const XParameterSetBase& aRhs);
|
williamr@4
|
98 |
IMPORT_C XParameterSetBase* GetParameterSet(TInt aIndex);
|
williamr@4
|
99 |
|
williamr@4
|
100 |
const XParameterSetBase* GetParameterSet(TInt aIndex) const
|
williamr@4
|
101 |
{
|
williamr@4
|
102 |
return const_cast<CParameterSetContainer*>(this)->GetParameterSet(aIndex);
|
williamr@4
|
103 |
}
|
williamr@4
|
104 |
|
williamr@4
|
105 |
TInt CountParameterSets() const
|
williamr@4
|
106 |
{
|
williamr@4
|
107 |
return iParameterSets.Count();
|
williamr@4
|
108 |
}
|
williamr@4
|
109 |
|
williamr@4
|
110 |
/** Deletes set at index aIndex and replaces it with aParameterSet.
|
williamr@4
|
111 |
Ownership of set passes to this parameter set container.
|
williamr@4
|
112 |
@param aIndex - index of container to delete and replace
|
williamr@4
|
113 |
@param aParameterSet - new set to replace in array
|
williamr@4
|
114 |
@return throws KErrArgument if aIndex out of range
|
williamr@4
|
115 |
*/
|
williamr@4
|
116 |
IMPORT_C void ReplaceParameterSetL(TInt aIndex, XParameterSetBase* aNewSet);
|
williamr@4
|
117 |
IMPORT_C TInt ReplaceParameterSet(TInt aIndex, XParameterSetBase* aNewSet);
|
williamr@4
|
118 |
|
williamr@4
|
119 |
/** Deletes set at index, and reorganises the array so it's 1 smaller
|
williamr@4
|
120 |
@param aIndex - index of container to delete and remove from array
|
williamr@4
|
121 |
@return throws KErrArgument if aIndex out of range
|
williamr@4
|
122 |
*/
|
williamr@4
|
123 |
IMPORT_C void DeleteParameterSetL(TInt aIndex);
|
williamr@4
|
124 |
IMPORT_C TInt DeleteParameterSet(TInt aIndex);
|
williamr@4
|
125 |
|
williamr@4
|
126 |
/**
|
williamr@4
|
127 |
Removes the parameter set at the index. Ownership is transfered to the calling method
|
williamr@4
|
128 |
@param aIndex - index of container to delete and remove from array
|
williamr@4
|
129 |
@return returns NULL if the index was invalid, otherwise a pointer to the
|
williamr@4
|
130 |
removed parameter set.
|
williamr@4
|
131 |
*/
|
williamr@4
|
132 |
IMPORT_C XParameterSetBase* RemoveParameterSet(TInt aIndex);
|
williamr@4
|
133 |
|
williamr@4
|
134 |
/** Makes room for a bulk setting operation
|
williamr@4
|
135 |
*/
|
williamr@4
|
136 |
IMPORT_C void GrowToFitL(TInt aMinSize);
|
williamr@4
|
137 |
IMPORT_C TInt GrowToFit(TInt aMinSize);
|
williamr@4
|
138 |
|
williamr@4
|
139 |
inline void ClearParameterSetPointer(TInt aIndex)
|
williamr@4
|
140 |
{
|
williamr@4
|
141 |
iParameterSets[aIndex] = 0;
|
williamr@4
|
142 |
}
|
williamr@4
|
143 |
|
williamr@4
|
144 |
// From MMetaType
|
williamr@4
|
145 |
IMPORT_C virtual TInt Load(TPtrC8& aBuffer);
|
williamr@4
|
146 |
IMPORT_C virtual TInt Store(TDes8& aBuffer) const;
|
williamr@4
|
147 |
IMPORT_C virtual TInt Length() const;
|
williamr@4
|
148 |
|
williamr@4
|
149 |
protected:
|
williamr@4
|
150 |
CParameterSetContainer(TUint32 aContainerId)
|
williamr@4
|
151 |
: iContainerId(aContainerId)
|
williamr@4
|
152 |
{
|
williamr@4
|
153 |
}
|
williamr@4
|
154 |
|
williamr@4
|
155 |
IMPORT_C void ConstructL(CParameterBundleBase& aBundle);
|
williamr@4
|
156 |
|
williamr@4
|
157 |
|
williamr@4
|
158 |
private:
|
williamr@4
|
159 |
// From MMetaType
|
williamr@4
|
160 |
virtual void Copy(const TAny* /*aData*/)
|
williamr@4
|
161 |
{
|
williamr@4
|
162 |
// Not supported
|
williamr@4
|
163 |
}
|
williamr@4
|
164 |
|
williamr@4
|
165 |
TUint32 iContainerId;
|
williamr@4
|
166 |
Meta::RMetaDataEComContainer iParameterSets;
|
williamr@4
|
167 |
};
|
williamr@4
|
168 |
|
williamr@4
|
169 |
|
williamr@4
|
170 |
class CParameterBundleBase : public CBase
|
williamr@4
|
171 |
/** Bundle of (i.e. container for) parameter set containers.
|
williamr@4
|
172 |
|
williamr@4
|
173 |
The basic object shape and base type container manipulators.
|
williamr@4
|
174 |
To be used only by CParameterBundle<PARAMETERSETCONTAINERTYPE,SUBCLASS>
|
williamr@4
|
175 |
|
williamr@4
|
176 |
May contain and 0..N parameter families.
|
williamr@4
|
177 |
*/
|
williamr@4
|
178 |
{
|
williamr@4
|
179 |
public:
|
williamr@4
|
180 |
static inline CParameterBundleBase* NewL()
|
williamr@4
|
181 |
{
|
williamr@4
|
182 |
return new(ELeave) CParameterBundleBase;
|
williamr@4
|
183 |
}
|
williamr@4
|
184 |
|
williamr@4
|
185 |
IMPORT_C virtual ~CParameterBundleBase();
|
williamr@4
|
186 |
|
williamr@4
|
187 |
IMPORT_C TUint Length() const;
|
williamr@4
|
188 |
|
williamr@4
|
189 |
IMPORT_C TInt Store(TDes8& aDes) const;
|
williamr@4
|
190 |
|
williamr@4
|
191 |
// Load() can't be in base type as it requires static call to specific parameter set container type
|
williamr@4
|
192 |
|
williamr@4
|
193 |
IMPORT_C void AddParamSetContainerL(CParameterSetContainer& aContainer);
|
williamr@4
|
194 |
IMPORT_C TInt AddParamSetContainer(CParameterSetContainer& aContainer);
|
williamr@4
|
195 |
|
williamr@4
|
196 |
IMPORT_C CParameterSetContainer* RemoveParamSetContainer(TInt aIndex);
|
williamr@4
|
197 |
|
williamr@4
|
198 |
TInt CountParamSetContainers() const
|
williamr@4
|
199 |
{
|
williamr@4
|
200 |
return iSetContainers.Count();
|
williamr@4
|
201 |
}
|
williamr@4
|
202 |
|
williamr@4
|
203 |
IMPORT_C CParameterSetContainer* GetParamSetContainer(TInt aIndex);
|
williamr@4
|
204 |
|
williamr@4
|
205 |
const CParameterSetContainer* GetParamSetContainer(TInt aIndex) const
|
williamr@4
|
206 |
{
|
williamr@4
|
207 |
return const_cast<CParameterBundleBase*>(this)->GetParamSetContainer(aIndex);
|
williamr@4
|
208 |
}
|
williamr@4
|
209 |
|
williamr@4
|
210 |
IMPORT_C CParameterSetContainer* FindParamSetContainer(TUint32 aContainerId);
|
williamr@4
|
211 |
inline const CParameterSetContainer* FindParamSetContainer(TUint32 aContainerId) const
|
williamr@4
|
212 |
{
|
williamr@4
|
213 |
const CParameterSetContainer* r = const_cast<CParameterBundleBase*>(this)->FindParamSetContainer(aContainerId);
|
williamr@4
|
214 |
return r;
|
williamr@4
|
215 |
}
|
williamr@4
|
216 |
|
williamr@4
|
217 |
// deep search for parameter set in bundle
|
williamr@4
|
218 |
IMPORT_C XParameterSetBase* FindParameterSet(const Meta::STypeId& aTypeId);
|
williamr@4
|
219 |
inline const XParameterSetBase* FindParameterSet(const Meta::STypeId& aTypeId) const
|
williamr@4
|
220 |
{
|
williamr@4
|
221 |
const XParameterSetBase* r = const_cast<CParameterBundleBase*>(this)->FindParameterSet(aTypeId);
|
williamr@4
|
222 |
return r;
|
williamr@4
|
223 |
}
|
williamr@4
|
224 |
|
williamr@4
|
225 |
// finds aOld in array, deletes it and changes that pointer in array to be aNew instead.
|
williamr@4
|
226 |
// throws KErrArgument if aOld is not found
|
williamr@4
|
227 |
IMPORT_C void ReplaceParamSetContainerL(CParameterSetContainer* aOld, CParameterSetContainer* aNew);
|
williamr@4
|
228 |
IMPORT_C TInt ReplaceParamSetContainer(CParameterSetContainer* aOld, CParameterSetContainer* aNew);
|
williamr@4
|
229 |
|
williamr@4
|
230 |
protected:
|
williamr@4
|
231 |
CParameterBundleBase()
|
williamr@4
|
232 |
{
|
williamr@4
|
233 |
}
|
williamr@4
|
234 |
|
williamr@4
|
235 |
private:
|
williamr@4
|
236 |
CParameterBundleBase(const CParameterBundleBase& aBundle);
|
williamr@4
|
237 |
CParameterBundleBase& operator=(const CParameterBundleBase& aBundle);
|
williamr@4
|
238 |
|
williamr@4
|
239 |
protected:
|
williamr@4
|
240 |
RPointerArray<CParameterSetContainer> iSetContainers;
|
williamr@4
|
241 |
};
|
williamr@4
|
242 |
|
williamr@4
|
243 |
|
williamr@4
|
244 |
template<class PARAMSETCONTAINERTYPE, class SUBCLASS, TInt UID, TInt TYPE>
|
williamr@4
|
245 |
class MParameterSetTemplateMethods
|
williamr@4
|
246 |
/**
|
williamr@4
|
247 |
* methods brought in as a template, to avoid having to rewrite
|
williamr@4
|
248 |
* identical-looking code in every derived type of XParameterSetBase
|
williamr@4
|
249 |
*/
|
williamr@4
|
250 |
{
|
williamr@4
|
251 |
public:
|
williamr@4
|
252 |
static inline SUBCLASS* NewL(PARAMSETCONTAINERTYPE& aContainer)
|
williamr@4
|
253 |
{
|
williamr@4
|
254 |
SUBCLASS* obj = NewL();
|
williamr@4
|
255 |
CleanupStack::PushL(obj);
|
williamr@4
|
256 |
aContainer.AddParameterSetL(obj);
|
williamr@4
|
257 |
CleanupStack::Pop(obj);
|
williamr@4
|
258 |
return obj;
|
williamr@4
|
259 |
}
|
williamr@4
|
260 |
|
williamr@4
|
261 |
static inline Meta::STypeId Type()
|
williamr@4
|
262 |
{
|
williamr@4
|
263 |
return Meta::STypeId::CreateSTypeId(UID,TYPE);
|
williamr@4
|
264 |
}
|
williamr@4
|
265 |
|
williamr@4
|
266 |
static inline SUBCLASS* NewL()
|
williamr@4
|
267 |
{
|
williamr@4
|
268 |
// As it's a plugin we must instantiate via the plugin interface!
|
williamr@4
|
269 |
// Directly calling the constructor would cause a link error as
|
williamr@4
|
270 |
// the vtable won't be visible by whoever uses this.
|
williamr@4
|
271 |
// So we need ECom to import it for us.
|
williamr@4
|
272 |
return static_cast<SUBCLASS*>(Meta::SMetaDataECom::NewInstanceL(Type()));
|
williamr@4
|
273 |
}
|
williamr@4
|
274 |
|
williamr@4
|
275 |
static inline SUBCLASS* FindInParamSetContainer(PARAMSETCONTAINERTYPE& aContainer)
|
williamr@4
|
276 |
{
|
williamr@4
|
277 |
return static_cast<SUBCLASS*>(aContainer.FindParameterSet(Type()));
|
williamr@4
|
278 |
}
|
williamr@4
|
279 |
|
williamr@4
|
280 |
static inline const SUBCLASS* FindInParamSetContainer(const PARAMSETCONTAINERTYPE& aContainer)
|
williamr@4
|
281 |
{
|
williamr@4
|
282 |
return static_cast<const SUBCLASS*>(aContainer.FindParameterSet(Type()));
|
williamr@4
|
283 |
}
|
williamr@4
|
284 |
|
williamr@4
|
285 |
static inline SUBCLASS* FindInBundle(CParameterBundleBase& aBundle)
|
williamr@4
|
286 |
{
|
williamr@4
|
287 |
return static_cast<SUBCLASS*>(aBundle.FindParameterSet(Type()));
|
williamr@4
|
288 |
}
|
williamr@4
|
289 |
|
williamr@4
|
290 |
static inline const SUBCLASS* FindInBundle(const CParameterBundleBase& aBundle)
|
williamr@4
|
291 |
{
|
williamr@4
|
292 |
return static_cast<const SUBCLASS*>(aBundle.FindParameterSet(Type()));
|
williamr@4
|
293 |
}
|
williamr@4
|
294 |
};
|
williamr@4
|
295 |
|
williamr@4
|
296 |
|
williamr@4
|
297 |
template<class PARAMSETCONTAINERTYPE,class SUBCLASS>
|
williamr@4
|
298 |
class CParameterBundle : public CParameterBundleBase
|
williamr@4
|
299 |
/** Container for (bundle of) parameter set containers.
|
williamr@4
|
300 |
|
williamr@4
|
301 |
This class can't be used directly, but must be subclassed, as the NewL/LoadL refer to
|
williamr@4
|
302 |
the subclass.
|
williamr@4
|
303 |
|
williamr@4
|
304 |
May contain and 0..N parameter families of type PARAMSETCONTAINERTYPE.
|
williamr@4
|
305 |
*/
|
williamr@4
|
306 |
{
|
williamr@4
|
307 |
public:
|
williamr@4
|
308 |
|
williamr@4
|
309 |
static SUBCLASS* NewL()
|
williamr@4
|
310 |
/** Creates a new instance of a parameter bundle (heap object).
|
williamr@4
|
311 |
|
williamr@4
|
312 |
@return newly created instance of a parameter bundle
|
williamr@4
|
313 |
@exception leaves with KErrNoMemory in out of memory conditions
|
williamr@4
|
314 |
*/
|
williamr@4
|
315 |
{
|
williamr@4
|
316 |
return new (ELeave) SUBCLASS();
|
williamr@4
|
317 |
}
|
williamr@4
|
318 |
|
williamr@4
|
319 |
static SUBCLASS* LoadL(TDesC8& aDes)
|
williamr@4
|
320 |
/** Creates a new parameter set bundle from a buffer containing the serialised object.
|
williamr@4
|
321 |
|
williamr@4
|
322 |
@param aDes Buffer containing the serialised object information
|
williamr@4
|
323 |
@return a pointer to a parameter bundle if successful, otherwise leaves with system error code.
|
williamr@4
|
324 |
*/
|
williamr@4
|
325 |
{
|
williamr@4
|
326 |
SUBCLASS* obj = new (ELeave) SUBCLASS();
|
williamr@4
|
327 |
CleanupStack::PushL(obj);
|
williamr@4
|
328 |
User::LeaveIfError(obj->Load(aDes));
|
williamr@4
|
329 |
CleanupStack::Pop(obj);
|
williamr@4
|
330 |
return obj;
|
williamr@4
|
331 |
}
|
williamr@4
|
332 |
|
williamr@4
|
333 |
TInt Load(const TDesC8& aDes)
|
williamr@4
|
334 |
/** Instructs this sub-connection bundle to set its members based on the serialiesd data
|
williamr@4
|
335 |
in the buffer passed.
|
williamr@4
|
336 |
|
williamr@4
|
337 |
@param aDes Buffer containing the serialised bundle object
|
williamr@4
|
338 |
@return KErrNone if successful, otherwise system wide error
|
williamr@4
|
339 |
*/
|
williamr@4
|
340 |
{
|
williamr@4
|
341 |
TPtrC8 buf(aDes);
|
williamr@4
|
342 |
while (buf.Length() > 0)
|
williamr@4
|
343 |
{
|
williamr@4
|
344 |
TRAPD(ret, PARAMSETCONTAINERTYPE::LoadL(*(static_cast<SUBCLASS*>(this)), buf));
|
williamr@4
|
345 |
if (ret != KErrNone)
|
williamr@4
|
346 |
{
|
williamr@4
|
347 |
iSetContainers.ResetAndDestroy();
|
williamr@4
|
348 |
return ret;
|
williamr@4
|
349 |
}
|
williamr@4
|
350 |
}
|
williamr@4
|
351 |
return KErrNone;
|
williamr@4
|
352 |
}
|
williamr@4
|
353 |
|
williamr@4
|
354 |
inline PARAMSETCONTAINERTYPE* GetParamSetContainer(TInt aIndex)
|
williamr@4
|
355 |
{
|
williamr@4
|
356 |
return static_cast<PARAMSETCONTAINERTYPE*>(CParameterBundleBase::GetParamSetContainer(aIndex));
|
williamr@4
|
357 |
}
|
williamr@4
|
358 |
|
williamr@4
|
359 |
inline const PARAMSETCONTAINERTYPE* GetParamSetContainer(TInt aIndex) const
|
williamr@4
|
360 |
{
|
williamr@4
|
361 |
return static_cast<const PARAMSETCONTAINERTYPE*>(CParameterBundleBase::GetParamSetContainer(aIndex));
|
williamr@4
|
362 |
}
|
williamr@4
|
363 |
|
williamr@4
|
364 |
inline PARAMSETCONTAINERTYPE* FindParamSetContainer(TUint32 aContainerId)
|
williamr@4
|
365 |
{
|
williamr@4
|
366 |
return static_cast<PARAMSETCONTAINERTYPE*>(CParameterBundleBase::FindParamSetContainer(aContainerId));
|
williamr@4
|
367 |
}
|
williamr@4
|
368 |
|
williamr@4
|
369 |
protected:
|
williamr@4
|
370 |
CParameterBundle()
|
williamr@4
|
371 |
{
|
williamr@4
|
372 |
}
|
williamr@4
|
373 |
};
|
williamr@4
|
374 |
|
williamr@4
|
375 |
|
williamr@4
|
376 |
class CGenericParameterBundle : public CParameterBundle<CParameterSetContainer,CGenericParameterBundle>
|
williamr@4
|
377 |
{
|
williamr@4
|
378 |
};
|
williamr@4
|
379 |
|
williamr@4
|
380 |
|
williamr@4
|
381 |
|
williamr@4
|
382 |
|
williamr@4
|
383 |
#endif
|
williamr@4
|
384 |
// ES_PARAMETERBUNDLE_H
|
williamr@4
|
385 |
|
williamr@4
|
386 |
|