(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 kumpf          1.69     Tracer::trace(
 89                             TRC_HTTP,
 90                             Tracer::LEVEL3,
 91                             "CIMOperationResponseEncoder::sendResponse()- "
 92                                 "response->getCloseConnect() returned %d",
 93                             closeConnect);
 94                     
 95                         MessageQueue* queue = MessageQueue::lookup(queueId);
 96                     
 97                         if (!queue)
 98                         {
 99                             Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,
100                                 "ERROR: non-existent queueId = %u, response not sent.", queueId);
101                             PEG_METHOD_EXIT();
102                             return;
103                         }
104                     
105                         HTTPConnection* httpQueue = dynamic_cast<HTTPConnection*>(queue);
106                     
107                         if (! httpQueue)
108                         {
109 kumpf          1.69         Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,
110                                 "ERROR: Unknown queue type. queueId = %u, response not sent.",
111                                 queueId);
112                             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 kumpf          1.69     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                                  Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
238                                      funcname + OUT_OF_MEMORY_MESSAGE);
239                      
240                                  cimException = PEGASUS_CIM_EXCEPTION_L(
241                                      CIM_ERR_FAILED, MessageLoaderParms(
242                                          "Server.CIMOperationResponseEncoder.OUT_OF_MEMORY",
243                                          OUT_OF_MEMORY_MESSAGE));
244                      
245                                  // try again with new error and no body
246                                  body.clear();
247                                  sendResponse(response, name, isImplicit);
248                                  return;
249                              }
250                      
251                              STAT_BYTESSENT
252                          }
253                      
254                          AutoPtr<HTTPMessage> httpMessage(
255                              new HTTPMessage(message, 0, &cimException));
256                          httpMessage->setComplete(isLast);
257 kumpf           1.69     httpMessage->setIndex(messageIndex);
258                      
259                          if (cimException.getCode() != CIM_ERR_SUCCESS)
260                          {
261                              httpMessage->contentLanguages = cimException.getContentLanguages();
262                          }
263                          else
264                          {
265                              const OperationContext::Container& container =
266                                  response->operationContext.get(ContentLanguageListContainer::NAME);
267                              const ContentLanguageListContainer& listContainer =
268                                  *dynamic_cast<const ContentLanguageListContainer*>(&container);
269                              contentLanguage = listContainer.getLanguages();
270                              httpMessage->contentLanguages = contentLanguage;
271                          }
272                      
273                      
274                          PEG_LOGGER_TRACE((
275                              Logger::STANDARD_LOG,
276                              System::CIMSERVER,
277                              Logger::TRACE,
278 kumpf           1.69         "CIMOperationResponseEncoder::sendResponse - QueueId: $0  "
279 j.alex          1.59             "XML content: $1",queueId,
280 kumpf           1.69         String(message.getData(), message.size())));
281                      
282                          httpMessage->setCloseConnect(closeConnect);
283                          queue->enqueue(httpMessage.release());
284                      
285                          PEG_METHOD_EXIT();
286 mday            1.9  }
287                      
288 kumpf           1.69 void CIMOperationResponseEncoder::enqueue(Message* message)
289 kumpf           1.67 {
290                          handleEnqueue(message);
291                      }
292                      
293 kumpf           1.69 void CIMOperationResponseEncoder::handleEnqueue(Message* message)
294 mday            1.9  {
295 kumpf           1.69     PEG_METHOD_ENTER(TRC_DISPATCHER,
296                              "CIMOperationResponseEncoder::handleEnqueue()");
297                      
298                          if (!message)
299                          {
300                              PEG_METHOD_EXIT();
301                              return;
302                          }
303                      
304 dave.sudlik     1.70     CIMResponseMessage* response = (CIMResponseMessage*)message;
305                          if (response->thread_changed())
306                          {
307                              AutoPtr<AcceptLanguageList> langs(new AcceptLanguageList((
308                                  (AcceptLanguageListContainer)response->operationContext.get(
309                                      AcceptLanguageListContainer::NAME)).getLanguages()));
310                              Thread::setLanguages(langs.release());
311                          }
312                      
313 kumpf           1.69     Tracer::trace(
314                              TRC_HTTP,
315                              Tracer::LEVEL3,
316                              "CIMOperationResponseEncoder::handleEnque()- "
317                                  "message->getCloseConnect() returned %d",
318                              message->getCloseConnect());
319                      
320                          switch (message->getType())
321                          {
322                              case CIM_GET_CLASS_RESPONSE_MESSAGE:
323                                  encodeGetClassResponse(
324                                      (CIMGetClassResponseMessage*)message);
325                                  break;
326                      
327                              case CIM_GET_INSTANCE_RESPONSE_MESSAGE:
328                                  encodeGetInstanceResponse(
329                                      (CIMGetInstanceResponseMessage*)message);
330                                  break;
331                      
332                              case CIM_DELETE_CLASS_RESPONSE_MESSAGE:
333                                  encodeDeleteClassResponse(
334 kumpf           1.69                 (CIMDeleteClassResponseMessage*)message);
335                                  break;
336                      
337                              case CIM_DELETE_INSTANCE_RESPONSE_MESSAGE:
338                                  encodeDeleteInstanceResponse(
339                                      (CIMDeleteInstanceResponseMessage*)message);
340                                  break;
341                      
342                              case CIM_CREATE_CLASS_RESPONSE_MESSAGE:
343                                  encodeCreateClassResponse(
344                                      (CIMCreateClassResponseMessage*)message);
345                                  break;
346                      
347                              case CIM_CREATE_INSTANCE_RESPONSE_MESSAGE:
348                                  encodeCreateInstanceResponse(
349                                      (CIMCreateInstanceResponseMessage*)message);
350                                  break;
351                      
352                              case CIM_MODIFY_CLASS_RESPONSE_MESSAGE:
353                                  encodeModifyClassResponse(
354                                      (CIMModifyClassResponseMessage*)message);
355 kumpf           1.69             break;
356                      
357                              case CIM_MODIFY_INSTANCE_RESPONSE_MESSAGE:
358                                  encodeModifyInstanceResponse(
359                                      (CIMModifyInstanceResponseMessage*)message);
360                                  break;
361                      
362                              case CIM_ENUMERATE_CLASSES_RESPONSE_MESSAGE:
363                                  encodeEnumerateClassesResponse(
364                                      (CIMEnumerateClassesResponseMessage*)message);
365                                  break;
366                      
367                              case CIM_ENUMERATE_CLASS_NAMES_RESPONSE_MESSAGE:
368                                  encodeEnumerateClassNamesResponse(
369                                      (CIMEnumerateClassNamesResponseMessage*)message);
370                                  break;
371                      
372                              case CIM_ENUMERATE_INSTANCES_RESPONSE_MESSAGE:
373                                  encodeEnumerateInstancesResponse(
374                                      (CIMEnumerateInstancesResponseMessage*)message);
375                                  break;
376 kumpf           1.69 
377                              case CIM_ENUMERATE_INSTANCE_NAMES_RESPONSE_MESSAGE:
378                                  encodeEnumerateInstanceNamesResponse(
379                                      (CIMEnumerateInstanceNamesResponseMessage*)message);
380                                  break;
381                      
382                              case CIM_EXEC_QUERY_RESPONSE_MESSAGE:
383                                  encodeExecQueryResponse(
384                                      (CIMExecQueryResponseMessage*)message);
385                                  break;
386                      
387                              case CIM_ASSOCIATORS_RESPONSE_MESSAGE:
388                                  encodeAssociatorsResponse(
389                                      (CIMAssociatorsResponseMessage*)message);
390                                  break;
391                      
392                              case CIM_ASSOCIATOR_NAMES_RESPONSE_MESSAGE:
393                                  encodeAssociatorNamesResponse(
394                                      (CIMAssociatorNamesResponseMessage*)message);
395                                  break;
396                      
397 kumpf           1.69         case CIM_REFERENCES_RESPONSE_MESSAGE:
398                                  encodeReferencesResponse(
399                                      (CIMReferencesResponseMessage*)message);
400                                  break;
401                      
402                              case CIM_REFERENCE_NAMES_RESPONSE_MESSAGE:
403                                  encodeReferenceNamesResponse(
404                                      (CIMReferenceNamesResponseMessage*)message);
405                                  break;
406                      
407                              case CIM_GET_PROPERTY_RESPONSE_MESSAGE:
408                                  encodeGetPropertyResponse(
409                                      (CIMGetPropertyResponseMessage*)message);
410                                  break;
411                      
412                              case CIM_SET_PROPERTY_RESPONSE_MESSAGE:
413                                  encodeSetPropertyResponse(
414                                      (CIMSetPropertyResponseMessage*)message);
415                                  break;
416                      
417                              case CIM_GET_QUALIFIER_RESPONSE_MESSAGE:
418 kumpf           1.69             encodeGetQualifierResponse(
419                                      (CIMGetQualifierResponseMessage*)message);
420                                  break;
421                      
422                              case CIM_SET_QUALIFIER_RESPONSE_MESSAGE:
423                                  encodeSetQualifierResponse(
424                                      (CIMSetQualifierResponseMessage*)message);
425                                  break;
426                      
427                              case CIM_DELETE_QUALIFIER_RESPONSE_MESSAGE:
428                                  encodeDeleteQualifierResponse(
429                                      (CIMDeleteQualifierResponseMessage*)message);
430                                  break;
431                      
432                              case CIM_ENUMERATE_QUALIFIERS_RESPONSE_MESSAGE:
433                                  encodeEnumerateQualifiersResponse(
434                                      (CIMEnumerateQualifiersResponseMessage*)message);
435                                  break;
436                      
437                              case CIM_INVOKE_METHOD_RESPONSE_MESSAGE:
438                                  encodeInvokeMethodResponse(
439 kumpf           1.69                 (CIMInvokeMethodResponseMessage*)message);
440                                  break;
441                          }
442                      
443                          delete message;
444 kumpf           1.14 
445 kumpf           1.69     PEG_METHOD_EXIT();
446                          return;
447 mday            1.9  }
448 mday            1.8  
449 mike            1.2  void CIMOperationResponseEncoder::handleEnqueue()
450                      {
451 kumpf           1.69     Message* message = dequeue();
452                          if (message)
453                              handleEnqueue(message);
454 mike            1.2  }
455                      
456                      void CIMOperationResponseEncoder::encodeCreateClassResponse(
457 kumpf           1.69     CIMCreateClassResponseMessage* response)
458 mike            1.2  {
459 kumpf           1.69     sendResponse(response, "CreateClass", true);
460 mike            1.2  }
461                      
462                      void CIMOperationResponseEncoder::encodeGetClassResponse(
463 kumpf           1.69     CIMGetClassResponseMessage* response)
464 mike            1.2  {
465 kumpf           1.69     Buffer body;
466                          if (response->cimException.getCode() == CIM_ERR_SUCCESS)
467                              XmlWriter::appendClassElement(body, response->cimClass);
468                          sendResponse(response, "GetClass", true, &body);
469 mike            1.2  }
470                      
471                      void CIMOperationResponseEncoder::encodeModifyClassResponse(
472 kumpf           1.69     CIMModifyClassResponseMessage* response)
473 mike            1.2  {
474 kumpf           1.69     sendResponse(response, "ModifyClass", true);
475 mike            1.2  }
476                      
477                      void CIMOperationResponseEncoder::encodeEnumerateClassNamesResponse(
478 kumpf           1.69     CIMEnumerateClassNamesResponseMessage* response)
479 mike            1.2  {
480 kumpf           1.69     Buffer body;
481                          if (response->cimException.getCode() == CIM_ERR_SUCCESS)
482                              for (Uint32 i = 0, n = response->classNames.size(); i < n; i++)
483                                  XmlWriter::appendClassNameElement(body, response->classNames[i]);
484                          sendResponse(response, "EnumerateClassNames", true, &body);
485 mike            1.2  }
486                      
487                      void CIMOperationResponseEncoder::encodeEnumerateClassesResponse(
488 kumpf           1.69     CIMEnumerateClassesResponseMessage* response)
489 mike            1.2  {
490 kumpf           1.69     Buffer body;
491                          if (response->cimException.getCode() == CIM_ERR_SUCCESS)
492                              for (Uint32 i = 0, n= response->cimClasses.size(); i < n; i++)
493                                  XmlWriter::appendClassElement(body, response->cimClasses[i]);
494                          sendResponse(response, "EnumerateClasses", true, &body);
495 mike            1.2  }
496                      
497                      void CIMOperationResponseEncoder::encodeDeleteClassResponse(
498 kumpf           1.69     CIMDeleteClassResponseMessage* response)
499 mike            1.2  {
500 kumpf           1.69     sendResponse(response, "DeleteClass", true);
501 mike            1.2  }
502                      
503                      void CIMOperationResponseEncoder::encodeCreateInstanceResponse(
504 kumpf           1.69     CIMCreateInstanceResponseMessage* response)
505 mike            1.2  {
506 kumpf           1.69     Buffer body;
507                          if (response->cimException.getCode() == CIM_ERR_SUCCESS)
508                              XmlWriter::appendInstanceNameElement(body, response->instanceName);
509                          sendResponse(response, "CreateInstance", true, &body);
510 mike            1.2  }
511                      
512                      void CIMOperationResponseEncoder::encodeGetInstanceResponse(
513 kumpf           1.69     CIMGetInstanceResponseMessage* response)
514 mike            1.2  {
515 kumpf           1.69     Buffer body;
516                          if (response->cimException.getCode() == CIM_ERR_SUCCESS)
517                              XmlWriter::appendInstanceElement(body, response->cimInstance);
518                          sendResponse(response, "GetInstance", true, &body);
519 mike            1.2  }
520                      
521                      void CIMOperationResponseEncoder::encodeModifyInstanceResponse(
522 kumpf           1.69     CIMModifyInstanceResponseMessage* response)
523 mike            1.2  {
524 kumpf           1.69     sendResponse(response, "ModifyInstance", true);
525 mike            1.2  }
526                      
527                      void CIMOperationResponseEncoder::encodeEnumerateInstancesResponse(
528 kumpf           1.69     CIMEnumerateInstancesResponseMessage* response)
529 mike            1.2  {
530 kumpf           1.69     Buffer body;
531                          if (response->cimException.getCode() == CIM_ERR_SUCCESS)
532                              for (Uint32 i = 0, n = response->cimNamedInstances.size(); i < n; i++)
533                                  XmlWriter::appendValueNamedInstanceElement(
534                                      body, response->cimNamedInstances[i]);
535                          sendResponse(response, "EnumerateInstances", true, &body);
536 mike            1.2  }
537                      
538                      void CIMOperationResponseEncoder::encodeEnumerateInstanceNamesResponse(
539 kumpf           1.69     CIMEnumerateInstanceNamesResponseMessage* response)
540 mike            1.2  {
541 kumpf           1.69     Buffer body;
542                          if (response->cimException.getCode() == CIM_ERR_SUCCESS)
543                              for (Uint32 i = 0, n = response->instanceNames.size(); i < n; i++)
544                                  XmlWriter::appendInstanceNameElement(
545                                      body, response->instanceNames[i]);
546                          sendResponse(response, "EnumerateInstanceNames", true, &body);
547 mike            1.2  }
548                      
549                      void CIMOperationResponseEncoder::encodeDeleteInstanceResponse(
550 kumpf           1.69     CIMDeleteInstanceResponseMessage* response)
551 mike            1.2  {
552 kumpf           1.69     sendResponse(response, "DeleteInstance", true);
553 mike            1.2  }
554                      
555                      void CIMOperationResponseEncoder::encodeGetPropertyResponse(
556 kumpf           1.69     CIMGetPropertyResponseMessage* response)
557 mike            1.2  {
558 kumpf           1.69     Buffer body;
559                          if (response->cimException.getCode() == CIM_ERR_SUCCESS)
560                              XmlWriter::appendValueElement(body, response->value);
561                          sendResponse(response, "GetProperty", true, &body);
562 mike            1.2  }
563                      
564                      void CIMOperationResponseEncoder::encodeSetPropertyResponse(
565 kumpf           1.69     CIMSetPropertyResponseMessage* response)
566 mike            1.2  {
567 kumpf           1.69     sendResponse(response, "SetProperty", true);
568 mike            1.2  }
569                      
570                      void CIMOperationResponseEncoder::encodeSetQualifierResponse(
571 kumpf           1.69     CIMSetQualifierResponseMessage* response)
572 mike            1.2  {
573 kumpf           1.69     sendResponse(response, "SetQualifier", true);
574 mike            1.2  }
575                      
576                      void CIMOperationResponseEncoder::encodeGetQualifierResponse(
577 kumpf           1.69     CIMGetQualifierResponseMessage* response)
578 mike            1.2  {
579 kumpf           1.69     Buffer body;
580                          if (response->cimException.getCode() == CIM_ERR_SUCCESS)
581                              XmlWriter::appendQualifierDeclElement(body, response->cimQualifierDecl);
582                          sendResponse(response, "GetQualifier", true, &body);
583 mike            1.2  }
584                      
585                      void CIMOperationResponseEncoder::encodeEnumerateQualifiersResponse(
586 kumpf           1.69     CIMEnumerateQualifiersResponseMessage* response)
587 mike            1.2  {
588 kumpf           1.69     Buffer body;
589                          if (response->cimException.getCode() == CIM_ERR_SUCCESS)
590                              for (Uint32 i = 0, n = response->qualifierDeclarations.size();
591                                   i < n; i++)
592                                  XmlWriter::appendQualifierDeclElement(
593                                      body, response->qualifierDeclarations[i]);
594                          sendResponse(response, "EnumerateQualifiers", true, &body);
595 mike            1.2  }
596                      
597                      void CIMOperationResponseEncoder::encodeDeleteQualifierResponse(
598 kumpf           1.69     CIMDeleteQualifierResponseMessage* response)
599 mike            1.2  {
600 kumpf           1.69     sendResponse(response, "DeleteQualifier", true);
601 mike            1.2  }
602                      
603                      void CIMOperationResponseEncoder::encodeReferenceNamesResponse(
604 kumpf           1.69     CIMReferenceNamesResponseMessage* response)
605 mike            1.2  {
606 kumpf           1.69     Buffer body;
607                          if (response->cimException.getCode() == CIM_ERR_SUCCESS)
608                              for (Uint32 i = 0, n = response->objectNames.size(); i < n; i++)
609                              {
610                                  body << "<OBJECTPATH>\n";
611                                  XmlWriter::appendValueReferenceElement(
612                                      body, response->objectNames[i], false);
613                                  body << "</OBJECTPATH>\n";
614                              }
615                          sendResponse(response, "ReferenceNames", true, &body);
616 mike            1.2  }
617                      
618                      void CIMOperationResponseEncoder::encodeReferencesResponse(
619 kumpf           1.69     CIMReferencesResponseMessage* response)
620 mike            1.2  {
621 kumpf           1.69     Buffer body;
622                          if (response->cimException.getCode() == CIM_ERR_SUCCESS)
623                              for (Uint32 i = 0, n = response->cimObjects.size(); i < n;i++)
624                                  XmlWriter::appendValueObjectWithPathElement(
625                                      body, response->cimObjects[i]);
626                          sendResponse(response, "References", true, &body);
627 mike            1.2  }
628                      
629                      void CIMOperationResponseEncoder::encodeAssociatorNamesResponse(
630 kumpf           1.69     CIMAssociatorNamesResponseMessage* response)
631 mike            1.2  {
632 kumpf           1.69     Buffer body;
633                          if (response->cimException.getCode() == CIM_ERR_SUCCESS)
634                              for (Uint32 i = 0, n = response->objectNames.size(); i < n; i++)
635                              {
636                                  body << "<OBJECTPATH>\n";
637                                  XmlWriter::appendValueReferenceElement(
638                                      body, response->objectNames[i], false);
639                                  body << "</OBJECTPATH>\n";
640                              }
641                          sendResponse(response, "AssociatorNames", true, &body);
642 mike            1.2  }
643                      
644                      void CIMOperationResponseEncoder::encodeAssociatorsResponse(
645 kumpf           1.69     CIMAssociatorsResponseMessage* response)
646 mike            1.2  {
647 kumpf           1.69     Buffer body;
648                          if (response->cimException.getCode() == CIM_ERR_SUCCESS)
649                              for (Uint32 i = 0, n = response->cimObjects.size(); i < n; i++)
650                                  XmlWriter::appendValueObjectWithPathElement(
651                                      body, response->cimObjects[i]);
652                          sendResponse(response, "Associators", true, &body);
653 kumpf           1.14 }
654                      
655                      void CIMOperationResponseEncoder::encodeExecQueryResponse(
656 kumpf           1.69     CIMExecQueryResponseMessage* response)
657 kumpf           1.14 {
658 kumpf           1.69     Buffer body;
659                          if (response->cimException.getCode() == CIM_ERR_SUCCESS)
660                              for (Uint32 i = 0; i < response->cimObjects.size(); i++)
661                                  XmlWriter::appendValueObjectWithPathElement(
662                                      body, response->cimObjects[i]);
663                          sendResponse(response, "ExecQuery", true, &body);
664 mike            1.2  }
665                      
666                      void CIMOperationResponseEncoder::encodeInvokeMethodResponse(
667 mday            1.26     CIMInvokeMethodResponseMessage* response)
668 mike            1.2  {
669 kumpf           1.69     Buffer body;
670 mday            1.9  
671 kumpf           1.69     // ATTN-RK-P3-20020219: Who's job is it to make sure the return value is
672                          // not an array?
673                          // Only add the return value if it is not null
674                      
675                          if (response->cimException.getCode() == CIM_ERR_SUCCESS)
676                          {
677                              if (!response->retValue.isNull())
678                                  XmlWriter::appendReturnValueElement(body, response->retValue);
679                      
680                              for (Uint32 i=0, n = response->outParameters.size(); i < n; i++)
681                                  XmlWriter::appendParamValueElement(
682                                      body, response->outParameters[i]);
683                          }
684                          sendResponse(response, response->methodName.getString(), false, &body);
685 mike            1.2  }
686                      
687                      PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2