(file) Return to Globalization_HOWTO.htm CVS log (file) (dir) Up to [Pegasus] / pegasus / doc

Diff for /pegasus/doc/Globalization_HOWTO.htm between version 1.3 and 1.12

version 1.3, 2003/07/30 16:14:26 version 1.12, 2008/12/18 16:41:52
Line 1 
Line 1 
 <!doctype html public "-//w3c//dtd html 4.0 transitional//en">  <!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">
 <html> <html>
 <head> <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">    <meta http-equiv="Content-Type"
    <meta name="GENERATOR" content="Mozilla/4.76 [en] (X11; U; Linux 2.4.2-2 i686) [Netscape]">   content="text/html; charset=iso-8859-1">
     <meta name="GENERATOR"
    content="Mozilla/4.78 [en] (X11; U; Linux 2.4.7-10 i686) [Netscape]">
 </head> </head>
 <body text="#000000" bgcolor="#FFFFFF" link="#0000EF" vlink="#55188A" alink="#FF0000">  <body text="#000000" bgcolor="#ffffff" link="#0000ef" vlink="#55188a"
    alink="#ff0000">
 <center><font size=+4>Globalization HOWTO</font>  <center>
 <p>Release: Pegasus 2.3  <p><big><big><big>Globalization HOWTO</big></big></big></p>
 <p>Author: Chuck Carmack (carmack@us.ibm.com)  <p>Release: Pegasus 2.3 </p>
 <p>July 28, 2003</center>  <p>Author: Chuck Carmack (carmack@us.ibm.com) </p>
   <p>December 1, 2003</p>
 <p><br>  </center>
 <h2>  <p><br>
 1.0 Introduction</h2>  Change History:<br>
   </p>
 <p><br>As part of the Pegasus 2.3 release, functions were added for globalization  <table cellpadding="2" cellspacing="2" border="1"
 support.&nbsp;&nbsp; Globalization involves two major aspects:&nbsp; internationalization   style="text-align: left; width: 100%; margin-left: auto; margin-right: auto;">
 and localization.    <tbody>
 <br>&nbsp;      <tr>
 <p>Internationalization is the process of writing a program that is locale-neutral.&nbsp;        <td style="vertical-align: top;">01/12/03<br>
 In other words, the program should be able to run in any locale without        </td>
 change.&nbsp; There are several categories in a locale, including the language        <td style="vertical-align: top;">carmack<br>
 of message strings, date format, time format, etc.&nbsp; For release 2.3,        </td>
 the Pegasus server is concerned with the language of the message strings        <td style="vertical-align: top;">Section 2.2.2. &nbsp;Changed how
 it returns to its clients.  the package name parameter should be used. &nbsp;It should no longer be
 <br>&nbsp;  used as part of the table name inside the bundle.<br>
 <p>To support internationalization, a program is designed to do the following:        </td>
 <br>&nbsp;      </tr>
 <blockquote>      <tr>
 <li>        <td style="vertical-align: top;">08/04/06<br>
 Support character sets that can represent customer data in any language.&nbsp;        </td>
 Typically, the program supports some variation of Unicode for internal        <td style="vertical-align: top;">Marek Szermutzky<br>
 data.&nbsp; There is usually some conversion between the supported character        </td>
 sets for external data, and the internal character set.&nbsp; Since Unicode        <td style="vertical-align: top;">Section 2.2.5. &nbsp; Added information how to write platform specific messages.<br>
 covers all characters, and usually has converters on the platform, it is        </td>
 a good choice for the 'normalized' internal character set.&nbsp;&nbsp;&nbsp;      </tr>
 The most 'interoperable' solution for external data is to support UTF-8      <tr>
 (eg. network and file system data).&nbsp; The internal data is usually        <td style="vertical-align: top;">01/23/07<br>
 UTF-16 (or UCS-2, but that is deprecated).</li>        </td>
         <td style="vertical-align: top;">Sushma Fernandes<br>
 <br>&nbsp;        </td>
 <li>        <td style="vertical-align: top;">Section 2.2.5. &nbsp; Added information on special considerations while creating a new message.<br>
 Extract locale-sensitive resources, such as message strings, from the code        </td>
 to external resource files.&nbsp; Typically, the resources are loaded based      </tr>
 on the locale requested by the end-user, and returned to the end-user for    </tbody>
 display.</li>  </table>
   <p><br>
   </p>
   <h2> 1.0 Introduction</h2>
   <p><br>
   As part of the Pegasus 2.3 release, functions were added for
   globalization support.&nbsp;&nbsp; Globalization involves two major
   aspects:&nbsp; internationalization and localization. <br>
   &nbsp; </p>
   <p>Internationalization is the process of writing a program that is
   locale-neutral.&nbsp; In other words, the program should be able to run
   in any locale without change.&nbsp; There are several categories in a
   locale, including the language of message strings, date format, time
   format, etc.&nbsp; For release 2.3, the Pegasus server is concerned with
   the language of the message strings it returns to its clients. <br>
   &nbsp; </p>
   <p>To support internationalization, a program is designed to do the
   following: <br>
   &nbsp; </p>
   <blockquote> <li> Support character sets that can represent customer
   data in any language.&nbsp; Typically, the program supports some
   variation of Unicode for internal data.&nbsp; There is usually some
   conversion between the supported character sets for external data, and
   the internal character set.&nbsp; Since Unicode covers all characters,
   and usually has converters on the platform, it is a good choice for the
   'normalized' internal character set.&nbsp;&nbsp;&nbsp; The most
   'interoperable' solution for external data is to support UTF-8 (eg.
   network and file system data).&nbsp; The internal data is usually UTF-16
   (or UCS-2, but that is deprecated).</li>
     <br>
   &nbsp; <li> Extract locale-sensitive resources, such as message
   strings, from the code to external resource files.&nbsp; Typically, the
   resources are loaded based on the locale requested by the end-user, and
   returned to the end-user for display.</li>
 </blockquote> </blockquote>
   <p><br>
 <p><br>Localization is the process of customizing a software product to  Localization is the process of customizing a software product to
 support particular locales.&nbsp; For example, a product that is internationalized  support particular locales.&nbsp; For example, a product that is
 might want to only localize for certain countries.&nbsp; This would mean  internationalized might want to only localize for certain
 that the localized resources (eg. message files) would only be translated  countries.&nbsp; This would mean that the localized resources (eg.
 and shipped for the countries that the product supports.&nbsp; Since the  message files) would only be translated and shipped for the countries
 code for the product is locale-neutral, it will be easy to drop in new  that the product supports.&nbsp; Since the code for the product is
 translations as more countries are supported.  locale-neutral, it will be easy to drop in new translations as more
 <br>&nbsp;  countries are supported. <br>
   &nbsp; </p>
 <p>The Pegasus 2.3 release added support for globalization.&nbsp; At a <p>The Pegasus 2.3 release added support for globalization.&nbsp; At a
 high-level, the following additions were made to Pegasus 2.3:  high-level, the following additions were made to Pegasus 2.3: <br>
 <br>&nbsp;  &nbsp; </p>
 <ul> <ul>
 <li>    <li> Support UTF-8 for external data.</li>
 Support UTF-8 for external data.</li>    <br>
   &nbsp;
 <br>&nbsp;  
 <ul> <ul>
 <li>      <li> The CIM-XML documents contained in the HTTP messages</li>
 The CIM-XML documents contained in the HTTP messages</li>      <li> The files in the repository</li>
       <li> Note:&nbsp; Pegasus 2.3 does NOT&nbsp;support UTF-8 in the MOF
 <li>  files</li>
 Repository files and MOF files&nbsp; (<b>TODO</b> - remove MOF files if      <br>
 we can't get this into 2.3)</li>  &nbsp;
 </ul> </ul>
     <li> Support UTF-16 for internal data.</li>
 <li>    <br>
 Support UTF-16 for internal data.</li>  &nbsp; <li> Extract the hardcoded messages from the Pegasus code into
   message files.&nbsp; An API was added to load messages from the message
 <br>&nbsp;  files.</li>
 <li>    <br>
 Extract the hardcoded messages from the Pegasus code into message files.&nbsp;  &nbsp; <li> APIs were added for clients to associate a language with
 An API was added to load messages from the message files.</li>  the CIM objects they are sending to Pegasus.&nbsp; Also, APIs were added
   for clients to determine the language of the error message or CIM
 <br>&nbsp;  object that Pegasus returns.</li>
 <li>    <br>
 APIs were added for clients to associate a language with the CIM objects  &nbsp; <li> APIs were added for providers to determine the language of
 they are sending to Pegasus.&nbsp; Also, APIs were added for clients to  CIM objects sent by the client.&nbsp; Also, APIs were added for
 determine the language of the error message or CIM object that Pegasus  providers to associate a language with the CIM object, or error message,
 returns.</li>  they return to the client.</li>
   
 <br>&nbsp;  
 <li>  
 APIs were added for providers to determine the language of CIM objects  
 sent by the client.&nbsp; Also, APIs were added for providers to associate  
 a language with the CIM object, or error message, they return to the client.</li>  
 </ul> </ul>
   <p><br>
 <p><br>Please refer to PEPs 56 and 58 for details about the globalization  Please refer to PEPs 56 and 58 for details about the globalization
 design in Pegasus 2.3.  design in Pegasus 2.3. <br>
 <br>&nbsp;  &nbsp; </p>
 <p>This document provides a HOWTO guide to be used by developers to globalize  <p>This document provides a HOWTO guide to be used by developers to
 code that is being added to Pegasus.&nbsp; The audience for this document  globalize code that is being added to Pegasus.&nbsp; The audience for
 are:  this document are: <br>
 <br>&nbsp;  &nbsp; </p>
 <ul> <ul>
 <li>    <li> Provider developers - both CMPI and C++</li>
 Provider developers - both CMPI and C++</li>    <li> Client developers</li>
     <li> Pegasus developers</li>
 <li>  
 Client developers</li>  
   
 <li>  
 Pegasus developers</li>  
 </ul> </ul>
   <p><br>
 <p><br>The quickest way to approach this document is to read the General  The quickest way to approach this document is to read the General
 section, and then the developer section that relates to what you are doing.  section, and then the developer section that relates to what you are
 <br>&nbsp;  doing. <br>
 <h2>  &nbsp; </p>
 2.0 General</h2>  <h2> 2.0 General</h2>
 &nbsp; &nbsp;
 <h3>  <h3> 2.1 Unicode Support</h3>
 2.1 Unicode Support</h3>  <p><br>
   Pegasus 2.3 supports Unicode throughout the processing of
 <p><br>Pegasus 2.3 supports Unicode throughout the processing of requests.&nbsp;  requests.&nbsp; External data to Pegasus is encoded in UTF-8.&nbsp;
 External data to Pegasus is encoded in UTF-8.&nbsp; Internal data is encoded  Internal data is encoded in UTF-16. <br>
 in UTF-16.  &nbsp; </p>
 <br>&nbsp;  <p>UTF-8 support for external data includes the CIM-XML messages passed
 <p>External data includes the CIM-XML messages passed over the network,  over the network, and the repository files.&nbsp; Note:&nbsp; UTF-8
 the repository files, and the MOF files.&nbsp; For the CIM-XML messages,  support was NOT added to the MOF&nbsp;Compiler for MOF files in release
 Pegasus follows section 4.8 of the&nbsp; <a href="http://www.dmtf.org/standards/documents/WBEM/DSP200.html">CIM-HTTP  2.3.&nbsp; For the CIM-XML messages, Pegasus follows section 4.8 of
   the&nbsp; <a
    href="http://www.dmtf.org/standards/documents/WBEM/DSP200.html">CIM-HTTP
 specification</a>&nbsp;&nbsp;&nbsp; Specifically, Pegasus supports the specification</a>&nbsp;&nbsp;&nbsp; Specifically, Pegasus supports the
 "utf-8" setting for the charset parameter of the Content-Type header and "utf-8" setting for the charset parameter of the Content-Type header and
 the XML encoding attribute.&nbsp; If no charset is specified, the 7-bit the XML encoding attribute.&nbsp; If no charset is specified, the 7-bit
 ASCII is assumed.&nbsp; The Pegasus MOF compiler supports UTF-8 encoding  ASCII is assumed. <br>
 in the MOF files.&nbsp; (<b>TODO</b> - remove this statement if this is  &nbsp; </p>
 not in 2.3)  
 <br>&nbsp;  
 <p>The internal support of UTF-16 is encapsulated in the Pegasus String <p>The internal support of UTF-16 is encapsulated in the Pegasus String
 class.&nbsp; This class has been updated to contain UTF-16 characters.&nbsp;  class.&nbsp; This class has been updated to contain UTF-16
 Specifically, the Char16 objects inside the String contain UTF-16 characters.&nbsp;  characters.&nbsp; Specifically, the Char16 objects inside the String
 Note: a UTF-16 surrogate pair is contained in two consecutive Char16 objects.&nbsp;  contain UTF-16 characters.&nbsp; Note: a UTF-16 surrogate pair is
 To keep backwards compatibilty, the methods on the String class have not  contained in two consecutive Char16 objects.&nbsp; To keep backwards
 changed.&nbsp; New methods have been added as needed.&nbsp; The following  compatibilty, the methods on the String class have not changed.&nbsp;
 describes this in more detail:  New methods have been added as needed.&nbsp; The following describes
   this in more detail: </p>
 <ul> <ul>
 <li>    <li> The Pegasus 2.2 methods that take a char *, or return char *, are
 The Pegasus 2.2 methods that take a char *, or return char *, are unchanged.&nbsp;  unchanged.&nbsp; Code written to Pegasus 2.2 may have expected to store
 Code written to Pegasus 2.2 may have expected to store 8-bit ASCII (ISO-8859-1)  8-bit ASCII (ISO-8859-1) characters into String.&nbsp; These methods
 characters into String.&nbsp; These methods will convert the input to UTF-16  will convert the input to UTF-16 from 8-bit ASCII.&nbsp; (This is simple
 from 8-bit ASCII.&nbsp; (This is simple because UTF-16 is a superset of  because UTF-16 is a superset of 8-bit ASCII - simply need to prepend
 8-bit ASCII - simply need to prepend '\0' to each char).&nbsp; The Pegasus  '\0' to each char).&nbsp; The Pegasus 2.2 methods that return char data
 2.2 methods that return char data will attempt to convert from the UTF-16  will attempt to convert from the UTF-16 internal representation to
 internal representation to 8-bit ASCII.&nbsp; Characters that cannot be  8-bit ASCII.&nbsp; Characters that cannot be converted will be replaced
 converted will be replaced with a substitution character.</li>  with a substitution character.</li>
     <br>
 <br>&nbsp;  &nbsp; <li> All methods that take or return Char16 data are
 <li>  unchanged.&nbsp; The String class now supports UTF-16 data in Char16,
 All methods that take or return Char16 data are unchanged.&nbsp; The String  although surrogate pairs will require two consecutive Char16
 class now supports UTF-16 data in Char16, although surrogate pairs will  objects.&nbsp; The String class does NO checking for unmatched surrogate
 require two consecutive Char16 objects.&nbsp; The String class does NO  pairs.</li>
 checking for unmatched surrogate pairs.</li>    <br>
   &nbsp; <li> New methods have been added to take and return UTF-8
 <br>&nbsp;  data.&nbsp; The String class will convert between UTF-8 and the UTF-16
 <li>  internal representation as needed.&nbsp; These new methods will use char
 New methods have been added to take and return UTF-8 data.&nbsp; The String  * parameters, but will be clearly labelled as UTF-8 methods.</li>
 class will convert between UTF-8 and the UTF-16 internal representation    <br>
 as needed.&nbsp; These new methods will use char * parameters, but will  
 be clearly labelled as UTF-8 methods.</li>  
   
 <br>&nbsp;</ul>  
 PROGRAMMING NOTE:&nbsp; Putting EBCDIC data into the String class is dangerous.&nbsp;  
 The String class is designed for UTF-16, which is a superset of 8-bit ASCII.&nbsp;  
 Any String object containing EBCDIC data will not work if it is used by  
 Pegasus to read or write data from external sources, such as the network  
 or repository files.&nbsp; In other words, any String containing EBCDIC  
 data should not leave the code using it.  
 <br>&nbsp;  
 <br>&nbsp;  
 <h3>  
 2.2 Localization Support</h3>  
 &nbsp; &nbsp;
 <h4>  </ul>
 2.2.1 Language Headers</h4>  PROGRAMMING NOTE:&nbsp; Putting EBCDIC data into the String class is
   dangerous.&nbsp; The String class is designed for UTF-16, which is a
 <p><br>Pegasus 2.3 supports clients and providers that wish to localize.&nbsp;  superset of 8-bit ASCII.&nbsp; Any String object containing EBCDIC data
 There are two areas to be localized:&nbsp; <a href="http://www.dmtf.org/standards/documents/WBEM/DSP201.html#SecERROR">ERROR</a>&nbsp;  will not work if it is used by Pegasus to read or write data from
 elements in the CIM-XML; and&nbsp; <a href="http://www.dmtf.org/standards/documents/WBEM/DSP201.html#SecObjectDefinitionElements">Object  external sources, such as the network or repository files.&nbsp; In
 Definition</a>&nbsp; elements in the CIM-XML.&nbsp; Clients can request&nbsp;  other words, any String containing EBCDIC data should not leave the code
 the server to return error messages and CIM objects in a set of languages  using it. <br>
 of their choosing.&nbsp; Clients can also tag a language to the CIM objects  &nbsp; <br>
 they are sending to the server.&nbsp; Providers and the server can return  &nbsp;
 error messages and CIM objects that are tagged with one of&nbsp; languages  <h3> 2.2 Localization Support</h3>
 requested by the client.  &nbsp;
 <br>&nbsp;  <h4> 2.2.1 Language Headers</h4>
 <p>The localization design is based on section 4.8 of the <a href="http://www.dmtf.org/standards/documents/WBEM/DSP200.html">CIM-HTTP  <p><br>
 specification</a> , which refers to <a href="http://www.ietf.org/rfc/rfc2616.txt?number=2616">RFC  Pegasus 2.3 supports clients and providers that wish to localize.&nbsp;
 2616</a>.&nbsp; The method used to tag a language to the CIM-XML is through  There are two areas to be localized:&nbsp; <a
 the Accept-Language and Content-Language HTTP headers.&nbsp; These headers   href="http://www.dmtf.org/standards/documents/WBEM/DSP201.html#SecERROR">ERROR</a>&nbsp;
   elements in the CIM-XML; and&nbsp; <a
    href="http://www.dmtf.org/standards/documents/WBEM/DSP201.html#SecObjectDefinitionElements">Object
   Definition</a>&nbsp; elements in the CIM-XML.&nbsp; Clients can
   request&nbsp; the server to return error messages and CIM objects in a
   set of languages of their choosing.&nbsp; Clients can also tag a
   language to the CIM objects they are sending to the server.&nbsp;
   Providers and the server can return error messages and CIM objects that
   are tagged with one of&nbsp; languages requested by the client. <br>
   &nbsp; </p>
   <p>The localization design is based on section 4.8 of the <a
    href="http://www.dmtf.org/standards/documents/WBEM/DSP200.html">CIM-HTTP
   specification</a> , which refers to <a
    href="http://www.ietf.org/rfc/rfc2616.txt?number=2616">RFC 2616</a>.&nbsp;
   The method used to tag a language to the CIM-XML is through the
   Accept-Language and Content-Language HTTP headers.&nbsp; These headers
 are basically lists of language tags.&nbsp; An HTTP request can contain are basically lists of language tags.&nbsp; An HTTP request can contain
 an Accept-Language header, which indicates the list of preferred languages  an Accept-Language header, which indicates the list of preferred
 that the client wants in the response.&nbsp; This list can be prioritized  languages that the client wants in the response.&nbsp; This list can be
 by using the quality numbers.&nbsp; An HTTP request or response can contain  prioritized by using the quality numbers.&nbsp; An HTTP request or
 a Content-Language header, which indicates the language(s) of the content  response can contain a Content-Language header, which indicates the
 in the message.&nbsp; In the Pegasus case, this would be the CIM-XML.&nbsp;  language(s) of the content in the message.&nbsp; In the Pegasus case,
 Note that the Content-Language header is a list of language tags.&nbsp;  this would be the CIM-XML.&nbsp; Note that the Content-Language header
 This allows the content of an HTTP message to contain more than one translation.&nbsp;  is a list of language tags.&nbsp; This allows the content of an HTTP
 However, in the Pegasus case, there is only one CIM-XML document in the  message to contain more than one translation.&nbsp; However, in the
 HTTP message, and thus one translation.  Pegasus case, there is only one CIM-XML document in the HTTP message,
 <br>&nbsp;  and thus one translation. <br>
 <p>CIM clients may use the Accept-Language HTTP header to specify the languages  &nbsp; </p>
 they wish to be returned in the CIM response message.&nbsp; CIM clients  <p>CIM clients may use the Accept-Language HTTP header to specify the
 may also use the Content-Language header to tag the language of any CIM  languages they wish to be returned in the CIM response message.&nbsp;
 objects they are sending to the server in the CIM request message.&nbsp;  CIM clients may also use the Content-Language header to tag the language
 The server, and providers, should attempt to return error messages and  of any CIM objects they are sending to the server in the CIM request
 CIM objects in one of the accept languages requested by the client.&nbsp;  message.&nbsp; The server, and providers, should attempt to return
 The server and providers should set the Content-Language header in the  error messages and CIM objects in one of the accept languages requested
 CIM response message to indicate which of the requested languages they  by the client.&nbsp; The server and providers should set the
 are returning.  Content-Language header in the CIM response message to indicate which of
 <br>&nbsp;  the requested languages they are returning. <br>
   &nbsp; </p>
 <p>NOTE:&nbsp; Localization support was not added for the MOF files and <p>NOTE:&nbsp; Localization support was not added for the MOF files and
 repository in Pegasus 2.3.&nbsp; The #pragma locale, #pragma instancelocale,  repository in Pegasus 2.3.&nbsp; The #pragma locale, #pragma
 and translatable qualifier flavor are not supported in the Pegasus 2.3  instancelocale, and translatable qualifier flavor are not supported in
 MOF compiler.&nbsp; From the client perspective, classes, qualifiers, and  the Pegasus 2.3 MOF compiler.&nbsp; From the client perspective,
 instances stored in the repository are not tagged with a language.&nbsp;  classes, qualifiers, and instances stored in the repository are not
 The Accept-Language and Content-Language headers will be ignored for repository  tagged with a language.&nbsp; The Accept-Language and Content-Language
 operations.&nbsp; However, since the repository will support UTF-8,&nbsp;  headers will be ignored for repository operations.&nbsp; However, since
 characters for any language may be stored there.  the repository will support UTF-8,&nbsp; characters for any language may
 <br>&nbsp;  be stored there. <br>
   &nbsp; </p>
 <p>NOTE:&nbsp; Since the Content-Language header applies to the entire <p>NOTE:&nbsp; Since the Content-Language header applies to the entire
 HTTP message, it applies to the entire CIM-XML document.&nbsp; This includes  HTTP message, it applies to the entire CIM-XML document.&nbsp; This
 all the objects in the document, including enumerated objects, and all  includes all the objects in the document, including enumerated objects,
 the values in the objects.&nbsp; This is a limitation that will remain  and all the values in the objects.&nbsp; This is a limitation that will
 until the CIM standard has been updated to support language tags tied to  remain until the CIM standard has been updated to support language tags
 individual CIM values.&nbsp; From the client perspective, it is possible  tied to individual CIM values.&nbsp; From the client perspective, it is
 for Pegasus to send a CIM response with NO Content-Language, even if the  possible for Pegasus to send a CIM response with NO Content-Language,
 client had sent Accept-Language.&nbsp;&nbsp; This can happen if Pegasus  even if the client had sent Accept-Language.&nbsp;&nbsp; This can happen
 does not know the language of the response.&nbsp; An example is a request  if Pegasus does not know the language of the response.&nbsp; An example
 that was sent to a Pegasus 2.2 provider.&nbsp; Another example is an enumerated  is a request that was sent to a Pegasus 2.2 provider.&nbsp; Another
 response where each provider returned a different language.&nbsp; Please  example is an enumerated response where each provider returned a
 refer to PEP58 for details on these provider scenarios.  different language.&nbsp; Please refer to PEP58 for details on these
 <br>&nbsp;  provider scenarios. <br>
 <p>Pegasus 2.3 has added classes for the localization support.&nbsp; There  &nbsp; </p>
 are new classes called AcceptLanguages and ContentLanguages that encapsulate  <p>
 the Accept-Language and Content-Language headers, respectively.&nbsp; These  The Accept-Language and Content-Language headers are encapsulated
 classes are basically containers of AcceptLanguageElement and ContentLanguageElement,  in AcceptLanguageList and ContentLanguageList classes, respectively.
 where a language element represents one language tag.&nbsp; The AcceptLanguages  These classes contain LanguageTag objects.  The AcceptLanguageList class
 class will keep the AcceptLanguageElement's prioritized based on quality,  keeps its LanguageTags prioritized based on quality,
 according to RFC 2616.  according to RFC 2616. <br>
 <br>&nbsp;  &nbsp; </p>
 <p>AcceptLanguages and ContentLanguages are the objects used by code throughout  <p>AcceptLanguageList and ContentLanguageList are the objects used by code
 the request/response processing, from the client to the server to the providers  throughout the request/response processing, from the client to the
 and back.&nbsp; The server handles the creation of these objects from the  server to the providers and back.&nbsp; The server handles the creation
 HTTP headers.&nbsp; Code at each point in the process will have access  of these objects from the HTTP headers.&nbsp; Code at each point in the
 to these objects.  process will have access to these objects. <br>
 <br>&nbsp;  &nbsp; </p>
 <p>Please refer to the following files for details on the new Pegasus classes.  <p>Please refer to the following files for details on the Pegasus
 <br>&nbsp;  language interfaces.<br>
   &nbsp; </p>
 <ul> <ul>
 <li>    <li> pegasus/src/Pegasus/Common/AcceptLanguageList.h</li>
 pegasus/src/Pegasus/Common/AcceptLanguages.h</li>    <li> pegasus/src/Pegasus/Common/ContentLanguageList.h</li>
     <li> pegasus/src/Pegasus/Common/LanguageTag.h</li>
 <li>  
 pegasus/src/Pegasus/Common/AcceptLanguageElement.h</li>  
   
 <li>  
 pegasus/src/Pegasus/Common/ContentLanguages.h</li>  
   
 <li>  
 pegasus/src/Pegasus/Common/ContentLanguageElement.h</li>  
   
 <li>  
 pegasus/src/Pegasus/Common/LanguageElementContainer.h</li>  
   
 <li>  
 pegasus/src/Pegasus/Common/LanguageElement.h</li>  
 </ul> </ul>
   <p><br>
 <p><br>See the sections below for details on how to write clients and providers  See the sections below for details on how to write clients and
 to use these classes.  providers to use these classes. <br>
 <br>&nbsp;  &nbsp; <br>
 <br>&nbsp;  &nbsp; </p>
 <h4>  <h4> 2.2.2 Message Bundles</h4>
 2.2.2 Message Bundles</h4>  <p><br>
   One of the goals of globalization for Pegasus 2.3 is the extraction of
 <p><br>One of the goals of globalization for Pegasus 2.3 is the extraction  hardcoded messages&nbsp; into translated message files, loading
 of hardcoded messages&nbsp; into translated message files, loading translated  translated messages from those files, and returning those messages to
 messages from those files, and returning those messages to the client.&nbsp;  the client.&nbsp; The topics to be discussed here are:&nbsp; how to
 The topics to be discussed here are:&nbsp; how to create message files,  create message files, how to compile message files, and how to load
 how to compile message files, and how to load messages into Pegasus.  messages into Pegasus. <br>
 <br>&nbsp;  &nbsp; </p>
 <p>At the time of writing, the message loading function in Pegasus 2.3 <p>At the time of writing, the message loading function in Pegasus 2.3
 used the International Components for Unicode (<a href="http://oss.software.ibm.com/icu">ICU)</a>  used the International Components for Unicode (<a
 libraries.&nbsp; This is expected to be the future direction for Pegasus.   href="http://oss.software.ibm.com/icu">ICU)</a> libraries.&nbsp; This
 <a href="http://oss.software.ibm.com/icu">ICU  is expected to be the future direction for Pegasus. <a
 </a>uses   href="http://oss.software.ibm.com/icu">ICU </a>uses a resource bundle
 a resource bundle format for their message files.&nbsp;&nbsp; In order  format for their message files.&nbsp;&nbsp; In order to load the
 to load the messages, ICU requires that the resource bundles are compiled  messages, ICU requires that the resource bundles are compiled into a
 into a binary form (.res file) using their genrb tool.  binary form (.res file) using their genrb tool. <br>
 <br>&nbsp;  &nbsp; </p>
 <p>Platform Maintainers Note:&nbsp; Please refer to PEP 58 for information  <p>Platform Maintainers Note:&nbsp; Please refer to PEP 58 for
 about how to build Pegasus to use the ICU libraries.  information about how to build Pegasus to use the ICU libraries. <br>
 <br>&nbsp;  &nbsp; </p>
 <p>The documentation for ICU resource bundles is in the <a href="http://oss.software.ibm.com/icu/userguide/ResourceManagement.html">Resource  <p>The documentation for ICU resource bundles is in the <a
 Management</a>&nbsp; section of the <a href="http://oss.software.ibm.com/icu/userguide/">ICU   href="http://oss.software.ibm.com/icu/userguide/ResourceManagement.html">Resource
 User Guide</a> .&nbsp; This section will tell you how to  Management</a>&nbsp; section of the <a
 <br>create and organize your resource bundles for different languages.&nbsp;   href="http://oss.software.ibm.com/icu/userguide/">ICU User Guide</a>
 Note:&nbsp; your resource bundles should be organized in a tree structure  .&nbsp; This section will tell you how to create and organize your
 similiar to the one shown in the Resource Management section, including  resource bundles for different languages.&nbsp; Note:&nbsp; your
 the empty bundles in the tree.&nbsp; It is recommended that you ship a  resource bundles should be organized in a tree structure similiar to
 root resource bundle to be used as the fallback in case the client requests  the one shown in the Resource Management section, including the empty
 a language that you are not supporting.  bundles in the tree.&nbsp;<br>
 <br>&nbsp;  </p>
   <p><br>
   It is recommended that you ship a root resource bundle to be used as
   the fallback in case the client requests a language that you are not
   supporting.&nbsp; The Pegasus make files are set up to automatically
   create and compile a root resource bundle for you.&nbsp; For Pegasus
   2.3, the make will use your "en" bundle, upper case all the messages,
   and then put the uppercased messages into the root bundle.&nbsp; The
   uppercasing of the messages is necessary to create a "fallback" root
   bundle that contains invariant characters across all EBCDIC and
   ASCII&nbsp;codepages. <br>
   &nbsp; </p>
   <p>NOTE:&nbsp; When creating your resource bundles, the name of the
   table resource should <span style="font-style: italic;">not</span>
   contain the package name.&nbsp;&nbsp;&nbsp; For example, if you <br>
   have a bundle with a package name of "xyz", then the "en" bundle should
   start like this: </p>
   <p><br>
   en:table { <br>
   ..... messages here <br>
   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
   }</p>
   <p><i>not</i> like this:</p>
   <p>xyz_en:table { <br>
   ..... messages here <br>
   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
   } <br>
   &nbsp; <br>
   </p>
   <p>This is needed because the package name (-p) option is used by the
   Pegasus make files on the call to genrb. <br>
   &nbsp; </p>
 <p>NOTE:&nbsp; Pegasus 2.3 only supports simple string resources in the <p>NOTE:&nbsp; Pegasus 2.3 only supports simple string resources in the
 ICU resource bundles.&nbsp; String resources may only be loaded by key.&nbsp;  ICU resource bundles.&nbsp; String resources may only be loaded by
 Tables, arrays, and other complex resource types, are not supported.  key.&nbsp; Tables, arrays, and other complex resource types, are not
 <br>&nbsp;  supported. <br>
   &nbsp; </p>
 <p>In order to compile your resource bundles, support has been added to <p>In order to compile your resource bundles, support has been added to
 the Pegasus make files to run genrb.&nbsp; A new make target, "messages",  the Pegasus make files to run genrb.&nbsp; A new make target,
 has been added that will call genrb and put the compiled bundles (.res)  "messages", has been added that will call genrb and put the compiled
 in a directory of your choosing.&nbsp; An example of ICU resource bundles  bundles (.res) in a directory of your choosing.&nbsp; An example of ICU
 and the make files to compile them are located in:  resource bundles and the make files to compile them are located in: <br>
 <br>&nbsp;  &nbsp; </p>
 <ul> <ul>
 <li>    <li> pegasus/src/Providers/sample/LocalizedProvider/Makefile (just
 pegasus/src/Providers/sample/LocalizedProvider/Makefile (just causes the  causes the make to recurse to the msg sub-directory)</li>
 make to recurse to the msg sub-directory)</li>    <li> pegasus/src/Providers/sample/LocalizedProvider/msg/Makefile
   (compiles the bundles in the msg/ directory)</li>
 <li>    <li> pegasus/src/Providers/sample/LocalizedProvider/msg/*.txt (the
 pegasus/src/Providers/sample/LocalizedProvider/msg/Makefile (compiles the  resource bundles to compile, using the recommended ICU language tree
 bundles in the msg/ directory)</li>  structure)</li>
   
 <li>  
 pegasus/src/Providers/sample/LocalizedProvider/msg/*.txt (the resource  
 bundles to compile, using the recommended ICU language tree structure)</li>  
 </ul> </ul>
   <p><br>
 <p><br>NOTE:&nbsp; At the time of writing, only the Linux make files have  NOTE:&nbsp; At the time of writing, only the Linux make files have been
 been updated to compile ICU resource bundles.  updated to compile ICU resource bundles. <br>
 <br>&nbsp;  &nbsp; </p>
 <p>It is important to place the compiled resource bundles in a directory  <p>It is important to place the compiled resource bundles in a
 where your code can find them .&nbsp; The make files above compile the  directory where your code can find them .&nbsp; The make files above
 resource bundles into $PEGASUS_HOME/msg/provider/localizedProvider.&nbsp;  compile the resource bundles into
 The code that loads these messages uses the MessageLoader class (next section)  $PEGASUS_HOME/msg/provider/localizedProvider.&nbsp; The code that loads
 to load messages from this directory.  these messages uses the MessageLoader class (next section) to load
 <br>&nbsp;  messages from this directory. <br>
 <br>&nbsp;  &nbsp; <br>
 <h4>  &nbsp; </p>
 2.2.3 Message Loading</h4>  <h4> 2.2.3 Message Loading</h4>
   <p><br>
 <p><br>Code that needs to load a message in Pegasus does not call ICU directly.&nbsp;  Code that needs to load a message in Pegasus does not call ICU
 Two message loading classes were added for Pegasus 2.3:&nbsp; MessageLoader  directly.&nbsp; Two message loading classes were added for Pegasus
 and MessageLoaderParms.&nbsp; These classes are abstractions designed to  2.3:&nbsp; MessageLoader and MessageLoaderParms.&nbsp; These classes are
 hide of the actual loader used (but note that at the time of writing, only  abstractions designed to hide of the actual loader used (but note that
 ICU is supported).&nbsp;&nbsp; The MessageLoader is used to load a message  at the time of writing, only ICU is supported).&nbsp;&nbsp; The
 using a list of preferrred languages.&nbsp; The parameters to MessageLoader  MessageLoader is used to load a message using a list of preferrred
 are encapsulated in a MessageLoaderParms object.  languages.&nbsp; The parameters to MessageLoader are encapsulated in a
 <br>&nbsp;  MessageLoaderParms object. <br>
 <p>The MessageLoader is the place where the Accept-Language header, Content-Language  &nbsp; </p>
 header, and the ICU resource bundles, join up.&nbsp; The MessageLoader  <p>The MessageLoader is the place where the Accept-Language header,
 class is designed to receive an AcceptLanguages object, and a set of parameters  Content-Language header, and the ICU resource bundles, join up.&nbsp;
 indicating the bundle base-name and message ID to use.&nbsp; The AcceptLanguages  The MessageLoader class is designed to receive an AcceptLanguageList
 object contains the list of requested languages sent by the client.&nbsp;  object, and a set of parameters indicating the bundle base-name and
 The MessageLoader searches for the message in the set of bundles named  message ID to use.&nbsp; The AcceptLanguageList object contains the list of
 with the base-name, using the AcceptLanguages for the list of specific  requested languages sent by the client.&nbsp; The MessageLoader
 translated bundles to search.&nbsp; The MessageLoader returns the message  searches for the message in the set of bundles named with the base-name,
 that it found, along with a ContentLanguages object indicating the language  using the AcceptLanguageList for the list of specific translated bundles
 of the message.&nbsp; The ContentLanguages object should be used to indicate  to search.&nbsp; The MessageLoader returns the message that it found,
 the language of the response sent back to the client.  along with a ContentLanguageList object indicating the language of the
 <br>&nbsp;  message.&nbsp; The ContentLanguageList object should be used to indicate
 <p>The MessageLoaderParms object contains the parameters to load the message.&nbsp;  the language of the response sent back to the client. <br>
 There are many parameters, but many can be allowed to default.&nbsp; Here  &nbsp; </p>
 is a description of the parameters:  <p>The MessageLoaderParms object contains the parameters to load the
 <br>&nbsp;  message.&nbsp; There are many parameters, but many can be allowed to
 <br>&nbsp;  default.&nbsp; Here is a description of the parameters: <br>
 <table BORDER COLS=3 WIDTH="100%" NOSAVE >  &nbsp; <br>
   &nbsp;
   <table border="1" cols="3" width="100%" nosave="">
     <tbody>
 <tr> <tr>
 <td>String msg_id;&nbsp;</td> <td>String msg_id;&nbsp;</td>
         <td>Input.&nbsp; <br>
 <td>Input.&nbsp;  Required.</td>
 <br>Required.</td>        <td>Message ID&nbsp; of the message to load from the resource
   bundle.&nbsp; This is the key that ICU will use to load the message.</td>
 <td>Message ID&nbsp; of the message to load from the resource bundle.&nbsp;  
 This is the key that ICU will use to load the message.</td>  
 </tr> </tr>
   
 <tr> <tr>
 <td>String default_msg;</td> <td>String default_msg;</td>
         <td>Input.&nbsp; <br>
 <td>Input.&nbsp;  Required</td>
 <br>Required</td>        <td>Message to return if the no message can be loaded for msg_id
   from any resource bundle.&nbsp; Note:&nbsp; The args parameters below
 <td>Message to return if the no message can be loaded for msg_id from any  are substituted into this string.&nbsp; <br>
 resource bundle.&nbsp; Note:&nbsp; The args parameters below are substituted  Note:&nbsp; For the args into this&nbsp; string, use the Pegasus '$'
 into this string.&nbsp;  form, as described in pegasus/src/Pegasus/Common/Formatter.h.&nbsp;
 <br>Note:&nbsp; For the args into this&nbsp; string, use the Pegasus '$'  Don't use the ICU substitution format for the default message string.</td>
 form, as described in pegasus/src/Pegasus/Common/Formatter.h.&nbsp; Don't  
 use the ICU substitution format for the default message string.</td>  
 </tr> </tr>
   
 <tr> <tr>
 <td>String msg_src_path;&nbsp;</td> <td>String msg_src_path;&nbsp;</td>
         <td>Input.&nbsp; <br>
 <td>Input.&nbsp;  Optional <br>
 <br>Optional  Default: $PEGASUS_HOME/msg/pegasus/pegasusServer</td>
 <br>Default: $PEGASUS_HOME/msg/pegasus/pegasusServer</td>        <td>Path to the resource bundle file which contains the
   msg_id.&nbsp; <br>
 <td>Path to the root resource bundle file which contains the msg_id.&nbsp;  Note: Only specify the path down to the bundle base-name.&nbsp; Do not
 <br>Note: Only specify the path down to the bundle base-name.&nbsp; Do  append a language tag, such as "_root" or "_en".&nbsp; Do not append a
 not append a language tag, such as "_root" or "_en".&nbsp; Do not append  file extension. <br>
 a file extension.  Note: relative paths start at $PEGASUS_HOME/msg.&nbsp; <br>
 <br>Note: relative paths start at $PEGASUS_HOME/msg.&nbsp;  Note: defaults to the bundle containing the Pegasus server messages.</td>
 <br>Note: defaults to the bundle containing the Pegasus server messages.</td>  
 </tr> </tr>
   
 <tr> <tr>
 <td>AcceptLanguages acceptlanguages;</td>        <td>AcceptLanguageList acceptlanguages;</td>
         <td>Input.&nbsp; <br>
 <td>Input.&nbsp;  Optional <br>
 <br>Optional  Default: AcceptLanguageList()</td>
 <br>Default: AcceptLanguages::EMPTY</td>        <td>Contains the list of preferred languages, in priority
   order.&nbsp; This is combined with msg_src_path to determine which
 <td>Contains the list of preferred languages, in priority order.&nbsp;  resource bundles to search for for the msg_id.&nbsp;&nbsp; If not empty,
 This is combined with msg_src_path to determine which resource bundles  overrides useThreadLocale and useProcessLocale.</td>
 to search for for the msg_id.&nbsp;&nbsp; If not empty, overrides useThreadLocale  
 and useProcessLocale.</td>  
 </tr> </tr>
   
 <tr> <tr>
 <td>ContentLanguages contentlanguages;</td>        <td>ContentLanguageList contentlanguages;</td>
   
 <td>Output</td> <td>Output</td>
         <td>Contains the language that MessageLoader found for the
 <td>Contains the language that MessageLoader found for the msg_id.&nbsp;</td>  msg_id.&nbsp;</td>
 </tr> </tr>
   
 <tr> <tr>
 <td>Boolean useProcessLocale;</td> <td>Boolean useProcessLocale;</td>
         <td>Input <br>
 <td>Input  Optional <br>
 <br>Optional  Default = false</td>
 <br>Default = false</td>        <td>If true, MessageLoader will use the default locale of the
   process.&nbsp; If true, overrides useThreadLocale.</td>
 <td>If true, MessageLoader will use the default locale of the process.&nbsp;  
 If true, overrides useThreadLocale.</td>  
 </tr> </tr>
   
 <tr> <tr>
 <td>Boolean useThreadLocale;</td> <td>Boolean useThreadLocale;</td>
         <td>Input <br>
 <td>Input  Optional <br>
 <br>Optional  Default = <font color="#ff0000">true</font></td>
 <br>Default = <font color="#FF0000">true</font></td>        <td>If true, MessageLoader will use the AcceptLanguageList set by
   Pegasus into the caller's Thread.&nbsp;&nbsp; See the Note below for
 <td>If true, MessageLoader will use the AcceptLanguages set by Pegasus  details.&nbsp;</td>
 into the caller's Thread.&nbsp;&nbsp; See the Note below for details.&nbsp;</td>  
 </tr> </tr>
   
 <tr> <tr>
 <td>Boolean useICUfallback</td>        <td>Formatter::Arg arg0; <br>
   &nbsp;Formatter::Arg arg1; <br>
 <td>Input  &nbsp;Formatter::Arg arg2; <br>
 <br>Optional  &nbsp;Formatter::Arg arg3; <br>
 <br>Default = false</td>  &nbsp;Formatter::Arg arg4; <br>
   &nbsp;Formatter::Arg arg5; <br>
 <td>If true, use ICU's fallback mechnism to search more general resource  &nbsp;Formatter::Arg arg6; <br>
 bundles if the msg_id cannot be found.&nbsp; Note: the recommended setting  &nbsp;Formatter::Arg arg7; <br>
 is false if you are using an AcceptLanguages from a CIM client.&nbsp; The  &nbsp;Formatter::Arg arg8; <br>
 Accept-Languages HTTP header from the client contains the fallback specifications.</td>  &nbsp;Formatter::Arg arg9;</td>
 </tr>        <td>Input <br>
   Optional <br>
 <tr>  Default: Formatter::Arg( ) // empty arg</td>
 <td>Formatter::Arg arg0;        <td>These are the substitution variables, using the Pegasus
 <br>&nbsp;Formatter::Arg arg1;  Formatter::Arg class.</td>
 <br>&nbsp;Formatter::Arg arg2;  
 <br>&nbsp;Formatter::Arg arg3;  
 <br>&nbsp;Formatter::Arg arg4;  
 <br>&nbsp;Formatter::Arg arg5;  
 <br>&nbsp;Formatter::Arg arg6;  
 <br>&nbsp;Formatter::Arg arg7;  
 <br>&nbsp;Formatter::Arg arg8;  
 <br>&nbsp;Formatter::Arg arg9;</td>  
   
 <td>Input  
 <br>Optional  
 <br>Default: Formatter::Arg( ) // empty arg</td>  
   
 <td>These are the substitution variables, using the Pegasus Formatter::Arg  
 class.</td>  
 </tr> </tr>
     </tbody>
 </table> </table>
   </p>
 <p>Notes:  <p>Notes: <br>
 <br>&nbsp;  &nbsp; </p>
 <p>The "useThreadLocale" parameter defaults to true.&nbsp; This flag indicates  <p>The "useThreadLocale" parameter defaults to true.&nbsp; This flag
 to use the AcceptLanguages object set by Pegasus into the Pegasus Thread  indicates to use the AcceptLanguageList object set by Pegasus into the
 in which the caller's code is running.&nbsp; This AcceptLanguages object  Pegasus Thread in which the caller's code is running.&nbsp; This
 reflects the languages requested by the client.&nbsp; This is useful for  AcceptLanguageList object reflects the languages requested by the
 code that may not have access to the AcceptLanguages from the client.&nbsp;  client.&nbsp; This is useful for code that may not have access to the
 Pegasus sets this AcceptLanguages object into the Thread of providers and  AcceptLanguageList from the client.&nbsp; Pegasus sets this AcceptLanguageList
 internal Pegasus code.&nbsp; For this reason, it is recommended that provider  object into the Thread of providers and internal Pegasus code.&nbsp;
 and internal Pegasus code use the "useThreadLocale" flag instead of explicity  For this reason, it is recommended that provider and internal Pegasus
 passing in an AcceptLanguages object.&nbsp; See the Provider Developer  code use the "useThreadLocale" flag instead of explicity passing in an
 and Pegasus Developer sections for details.  AcceptLanguageList object.&nbsp; See the Provider Developer and Pegasus
 <br>&nbsp;  Developer sections for details. <br>
   &nbsp; </p>
 <p>The "useProcessLocale" flag can be used to tell MessageLoader to use <p>The "useProcessLocale" flag can be used to tell MessageLoader to use
 the default locale of the process, as determined by ICU.&nbsp; This is the default locale of the process, as determined by ICU.&nbsp; This is
 useful for situations where the caller is not localizing for a client request.&nbsp;  useful for situations where the caller is not localizing for a client
 The caller may itself be a client (eg. cimconfig), or may need to log messages  request.&nbsp; The caller may itself be a client (eg. cimconfig), or may
 to the system log in the locale of the Pegasus server process.&nbsp; See  need to log messages to the system log in the locale of the Pegasus
 the CLI Messages and Logger Messages sections below.  server process.&nbsp; See the CLI Messages and Logger Messages sections
 <br>&nbsp;  below. <br>
 <p>"Master switch"  &nbsp; </p>
 <br>The MessageLoader class has a public static Boolean variable called  <p>"Master switch" <br>
 _useProcessLocale that may be used to override all the AcceptLanguages  The MessageLoader class has a public static Boolean variable called
 and useThreadLocale settings in the MessageLoaderParms objects passed in.&nbsp;  _useProcessLocale that may be used to override all the AcceptLanguageList
 This is useful for CLI code (eg cimconfig) that needs to localize its messages  and useThreadLocale settings in the MessageLoaderParms objects passed
 based on the locale of its process, which refects the locale set by the  in.&nbsp; This is useful for CLI code (eg cimconfig) that needs to
 user running the CLI (eg. $LANG on Unix).&nbsp; The CLI code may call Pegasus  localize its messages based on the locale of its process, which refects
 APIs that are coded to use the Thread's AcceptLanguages, which will not  the locale set by the user running the CLI (eg. $LANG on Unix).&nbsp;
 be set in this case.&nbsp; The _useProcessLocale static variable tells  The CLI code may call Pegasus APIs that are coded to use the Thread's
 the MessageLoader to ignore the AcceptLanguages, useThreadLocale, and useProcessLocale  AcceptLanguageList, which will not be set in this case.&nbsp; The
 settings in MessageLoaderParms that it gets.&nbsp; The MessageLoader will  _useProcessLocale static variable tells the MessageLoader to ignore the
 use the default process locale, as determined by ICU, in this case.  AcceptLanguageList, useThreadLocale, and useProcessLocale settings in
 <br>&nbsp;  MessageLoaderParms that it gets.&nbsp; The MessageLoader will use the
 <p><i>Important Note:</i>&nbsp; The MessageLoader defaults to <i>not </i>use  default process locale, as determined by ICU, in this case. <br>
 the "fallback" mechanism described in the ICU Resource Management section.&nbsp;  &nbsp; </p>
 This is because the Accept-Language header itself describes the fallback  <p><i>Important Note:</i>&nbsp; The MessageLoader does <i>not</i> use
 that the client wants.&nbsp; However, the MessageLoader does "fallback"  the "fallback" mechanism described in the ICU Resource Management
 to the root resource bundle if none of the languages in AcceptLanguages  section.&nbsp; This is because the Accept-Language header itself
 can be found.&nbsp; If the root resource bundle cannot be found, then the  describes the fallback that the client wants.&nbsp; If the
 default_msg is returned.&nbsp; The "useICUFallback" flag can be set to  MessageLoader cannot find a message file for any of the languages
 have MessageLoader use ICU fallback on all message load attempts.&nbsp;  in the AcceptLanguageList, it will try the default process locale.
 However, usage of this flag for client requests may lead to incorrect results.&nbsp;  If this fails, the ICU root resource bundle will be tried.<br>
 For example, a client sets Accept-Language to french, german, and spanish,  &nbsp; </p>
 in that order, but there is no french resource bundle.&nbsp; A call to  <p>Please refer to the following files for details on the new Pegasus
 MessageLoader with useICUfallback == true would cause the root resource  classes. <br>
 bundle string to be returned on the attempt to load from the french bundle.&nbsp;  &nbsp; </p>
 But the client requested german to be the fallback after french.  
 <br>&nbsp;  
 <p>Please refer to the following files for details on the new Pegasus classes.  
 <br>&nbsp;  
 <ul> <ul>
 <li>    <li> pegasus/src/Pegasus/Common/MessageLoader.h</li>
 pegasus/src/Pegasus/Common/MessageLoader.h</li>  </ul>
   <h4> 2.2.4 Message Loading Example</h4>
   <p><br>
   The following example shows how a message may be loaded using the
   classes described above.&nbsp; Note: this a generic example.&nbsp; Each
   of the developer sections below have 'real-life' examples that are
   better suited to each type of code. </p>
   <p>// Build an AcceptLanguageList with some language elements <br>
   AcceptLanguageList acceptLangs; <br>
   acceptLangs.insert(LanguageTag("fr"), 0.5); <br>
   acceptLangs.insert(LanguageTag("de"), 0.8); <br>
   acceptLangs.insert(LanguageTag("es"), 0.4); </p>
   <p>// Construct a MessageLoaderParms <br>
   MessageLoaderParms parms("msgID", "default message"); <br>
   parms. msg_src_path = "/my_msg_dir/my_bundle"; <br>
   parms.acceptlanguages = acceptLangs; </p>
   <p>// Note: If you have args, set them into MessageLoaderParms </p>
   <p>// Load the localized String <br>
   String localizedMsg = MessageLoader::getMessage(parms); <br>
   &nbsp; <br>
   &nbsp; </p>
   <h4> 2.2.5 Message Writing Guidelines</h4>
   <p><br>
   Here are some basic rules for writing messages: <br>
   &nbsp; </p>
   <ul>
     <li> If you want to claim that you are globalized, no hardcoded
   messages!</li>
     <li> Avoid creating a message in the code by combining other
   messages.&nbsp; When you do this you are assuming that you know the
   grammar for every language.</li>
     <li> String substitutions into messages are generally untranslated,
   ie. not loaded from the resource bundle.&nbsp;&nbsp; Example: a file
   name.</li>
     <li> Avoid jargon, humour, and cultural idioms.&nbsp; Use full
   sentences.&nbsp; Have your messages reviewed by your globalization
   team.&nbsp; Your messages need to make sense to the translators, and
   ultimately the customer.</li>
     <li> <b>TODO </b>- find a good message writing guide to link to</li>
 </ul> </ul>
  
 <h4>  <p><b>When do I create a new message ?</b></p>
 2.2.4 Message Loading Example</h4>  
  
 <p><br>The following example shows how a message may be loaded using the  <p>A new message should be created if a message is needed with a content not
 classes described above.&nbsp; Note: this a generic example.&nbsp; Each  described by any existing message.</p>
 of the developer sections below have 'real-life' examples that are better  
 suited to each type of code.  <p>A new message should be created if the number or placement of substitution
 <p>// Build an AcceptLanguages with some language elements  parameters of an existing message would require an update.</p>
 <br>AcceptLanguages acceptLangs;  
 <br>acceptLangs.add(AcceptLanguageElement("fr", 0.5));  <p>It is not necessary to create a new message if just the text of the message
 <br>acceptLangs.add(AcceptLanguageElement("de", 0.8));  is changed, while the meaning is kept. For instance if the
 <br>acceptLangs.add(AcceptLanguageElement("es", 0.4));  event(error,warning,whatever) is described more precisely by the new message
 <p>// Construct a MessageLoaderParms  text, it is not necessary to create a new message, but the existing one should
 <br>MessageLoaderParms parms("msgID", "default message");  be updated.</p>
 <br>parms. msg_src_path = "/my_msg_dir/my_bundle";  
 <br>parms.acceptlanguages = acceptLangs;  <p><b>Are there any special considerations while creating a new message ? </b></p>
 <p>// Note: If you have args, set them into MessageLoaderParms  
 <p>// Load the localized String  
 <br>String localizedMsg = MessageLoader::getMessage(parms);  
 <br>&nbsp;  
 <br>&nbsp;  
 <h4>  
 2.2.4 Message Writing Guidelines</h4>  
  
 <p><br>Here are some basic rules for writing messages:  
 <br>&nbsp;  
 <ul> <ul>
 <li>  <li>If a message definition contains text within a single quote
 If you want to claim that you are globalized, no hardcoded messages!</li>  it is not interpreted in any way.
  
 <li>  <p><i>Example:</i></p>
 Avoid combining messages in the code from other messages.&nbsp; When you  <p> Server.CIMOperationRequestAuthorizer.NOT_IN_AUTHORIZED_GRP:
 do this you are assuming that you know the grammar for every language.</li>      string {"PGS05202: User '{0}' is not authorized to access CIM data."}
   </p>
 <li>  
 String substitutions into messages are generally untranslated, ie. not  <p><i>Processed message:</i></p>
 loaded from the resource bundle.&nbsp;&nbsp; Example: a file name.</li>  <p>  User {0} is not authorized to access CIM data.  </p>
   </li>
 <li>  
 Avoid jargon, humour, and cultural idioms.&nbsp; Use full sentences.&nbsp;  <li> For a single quote to appear in a processed message, it needs to be preceded by
 Have your messages reviewed by your globalization team.&nbsp; Your messages  another single quote.
 need to make sense to the translators, and ultimately the customer.</li>  
   <p><i>Example:</i></p>
   <p> Server.CIMOperationRequestAuthorizer.NOT_IN_AUTHORIZED_GRP:
       string {"PGS05202: User ''{0}'' is not authorized to access CIM data."}
   </p>
   
   <p><i>Processed message:</i></p>
   <p>  User 'wbemuser' is not authorized to access CIM data.  </p>
   </li>
  
 <li>  <li> For a double quote to appear in a processed message, it needs to be preceded by
 <b>TODO </b>- find a good message writing guide to link to</li>  a back slash.
   
   <p><i>Example:</i></p>
   <p>
   ControlProviders.ProviderRegistrationProvider.ProviderRegistrationProvider.
   UNSUPPORTED_USERCONTEXT_VALUE:string {"PGS03029: Unsupported UserContext
   value: \"{0}\"."}
   </p>
   
   <p><i>Processed message:</i></p>
   <p>  Unsupported UserContext value: "10".  </p>
   </li>
 </ul> </ul>
  
 <h4>  <p>&nbsp;</p>
 2.2.5 Localized Exceptions</h4>  
   <p><b>How do I write a platform specific
   message ? </b></p>
   
   <p>Platform specific messages generate in a non-platform specific source file
   should be formatted with a .&lt;platform&gt; or .STANDARD suffix.</p>
  
 <p><br>The base Exception class, and derived classes, have been updated  <p><i>Example:</i></p>
 to support localization.&nbsp; Constructors have been added that take a  <p>Compiler.cmdline.cimmof.cmdline.MENU.PEGASUS_OS_HPUX</p>
 MessageLoaderParms object.&nbsp; These constructors will use the MessageLoaderParms  <p>Compiler.cmdline.cimmof.cmdline.MENU.PEGASUS_OS_OS40</p>
 object to call the MessageLoader to load the localized exception message.&nbsp;  <p>Compiler.cmdline.cimmof.cmdline.MENU.STANDARD</p>
 The localized message is saved in the Exception.&nbsp; The ContentLanguages  
 object returned by MessageLoader is also saved in the Exception.&nbsp;  <p>&nbsp;</p>
 This indicates the language of the message.&nbsp; The ContentLanguages  
 object is used later to set the Content-Language header in the HTTP message  <p><b>Where should I place platform specific
 to the client.  messages ? </b></p>
 <br>&nbsp;  
   <p>As described in the message bundle file pegasusServer_en.txt messages belong
   into the section corresponding the file they are created in. This does account
   the same to platform specific messages.</p>
   <p>If a message is generated inside a source file not specific to a single
   platform, the message should be part of the message bundle section of that
   source file.</p>
   <p>If a new platform specific message is generated inside a platform specific
   source file, the message belongs to the platform specific section of the
   message bundle file.</p>
   
   <p><i>Examples:</i></p>
   
   <p>ProviderManager.ProviderAgent.ProviderAgent.UNINITIALIZED_SECURITY_SETUP.PEGASUS_OS_ZOS
   - this message is and should be part of the section for the ProviderAgent as it
   is generated inside the provider agent and not a z/OS platform specific file</p>
   <p>Common.safCheckzOS_inline.BAD_WBEM_SECURITY_SETUP - this message does and
   should reside inside the platform specific section as the message is generated
   in a z/OS platform only file</p>
   
   <p>&nbsp;</p>
   
   <h4> 2.2.5 Localized Exceptions</h4>
   <p><br>
   The base Exception class, and derived classes, have been updated to
   support localization.&nbsp; Constructors have been added that take a
   MessageLoaderParms object.&nbsp; These constructors will use the
   MessageLoaderParms object to call the MessageLoader to load the
   localized exception message.&nbsp; The localized message is saved in the
   Exception.&nbsp; The ContentLanguageList object returned by MessageLoader
   is also saved in the Exception.&nbsp; This indicates the language of
   the message.&nbsp; The ContentLanguageList object is used later to set the
   Content-Language header in the HTTP message to the client. <br>
   &nbsp; </p>
 <p>The old Exception constructors that take a String will remain.&nbsp; <p>The old Exception constructors that take a String will remain.&nbsp;
 These should be used in cases where the code throwing the exception is These should be used in cases where the code throwing the exception is
 not localized, or the String is not localized (for example, a file name).&nbsp;  not localized, or the String is not localized (for example, a file
 Also, there are several exceptions in Pegasus where the String parameter  name).&nbsp; Also, there are several exceptions in Pegasus where the
 is meant to be a non-localized substitution in a localized message owned  String parameter is meant to be a non-localized substitution in a
 by the Exception (see InternalException.h, ClassNotResolved for an example).&nbsp;  localized message owned by the Exception (see InternalException.h,
 The old constructors for these have been kept.  ClassNotResolved for an example).&nbsp; The old constructors for these
 <br>&nbsp;  have been kept. <br>
 <br>&nbsp;  &nbsp; <br>
 <h2>  &nbsp; </p>
 3.0 Provider Developers</h2>  <h2> 3.0 Provider Developers</h2>
 &nbsp; &nbsp;
 <h3>  <h3> 3.1 Design Issues</h3>
 3.1 Design Issues</h3>  <p><br>
   Providers that wish to globalize should consider the following in their
 <p><br>Providers that wish to globalize should consider the following in  design: <br>
 their design:  &nbsp; </p>
 <br>&nbsp;  
 <ul> <ul>
 <li>    <li> Are there localized string properties that need to be
 Are there localized string properties that need to be supported?&nbsp;  supported?&nbsp; If so, then the client will use Accept-Language to
 If so, then the client will use Accept-Language to request specific languages  request specific languages for these properties.&nbsp; If the properties
 for these properties.&nbsp; If the properties are read-only, use MessageLoader  are read-only, use MessageLoader to load the localized strings for the
 to load the localized strings for the properties.</li>  properties.</li>
     <li> If you have a localized read/write string property, then the
 <li>  client will use Content-Language to set the property with an associated
 If you have a localized read/write string property, then the client will  language.&nbsp; The client will expect to be able to retrieve the
 use Content-Language to set the property with an associated language.&nbsp;  property in that same language later (using Accept-Language).</li>
 The client will expect to be able to retrieve the property in that same    <li> Note: only the string property types in CIM are candidates for
 language later (using Accept-Language).</li>  localization.&nbsp; The other types, including datetime, are
   locale-neutral.</li>
 <li>    <li> Are there error messages that need to returned to the client in
 Note: only the string property types in CIM are candidates for localization.&nbsp;  different languages?&nbsp; The client will use Accept-Language to
 The other types, including datetime, are locale-neutral.</li>  request specific languages for the error messages.</li>
     <li> What resource bundle translations, if any, will be shipped with
 <li>  the provider?</li>
 Are there error messages that need to returned to the client in different    <li> Do any codepage conversions need to be done between the UTF-16
 languages?&nbsp; The client will use Accept-Language to request specific  characters in the String objects and the codepage of data stored on the
 languages for the error messages.</li>  system?&nbsp; This is a concern for EBCDIC platforms.&nbsp; All EBCDIC
   data needs to be converted to at least 7-bit ASCII before it is passed
 <li>  into the String object.</li>
 What resource bundle translations, if any, will be shipped with the provider?</li>  
   
 <li>  
 Do any codepage conversions need to be done between the UTF-16 characters  
 in the String objects and the codepage of data stored on the system?&nbsp;  
 This is a concern for EBCDIC platforms.&nbsp; All EBCDIC data needs to  
 be converted to at least 7-bit ASCII before it is passed into the String  
 object.</li>  
 </ul> </ul>
   <p><br>
 <p><br>To help providers handle the situations described above, Pegasus  To help providers handle the situations described above, Pegasus 2.3
 2.3 will pass the Accept-Language received from the client to the provider.&nbsp;  will pass the Accept-Language received from the client to the
 The provider should load strings from its resource bundle based on the  provider.&nbsp; The provider should load strings from its resource
 client's Accept-Language.&nbsp; The client's Accept-Language is passed  bundle based on the client's Accept-Language.&nbsp; The client's
 to the provider in two ways:  Accept-Language is passed to the provider in two ways: <br>
 <br>&nbsp;  &nbsp; </p>
 <ul> <ul>
 <li>    <li> Pegasus will set the Accept-Language from the client into the
 Pegasus will set the Accept-Language from the client into the thread in  thread in which the provider is running.&nbsp; By using the
 which the provider is running.&nbsp; By using the useThreadLocale setting  useThreadLocale setting in MessageLoaderParms, providers can easily load
 in MessageLoaderParms, providers can easily load strings using the client's  strings using the client's requested Accept-Language.&nbsp; The
 requested Accept-Language.&nbsp; The provider does not need to know what  provider does not need to know what the Accept-Language is.&nbsp; This
 the Accept-Language is.&nbsp; This is the recommended method to load messages  is the recommended method to load messages based on the client's request.</li>
 based on the client's request.</li>    <br>
   &nbsp; <li> The OperationContext will contain an AcceptLanguageList object
 <br>&nbsp;  that has the Accept-Language requested by the client.&nbsp; The provider
 <li>  can use this AcceptLanguageList object to load strings with MessageLoader.</li>
 The OperationContext will contain an AcceptLanguages object that has the  
 Accept-Language requested by the client.&nbsp; The provider can use this  
 AcceptLanguages object to load strings with MessageLoader.</li>  
 </ul> </ul>
   <p><br>
 <p><br>The OperationContext will also contain a ContentLanguages object  The OperationContext will also contain a ContentLanguageList object that
 that is set from the Content-Language in the client request.&nbsp; This  is set from the Content-Language in the client request.&nbsp; This is
 is the language of the CIM objects being passed to the provider on that  the language of the CIM objects being passed to the provider on that
 request.&nbsp; A localized provider should store the content language along  request.&nbsp; A localized provider should store the content language
 with the data from the CIM objects.&nbsp; This will allow the client to  along with the data from the CIM objects.&nbsp; This will allow the
 use Accept-Language later to retreive the data in that language.  client to use Accept-Language later to retreive the data in that
 <br>&nbsp;  language. <br>
 <p>The provider should indicate the language of CIM objects it is returning  &nbsp; </p>
 by calling setLanguage( ) on the ResponseHandler.&nbsp; This will be used  <p>The provider should indicate the language of CIM objects it is
 to set the Content-Language in the CIM response message sent back to the  returning by calling setContext( ) on the ResponseHandler.&nbsp; This
 client.&nbsp; If setLanguage( ) is not called, then no Content-Language  will be used to set the Content-Language in the CIM response message
 will be returned to the client.&nbsp; setLanguage( ) should only be called  sent back to the client.&nbsp; If setContext( ) is not called, then no
 once per response.  Content-Language will be returned to the client.&nbsp; The setContext( )
 <br>&nbsp;  function should only be called once per response. <br>
 <h3>  &nbsp; </p>
 3.2 Sample Code</h3>  <h3> 3.2 Sample Code</h3>
   <p><br>
 <p><br>The following sample code shows a localized getInstance( ) where  The following sample code shows a localized getInstance( ) where the
 the instance returned is localized based on the Accept-Language of the  instance returned is localized based on the Accept-Language of the
 client request.&nbsp; Note that this example also throws a localized exception.  client request.&nbsp; Note that this example also throws a localized
 <br>&nbsp;  exception. <br>
 <p>void LocalizedProvider::getInstance(  &nbsp; </p>
 <br>&nbsp;&nbsp;&nbsp; const OperationContext &amp; context,  <p>void LocalizedProvider::getInstance( <br>
 <br>&nbsp;&nbsp;&nbsp; const CIMObjectPath &amp; instanceReference,  &nbsp;&nbsp;&nbsp; const OperationContext &amp; context, <br>
 <br>&nbsp;&nbsp;&nbsp; const Boolean includeQualifiers,  &nbsp;&nbsp;&nbsp; const CIMObjectPath &amp; instanceReference, <br>
 <br>&nbsp;&nbsp;&nbsp; const Boolean includeClassOrigin,  &nbsp;&nbsp;&nbsp; const Boolean includeQualifiers, <br>
 <br>&nbsp;&nbsp;&nbsp; const CIMPropertyList &amp; propertyList,  &nbsp;&nbsp;&nbsp; const Boolean includeClassOrigin, <br>
 <br>&nbsp;&nbsp;&nbsp; InstanceResponseHandler &amp; handler)  &nbsp;&nbsp;&nbsp; const CIMPropertyList &amp; propertyList, <br>
 <br>{  &nbsp;&nbsp;&nbsp; InstanceResponseHandler &amp; handler) <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp; // convert a potential fully qualified reference  { <br>
 into a local reference  &nbsp;&nbsp;&nbsp;&nbsp; // convert a potential fully qualified
 <br>&nbsp;&nbsp;&nbsp;&nbsp; // (class name and keys only).  reference into a local reference <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp; CIMObjectPath localReference = CIMObjectPath(  &nbsp;&nbsp;&nbsp;&nbsp; // (class name and keys only). <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String(),  &nbsp;&nbsp;&nbsp;&nbsp; CIMObjectPath localReference = CIMObjectPath( <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String(),  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String(), <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; instanceReference.getClassName(),  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String(), <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; instanceReference.getKeyBindings());  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <p>&nbsp;&nbsp;&nbsp;&nbsp; // begin processing the request  instanceReference.getClassName(), <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp; handler.processing();  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Find the instance to be returned.  instanceReference.getKeyBindings()); </p>
 <br>&nbsp;&nbsp;&nbsp;&nbsp; Uint32 i;  <p>&nbsp;&nbsp;&nbsp;&nbsp; // begin processing the request <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp; Uint32 n = _instances.size();  &nbsp;&nbsp;&nbsp;&nbsp; handler.processing(); </p>
 <br>&nbsp;&nbsp;&nbsp;&nbsp; for (i = 0;&nbsp; i &lt; n;&nbsp; i++)  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Find the instance to be returned. <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp; {  &nbsp;&nbsp;&nbsp;&nbsp; Uint32 i; <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(localReference  &nbsp;&nbsp;&nbsp;&nbsp; Uint32 n = _instances.size(); <br>
 == _instanceNames[i])  &nbsp;&nbsp;&nbsp;&nbsp; for (i = 0;&nbsp; i &lt; n;&nbsp; i++) <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {  &nbsp;&nbsp;&nbsp;&nbsp; { <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // We found the instance to return  if(localReference == _instanceNames[i]) <br>
   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>
   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
   // We found the instance to return </p>
 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // Build the parameters for loading the localized string property.  // Build the parameters for loading the localized string property. <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // We are going to let the message loader parameters default to use the  // We are going to let the message loader parameters default to use the <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // AcceptLanguages that Pegasus set into our thread.  // AcceptLanguageList that Pegasus set into our thread. <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // (this equals the AcceptLanguages requested by the client)  // (this equals the AcceptLanguageList requested by the client) <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // Note: This parms object could be constructed once and  // Note: This parms object could be constructed once and <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // reused.  // reused. <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 MessageLoaderParms parms("myMsgID", "myDefaultString");  MessageLoaderParms parms("myMsgID", "myDefaultString"); <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 parms.msg_src_path = "/myprovider/msg/myResourceBundle";  parms.msg_src_path = "/myprovider/msg/myResourceBundle"; </p>
 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // Load the string for the localized property from the resource bundle  // Load the string for the localized property from the resource bundle <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 String localizedString = MessageLoader::getMessage(parms);  String localizedString = MessageLoader::getMessage(parms); </p>
 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // Remove the old property from the instance to be returned  // Remove the old property from the instance to be returned <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 Uint32 index = instances[i].findProperty("myProperty");  Uint32 index = instances[i].findProperty("myProperty"); <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 if (index != PEG_NOT_FOUND)  if (index != PEG_NOT_FOUND) <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 {  { <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 _instances[i].removeProperty(index);  _instances[i].removeProperty(index); <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 }  } </p>
 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
 // Add the localized string property to the instance  
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
 instances[i].addProperty(CIMProperty("myProperty", localizedString));  
 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // The MessageLoader set the contentlanguages member  // Add the localized string property to the instance <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // of parms to the language that it found for the message.  instances[i].addProperty(CIMProperty("myProperty", localizedString)); </p>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
 ContentLanguages rtnLangs = parms.contentlanguages;  
 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // We need to tag the instance we are returning with the  // The MessageLoader set the contentlanguages member <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // the content language.  // of parms to the language that it found for the message. <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 handler.setLanguages(rtnLangs);  ContentLanguageList rtnLangs = parms.contentlanguages; </p>
 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // deliver requested instance  // We need to tag the instance we are returning with the <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// the
   content language. <br>
   &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
   &nbsp;OperationContext context;<br>
   &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
   &nbsp;context.insert(ContentLanguageListContainer(rtnLangs));<br>
   &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
   &nbsp;handler.setContext(context);<br>
   </p>
   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
   // deliver requested instance<br>
   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 handler.deliver(_instances[i]); handler.deliver(_instances[i]);
 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 break;  break; <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; end if  }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; end if <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // end for  }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //
   end for </p>
 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // throw an exception if <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // throw an exception if
 the instance wasn't found  the instance wasn't found <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i == n)  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i == n) <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // Build the parameters for loading the localized error message.  // Build the parameters for loading the localized error message. <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // We are going to let the message loader parameters default to use the  // We are going to let the message loader parameters default to use the <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // AcceptLanguages that Pegasus set into our thread.  // AcceptLanguageList that Pegasus set into our thread. <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // (this equals the AcceptLanguages requested by the client)  // (this equals the AcceptLanguageList requested by the client) <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // Note: This parms object could be constructed once and  // Note: This parms object could be constructed once and <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // reused.  // reused. <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 MessageLoaderParms errParms("myErrorMsgID", "myErrorDefaultString");  MessageLoaderParms errParms("myErrorMsgID", "myErrorDefaultString"); <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 errParms.msg_src_path = "/myprovider/msg/myResourceBundle";  errParms.msg_src_path = "/myprovider/msg/myResourceBundle"; </p>
 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // Note: the exception calls MessageLoader::getMessage( )  // Note: the exception calls MessageLoader::getMessage( ) <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 // Note: no need to call handler.setLanguages( ) in this case  // Note: no need to call handler.setContext( ) in this case <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 throw CIMObjectNotFoundException(errParms);  throw CIMObjectNotFoundException(errParms); <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>
 <br>&nbsp;  &nbsp; </p>
 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // complete processing the  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // complete processing
 request  the request <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handler.complete();  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handler.complete(); <br>
 <br>}  } <br>
 <br>&nbsp;  &nbsp; </p>
 <p>NOTE: A sample provider has been written that fully demonstates the <p>NOTE: A sample provider has been written that fully demonstates the
 design issues described above.&nbsp; This provider is located at:  design issues described above.&nbsp; This provider is located at: <br>
 <br>&nbsp;  &nbsp; </p>
 <ul> <ul>
 <li>    <li> pegasus/src/Providers/sample/LocalizedProvider/</li>
 pegasus/src/Providers/sample/LocalizedProvider/</li>  
 </ul> </ul>
   <p><br>
 <p><br>This sample provider also demonstrates how some of the special issues  This sample provider also demonstrates how some of the special issues
 can be handled.&nbsp; The special issues are caused by having a read/only  can be handled.&nbsp; The special issues are caused by having a
 localized property and a read/write localized property.&nbsp; What happens  read/only localized property and a read/write localized property.&nbsp;
 if the client sets the read/write property with a Content-Language that  What happens if the client sets the read/write property with a
 is not one of the supported languages for the read/only property?&nbsp;  Content-Language that is not one of the supported languages for the
 This provider allows the client to set any language into the read/write  read/only property?&nbsp; This provider allows the client to set any
 property, and get that property back in the same language.&nbsp; This becomes  language into the read/write property, and get that property back in the
 an issue when the client does a getInstance( ) later, because the Content-Language  same language.&nbsp; This becomes an issue when the client does a
 on the returned instance applies to all the properties.&nbsp; A related  getInstance( ) later, because the Content-Language on the returned
 issue is what to return for Content-Language when the client does enumerateInstances,  instance applies to all the properties.&nbsp; A related issue is what to
 but the instances have different languages.&nbsp; Recall that Content-Language  return for Content-Language when the client does enumerateInstances,
 applies to the entire response (a limitation in the CIM specification).  but the instances have different languages.&nbsp; Recall that
 <br>&nbsp;  Content-Language applies to the entire response (a limitation in the CIM
 <p>NOTE:&nbsp; Indication Providers have other special considerations for  specification). <br>
 language support.&nbsp; Please refer to&nbsp; PEP58.  &nbsp; </p>
 <br>&nbsp;  <p>NOTE:&nbsp; Indication Providers have other special considerations
 <p>NOTE:&nbsp; The CMPI interface has been updated for language support.&nbsp;  for language support.&nbsp; Please refer to&nbsp; PEP58. <br>
 Please refer to the CMPI documentation for details.  &nbsp; </p>
 <br>&nbsp;  <p>NOTE:&nbsp; The CMPI interface has been updated for language
 <p>NOTE: SPECIAL ISSUES FOR OS/400 PROVIDERS:  support.&nbsp; Please refer to the CMPI documentation for details. <br>
   &nbsp; </p>
   <p>NOTE: SPECIAL ISSUES FOR OS/400 PROVIDERS: </p>
 <ul> <ul>
 <li>    <li> Convert between UTF-16 in the String objects and EBCDIC system
 Convert between UTF-16 in the String objects and EBCDIC system data as  data as needed.&nbsp; The converters in
 needed.&nbsp; The converters in Pegasus/Common/OS400ConvertChar.h may be  Pegasus/Common/OS400ConvertChar.h may be used to convert between EBCDIC
 used to convert between EBCDIC CCSID 37 and ASCII CCSID 819 (a subset of  CCSID 37 and ASCII CCSID 819 (a subset of UTF-16).</li>
 UTF-16).</li>    <li> The Pegasus program, and all bound service programs,&nbsp; will
   run in a UTF-8 locale even though the job CCSID is 37.&nbsp; The
 <li>  C-runtime library (printf, fopen, isalpha, strcmp, etc) will expect
 The Pegasus program, and all bound service programs,&nbsp; will run in  UTF-8, or at least 7-bit ASCII, characters.</li>
 a UTF-8 locale even though the job CCSID is 37.&nbsp; The C-runtime library    <li> Consideration should be given to the codepage for the compiled
 (printf, fopen, isalpha, strcmp, etc) will expect UTF-8, or at least 7-bit  string literals.&nbsp; Use #pragma convert as needed.&nbsp; But,
 ASCII, characters.</li>  remember that the C-runtime will expect UTF-8.</li>
     <li> For more details, refer to "Unicode support" in chapter 3 of the <u>ILE
 <li>  
 Consideration should be given to the codepage for the compiled string literals.&nbsp;  
 Use #pragma convert as needed.&nbsp; But, remember that the C-runtime will  
 expect UTF-8.</li>  
   
 <li>  
 For more details, refer to "Unicode support" in chapter 3 of the <u>ILE  
 C/C++ for iSeries Run-Time Functions, Version 5</u> publication for V5R3 C/C++ for iSeries Run-Time Functions, Version 5</u> publication for V5R3
 (SC41-5607-02).&nbsp; The Pegasus string literals will be compiled with (SC41-5607-02).&nbsp; The Pegasus string literals will be compiled with
 the UTF-8 compile switch described in this section.&nbsp; OS/400 provider  the UTF-8 compile switch described in this section.&nbsp; OS/400
 developers should strongly consider using the same compile switch for their  provider developers should strongly consider using the same compile
 string literals.&nbsp; This would allow the literals to match the UTF-8  switch for their string literals.&nbsp; This would allow the literals to
 encoding expected by the C-runtime.</li>  match the UTF-8 encoding expected by the C-runtime.</li>
 </ul> </ul>
   <h2> 4. 0 Client Developers</h2>
 <h2>  <p><br>
 4. 0 Client Developers</h2>  Methods have been added to CIMClient to set the Accept-Language and
   Content-Language on the request, and retrieve Content-Language on the
 <p><br>Methods have been added to CIMClient to set the Accept-Language  response.&nbsp; The language tags in the Accept-Language header must
 and Content-Language on the request, and retrieve Content-Language on the  meet the ISO-639 and ISO-3166 standards. <br>
 response.&nbsp; The language tags in the Accept-Language header must meet  &nbsp; </p>
 the ISO-639 and ISO-3166 standards.  <p>Please refer to <br>
 <br>&nbsp;  &nbsp; </p>
 <p>Please refer to  
 <br>&nbsp;  
 <ul> <ul>
 <li>    <li> pegasus/src/Pegasus/Client/CIMClient.h</li>
 pegasus/src/Pegasus/Client/CIMClient.h</li>    <br>
   &nbsp;
 <br>&nbsp;</ul>  </ul>
 for the new methods on CIMClient.  for the new methods on CIMClient. <br>
 <br>&nbsp;  &nbsp;
 <p>Here is a code fragment that uses the new methods on CIMClient  <p>Here is a code fragment that uses the new methods on CIMClient </p>
 <p>&nbsp;&nbsp;&nbsp; //  <p>&nbsp;&nbsp;&nbsp; // <br>
 <br>&nbsp;&nbsp;&nbsp; // Get a localized instance in French  &nbsp;&nbsp;&nbsp; // Get a localized instance in French <br>
 <br>&nbsp;&nbsp;&nbsp; //  &nbsp;&nbsp;&nbsp; // </p>
 <p>&nbsp;&nbsp; // Language priority is martian, pig-latin, and french.&nbsp;  <p>&nbsp;&nbsp; // Language priority is martian, pig-latin, and
 We should  french.&nbsp; We should <br>
 <br>&nbsp;&nbsp; // get french back, even though its the lowest priority  &nbsp;&nbsp; // get french back, even though its the lowest priority <br>
 <br>&nbsp; AcceptLanguages acceptLangs;  &nbsp; AcceptLanguageList acceptLangs; <br>
 <br>&nbsp; acceptLangs.add(AcceptLanguageElement("x-martian"));  &nbsp; acceptLangs.insert(LanguageTag("x-martian"), 1.0); <br>
 <br>&nbsp; acceptLangs.add(AcceptLanguageElement("fr", 0.1));  &nbsp; acceptLangs.insert(LanguageTag("fr"), 0.1); <br>
 <br>&nbsp; acceptLangs.add(AcceptLanguageElement("x-pig-latin", 0.4));  &nbsp; acceptLangs.insert(LanguageTag("x-pig-latin"), 0.4); </p>
 <p>&nbsp;&nbsp;&nbsp; // Set the requested languages into the CIMClient  <p>&nbsp;&nbsp;&nbsp; // Set the requested languages into the CIMClient <br>
 <br>&nbsp; client.setRequestAcceptLanguages(acceptLangs);  &nbsp; client.setRequestAcceptLanguages(acceptLangs); </p>
 <p>&nbsp;&nbsp; // Get the instance  <p>&nbsp;&nbsp; // Get the instance <br>
 <br>&nbsp; CIMInstance instance = client.getInstance(  &nbsp; CIMInstance instance = client.getInstance( <br>
 <br>&nbsp;&nbsp;&nbsp; NAMESPACE,  &nbsp;&nbsp;&nbsp; NAMESPACE, <br>
 <br>&nbsp;&nbsp;&nbsp; cimNInstances[0].buildPath(sampleClass),  &nbsp;&nbsp;&nbsp; cimNInstances[0].buildPath(sampleClass), <br>
 <br>&nbsp;&nbsp;&nbsp; localOnly,  &nbsp;&nbsp;&nbsp; localOnly, <br>
 <br>&nbsp;&nbsp;&nbsp; includeQualifiers,  &nbsp;&nbsp;&nbsp; includeQualifiers, <br>
 <br>&nbsp;&nbsp;&nbsp; includeClassOrigin);  &nbsp;&nbsp;&nbsp; includeClassOrigin); </p>
 <p>&nbsp; // Get the string property that should be french  <p>&nbsp; // Get the string property that should be french <br>
 <br>&nbsp; String returnedString;  &nbsp; String returnedString; <br>
 <br>&nbsp; instance.getProperty (  &nbsp; instance.getProperty ( <br>
 <br>&nbsp;&nbsp;&nbsp; instance.findProperty("myProp")).  &nbsp;&nbsp;&nbsp; instance.findProperty("myProp")). <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 getValue().  getValue(). <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 get(returnedString);  get(returnedString); </p>
 <p>&nbsp; // Check that we got back french  <p>&nbsp; // Check that we got back french <br>
 <br>&nbsp; ContentLanguages CL_FR("fr");  &nbsp; ContentLanguageList CL_FR(); <br>
 <br>&nbsp; String expectedFRString = "oui";  &nbsp; CL_FR.append(LanguageTag("fr")); <br>
 <br>&nbsp; PEGASUS_ASSERT(CL_FR == client.getResponseContentLanguages());  &nbsp; String expectedFRString = "oui"; <br>
 <br>&nbsp; PEGASUS_ASSERT(expectedFRString == returnedString);  &nbsp; PEGASUS_ASSERT(CL_FR == client.getResponseContentLanguages()); <br>
 <p>&nbsp;&nbsp;&nbsp; //  &nbsp; PEGASUS_ASSERT(expectedFRString == returnedString); </p>
 <br>&nbsp;&nbsp;&nbsp; // Create an instance in French  <p>&nbsp;&nbsp;&nbsp; // <br>
 <br>&nbsp;&nbsp;&nbsp; //  &nbsp;&nbsp;&nbsp; // Create an instance in French <br>
 <p>&nbsp;&nbsp; String oui = "Oui";  &nbsp;&nbsp;&nbsp; // </p>
 <br>&nbsp;&nbsp; CIMInstance frInstance(CLASSNAME);  <p>&nbsp;&nbsp; String oui = "Oui"; <br>
 <br>&nbsp;&nbsp; frInstance.addProperty(CIMProperty(  &nbsp;&nbsp; CIMInstance frInstance(CLASSNAME); <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp; frInstance.addProperty(CIMProperty( <br>
 CIMName("myProp"),  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  CIMName("myProp"), <br>
 oui));  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <p>&nbsp;&nbsp; CIMObjectPath frInstanceName = frInstance.buildPath(sampleClass);  oui)); </p>
 <p>&nbsp;&nbsp; client.setRequestContentLanguages(CL_FR);  <p>&nbsp;&nbsp; CIMObjectPath frInstanceName =
 <p>&nbsp;&nbsp; client.createInstance(NAMESPACE, frInstance);  frInstance.buildPath(sampleClass); </p>
 <br>&nbsp;  <p>&nbsp;&nbsp; client.setRequestContentLanguages(CL_FR); </p>
 <br>&nbsp;  <p>&nbsp;&nbsp; client.createInstance(NAMESPACE, frInstance); <br>
 <br>&nbsp;  &nbsp; <br>
 <p>Also, refer to  &nbsp; <br>
   &nbsp; </p>
   <p>Also, refer to </p>
 <ul> <ul>
 <li>    <li> pegasus/src/Clients/g11ntest/</li>
 pegasus/src/Clients/g11ntest/</li>  
 </ul> </ul>
 for more examples of a client that uses Accept-Language and Content-Language.  for more examples of a client that uses Accept-Language and
 <br>&nbsp;  Content-Language. <br>
   &nbsp;
 <p>NOTE:&nbsp; Consideration should be given for converting the UTF-16 <p>NOTE:&nbsp; Consideration should be given for converting the UTF-16
 characters in the String objects passed over the CIMClient interface to characters in the String objects passed over the CIMClient interface to
 a platform codepage.&nbsp; This is especially needed for EBCDIC platforms.&nbsp;  a platform codepage.&nbsp; This is especially needed for EBCDIC
 See the Provider developer section for details of the EBCDIC considerations.  platforms.&nbsp; See the Provider developer section for details of the
 <br>&nbsp;  EBCDIC considerations. <br>
 <br>&nbsp;  &nbsp; <br>
 <h3>  &nbsp; </p>
 4.1 Default Process Locale</h3>  <h3> 4.1 Default Process Locale</h3>
   <p><br>
 <p><br>A method has been added to CIMClient to set the Accept-Language  A method has been added to CIMClient to set the Accept-Language for the
 for the requests based on the default locale of the process, as determined  requests based on the default locale of the process, as determined by
 by ICU.&nbsp; If ICU is installed on the client system then CIMClient will  ICU.&nbsp; If ICU is installed on the client system then CIMClient will
 set the Accept-Language from the default ICU process locale.&nbsp; If ICU  set the Accept-Language from the default ICU process locale.&nbsp; If
 is not installed then the caller is required to set an AcceptLanguages  ICU is not installed then the caller is required to set an
 into CIMClient that meets the ISO-639 and IS0-3166 standards.&nbsp; Note:&nbsp;  AcceptLanguageList into CIMClient that meets the ISO-639 and IS0-3166
 this is useful for local clients, such as the Pegasus CLIs, where ICU would  standards.&nbsp; Note:&nbsp; this is useful for local clients, such as
 be installed on both the client and server sides.  the Pegasus CLIs, where ICU would be installed on both the client and
 <br>&nbsp;  server sides. <br>
 <br>&nbsp;  &nbsp; <br>
 <h2>  &nbsp; </p>
 5. 0 Pegasus Developers</h2>  <h2> 5. 0 Pegasus Developers</h2>
   <p><br>
 <p><br>The design for Pegasus releases beyond 2.3 is to avoid using hardcoded  The design for Pegasus releases beyond 2.3 is to avoid using hardcoded
 messages.&nbsp; All new messages should be loaded from a Pegasus resource  messages.&nbsp; All new messages should be loaded from a Pegasus
 bundle.&nbsp; This section describes the process to follow if you are creating  resource bundle.&nbsp; This section describes the process to follow if
 a new message.&nbsp; The process depends on where you are in the code.  you are creating a new message.&nbsp; The process depends on where you
 <br>&nbsp;  are in the code. <br>
 <br>&nbsp;  &nbsp; <br>
 <h3>  &nbsp; </p>
 <b>5.1 Pegasus Resource Bundles</b></h3>  <h3> <b>5.1 Pegasus Resource Bundles</b></h3>
   <p><br>
 <p><br>Place any new Pegasus messages into one of the following resource  Place any new Pegasus messages into one of the following resource
 bundles:  bundles: <br>
 <br>&nbsp;  &nbsp; </p>
 <ul> <ul>
 <li>    <li> pegasus/src/Pegasus/msg/Server/pegasusServer_*.txt&nbsp; for
 pegasus/src/Pegasus/msg/Server/pegasusServer_*.txt&nbsp; for server and  server and MOF compiler (cimmof, cimmofl) messages</li>
 MOF compiler (cimmof, cimmofl) messages</li>    <li> pegasus/src/Pegasus/msg/CLI/pegasusCLI_*.txt for all CLI messages
   (except the MOF compiler)</li>
 <li>  
 pegasus/src/Pegasus/msg/CLI/pegasusCLI_*.txt for all CLI messages (except  
 the MOF&nbsp;compiler)</li>  
 </ul> </ul>
   <p><br>
 <p><br>The make messages target will compile these resource bundles.  The make messages target will compile these resource bundles. </p>
 <p>Note:&nbsp; As described above, the resource bundle path in MessageLoaderParms  <p>Note:&nbsp; As described above, the resource bundle path in
 defaults to the server resource bundle.&nbsp; For CLI messages, you will  MessageLoaderParms defaults to the server resource bundle.&nbsp; For CLI
 need to specify the bundle for your CLI.  messages, you will need to specify the bundle for your CLI. <br>
 <br>&nbsp;  &nbsp; </p>
 <h3>  <h3> 5.2 Server Messages</h3>
 5.2 Server Messages</h3>  <p><br>
   For messages returned from one of the services in the Pegasus server
 <p><br>For messages returned from one of the services in the Pegasus server  
 (eg. CIMOperationRequestDispatcher, or ProviderManagerService), the goal (eg. CIMOperationRequestDispatcher, or ProviderManagerService), the goal
 is to make it easy for any code in the call chain to throw an exception is to make it easy for any code in the call chain to throw an exception
 with a localized error string.&nbsp; The code throwing the exception will  with a localized error string.&nbsp; The code throwing the exception
 not need to know the Accept-Language that the client requested.&nbsp; To  will not need to know the Accept-Language that the client
 understand how this works, some design points need to described:  requested.&nbsp; To understand how this works, some design points need
 <br>&nbsp;  to described: <br>
 <p><b>Server Design Points:</b>  &nbsp; </p>
 <br>&nbsp;  <p><b>Server Design Points:</b> <br>
 <p>The CIMMessage object has been expanded to include an AcceptLanguages  &nbsp; </p>
 object and a ContentLanguages object.&nbsp; For CIMRequestMessage, these  <p>The CIMMessage object has been expanded to include an
 objects contain the Accept-Language and Content-Language headers that were  AcceptLanguageList object and a ContentLanguageList object in its
 built from the client request.&nbsp; For CIMResponseMessage, the ContentLanguages  OperationContext member.&nbsp; For
 object is used to build the Content-Language header associated with the  CIMRequestMessage, these objects contain the Accept-Language and
 CIM <i>objects </i>in the response message.&nbsp; The AcceptLanguages object  Content-Language headers that were built from the client request.&nbsp;
 in the CIMResponseMessage is ignored.  For CIMResponseMessage, the ContentLanguageList object is used to build the
 <br>&nbsp;  Content-Language header associated with the CIM <i>objects </i>in the
 <p>The localization of the cimException object in the CIMResponseMessage  response message.&nbsp; The AcceptLanguageList object in the
 is handled separately from the CIM objects.&nbsp; The message string in  CIMResponseMessage is ignored. <br>
 the cimException object is assumed to have been localized by the time it  &nbsp; </p>
 is built into the XML.&nbsp; For this reason, the localization of the exception  <p>The localization of the cimException object in the
 is the responsibility of the code throwing the exception.&nbsp; (The goal  CIMResponseMessage is handled separately from the CIM objects.&nbsp; The
 of the design is to make that easy - see below).&nbsp; The ContentLanguages  message string in the cimException object is assumed to have been
 object in the CIMResponseMessage has NO relation to this exception.&nbsp;  localized by the time it is built into the XML.&nbsp; For this reason,
 The cimException object keeps its own localization information once it  the localization of the exception is the responsibility of the code
 is created.  throwing the exception.&nbsp; (The goal of the design is to make that
 <br>&nbsp;  easy - see below).&nbsp; The ContentLanguageList object in the
   CIMResponseMessage has NO relation to this exception.&nbsp; The
   cimException object keeps its own localization information once it is
   created. <br>
   &nbsp; </p>
 <p>To enable exceptions to be localized, the ability was added to set a <p>To enable exceptions to be localized, the ability was added to set a
 global language for all the code running from a Pegasus Thread object.&nbsp;  global language for all the code running from a Pegasus Thread
 The top level code for a Thread can set a global AcceptLanguages object  object.&nbsp; The top level code for a Thread can set a global
 that can be accessed by all the low-level functions that it calls.&nbsp;  AcceptLanguageList object that can be accessed by all the low-level
 This will allow an exception thrown by the low-level function to be localized  functions that it calls.&nbsp; This will allow an exception thrown by
 based on this global AcceptLanguages object.&nbsp; Note:&nbsp; This applies  the low-level function to be localized based on this global
 only to Threads that are managed by a ThreadPool.  AcceptLanguageList object.&nbsp; Note:&nbsp; This applies only to Threads
 <br>&nbsp;  that are managed by a ThreadPool. <br>
 <p>Each service in the request path of the Pegasus server sets the AcceptLanguages  &nbsp; </p>
 into its Thread from the AcceptLanguages in the CIMRequestMessage object  <p>Each service in the request path of the Pegasus server sets the
 that it dequeues.&nbsp; This sets the global langauge for all the functions  AcceptLanguageList into its Thread from the AcceptLanguageList in the
 in the same thread that are called below handleEnqueue.&nbsp; <i>If you  CIMRequestMessage object that it dequeues.&nbsp; This sets the global
 are writing a new service that processes requests, or discover a request  langauge for all the functions in the same thread that are called below
 service that was missed, please do this.&nbsp;</i> The CIMOperationRequestDispatcher  handleEnqueue.&nbsp; <i>If you are writing a new service that processes
 service is an example.  requests, or discover a request service that was missed, please do
 <br>&nbsp;  this.&nbsp;</i> The CIMOperationRequestDispatcher service is an example. <br>
 <p><b>How to Throw a Localized Exception from Server code:</b>  &nbsp; </p>
 <br>&nbsp;  <p><b>How to Throw a Localized Exception from Server code:</b> <br>
 <p>With all that background, here is how code running in a Pegasus service  &nbsp; </p>
 can throw a localized exception:  <p>With all that background, here is how code running in a Pegasus
 <br>This example assumes that the top-level code in the service had set  service can throw a localized exception: <br>
 the global thread AcceptLanguages beforehand.&nbsp; As described above,  This example assumes that the top-level code in the service had set the
 every service in Pegasus should do that.&nbsp; The code here may be buried  global thread AcceptLanguageList beforehand.&nbsp; As described above,
 several layers deep in the call chain, but does not need to know the AcceptLanguage  every service in Pegasus should do that.&nbsp; The code here may be
 of the current client request.  buried several layers deep in the call chain, but does not need to know
 <p>// First, construct a MessageLoaderParms  the AcceptLanguagList of the current client request. </p>
 <br>//  <p>// First, construct a MessageLoaderParms <br>
 <br>// Notes:  // <br>
 <br>//&nbsp; 1) The errorMessageID must be in the Pegasus server resource  // Notes: <br>
 bundle.  //&nbsp; 1) The errorMessageID must be in the Pegasus server resource
 <br>//&nbsp; 2) The default message is the old "hardcoded" message.  bundle. <br>
 <br>//&nbsp; 3) The MessageLoaderParms will default to use the Pegasus  //&nbsp; 2) The default message is the old "hardcoded" message. <br>
 server resource bundle  //&nbsp; 3) The MessageLoaderParms will default to use the Pegasus
 <br>//&nbsp; 4) The MessageLoaderParms will default to use the AcceptLanguages  server resource bundle <br>
 set into the current Thread.&nbsp; Don't change this!  //&nbsp; 4) The MessageLoaderParms will default to use the
 <br>//&nbsp; 5) You might need to set the arguments for the message into  AcceptLanguageList set into the current Thread.&nbsp; Don't change this! <br>
 the MessageLoaderParms  //&nbsp; 5) You might need to set the arguments for the message into
 <br>MessageLoaderParms parms("errorMessageID", "default message");  the MessageLoaderParms <br>
 <p>// Second, throw the Exception  MessageLoaderParms parms("errorMessageID", "default message"); </p>
 <br>// Note: this applies to all the derived classes from Exception, including  <p>// Second, throw the Exception <br>
 the CIMException's  // Note: this applies to all the derived classes from Exception,
 <br>throw new Exception(parms);  including the CIMException's <br>
 <br>&nbsp;  throw new Exception(parms); <br>
   &nbsp; </p>
 <p>NOTE:&nbsp; If you are throwing an Exception with un-localized data, <p>NOTE:&nbsp; If you are throwing an Exception with un-localized data,
 use the constructor that takes a String.&nbsp; An example of this would use the constructor that takes a String.&nbsp; An example of this would
 be an Exception where you are passing in a file name.&nbsp; Most of the be an Exception where you are passing in a file name.&nbsp; Most of the
 "non-CIM" exceptions defined in Exception.h and InternalException.h take "non-CIM" exceptions defined in Exception.h and InternalException.h take
 un-localized data.  un-localized data. <br>
 <br>&nbsp;  &nbsp; </p>
 <p><b>The Exception Macros</b>  <p><b>The Exception Macros</b> <br>
 <br>&nbsp;  &nbsp; </p>
 <p>There are many spots in the server code that use the PEGASUS_CIM_EXCEPTION  <p>There are many spots in the server code that use the
 macro to throw a TraceableCIMException.&nbsp; The use of this macro in  PEGASUS_CIM_EXCEPTION macro to throw a TraceableCIMException.&nbsp; The
 the code like the following example presented a design problem:  use of this macro in the code like the following example presented a
 <p>....  design problem: </p>
 <br>} catch (Exception &amp; e)  <p>.... <br>
 <br>{  } catch (Exception &amp; e) <br>
 <br>&nbsp;&nbsp;&nbsp; throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, e.getMessage());  { <br>
 <br>}  &nbsp;&nbsp;&nbsp; throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
 <br>&nbsp;  e.getMessage()); <br>
 <p>This type of code would have lost the ContentLanguages saved in "e",  } <br>
 so that the Content-Language would not be set in HTTP response to the client.  &nbsp; </p>
 <br>&nbsp;  <p>This type of code would have lost the ContentLanguageList saved in "e",
 <p>For Pegasus 2.3, these types of macro calls can stay.&nbsp; The TraceableCIMException  so that the Content-Language would not be set in HTTP response to the
 constructed by the macro will "re-localize".&nbsp; That is, the "CIM" part  client. <br>
 of the message (the part based on the error code) will be localized at  &nbsp; </p>
 throw time, and the ContentLanguages re-established.&nbsp; A key is to  <p>For Pegasus 2.3, these types of macro calls can stay.&nbsp; The
 avoid a "language mismatch" problem between the CIM part of the message  TraceableCIMException constructed by the macro will "re-localize".&nbsp;
 and the extra part of the message.&nbsp; The design point here is that  That is, the "CIM" part of the message (the part based on the error
 all internal exceptions thrown by Pegasus code are localized using the  code) will be localized at throw time, and the ContentLanguageList
 global AcceptLanguages of the Thread...see above.  re-established.&nbsp; A key is to avoid a "language mismatch" problem
 <br>&nbsp;  between the CIM part of the message and the extra part of the
 <p>In the future, it will be safer and more maintainable to use of the&nbsp;  message.&nbsp; The design point here is that all internal exceptions
 new "localized" flavors of the macro.&nbsp; For example:  thrown by Pegasus code are localized using the global AcceptLanguageList
 <br>&nbsp;  of the Thread...see above. <br>
 <p>When the message from a caught&nbsp; Exception needs to be become the  &nbsp; </p>
 extra message in a thrown CIMException:  <p>In the future, it will be safer and more maintainable to use of
 <p>....  the&nbsp; new "localized" flavors of the macro.&nbsp; For example: <br>
 <br>} catch (Exception &amp; e)  &nbsp; </p>
 <br>{  <p>When the message from a caught&nbsp; Exception needs to be become
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw PEGASUS_CIM_EXCEPTION_LANG(e.getContentLanguages(  the extra message in a thrown CIMException: </p>
 ),  <p>.... <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch (Exception &amp; e) <br>
 CIM_ERR_FAILED,  { <br>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw
 e.getMessage( ));  PEGASUS_CIM_EXCEPTION_LANG(e.getContentLanguages( ), <br>
 <br>}  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <br>&nbsp;  CIM_ERR_FAILED, <br>
 <p>This guarantees that the ContentLanguages in "e" is copied to the newly  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 created TraceableCIMException.  e.getMessage( )); <br>
 <br>&nbsp;  } <br>
 <p>In the case where the extra message for the CIMException is determined  &nbsp; </p>
 by the throwing code:  <p>This guarantees that the ContentLanguageList in "e" is copied to the
 <br>&nbsp;  newly created TraceableCIMException. <br>
 <p>throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED,  &nbsp; </p>
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <p>In the case where the extra message for the CIMException is
 MessageLoaderParms("Repository.CIMRepository.COMPACT_FAILED",&nbsp; "compact  determined by the throwing code: <br>
 failed"));  &nbsp; </p>
 <br>&nbsp;  <p>throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, <br>
 <p>(example from CIMRepository.cpp)  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <br>This uses a MessageLoaderParms object to localize the extra message  MessageLoaderParms("Repository.CIMRepository.COMPACT_FAILED",&nbsp;
 in the newly created TraceableCIMException.  "compact failed")); <br>
 <br>&nbsp;  &nbsp; </p>
 <h3>  <p>(example from CIMRepository.cpp) <br>
 5.2 Logger Messages</h3>  This uses a MessageLoaderParms object to localize the extra message in
   the newly created TraceableCIMException. <br>
 <p><br>New methods have been added to Logger to take a message ID of a  &nbsp; </p>
 message to be loaded from the Pegasus server resource bundle.&nbsp; The  <h3> 5.2 Logger Messages</h3>
 caller is only required to pass in the message ID, the old "hardcoded"  <p><br>
 message, and the args.&nbsp; The Logger will use MessageLoader to load  New methods have been added to Logger to take a message ID of a message
 the message in the locale of the Pegasus server <i>process</i>, using the  to be loaded from the Pegasus server resource bundle.&nbsp; The caller
 hardcoded message as the default string.&nbsp; Please refer to pegasus/src/Pegasus/Logger.h.  is only required to pass in the message ID, the old "hardcoded" message,
   and the args.&nbsp; The Logger will use MessageLoader to load the
   message in the locale of the Pegasus server <i>process</i>, using the
   hardcoded message as the default string.&nbsp; Please refer to
   pegasus/src/Pegasus/Logger.h. </p>
 <p>Note:&nbsp; Messages sent to the "logs", whether the system logs or <p>Note:&nbsp; Messages sent to the "logs", whether the system logs or
 the Pegasus log file, are converted to UTF-8 before being sent.  the Pegasus log file, are converted to UTF-8 before being sent. <br>
 <br>&nbsp;  &nbsp; </p>
 <h3>  <h3> 5.3 CLI Messages</h3>
 5.3 CLI Messages</h3>  <p><br>
   The goal for messages returned by the Pegasus CLIs is to localize in
 <p><br>The goal for messages returned by the Pegasus CLIs is to localize  the locale of the user running the CLI.&nbsp; This should be automatic
 in the locale of the user running the CLI.&nbsp; This should be automatic  -- the user should not be required to tell the CLI what the locale
 -- the user should not be required to tell the CLI what the locale is.&nbsp;&nbsp;  is.&nbsp;&nbsp; For the CLIs that are CIM clients (cimconfing,
 For the CLIs that are CIM clients (cimconfing, cimprovider) there are two  cimprovider) there are two sets of messages to localize&nbsp; --
 sets of messages to localize&nbsp; -- messages generated in the CLI process  messages generated in the CLI process itself, and messages returned from
 itself, and messages returned from the Pegasus server .&nbsp; For CLIs  the Pegasus server .&nbsp; For CLIs that are directly linked into
 that are directly linked into Pegasus (cimmofl), all the messages are generated  Pegasus (cimmofl), all the messages are generated in the CLI's process,
 in the CLI's process, but the CLI may call Pegasus APIs that are coded  but the CLI may call Pegasus APIs that are coded to localize based on a
 to localize based on a client's requested languages.  client's requested languages. <br>
 <br>&nbsp;  &nbsp; </p>
 <p>Code in the client side of the client/server CLIs (eg. cimconfig, cimmof),  <p>Code in the client side of the client/server CLIs (eg. cimconfig,
 or in directly linked CLIs (cimmofl), should use the _useProcessLocale  cimmof), or in directly linked CLIs (cimmofl), should use the
 "master switch" described in the Message Loading section.&nbsp; This will  _useProcessLocale "master switch" described in the Message Loading
 cause all messages, including exceptions thrown by Pegasus APIs,&nbsp;  section.&nbsp; This will cause all messages, including exceptions thrown
 to be loaded in the locale based on the environment in which the program  by Pegasus APIs,&nbsp; to be loaded in the locale based on the
 is running.&nbsp; This locale can be set by the user before running the  environment in which the program is running.&nbsp; This locale can be
 program.  set by the user before running the program. <br>
 <br>&nbsp;  &nbsp; </p>
 <p>Code in the client side of the client/server CLIs need to send an Accept-Language  <p>Code in the client side of the client/server CLIs need to send an
 to the Pegasus server that reflects the default locale of the CLI's process.&nbsp;  Accept-Language to the Pegasus server that reflects the default locale
 See the Client Developer section for details.  of the CLI's process.&nbsp; See the Client Developer section for
 <br>&nbsp;  details. <br>
 <p>An example of these considerations can be seen in the source code for  &nbsp; </p>
 cimconfig.  <p>An example of these considerations can be seen in the source code
 <br>&nbsp;  for cimconfig. <br>
 <p>  &nbsp; </p>
   <p> </p>
 <hr> <hr>
 <p><i>Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company,  <p>Licensed to The Open Group (TOG) under one or more contributor license
 L.P.; IBM Corp.; The Open Group</i>  agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with
 <p><i>Permission is hereby granted, free of charge, to any person obtaining  this work for additional information regarding copyright ownership.
 a copy&nbsp; of this software and associated documentation files (the "Software"),  Each contributor licenses this file to you under the OpenPegasus Open
   Source License; you may not use this file except in compliance with the
   License.</p>
   <p>Permission is hereby granted, free of charge, to any person obtaining a
   copy of this software and associated documentation files (the "Software"),
 to deal in the Software without restriction, including without limitation to deal in the Software without restriction, including without limitation
 the rights to use, copy, modify, merge, publish, distribute, sublicense, the rights to use, copy, modify, merge, publish, distribute, sublicense,
 and/or sell copies of the Software, and to permit persons to whom the Software  and/or sell copies of the Software, and to permit persons to whom the
 is furnished to do so, subject to the following conditions:</i>  Software is furnished to do so, subject to the following conditions:</p>
 <p><i>THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED  <p>The above copyright notice and this permission notice shall be included
 IN ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS  in all copies or substantial portions of the Software.</p>
 PROVIDED&nbsp; "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,  <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 SOFTWARE.</i>  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p></body>
 <br>&nbsp;  
 <br>&nbsp;  
 </body>  
 </html> </html>


Legend:
Removed from v.1.3  
changed lines
  Added in v.1.12

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2