1 karl 1.72 //%2006////////////////////////////////////////////////////////////////////////
|
2 mike 1.4 //
|
3 karl 1.58 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
|
6 karl 1.48 // IBM Corp.; EMC Corporation, The Open Group.
|
7 karl 1.58 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
|
9 karl 1.62 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 karl 1.72 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
|
13 mike 1.4 //
14 // Permission is hereby granted, free of charge, to any person obtaining a copy
|
15 chip 1.24 // of this software and associated documentation files (the "Software"), to
16 // deal in the Software without restriction, including without limitation the
17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
18 mike 1.4 // sell copies of the Software, and to permit persons to whom the Software is
19 // furnished to do so, subject to the following conditions:
|
20 kumpf 1.37 //
|
21 chip 1.24 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
|
22 mike 1.4 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
24 chip 1.24 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
27 mike 1.4 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 //==============================================================================
31 //
32 //%/////////////////////////////////////////////////////////////////////////////
33
34 #ifndef Pegasus_Message_h
35 #define Pegasus_Message_h
36
|
37 mike 1.6 #include <Pegasus/Common/Config.h>
|
38 mike 1.4 #include <iostream>
|
39 mike 1.6 #include <cstring>
|
40 kumpf 1.39 #include <Pegasus/Common/InternalException.h>
|
41 kumpf 1.38 #include <Pegasus/Common/Linkage.h>
|
42 w.white 1.68 #include <Pegasus/Common/TimeValue.h>
|
43 w.white 1.63 #include <Pegasus/Common/CIMOperationType.h>
|
44 kumpf 1.81 #include <Pegasus/Common/Threads.h>
|
45 mike 1.76 #include <Pegasus/Common/Linkable.h>
|
46 mike 1.4
47 PEGASUS_NAMESPACE_BEGIN
48
|
49 kumpf 1.83 class PEGASUS_COMMON_LINKAGE MessageMask
|
50 mike 1.6 {
|
51 kumpf 1.83 public:
52 // Message type is indicated by the low order 20 bits. For example:
53 // Uint32 messageType = flags & 0x000fffff;
54 static Uint32 type_legacy;
55 static Uint32 type_cimom;
56 static Uint32 type_service;
57
58 // Message handling is indicated by the high order 12 bits. For example:
59 // Uint32 messageHandling = flags & 0xfff00000;
60 static Uint32 ha_request;
61 static Uint32 ha_reply;
62 static Uint32 ha_async;
|
63 mike 1.6 };
64
|
65 kumpf 1.40 enum HttpMethod
66 {
67 HTTP_METHOD__POST,
68 HTTP_METHOD_M_POST
69 };
70
|
71 chip 1.24 /** The Message class and derived classes are used to pass messages between
|
72 mike 1.4 modules. Messages are passed between modules using the message queues
73 (see MessageQueue class). Derived classes may add their own fields.
|
74 kumpf 1.78 This base class defines a common type field, which is the type of
75 the message.
|
76 mike 1.4
77 The Message class also provides previous and next pointers which are
78 used to place the messages on a queue by the MessageQueue class.
79 */
|
80 mike 1.76 class PEGASUS_COMMON_LINKAGE Message : public Linkable
|
81 mike 1.4 {
|
82 mday 1.8 public:
|
83 mike 1.4
|
84 mday 1.8 Message(
|
85 mday 1.20 Uint32 type,
86 Uint32 destination = 0,
|
87 kumpf 1.83 Uint32 mask = MessageMask::type_legacy)
|
88 chip 1.24 :
89 _type(type),
|
90 mday 1.8 _mask(mask),
|
91 kumpf 1.45 _httpMethod (HTTP_METHOD__POST),
|
92 j.alex 1.70 _close_connect(false),
|
93 mike 1.80 _last_thread_id(Threads::self()),
|
94 mday 1.20 _async(0),
|
95 brian.campbell 1.55 dest(destination),
96 _isComplete(true),
97 _index(0)
|
98 chip 1.24 {
|
99 mday 1.8
100 }
|
101 mike 1.6
|
102 mday 1.32 Message & operator = ( const Message & msg)
103 {
104 if (this != &msg)
105 {
106 _type = msg._type;
107 _mask = msg._mask;
|
108 mday 1.44 _last_thread_id = msg._last_thread_id;
|
109 kumpf 1.82 _async = 0;
|
110 mday 1.32 dest = msg.dest;
|
111 brian.campbell 1.55 _httpMethod = msg._httpMethod;
112 _index = msg._index;
113 _isComplete = msg._isComplete;
|
114 mday 1.44
|
115 mday 1.32 }
116 return *this;
117 }
|
118 chip 1.34
|
119 chip 1.24
120 virtual ~Message();
|
121 j.alex 1.70 Boolean getCloseConnect() const { return _close_connect; }
122 void setCloseConnect(Boolean close_connect)
123 {
124 _close_connect = close_connect;
125 }
|
126 mike 1.4
|
127 mday 1.8 Uint32 getType() const { return _type; }
|
128 mike 1.4
|
129 mday 1.8 void setType(Uint32 type) { _type = type; }
|
130 mike 1.4
|
131 mday 1.8 Uint32 getMask() const { return _mask; }
|
132 chip 1.24
|
133 mday 1.8 void setMask(Uint32 mask) { _mask = mask; }
|
134 chip 1.24
|
135 kumpf 1.40 HttpMethod getHttpMethod() const { return _httpMethod; }
136
137 void setHttpMethod(HttpMethod httpMethod) {_httpMethod = httpMethod;}
138
|
139 w.white 1.63
|
140 karl 1.61 #ifndef PEGASUS_DISABLE_PERFINST
|
141 sage 1.30 //
142 // Needed for performance measurement
143 //
144
145 void startServer();
146
147 void endServer();
148
149 void startProvider();
150
151 void endProvider();
152
|
153 w.white 1.68 TimeValue getStartServerTime() const { return _timeServerStart; }
|
154 sage 1.30
|
155 w.white 1.68 void setStartServerTime(TimeValue timeServerStart)
|
156 sage 1.30 {
157 _timeServerStart = timeServerStart;
158 }
159
|
160 w.white 1.68 TimeValue getStartProviderTime() const { return _timeProviderStart; }
|
161 sage 1.30
|
162 w.white 1.68 void setStartProviderTime(TimeValue timeProviderStart)
|
163 sage 1.30 {
164 _timeProviderStart = timeProviderStart;
165 }
166
|
167 w.white 1.68 TimeValue getEndServerTime() const { return _timeServerEnd; }
|
168 sage 1.30
|
169 w.white 1.68 void setEndServerTime (TimeValue timeServerEnd)
|
170 sage 1.30 {
171 _timeServerEnd = timeServerEnd;
172 }
173
|
174 w.white 1.68 TimeValue getEndProviderTime() const { return _timeProviderEnd; }
|
175 sage 1.30
|
176 w.white 1.68 void setEndProviderTime(TimeValue timeProviderEnd)
|
177 sage 1.30 {
178 _timeProviderEnd = timeProviderEnd;
179 }
180
|
181 w.white 1.68 TimeValue getServerTime() { return _serverTime; }
|
182 sage 1.30 //
|
183 sage 1.31 #endif
|
184 sage 1.30
|
185 a.dunfey 1.67 static CIMOperationType convertMessageTypetoCIMOpType(Uint32 type);
|
186 w.white 1.63
|
187 joyce.j 1.69 #ifdef PEGASUS_DEBUG
|
188 mike 1.36 virtual void print(
189 PEGASUS_STD(ostream)& os,
190 Boolean printHeader = true) const;
|
191 joyce.j 1.69 #endif
|
192 mike 1.4
|
193 mday 1.22 Message *get_async(void)
194 {
195 Message *ret = _async;
196 _async = 0;
197 return ret;
|
198 chip 1.24
|
199 mday 1.22 }
|
200 chip 1.24
|
201 mday 1.22 void put_async(Message * msg)
202 {
203 _async = msg;
204 }
|
205 chip 1.24
|
206 mday 1.44 // << Tue Jul 1 11:02:49 2003 mdd >> pep_88 and helper for i18n and l10n
207 Boolean thread_changed(void)
208 {
|
209 mike 1.80 if (!Threads::equal(_last_thread_id, Threads::self()))
|
210 mday 1.44 {
|
211 mike 1.80 _last_thread_id = Threads::self();
|
212 mday 1.44 return true;
213 }
214
215 return false;
216 }
217
|
218 brian.campbell 1.55 // set the message index indicating what piece (or sequence) this is
219 // message indexes start at zero
220 void setIndex(Uint32 index) { _index = index; }
221
222 // increment the message index
223 void incrementIndex() { _index++; }
224
225 // set the complete flag indicating if this message piece is the
226 // last or not
227 void setComplete(Boolean isComplete)
228 { _isComplete = isComplete ? true:false; }
229
230 // get the message index (or sequence number)
231 Uint32 getIndex() const { return _index; }
232
233 // is this the first piece of the message ?
234 Boolean isFirst() const { return _index == 0 ? true : false; }
235
236 // is this message complete? (i.e the last in a one or more sequence)
237 Boolean isComplete() const { return _isComplete; }
|
238 chip 1.24
|
239 mday 1.8 private:
|
240 mike 1.6 Uint32 _type;
241 Uint32 _mask;
|
242 kumpf 1.40 HttpMethod _httpMethod;
|
243 sage 1.30 // Needed for performance measurement
|
244 w.white 1.68 TimeValue _timeServerStart;
245 TimeValue _timeServerEnd;
246 TimeValue _timeProviderStart;
247 TimeValue _timeProviderEnd;
248 TimeValue _serverTime;
|
249 j.alex 1.70 Boolean _close_connect;
250
|
251 sage 1.30 //
|
252 mday 1.44
253 // << Tue Jul 1 11:02:35 2003 mdd >> pep_88 and helper for i18n and l10n
|
254 mike 1.80 ThreadType _last_thread_id;
|
255 mday 1.32
256 public:
|
257 mday 1.19 Message *_async;
|
258 mday 1.20 Uint32 dest;
|
259 w.white 1.56 //needed for PEP 128 - transmitting Server Response Time to Client
260 Uint64 totServerTime;
261
|
262 mday 1.19 private:
|
263 brian.campbell 1.55 Boolean _isComplete;
264 Uint32 _index;
|
265 mday 1.44
|
266 mday 1.20 friend class cimom;
|
267 mday 1.19 friend class MessageQueueService;
268 friend class AsyncLegacyOperationStart;
269 friend class AsyncLegacyOperationResult;
|
270 chip 1.24
|
271 mike 1.4 };
|
272 mike 1.5
|
273 mike 1.6
|
274 mike 1.5 enum MessageType
275 {
276 DUMMY_MESSAGE,
277
278 // CIM Message types:
279
280 CIM_GET_CLASS_REQUEST_MESSAGE,
281 CIM_GET_INSTANCE_REQUEST_MESSAGE,
|
282 mike 1.6 CIM_EXPORT_INDICATION_REQUEST_MESSAGE,
|
283 mike 1.5 CIM_DELETE_CLASS_REQUEST_MESSAGE,
284 CIM_DELETE_INSTANCE_REQUEST_MESSAGE,
285 CIM_CREATE_CLASS_REQUEST_MESSAGE,
286 CIM_CREATE_INSTANCE_REQUEST_MESSAGE,
287 CIM_MODIFY_CLASS_REQUEST_MESSAGE,
288 CIM_MODIFY_INSTANCE_REQUEST_MESSAGE,
|
289 mday 1.32 CIM_ENUMERATE_CLASSES_REQUEST_MESSAGE, //10
|
290 mike 1.5 CIM_ENUMERATE_CLASS_NAMES_REQUEST_MESSAGE,
291 CIM_ENUMERATE_INSTANCES_REQUEST_MESSAGE,
292 CIM_ENUMERATE_INSTANCE_NAMES_REQUEST_MESSAGE,
293 CIM_EXEC_QUERY_REQUEST_MESSAGE,
294 CIM_ASSOCIATORS_REQUEST_MESSAGE,
295 CIM_ASSOCIATOR_NAMES_REQUEST_MESSAGE,
296 CIM_REFERENCES_REQUEST_MESSAGE,
297 CIM_REFERENCE_NAMES_REQUEST_MESSAGE,
298 CIM_GET_PROPERTY_REQUEST_MESSAGE,
|
299 mday 1.32 CIM_SET_PROPERTY_REQUEST_MESSAGE, //20
|
300 mike 1.5 CIM_GET_QUALIFIER_REQUEST_MESSAGE,
301 CIM_SET_QUALIFIER_REQUEST_MESSAGE,
302 CIM_DELETE_QUALIFIER_REQUEST_MESSAGE,
303 CIM_ENUMERATE_QUALIFIERS_REQUEST_MESSAGE,
304 CIM_INVOKE_METHOD_REQUEST_MESSAGE,
|
305 kumpf 1.15 CIM_PROCESS_INDICATION_REQUEST_MESSAGE,
|
306 kumpf 1.73 CIM_HANDLE_INDICATION_REQUEST_MESSAGE,
|
307 kumpf 1.75 CIM_NOTIFY_PROVIDER_REGISTRATION_REQUEST_MESSAGE,
|
308 kumpf 1.15 CIM_NOTIFY_PROVIDER_TERMINATION_REQUEST_MESSAGE,
|
309 kumpf 1.75 CIM_CREATE_SUBSCRIPTION_REQUEST_MESSAGE, // 30
|
310 chip 1.25 CIM_MODIFY_SUBSCRIPTION_REQUEST_MESSAGE,
311 CIM_DELETE_SUBSCRIPTION_REQUEST_MESSAGE,
|
312 kumpf 1.29 CIM_DISABLE_MODULE_REQUEST_MESSAGE,
313 CIM_ENABLE_MODULE_REQUEST_MESSAGE,
|
314 carolann.graves 1.64 CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE,
|
315 kumpf 1.35
|
316 kumpf 1.43 CIM_GET_CLASS_RESPONSE_MESSAGE,
|
317 kumpf 1.73 CIM_GET_INSTANCE_RESPONSE_MESSAGE,
|
318 kumpf 1.75 CIM_EXPORT_INDICATION_RESPONSE_MESSAGE,
|
319 mike 1.5 CIM_DELETE_CLASS_RESPONSE_MESSAGE,
|
320 kumpf 1.75 CIM_DELETE_INSTANCE_RESPONSE_MESSAGE, // 40
|
321 mike 1.5 CIM_CREATE_CLASS_RESPONSE_MESSAGE,
322 CIM_CREATE_INSTANCE_RESPONSE_MESSAGE,
323 CIM_MODIFY_CLASS_RESPONSE_MESSAGE,
324 CIM_MODIFY_INSTANCE_RESPONSE_MESSAGE,
|
325 carolann.graves 1.64 CIM_ENUMERATE_CLASSES_RESPONSE_MESSAGE,
|
326 mike 1.5 CIM_ENUMERATE_CLASS_NAMES_RESPONSE_MESSAGE,
|
327 kumpf 1.73 CIM_ENUMERATE_INSTANCES_RESPONSE_MESSAGE,
|
328 kumpf 1.75 CIM_ENUMERATE_INSTANCE_NAMES_RESPONSE_MESSAGE,
|
329 mike 1.5 CIM_EXEC_QUERY_RESPONSE_MESSAGE,
|
330 kumpf 1.75 CIM_ASSOCIATORS_RESPONSE_MESSAGE, // 50
|
331 mike 1.5 CIM_ASSOCIATOR_NAMES_RESPONSE_MESSAGE,
332 CIM_REFERENCES_RESPONSE_MESSAGE,
333 CIM_REFERENCE_NAMES_RESPONSE_MESSAGE,
334 CIM_GET_PROPERTY_RESPONSE_MESSAGE,
|
335 carolann.graves 1.64 CIM_SET_PROPERTY_RESPONSE_MESSAGE,
|
336 mike 1.5 CIM_GET_QUALIFIER_RESPONSE_MESSAGE,
|
337 kumpf 1.73 CIM_SET_QUALIFIER_RESPONSE_MESSAGE,
|
338 kumpf 1.75 CIM_DELETE_QUALIFIER_RESPONSE_MESSAGE,
|
339 mike 1.5 CIM_ENUMERATE_QUALIFIERS_RESPONSE_MESSAGE,
|
340 kumpf 1.75 CIM_INVOKE_METHOD_RESPONSE_MESSAGE, // 60
|
341 kumpf 1.15 CIM_PROCESS_INDICATION_RESPONSE_MESSAGE,
|
342 carolann.graves 1.64 CIM_NOTIFY_PROVIDER_REGISTRATION_RESPONSE_MESSAGE,
|
343 kumpf 1.15 CIM_NOTIFY_PROVIDER_TERMINATION_RESPONSE_MESSAGE,
|
344 kumpf 1.73 CIM_HANDLE_INDICATION_RESPONSE_MESSAGE,
|
345 chip 1.25 CIM_CREATE_SUBSCRIPTION_RESPONSE_MESSAGE,
|
346 kumpf 1.75 CIM_MODIFY_SUBSCRIPTION_RESPONSE_MESSAGE,
|
347 chip 1.25 CIM_DELETE_SUBSCRIPTION_RESPONSE_MESSAGE,
|
348 kumpf 1.29 CIM_DISABLE_MODULE_RESPONSE_MESSAGE,
349 CIM_ENABLE_MODULE_RESPONSE_MESSAGE,
|
350 kumpf 1.75 CIM_STOP_ALL_PROVIDERS_RESPONSE_MESSAGE, // 70
|
351 chip 1.24
|
352 mike 1.6 // Monitor-related messages:
353
354 SOCKET_MESSAGE,
355
356 // Connection-oriented messages:
357
358 CLOSE_CONNECTION_MESSAGE,
359
360 // HTTP messages:
361
362 HTTP_MESSAGE,
|
363 kumpf 1.73 HTTP_ERROR_MESSAGE,
|
364 kumpf 1.28
365 // Exception messages to be passed to a CIM client application:
366
367 CLIENT_EXCEPTION_MESSAGE,
|
368 mike 1.5
|
369 kumpf 1.75 ASYNC_REGISTER_CIM_SERVICE,
|
370 mday 1.33 ASYNC_DEREGISTER_CIM_SERVICE,
371 ASYNC_UPDATE_CIM_SERVICE,
372 ASYNC_IOCTL,
|
373 kumpf 1.75 ASYNC_CIMSERVICE_START, // 80
|
374 mday 1.33 ASYNC_CIMSERVICE_STOP,
375 ASYNC_CIMSERVICE_PAUSE,
376 ASYNC_CIMSERVICE_RESUME,
377
|
378 kumpf 1.73 ASYNC_ASYNC_OP_START,
|
379 mday 1.33 ASYNC_ASYNC_OP_RESULT,
|
380 kumpf 1.75 ASYNC_ASYNC_LEGACY_OP_START,
|
381 chip 1.34 ASYNC_ASYNC_LEGACY_OP_RESULT,
382
|
383 mday 1.33 ASYNC_FIND_SERVICE_Q,
384 ASYNC_FIND_SERVICE_Q_RESULT,
|
385 kumpf 1.75 ASYNC_ENUMERATE_SERVICE, // 90
|
386 mday 1.33 ASYNC_ENUMERATE_SERVICE_RESULT,
|
387 chip 1.34
|
388 mday 1.33 ASYNC_REGISTERED_MODULE,
389 ASYNC_DEREGISTERED_MODULE,
|
390 kumpf 1.73 ASYNC_FIND_MODULE_IN_SERVICE,
|
391 mday 1.33 ASYNC_FIND_MODULE_IN_SERVICE_RESPONSE,
|
392 chip 1.34
|
393 kumpf 1.75 ASYNC_ASYNC_MODULE_OP_START,
|
394 mday 1.33 ASYNC_ASYNC_MODULE_OP_RESULT,
395
|
396 kumpf 1.53 CIM_NOTIFY_PROVIDER_ENABLE_REQUEST_MESSAGE,
397 CIM_NOTIFY_PROVIDER_ENABLE_RESPONSE_MESSAGE,
398
|
399 kumpf 1.75 CIM_NOTIFY_PROVIDER_FAIL_REQUEST_MESSAGE, // 100
|
400 carolann.graves 1.74 CIM_NOTIFY_PROVIDER_FAIL_RESPONSE_MESSAGE,
401
|
402 kumpf 1.53 CIM_INITIALIZE_PROVIDER_REQUEST_MESSAGE,
|
403 w.white 1.52 CIM_INITIALIZE_PROVIDER_RESPONSE_MESSAGE,
404
|
405 kumpf 1.53 CIM_INITIALIZE_PROVIDER_AGENT_REQUEST_MESSAGE,
406 CIM_INITIALIZE_PROVIDER_AGENT_RESPONSE_MESSAGE,
|
407 kumpf 1.47
|
408 kumpf 1.54 CIM_NOTIFY_CONFIG_CHANGE_REQUEST_MESSAGE,
409 CIM_NOTIFY_CONFIG_CHANGE_RESPONSE_MESSAGE,
410
|
411 carolann.graves 1.64 CIM_SUBSCRIPTION_INIT_COMPLETE_REQUEST_MESSAGE,
412 CIM_SUBSCRIPTION_INIT_COMPLETE_RESPONSE_MESSAGE,
413
|
414 mike 1.5 NUMBER_OF_MESSAGES
415 };
416
417 PEGASUS_COMMON_LINKAGE const char* MessageTypeToString(Uint32 messageType);
|
418 mike 1.6
419 /** This class implements a stack of queue-ids. Many messages must keep a
420 stack of queue-ids of queues which they must be returned to. This provides
421 a light efficient stack for this purpose.
422 */
|
423 karl 1.60 class PEGASUS_COMMON_LINKAGE QueueIdStack
|
424 mike 1.6 {
425 public:
426
|
427 chip 1.24 QueueIdStack() : _size(0)
428 {
|
429 mike 1.6 }
430
|
431 karl 1.59 QueueIdStack(const QueueIdStack& x);
|
432 mike 1.6
|
433 karl 1.59 PEGASUS_EXPLICIT QueueIdStack(Uint32 x);
|
434 mike 1.6
|
435 karl 1.59 PEGASUS_EXPLICIT QueueIdStack(Uint32 x1, Uint32 x2);
|
436 mike 1.6
|
437 chip 1.24 ~QueueIdStack()
438 {
|
439 mike 1.6 }
440
|
441 karl 1.59 QueueIdStack& operator=(const QueueIdStack& x);
|
442 mike 1.6
|
443 chip 1.24 Uint32 size() const
444 {
445 return _size;
|
446 mike 1.6 }
447
|
448 chip 1.24 Boolean isEmpty() const
449 {
450 return _size == 0;
|
451 mike 1.6 }
452
|
453 chip 1.24 void push(Uint32 x)
|
454 mike 1.6 {
|
455 karl 1.59 #ifdef PEGASUS_DEBUG
|
456 mike 1.6 if (_size == MAX_SIZE)
457 throw StackOverflow();
|
458 karl 1.59 #endif
|
459 mike 1.6 _items[_size++] = x;
460 }
461
462 Uint32& top()
463 {
|
464 karl 1.59 #ifdef PEGASUS_DEBUG
|
465 mike 1.6 if (_size == 0)
466 throw StackUnderflow();
|
467 karl 1.59 #endif
|
468 mike 1.6 return _items[_size-1];
469 }
470
|
471 chip 1.24 Uint32 top() const
|
472 mike 1.6 {
|
473 chip 1.24 return ((QueueIdStack*)this)->top();
|
474 mike 1.6 }
475
|
476 chip 1.24 void pop()
|
477 mike 1.6 {
|
478 karl 1.59 #ifdef PEGASUS_DEBUG
|
479 mike 1.6 if (_size == 0)
480 throw StackUnderflow();
|
481 karl 1.59 #endif
|
482 mike 1.6 _size--;
483 }
484
485 /** Make a copy of this stack and then pop the top element. */
|
486 karl 1.59 QueueIdStack copyAndPop() const;
|
487 mike 1.6
488 private:
489
490 // Copy the given stack but then pop the top element:
|
491 karl 1.59 QueueIdStack(const QueueIdStack& x, int);
|
492 mike 1.6
493 enum { MAX_SIZE = 5 };
494 Uint32 _items[MAX_SIZE];
495 Uint32 _size;
496 };
|
497 mike 1.4
498 PEGASUS_NAMESPACE_END
499
500 #endif /* Pegasus_Message_h */
|