(file) Return to CIMOperationResponseEncoder.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Server

  1 karl  1.65 //%2006////////////////////////////////////////////////////////////////////////
  2 mike  1.2  //
  3 karl  1.51 // 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.39 // IBM Corp.; EMC Corporation, The Open Group.
  7 karl  1.51 // 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.55 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 10            // EMC Corporation; VERITAS Software Corporation; The Open Group.
 11 karl  1.65 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 12            // EMC Corporation; Symantec Corporation; The Open Group.
 13 mike  1.2  //
 14            // Permission is hereby granted, free of charge, to any person obtaining a copy
 15 kumpf 1.27 // 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.2  // 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            // 
 21 kumpf 1.27 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 22 mike  1.2  // 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 kumpf 1.27 // 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.2  // 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            #include <Pegasus/Common/Config.h>
 35 kumpf 1.13 #include <Pegasus/Common/Constants.h>
 36 mike  1.2  #include <cctype>
 37            #include <cstdio>
 38 brian.campbell 1.52 #include <Pegasus/Common/HTTPConnection.h>
 39 mike           1.2  #include <Pegasus/Common/XmlParser.h>
 40                     #include <Pegasus/Common/XmlReader.h>
 41                     #include <Pegasus/Common/XmlWriter.h>
 42                     #include <Pegasus/Common/HTTPMessage.h>
 43                     #include <Pegasus/Common/Logger.h>
 44                     #include <Pegasus/Common/Tracer.h>
 45 sage           1.19 #include <Pegasus/Common/StatisticalData.h>
 46 a.arora        1.42 #include <Pegasus/Common/AutoPtr.h>
 47 kumpf          1.69 #include <Pegasus/Common/MessageLoader.h>
 48 mike           1.2  #include "CIMOperationResponseEncoder.h"
 49                     
 50                     PEGASUS_USING_STD;
 51                     
 52                     PEGASUS_NAMESPACE_BEGIN
 53                     
 54 kumpf          1.69 const String CIMOperationResponseEncoder::OUT_OF_MEMORY_MESSAGE =
 55                         "A System error has occurred. Please retry the CIM Operation at a "
 56                             "later time.";
 57 kumpf          1.31 
 58 mike           1.2  CIMOperationResponseEncoder::CIMOperationResponseEncoder()
 59 kumpf          1.69     : Base(PEGASUS_QUEUENAME_OPRESPENCODER)
 60 mike           1.2  {
 61                     }
 62                     
 63                     CIMOperationResponseEncoder::~CIMOperationResponseEncoder()
 64                     {
 65                     }
 66                     
 67 kumpf          1.69 void CIMOperationResponseEncoder::sendResponse(
 68                         CIMResponseMessage* response,
 69                         const String& name,
 70                         Boolean isImplicit,
 71                         Buffer* bodygiven)
 72                     {
 73                         static String funcname = "CIMOperationResponseEncoder::sendResponse: ";
 74                         static String funcnameClassS = String(funcname + "for class " + name);
 75                         static CString funcnameClass = funcnameClassS.getCString();
 76                         PEG_METHOD_ENTER(TRC_DISPATCHER, funcnameClass);
 77                     
 78                         if (! response)
 79                         {
 80                             PEG_METHOD_EXIT();
 81                             return;
 82                         }
 83                     
 84                         Uint32 queueId = response->queueIds.top();
 85                         response->queueIds.pop();
 86                     
 87                         Boolean closeConnect = response->getCloseConnect();
 88 marek          1.73     PEG_TRACE((
 89 kumpf          1.69         TRC_HTTP,
 90 mike           1.77.4.1         Tracer::LEVEL4,
 91 kumpf          1.69             "CIMOperationResponseEncoder::sendResponse()- "
 92                                     "response->getCloseConnect() returned %d",
 93 marek          1.73             closeConnect));
 94 kumpf          1.69     
 95                             MessageQueue* queue = MessageQueue::lookup(queueId);
 96                         
 97                             if (!queue)
 98                             {
 99 mike           1.77.4.1         PEG_TRACE((TRC_DISCARDED_DATA, Tracer::LEVEL1,
100 marek          1.73                 "ERROR: non-existent queueId = %u, response not sent.", queueId));
101 kumpf          1.69             PEG_METHOD_EXIT();
102                                 return;
103                             }
104                         
105                             HTTPConnection* httpQueue = dynamic_cast<HTTPConnection*>(queue);
106                         
107                             if (! httpQueue)
108                             {
109 mike           1.77.4.1         PEG_TRACE((TRC_DISCARDED_DATA, Tracer::LEVEL1,
110 kumpf          1.69                 "ERROR: Unknown queue type. queueId = %u, response not sent.",
111 marek          1.73                 queueId));
112 kumpf          1.69             PEG_METHOD_EXIT();
113                                 return;
114                             }
115                         
116                             Boolean isChunkRequest = httpQueue->isChunkRequested();
117                             HttpMethod httpMethod = response->getHttpMethod();
118                             String& messageId = response->messageId;
119                             CIMException& cimException = response->cimException;
120                             Buffer message;
121                         
122                             // Note: the language is ALWAYS passed empty to the xml formatters because
123                             // it is HTTPConnection that needs to make the decision of whether to add
124                             // the languages to the HTTP message.
125                             ContentLanguageList contentLanguage;
126                         
127                             CIMName cimName(name);
128                             Uint32 messageIndex = response->getIndex();
129                             Boolean isFirst = messageIndex == 0 ? true : false;
130                             Boolean isLast = response->isComplete();
131                             Buffer bodylocal;
132                             Buffer& body = bodygiven ? *bodygiven : bodylocal;
133 brian.campbell 1.52     
134 kumpf          1.66         // STAT_SERVEREND sets the getTotalServerTime() value in the message class
135                             STAT_SERVEREND
136                         
137 denise.eckstein 1.68     #ifndef PEGASUS_DISABLE_PERFINST
138 kumpf           1.66         Uint64 serverTime = response->getTotalServerTime();
139 denise.eckstein 1.68     #else
140                              Uint64 serverTime = 0;
141                          #endif
142 w.white         1.56     
143 kumpf           1.69         Buffer (*formatResponse)(
144                                  const CIMName& iMethodName,
145                                  const String& messageId,
146                                  HttpMethod httpMethod,
147                                  const ContentLanguageList& httpContentLanguages,
148                                  const Buffer& body,
149                                  Uint64 serverResponseTime,
150                                  Boolean isFirst,
151                                  Boolean isLast);
152                          
153                              Buffer (*formatError)(
154                                  const CIMName& methodName,
155                                  const String& messageId,
156                                  HttpMethod httpMethod,
157                                  const CIMException& cimException);
158                          
159                              if (isImplicit == false)
160                              {
161                                  formatResponse = XmlWriter::formatSimpleMethodRspMessage;
162                                  formatError = XmlWriter::formatSimpleMethodErrorRspMessage;
163                              }
164 kumpf           1.69         else
165                              {
166                                  formatResponse = XmlWriter::formatSimpleIMethodRspMessage;
167                                  formatError = XmlWriter::formatSimpleIMethodErrorRspMessage;
168                              }
169                          
170                              if (cimException.getCode() != CIM_ERR_SUCCESS)
171                              {
172                                  STAT_SERVEREND_ERROR
173                          
174                                  // only process the FIRST error
175                                  if (httpQueue->cimException.getCode() == CIM_ERR_SUCCESS)
176                                  {
177                                      // NOTE: even if this error occurs in the middle, HTTPConnection
178                                      // will flush the entire queued message and reformat.
179                                      if (isChunkRequest == false)
180                                          message =
181                                              formatError(name, messageId, httpMethod, cimException);
182                          
183                                      // uri encode the error (for the http header) only when it is
184                                      // non-chunking or the first error with chunking
185 kumpf           1.69                 if (isChunkRequest == false ||
186                                          (isChunkRequest == true && isFirst == true))
187                                      {
188                                          String msg =
189                                              TraceableCIMException(cimException).getDescription();
190                                          String uriEncodedMsg = XmlWriter::encodeURICharacters(msg);
191                                          CIMException cimExceptionUri(
192                                              cimException.getCode(), uriEncodedMsg);
193                                          cimExceptionUri.setContentLanguages(
194                                              cimException.getContentLanguages());
195                                          cimException = cimExceptionUri;
196                                      }
197                                  } // if first error in response stream
198                          
199                                  // never put the error in chunked response (because it will end up in
200                                  // the trailer), so just use the non-error response formatter to send
201                                  // more data
202                          
203                                  if (isChunkRequest == true)
204                                  {
205                                      message = formatResponse(
206 kumpf           1.69                     cimName,
207                                          messageId,
208                                          httpMethod,
209                                          contentLanguage,
210                                          body,
211                                          serverTime,
212                                          isFirst,
213                                          isLast);
214                                  }
215                              }
216                              else
217                              {
218                                  // else non-error condition
219                                  try
220                                  {
221                                      message = formatResponse(
222                                          cimName,
223                                          messageId,
224                                          httpMethod,
225                                          contentLanguage,
226                                          body,
227 kumpf           1.69                     serverTime,
228                                          isFirst,
229                                          isLast);
230                                  }
231 a.dunfey        1.72     #if defined(PEGASUS_OS_TYPE_WINDOWS)
232 kumpf           1.69             catch (std::bad_alloc&)
233 brian.campbell  1.52     #else
234 kumpf           1.69             catch (bad_alloc&)
235 brian.campbell  1.52     #endif
236 kumpf           1.69             {
237 marek           1.77                 Logger::put(
238                                          Logger::ERROR_LOG,
239                                          System::CIMSERVER,
240                                          Logger::WARNING,
241 kumpf           1.69                     funcname + OUT_OF_MEMORY_MESSAGE);
242                          
243                                      cimException = PEGASUS_CIM_EXCEPTION_L(
244                                          CIM_ERR_FAILED, MessageLoaderParms(
245                                              "Server.CIMOperationResponseEncoder.OUT_OF_MEMORY",
246                                              OUT_OF_MEMORY_MESSAGE));
247                          
248                                      // try again with new error and no body
249                                      body.clear();
250                                      sendResponse(response, name, isImplicit);
251 marek           1.74                 PEG_METHOD_EXIT();
252 kumpf           1.69                 return;
253                                  }
254                          
255                                  STAT_BYTESSENT
256                              }
257                          
258                              AutoPtr<HTTPMessage> httpMessage(
259                                  new HTTPMessage(message, 0, &cimException));
260                              httpMessage->setComplete(isLast);
261                              httpMessage->setIndex(messageIndex);
262                          
263                              if (cimException.getCode() != CIM_ERR_SUCCESS)
264                              {
265                                  httpMessage->contentLanguages = cimException.getContentLanguages();
266                              }
267                              else
268                              {
269                                  const OperationContext::Container& container =
270                                      response->operationContext.get(ContentLanguageListContainer::NAME);
271                                  const ContentLanguageListContainer& listContainer =
272                                      *dynamic_cast<const ContentLanguageListContainer*>(&container);
273 kumpf           1.69             contentLanguage = listContainer.getLanguages();
274                                  httpMessage->contentLanguages = contentLanguage;
275                              }
276                          
277                              httpMessage->setCloseConnect(closeConnect);
278                              queue->enqueue(httpMessage.release());
279                          
280                              PEG_METHOD_EXIT();
281 mday            1.9      }
282                          
283 kumpf           1.69     void CIMOperationResponseEncoder::enqueue(Message* message)
284 kumpf           1.67     {
285                              handleEnqueue(message);
286                          }
287                          
288 kumpf           1.69     void CIMOperationResponseEncoder::handleEnqueue(Message* message)
289 mday            1.9      {
290 kumpf           1.69         PEG_METHOD_ENTER(TRC_DISPATCHER,
291                                  "CIMOperationResponseEncoder::handleEnqueue()");
292                          
293                              if (!message)
294                              {
295                                  PEG_METHOD_EXIT();
296                                  return;
297                              }
298                          
299 kumpf           1.76         CIMResponseMessage* response = dynamic_cast<CIMResponseMessage*>(message);
300                              PEGASUS_ASSERT(response);
301                          
302                              response->updateThreadLanguages();
303 dave.sudlik     1.70     
304 marek           1.73         PEG_TRACE((
305 kumpf           1.69             TRC_HTTP,
306 mike            1.77.4.1         Tracer::LEVEL4,
307 kumpf           1.69             "CIMOperationResponseEncoder::handleEnque()- "
308                                      "message->getCloseConnect() returned %d",
309 marek           1.73             message->getCloseConnect()));
310 kumpf           1.69     
311                              switch (message->getType())
312                              {
313                                  case CIM_GET_CLASS_RESPONSE_MESSAGE:
314                                      encodeGetClassResponse(
315                                          (CIMGetClassResponseMessage*)message);
316                                      break;
317                          
318                                  case CIM_GET_INSTANCE_RESPONSE_MESSAGE:
319                                      encodeGetInstanceResponse(
320                                          (CIMGetInstanceResponseMessage*)message);
321                                      break;
322                          
323                                  case CIM_DELETE_CLASS_RESPONSE_MESSAGE:
324                                      encodeDeleteClassResponse(
325                                          (CIMDeleteClassResponseMessage*)message);
326                                      break;
327                          
328                                  case CIM_DELETE_INSTANCE_RESPONSE_MESSAGE:
329                                      encodeDeleteInstanceResponse(
330                                          (CIMDeleteInstanceResponseMessage*)message);
331 kumpf           1.69                 break;
332                          
333                                  case CIM_CREATE_CLASS_RESPONSE_MESSAGE:
334                                      encodeCreateClassResponse(
335                                          (CIMCreateClassResponseMessage*)message);
336                                      break;
337                          
338                                  case CIM_CREATE_INSTANCE_RESPONSE_MESSAGE:
339                                      encodeCreateInstanceResponse(
340                                          (CIMCreateInstanceResponseMessage*)message);
341                                      break;
342                          
343                                  case CIM_MODIFY_CLASS_RESPONSE_MESSAGE:
344                                      encodeModifyClassResponse(
345                                          (CIMModifyClassResponseMessage*)message);
346                                      break;
347                          
348                                  case CIM_MODIFY_INSTANCE_RESPONSE_MESSAGE:
349                                      encodeModifyInstanceResponse(
350                                          (CIMModifyInstanceResponseMessage*)message);
351                                      break;
352 kumpf           1.69     
353                                  case CIM_ENUMERATE_CLASSES_RESPONSE_MESSAGE:
354                                      encodeEnumerateClassesResponse(
355                                          (CIMEnumerateClassesResponseMessage*)message);
356                                      break;
357                          
358                                  case CIM_ENUMERATE_CLASS_NAMES_RESPONSE_MESSAGE:
359                                      encodeEnumerateClassNamesResponse(
360                                          (CIMEnumerateClassNamesResponseMessage*)message);
361                                      break;
362                          
363                                  case CIM_ENUMERATE_INSTANCES_RESPONSE_MESSAGE:
364                                      encodeEnumerateInstancesResponse(
365                                          (CIMEnumerateInstancesResponseMessage*)message);
366                                      break;
367                          
368                                  case CIM_ENUMERATE_INSTANCE_NAMES_RESPONSE_MESSAGE:
369                                      encodeEnumerateInstanceNamesResponse(
370                                          (CIMEnumerateInstanceNamesResponseMessage*)message);
371                                      break;
372                          
373 kumpf           1.69             case CIM_EXEC_QUERY_RESPONSE_MESSAGE:
374                                      encodeExecQueryResponse(
375                                          (CIMExecQueryResponseMessage*)message);
376                                      break;
377                          
378                                  case CIM_ASSOCIATORS_RESPONSE_MESSAGE:
379                                      encodeAssociatorsResponse(
380                                          (CIMAssociatorsResponseMessage*)message);
381                                      break;
382                          
383                                  case CIM_ASSOCIATOR_NAMES_RESPONSE_MESSAGE:
384                                      encodeAssociatorNamesResponse(
385                                          (CIMAssociatorNamesResponseMessage*)message);
386                                      break;
387                          
388                                  case CIM_REFERENCES_RESPONSE_MESSAGE:
389                                      encodeReferencesResponse(
390                                          (CIMReferencesResponseMessage*)message);
391                                      break;
392                          
393                                  case CIM_REFERENCE_NAMES_RESPONSE_MESSAGE:
394 kumpf           1.69                 encodeReferenceNamesResponse(
395                                          (CIMReferenceNamesResponseMessage*)message);
396                                      break;
397                          
398                                  case CIM_GET_PROPERTY_RESPONSE_MESSAGE:
399                                      encodeGetPropertyResponse(
400                                          (CIMGetPropertyResponseMessage*)message);
401                                      break;
402                          
403                                  case CIM_SET_PROPERTY_RESPONSE_MESSAGE:
404                                      encodeSetPropertyResponse(
405                                          (CIMSetPropertyResponseMessage*)message);
406                                      break;
407                          
408                                  case CIM_GET_QUALIFIER_RESPONSE_MESSAGE:
409                                      encodeGetQualifierResponse(
410                                          (CIMGetQualifierResponseMessage*)message);
411                                      break;
412                          
413                                  case CIM_SET_QUALIFIER_RESPONSE_MESSAGE:
414                                      encodeSetQualifierResponse(
415 kumpf           1.69                     (CIMSetQualifierResponseMessage*)message);
416                                      break;
417                          
418                                  case CIM_DELETE_QUALIFIER_RESPONSE_MESSAGE:
419                                      encodeDeleteQualifierResponse(
420                                          (CIMDeleteQualifierResponseMessage*)message);
421                                      break;
422                          
423                                  case CIM_ENUMERATE_QUALIFIERS_RESPONSE_MESSAGE:
424                                      encodeEnumerateQualifiersResponse(
425                                          (CIMEnumerateQualifiersResponseMessage*)message);
426                                      break;
427                          
428                                  case CIM_INVOKE_METHOD_RESPONSE_MESSAGE:
429                                      encodeInvokeMethodResponse(
430                                          (CIMInvokeMethodResponseMessage*)message);
431                                      break;
432 kumpf           1.75     
433                                  default:
434                                      // Unexpected message type
435                                      PEGASUS_ASSERT(0);
436                                      break;
437 kumpf           1.69         }
438                          
439                              delete message;
440 kumpf           1.14     
441 kumpf           1.69         PEG_METHOD_EXIT();
442                              return;
443 mday            1.9      }
444 mday            1.8      
445 mike            1.2      void CIMOperationResponseEncoder::handleEnqueue()
446                          {
447 kumpf           1.69         Message* message = dequeue();
448                              if (message)
449                                  handleEnqueue(message);
450 mike            1.2      }
451                          
452                          void CIMOperationResponseEncoder::encodeCreateClassResponse(
453 kumpf           1.69         CIMCreateClassResponseMessage* response)
454 mike            1.2      {
455 kumpf           1.69         sendResponse(response, "CreateClass", true);
456 mike            1.2      }
457                          
458                          void CIMOperationResponseEncoder::encodeGetClassResponse(
459 kumpf           1.69         CIMGetClassResponseMessage* response)
460 mike            1.2      {
461 kumpf           1.69         Buffer body;
462                              if (response->cimException.getCode() == CIM_ERR_SUCCESS)
463                                  XmlWriter::appendClassElement(body, response->cimClass);
464                              sendResponse(response, "GetClass", true, &body);
465 mike            1.2      }
466                          
467                          void CIMOperationResponseEncoder::encodeModifyClassResponse(
468 kumpf           1.69         CIMModifyClassResponseMessage* response)
469 mike            1.2      {
470 kumpf           1.69         sendResponse(response, "ModifyClass", true);
471 mike            1.2      }
472                          
473                          void CIMOperationResponseEncoder::encodeEnumerateClassNamesResponse(
474 kumpf           1.69         CIMEnumerateClassNamesResponseMessage* response)
475 mike            1.2      {
476 kumpf           1.69         Buffer body;
477                              if (response->cimException.getCode() == CIM_ERR_SUCCESS)
478                                  for (Uint32 i = 0, n = response->classNames.size(); i < n; i++)
479                                      XmlWriter::appendClassNameElement(body, response->classNames[i]);
480                              sendResponse(response, "EnumerateClassNames", true, &body);
481 mike            1.2      }
482                          
483                          void CIMOperationResponseEncoder::encodeEnumerateClassesResponse(
484 kumpf           1.69         CIMEnumerateClassesResponseMessage* response)
485 mike            1.2      {
486 kumpf           1.69         Buffer body;
487                              if (response->cimException.getCode() == CIM_ERR_SUCCESS)
488                                  for (Uint32 i = 0, n= response->cimClasses.size(); i < n; i++)
489                                      XmlWriter::appendClassElement(body, response->cimClasses[i]);
490                              sendResponse(response, "EnumerateClasses", true, &body);
491 mike            1.2      }
492                          
493                          void CIMOperationResponseEncoder::encodeDeleteClassResponse(
494 kumpf           1.69         CIMDeleteClassResponseMessage* response)
495 mike            1.2      {
496 kumpf           1.69         sendResponse(response, "DeleteClass", true);
497 mike            1.2      }
498                          
499                          void CIMOperationResponseEncoder::encodeCreateInstanceResponse(
500 kumpf           1.69         CIMCreateInstanceResponseMessage* response)
501 mike            1.2      {
502 kumpf           1.69         Buffer body;
503                              if (response->cimException.getCode() == CIM_ERR_SUCCESS)
504                                  XmlWriter::appendInstanceNameElement(body, response->instanceName);
505                              sendResponse(response, "CreateInstance", true, &body);
506 mike            1.2      }
507                          
508                          void CIMOperationResponseEncoder::encodeGetInstanceResponse(
509 kumpf           1.69         CIMGetInstanceResponseMessage* response)
510 mike            1.2      {
511 kumpf           1.69         Buffer body;
512                              if (response->cimException.getCode() == CIM_ERR_SUCCESS)
513                                  XmlWriter::appendInstanceElement(body, response->cimInstance);
514                              sendResponse(response, "GetInstance", true, &body);
515 mike            1.2      }
516                          
517                          void CIMOperationResponseEncoder::encodeModifyInstanceResponse(
518 kumpf           1.69         CIMModifyInstanceResponseMessage* response)
519 mike            1.2      {
520 kumpf           1.69         sendResponse(response, "ModifyInstance", true);
521 mike            1.2      }
522                          
523                          void CIMOperationResponseEncoder::encodeEnumerateInstancesResponse(
524 kumpf           1.69         CIMEnumerateInstancesResponseMessage* response)
525 mike            1.2      {
526 kumpf           1.69         Buffer body;
527                              if (response->cimException.getCode() == CIM_ERR_SUCCESS)
528                                  for (Uint32 i = 0, n = response->cimNamedInstances.size(); i < n; i++)
529                                      XmlWriter::appendValueNamedInstanceElement(
530                                          body, response->cimNamedInstances[i]);
531                              sendResponse(response, "EnumerateInstances", true, &body);
532 mike            1.2      }
533                          
534                          void CIMOperationResponseEncoder::encodeEnumerateInstanceNamesResponse(
535 kumpf           1.69         CIMEnumerateInstanceNamesResponseMessage* response)
536 mike            1.2      {
537 kumpf           1.69         Buffer body;
538                              if (response->cimException.getCode() == CIM_ERR_SUCCESS)
539                                  for (Uint32 i = 0, n = response->instanceNames.size(); i < n; i++)
540                                      XmlWriter::appendInstanceNameElement(
541                                          body, response->instanceNames[i]);
542                              sendResponse(response, "EnumerateInstanceNames", true, &body);
543 mike            1.2      }
544                          
545                          void CIMOperationResponseEncoder::encodeDeleteInstanceResponse(
546 kumpf           1.69         CIMDeleteInstanceResponseMessage* response)
547 mike            1.2      {
548 kumpf           1.69         sendResponse(response, "DeleteInstance", true);
549 mike            1.2      }
550                          
551                          void CIMOperationResponseEncoder::encodeGetPropertyResponse(
552 kumpf           1.69         CIMGetPropertyResponseMessage* response)
553 mike            1.2      {
554 kumpf           1.69         Buffer body;
555                              if (response->cimException.getCode() == CIM_ERR_SUCCESS)
556                                  XmlWriter::appendValueElement(body, response->value);
557                              sendResponse(response, "GetProperty", true, &body);
558 mike            1.2      }
559                          
560                          void CIMOperationResponseEncoder::encodeSetPropertyResponse(
561 kumpf           1.69         CIMSetPropertyResponseMessage* response)
562 mike            1.2      {
563 kumpf           1.69         sendResponse(response, "SetProperty", true);
564 mike            1.2      }
565                          
566                          void CIMOperationResponseEncoder::encodeSetQualifierResponse(
567 kumpf           1.69         CIMSetQualifierResponseMessage* response)
568 mike            1.2      {
569 kumpf           1.69         sendResponse(response, "SetQualifier", true);
570 mike            1.2      }
571                          
572                          void CIMOperationResponseEncoder::encodeGetQualifierResponse(
573 kumpf           1.69         CIMGetQualifierResponseMessage* response)
574 mike            1.2      {
575 kumpf           1.69         Buffer body;
576                              if (response->cimException.getCode() == CIM_ERR_SUCCESS)
577                                  XmlWriter::appendQualifierDeclElement(body, response->cimQualifierDecl);
578                              sendResponse(response, "GetQualifier", true, &body);
579 mike            1.2      }
580                          
581                          void CIMOperationResponseEncoder::encodeEnumerateQualifiersResponse(
582 kumpf           1.69         CIMEnumerateQualifiersResponseMessage* response)
583 mike            1.2      {
584 kumpf           1.69         Buffer body;
585                              if (response->cimException.getCode() == CIM_ERR_SUCCESS)
586                                  for (Uint32 i = 0, n = response->qualifierDeclarations.size();
587                                       i < n; i++)
588                                      XmlWriter::appendQualifierDeclElement(
589                                          body, response->qualifierDeclarations[i]);
590                              sendResponse(response, "EnumerateQualifiers", true, &body);
591 mike            1.2      }
592                          
593                          void CIMOperationResponseEncoder::encodeDeleteQualifierResponse(
594 kumpf           1.69         CIMDeleteQualifierResponseMessage* response)
595 mike            1.2      {
596 kumpf           1.69         sendResponse(response, "DeleteQualifier", true);
597 mike            1.2      }
598                          
599                          void CIMOperationResponseEncoder::encodeReferenceNamesResponse(
600 kumpf           1.69         CIMReferenceNamesResponseMessage* response)
601 mike            1.2      {
602 kumpf           1.69         Buffer body;
603                              if (response->cimException.getCode() == CIM_ERR_SUCCESS)
604                                  for (Uint32 i = 0, n = response->objectNames.size(); i < n; i++)
605                                  {
606                                      body << "<OBJECTPATH>\n";
607                                      XmlWriter::appendValueReferenceElement(
608                                          body, response->objectNames[i], false);
609                                      body << "</OBJECTPATH>\n";
610                                  }
611                              sendResponse(response, "ReferenceNames", true, &body);
612 mike            1.2      }
613                          
614                          void CIMOperationResponseEncoder::encodeReferencesResponse(
615 kumpf           1.69         CIMReferencesResponseMessage* response)
616 mike            1.2      {
617 kumpf           1.69         Buffer body;
618                              if (response->cimException.getCode() == CIM_ERR_SUCCESS)
619                                  for (Uint32 i = 0, n = response->cimObjects.size(); i < n;i++)
620                                      XmlWriter::appendValueObjectWithPathElement(
621                                          body, response->cimObjects[i]);
622                              sendResponse(response, "References", true, &body);
623 mike            1.2      }
624                          
625                          void CIMOperationResponseEncoder::encodeAssociatorNamesResponse(
626 kumpf           1.69         CIMAssociatorNamesResponseMessage* response)
627 mike            1.2      {
628 kumpf           1.69         Buffer body;
629                              if (response->cimException.getCode() == CIM_ERR_SUCCESS)
630                                  for (Uint32 i = 0, n = response->objectNames.size(); i < n; i++)
631                                  {
632                                      body << "<OBJECTPATH>\n";
633                                      XmlWriter::appendValueReferenceElement(
634                                          body, response->objectNames[i], false);
635                                      body << "</OBJECTPATH>\n";
636                                  }
637                              sendResponse(response, "AssociatorNames", true, &body);
638 mike            1.2      }
639                          
640                          void CIMOperationResponseEncoder::encodeAssociatorsResponse(
641 kumpf           1.69         CIMAssociatorsResponseMessage* response)
642 mike            1.2      {
643 kumpf           1.69         Buffer body;
644                              if (response->cimException.getCode() == CIM_ERR_SUCCESS)
645                                  for (Uint32 i = 0, n = response->cimObjects.size(); i < n; i++)
646                                      XmlWriter::appendValueObjectWithPathElement(
647                                          body, response->cimObjects[i]);
648                              sendResponse(response, "Associators", true, &body);
649 kumpf           1.14     }
650                          
651                          void CIMOperationResponseEncoder::encodeExecQueryResponse(
652 kumpf           1.69         CIMExecQueryResponseMessage* response)
653 kumpf           1.14     {
654 kumpf           1.69         Buffer body;
655                              if (response->cimException.getCode() == CIM_ERR_SUCCESS)
656                                  for (Uint32 i = 0; i < response->cimObjects.size(); i++)
657                                      XmlWriter::appendValueObjectWithPathElement(
658                                          body, response->cimObjects[i]);
659                              sendResponse(response, "ExecQuery", true, &body);
660 mike            1.2      }
661                          
662                          void CIMOperationResponseEncoder::encodeInvokeMethodResponse(
663 mday            1.26         CIMInvokeMethodResponseMessage* response)
664 mike            1.2      {
665 kumpf           1.69         Buffer body;
666 mday            1.9      
667 kumpf           1.69         // ATTN-RK-P3-20020219: Who's job is it to make sure the return value is
668                              // not an array?
669                              // Only add the return value if it is not null
670                          
671                              if (response->cimException.getCode() == CIM_ERR_SUCCESS)
672                              {
673                                  if (!response->retValue.isNull())
674                                      XmlWriter::appendReturnValueElement(body, response->retValue);
675                          
676                                  for (Uint32 i=0, n = response->outParameters.size(); i < n; i++)
677                                      XmlWriter::appendParamValueElement(
678                                          body, response->outParameters[i]);
679                              }
680                              sendResponse(response, response->methodName.getString(), false, &body);
681 mike            1.2      }
682                          
683                          PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2