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.63 #include <Pegasus/Common/CIMOperationType.h>
|
43 mike 1.76 #include <Pegasus/Common/Linkable.h>
|
44 mike 1.4
45 PEGASUS_NAMESPACE_BEGIN
46
|
47 kumpf 1.83 class PEGASUS_COMMON_LINKAGE MessageMask
|
48 mike 1.6 {
|
49 kumpf 1.83 public:
50 // Message handling is indicated by the high order 12 bits. For example:
51 // Uint32 messageHandling = flags & 0xfff00000;
52 static Uint32 ha_request;
53 static Uint32 ha_reply;
54 static Uint32 ha_async;
|
55 mike 1.6 };
56
|
57 kumpf 1.40 enum HttpMethod
58 {
59 HTTP_METHOD__POST,
60 HTTP_METHOD_M_POST
61 };
62
|
63 kumpf 1.90 enum MessageType
64 {
65 DUMMY_MESSAGE,
66
67 // CIM Message types:
68
69 CIM_GET_CLASS_REQUEST_MESSAGE,
70 CIM_GET_INSTANCE_REQUEST_MESSAGE,
71 CIM_EXPORT_INDICATION_REQUEST_MESSAGE,
72 CIM_DELETE_CLASS_REQUEST_MESSAGE,
73 CIM_DELETE_INSTANCE_REQUEST_MESSAGE,
74 CIM_CREATE_CLASS_REQUEST_MESSAGE,
75 CIM_CREATE_INSTANCE_REQUEST_MESSAGE,
76 CIM_MODIFY_CLASS_REQUEST_MESSAGE,
77 CIM_MODIFY_INSTANCE_REQUEST_MESSAGE,
78 CIM_ENUMERATE_CLASSES_REQUEST_MESSAGE, //10
79 CIM_ENUMERATE_CLASS_NAMES_REQUEST_MESSAGE,
80 CIM_ENUMERATE_INSTANCES_REQUEST_MESSAGE,
81 CIM_ENUMERATE_INSTANCE_NAMES_REQUEST_MESSAGE,
82 CIM_EXEC_QUERY_REQUEST_MESSAGE,
83 CIM_ASSOCIATORS_REQUEST_MESSAGE,
84 kumpf 1.90 CIM_ASSOCIATOR_NAMES_REQUEST_MESSAGE,
85 CIM_REFERENCES_REQUEST_MESSAGE,
86 CIM_REFERENCE_NAMES_REQUEST_MESSAGE,
87 CIM_GET_PROPERTY_REQUEST_MESSAGE,
88 CIM_SET_PROPERTY_REQUEST_MESSAGE, //20
89 CIM_GET_QUALIFIER_REQUEST_MESSAGE,
90 CIM_SET_QUALIFIER_REQUEST_MESSAGE,
91 CIM_DELETE_QUALIFIER_REQUEST_MESSAGE,
92 CIM_ENUMERATE_QUALIFIERS_REQUEST_MESSAGE,
93 CIM_INVOKE_METHOD_REQUEST_MESSAGE,
94 CIM_PROCESS_INDICATION_REQUEST_MESSAGE,
95 CIM_HANDLE_INDICATION_REQUEST_MESSAGE,
96 CIM_NOTIFY_PROVIDER_REGISTRATION_REQUEST_MESSAGE,
97 CIM_NOTIFY_PROVIDER_TERMINATION_REQUEST_MESSAGE,
98 CIM_CREATE_SUBSCRIPTION_REQUEST_MESSAGE, // 30
99 CIM_MODIFY_SUBSCRIPTION_REQUEST_MESSAGE,
100 CIM_DELETE_SUBSCRIPTION_REQUEST_MESSAGE,
101 CIM_DISABLE_MODULE_REQUEST_MESSAGE,
102 CIM_ENABLE_MODULE_REQUEST_MESSAGE,
103 CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE,
104
105 kumpf 1.90 CIM_GET_CLASS_RESPONSE_MESSAGE,
106 CIM_GET_INSTANCE_RESPONSE_MESSAGE,
107 CIM_EXPORT_INDICATION_RESPONSE_MESSAGE,
108 CIM_DELETE_CLASS_RESPONSE_MESSAGE,
109 CIM_DELETE_INSTANCE_RESPONSE_MESSAGE, // 40
110 CIM_CREATE_CLASS_RESPONSE_MESSAGE,
111 CIM_CREATE_INSTANCE_RESPONSE_MESSAGE,
112 CIM_MODIFY_CLASS_RESPONSE_MESSAGE,
113 CIM_MODIFY_INSTANCE_RESPONSE_MESSAGE,
114 CIM_ENUMERATE_CLASSES_RESPONSE_MESSAGE,
115 CIM_ENUMERATE_CLASS_NAMES_RESPONSE_MESSAGE,
116 CIM_ENUMERATE_INSTANCES_RESPONSE_MESSAGE,
117 CIM_ENUMERATE_INSTANCE_NAMES_RESPONSE_MESSAGE,
118 CIM_EXEC_QUERY_RESPONSE_MESSAGE,
119 CIM_ASSOCIATORS_RESPONSE_MESSAGE, // 50
120 CIM_ASSOCIATOR_NAMES_RESPONSE_MESSAGE,
121 CIM_REFERENCES_RESPONSE_MESSAGE,
122 CIM_REFERENCE_NAMES_RESPONSE_MESSAGE,
123 CIM_GET_PROPERTY_RESPONSE_MESSAGE,
124 CIM_SET_PROPERTY_RESPONSE_MESSAGE,
125 CIM_GET_QUALIFIER_RESPONSE_MESSAGE,
126 kumpf 1.90 CIM_SET_QUALIFIER_RESPONSE_MESSAGE,
127 CIM_DELETE_QUALIFIER_RESPONSE_MESSAGE,
128 CIM_ENUMERATE_QUALIFIERS_RESPONSE_MESSAGE,
129 CIM_INVOKE_METHOD_RESPONSE_MESSAGE, // 60
130 CIM_PROCESS_INDICATION_RESPONSE_MESSAGE,
131 CIM_NOTIFY_PROVIDER_REGISTRATION_RESPONSE_MESSAGE,
132 CIM_NOTIFY_PROVIDER_TERMINATION_RESPONSE_MESSAGE,
133 CIM_HANDLE_INDICATION_RESPONSE_MESSAGE,
134 CIM_CREATE_SUBSCRIPTION_RESPONSE_MESSAGE,
135 CIM_MODIFY_SUBSCRIPTION_RESPONSE_MESSAGE,
136 CIM_DELETE_SUBSCRIPTION_RESPONSE_MESSAGE,
137 CIM_DISABLE_MODULE_RESPONSE_MESSAGE,
138 CIM_ENABLE_MODULE_RESPONSE_MESSAGE,
139 CIM_STOP_ALL_PROVIDERS_RESPONSE_MESSAGE, // 70
140
141 // Monitor-related messages:
142
143 SOCKET_MESSAGE,
144
145 // Connection-oriented messages:
146
147 kumpf 1.90 CLOSE_CONNECTION_MESSAGE,
148
149 // HTTP messages:
150
151 HTTP_MESSAGE,
152 HTTP_ERROR_MESSAGE,
153
154 // Exception messages to be passed to a CIM client application:
155
156 CLIENT_EXCEPTION_MESSAGE,
157
158 ASYNC_REGISTER_CIM_SERVICE,
159 ASYNC_DEREGISTER_CIM_SERVICE,
160 ASYNC_UPDATE_CIM_SERVICE,
161 ASYNC_IOCTL,
162 ASYNC_CIMSERVICE_START, // 80
163 ASYNC_CIMSERVICE_STOP,
164 ASYNC_CIMSERVICE_PAUSE,
165 ASYNC_CIMSERVICE_RESUME,
166
167 ASYNC_ASYNC_OP_START,
168 kumpf 1.90 ASYNC_ASYNC_OP_RESULT,
169 ASYNC_ASYNC_LEGACY_OP_START,
170 ASYNC_ASYNC_LEGACY_OP_RESULT,
171
172 ASYNC_FIND_SERVICE_Q,
173 ASYNC_FIND_SERVICE_Q_RESULT,
174 ASYNC_ENUMERATE_SERVICE, // 90
175 ASYNC_ENUMERATE_SERVICE_RESULT,
176
177 ASYNC_REGISTERED_MODULE,
178 ASYNC_DEREGISTERED_MODULE,
179 ASYNC_FIND_MODULE_IN_SERVICE,
180 ASYNC_FIND_MODULE_IN_SERVICE_RESPONSE,
181
182 ASYNC_ASYNC_MODULE_OP_START,
183 ASYNC_ASYNC_MODULE_OP_RESULT,
184
185 CIM_NOTIFY_PROVIDER_ENABLE_REQUEST_MESSAGE,
186 CIM_NOTIFY_PROVIDER_ENABLE_RESPONSE_MESSAGE,
187
188 CIM_NOTIFY_PROVIDER_FAIL_REQUEST_MESSAGE, // 100
189 kumpf 1.90 CIM_NOTIFY_PROVIDER_FAIL_RESPONSE_MESSAGE,
190
191 CIM_INITIALIZE_PROVIDER_AGENT_REQUEST_MESSAGE,
192 CIM_INITIALIZE_PROVIDER_AGENT_RESPONSE_MESSAGE,
193
194 CIM_NOTIFY_CONFIG_CHANGE_REQUEST_MESSAGE,
195 CIM_NOTIFY_CONFIG_CHANGE_RESPONSE_MESSAGE,
196
197 CIM_SUBSCRIPTION_INIT_COMPLETE_REQUEST_MESSAGE,
198 CIM_SUBSCRIPTION_INIT_COMPLETE_RESPONSE_MESSAGE,
199
200 NUMBER_OF_MESSAGES
201 };
202
203 PEGASUS_COMMON_LINKAGE const char* MessageTypeToString(MessageType messageType);
204
205
|
206 chip 1.24 /** The Message class and derived classes are used to pass messages between
|
207 mike 1.4 modules. Messages are passed between modules using the message queues
208 (see MessageQueue class). Derived classes may add their own fields.
|
209 kumpf 1.78 This base class defines a common type field, which is the type of
210 the message.
|
211 mike 1.4 */
|
212 mike 1.76 class PEGASUS_COMMON_LINKAGE Message : public Linkable
|
213 mike 1.4 {
|
214 kumpf 1.86 public:
215
216 Message(
|
217 kumpf 1.90 MessageType type,
|
218 kumpf 1.86 Uint32 destination = 0,
|
219 venkat.puvvada 1.89 Uint32 mask = 0)
|
220 kumpf 1.86 :
|
221 kumpf 1.94 dest(destination),
|
222 kumpf 1.86 _type(type),
223 _mask(mask),
|
224 kumpf 1.94 _httpMethod(HTTP_METHOD__POST),
225 _httpCloseConnect(false),
|
226 kumpf 1.86 _isComplete(true),
|
227 kumpf 1.94 _index(0),
228 _async(0)
|
229 kumpf 1.86 {
230 }
|
231 mike 1.4
|
232 kumpf 1.86 virtual ~Message();
|
233 chip 1.24
|
234 kumpf 1.86 // NOTE: The compiler default implementation of the copy constructor
235 // is used for this class.
236
|
237 kumpf 1.94 Boolean getCloseConnect() const { return _httpCloseConnect; }
238 void setCloseConnect(Boolean httpCloseConnect)
|
239 kumpf 1.86 {
|
240 kumpf 1.94 _httpCloseConnect = httpCloseConnect;
|
241 kumpf 1.86 }
|
242 chip 1.24
|
243 kumpf 1.90 MessageType getType() const { return _type; }
|
244 kumpf 1.40
|
245 kumpf 1.86 Uint32 getMask() const { return _mask; }
246
247 void setMask(Uint32 mask) { _mask = mask; }
248
249 HttpMethod getHttpMethod() const { return _httpMethod; }
250
251 void setHttpMethod(HttpMethod httpMethod) {_httpMethod = httpMethod;}
|
252 kumpf 1.40
|
253 kumpf 1.90 static CIMOperationType convertMessageTypetoCIMOpType(MessageType type);
|
254 w.white 1.63
|
255 joyce.j 1.69 #ifdef PEGASUS_DEBUG
|
256 kumpf 1.86 virtual void print(
257 PEGASUS_STD(ostream)& os,
258 Boolean printHeader = true) const;
|
259 joyce.j 1.69 #endif
|
260 mike 1.4
|
261 kumpf 1.86 Message* get_async()
262 {
263 Message *ret = _async;
264 _async = 0;
265 return ret;
266 }
267
268 void put_async(Message* msg)
269 {
270 _async = msg;
271 }
272
273 // set the message index indicating what piece (or sequence) this is
274 // message indexes start at zero
275 void setIndex(Uint32 index) { _index = index; }
276
|
277 kumpf 1.94 // get the message index (or sequence number)
278 Uint32 getIndex() const { return _index; }
|
279 kumpf 1.86
|
280 kumpf 1.94 // is this the first piece of the message ?
281 Boolean isFirst() const { return _index == 0; }
282
283 // set the complete flag indicating whether this message piece is the last
|
284 kumpf 1.86 void setComplete(Boolean isComplete)
285 {
|
286 kumpf 1.94 _isComplete = isComplete;
|
287 kumpf 1.86 }
288
289 // is this message complete? (i.e the last in a one or more sequence)
290 Boolean isComplete() const { return _isComplete; }
291
|
292 kumpf 1.94 Uint32 dest;
293
|
294 kumpf 1.86 private:
|
295 kumpf 1.94
296 Message& operator=(const Message& msg);
297
|
298 kumpf 1.90 MessageType _type;
|
299 kumpf 1.86 Uint32 _mask;
|
300 kumpf 1.94
|
301 kumpf 1.86 HttpMethod _httpMethod;
|
302 kumpf 1.94 Boolean _httpCloseConnect;
|
303 kumpf 1.86
|
304 kumpf 1.94 Boolean _isComplete;
305 Uint32 _index;
|
306 kumpf 1.86
|
307 kumpf 1.92 Message* _async;
|
308 mike 1.4 };
|
309 mike 1.5
|
310 mike 1.6
311 /** This class implements a stack of queue-ids. Many messages must keep a
312 stack of queue-ids of queues which they must be returned to. This provides
313 a light efficient stack for this purpose.
314 */
|
315 karl 1.60 class PEGASUS_COMMON_LINKAGE QueueIdStack
|
316 mike 1.6 {
317 public:
318
|
319 chip 1.24 QueueIdStack() : _size(0)
320 {
|
321 mike 1.6 }
322
|
323 karl 1.59 QueueIdStack(const QueueIdStack& x);
|
324 mike 1.6
|
325 kumpf 1.88 explicit QueueIdStack(Uint32 x);
|
326 mike 1.6
|
327 kumpf 1.88 explicit QueueIdStack(Uint32 x1, Uint32 x2);
|
328 mike 1.6
|
329 chip 1.24 ~QueueIdStack()
330 {
|
331 mike 1.6 }
332
|
333 karl 1.59 QueueIdStack& operator=(const QueueIdStack& x);
|
334 mike 1.6
|
335 chip 1.24 Uint32 size() const
336 {
|
337 kumpf 1.86 return _size;
|
338 mike 1.6 }
339
|
340 chip 1.24 Boolean isEmpty() const
341 {
|
342 kumpf 1.86 return _size == 0;
|
343 mike 1.6 }
344
|
345 chip 1.24 void push(Uint32 x)
|
346 mike 1.6 {
|
347 karl 1.59 #ifdef PEGASUS_DEBUG
|
348 kumpf 1.86 if (_size == MAX_SIZE)
349 throw StackOverflow();
|
350 karl 1.59 #endif
|
351 kumpf 1.86 _items[_size++] = x;
|
352 mike 1.6 }
353
354 Uint32& top()
355 {
|
356 karl 1.59 #ifdef PEGASUS_DEBUG
|
357 kumpf 1.86 if (_size == 0)
358 throw StackUnderflow();
|
359 karl 1.59 #endif
|
360 kumpf 1.86 return _items[_size-1];
|
361 mike 1.6 }
362
|
363 chip 1.24 Uint32 top() const
|
364 mike 1.6 {
|
365 kumpf 1.86 return ((QueueIdStack*)this)->top();
|
366 mike 1.6 }
367
|
368 chip 1.24 void pop()
|
369 mike 1.6 {
|
370 karl 1.59 #ifdef PEGASUS_DEBUG
|
371 kumpf 1.86 if (_size == 0)
372 throw StackUnderflow();
|
373 karl 1.59 #endif
|
374 kumpf 1.86 _size--;
|
375 mike 1.6 }
376
377 /** Make a copy of this stack and then pop the top element. */
|
378 karl 1.59 QueueIdStack copyAndPop() const;
|
379 mike 1.6
380 private:
381
382 // Copy the given stack but then pop the top element:
|
383 karl 1.59 QueueIdStack(const QueueIdStack& x, int);
|
384 mike 1.6
385 enum { MAX_SIZE = 5 };
386 Uint32 _items[MAX_SIZE];
387 Uint32 _size;
388 };
|
389 mike 1.4
390 PEGASUS_NAMESPACE_END
391
392 #endif /* Pegasus_Message_h */
|