1 martin 1.98 //%LICENSE////////////////////////////////////////////////////////////////
|
2 martin 1.99 //
|
3 martin 1.98 // Licensed to The Open Group (TOG) under one or more contributor license
4 // agreements. Refer to the OpenPegasusNOTICE.txt file distributed with
5 // this work for additional information regarding copyright ownership.
6 // Each contributor licenses this file to you under the OpenPegasus Open
7 // Source License; you may not use this file except in compliance with the
8 // License.
|
9 martin 1.99 //
|
10 martin 1.98 // Permission is hereby granted, free of charge, to any person obtaining a
11 // copy of this software and associated documentation files (the "Software"),
12 // to deal in the Software without restriction, including without limitation
13 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 // and/or sell copies of the Software, and to permit persons to whom the
15 // Software is furnished to do so, subject to the following conditions:
|
16 martin 1.99 //
|
17 martin 1.98 // The above copyright notice and this permission notice shall be included
18 // in all copies or substantial portions of the Software.
|
19 martin 1.99 //
|
20 martin 1.98 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
21 martin 1.99 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
22 martin 1.98 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
24 // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
27 martin 1.99 //
|
28 martin 1.98 //////////////////////////////////////////////////////////////////////////
|
29 mike 1.4 //
30 //%/////////////////////////////////////////////////////////////////////////////
31
32 #ifndef Pegasus_Message_h
33 #define Pegasus_Message_h
34
|
35 mike 1.6 #include <Pegasus/Common/Config.h>
|
36 mike 1.4 #include <iostream>
|
37 mike 1.6 #include <cstring>
|
38 kumpf 1.39 #include <Pegasus/Common/InternalException.h>
|
39 kumpf 1.38 #include <Pegasus/Common/Linkage.h>
|
40 w.white 1.63 #include <Pegasus/Common/CIMOperationType.h>
|
41 mike 1.76 #include <Pegasus/Common/Linkable.h>
|
42 mike 1.4
43 PEGASUS_NAMESPACE_BEGIN
44
|
45 kumpf 1.83 class PEGASUS_COMMON_LINKAGE MessageMask
|
46 mike 1.6 {
|
47 kumpf 1.83 public:
48 // Message handling is indicated by the high order 12 bits. For example:
49 // Uint32 messageHandling = flags & 0xfff00000;
50 static Uint32 ha_request;
51 static Uint32 ha_reply;
52 static Uint32 ha_async;
|
53 mike 1.6 };
54
|
55 kumpf 1.40 enum HttpMethod
56 {
57 HTTP_METHOD__POST,
58 HTTP_METHOD_M_POST
59 };
60
|
61 kumpf 1.90 enum MessageType
62 {
63 DUMMY_MESSAGE,
64
65 // CIM Message types:
66
67 CIM_GET_CLASS_REQUEST_MESSAGE,
68 CIM_GET_INSTANCE_REQUEST_MESSAGE,
69 CIM_EXPORT_INDICATION_REQUEST_MESSAGE,
70 CIM_DELETE_CLASS_REQUEST_MESSAGE,
71 CIM_DELETE_INSTANCE_REQUEST_MESSAGE,
72 CIM_CREATE_CLASS_REQUEST_MESSAGE,
73 CIM_CREATE_INSTANCE_REQUEST_MESSAGE,
74 CIM_MODIFY_CLASS_REQUEST_MESSAGE,
75 CIM_MODIFY_INSTANCE_REQUEST_MESSAGE,
76 CIM_ENUMERATE_CLASSES_REQUEST_MESSAGE, //10
77 CIM_ENUMERATE_CLASS_NAMES_REQUEST_MESSAGE,
78 CIM_ENUMERATE_INSTANCES_REQUEST_MESSAGE,
79 CIM_ENUMERATE_INSTANCE_NAMES_REQUEST_MESSAGE,
80 CIM_EXEC_QUERY_REQUEST_MESSAGE,
81 CIM_ASSOCIATORS_REQUEST_MESSAGE,
82 kumpf 1.90 CIM_ASSOCIATOR_NAMES_REQUEST_MESSAGE,
83 CIM_REFERENCES_REQUEST_MESSAGE,
84 CIM_REFERENCE_NAMES_REQUEST_MESSAGE,
85 CIM_GET_PROPERTY_REQUEST_MESSAGE,
86 CIM_SET_PROPERTY_REQUEST_MESSAGE, //20
87 CIM_GET_QUALIFIER_REQUEST_MESSAGE,
88 CIM_SET_QUALIFIER_REQUEST_MESSAGE,
89 CIM_DELETE_QUALIFIER_REQUEST_MESSAGE,
90 CIM_ENUMERATE_QUALIFIERS_REQUEST_MESSAGE,
91 CIM_INVOKE_METHOD_REQUEST_MESSAGE,
92 CIM_PROCESS_INDICATION_REQUEST_MESSAGE,
93 CIM_HANDLE_INDICATION_REQUEST_MESSAGE,
94 CIM_NOTIFY_PROVIDER_REGISTRATION_REQUEST_MESSAGE,
95 CIM_NOTIFY_PROVIDER_TERMINATION_REQUEST_MESSAGE,
96 CIM_CREATE_SUBSCRIPTION_REQUEST_MESSAGE, // 30
97 CIM_MODIFY_SUBSCRIPTION_REQUEST_MESSAGE,
98 CIM_DELETE_SUBSCRIPTION_REQUEST_MESSAGE,
99 CIM_DISABLE_MODULE_REQUEST_MESSAGE,
100 CIM_ENABLE_MODULE_REQUEST_MESSAGE,
101 CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE,
102
103 kumpf 1.90 CIM_GET_CLASS_RESPONSE_MESSAGE,
104 CIM_GET_INSTANCE_RESPONSE_MESSAGE,
105 CIM_EXPORT_INDICATION_RESPONSE_MESSAGE,
106 CIM_DELETE_CLASS_RESPONSE_MESSAGE,
107 CIM_DELETE_INSTANCE_RESPONSE_MESSAGE, // 40
108 CIM_CREATE_CLASS_RESPONSE_MESSAGE,
109 CIM_CREATE_INSTANCE_RESPONSE_MESSAGE,
110 CIM_MODIFY_CLASS_RESPONSE_MESSAGE,
111 CIM_MODIFY_INSTANCE_RESPONSE_MESSAGE,
112 CIM_ENUMERATE_CLASSES_RESPONSE_MESSAGE,
113 CIM_ENUMERATE_CLASS_NAMES_RESPONSE_MESSAGE,
114 CIM_ENUMERATE_INSTANCES_RESPONSE_MESSAGE,
115 CIM_ENUMERATE_INSTANCE_NAMES_RESPONSE_MESSAGE,
116 CIM_EXEC_QUERY_RESPONSE_MESSAGE,
117 CIM_ASSOCIATORS_RESPONSE_MESSAGE, // 50
118 CIM_ASSOCIATOR_NAMES_RESPONSE_MESSAGE,
119 CIM_REFERENCES_RESPONSE_MESSAGE,
120 CIM_REFERENCE_NAMES_RESPONSE_MESSAGE,
121 CIM_GET_PROPERTY_RESPONSE_MESSAGE,
122 CIM_SET_PROPERTY_RESPONSE_MESSAGE,
123 CIM_GET_QUALIFIER_RESPONSE_MESSAGE,
124 kumpf 1.90 CIM_SET_QUALIFIER_RESPONSE_MESSAGE,
125 CIM_DELETE_QUALIFIER_RESPONSE_MESSAGE,
126 CIM_ENUMERATE_QUALIFIERS_RESPONSE_MESSAGE,
127 CIM_INVOKE_METHOD_RESPONSE_MESSAGE, // 60
128 CIM_PROCESS_INDICATION_RESPONSE_MESSAGE,
129 CIM_NOTIFY_PROVIDER_REGISTRATION_RESPONSE_MESSAGE,
130 CIM_NOTIFY_PROVIDER_TERMINATION_RESPONSE_MESSAGE,
131 CIM_HANDLE_INDICATION_RESPONSE_MESSAGE,
132 CIM_CREATE_SUBSCRIPTION_RESPONSE_MESSAGE,
133 CIM_MODIFY_SUBSCRIPTION_RESPONSE_MESSAGE,
134 CIM_DELETE_SUBSCRIPTION_RESPONSE_MESSAGE,
135 CIM_DISABLE_MODULE_RESPONSE_MESSAGE,
136 CIM_ENABLE_MODULE_RESPONSE_MESSAGE,
137 CIM_STOP_ALL_PROVIDERS_RESPONSE_MESSAGE, // 70
138
|
139 karl 1.102.2.2 // EXP_PULL_BEGIN
|
140 karl 1.102.2.1 // CIM Pull Operations
141
|
142 karl 1.102.2.3 CIM_OPEN_ENUMERATE_INSTANCES_REQUEST_MESSAGE, //71
|
143 karl 1.102.2.1 CIM_OPEN_ENUMERATE_INSTANCE_PATHS_REQUEST_MESSAGE,
144 CIM_OPEN_ASSOCIATOR_INSTANCES_REQUEST_MESSAGE,
145 CIM_OPEN_ASSOCIATOR_INSTANCE_PATHS_REQUEST_MESSAGE,
146 CIM_OPEN_REFERENCE_INSTANCES_REQUEST_MESSAGE,
147 CIM_OPEN_REFERENCE_INSTANCE_PATHS_REQUEST_MESSAGE,
148 CIM_OPEN_QUERY_INSTANCES_REQUEST_MESSAGE,
149 CIM_PULL_INSTANCES_WITH_PATH_REQUEST_MESSAGE,
150 CIM_PULL_INSTANCE_PATHS_REQUEST_MESSAGE,
|
151 karl 1.102.2.3 CIM_PULL_INSTANCES_REQUEST_MESSAGE, // 80
|
152 karl 1.102.2.1 CIM_CLOSE_ENUMERATION_REQUEST_MESSAGE,
153 CIM_ENUMERATION_COUNT_REQUEST_MESSAGE,
154 CIM_OPEN_ENUMERATE_INSTANCES_RESPONSE_MESSAGE,
155 CIM_OPEN_ENUMERATE_INSTANCE_PATHS_RESPONSE_MESSAGE,
156 CIM_OPEN_ASSOCIATOR_INSTANCES_RESPONSE_MESSAGE,
157 CIM_OPEN_ASSOCIATOR_INSTANCE_PATHS_RESPONSE_MESSAGE,
158 CIM_OPEN_REFERENCE_INSTANCES_RESPONSE_MESSAGE,
159 CIM_OPEN_REFERENCE_INSTANCE_PATHS_RESPONSE_MESSAGE,
160 CIM_OPEN_QUERY_INSTANCES_RESPONSE_MESSAGE,
|
161 karl 1.102.2.3 CIM_PULL_INSTANCES_WITH_PATH_RESPONSE_MESSAGE, // 90
|
162 karl 1.102.2.1 CIM_PULL_INSTANCE_PATHS_RESPONSE_MESSAGE,
163 CIM_PULL_INSTANCES_RESPONSE_MESSAGE,
164 CIM_CLOSE_ENUMERATION_RESPONSE_MESSAGE,
|
165 karl 1.102.2.3 CIM_ENUMERATION_COUNT_RESPONSE_MESSAGE, // 94
|
166 karl 1.102.2.2 // EXP_PULL_END
|
167 karl 1.102.2.1
|
168 kumpf 1.90 // Monitor-related messages:
169
170 SOCKET_MESSAGE,
171
172 // Connection-oriented messages:
173
174 CLOSE_CONNECTION_MESSAGE,
175
176 // HTTP messages:
177
178 HTTP_MESSAGE,
179 HTTP_ERROR_MESSAGE,
180
181 // Exception messages to be passed to a CIM client application:
182
183 CLIENT_EXCEPTION_MESSAGE,
184
|
185 karl 1.102.2.3 ASYNC_IOCLOSE, // 100
|
186 venkat.puvvada 1.97 ASYNC_CIMSERVICE_START,
|
187 kumpf 1.90 ASYNC_CIMSERVICE_STOP,
188
189 ASYNC_ASYNC_OP_START,
|
190 karl 1.102.2.3 ASYNC_ASYNC_OP_RESULT, // 105
|
191 kumpf 1.90 ASYNC_ASYNC_LEGACY_OP_START,
192 ASYNC_ASYNC_LEGACY_OP_RESULT,
193
194 ASYNC_ASYNC_MODULE_OP_START,
195 ASYNC_ASYNC_MODULE_OP_RESULT,
196
|
197 karl 1.102.2.3 CIM_NOTIFY_PROVIDER_ENABLE_REQUEST_MESSAGE, //110
|
198 kumpf 1.90 CIM_NOTIFY_PROVIDER_ENABLE_RESPONSE_MESSAGE,
199
|
200 venkat.puvvada 1.97 CIM_NOTIFY_PROVIDER_FAIL_REQUEST_MESSAGE,
|
201 kumpf 1.90 CIM_NOTIFY_PROVIDER_FAIL_RESPONSE_MESSAGE,
202
203 CIM_INITIALIZE_PROVIDER_AGENT_REQUEST_MESSAGE,
|
204 karl 1.102.2.3 CIM_INITIALIZE_PROVIDER_AGENT_RESPONSE_MESSAGE, // 115
|
205 kumpf 1.90
206 CIM_NOTIFY_CONFIG_CHANGE_REQUEST_MESSAGE,
207 CIM_NOTIFY_CONFIG_CHANGE_RESPONSE_MESSAGE,
208
209 CIM_SUBSCRIPTION_INIT_COMPLETE_REQUEST_MESSAGE,
210 CIM_SUBSCRIPTION_INIT_COMPLETE_RESPONSE_MESSAGE,
211
|
212 karl 1.102.2.3 CIM_INDICATION_SERVICE_DISABLED_REQUEST_MESSAGE, // 120
|
213 venkat.puvvada 1.100 CIM_INDICATION_SERVICE_DISABLED_RESPONSE_MESSAGE,
214
|
215 thilo.boehm 1.101 PROVAGT_GET_SCMOCLASS_REQUEST_MESSAGE,
216 PROVAGT_GET_SCMOCLASS_RESPONSE_MESSAGE,
217
|
218 venkat.puvvada 1.102 CIM_NOTIFY_SUBSCRIPTION_NOT_ACTIVE_REQUEST_MESSAGE,
219 CIM_NOTIFY_SUBSCRIPTION_NOT_ACTIVE_RESPONSE_MESSAGE,
220
221 CIM_NOTIFY_LISTENER_NOT_ACTIVE_REQUEST_MESSAGE,
222 CIM_NOTIFY_LISTENER_NOT_ACTIVE_RESPONSE_MESSAGE,
|
223 karl 1.102.2.3
|
224 karl 1.102.2.4 WSMAN_EXPORT_INDICATION_REQUEST_MESSAGE,
225 WSMAN_EXPORT_INDICATION_RESPONSE_MESSAGE,
226
|
227 kumpf 1.90 NUMBER_OF_MESSAGES
228 };
229
230 PEGASUS_COMMON_LINKAGE const char* MessageTypeToString(MessageType messageType);
231
232
|
233 chip 1.24 /** The Message class and derived classes are used to pass messages between
|
234 mike 1.4 modules. Messages are passed between modules using the message queues
235 (see MessageQueue class). Derived classes may add their own fields.
|
236 kumpf 1.78 This base class defines a common type field, which is the type of
237 the message.
|
238 mike 1.4 */
|
239 mike 1.76 class PEGASUS_COMMON_LINKAGE Message : public Linkable
|
240 mike 1.4 {
|
241 kumpf 1.86 public:
242
243 Message(
|
244 kumpf 1.90 MessageType type,
|
245 kumpf 1.86 Uint32 destination = 0,
|
246 venkat.puvvada 1.89 Uint32 mask = 0)
|
247 kumpf 1.86 :
|
248 kumpf 1.94 dest(destination),
|
249 kumpf 1.86 _type(type),
250 _mask(mask),
|
251 kumpf 1.94 _httpMethod(HTTP_METHOD__POST),
252 _httpCloseConnect(false),
|
253 kumpf 1.86 _isComplete(true),
|
254 kumpf 1.94 _index(0),
255 _async(0)
|
256 kumpf 1.86 {
257 }
|
258 mike 1.4
|
259 kumpf 1.86 virtual ~Message();
|
260 chip 1.24
|
261 kumpf 1.86 // NOTE: The compiler default implementation of the copy constructor
262 // is used for this class.
263
|
264 kumpf 1.94 Boolean getCloseConnect() const { return _httpCloseConnect; }
265 void setCloseConnect(Boolean httpCloseConnect)
|
266 kumpf 1.86 {
|
267 kumpf 1.94 _httpCloseConnect = httpCloseConnect;
|
268 kumpf 1.86 }
|
269 chip 1.24
|
270 kumpf 1.90 MessageType getType() const { return _type; }
|
271 kumpf 1.40
|
272 kumpf 1.86 Uint32 getMask() const { return _mask; }
273
274 void setMask(Uint32 mask) { _mask = mask; }
275
276 HttpMethod getHttpMethod() const { return _httpMethod; }
277
278 void setHttpMethod(HttpMethod httpMethod) {_httpMethod = httpMethod;}
|
279 kumpf 1.40
|
280 kumpf 1.90 static CIMOperationType convertMessageTypetoCIMOpType(MessageType type);
|
281 w.white 1.63
|
282 karl 1.102.2.3
|
283 kumpf 1.86 virtual void print(
284 PEGASUS_STD(ostream)& os,
285 Boolean printHeader = true) const;
|
286 karl 1.102.2.3
|
287 mike 1.4
|
288 kumpf 1.86 Message* get_async()
289 {
290 Message *ret = _async;
291 _async = 0;
292 return ret;
293 }
294
295 void put_async(Message* msg)
296 {
297 _async = msg;
298 }
299
300 // set the message index indicating what piece (or sequence) this is
301 // message indexes start at zero
302 void setIndex(Uint32 index) { _index = index; }
303
|
304 kumpf 1.94 // get the message index (or sequence number)
305 Uint32 getIndex() const { return _index; }
|
306 kumpf 1.86
|
307 kumpf 1.94 // is this the first piece of the message ?
308 Boolean isFirst() const { return _index == 0; }
309
310 // set the complete flag indicating whether this message piece is the last
|
311 kumpf 1.86 void setComplete(Boolean isComplete)
312 {
|
313 kumpf 1.94 _isComplete = isComplete;
|
314 kumpf 1.86 }
315
316 // is this message complete? (i.e the last in a one or more sequence)
317 Boolean isComplete() const { return _isComplete; }
318
|
319 kumpf 1.94 Uint32 dest;
320
|
321 kumpf 1.86 private:
|
322 kumpf 1.94
323 Message& operator=(const Message& msg);
324
|
325 kumpf 1.90 MessageType _type;
|
326 kumpf 1.86 Uint32 _mask;
|
327 kumpf 1.94
|
328 kumpf 1.86 HttpMethod _httpMethod;
|
329 kumpf 1.94 Boolean _httpCloseConnect;
|
330 kumpf 1.86
|
331 kumpf 1.94 Boolean _isComplete;
332 Uint32 _index;
|
333 kumpf 1.86
|
334 kumpf 1.92 Message* _async;
|
335 mike 1.4 };
|
336 mike 1.5
|
337 mike 1.6
338 /** This class implements a stack of queue-ids. Many messages must keep a
339 stack of queue-ids of queues which they must be returned to. This provides
340 a light efficient stack for this purpose.
341 */
|
342 karl 1.60 class PEGASUS_COMMON_LINKAGE QueueIdStack
|
343 mike 1.6 {
344 public:
345
|
346 chip 1.24 QueueIdStack() : _size(0)
347 {
|
348 mike 1.6 }
349
|
350 karl 1.59 QueueIdStack(const QueueIdStack& x);
|
351 mike 1.6
|
352 kumpf 1.88 explicit QueueIdStack(Uint32 x);
|
353 mike 1.6
|
354 kumpf 1.88 explicit QueueIdStack(Uint32 x1, Uint32 x2);
|
355 mike 1.6
|
356 chip 1.24 ~QueueIdStack()
357 {
|
358 mike 1.6 }
359
|
360 karl 1.59 QueueIdStack& operator=(const QueueIdStack& x);
|
361 mike 1.6
|
362 chip 1.24 Uint32 size() const
363 {
|
364 kumpf 1.86 return _size;
|
365 mike 1.6 }
366
|
367 chip 1.24 Boolean isEmpty() const
368 {
|
369 kumpf 1.86 return _size == 0;
|
370 mike 1.6 }
371
|
372 chip 1.24 void push(Uint32 x)
|
373 mike 1.6 {
|
374 karl 1.59 #ifdef PEGASUS_DEBUG
|
375 kumpf 1.86 if (_size == MAX_SIZE)
376 throw StackOverflow();
|
377 karl 1.59 #endif
|
378 kumpf 1.86 _items[_size++] = x;
|
379 mike 1.6 }
380
381 Uint32& top()
382 {
|
383 karl 1.59 #ifdef PEGASUS_DEBUG
|
384 kumpf 1.86 if (_size == 0)
385 throw StackUnderflow();
|
386 karl 1.59 #endif
|
387 kumpf 1.86 return _items[_size-1];
|
388 mike 1.6 }
389
|
390 chip 1.24 Uint32 top() const
|
391 mike 1.6 {
|
392 kumpf 1.86 return ((QueueIdStack*)this)->top();
|
393 mike 1.6 }
394
|
395 chip 1.24 void pop()
|
396 mike 1.6 {
|
397 karl 1.59 #ifdef PEGASUS_DEBUG
|
398 kumpf 1.86 if (_size == 0)
399 throw StackUnderflow();
|
400 karl 1.59 #endif
|
401 kumpf 1.86 _size--;
|
402 mike 1.6 }
403
404 /** Make a copy of this stack and then pop the top element. */
|
405 karl 1.59 QueueIdStack copyAndPop() const;
|
406 mike 1.6
|
407 mike 1.96 Uint32 operator[](Uint32 i) const { return _items[i]; }
408
|
409 mike 1.6 private:
410
411 // Copy the given stack but then pop the top element:
|
412 karl 1.59 QueueIdStack(const QueueIdStack& x, int);
|
413 mike 1.6
414 enum { MAX_SIZE = 5 };
415 Uint32 _items[MAX_SIZE];
416 Uint32 _size;
417 };
|
418 mike 1.4
419 PEGASUS_NAMESPACE_END
420
421 #endif /* Pegasus_Message_h */
|