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

  1 mike  1.23 //%/////////////////////////////////////////////////////////////////////////////
  2            //
  3            // Copyright (c) 2000, 2001 The Open group, BMC Software, Tivoli Systems, IBM
  4            //
  5            // Permission is hereby granted, free of charge, to any person obtaining a copy
  6            // of this software and associated documentation files (the "Software"), to 
  7            // deal in the Software without restriction, including without limitation the 
  8            // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 
  9            // sell copies of the Software, and to permit persons to whom the Software is
 10            // furnished to do so, subject to the following conditions:
 11            // 
 12            // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN 
 13            // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 14            // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 15            // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
 16            // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
 17            // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 
 18            // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 19            // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 20            //
 21            //==============================================================================
 22 mike  1.23 //
 23            // Author: Mike Brasher (mbrasher@bmc.com)
 24            //
 25            // Modified By:
 26            //
 27            //%/////////////////////////////////////////////////////////////////////////////
 28            
 29            #include <cstdlib>
 30            #include <cstdio>
 31            #include "CIMClass.h"
 32            #include "CIMInstance.h"
 33            #include "CIMQualifierDecl.h"
 34            #include "XmlWriter.h"
 35            #include "XmlParser.h"
 36            
 37            PEGASUS_NAMESPACE_BEGIN
 38            
 39            inline void AppendChar(Array<Sint8>& out, Char16 c)
 40            {
 41                out.append(Sint8(c));
 42            }
 43 mike  1.23 
 44            inline void AppendSpecialChar(Array<Sint8>& out, Char16 c)
 45            {
 46                // ATTN-B: Only UTF-8 handled for now.
 47            
 48                switch (c)
 49                {
 50            	case '&':
 51            	    out.append("&amp;", 5);
 52            	    break;
 53            
 54            	case '<':
 55            	    out.append("&lt;", 4);
 56            	    break;
 57            
 58            	case '>':
 59            	    out.append("&gt;", 4);
 60            	    break;
 61            
 62            	case '"':
 63            	    out.append("&quot;", 6);
 64 mike  1.23 	    break;
 65            
 66            	case '\'':
 67            	    out.append("&apos;", 6);
 68            	    break;
 69            
 70            	default:
 71            	    out.append(Sint8(c));
 72                }
 73            }
 74            
 75            void XmlWriter::append(Array<Sint8>& out, Char16 x)
 76            {
 77                AppendChar(out, x);
 78            }
 79            
 80            void XmlWriter::append(Array<Sint8>& out, Uint32 x)
 81            {
 82                char buffer[32];
 83                sprintf(buffer, "%d", x);
 84                append(out, buffer);
 85 mike  1.23 }
 86            
 87            void XmlWriter::append(Array<Sint8>& out, const char* str)
 88            {
 89                while (*str)
 90            	AppendChar(out, *str++);
 91            }
 92            
 93            void XmlWriter::appendSpecial(Array<Sint8>& out, Char16 x)
 94            {
 95                AppendSpecialChar(out, x);
 96            }
 97            
 98            void XmlWriter::appendSpecial(Array<Sint8>& out, char x)
 99            {
100                AppendSpecialChar(out, Char16(x));
101            }
102            
103            void XmlWriter::appendSpecial(Array<Sint8>& out, const char* str)
104            {
105                while (*str)
106 mike  1.23 	AppendSpecialChar(out, *str++);
107            }
108            
109            void XmlWriter::appendSpecial(Array<Sint8>& out, const String& str)
110            {
111                const Char16* tmp = str.getData();
112            
113                while (*tmp)
114            	AppendSpecialChar(out, *tmp++);
115            }
116            
117            void XmlWriter::append(Array<Sint8>& out, const String& str)
118            {
119                const Char16* tmp = str.getData();
120            
121                while (*tmp)
122            	AppendChar(out, *tmp++);
123            }
124            
125            void XmlWriter::append(Array<Sint8>& out, const Indentor& x)
126            {
127 mike  1.23     for (Uint32 i = 0; i < 4 * x.getLevel(); i++)
128            	out.append(' ');
129            }
130            
131            void XmlWriter::appendLocalNameSpaceElement(
132                Array<Sint8>& out, 
133                const String& nameSpace)
134            {
135                out << "<LOCALNAMESPACEPATH>\n";
136            
137                char* tmp = nameSpace.allocateCString();
138            
139                for (char* p = strtok(tmp, "/"); p; p = strtok(NULL, "/"))
140                {
141            	out << "<NAMESPACE NAME=\"" << p << "\"/>\n";
142                }
143            
144                delete [] tmp;
145            
146                out << "</LOCALNAMESPACEPATH>\n";
147            }
148 mike  1.23 
149            static inline void AppendSpecialChar(PEGASUS_STD(ostream)& os, char c)
150            {
151                switch (c)
152                {
153            	case '&':
154            	    os << "&amp;";
155            	    break;
156            
157            	case '<':
158            	    os << "&lt;";
159            	    break;
160            
161            	case '>':
162            	    os << "&gt;";
163            	    break;
164            
165            	case '"':
166            	    os << "&quot;";
167            	    break;
168            
169 mike  1.23 	case '\'':
170            	    os << "&apos;";
171            	    break;
172            
173            	default:
174            	    os << c;
175                }
176            }
177            
178            static inline void AppendSpecial(PEGASUS_STD(ostream)& os, const char* str)
179            {
180                while (*str)
181            	AppendSpecialChar(os, *str++);
182            }
183            
184            //------------------------------------------------------------------------------
185            //
186            // formatGetHeader()
187            //
188            //------------------------------------------------------------------------------
189            
190 mike  1.23 Array<Sint8> XmlWriter::formatGetHeader(
191                const char* documentPath)
192            {
193                Array<Sint8> out;
194                return out << "GET " << documentPath << "HTTP/1.0\r\n\r\n";
195            }
196            
197            //------------------------------------------------------------------------------
198            //
199            // formatMPostHeader()
200            //
201            //     Build HTTP request header.
202            //
203            //------------------------------------------------------------------------------
204            
205            Array<Sint8> XmlWriter::formatMPostHeader(
206                const char* host,
207                const char* cimOperation,
208                const char* cimMethod,
209                const String& cimObject,
210                const Array<Sint8>& content)
211 mike  1.23 {
212                Array<Sint8> out;
213                out.reserve(1024);
214                char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
215            
216                out << "M-POST /cimom HTTP/1.1\r\n";
217                out << "HOST: " << host << "\r\n";
218                out << "Content-CIMType: application/xml; charset=\"utf-8\"\r\n";
219                out << "Content-Length: " << content.size() << "\r\n";
220                out << "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=";
221                out << nn <<"\r\n";
222                out << nn << "-CIMOperation: " << cimOperation << "\r\n";
223                out << nn << "-CIMMethod: " << cimMethod << "\r\n";
224                out << nn << "-CIMObject: " << cimObject << "\r\n\r\n";
225                out << content;
226                return out;
227            }
228            
229            //------------------------------------------------------------------------------
230            //
231            // formatMethodResponseHeader()
232 mike  1.23 //
233            //     Build HTTP response header.
234            //
235            //------------------------------------------------------------------------------
236            
237            Array<Sint8> XmlWriter::formatMethodResponseHeader(
238                const Array<Sint8>& content)
239            {
240                Array<Sint8> out;
241                out.reserve(1024);
242                char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
243            
244                out << "HTTP/1.1 200 OK\r\n";
245                out << "Content-CIMType: application/xml; charset=\"utf-8\"\r\n";
246                out << "Content-Length: " << content.size() << "\r\n";
247                out << "Ext:\r\n";
248                out << "Cache-Control: no-cache\r\n";
249                out << "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=";
250                out << nn <<"\r\n";
251                out << nn << "-CIMOperation: MethodResponse\r\n\r\n";
252                out << content;
253 mike  1.23     return out;
254            }
255            
256            //------------------------------------------------------------------------------
257            //
258            // formatMessageElement()
259            //
260            //     <!ELEMENT MESSAGE (SIMPLEREQ|MULTIREQ|SIMPLERSP|MULTIRSP)>
261            //     <!ATTLIST MESSAGE
262            //         ID CDATA #REQUIRED
263            //         PROTOCOLVERSION CDATA #REQUIRED>
264            //
265            //------------------------------------------------------------------------------
266            
267            Array<Sint8> XmlWriter::formatMessageElement(
268                const String& messageId,
269                const Array<Sint8>& body)
270            {
271                Array<Sint8> out;
272                out.reserve(1024);
273            
274 mike  1.23     out << "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
275                out << "<CIM CIMVERSION=\"2.0\" DTDVERSION=\"2.0\">\n";
276                out << "<MESSAGE ID=\"" << messageId << "\" PROTOCOLVERSION=\"1.0\">\n";
277                out << body;
278                out << "</MESSAGE>\n";
279                out << "</CIM>\n";
280                return out;
281            }
282            
283            //------------------------------------------------------------------------------
284            //
285            // formatSimpleReqElement()
286            //
287            //     <!ELEMENT SIMPLEREQ (IMETHODCALL|METHODCALL)>
288            //
289            //------------------------------------------------------------------------------
290            
291            Array<Sint8> XmlWriter::formatSimpleReqElement(
292                const Array<Sint8>& body)
293            {
294                Array<Sint8> out;
295 mike  1.23     return out << "<SIMPLEREQ>\n" << body << "</SIMPLEREQ>\n";
296            }
297            
298            //------------------------------------------------------------------------------
299            //
300            // formatSimpleRspElement()
301            //
302            //     <!ELEMENT SIMPLERSP (METHODRESPONSE|IMETHODRESPONSE)>
303            //
304            //------------------------------------------------------------------------------
305            
306            Array<Sint8> XmlWriter::formatSimpleRspElement(
307                const Array<Sint8>& body)
308            {
309                Array<Sint8> out;
310                return out << "<SIMPLERSP>\n" << body << "</SIMPLERSP>\n";
311            }
312            
313            //------------------------------------------------------------------------------
314            //
315            // formatIMethodCallElement()
316 mike  1.23 //
317            //     <!ELEMENT IMETHODCALL (LOCALNAMESPACEPATH,IPARAMVALUE*)>
318            //     <!ATTLIST IMETHODCALL %CIMName;>
319            //
320            //------------------------------------------------------------------------------
321            
322            Array<Sint8> XmlWriter::formatIMethodCallElement(
323                const char* name,
324                const String& nameSpace,
325                const Array<Sint8>& iParamValues)
326            {
327                Array<Sint8> out;
328                out << "<IMETHODCALL NAME=\"" << name << "\">\n";
329                XmlWriter::appendLocalNameSpaceElement(out, nameSpace);
330                out << iParamValues;
331                out << "</IMETHODCALL>\n";
332                return out;
333            }
334            
335            //------------------------------------------------------------------------------
336            //
337 mike  1.23 // formatIMethodResponseElement()
338            //
339            //     <!ELEMENT IMETHODRESPONSE (ERROR|IRETURNVALUE?)>
340            //     <!ATTLIST IMETHODRESPONSE %CIMName;>
341            //
342            //------------------------------------------------------------------------------
343            
344            Array<Sint8> XmlWriter::formatIMethodResponseElement(
345                const char* name,
346                const Array<Sint8>& body)
347            {
348                Array<Sint8> out;
349                out << "<IMETHODRESPONSE NAME=\"" << name << "\">\n";
350                out << body;
351                out << "</IMETHODRESPONSE>\n";
352                return out;
353            }
354            
355            //------------------------------------------------------------------------------
356            //
357            // formatIReturnValueElement()
358 mike  1.23 //
359            //      <!ELEMENT IRETURNVALUE (CLASSNAME*|INSTANCENAME*|VALUE*|
360            //          VALUE.OBJECTWITHPATH*|VALUE.OBJECTWITHLOCALPATH*|VALUE.OBJECT*|
361            //          OBJECTPATH*|QUALIFIER.DECLARATION*|VALUE.ARRAY?|VALUE.REFERENCE?|
362            //          CLASS*|INSTANCE*|VALUE.NAMEDINSTANCE*)>
363            //
364            //------------------------------------------------------------------------------
365            
366            Array<Sint8> XmlWriter::formatIReturnValueElement(
367                const Array<Sint8>& body)
368            {
369                Array<Sint8> out;
370                return out << "<IRETURNVALUE>\n" << body << "</IRETURNVALUE>\n";
371            }
372            
373            //------------------------------------------------------------------------------
374            //
375            // formatIParamValueElement()
376            //
377            //     <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE
378            //         |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION
379 mike  1.23 //         |CLASS|INSTANCE|VALUE.NAMEDINSTANCE)?>
380            //     <!ATTLIST IPARAMVALUE %CIMName;>
381            //
382            //------------------------------------------------------------------------------
383            
384            Array<Sint8>& XmlWriter::formatIParamValueElement(
385                Array<Sint8>& out,
386                const char* name,
387                const Array<Sint8>& body)
388            {
389                out << "<IPARAMVALUE NAME=\"" << name << "\">\n";
390                out << body;
391                out << "</IPARAMVALUE>\n";
392                return out;
393            }
394            
395            //------------------------------------------------------------------------------
396            //
397            // formatErrorElement()
398            //
399            //------------------------------------------------------------------------------
400 mike  1.23 
401            Array<Sint8> XmlWriter::formatErrorElement(
402                CIMStatusCode code,
403                const char* description)
404            {
405                Array<Sint8> out;
406                out << "<ERROR";
407                out << " CODE=\"" << Uint32(code) << "\"";
408                out << " DESCRIPTION=\"";
409                appendSpecial(out, description);
410                out << "\"/>";
411                return out;
412            }
413            
414            //------------------------------------------------------------------------------
415            //
416            // appendBooleanParameter()
417            //
418            //------------------------------------------------------------------------------
419            
420            Array<Sint8>& XmlWriter::appendBooleanParameter(
421 mike  1.23     Array<Sint8>& out,
422                const char* name,
423                Boolean flag)
424            {
425                Array<Sint8> tmp;
426                tmp << "<VALUE>" << (flag ? "TRUE" : "FALSE") << "</VALUE>\n";
427                return formatIParamValueElement(out, name, tmp);
428            }
429            
430            //------------------------------------------------------------------------------
431            //
432            // appendStringParameter()
433            //
434            //------------------------------------------------------------------------------
435            
436            Array<Sint8>& XmlWriter::appendStringParameter(
437                Array<Sint8>& out,
438                const char* name,
439                const String& str)
440            {
441                Array<Sint8> tmp;
442 mike  1.23     tmp << "<VALUE>";
443                appendSpecial(tmp, str);
444                tmp << "</VALUE>\n";
445                return formatIParamValueElement(out, name, tmp);
446            }
447            
448            //------------------------------------------------------------------------------
449            //
450            // appendClassNameParameter()
451            //
452            //------------------------------------------------------------------------------
453            
454            Array<Sint8>& XmlWriter::appendClassNameParameter(
455                Array<Sint8>& out,
456                const char* name,
457                const String& className)
458            {
459                Array<Sint8> tmp;
460                appendClassNameElement(tmp, className);
461                return formatIParamValueElement(out, name, tmp);
462            }
463 mike  1.23 
464            //------------------------------------------------------------------------------
465            //
466            // appendQualifierNameParameter()
467            //
468            //------------------------------------------------------------------------------
469            
470            Array<Sint8>& XmlWriter::appendQualifierNameParameter(
471                Array<Sint8>& out,
472                const char* name,
473                const String& qualifierName)
474            {
475                // <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE
476                //     |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION
477                //     |CLASS|INSTANCE|VALUE.NAMEDINSTANCE)?>
478                //
479                // ATTN: notice that there is really no way to pass a qualifier name
480                // as an IPARAMVALUE element according to the spec (look above). So we
481                // just pass it as a class name. An answer must be obtained later.
482                
483                Array<Sint8> tmp;
484 mike  1.23     appendClassNameElement(tmp, qualifierName);
485                return formatIParamValueElement(out, name, tmp);
486            }
487            
488            //------------------------------------------------------------------------------
489            //
490            // appendClassParameter()
491            //
492            //------------------------------------------------------------------------------
493            
494            Array<Sint8>& XmlWriter::appendClassParameter(
495                Array<Sint8>& out,
496                const char* parameterName,
497                const CIMConstClass& cimClass)
498            {
499                Array<Sint8> tmp;
500                cimClass.toXml(tmp);
501                return formatIParamValueElement(out, parameterName, tmp);
502            }
503            
504            //------------------------------------------------------------------------------
505 mike  1.23 //
506            // appendInstanceNameParameter()
507            //
508            //------------------------------------------------------------------------------
509            
510            Array<Sint8>& XmlWriter::appendInstanceNameParameter(
511                Array<Sint8>& out,
512                const char* parameterName,
513                const CIMReference& instanceName)
514            {
515                Array<Sint8> tmp;
516                instanceName.instanceNameToXml(tmp);
517                return formatIParamValueElement(out, parameterName, tmp);
518            }
519            
520            //------------------------------------------------------------------------------
521            //
522            // appendInstanceParameter()
523            //
524            //------------------------------------------------------------------------------
525            
526 mike  1.23 Array<Sint8>& XmlWriter::appendInstanceParameter(
527                Array<Sint8>& out,
528                const char* parameterName,
529                const CIMConstInstance& instance)
530            {
531                Array<Sint8> tmp;
532                instance.toXml(tmp);
533                return formatIParamValueElement(out, parameterName, tmp);
534            }
535            
536            //----------------------------------------------------------
537            //
538            //  appendPropertyNameParameter()
539            //   	
540            //     </IPARAMVALUE>
541            //     <IPARAMVALUE NAME="PropertyName"><VALUE>FreeSpace</VALUE></IPARAMVALUE>
542            //
543            //     USE: Create parameter for getProperty operation
544            //==========================================================
545            Array<Sint8>& XmlWriter::appendPropertyNameParameter(
546                Array<Sint8>& out,
547 mike  1.23     const String& propertyName)
548            {
549                Array<Sint8> tmp;
550                tmp << "<VALUE>" << propertyName << "</VALUE>\n"; 
551                return formatIParamValueElement(out,"PropertyName", tmp);}
552            
553            //------------------------------------------------------------------------------
554            //
555            // appendClassParameter()
556            //
557            //------------------------------------------------------------------------------
558            
559            Array<Sint8>& XmlWriter::appendQualifierDeclarationParameter(
560                Array<Sint8>& out,
561                const char* parameterName,
562                const CIMConstQualifierDecl& qualifierDecl)
563            {
564                Array<Sint8> tmp;
565                qualifierDecl.toXml(tmp);
566                return formatIParamValueElement(out, parameterName, tmp);
567            }
568 mike  1.23 
569            //------------------------------------------------------------------------------
570            //
571            // appendClassNameElement()
572            //
573            //------------------------------------------------------------------------------
574            
575            Array<Sint8>& XmlWriter::appendClassNameElement(
576                Array<Sint8>& out,
577                const String& className)
578            {
579                return out << "<CLASSNAME NAME=\"" << className << "\"/>\n";
580            }
581            
582            //------------------------------------------------------------------------------
583            //
584            // appendInstanceNameElement()
585            //
586            //------------------------------------------------------------------------------
587            
588            Array<Sint8>& XmlWriter::appendInstanceNameElement(
589 mike  1.23     Array<Sint8>& out,
590                const CIMReference& instanceName)
591            {
592                instanceName.instanceNameToXml(out);
593                return out;
594            }
595            
596            //------------------------------------------------------------------------------
597            //
598            // _printAttributes()
599            //
600            //------------------------------------------------------------------------------
601            
602            static void _printAttributes(
603                PEGASUS_STD(ostream)& os,
604                const XmlAttribute* attributes,
605                Uint32 attributeCount)
606            {
607                for (Uint32 i = 0; i < attributeCount; i++)
608                {
609            	os << attributes[i].name << "=";
610 mike  1.23 
611            	os << '"';
612            	AppendSpecial(os, attributes[i].value);
613            	os << '"';
614            
615            	if (i + 1 != attributeCount)
616            	    os << ' ';
617                }
618            }
619            
620            //------------------------------------------------------------------------------
621            //
622            // _indent()
623            //
624            //------------------------------------------------------------------------------
625            
626            static void _indent(PEGASUS_STD(ostream)& os, Uint32 level, Uint32 indentChars)
627            {
628                Uint32 n = level * indentChars;
629            
630                for (Uint32 i = 0; i < n; i++)
631 mike  1.23 	os << ' ';
632            }
633            
634            //------------------------------------------------------------------------------
635            //
636            // indentedPrint()
637            //
638            //------------------------------------------------------------------------------
639            
640            void XmlWriter::indentedPrint(
641                PEGASUS_STD(ostream)& os, 
642                const char* text, 
643                Uint32 indentChars)
644            {
645                char* tmp = strcpy(new char[strlen(text) + 1], text);
646            
647                XmlParser parser(tmp);
648                XmlEntry entry;
649                Stack<const char*> stack;
650            
651                while (parser.next(entry))
652 mike  1.23     {
653            	switch (entry.type)
654            	{
655            	    case XmlEntry::XML_DECLARATION:
656            	    {
657            		_indent(os, stack.size(), indentChars);
658            
659            		os << "<?" << entry.text << " ";
660            		_printAttributes(os, entry.attributes, entry.attributeCount);
661            		os << "?>";
662            		break;
663            	    }
664            
665            	    case XmlEntry::START_TAG:
666            	    {
667            		_indent(os, stack.size(), indentChars);
668            
669            		os << "<" << entry.text;
670            
671            		if (entry.attributeCount)
672            		    os << ' ';
673 mike  1.23 
674            		_printAttributes(os, entry.attributes, entry.attributeCount);
675            		os << ">";
676            		stack.push(entry.text);
677            		break;
678            	    }
679            
680            	    case XmlEntry::EMPTY_TAG:
681            	    {
682            		_indent(os, stack.size(), indentChars);
683            
684            		os << "<" << entry.text << " ";
685            		_printAttributes(os, entry.attributes, entry.attributeCount);
686            		os << "/>";
687            		break;
688            	    }
689            
690            	    case XmlEntry::END_TAG:
691            	    {
692            		if (!stack.isEmpty() && strcmp(stack.top(), entry.text) == 0)
693            		    stack.pop();
694 mike  1.23 
695            		_indent(os, stack.size(), indentChars);
696            
697            		os << "</" << entry.text << ">";
698            		break;
699            	    }
700            
701            	    case XmlEntry::COMMENT:
702            	    {
703            
704            		_indent(os, stack.size(), indentChars);
705            		os << "<!--";
706            		AppendSpecial(os, entry.text);
707            		os << "-->";
708            		break;
709            	    }
710            
711            	    case XmlEntry::CONTENT:
712            	    {
713            		_indent(os, stack.size(), indentChars);
714            		AppendSpecial(os, entry.text);
715 mike  1.23 		break;
716            	    }
717            
718            	    case XmlEntry::CDATA:
719            	    {
720            		_indent(os, stack.size(), indentChars);
721            		os << "<![CDATA[...]]>";
722            		break;
723            	    }
724            
725            	    case XmlEntry::DOCTYPE:
726            	    {
727            		_indent(os, stack.size(), indentChars);
728            		os << "<!DOCTYPE...>";
729            		break;
730            	    }
731            	}
732            
733            	os << PEGASUS_STD(endl);
734                }
735            
736 mike  1.23     delete [] tmp;
737            }
738            
739            //------------------------------------------------------------------------------
740            //
741            // XmlWriter::getNextMessageId()
742            //
743            //------------------------------------------------------------------------------
744            
745            String XmlWriter::getNextMessageId()
746            {
747                // ATTN: make thread-safe:
748                static Uint32 messageId = 1000;
749            
750                messageId++;
751            
752                if (messageId < 1000)
753            	messageId = 1001;
754            
755                char buffer[16];
756                sprintf(buffer, "%d", messageId);
757 mike  1.23     return buffer;
758            }
759            
760            //------------------------------------------------------------------------------
761            //
762            // XmlWriter::formatSimpleReqMessage()
763            //
764            //------------------------------------------------------------------------------
765            
766            Array<Sint8> XmlWriter::formatSimpleReqMessage(
767                const char* host,
768                const String& nameSpace,
769                const char* iMethodName,
770                const Array<Sint8>& body)
771            {
772                return XmlWriter::formatMPostHeader(
773            	host,
774            	"MethodCall",
775            	iMethodName,
776            	nameSpace,
777            	XmlWriter::formatMessageElement(
778 mike  1.23 	    XmlWriter::getNextMessageId(),
779            	    XmlWriter::formatSimpleReqElement(
780            		XmlWriter::formatIMethodCallElement(
781            		    iMethodName,
782            		    nameSpace, 
783            		    body))));
784            }
785            
786            Array<Sint8> XmlWriter::formatSimpleRspMessage(
787                const char* iMethodName,
788                const String& messageId,
789                const Array<Sint8>& body)
790            {
791                return XmlWriter::formatMethodResponseHeader(
792                    XmlWriter::formatMessageElement(
793            	    messageId,
794                        XmlWriter::formatSimpleRspElement(
795                            XmlWriter::formatIMethodResponseElement(
796                                iMethodName,
797                                XmlWriter::formatIReturnValueElement(body)))));
798            }
799 mike  1.23 
800            Array<Sint8>& operator<<(Array<Sint8>& out, const char* x)
801            {
802                XmlWriter::append(out, x);
803                return out;
804            }
805            
806            Array<Sint8>& operator<<(Array<Sint8>& out, char x)
807            {
808                XmlWriter::append(out, x);
809                return out;
810            }
811            
812            Array<Sint8>& operator<<(Array<Sint8>& out, Char16 x)
813            {
814                XmlWriter::append(out, x);
815                return out;
816            }
817            
818            Array<Sint8>& operator<<(Array<Sint8>& out, const String& x)
819            {
820 mike  1.23     XmlWriter::append(out, x);
821                return out;
822            }
823            
824            Array<Sint8>& operator<<(Array<Sint8>& out, const Indentor& x)
825            {
826                XmlWriter::append(out, x);
827                return out;
828            }
829            
830            Array<Sint8>& operator<<(Array<Sint8>& out, const Array<Sint8>& x)
831            {
832                out.appendArray(x);
833                return out;
834            }
835            
836            Array<Sint8>& operator<<(Array<Sint8>& out, Uint32 x)
837            {
838                XmlWriter::append(out, x);
839                return out;
840            }
841 mike  1.23 
842            Array<Sint8>& XmlWriter::appendObjectNameParameter(
843                Array<Sint8>& out,
844                const char* name,
845                const CIMReference& objectName)
846            {
847                if (objectName.isClassName())
848                {
849            	XmlWriter::appendClassNameParameter(
850            	    out, name, objectName.getClassName());
851                }
852                else
853                {
854            	XmlWriter::appendInstanceNameParameter(
855            	    out, name, objectName);
856                }
857            
858                return out;
859            }
860            
861            PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2