(file) Return to indications.html CVS log (file) (dir) Up to [Pegasus] / pegasus

File: [Pegasus] / pegasus / Attic / indications.html (download) / (as text)
Revision: 1.1.2.1, Fri Feb 28 21:34:05 2003 UTC (21 years, 2 months ago) by mday
Branch: mday-2-0-patches
Changes since 1.1: +2282 -0 lines
*** empty log message ***

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>PEP # 5: Proposal to Fix Indications in Pegasus</title>
    <link rel="stylesheet" type="text/css" href="http://www.soft-hackle.net/md.css">
  </head>
  <body>
  <table>
    <tr>

      <td>
	<img height="70" src="http://www.opengroup.org/images/pegicon2.gif" width="70" border="0">
      </td>
      <td>
	<h1>PEP #: 5</h1>
      </td>
    </tr>
    <tr>
      <td colspan="2"><h1>TITLE: Proposal to Fix Indications in Pegasus</h1></td>
    </tr>
  </table>
  <div class="comment">
    Version: $Revision: 1.1.2.1 $<br>
      Author: Mike Day<br>
	State: Draft<br>
	  Type: Architecture<br>
	    Vote: <br>
	      Created: 6 January 2003<br>
		Version 1.0 Mon Jan  6 17:39:09 2003
  </div>
  <hr>
    <h2>Summary</h2>
    <p>
      This document details my experiences getting CIM Indications to
      work with the Pegasus CIMOM. It explains the changes I had to
      make, the bugs I had to fix, and then makes some design
      recommendations for integrating Indication support into the Open
      Group CVS tree. 
    </p>
    <h3>What Works? </h3>
    <p>
      I have Pegasus supporting Indications, subscriptions, and
      handlers. It works really well. All the CIM operations related
      to indications and subscriptions work. I have tests and test
      providers. 
    </p>

    <h2>Proposal</h2>
    <p>
      Commit the changes outlined in this document to the 
      development (main) branch of the TOG CVS for Pegasus 
      for inclusion in Pegasus release 2.2
    </p>

    <h2>Terminology</h2>
    <p>
      Early feedback on this document has requested clarification of some 
      terms I use later. 
    </p>

    <dl class="enumerated">
      <dt>Response Handler</dt>
      <dd>Callback class that receives operation results from Providers. 
	This object heirarchy was designed specifically to support 
	asynchronous result delivery from providers, such as Indications.
      Examples include <code>OperationResponseHandler</code> and 
      <code>EnableIndicationsResponseHandler</code></dd>

      <dt>Indication Consumer Provider</dt>
      <dd>The C++ object that receives the <code>CIMIndication</code> for 
	handling. This proposal defines a new type of provider that
      supports the <code>CIMIndicationConsumer</code> interface 
      as defined by Chip Vincent. The <code>CIMIndicationConsumer</code>
      replaces the <code>IndicationHandler</code> that is currently
      in the source tree. However, the <code>IndicationHandler</code> can be 
      adjacent (post) to the <code>CIMIndicationConsumer</code> in the 
      indication processing path if required for compatibilty.</dd>

      <dt>Indication Handler</dt>
      <dd>Existing service in Pegasus for receiving indications and 
	dispatching them to applications. This service has never been 
	supported, and I propose to replace it with the Indication Consumer
	Provider (above). It can be optionally layered upon the Indication Consumer 
	Provider if required.</dd>

      <dt>Export Server</dt>
      <dd>Pegasus Service that exports <code>CIMIndication</code> instances
	to other Pegasus instances. I do not refer to the Export Server in this 
	proposal. Its use is compatible with this proposal but optional.</dd> 

      <dt>Export Client</dt> <dd>Pegasus Service that listens for and
      receives <code>CIMIndication</code> instances exported by other
      Pegasus instances. I do not refer to the Export Client in this
      proposal. Its use is compatible with this proposal but
      optional.</dd>

    </dl>


    <h2>Table of Contents</h2>
    <ol class="enumerated">
      <li><a href="#plan_of_attack">My Plan of Attack</a></li>
      <li><a href="#what_did_I_do">What did I have to Do?</a></li>
      <li><a href="#where_is_code">Where is the Source Code?</a></li>
      <li><a href="#cvs">What is the Status of Indication Support in the CVS?</a></li>
      <li><a href="#consumer_provider">Indication Consumer Provider</a></li>
      <li><a href="#elusive_bugs">Elusive Bugs I Fixed</a></li>
      <li><a href="#indication_consumer">Indication Consumer Support Code</a></li>
      <li><a href="#provider_schema_mods">Provider Schema Modifications</a></li>
      <li><a href="#provider_reg_mgr">Provider Registration Manager Modifications</a></li>
      <li><a href="#instantiate_providers">Instantiating the Modified Schema and Providers</a></li>
      <li><a href="#indication_provider">Indication Provider</a></li>
      <li><a href="#indication_consumer_provider">Indication Consumer Provider</a></li>
      <li><a href="#indication_processing">Indication Processing Pathway</a></li>
      </ol>

<a name="plan_of_attack"><h3>My Plan of Attack</h3></a>
    <p>
      There is a ton of rich functionality in the existing Pegasus
      code base for handling Indications and Subscriptions. The
      problem is, none of it has been tested due to gating bugs in the
      Pegasus core.
    </p> 
    <p>
      All of the subscription options, policies, and error handling is
      fantastic code but causes real problems when all you want to do
      is get the underlying mechanisms to work. In fact, the
      "commercial grade" features of the
      <code>IndicationService</code> tend to obfuscate the underlying
      breaks in the Pegasus core that are gating Indication
      support. So I embarked on a simplification strategy. 
    </p>
    <div class="notice">
      <p>
	Basic Indication Handling should be easy, and robust
	Indication Handling should be possible. (Yes, I stole this
	quote from Larry Wall.)  To this end I removed some of the
	functionality from the <code>IndicationService</code>, such as
	enforcing the schema and implementing policy.
      </p>
      <p>
	I wrote a basic <code>IndicationService</code> and
	<code>ConsumerProvider</code> that stresses the core of
	Pegasus and assures the functionality of Indications and
	Subscriptions.</p>
      <p>
	If I need error handling policy and schema enforcement, I
	should be able to create or reactivate the more robust HP
	Indication Service and substitute it for the simple one. Or I
	can graft features from the HP service to the simple one. But
	I shouldn't have to use the untested complex features to debug
	the inner workings of Pegasus.
      </p>
    </div>

<a name="what_did_I_do">
    <h3>What Did I Have to Do to get Indications Working?</h3></a>
    <p>
      A little bit of everything. This is an area of Pegasus that has
      never been completed nore tested. The table below shows the
      steps I had to take, in order, to get this work completed. 
    </p>
    <ol class="enumerated">
      <caption><div class="caption">Tasks I Completed to Get 
	  Indications working in Pegasus<br><br>
	</div></caption>
      <li>Fix some elusive bugs.</li>
      <li>Successfully run the existing <code>wbem-exec</code> tests
	in the <code>test/wetest/cimv2/subscription</code> directory.</li>
      <li>Subclass the PG_Provider and PG_Indication Schemata to allow
	Providers to be Indication Handlers.</li>
      <li>Modify the <code>ProviderRegistrationManager</code> to allow
	for the new "type 6" provider (see above).</li>
      <li>Create a new <code>CIMConsumeIndication</code> Message (see
	item 3 above).
      <li>Rewrite the <code>IndicationService</code> to redirect
	Indications to the <code>ProviderManager</code> (see items 3-5
	and above).
      <li>Modify the <code>ProviderManager</code> to treat
	<code>CIMConsumerProvider</code> modules differently because
	they are asynchronous by definition.</li>
      <li>Instantiate the new Providers in a compiled Schema. (I
	piggy-backed on the existing repository build scripts.)</li>
      <li>Write a <code>CIMIndicationProvider</code> and a
	<code>CIMIndicationConsumer</code> and start testing.</li>
    </ol>
<a name="where_is_code">
    <h3>Where is the source code?</h3></a>
    <p>
      IBM has, out of necessity, maintained a version of Pegasus that
      has the original C++ provider interfaces. We did this to support
      existing providers that we shipped prior to the interface
      changes this past fall. 

      I did the work necessary to support indications on IBM's
      "classic" snapshot of the source repository. That's where the
      source code is. Most of the changes were not related to provider
      interfaces so merging indication support into the Open Group CVS
      is feasible. 
    </p>
    <p>
      Consider this document as a design proposal for indication
      support; and also as a proposal for checking the source code
      into the Open Group CVS.
    </p>
    <p>
      I also anticipate making this available as a snapshot on an ftp
      server.
    </p>

    <a name="cvs">
    <h3>What is the status of Indication Support in the Open Group
      CVS?</h3></a>
    <p>
      Indications in the Open Group Pegasus 2.x do not work and are
      not close to working. There are bugs that need to be fixed and
      design changes that need to be made. They are fairly completely
      discussed in this document.
    </p>
    
    <a name="consumer_provider">
    <h3>Indication Consumer Provider</h3></a>
    <p>
      Chip Vincent and I have long preferred to use Pegasus providers
      to handle indications. Doing so removes the need for a separate
      <code>IndicationHandler</code> service. Instead, the handler can
      reuse all the infrastructure that exists for Providers. 
    </p>
    <p>
      Another benefit of using Pegasus providers to handle indications
      is that developers do not need to learn another service
      interface. The provider interface is sufficient. Also, this
      means that we (Pegasus developers) do not need to provide
      separate developer support for handling indications and
      generating indications. 
    </p>
    <p>
      Once a <code>CIMIndicationProvider</code> routine generates a
      <code>CIMIndication</code>, the modified
      <code>OperationResponseHandler</code> creates a
      <code>CIMConsumeIndication</code> message and passes the
      indication to the <code>ProviderManagerService</code>; the
      provider manager then finds the "handler," which is really a
      provider, and calls <code>provider.handleIndication()</code>.
    </p>
    <p>
      There is no need for a separate handler service, which makes
      error handling and debugging simpler.
    </p>


    <h4>Tasks to Support Indication Consumer Providers</h4>
    <p>
      This was not as simple as activiating the
      <code>CIMIndicationConsumer</code> code that has been in the
      source tree for quite some time. I had to ensure that this new
      type of provider was supported throughout Pegasus. 
    </p>
    <ol class="enumerated">
	<a href="#indication_consumer"><li>Indication Consumer Support Code</a><br></li>
        <a href="#provider_schema_mods"><li>Provider Schema Modifications</a><br></li>
        <a href="#provider_reg_mgr"><li>Provider Registration Manager Modifications</a><br></li>
    <a href="#instantiate_providers"><li>Instantiating the Modified Schema and Providers</a><br></li>

  </ol>
    
<a name="elusive_bugs">
    <h3>Elusive Bugs I Fixed</h3></a>
      <ol class="enumerated">
      <li>
	<a href="#bug_1">Indication Response Handler Allocated on
	  Stack</a><br><br></li>
      <li><a href="#bug_2">
	Response Handler Created with Reference to Transient Messages
	</a><br><br></li>
      <li>
	<a href="#bug_3">
	Converting References to CIMInstances
	</a><br><br></li>
      <li><a href="#bug_4">
	Pegasus Array Template and Virtual Base Classes in Provider 
	Heirarchy	
      </a><br><br></li>
      <li><a href="#bug_5">
	  Double Deletes in Redirected Message Pathways
	</a><br><br></li>
      </ol>
    <a name="bug_1">
    <h4>Indication Response Handler allocated on stack</h4></a>
    <p>
      The <code>ProviderManagerService</code> was creating an indication
	response handler within a local code block and passing that to
	the Indication Provider with an <code>EnableIndication</code>
	message. After the ProviderManagerService returned from enabling
	the indication, response handler went out of scope and was
	destroyed. When the Indication Provider called
	<code>handler.deliver(indication)</code>, it was using a
	reference to an object that was destroyed. The result was a
	core dump.
    </p>
    <div class="source">
    <h5>The fix - allocate response handler from heap and store for
    the life of the indication enablement</h5>
      <p>
	The important lines for enabling a new subscription are 
	<a href="#1_line32">32</a> and
	<a href="#1_line58">58</a>.<br>
	<br>
	The important line for disabling an existing subscription is 
	<a href="#1_line136">136</a>.
	
      </p>
      <!-- code2html add -lcc -N bug_1.cpp
      --><!-- code2html delete start --><pre><a name="1_line1" href="#1_line1">  1</a> <strong>void</strong> <font color="#2040a0">ProviderManagerService</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">handleEnableIndicationsRequest</font><font color="4444FF">(</font>
<a name="1_line2" href="#1_line2">  2</a>    <font color="#2040a0">AsyncOpNode</font> <font color="4444FF">*</font><font color="#2040a0">op</font>, <strong>const</strong> <font color="#2040a0">Message</font> <font color="4444FF">*</font> <font color="#2040a0">message</font><font color="4444FF">)</font> <strong>throw</strong><font color="4444FF">(</font><font color="4444FF">)</font>
<a name="1_line3" href="#1_line3">  3</a> <font color="4444FF"><strong>{</strong></font>
<a name="1_line4" href="#1_line4">  4</a>    <font color="#2040a0">PEG_METHOD_ENTER</font><font color="4444FF">(</font><font color="#2040a0">TRC_PROVIDERMANAGER</font>, 
<a name="1_line5" href="#1_line5">  5</a> 		    <font color="#008000">&quot;ProviderManagerService:: handleEnableIndicationsRequest&quot;</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line6" href="#1_line6">  6</a>    <font color="#2040a0">CIMEnableIndicationsRequestMessage</font> <font color="4444FF">*</font> <font color="#2040a0">request</font> <font color="4444FF">=</font>
<a name="1_line7" href="#1_line7">  7</a>       <strong>dynamic_cast</strong><font color="4444FF">&lt;</font><font color="#2040a0">CIMEnableIndicationsRequestMessage</font> <font color="4444FF">*</font><font color="4444FF">&gt;</font><font color="4444FF">(</font>
<a name="1_line8" href="#1_line8">  8</a> 	 <font color="#2040a0">const_cast</font><font color="4444FF">&lt;</font><font color="#2040a0">Message</font> <font color="4444FF">*</font><font color="4444FF">&gt;</font><font color="4444FF">(</font><font color="#2040a0">message</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line9" href="#1_line9">  9</a> 
<a name="1_line10" href="#1_line10"> 10</a>    <font color="#2040a0">AsyncRequest</font> <font color="4444FF">*</font><font color="#2040a0">async</font> <font color="4444FF">=</font> 
<a name="1_line11" href="#1_line11"> 11</a>       <strong>static_cast</strong><font color="4444FF">&lt;</font><font color="#2040a0">AsyncRequest</font> <font color="4444FF">*</font><font color="4444FF">&gt;</font><font color="4444FF">(</font><font color="#2040a0">op</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">_request</font>.<font color="#2040a0">next</font><font color="4444FF">(</font><font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line12" href="#1_line12"> 12</a> 
<a name="1_line13" href="#1_line13"> 13</a>    <font color="#2040a0">PEGASUS_ASSERT</font><font color="4444FF">(</font><font color="#2040a0">request</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#FF0000">0</font> <font color="4444FF">&amp;</font><font color="4444FF">&amp;</font> <font color="#2040a0">async</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#FF0000">0</font> <font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line14" href="#1_line14"> 14</a> 
<a name="1_line15" href="#1_line15"> 15</a>    <font color="#2040a0">CIMEnableIndicationsResponseMessage</font> <font color="4444FF">*</font> <font color="#2040a0">response</font> <font color="4444FF">=</font>
<a name="1_line16" href="#1_line16"> 16</a>       <strong>new</strong> <font color="#2040a0">CIMEnableIndicationsResponseMessage</font><font color="4444FF">(</font>
<a name="1_line17" href="#1_line17"> 17</a> 	 <font color="#2040a0">request</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">messageId</font>,
<a name="1_line18" href="#1_line18"> 18</a> 	 <font color="#2040a0">CIMException</font><font color="4444FF">(</font><font color="4444FF">)</font>,
<a name="1_line19" href="#1_line19"> 19</a> 	 <font color="#2040a0">request</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">queueIds</font>.<font color="#2040a0">copyAndPop</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line20" href="#1_line20"> 20</a> 
<a name="1_line21" href="#1_line21"> 21</a>    <font color="#2040a0">PEGASUS_ASSERT</font><font color="4444FF">(</font><font color="#2040a0">response</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line22" href="#1_line22"> 22</a> 
<a name="1_line23" href="#1_line23"> 23</a>    <font color="#444444">// preserve message key</font>
<a name="1_line24" href="#1_line24"> 24</a>    <font color="#2040a0">response</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">setKey</font><font color="4444FF">(</font><font color="#2040a0">request</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">getKey</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line25" href="#1_line25"> 25</a> 
<a name="1_line26" href="#1_line26"> 26</a>    <font color="#2040a0">response</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">dest</font> <font color="4444FF">=</font> <font color="#2040a0">request</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">queueIds</font>.<font color="#2040a0">top</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line27" href="#1_line27"> 27</a> 
<a name="1_line28" href="#1_line28"> 28</a>    <font color="#444444">// Allocate the response handler from the heap using new (). </font>
<a name="1_line29" href="#1_line29"> 29</a>    <font color="#444444">// Otherwise it will go out of scope and the indication, which </font>
<a name="1_line30" href="#1_line30"> 30</a>    <font color="#444444">// happens later, will go off into outer space...</font>
<a name="1_line31" href="#1_line31"> 31</a> 
<a name="1_line32" href="#1_line32"> 32</a>    <font color="#2040a0">EnableIndicationsResponseHandler</font> <font color="4444FF">*</font><font color="#2040a0">handler</font> <font color="4444FF">=</font> 
<a name="1_line33" href="#1_line33"> 33</a>       <strong>new</strong> <font color="#2040a0">EnableIndicationsResponseHandler</font><font color="4444FF">(</font><font color="#2040a0">request</font>, <font color="#2040a0">response</font>, <strong>this</strong><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line34" href="#1_line34"> 34</a> 
<a name="1_line35" href="#1_line35"> 35</a>    <font color="#2040a0">try</font>
<a name="1_line36" href="#1_line36"> 36</a>    <font color="4444FF"><strong>{</strong></font>
<a name="1_line37" href="#1_line37"> 37</a>       <font color="#444444">// get the provider file name and logical name</font>
<a name="1_line38" href="#1_line38"> 38</a>       <font color="#2040a0">Triad</font><font color="4444FF">&lt;</font><font color="#2040a0">String</font>, <font color="#2040a0">String</font>, <font color="#2040a0">String</font><font color="4444FF">&gt;</font> <font color="#2040a0">triad</font> <font color="4444FF">=</font>
<a name="1_line39" href="#1_line39"> 39</a> 	 <font color="#2040a0">_getProviderRegPair</font><font color="4444FF">(</font><font color="#2040a0">request</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">provider</font>, <font color="#2040a0">request</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">providerModule</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line40" href="#1_line40"> 40</a> 
<a name="1_line41" href="#1_line41"> 41</a>       <font color="#444444">// get cached or load new provider module</font>
<a name="1_line42" href="#1_line42"> 42</a>       <font color="#2040a0">Provider</font> <font color="#2040a0">provider</font> <font color="4444FF">=</font>
<a name="1_line43" href="#1_line43"> 43</a> 	 <font color="#2040a0">providerManager</font>.<font color="#2040a0">getProvider</font><font color="4444FF">(</font><font color="#2040a0">triad</font>.<font color="#2040a0">first</font>, <font color="#2040a0">triad</font>.<font color="#2040a0">second</font>, <font color="#2040a0">triad</font>.<font color="#2040a0">third</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line44" href="#1_line44"> 44</a> 
<a name="1_line45" href="#1_line45"> 45</a>       <font color="#2040a0">PEG_TRACE_STRING</font><font color="4444FF">(</font><font color="#2040a0">TRC_PROVIDERMANAGER</font>, <font color="#2040a0">Tracer</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">LEVEL4</font>, 
<a name="1_line46" href="#1_line46"> 46</a> 		       <font color="#008000">&quot;Calling provider.enableIndications: &quot;</font> <font color="4444FF">+</font> 
<a name="1_line47" href="#1_line47"> 47</a> 		       <font color="#2040a0">provider</font>.<font color="#2040a0">getName</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line48" href="#1_line48"> 48</a>        
<a name="1_line49" href="#1_line49"> 49</a>       <font color="#2040a0">provider</font>.<font color="#2040a0">enableIndications</font><font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">handler</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line50" href="#1_line50"> 50</a> 
<a name="1_line51" href="#1_line51"> 51</a>       <font color="#444444">// if no exception, store the handler so it is persistent for as </font>
<a name="1_line52" href="#1_line52"> 52</a>       <font color="#444444">// long as the provider has indications enabled. </font>
<a name="1_line53" href="#1_line53"> 53</a>       <font color="#2040a0">PEG_TRACE_STRING</font><font color="4444FF">(</font><font color="#2040a0">TRC_PROVIDERMANAGER</font>, <font color="#2040a0">Tracer</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">LEVEL4</font>, 
<a name="1_line54" href="#1_line54"> 54</a> 		       <font color="#008000">&quot;Storing indication handler for &quot;</font> <font color="4444FF">+</font> <font color="#2040a0">provider</font>.<font color="#2040a0">getName</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line55" href="#1_line55"> 55</a>        
<a name="1_line56" href="#1_line56"> 56</a> 
<a name="1_line57" href="#1_line57"> 57</a>       <font color="#444444">// keep indication handlers in a hash table keyed by the provider. </font>
<a name="1_line58" href="#1_line58"> 58</a>       <font color="#2040a0">_insertEntry</font><font color="4444FF">(</font><font color="#2040a0">provider</font>, <font color="#2040a0">handler</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line59" href="#1_line59"> 59</a>    <font color="4444FF"><strong>}</strong></font>
<a name="1_line60" href="#1_line60"> 60</a>    <strong>catch</strong><font color="4444FF">(</font><font color="#2040a0">CIMException</font> <font color="4444FF">&amp;</font> <font color="#2040a0">e</font><font color="4444FF">)</font>
<a name="1_line61" href="#1_line61"> 61</a>    <font color="4444FF"><strong>{</strong></font>
<a name="1_line62" href="#1_line62"> 62</a>       <font color="#2040a0">PEG_TRACE_STRING</font><font color="4444FF">(</font><font color="#2040a0">TRC_PROVIDERMANAGER</font>, <font color="#2040a0">Tracer</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">LEVEL4</font>, 
<a name="1_line63" href="#1_line63"> 63</a> 		       <font color="#008000">&quot;Exception: &quot;</font> <font color="4444FF">+</font> <font color="#2040a0">e</font>.<font color="#2040a0">getMessage</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line64" href="#1_line64"> 64</a>       <font color="#2040a0">response</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">cimException</font> <font color="4444FF">=</font> <font color="#2040a0">CIMException</font><font color="4444FF">(</font><font color="#2040a0">e</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line65" href="#1_line65"> 65</a>    <font color="4444FF"><strong>}</strong></font>
<a name="1_line66" href="#1_line66"> 66</a>    <strong>catch</strong><font color="4444FF">(</font><font color="#2040a0">Exception</font> <font color="4444FF">&amp;</font> <font color="#2040a0">e</font><font color="4444FF">)</font>
<a name="1_line67" href="#1_line67"> 67</a>    <font color="4444FF"><strong>{</strong></font>
<a name="1_line68" href="#1_line68"> 68</a>       <font color="#2040a0">PEG_TRACE_STRING</font><font color="4444FF">(</font><font color="#2040a0">TRC_PROVIDERMANAGER</font>, <font color="#2040a0">Tracer</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">LEVEL4</font>, 
<a name="1_line69" href="#1_line69"> 69</a> 		       <font color="#008000">&quot;Exception: &quot;</font> <font color="4444FF">+</font> <font color="#2040a0">e</font>.<font color="#2040a0">getMessage</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line70" href="#1_line70"> 70</a>       <font color="#2040a0">response</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">cimException</font> <font color="4444FF">=</font> <font color="#2040a0">CIMException</font><font color="4444FF">(</font><font color="#2040a0">CIM_ERR_FAILED</font>, <font color="#008000">&quot;Internal Error&quot;</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line71" href="#1_line71"> 71</a>    <font color="4444FF"><strong>}</strong></font>
<a name="1_line72" href="#1_line72"> 72</a>    <strong>catch</strong><font color="4444FF">(</font>...<font color="4444FF">)</font>
<a name="1_line73" href="#1_line73"> 73</a>    <font color="4444FF"><strong>{</strong></font>
<a name="1_line74" href="#1_line74"> 74</a>       <font color="#2040a0">PEG_TRACE_STRING</font><font color="4444FF">(</font><font color="#2040a0">TRC_PROVIDERMANAGER</font>, <font color="#2040a0">Tracer</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">LEVEL4</font>, 
<a name="1_line75" href="#1_line75"> 75</a> 		       <font color="#008000">&quot;Exception: Unknown&quot;</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line76" href="#1_line76"> 76</a>       <font color="#2040a0">response</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">cimException</font> <font color="4444FF">=</font> <font color="#2040a0">CIMException</font><font color="4444FF">(</font><font color="#2040a0">CIM_ERR_FAILED</font>, <font color="#008000">&quot;Unknown Error&quot;</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line77" href="#1_line77"> 77</a>    <font color="4444FF"><strong>}</strong></font>
<a name="1_line78" href="#1_line78"> 78</a>        
<a name="1_line79" href="#1_line79"> 79</a>    <font color="#2040a0">AsyncLegacyOperationResult</font> <font color="4444FF">*</font><font color="#2040a0">async_result</font> <font color="4444FF">=</font>
<a name="1_line80" href="#1_line80"> 80</a>       <strong>new</strong> <font color="#2040a0">AsyncLegacyOperationResult</font><font color="4444FF">(</font>
<a name="1_line81" href="#1_line81"> 81</a> 	 <font color="#2040a0">async</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">getKey</font><font color="4444FF">(</font><font color="4444FF">)</font>,
<a name="1_line82" href="#1_line82"> 82</a> 	 <font color="#2040a0">async</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">getRouting</font><font color="4444FF">(</font><font color="4444FF">)</font>,
<a name="1_line83" href="#1_line83"> 83</a> 	 <font color="#2040a0">op</font>,
<a name="1_line84" href="#1_line84"> 84</a> 	 <font color="#2040a0">response</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line85" href="#1_line85"> 85</a> 
<a name="1_line86" href="#1_line86"> 86</a>    <font color="#2040a0">_complete_op_node</font><font color="4444FF">(</font><font color="#2040a0">op</font>, <font color="#2040a0">ASYNC_OPSTATE_COMPLETE</font>, <font color="#FF0000">0</font>, <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line87" href="#1_line87"> 87</a>    <font color="#2040a0">PEG_METHOD_EXIT</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line88" href="#1_line88"> 88</a> <font color="4444FF"><strong>}</strong></font>
<a name="1_line89" href="#1_line89"> 89</a> 
<a name="1_line90" href="#1_line90"> 90</a> <strong>void</strong> <font color="#2040a0">ProviderManagerService</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">handleDisableIndicationsRequest</font><font color="4444FF">(</font>
<a name="1_line91" href="#1_line91"> 91</a>    <font color="#2040a0">AsyncOpNode</font> <font color="4444FF">*</font><font color="#2040a0">op</font>, <strong>const</strong> <font color="#2040a0">Message</font> <font color="4444FF">*</font> <font color="#2040a0">message</font><font color="4444FF">)</font> <strong>throw</strong><font color="4444FF">(</font><font color="4444FF">)</font>
<a name="1_line92" href="#1_line92"> 92</a> <font color="4444FF"><strong>{</strong></font>
<a name="1_line93" href="#1_line93"> 93</a>    <font color="#2040a0">PEG_METHOD_ENTER</font><font color="4444FF">(</font><font color="#2040a0">TRC_PROVIDERMANAGER</font>, 
<a name="1_line94" href="#1_line94"> 94</a> 		    <font color="#008000">&quot;ProviderManagerService::handleDisableIndicationsRequest&quot;</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line95" href="#1_line95"> 95</a>    <font color="#2040a0">CIMDisableIndicationsRequestMessage</font> <font color="4444FF">*</font> <font color="#2040a0">request</font> <font color="4444FF">=</font>
<a name="1_line96" href="#1_line96"> 96</a>       <strong>dynamic_cast</strong><font color="4444FF">&lt;</font><font color="#2040a0">CIMDisableIndicationsRequestMessage</font> <font color="4444FF">*</font><font color="4444FF">&gt;</font><font color="4444FF">(</font>
<a name="1_line97" href="#1_line97"> 97</a> 	 <font color="#2040a0">const_cast</font><font color="4444FF">&lt;</font><font color="#2040a0">Message</font> <font color="4444FF">*</font><font color="4444FF">&gt;</font><font color="4444FF">(</font><font color="#2040a0">message</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line98" href="#1_line98"> 98</a> 
<a name="1_line99" href="#1_line99"> 99</a>    <font color="#2040a0">AsyncRequest</font> <font color="4444FF">*</font><font color="#2040a0">async</font> <font color="4444FF">=</font> <strong>static_cast</strong><font color="4444FF">&lt;</font><font color="#2040a0">AsyncRequest</font> <font color="4444FF">*</font><font color="4444FF">&gt;</font><font color="4444FF">(</font><font color="#2040a0">op</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">_request</font>.<font color="#2040a0">next</font><font color="4444FF">(</font><font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line100" href="#1_line100">100</a> 
<a name="1_line101" href="#1_line101">101</a>    <font color="#2040a0">PEGASUS_ASSERT</font><font color="4444FF">(</font><font color="#2040a0">request</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#FF0000">0</font> <font color="4444FF">&amp;</font><font color="4444FF">&amp;</font> <font color="#2040a0">async</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#FF0000">0</font> <font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line102" href="#1_line102">102</a> 
<a name="1_line103" href="#1_line103">103</a>    <font color="#2040a0">CIMDisableIndicationsResponseMessage</font> <font color="4444FF">*</font> <font color="#2040a0">response</font> <font color="4444FF">=</font>
<a name="1_line104" href="#1_line104">104</a>       <strong>new</strong> <font color="#2040a0">CIMDisableIndicationsResponseMessage</font><font color="4444FF">(</font>
<a name="1_line105" href="#1_line105">105</a> 	 <font color="#2040a0">request</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">messageId</font>,
<a name="1_line106" href="#1_line106">106</a> 	 <font color="#2040a0">CIMException</font><font color="4444FF">(</font><font color="4444FF">)</font>,
<a name="1_line107" href="#1_line107">107</a> 	 <font color="#2040a0">request</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">queueIds</font>.<font color="#2040a0">copyAndPop</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line108" href="#1_line108">108</a> 
<a name="1_line109" href="#1_line109">109</a>    <font color="#2040a0">PEGASUS_ASSERT</font><font color="4444FF">(</font><font color="#2040a0">response</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line110" href="#1_line110">110</a> 
<a name="1_line111" href="#1_line111">111</a>    <font color="#444444">// preserve message key</font>
<a name="1_line112" href="#1_line112">112</a>    <font color="#2040a0">response</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">setKey</font><font color="4444FF">(</font><font color="#2040a0">request</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">getKey</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line113" href="#1_line113">113</a> 
<a name="1_line114" href="#1_line114">114</a>    <font color="#2040a0">OperationResponseHandler</font><font color="4444FF">&lt;</font><font color="#2040a0">CIMIndication</font><font color="4444FF">&gt;</font> <font color="#2040a0">handler</font><font color="4444FF">(</font><font color="#2040a0">request</font>, <font color="#2040a0">response</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line115" href="#1_line115">115</a>    <font color="#2040a0">try</font>
<a name="1_line116" href="#1_line116">116</a>    <font color="4444FF"><strong>{</strong></font>
<a name="1_line117" href="#1_line117">117</a>       <font color="#444444">// get the provider file name and logical name</font>
<a name="1_line118" href="#1_line118">118</a>       <font color="#2040a0">Triad</font><font color="4444FF">&lt;</font><font color="#2040a0">String</font>, <font color="#2040a0">String</font>, <font color="#2040a0">String</font><font color="4444FF">&gt;</font> <font color="#2040a0">triad</font> <font color="4444FF">=</font>
<a name="1_line119" href="#1_line119">119</a> 	 <font color="#2040a0">_getProviderRegPair</font><font color="4444FF">(</font><font color="#2040a0">request</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">provider</font>, <font color="#2040a0">request</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">providerModule</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line120" href="#1_line120">120</a> 
<a name="1_line121" href="#1_line121">121</a>       <font color="#444444">// get cached or load new provider module</font>
<a name="1_line122" href="#1_line122">122</a>       <font color="#2040a0">Provider</font> <font color="#2040a0">provider</font> <font color="4444FF">=</font>
<a name="1_line123" href="#1_line123">123</a> 	 <font color="#2040a0">providerManager</font>.<font color="#2040a0">getProvider</font><font color="4444FF">(</font><font color="#2040a0">triad</font>.<font color="#2040a0">first</font>, <font color="#2040a0">triad</font>.<font color="#2040a0">second</font>, <font color="#2040a0">triad</font>.<font color="#2040a0">third</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line124" href="#1_line124">124</a>       <font color="#2040a0">PEG_TRACE_STRING</font><font color="4444FF">(</font><font color="#2040a0">TRC_PROVIDERMANAGER</font>, <font color="#2040a0">Tracer</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">LEVEL4</font>, 
<a name="1_line125" href="#1_line125">125</a> 		       <font color="#008000">&quot;Calling provider.disableIndications: &quot;</font> <font color="4444FF">+</font> 
<a name="1_line126" href="#1_line126">126</a> 		       <font color="#2040a0">provider</font>.<font color="#2040a0">getName</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line127" href="#1_line127">127</a> 	
<a name="1_line128" href="#1_line128">128</a>       <font color="#2040a0">provider</font>.<font color="#2040a0">disableIndications</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line129" href="#1_line129">129</a> 
<a name="1_line130" href="#1_line130">130</a>       <font color="#444444">// Now that indications are disabled we can extract and remove the </font>
<a name="1_line131" href="#1_line131">131</a>       <font color="#444444">// indication response handler </font>
<a name="1_line132" href="#1_line132">132</a>       <font color="#2040a0">PEG_TRACE_STRING</font><font color="4444FF">(</font><font color="#2040a0">TRC_PROVIDERMANAGER</font>, <font color="#2040a0">Tracer</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">LEVEL4</font>, 
<a name="1_line133" href="#1_line133">133</a> 		       <font color="#008000">&quot;Removing and Destroying indication handler for &quot;</font> <font color="4444FF">+</font> 
<a name="1_line134" href="#1_line134">134</a> 		       <font color="#2040a0">provider</font>.<font color="#2040a0">getName</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line135" href="#1_line135">135</a> 	
<a name="1_line136" href="#1_line136">136</a>       <strong>delete</strong> <font color="#2040a0">_removeEntry</font><font color="4444FF">(</font><font color="#2040a0">_generateKey</font><font color="4444FF">(</font><font color="#2040a0">provider</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line137" href="#1_line137">137</a>    <font color="4444FF"><strong>}</strong></font>
<a name="1_line138" href="#1_line138">138</a> 
<a name="1_line139" href="#1_line139">139</a>    <strong>catch</strong><font color="4444FF">(</font><font color="#2040a0">CIMException</font> <font color="4444FF">&amp;</font> <font color="#2040a0">e</font><font color="4444FF">)</font>
<a name="1_line140" href="#1_line140">140</a>    <font color="4444FF"><strong>{</strong></font>
<a name="1_line141" href="#1_line141">141</a>       <font color="#2040a0">PEG_TRACE_STRING</font><font color="4444FF">(</font><font color="#2040a0">TRC_PROVIDERMANAGER</font>, <font color="#2040a0">Tracer</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">LEVEL4</font>, 
<a name="1_line142" href="#1_line142">142</a> 		       <font color="#008000">&quot;Exception: &quot;</font> <font color="4444FF">+</font> <font color="#2040a0">e</font>.<font color="#2040a0">getMessage</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line143" href="#1_line143">143</a>       <font color="#2040a0">response</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">cimException</font> <font color="4444FF">=</font> <font color="#2040a0">CIMException</font><font color="4444FF">(</font><font color="#2040a0">e</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line144" href="#1_line144">144</a>    <font color="4444FF"><strong>}</strong></font>
<a name="1_line145" href="#1_line145">145</a>    <strong>catch</strong><font color="4444FF">(</font><font color="#2040a0">Exception</font> <font color="4444FF">&amp;</font> <font color="#2040a0">e</font><font color="4444FF">)</font>
<a name="1_line146" href="#1_line146">146</a>    <font color="4444FF"><strong>{</strong></font>
<a name="1_line147" href="#1_line147">147</a>       <font color="#2040a0">PEG_TRACE_STRING</font><font color="4444FF">(</font><font color="#2040a0">TRC_PROVIDERMANAGER</font>, <font color="#2040a0">Tracer</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">LEVEL4</font>, 
<a name="1_line148" href="#1_line148">148</a> 		       <font color="#008000">&quot;Exception: &quot;</font> <font color="4444FF">+</font> <font color="#2040a0">e</font>.<font color="#2040a0">getMessage</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line149" href="#1_line149">149</a>       <font color="#2040a0">response</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">cimException</font> <font color="4444FF">=</font> <font color="#2040a0">CIMException</font><font color="4444FF">(</font><font color="#2040a0">CIM_ERR_FAILED</font>, <font color="#008000">&quot;Internal Error&quot;</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line150" href="#1_line150">150</a>    <font color="4444FF"><strong>}</strong></font>
<a name="1_line151" href="#1_line151">151</a>    <strong>catch</strong><font color="4444FF">(</font>...<font color="4444FF">)</font>
<a name="1_line152" href="#1_line152">152</a>    <font color="4444FF"><strong>{</strong></font>
<a name="1_line153" href="#1_line153">153</a>       <font color="#2040a0">PEG_TRACE_STRING</font><font color="4444FF">(</font><font color="#2040a0">TRC_PROVIDERMANAGER</font>, <font color="#2040a0">Tracer</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">LEVEL4</font>, 
<a name="1_line154" href="#1_line154">154</a> 		       <font color="#008000">&quot;Exception: Unknown&quot;</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line155" href="#1_line155">155</a>       <font color="#2040a0">response</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">cimException</font> <font color="4444FF">=</font> <font color="#2040a0">CIMException</font><font color="4444FF">(</font><font color="#2040a0">CIM_ERR_FAILED</font>, <font color="#008000">&quot;Unknown Error&quot;</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line156" href="#1_line156">156</a>    <font color="4444FF"><strong>}</strong></font>
<a name="1_line157" href="#1_line157">157</a> 
<a name="1_line158" href="#1_line158">158</a>    <font color="#2040a0">AsyncLegacyOperationResult</font> <font color="4444FF">*</font><font color="#2040a0">async_result</font> <font color="4444FF">=</font>
<a name="1_line159" href="#1_line159">159</a>       <strong>new</strong> <font color="#2040a0">AsyncLegacyOperationResult</font><font color="4444FF">(</font>
<a name="1_line160" href="#1_line160">160</a> 	 <font color="#2040a0">async</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">getKey</font><font color="4444FF">(</font><font color="4444FF">)</font>,
<a name="1_line161" href="#1_line161">161</a> 	 <font color="#2040a0">async</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">getRouting</font><font color="4444FF">(</font><font color="4444FF">)</font>,
<a name="1_line162" href="#1_line162">162</a> 	 <font color="#2040a0">op</font>,
<a name="1_line163" href="#1_line163">163</a> 	 <font color="#2040a0">response</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line164" href="#1_line164">164</a> 
<a name="1_line165" href="#1_line165">165</a>    <font color="#2040a0">_complete_op_node</font><font color="4444FF">(</font><font color="#2040a0">op</font>, <font color="#2040a0">ASYNC_OPSTATE_COMPLETE</font>, <font color="#FF0000">0</font>, <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line166" href="#1_line166">166</a>    <font color="#2040a0">PEG_METHOD_EXIT</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="1_line167" href="#1_line167">167</a> <font color="4444FF"><strong>}</strong></font>
</pre><!-- code2html delete stop -->
    </div>
    <a name="bug_2">
    <h4>Response Handler Created with Reference to Transient Messages</h4></a>
    <p>
      The <code>OperationResponseHandler</code> and derivative classes
      are constructed with a reference to <code>CIMRequest</code> and
      <code>CIMResponse</code> messages (i.e., the request/response
      pair related to the operation). These references were stored and
      used during the processing of responses. These references
      pointed to message that were deleted when the thread of
      execution left the dispatcher. For most CIM operations this is
      not a problem. However, in the case of indications the responses
      occur asynchronously. This caused the message references to
      point to deleted memory. Even this did not manifest a problem until the
      response handler was destroyed, which occured when the 
      <code>DisableIndications</code> message made its way to the 
      <code>ProviderManagerService</code>.
    </p>
    <div class="source">
      <h5>The fix - copy the messages passed to the response handler.</h5>
      <p>
	The lines that implement the fix are <a href="#2_line14">14 and 15</a>
	and <a href="#2_line102">102 and 103</a>.
      </p>
      <p>
	This is a fix that, in my opinion, should be generally applied
	to all response handlers.
      </p>
      <!-- code2html add -lcc -N bug_2.h
      --><!-- code2html delete start --><pre><a name="2_line1" href="#2_line1">  1</a> <font color="#444444">////////////////////-*-c++-*-///////////////////////////////////////////</font>
<a name="2_line2" href="#2_line2">  2</a> <strong>class</strong> <font color="#2040a0">EnableIndicationsResponseHandler</font> <font color="4444FF">:</font> 
<a name="2_line3" href="#2_line3">  3</a>    <strong>public</strong> <font color="#2040a0">OperationResponseHandler</font><font color="4444FF">&lt;</font><font color="#2040a0">CIMIndication</font><font color="4444FF">&gt;</font>
<a name="2_line4" href="#2_line4">  4</a> <font color="4444FF"><strong>{</strong></font>
<a name="2_line5" href="#2_line5">  5</a>    <strong>public</strong><font color="4444FF">:</font>
<a name="2_line6" href="#2_line6">  6</a>       <font color="#2040a0">EnableIndicationsResponseHandler</font><font color="4444FF">(</font>
<a name="2_line7" href="#2_line7">  7</a> 	 <font color="#2040a0">CIMEnableIndicationsRequestMessage</font> <font color="4444FF">*</font> <font color="#2040a0">request</font>,
<a name="2_line8" href="#2_line8">  8</a> 	 <font color="#2040a0">CIMEnableIndicationsResponseMessage</font> <font color="4444FF">*</font> <font color="#2040a0">response</font>,
<a name="2_line9" href="#2_line9">  9</a> 	 <font color="#2040a0">MessageQueueService</font> <font color="4444FF">*</font> <font color="#2040a0">source</font>,
<a name="2_line10" href="#2_line10"> 10</a> 	 <font color="#2040a0">MessageQueueService</font> <font color="4444FF">*</font> <font color="#2040a0">target</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">)</font>
<a name="2_line11" href="#2_line11"> 11</a> 	 <font color="4444FF">:</font> <font color="#2040a0">OperationResponseHandler</font><font color="4444FF">&lt;</font><font color="#2040a0">CIMIndication</font><font color="4444FF">&gt;</font><font color="4444FF">(</font><font color="#2040a0">request</font>, <font color="#2040a0">response</font><font color="4444FF">)</font>,
<a name="2_line12" href="#2_line12"> 12</a> 	   <font color="#2040a0">_source</font><font color="4444FF">(</font><font color="#2040a0">source</font><font color="4444FF">)</font>,
<a name="2_line13" href="#2_line13"> 13</a> 	   <font color="#2040a0">_target</font><font color="4444FF">(</font><font color="#2040a0">target</font><font color="4444FF">)</font>,
<a name="2_line14" href="#2_line14"> 14</a> 	   <font color="#2040a0">_request_copy</font><font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">request</font><font color="4444FF">)</font>,
<a name="2_line15" href="#2_line15"> 15</a> 	   <font color="#2040a0">_response_copy</font><font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">response</font><font color="4444FF">)</font>
<a name="2_line16" href="#2_line16"> 16</a>       <font color="4444FF"><strong>{</strong></font>
<a name="2_line17" href="#2_line17"> 17</a>         <font color="#2040a0">PEGASUS_ASSERT</font><font color="4444FF">(</font><font color="#2040a0">_source</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="2_line18" href="#2_line18"> 18</a> 
<a name="2_line19" href="#2_line19"> 19</a>         <font color="#444444">// get indication service</font>
<a name="2_line20" href="#2_line20"> 20</a>         <strong>if</strong><font color="4444FF">(</font><font color="#2040a0">_target</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">)</font>
<a name="2_line21" href="#2_line21"> 21</a>         <font color="4444FF"><strong>{</strong></font>
<a name="2_line22" href="#2_line22"> 22</a>             <font color="#2040a0">Array</font><font color="4444FF">&lt;</font><font color="#2040a0">Uint32</font><font color="4444FF">&gt;</font> <font color="#2040a0">serviceIds</font><font color="4444FF">;</font>
<a name="2_line23" href="#2_line23"> 23</a> 
<a name="2_line24" href="#2_line24"> 24</a>             <font color="#2040a0">_source</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">find_services</font><font color="4444FF">(</font>
<a name="2_line25" href="#2_line25"> 25</a> 	       <font color="#2040a0">PEGASUS_QUEUENAME_ESERVER_INDICATIONSERVICE</font>, 
<a name="2_line26" href="#2_line26"> 26</a> 	       <font color="#FF0000">0</font>, <font color="#FF0000">0</font>, <font color="4444FF">&amp;</font><font color="#2040a0">serviceIds</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="2_line27" href="#2_line27"> 27</a> 
<a name="2_line28" href="#2_line28"> 28</a>             <font color="#2040a0">PEGASUS_ASSERT</font><font color="4444FF">(</font><font color="#2040a0">serviceIds</font>.<font color="#2040a0">size</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="2_line29" href="#2_line29"> 29</a> 
<a name="2_line30" href="#2_line30"> 30</a>             <font color="#2040a0">_target</font> <font color="4444FF">=</font> <strong>dynamic_cast</strong><font color="4444FF">&lt;</font><font color="#2040a0">MessageQueueService</font> <font color="4444FF">*</font><font color="4444FF">&gt;</font><font color="4444FF">(</font>
<a name="2_line31" href="#2_line31"> 31</a> 	       <font color="#2040a0">MessageQueue</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">lookup</font><font color="4444FF">(</font><font color="#2040a0">serviceIds</font><font color="4444FF">[</font><font color="#FF0000">0</font><font color="4444FF">]</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="2_line32" href="#2_line32"> 32</a> 
<a name="2_line33" href="#2_line33"> 33</a>             <font color="#2040a0">PEGASUS_ASSERT</font><font color="4444FF">(</font><font color="#2040a0">_target</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="2_line34" href="#2_line34"> 34</a>         <font color="4444FF"><strong>}</strong></font>
<a name="2_line35" href="#2_line35"> 35</a>     <font color="4444FF"><strong>}</strong></font>
<a name="2_line36" href="#2_line36"> 36</a> 
<a name="2_line37" href="#2_line37"> 37</a>     <strong>virtual</strong> <strong>void</strong> <font color="#2040a0">deliver</font><font color="4444FF">(</font><strong>const</strong> <font color="#2040a0">CIMIndication</font> <font color="4444FF">&amp;</font> <font color="#2040a0">cimIndication</font><font color="4444FF">)</font>
<a name="2_line38" href="#2_line38"> 38</a>     <font color="4444FF"><strong>{</strong></font>
<a name="2_line39" href="#2_line39"> 39</a>         <font color="#2040a0">OperationContext</font> <font color="#2040a0">context</font><font color="4444FF">;</font>
<a name="2_line40" href="#2_line40"> 40</a> 
<a name="2_line41" href="#2_line41"> 41</a>         <font color="#2040a0">deliver</font><font color="4444FF">(</font><font color="#2040a0">context</font>, <font color="#2040a0">cimIndication</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="2_line42" href="#2_line42"> 42</a>     <font color="4444FF"><strong>}</strong></font>
<a name="2_line43" href="#2_line43"> 43</a> 
<a name="2_line44" href="#2_line44"> 44</a>     <strong>virtual</strong> <strong>void</strong> <font color="#2040a0">deliver</font><font color="4444FF">(</font><strong>const</strong> <font color="#2040a0">OperationContext</font> <font color="4444FF">&amp;</font> <font color="#2040a0">context</font>, 
<a name="2_line45" href="#2_line45"> 45</a> 			 <strong>const</strong> <font color="#2040a0">CIMIndication</font> <font color="4444FF">&amp;</font> <font color="#2040a0">cimIndication</font><font color="4444FF">)</font>
<a name="2_line46" href="#2_line46"> 46</a>     <font color="4444FF"><strong>{</strong></font>
<a name="2_line47" href="#2_line47"> 47</a>         <font color="#444444">// ATTN: temporarily convert indication to instance</font>
<a name="2_line48" href="#2_line48"> 48</a>         <font color="#2040a0">CIMInstance</font> <font color="#2040a0">cimInstance</font><font color="4444FF">(</font><font color="#2040a0">cimIndication</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="2_line49" href="#2_line49"> 49</a> 
<a name="2_line50" href="#2_line50"> 50</a>         <font color="#444444">// create message</font>
<a name="2_line51" href="#2_line51"> 51</a>         <font color="#2040a0">CIMProcessIndicationRequestMessage</font> <font color="4444FF">*</font> <font color="#2040a0">request</font> <font color="4444FF">=</font>
<a name="2_line52" href="#2_line52"> 52</a>             <strong>new</strong> <font color="#2040a0">CIMProcessIndicationRequestMessage</font><font color="4444FF">(</font>
<a name="2_line53" href="#2_line53"> 53</a> 	       <font color="#2040a0">_request_copy</font>.<font color="#2040a0">messageId</font>,
<a name="2_line54" href="#2_line54"> 54</a>             <font color="#2040a0">cimInstance</font>.<font color="#2040a0">getPath</font><font color="4444FF">(</font><font color="4444FF">)</font>.<font color="#2040a0">getNameSpace</font><font color="4444FF">(</font><font color="4444FF">)</font>,
<a name="2_line55" href="#2_line55"> 55</a>             <font color="#2040a0">cimInstance</font>,
<a name="2_line56" href="#2_line56"> 56</a>             <font color="#2040a0">QueueIdStack</font><font color="4444FF">(</font><font color="#2040a0">_target</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">getQueueId</font><font color="4444FF">(</font><font color="4444FF">)</font>, <font color="#2040a0">_source</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">getQueueId</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="2_line57" href="#2_line57"> 57</a> 
<a name="2_line58" href="#2_line58"> 58</a>         <font color="#444444">// send message</font>
<a name="2_line59" href="#2_line59"> 59</a>         <font color="#444444">// &lt;&lt;&lt; Wed Apr 10 21:04:00 2002 mdd &gt;&gt;&gt;</font>
<a name="2_line60" href="#2_line60"> 60</a>         <font color="#444444">// AsyncOpNode * op = _source-&gt;get_op();</font>
<a name="2_line61" href="#2_line61"> 61</a> 
<a name="2_line62" href="#2_line62"> 62</a>         <font color="#2040a0">AsyncLegacyOperationStart</font> <font color="4444FF">*</font> <font color="#2040a0">asyncRequest</font> <font color="4444FF">=</font>
<a name="2_line63" href="#2_line63"> 63</a>             <strong>new</strong> <font color="#2040a0">AsyncLegacyOperationStart</font><font color="4444FF">(</font>
<a name="2_line64" href="#2_line64"> 64</a>             <font color="#2040a0">_source</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">get_next_xid</font><font color="4444FF">(</font><font color="4444FF">)</font>,
<a name="2_line65" href="#2_line65"> 65</a>             <font color="#FF0000">0</font>,
<a name="2_line66" href="#2_line66"> 66</a>             <font color="#2040a0">_target</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">getQueueId</font><font color="4444FF">(</font><font color="4444FF">)</font>,
<a name="2_line67" href="#2_line67"> 67</a>             <font color="#2040a0">request</font>,
<a name="2_line68" href="#2_line68"> 68</a>             <font color="#2040a0">_target</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">getQueueId</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="2_line69" href="#2_line69"> 69</a> 
<a name="2_line70" href="#2_line70"> 70</a>         <font color="#2040a0">PEGASUS_ASSERT</font><font color="4444FF">(</font><font color="#2040a0">asyncRequest</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="2_line71" href="#2_line71"> 71</a> 
<a name="2_line72" href="#2_line72"> 72</a>         <font color="#444444">//AsyncReply * asyncReply = _source-&gt;SendWait(asyncRequest);</font>
<a name="2_line73" href="#2_line73"> 73</a>         <font color="#444444">// &lt;&lt;&lt; Wed Apr 10 21:04:50 2002 mdd &gt;&gt;&gt;</font>
<a name="2_line74" href="#2_line74"> 74</a>         <font color="#2040a0">_source</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">SendForget</font><font color="4444FF">(</font><font color="#2040a0">asyncRequest</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="2_line75" href="#2_line75"> 75</a>         <font color="#444444">//PEGASUS_ASSERT(asyncReply != 0);</font>
<a name="2_line76" href="#2_line76"> 76</a> 
<a name="2_line77" href="#2_line77"> 77</a>         <font color="#444444">//  Chip - receiver of the request should delete it</font>
<a name="2_line78" href="#2_line78"> 78</a>         <font color="#444444">//delete asyncRequest;</font>
<a name="2_line79" href="#2_line79"> 79</a>         <font color="#444444">// &lt;&lt;&lt; Wed Apr 10 21:05:10 2002 mdd &gt;&gt;&gt;</font>
<a name="2_line80" href="#2_line80"> 80</a>     <font color="4444FF"><strong>}</strong></font>
<a name="2_line81" href="#2_line81"> 81</a> 
<a name="2_line82" href="#2_line82"> 82</a>     <strong>virtual</strong> <strong>void</strong> <font color="#2040a0">deliver</font><font color="4444FF">(</font><strong>const</strong> <font color="#2040a0">Array</font><font color="4444FF">&lt;</font><font color="#2040a0">CIMIndication</font><font color="4444FF">&gt;</font> <font color="4444FF">&amp;</font> <font color="#2040a0">cimIndications</font><font color="4444FF">)</font>
<a name="2_line83" href="#2_line83"> 83</a>     <font color="4444FF"><strong>{</strong></font>
<a name="2_line84" href="#2_line84"> 84</a>         <font color="#2040a0">OperationContext</font> <font color="#2040a0">context</font><font color="4444FF">;</font>
<a name="2_line85" href="#2_line85"> 85</a> 
<a name="2_line86" href="#2_line86"> 86</a>         <font color="#2040a0">deliver</font><font color="4444FF">(</font><font color="#2040a0">context</font>, <font color="#2040a0">cimIndications</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="2_line87" href="#2_line87"> 87</a>     <font color="4444FF"><strong>}</strong></font>
<a name="2_line88" href="#2_line88"> 88</a> 
<a name="2_line89" href="#2_line89"> 89</a>     <strong>virtual</strong> <strong>void</strong> <font color="#2040a0">deliver</font><font color="4444FF">(</font><strong>const</strong> <font color="#2040a0">OperationContext</font> <font color="4444FF">&amp;</font> <font color="#2040a0">context</font>, 
<a name="2_line90" href="#2_line90"> 90</a> 			 <strong>const</strong> <font color="#2040a0">Array</font><font color="4444FF">&lt;</font><font color="#2040a0">CIMIndication</font><font color="4444FF">&gt;</font> <font color="4444FF">&amp;</font> <font color="#2040a0">cimIndications</font><font color="4444FF">)</font>
<a name="2_line91" href="#2_line91"> 91</a>     <font color="4444FF"><strong>{</strong></font>
<a name="2_line92" href="#2_line92"> 92</a>         <strong>for</strong><font color="4444FF">(</font><font color="#2040a0">Uint32</font> <font color="#2040a0">i</font> <font color="4444FF">=</font> <font color="#FF0000">0</font>, <font color="#2040a0">n</font> <font color="4444FF">=</font> <font color="#2040a0">cimIndications</font>.<font color="#2040a0">size</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font> <font color="#2040a0">i</font> <font color="4444FF">&lt;</font> <font color="#2040a0">n</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font>
<a name="2_line93" href="#2_line93"> 93</a>         <font color="4444FF"><strong>{</strong></font>
<a name="2_line94" href="#2_line94"> 94</a>             <font color="#2040a0">deliver</font><font color="4444FF">(</font><font color="#2040a0">context</font>, <font color="#2040a0">cimIndications</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="2_line95" href="#2_line95"> 95</a>         <font color="4444FF"><strong>}</strong></font>
<a name="2_line96" href="#2_line96"> 96</a>     <font color="4444FF"><strong>}</strong></font>
<a name="2_line97" href="#2_line97"> 97</a> 
<a name="2_line98" href="#2_line98"> 98</a>    <strong>protected</strong><font color="4444FF">:</font>
<a name="2_line99" href="#2_line99"> 99</a>       <font color="#2040a0">MessageQueueService</font> <font color="4444FF">*</font> <font color="#2040a0">_source</font><font color="4444FF">;</font>
<a name="2_line100" href="#2_line100">100</a>       <font color="#2040a0">MessageQueueService</font> <font color="4444FF">*</font> <font color="#2040a0">_target</font><font color="4444FF">;</font>
<a name="2_line101" href="#2_line101">101</a>    <strong>private</strong><font color="4444FF">:</font>
<a name="2_line102" href="#2_line102">102</a>       <font color="#2040a0">CIMEnableIndicationsRequestMessage</font> <font color="#2040a0">_request_copy</font><font color="4444FF">;</font>
<a name="2_line103" href="#2_line103">103</a>       <font color="#2040a0">CIMEnableIndicationsResponseMessage</font> <font color="#2040a0">_response_copy</font><font color="4444FF">;</font>
<a name="2_line104" href="#2_line104">104</a> <font color="4444FF"><strong>}</strong></font><font color="4444FF">;</font>
</pre><!-- code2html delete stop -->
    </div>
<a name="bug_3">
<h4>Converting References to CIMInstances</h4></a>
    <p>
      References stored in subscriptions and providers were sometimes
      being handled incorrectly in the <code>IndicationService</code>
      and the <code>ProviderRegistrationManager</code>, at least when
      the relationship between class names, class properties, and
      reference properties was concerned. Reference handling in
      general could use a library of helper routines. It is too error
      prone right now to extract a reference and turn it into a
      <code>CIMInstance</code>.</p>
    <p>
      As I was reviewing the <code>IndicationService</code> I noticed
      that a lot of the "dereferencing" of references was done in
      fairly long code segments that repeated themselves several times
      with only slight differences. I decided to distill that code
      into some more compact helper routines. I started on this but
      haven't finished yet. 
    </p>

    <div class="source">
      <h5>Partial Fix: helper routines</h5>
      <div class= "comment">
      <p>
	I started working on some helper routines in my re-written
	<code>IndicationService</code>. Distilling a few routines into
	lower-level helpers allowed my to jettison a lot of code. As
	far as I could tell the code in the original Indication
	Service that I replaced should work just fine but I couldn't
	get it to. I felt that distilling the code would give me an
	edge in fixing underlying Pegasus bugs. I still think the bugs
	  were elsewhere (not in the <code>IndicationService</code>)
	  but I can't prove it. 
      </p>

      <p>
	In general I think that Pegasus could benefit greatly from a
	library of similar, more general, static helper routines to deal
	with name spaces and the conversion between references and the
	instances they refer to.
      </p>
      <p>
	I also did some similar rewrites in the
	<code>ProviderRegistrationManager</code>.
      </p>
      </div>
      <!-- code2html add -lcc -N bug_3.cpp
      --><!-- code2html delete start --><pre><a name="3_line1" href="#3_line1">  1</a> 
<a name="3_line2" href="#3_line2">  2</a> <font color="#444444">//%/////////////////////////////////////////////////////////////////</font>
<a name="3_line3" href="#3_line3">  3</a> <font color="#444444">// Take an association class and a name of one or the references. </font>
<a name="3_line4" href="#3_line4">  4</a> <font color="#444444">// Return a CIMObjectPath that contains the instance of the referred </font>
<a name="3_line5" href="#3_line5">  5</a> <font color="#444444">// to object. </font>
<a name="3_line6" href="#3_line6">  6</a> <font color="#444444">///////////////////////////////////////////////////////////////////</font>
<a name="3_line7" href="#3_line7">  7</a> <font color="#2040a0">Boolean</font> <font color="#2040a0">eServerIndicationService</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">_get_object_path_from_association</font><font color="4444FF">(</font>
<a name="3_line8" href="#3_line8">  8</a>    <strong>const</strong> <font color="#2040a0">String</font> <font color="4444FF">&amp;</font> <font color="#2040a0">reference_name</font>,
<a name="3_line9" href="#3_line9">  9</a>    <strong>const</strong> <font color="#2040a0">CIMInstance</font> <font color="4444FF">&amp;</font> <font color="#2040a0">association</font>, 
<a name="3_line10" href="#3_line10"> 10</a>    <font color="#2040a0">CIMObjectPath</font> <font color="4444FF">&amp;</font> <font color="#2040a0">path</font><font color="4444FF">)</font> <strong>const</strong> 
<a name="3_line11" href="#3_line11"> 11</a> <font color="4444FF"><strong>{</strong></font>
<a name="3_line12" href="#3_line12"> 12</a>    
<a name="3_line13" href="#3_line13"> 13</a>    <font color="#2040a0">path</font>.<font color="#2040a0">clear</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line14" href="#3_line14"> 14</a>    <font color="#2040a0">try</font>
<a name="3_line15" href="#3_line15"> 15</a>    <font color="4444FF"><strong>{</strong></font>
<a name="3_line16" href="#3_line16"> 16</a>       <font color="#2040a0">CIMValue</font> <font color="#2040a0">path_value</font> <font color="4444FF">=</font> <font color="#2040a0">association</font>.<font color="#2040a0">getProperty</font><font color="4444FF">(</font>
<a name="3_line17" href="#3_line17"> 17</a> 	 <font color="#2040a0">association</font>.<font color="#2040a0">findProperty</font><font color="4444FF">(</font><font color="#2040a0">reference_name</font><font color="4444FF">)</font><font color="4444FF">)</font>.<font color="#2040a0">getValue</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line18" href="#3_line18"> 18</a>       <font color="#2040a0">path_value</font>.<font color="#2040a0">get</font><font color="4444FF">(</font><font color="#2040a0">path</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line19" href="#3_line19"> 19</a>    <font color="4444FF"><strong>}</strong></font>
<a name="3_line20" href="#3_line20"> 20</a>    <strong>catch</strong><font color="4444FF">(</font>...<font color="4444FF">)</font>
<a name="3_line21" href="#3_line21"> 21</a>    <font color="4444FF"><strong>{</strong></font>
<a name="3_line22" href="#3_line22"> 22</a>       <strong>return</strong> <strong>false</strong><font color="4444FF">;</font>
<a name="3_line23" href="#3_line23"> 23</a>    <font color="4444FF"><strong>}</strong></font>
<a name="3_line24" href="#3_line24"> 24</a>    
<a name="3_line25" href="#3_line25"> 25</a>    <strong>return</strong> <strong>true</strong><font color="4444FF">;</font>
<a name="3_line26" href="#3_line26"> 26</a> <font color="4444FF"><strong>}</strong></font>
<a name="3_line27" href="#3_line27"> 27</a> 
<a name="3_line28" href="#3_line28"> 28</a> <font color="#444444">//%/////////////////////////////////////////////////////////////////</font>
<a name="3_line29" href="#3_line29"> 29</a> <font color="#444444">// Get all the name spaces in the repository. </font>
<a name="3_line30" href="#3_line30"> 30</a> <font color="#444444">// This should really be a static method that any class should be </font>
<a name="3_line31" href="#3_line31"> 31</a> <font color="#444444">// able to call</font>
<a name="3_line32" href="#3_line32"> 32</a> <font color="#444444">///////////////////////////////////////////////////////////////////</font>
<a name="3_line33" href="#3_line33"> 33</a> <strong>void</strong> <font color="#2040a0">eServerIndicationService</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">_getNameSpaceNames</font> <font color="4444FF">(</font>
<a name="3_line34" href="#3_line34"> 34</a>    <font color="#2040a0">Array</font><font color="4444FF">&lt;</font><font color="#2040a0">String</font><font color="4444FF">&gt;</font> <font color="4444FF">&amp;</font> <font color="#2040a0">nameSpaceNames</font><font color="4444FF">)</font> <strong>const</strong>
<a name="3_line35" href="#3_line35"> 35</a> <font color="4444FF"><strong>{</strong></font>
<a name="3_line36" href="#3_line36"> 36</a>    
<a name="3_line37" href="#3_line37"> 37</a>    <font color="#2040a0">PEG_METHOD_ENTER</font> <font color="4444FF">(</font><font color="#2040a0">TRC_INDICATION_SERVICE</font>,
<a name="3_line38" href="#3_line38"> 38</a> 		     <font color="#008000">&quot;eServerIndicationService::__getNameSpaceNames&quot;</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line39" href="#3_line39"> 39</a>    <font color="#2040a0">nameSpaceNames</font>.<font color="#2040a0">clear</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line40" href="#3_line40"> 40</a>    
<a name="3_line41" href="#3_line41"> 41</a>    <font color="#2040a0">_repository</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">read_lock</font> <font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line42" href="#3_line42"> 42</a>    
<a name="3_line43" href="#3_line43"> 43</a>    <font color="#2040a0">try</font>
<a name="3_line44" href="#3_line44"> 44</a>    <font color="4444FF"><strong>{</strong></font>
<a name="3_line45" href="#3_line45"> 45</a>       <font color="#2040a0">nameSpaceNames</font> <font color="4444FF">=</font> <font color="#2040a0">_repository</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">enumerateNameSpaces</font> <font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line46" href="#3_line46"> 46</a>    <font color="4444FF"><strong>}</strong></font>
<a name="3_line47" href="#3_line47"> 47</a>    <strong>catch</strong> <font color="4444FF">(</font><font color="#2040a0">Exception</font> <font color="4444FF">&amp;</font><font color="4444FF">)</font>
<a name="3_line48" href="#3_line48"> 48</a>    <font color="4444FF"><strong>{</strong></font>
<a name="3_line49" href="#3_line49"> 49</a>       <font color="#2040a0">_repository</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">read_unlock</font> <font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line50" href="#3_line50"> 50</a>       <font color="#2040a0">PEG_METHOD_EXIT</font> <font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line51" href="#3_line51"> 51</a>    <font color="4444FF"><strong>}</strong></font>
<a name="3_line52" href="#3_line52"> 52</a>    
<a name="3_line53" href="#3_line53"> 53</a>    <font color="#2040a0">_repository</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">read_unlock</font> <font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line54" href="#3_line54"> 54</a>    
<a name="3_line55" href="#3_line55"> 55</a>    <font color="#2040a0">PEG_METHOD_EXIT</font> <font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line56" href="#3_line56"> 56</a> <font color="4444FF"><strong>}</strong></font>
<a name="3_line57" href="#3_line57"> 57</a> 
<a name="3_line58" href="#3_line58"> 58</a> <font color="#444444">//%/////////////////////////////////////////////////////////////////</font>
<a name="3_line59" href="#3_line59"> 59</a> <font color="#444444">// Get all subscriptions that refer to a specific indication class</font>
<a name="3_line60" href="#3_line60"> 60</a> <font color="#444444">// returns subscriptions in all name spaces. Calls lower-level</font>
<a name="3_line61" href="#3_line61"> 61</a> <font color="#444444">// _getMatchingSubscriptions. </font>
<a name="3_line62" href="#3_line62"> 62</a> <font color="#444444">///////////////////////////////////////////////////////////////////</font>
<a name="3_line63" href="#3_line63"> 63</a> <strong>void</strong> <font color="#2040a0">eServerIndicationService</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">_getMatchingSubscriptions</font><font color="4444FF">(</font>
<a name="3_line64" href="#3_line64"> 64</a>    <strong>const</strong> <font color="#2040a0">CIMInstance</font> <font color="4444FF">&amp;</font> <font color="#2040a0">indication</font>,
<a name="3_line65" href="#3_line65"> 65</a>    <font color="#2040a0">Array</font><font color="4444FF">&lt;</font><font color="#2040a0">CIMInstance</font><font color="4444FF">&gt;</font> <font color="4444FF">&amp;</font> <font color="#2040a0">subscriptions</font><font color="4444FF">)</font> <strong>const</strong> 
<a name="3_line66" href="#3_line66"> 66</a> <font color="4444FF"><strong>{</strong></font>
<a name="3_line67" href="#3_line67"> 67</a>    <font color="#2040a0">Array</font><font color="4444FF">&lt;</font><font color="#2040a0">String</font><font color="4444FF">&gt;</font> <font color="#2040a0">nameSpaceNames</font><font color="4444FF">;</font>
<a name="3_line68" href="#3_line68"> 68</a>    <font color="#2040a0">_getNameSpaceNames</font><font color="4444FF">(</font><font color="#2040a0">nameSpaceNames</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line69" href="#3_line69"> 69</a>    
<a name="3_line70" href="#3_line70"> 70</a>    <strong>for</strong><font color="4444FF">(</font><font color="#2040a0">Uint8</font> <font color="#2040a0">i</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">i</font> <font color="4444FF">&lt;</font> <font color="#2040a0">nameSpaceNames</font>.<font color="#2040a0">size</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">;</font> <font color="4444FF">+</font><font color="4444FF">+</font><font color="#2040a0">i</font><font color="4444FF">)</font>
<a name="3_line71" href="#3_line71"> 71</a>    <font color="4444FF"><strong>{</strong></font>
<a name="3_line72" href="#3_line72"> 72</a>       <font color="#2040a0">_getMatchingSubscriptions</font><font color="4444FF">(</font> <font color="#2040a0">nameSpaceNames</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font>,
<a name="3_line73" href="#3_line73"> 73</a> 				 <font color="#2040a0">indication</font>, 
<a name="3_line74" href="#3_line74"> 74</a> 				 <font color="#2040a0">subscriptions</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line75" href="#3_line75"> 75</a>    <font color="4444FF"><strong>}</strong></font>
<a name="3_line76" href="#3_line76"> 76</a> <font color="4444FF"><strong>}</strong></font>
<a name="3_line77" href="#3_line77"> 77</a> 
<a name="3_line78" href="#3_line78"> 78</a> 
<a name="3_line79" href="#3_line79"> 79</a> <font color="#444444">//%/////////////////////////////////////////////////////////////////</font>
<a name="3_line80" href="#3_line80"> 80</a> <font color="#444444">// Get all subscriptions that refer to a specific indication class</font>
<a name="3_line81" href="#3_line81"> 81</a> <font color="#444444">// for a specific name space. </font>
<a name="3_line82" href="#3_line82"> 82</a> <font color="#444444">///////////////////////////////////////////////////////////////////</font>
<a name="3_line83" href="#3_line83"> 83</a> <strong>void</strong> <font color="#2040a0">eServerIndicationService</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">_getMatchingSubscriptions</font><font color="4444FF">(</font>
<a name="3_line84" href="#3_line84"> 84</a>    <strong>const</strong> <font color="#2040a0">String</font> <font color="4444FF">&amp;</font> <font color="#2040a0">nameSpaceName</font>, 
<a name="3_line85" href="#3_line85"> 85</a>    <strong>const</strong> <font color="#2040a0">CIMInstance</font> <font color="4444FF">&amp;</font> <font color="#2040a0">indication</font>,
<a name="3_line86" href="#3_line86"> 86</a>    <font color="#2040a0">Array</font><font color="4444FF">&lt;</font><font color="#2040a0">CIMInstance</font><font color="4444FF">&gt;</font> <font color="4444FF">&amp;</font> <font color="#2040a0">subscriptions</font><font color="4444FF">)</font> <strong>const</strong>
<a name="3_line87" href="#3_line87"> 87</a> <font color="4444FF"><strong>{</strong></font>
<a name="3_line88" href="#3_line88"> 88</a>    <font color="#2040a0">Array</font><font color="4444FF">&lt;</font><font color="#2040a0">CIMInstance</font><font color="4444FF">&gt;</font> <font color="#2040a0">all_subscriptions</font><font color="4444FF">;</font>
<a name="3_line89" href="#3_line89"> 89</a>    <font color="#2040a0">_getSubscriptions</font><font color="4444FF">(</font><font color="#2040a0">nameSpaceName</font>, <font color="#2040a0">all_subscriptions</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line90" href="#3_line90"> 90</a>    
<a name="3_line91" href="#3_line91"> 91</a>    <font color="#2040a0">String</font> <font color="#2040a0">indication_class_name</font> <font color="4444FF">=</font> <font color="#2040a0">indication</font>.<font color="#2040a0">getClassName</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line92" href="#3_line92"> 92</a>    <font color="#2040a0">CIMObjectPath</font> <font color="#2040a0">compare_path</font><font color="4444FF">;</font>
<a name="3_line93" href="#3_line93"> 93</a>    
<a name="3_line94" href="#3_line94"> 94</a> 
<a name="3_line95" href="#3_line95"> 95</a>    <strong>for</strong><font color="4444FF">(</font><font color="#2040a0">Uint8</font> <font color="#2040a0">x</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font> 
<a name="3_line96" href="#3_line96"> 96</a>        <font color="#2040a0">x</font> <font color="4444FF">&lt;</font> <font color="#2040a0">all_subscriptions</font>.<font color="#2040a0">size</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">;</font> 
<a name="3_line97" href="#3_line97"> 97</a>        <font color="4444FF">+</font><font color="4444FF">+</font><font color="#2040a0">x</font>, <font color="#2040a0">compare_path</font>.<font color="#2040a0">clear</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font>
<a name="3_line98" href="#3_line98"> 98</a>    <font color="4444FF"><strong>{</strong></font>
<a name="3_line99" href="#3_line99"> 99</a>       <font color="#2040a0">_get_object_path_from_association</font><font color="4444FF">(</font><font color="#008000">&quot;Indication_Class&quot;</font>, 
<a name="3_line100" href="#3_line100">100</a> 					<font color="#2040a0">all_subscriptions</font><font color="4444FF">[</font><font color="#2040a0">x</font><font color="4444FF">]</font>,
<a name="3_line101" href="#3_line101">101</a> 					<font color="#2040a0">compare_path</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line102" href="#3_line102">102</a>       <strong>if</strong><font color="4444FF">(</font><font color="#2040a0">compare_path</font>.<font color="#2040a0">getClassName</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#2040a0">indication_class_name</font><font color="4444FF">)</font>
<a name="3_line103" href="#3_line103">103</a>       <font color="4444FF"><strong>{</strong></font>
<a name="3_line104" href="#3_line104">104</a> 	 <font color="#2040a0">CIMObjectPath</font> <font color="#2040a0">temp</font> <font color="4444FF">=</font> <font color="#2040a0">all_subscriptions</font><font color="4444FF">[</font><font color="#2040a0">x</font><font color="4444FF">]</font>.<font color="#2040a0">getPath</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line105" href="#3_line105">105</a> 	 <font color="#2040a0">temp</font>.<font color="#2040a0">setNameSpace</font><font color="4444FF">(</font><font color="#2040a0">nameSpaceName</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line106" href="#3_line106">106</a> 	 <font color="#2040a0">all_subscriptions</font><font color="4444FF">[</font><font color="#2040a0">x</font><font color="4444FF">]</font>.<font color="#2040a0">setPath</font><font color="4444FF">(</font><font color="#2040a0">temp</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line107" href="#3_line107">107</a> 	 <font color="#2040a0">subscriptions</font>.<font color="#2040a0">append</font><font color="4444FF">(</font><font color="#2040a0">all_subscriptions</font><font color="4444FF">[</font><font color="#2040a0">x</font><font color="4444FF">]</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line108" href="#3_line108">108</a>       <font color="4444FF"><strong>}</strong></font>
<a name="3_line109" href="#3_line109">109</a>     <font color="4444FF"><strong>}</strong></font>
<a name="3_line110" href="#3_line110">110</a>    <strong>return</strong><font color="4444FF">;</font>
<a name="3_line111" href="#3_line111">111</a> <font color="4444FF"><strong>}</strong></font>
<a name="3_line112" href="#3_line112">112</a> 
<a name="3_line113" href="#3_line113">113</a> <font color="#444444">//%/////////////////////////////////////////////////////////////////</font>
<a name="3_line114" href="#3_line114">114</a> <font color="#444444">// Get all subscriptions in the repository for a specific name space</font>
<a name="3_line115" href="#3_line115">115</a> <font color="#444444">///////////////////////////////////////////////////////////////////</font>
<a name="3_line116" href="#3_line116">116</a> <strong>void</strong> <font color="#2040a0">eServerIndicationService</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">_getSubscriptions</font> <font color="4444FF">(</font>
<a name="3_line117" href="#3_line117">117</a>    <strong>const</strong> <font color="#2040a0">String</font> <font color="4444FF">&amp;</font> <font color="#2040a0">nameSpaceName</font>, 
<a name="3_line118" href="#3_line118">118</a>    <font color="#2040a0">Array</font> <font color="4444FF">&lt;</font><font color="#2040a0">CIMInstance</font><font color="4444FF">&gt;</font> <font color="4444FF">&amp;</font> <font color="#2040a0">subscriptions</font><font color="4444FF">)</font> <strong>const</strong>
<a name="3_line119" href="#3_line119">119</a> <font color="4444FF"><strong>{</strong></font>
<a name="3_line120" href="#3_line120">120</a>    
<a name="3_line121" href="#3_line121">121</a> 
<a name="3_line122" href="#3_line122">122</a>    <font color="#2040a0">PEG_METHOD_ENTER</font> <font color="4444FF">(</font><font color="#2040a0">TRC_INDICATION_SERVICE</font>,
<a name="3_line123" href="#3_line123">123</a> 		     <font color="#008000">&quot;eServerIndicationService::_getSubscriptions&quot;</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line124" href="#3_line124">124</a>    
<a name="3_line125" href="#3_line125">125</a>    <font color="#444444">//</font>
<a name="3_line126" href="#3_line126">126</a>    <font color="#444444">//  Get existing subscriptions in current namespace</font>
<a name="3_line127" href="#3_line127">127</a>    <font color="#444444">//</font>
<a name="3_line128" href="#3_line128">128</a>    <font color="#2040a0">_repository</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">read_lock</font> <font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line129" href="#3_line129">129</a> 
<a name="3_line130" href="#3_line130">130</a>    <font color="#2040a0">try</font>
<a name="3_line131" href="#3_line131">131</a>    <font color="4444FF"><strong>{</strong></font>
<a name="3_line132" href="#3_line132">132</a>       <font color="#2040a0">subscriptions</font>  <font color="4444FF">=</font> <font color="#2040a0">_repository</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">enumerateInstances</font>
<a name="3_line133" href="#3_line133">133</a> 	 <font color="4444FF">(</font><font color="#2040a0">nameSpaceName</font>, <font color="#2040a0">ESERVER_CLASSNAME_INDSUBSCRIPTION</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line134" href="#3_line134">134</a>    <font color="4444FF"><strong>}</strong></font>
<a name="3_line135" href="#3_line135">135</a>    <strong>catch</strong> <font color="4444FF">(</font><font color="#2040a0">CIMException</font> <font color="#2040a0">e</font><font color="4444FF">)</font>
<a name="3_line136" href="#3_line136">136</a>    <font color="4444FF"><strong>{</strong></font>
<a name="3_line137" href="#3_line137">137</a>       <font color="#444444">//</font>
<a name="3_line138" href="#3_line138">138</a>       <font color="#444444">//  Some namespaces may not include the subscription class</font>
<a name="3_line139" href="#3_line139">139</a>       <font color="#444444">//  In that case, just return no subscriptions</font>
<a name="3_line140" href="#3_line140">140</a>       <font color="#444444">//  Any other exception is an error</font>
<a name="3_line141" href="#3_line141">141</a>       <font color="#444444">//</font>
<a name="3_line142" href="#3_line142">142</a>       <strong>if</strong> <font color="4444FF">(</font><font color="#2040a0">e</font>.<font color="#2040a0">getCode</font> <font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#2040a0">CIM_ERR_INVALID_CLASS</font><font color="4444FF">)</font>
<a name="3_line143" href="#3_line143">143</a>       <font color="4444FF"><strong>{</strong></font>
<a name="3_line144" href="#3_line144">144</a> 	 <font color="#2040a0">_repository</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">read_unlock</font> <font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line145" href="#3_line145">145</a> 	 <font color="#2040a0">PEG_METHOD_EXIT</font> <font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line146" href="#3_line146">146</a>       <font color="4444FF"><strong>}</strong></font>
<a name="3_line147" href="#3_line147">147</a>    <font color="4444FF"><strong>}</strong></font>
<a name="3_line148" href="#3_line148">148</a> 
<a name="3_line149" href="#3_line149">149</a>    <font color="#2040a0">_repository</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">read_unlock</font> <font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line150" href="#3_line150">150</a> 
<a name="3_line151" href="#3_line151">151</a>    <font color="#2040a0">PEG_METHOD_EXIT</font> <font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="3_line152" href="#3_line152">152</a> <font color="4444FF"><strong>}</strong></font>
</pre><!-- code2html delete stop -->
    </div>
<a name="bug_4">
<h4>Pegasus Array Template and Virtual Base Classes in Provider Heirarchy</h4></a>
    <p>
      I think this bug is pretty well understood among Pegasus
      developers. The problem is in the <code>Array</code> and the way
      it moves elements that are inserted or deleted from to or from
      an existing array. The problem only manifests itself when arrays
      store objects that have a virtual base class, such as
      <code>Provider</code>.
    </p>
    <div class="source">
      <h5><a href="#array_fix">Fix</a> - only store pointers to dynamically allocated objects
	in hashtables - when those objects have a virtual base. </h5>
      <div class="comment">
	<p>
	The source of the problem is in lines <a
	href="#4_line17">17</a> and <a href="#4_line47">47</a>.
	</p>
	<p>
	  Classes like <code>Provider</code>, which has a virtual base
	  class, stores a pointer to that virtual base class within
	  its object. When the <code>Array</code> moves the memory
	  upon an insert or delete, it moves the class object but does
	  not reinitialize the object's pointer to its virtual
	  base. The object is then corrupt because its vtable has a
	  bad pointer to the object's virtual base class. 
	</p>
	<p>
	  The problem is related to indications because the
	  <code>IndicationService</code> needs to load Indication
	  providers when an indication is enabled. Typically this
	  happens after Pegasus is up and running for a while and
	  therefore the <code>memmove</code> is more likely to corrupt
	  vtables as described above. The <a href="#array_fix">fix</a>
	  is below.
	</p>
      </div>
      <!-- code2html add -lcc -N bug_4.h
      --><!-- code2html delete start --><pre><a name="4_line1" href="#4_line1"> 1</a> <font color="#444444">// -*-c++-*-</font>
<a name="4_line2" href="#4_line2"> 2</a> <font color="0000ff"><strong>#ifndef PEGASUS_ARRAY_T</strong></font>
<a name="4_line3" href="#4_line3"> 3</a> <strong>template</strong><font color="4444FF">&lt;</font><strong>class</strong> <font color="#2040a0">PEGASUS_ARRAY_T</font><font color="4444FF">&gt;</font>
<a name="4_line4" href="#4_line4"> 4</a> <font color="0000ff"><strong>#endif</strong></font>
<a name="4_line5" href="#4_line5"> 5</a> <strong>void</strong> <font color="#2040a0">Array</font><font color="4444FF">&lt;</font><font color="#2040a0">PEGASUS_ARRAY_T</font><font color="4444FF">&gt;</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">insert</font><font color="4444FF">(</font><font color="#2040a0">Uint32</font> <font color="#2040a0">pos</font>, 
<a name="4_line6" href="#4_line6"> 6</a> 				    <strong>const</strong> <font color="#2040a0">PEGASUS_ARRAY_T</font><font color="4444FF">*</font> <font color="#2040a0">x</font>, 
<a name="4_line7" href="#4_line7"> 7</a> 				    <font color="#2040a0">Uint32</font> <font color="#2040a0">size</font><font color="4444FF">)</font>
<a name="4_line8" href="#4_line8"> 8</a> <font color="4444FF"><strong>{</strong></font>
<a name="4_line9" href="#4_line9"> 9</a>     <strong>if</strong> <font color="4444FF">(</font><font color="#2040a0">pos</font> <font color="4444FF">&gt;</font> <strong>this</strong><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">size</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font>
<a name="4_line10" href="#4_line10">10</a>         <font color="#2040a0">ThrowOutOfBounds</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="4_line11" href="#4_line11">11</a> 
<a name="4_line12" href="#4_line12">12</a>     <font color="#2040a0">reserve</font><font color="4444FF">(</font><strong>this</strong><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">size</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">+</font> <font color="#2040a0">size</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="4_line13" href="#4_line13">13</a> 
<a name="4_line14" href="#4_line14">14</a>     <font color="#2040a0">Uint32</font> <font color="#2040a0">n</font> <font color="4444FF">=</font> <strong>this</strong><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">size</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">-</font> <font color="#2040a0">pos</font><font color="4444FF">;</font>
<a name="4_line15" href="#4_line15">15</a> 
<a name="4_line16" href="#4_line16">16</a>     <strong>if</strong> <font color="4444FF">(</font><font color="#2040a0">n</font><font color="4444FF">)</font>
<a name="4_line17" href="#4_line17">17</a>         <font color="#2040a0">memmove</font><font color="4444FF">(</font>
<a name="4_line18" href="#4_line18">18</a>             <font color="#2040a0">_data</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">+</font> <font color="#2040a0">pos</font> <font color="4444FF">+</font> <font color="#2040a0">size</font>, 
<a name="4_line19" href="#4_line19">19</a> 	    <font color="#2040a0">_data</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">+</font> <font color="#2040a0">pos</font>, 
<a name="4_line20" href="#4_line20">20</a> 	    <strong>sizeof</strong><font color="4444FF">(</font><font color="#2040a0">PEGASUS_ARRAY_T</font><font color="4444FF">)</font> <font color="4444FF">*</font> <font color="#2040a0">n</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="4_line21" href="#4_line21">21</a> 
<a name="4_line22" href="#4_line22">22</a>     <font color="#2040a0">CopyToRaw</font><font color="4444FF">(</font><font color="#2040a0">_data</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">+</font> <font color="#2040a0">pos</font>, <font color="#2040a0">x</font>, <font color="#2040a0">size</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="4_line23" href="#4_line23">23</a>     <strong>static_cast</strong><font color="4444FF">&lt;</font><font color="#2040a0">ArrayRep</font><font color="4444FF">&lt;</font><font color="#2040a0">PEGASUS_ARRAY_T</font><font color="4444FF">&gt;</font><font color="4444FF">*</font><font color="4444FF">&gt;</font><font color="4444FF">(</font><font color="#2040a0">_rep</font><font color="4444FF">)</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">size</font> <font color="4444FF">+</font><font color="4444FF">=</font> <font color="#2040a0">size</font><font color="4444FF">;</font>
<a name="4_line24" href="#4_line24">24</a> <font color="4444FF"><strong>}</strong></font>
<a name="4_line25" href="#4_line25">25</a> 
<a name="4_line26" href="#4_line26">26</a> <font color="0000ff"><strong>#ifndef PEGASUS_ARRAY_T</strong></font>
<a name="4_line27" href="#4_line27">27</a> <strong>template</strong><font color="4444FF">&lt;</font><strong>class</strong> <font color="#2040a0">PEGASUS_ARRAY_T</font><font color="4444FF">&gt;</font>
<a name="4_line28" href="#4_line28">28</a> <font color="0000ff"><strong>#endif</strong></font>
<a name="4_line29" href="#4_line29">29</a> <strong>void</strong> <font color="#2040a0">Array</font><font color="4444FF">&lt;</font><font color="#2040a0">PEGASUS_ARRAY_T</font><font color="4444FF">&gt;</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">remove</font><font color="4444FF">(</font><font color="#2040a0">Uint32</font> <font color="#2040a0">pos</font><font color="4444FF">)</font>
<a name="4_line30" href="#4_line30">30</a> <font color="4444FF"><strong>{</strong></font>
<a name="4_line31" href="#4_line31">31</a>     <font color="#2040a0">remove</font><font color="4444FF">(</font><font color="#2040a0">pos</font>, <font color="#FF0000">1</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="4_line32" href="#4_line32">32</a> <font color="4444FF"><strong>}</strong></font>
<a name="4_line33" href="#4_line33">33</a> 
<a name="4_line34" href="#4_line34">34</a> <font color="0000ff"><strong>#ifndef PEGASUS_ARRAY_T</strong></font>
<a name="4_line35" href="#4_line35">35</a> <strong>template</strong><font color="4444FF">&lt;</font><strong>class</strong> <font color="#2040a0">PEGASUS_ARRAY_T</font><font color="4444FF">&gt;</font>
<a name="4_line36" href="#4_line36">36</a> <font color="0000ff"><strong>#endif</strong></font>
<a name="4_line37" href="#4_line37">37</a> <strong>void</strong> <font color="#2040a0">Array</font><font color="4444FF">&lt;</font><font color="#2040a0">PEGASUS_ARRAY_T</font><font color="4444FF">&gt;</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">remove</font><font color="4444FF">(</font><font color="#2040a0">Uint32</font> <font color="#2040a0">pos</font>, <font color="#2040a0">Uint32</font> <font color="#2040a0">size</font><font color="4444FF">)</font>
<a name="4_line38" href="#4_line38">38</a> <font color="4444FF"><strong>{</strong></font>
<a name="4_line39" href="#4_line39">39</a>     <strong>if</strong> <font color="4444FF">(</font><font color="#2040a0">pos</font> <font color="4444FF">+</font> <font color="#2040a0">size</font> <font color="4444FF">-</font> <font color="#FF0000">1</font> <font color="4444FF">&gt;</font> <strong>this</strong><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">size</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font>
<a name="4_line40" href="#4_line40">40</a>         <font color="#2040a0">ThrowOutOfBounds</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="4_line41" href="#4_line41">41</a> 
<a name="4_line42" href="#4_line42">42</a>     <font color="#2040a0">Destroy</font><font color="4444FF">(</font><font color="#2040a0">_data</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">+</font> <font color="#2040a0">pos</font>, <font color="#2040a0">size</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="4_line43" href="#4_line43">43</a> 
<a name="4_line44" href="#4_line44">44</a>     <font color="#2040a0">Uint32</font> <font color="#2040a0">rem</font> <font color="4444FF">=</font> <strong>this</strong><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">size</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">-</font> <font color="4444FF">(</font><font color="#2040a0">pos</font> <font color="4444FF">+</font> <font color="#2040a0">size</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="4_line45" href="#4_line45">45</a> 
<a name="4_line46" href="#4_line46">46</a>     <strong>if</strong> <font color="4444FF">(</font><font color="#2040a0">rem</font><font color="4444FF">)</font>
<a name="4_line47" href="#4_line47">47</a>         <font color="#2040a0">memmove</font><font color="4444FF">(</font>
<a name="4_line48" href="#4_line48">48</a>             <font color="#2040a0">_data</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">+</font> <font color="#2040a0">pos</font>, 
<a name="4_line49" href="#4_line49">49</a> 	    <font color="#2040a0">_data</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">+</font> <font color="#2040a0">pos</font> <font color="4444FF">+</font> <font color="#2040a0">size</font>, 
<a name="4_line50" href="#4_line50">50</a> 	    <strong>sizeof</strong><font color="4444FF">(</font><font color="#2040a0">PEGASUS_ARRAY_T</font><font color="4444FF">)</font> <font color="4444FF">*</font> <font color="#2040a0">rem</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="4_line51" href="#4_line51">51</a> 
<a name="4_line52" href="#4_line52">52</a>     <strong>static_cast</strong><font color="4444FF">&lt;</font><font color="#2040a0">ArrayRep</font><font color="4444FF">&lt;</font><font color="#2040a0">PEGASUS_ARRAY_T</font><font color="4444FF">&gt;</font><font color="4444FF">*</font><font color="4444FF">&gt;</font><font color="4444FF">(</font><font color="#2040a0">_rep</font><font color="4444FF">)</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">size</font> <font color="4444FF">-</font><font color="4444FF">=</font> <font color="#2040a0">size</font><font color="4444FF">;</font>
<a name="4_line53" href="#4_line53">53</a> <font color="4444FF"><strong>}</strong></font>
</pre><!-- code2html delete stop -->
      <div class="comment">
	<p>
      <a name="array_fix">To fix</a> the problem with
      <code>Array</code> and classes having a virtual base, you must
      store a pointer to the object instead of a reference. An example
      of the fix in the <code>ProviderManager</code> is in <a
      href="#5_line10">lines 10-11</a>, and lines <a
      href="#5_line33">33</a> and <a href="#5_line45">45</a>.
	</p>
	<p>
	  These lines cause pointer to <code>Provider</code> objects
	  to be stored in the <code>ProviderManager</code>'s hash
	  table, instead of the objects themselves. This avoids the
	  problem with vtable corruption but requires management of
	  dynamically allocated objects. 
	</p>
      </div>      
      <!-- code2html add -lcc -N bug_5.cpp
      --><!-- code2html delete start --><pre><a name="5_line1" href="#5_line1"> 1</a> 
<a name="5_line2" href="#5_line2"> 2</a> <font color="#2040a0">ProviderModule</font> <font color="4444FF">*</font><font color="#2040a0">module</font><font color="4444FF">;</font>
<a name="5_line3" href="#5_line3"> 3</a> <strong>if</strong><font color="4444FF">(</font> <strong>false</strong>  <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#2040a0">_modules</font>.<font color="#2040a0">lookup</font><font color="4444FF">(</font><font color="4444FF">*</font><font color="4444FF">(</font><font color="#2040a0">parms</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">fileName</font><font color="4444FF">)</font>, <font color="#2040a0">module</font><font color="4444FF">)</font> <font color="4444FF">)</font>
<a name="5_line4" href="#5_line4"> 4</a> <font color="4444FF"><strong>{</strong></font>
<a name="5_line5" href="#5_line5"> 5</a>    <font color="#2040a0">PEG_TRACE_STRING</font><font color="4444FF">(</font><font color="#2040a0">TRC_PROVIDERMANAGER</font>, 
<a name="5_line6" href="#5_line6"> 6</a> 		    <font color="#2040a0">Tracer</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">LEVEL4</font>,
<a name="5_line7" href="#5_line7"> 7</a> 		    <font color="#008000">&quot;Creating Provider Module &quot;</font> <font color="4444FF">+</font> 
<a name="5_line8" href="#5_line8"> 8</a> 		    <font color="4444FF">*</font><font color="4444FF">(</font><font color="#2040a0">parms</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">fileName</font><font color="4444FF">)</font> <font color="4444FF">)</font><font color="4444FF">;</font>
<a name="5_line9" href="#5_line9"> 9</a> 	    
<a name="5_line10" href="#5_line10">10</a>    <font color="#2040a0">module</font> <font color="4444FF">=</font> <strong>new</strong> <font color="#2040a0">ProviderModule</font><font color="4444FF">(</font><font color="4444FF">*</font><font color="4444FF">(</font><font color="#2040a0">parms</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">fileName</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="5_line11" href="#5_line11">11</a>    <font color="#2040a0">_modules</font>.<font color="#2040a0">insert</font><font color="4444FF">(</font><font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">parms</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">fileName</font><font color="4444FF">)</font>, <font color="#2040a0">module</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="5_line12" href="#5_line12">12</a> <font color="4444FF"><strong>}</strong></font>
<a name="5_line13" href="#5_line13">13</a> <strong>else</strong> 
<a name="5_line14" href="#5_line14">14</a> <font color="4444FF"><strong>{</strong></font>
<a name="5_line15" href="#5_line15">15</a>    <font color="#2040a0">PEG_TRACE_STRING</font><font color="4444FF">(</font><font color="#2040a0">TRC_PROVIDERMANAGER</font>, <font color="#2040a0">Tracer</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">LEVEL4</font>,
<a name="5_line16" href="#5_line16">16</a> 		    <font color="#008000">&quot;Using Cached  Provider Module &quot;</font> <font color="4444FF">+</font> 
<a name="5_line17" href="#5_line17">17</a> 		    <font color="4444FF">*</font><font color="4444FF">(</font><font color="#2040a0">parms</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">fileName</font><font color="4444FF">)</font> <font color="4444FF">)</font><font color="4444FF">;</font>
<a name="5_line18" href="#5_line18">18</a> <font color="4444FF"><strong>}</strong></font>
<a name="5_line19" href="#5_line19">19</a> 	 
<a name="5_line20" href="#5_line20">20</a> <font color="#2040a0">PEG_TRACE_STRING</font><font color="4444FF">(</font><font color="#2040a0">TRC_PROVIDERMANAGER</font>, <font color="#2040a0">Tracer</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">LEVEL4</font>,
<a name="5_line21" href="#5_line21">21</a> 		 <font color="#008000">&quot;Loading/Linking Provider Module &quot;</font> <font color="4444FF">+</font> 
<a name="5_line22" href="#5_line22">22</a> 		 <font color="4444FF">*</font><font color="4444FF">(</font><font color="#2040a0">parms</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">fileName</font><font color="4444FF">)</font> <font color="4444FF">)</font><font color="4444FF">;</font>
<a name="5_line23" href="#5_line23">23</a> <font color="#2040a0">CIMBaseProvider</font> <font color="4444FF">*</font><font color="#2040a0">base</font> <font color="4444FF">=</font> <font color="#2040a0">module</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">load</font><font color="4444FF">(</font><font color="4444FF">*</font><font color="4444FF">(</font><font color="#2040a0">parms</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">providerName</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="5_line24" href="#5_line24">24</a> 	    
<a name="5_line25" href="#5_line25">25</a> <font color="#444444">// create provider module</font>
<a name="5_line26" href="#5_line26">26</a>    
<a name="5_line27" href="#5_line27">27</a> <font color="#2040a0">MessageQueue</font> <font color="4444FF">*</font> <font color="#2040a0">queue</font> <font color="4444FF">=</font> <font color="#2040a0">MessageQueue</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">lookup</font><font color="4444FF">(</font>
<a name="5_line28" href="#5_line28">28</a>    <font color="#2040a0">PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="5_line29" href="#5_line29">29</a> <font color="#2040a0">PEGASUS_ASSERT</font><font color="4444FF">(</font><font color="#2040a0">queue</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="5_line30" href="#5_line30">30</a> <font color="#2040a0">MessageQueueService</font> <font color="4444FF">*</font> <font color="#2040a0">service</font> <font color="4444FF">=</font> 
<a name="5_line31" href="#5_line31">31</a>    <strong>dynamic_cast</strong><font color="4444FF">&lt;</font><font color="#2040a0">MessageQueueService</font> <font color="4444FF">*</font><font color="4444FF">&gt;</font><font color="4444FF">(</font><font color="#2040a0">queue</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="5_line32" href="#5_line32">32</a> <font color="#2040a0">PEGASUS_ASSERT</font><font color="4444FF">(</font><font color="#2040a0">service</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="5_line33" href="#5_line33">33</a> <font color="#2040a0">pr</font> <font color="4444FF">=</font> <strong>new</strong> <font color="#2040a0">Provider</font><font color="4444FF">(</font><font color="4444FF">*</font><font color="4444FF">(</font><font color="#2040a0">parms</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">providerName</font><font color="4444FF">)</font>, <font color="#2040a0">module</font>, <font color="#2040a0">base</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="5_line34" href="#5_line34">34</a> <strong>if</strong><font color="4444FF">(</font><font color="#FF0000">0</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">pr</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">_cimom_handle</font> <font color="4444FF">=</font>  <strong>new</strong> <font color="#2040a0">CIMOMHandle</font><font color="4444FF">(</font><font color="#2040a0">service</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">)</font>
<a name="5_line35" href="#5_line35">35</a>    <strong>throw</strong> <font color="#2040a0">NullPointer</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="5_line36" href="#5_line36">36</a> 
<a name="5_line37" href="#5_line37">37</a> <font color="#2040a0">PEG_TRACE_STRING</font><font color="4444FF">(</font><font color="#2040a0">TRC_PROVIDERMANAGER</font>, <font color="#2040a0">Tracer</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">LEVEL2</font>, 
<a name="5_line38" href="#5_line38">38</a> 		 <font color="#008000">&quot;Loading Provider &quot;</font> <font color="4444FF">+</font>  <font color="#2040a0">pr</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">_name</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="5_line39" href="#5_line39">39</a> 	 
<a name="5_line40" href="#5_line40">40</a> <font color="#2040a0">PEGASUS_STD</font><font color="4444FF">(</font><font color="#2040a0">cout</font><font color="4444FF">)</font> <font color="4444FF">&lt;</font><font color="4444FF">&lt;</font> <font color="#008000">&quot;Loading Provider &quot;</font> <font color="4444FF">&lt;</font><font color="4444FF">&lt;</font> 
<a name="5_line41" href="#5_line41">41</a>    <font color="#2040a0">pr</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">_name</font> <font color="4444FF">&lt;</font><font color="4444FF">&lt;</font> <font color="#2040a0">PEGASUS_STD</font><font color="4444FF">(</font><font color="#2040a0">endl</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="5_line42" href="#5_line42">42</a> 	 
<a name="5_line43" href="#5_line43">43</a> <font color="#2040a0">pr</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">initialize</font><font color="4444FF">(</font><font color="4444FF">*</font><font color="4444FF">(</font><font color="#2040a0">pr</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">_cimom_handle</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="5_line44" href="#5_line44">44</a> <font color="#2040a0">gettimeofday</font><font color="4444FF">(</font><font color="4444FF">&amp;</font><font color="4444FF">(</font><font color="#2040a0">pr</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">_timeout</font><font color="4444FF">)</font>, <font color="#2040a0">NULL</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="5_line45" href="#5_line45">45</a> <font color="#2040a0">_providers</font>.<font color="#2040a0">insert</font><font color="4444FF">(</font><font color="4444FF">*</font><font color="4444FF">(</font><font color="#2040a0">parms</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">providerName</font><font color="4444FF">)</font>, <font color="#2040a0">pr</font><font color="4444FF">)</font><font color="4444FF">;</font>
</pre><!-- code2html delete stop -->
    </div>
<a name="bug_5">    
<h4>Double Deletes in Redirected Message Pathways</h4></a>
    <p>
      There were a couple of double deletes of
      <code>asyncOpNodes</code> in message paths that were two or
      three steps removed from the shortest path. These were in 
      code that had never been exersized. 
    </p>
    

    <h4>Untested code</h4>
    <p>
      The <code>IndicationService</code>, the
      <code>IndicationHandlerService</code>,
      and the <code>ProviderRegistrationManager</code> each contained
      code paths that were untested. Really, they were blocked from
      running successfully due to <i>elusive bugs</i> (see above). 
    </p>
    <p>
      In the case of the <code>ProviderRegistrationManager</code>, most of
      that code was tested so I only needed to step through a few
      cases. 
    </p>
    <p>
      Most of the <code>IndicationService</code> and <i>all</i> of
      the <code>IndicationHandler</code> were untested to my knowledge
      and they each comprise a lot of code. 
    </p>


    <a name="indication_consumer">
      <h3>Indication Consumer Support Code</h3></a>
    <p>
      Chip Vincent defined the <code>CIMIndicationConsumer</code>
      interface during the definition of the original C++ provider
      manager. It is not used in the Open Group CVS right now, but I
      use it to support Indication handling. 
    </p>
    <div class="source">
      <!-- code2html add -lcc -N src/Pegasus/Provider/CIMIndicationConsumer.h
      --><!-- code2html delete start --><pre><a name="6_line1" href="#6_line1"> 1</a> <font color="#444444">//%/////////////////////////////////////////////////////////////////////////////</font>
<a name="6_line2" href="#6_line2"> 2</a> <font color="#444444">//</font>
<a name="6_line3" href="#6_line3"> 3</a> <font color="#444444">// Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Company, IBM,</font>
<a name="6_line4" href="#6_line4"> 4</a> <font color="#444444">// The Open Group, Tivoli Systems</font>
<a name="6_line5" href="#6_line5"> 5</a> <font color="#444444">//</font>
<a name="6_line6" href="#6_line6"> 6</a> <font color="#444444">// Permission is hereby granted, free of charge, to any person obtaining a copy</font>
<a name="6_line7" href="#6_line7"> 7</a> <font color="#444444">// of this software and associated documentation files (the &quot;Software&quot;), to</font>
<a name="6_line8" href="#6_line8"> 8</a> <font color="#444444">// deal in the Software without restriction, including without limitation the</font>
<a name="6_line9" href="#6_line9"> 9</a> <font color="#444444">// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or</font>
<a name="6_line10" href="#6_line10">10</a> <font color="#444444">// sell copies of the Software, and to permit persons to whom the Software is</font>
<a name="6_line11" href="#6_line11">11</a> <font color="#444444">// furnished to do so, subject to the following conditions:</font>
<a name="6_line12" href="#6_line12">12</a> <font color="#444444">//</font>
<a name="6_line13" href="#6_line13">13</a> <font color="#444444">// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN</font>
<a name="6_line14" href="#6_line14">14</a> <font color="#444444">// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED</font>
<a name="6_line15" href="#6_line15">15</a> <font color="#444444">// &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT</font>
<a name="6_line16" href="#6_line16">16</a> <font color="#444444">// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR</font>
<a name="6_line17" href="#6_line17">17</a> <font color="#444444">// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT</font>
<a name="6_line18" href="#6_line18">18</a> <font color="#444444">// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN</font>
<a name="6_line19" href="#6_line19">19</a> <font color="#444444">// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION</font>
<a name="6_line20" href="#6_line20">20</a> <font color="#444444">// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</font>
<a name="6_line21" href="#6_line21">21</a> <font color="#444444">//</font>
<a name="6_line22" href="#6_line22">22</a> <font color="#444444">//==============================================================================</font>
<a name="6_line23" href="#6_line23">23</a> <font color="#444444">//</font>
<a name="6_line24" href="#6_line24">24</a> <font color="#444444">// Author: Chip Vincent (cvincent@us.ibm.com)</font>
<a name="6_line25" href="#6_line25">25</a> <font color="#444444">//</font>
<a name="6_line26" href="#6_line26">26</a> <font color="#444444">// Modified By: Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com)</font>
<a name="6_line27" href="#6_line27">27</a> <font color="#444444">//</font>
<a name="6_line28" href="#6_line28">28</a> <font color="#444444">//%/////////////////////////////////////////////////////////////////////////////</font>
<a name="6_line29" href="#6_line29">29</a> 
<a name="6_line30" href="#6_line30">30</a> <font color="0000ff"><strong>#ifndef Pegasus_CIMIndicationConsumer_h</strong></font>
<a name="6_line31" href="#6_line31">31</a> <font color="0000ff"><strong>#define Pegasus_CIMIndicationConsumer_h</strong></font>
<a name="6_line32" href="#6_line32">32</a> 
<a name="6_line33" href="#6_line33">33</a> <font color="0000ff"><strong>#include <font color="#008000">&lt;Pegasus/Common/Config.h&gt;</font></strong></font>
<a name="6_line34" href="#6_line34">34</a> <font color="0000ff"><strong>#include <font color="#008000">&lt;Pegasus/Provider/CIMBaseProvider.h&gt;</font></strong></font>
<a name="6_line35" href="#6_line35">35</a> 
<a name="6_line36" href="#6_line36">36</a> <font color="0000ff"><strong>#include <font color="#008000">&lt;Pegasus/Common/CIMInstance.h&gt;</font></strong></font>
<a name="6_line37" href="#6_line37">37</a> 
<a name="6_line38" href="#6_line38">38</a> <font color="#2040a0">PEGASUS_NAMESPACE_BEGIN</font>
<a name="6_line39" href="#6_line39">39</a> 
<a name="6_line40" href="#6_line40">40</a> <font color="#444444"><i>/**
<a name="6_line41" href="#6_line41">41</a> This class defines the set of methods implemented by an indication consumer provider.
<a name="6_line42" href="#6_line42">42</a> A providers that derives from this class must implement all methods. The minimal method
<a name="6_line43" href="#6_line43">43</a> implementation simply throw the NotSupported exception.
<a name="6_line44" href="#6_line44">44</a> */</i></font>
<a name="6_line45" href="#6_line45">45</a> <strong>class</strong> <font color="#2040a0">PEGASUS_PROVIDER_LINKAGE</font> <font color="#2040a0">CIMIndicationConsumer</font> <font color="4444FF">:</font> <strong>public</strong> <strong>virtual</strong> <font color="#2040a0">CIMBaseProvider</font>
<a name="6_line46" href="#6_line46">46</a> <font color="4444FF"><strong>{</strong></font>
<a name="6_line47" href="#6_line47">47</a> <strong>public</strong><font color="4444FF">:</font>
<a name="6_line48" href="#6_line48">48</a>     <font color="#2040a0">CIMIndicationConsumer</font><font color="4444FF">(</font><strong>void</strong><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="6_line49" href="#6_line49">49</a>     <strong>virtual</strong> ~<font color="#2040a0">CIMIndicationConsumer</font><font color="4444FF">(</font><strong>void</strong><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="6_line50" href="#6_line50">50</a> 
<a name="6_line51" href="#6_line51">51</a>     <font color="#444444"><i>/**
<a name="6_line52" href="#6_line52">52</a>     @param contex contains security and locale information relevant for the lifetime
<a name="6_line53" href="#6_line53">53</a>     of this operation.
<a name="6_line54" href="#6_line54">54</a> 
<a name="6_line55" href="#6_line55">55</a>     @param indication
<a name="6_line56" href="#6_line56">56</a> 
<a name="6_line57" href="#6_line57">57</a>     @param handler asynchronusly processes the results of this operation.
<a name="6_line58" href="#6_line58">58</a> 
<a name="6_line59" href="#6_line59">59</a>     @exception NotSupported
<a name="6_line60" href="#6_line60">60</a>     @exception InvalidParameter
<a name="6_line61" href="#6_line61">61</a>     */</i></font>
<a name="6_line62" href="#6_line62">62</a>     <strong>virtual</strong> <strong>void</strong> <font color="#2040a0">handleIndication</font><font color="4444FF">(</font>
<a name="6_line63" href="#6_line63">63</a> 	<strong>const</strong> <font color="#2040a0">OperationContext</font> <font color="4444FF">&amp;</font> <font color="#2040a0">context</font>,
<a name="6_line64" href="#6_line64">64</a> 	<strong>const</strong> <font color="#2040a0">CIMInstance</font> <font color="4444FF">&amp;</font> <font color="#2040a0">indication</font>,
<a name="6_line65" href="#6_line65">65</a> 	<font color="#2040a0">ResponseHandler</font><font color="4444FF">&lt;</font><strong>void</strong><font color="4444FF">&gt;</font> <font color="4444FF">&amp;</font> <font color="#2040a0">handler</font><font color="4444FF">)</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font>
<a name="6_line66" href="#6_line66">66</a> 
<a name="6_line67" href="#6_line67">67</a>     <font color="#444444">// ATTN: The following method is only for testing purposes.</font>
<a name="6_line68" href="#6_line68">68</a>     <strong>virtual</strong> <strong>void</strong> <font color="#2040a0">handleIndication</font><font color="4444FF">(</font>
<a name="6_line69" href="#6_line69">69</a> 	<strong>const</strong> <font color="#2040a0">OperationContext</font> <font color="4444FF">&amp;</font> <font color="#2040a0">context</font>,
<a name="6_line70" href="#6_line70">70</a> 	<strong>const</strong> <font color="#2040a0">String</font> <font color="4444FF">&amp;</font> <font color="#2040a0">url</font>,
<a name="6_line71" href="#6_line71">71</a> 	<strong>const</strong> <font color="#2040a0">CIMInstance</font><font color="4444FF">&amp;</font> <font color="#2040a0">indicationInstance</font><font color="4444FF">)</font>
<a name="6_line72" href="#6_line72">72</a>     <font color="4444FF"><strong>{</strong></font>
<a name="6_line73" href="#6_line73">73</a>     <font color="4444FF"><strong>}</strong></font>
<a name="6_line74" href="#6_line74">74</a> <font color="4444FF"><strong>}</strong></font><font color="4444FF">;</font>
<a name="6_line75" href="#6_line75">75</a> 
<a name="6_line76" href="#6_line76">76</a> <font color="#2040a0">PEGASUS_NAMESPACE_END</font>
<a name="6_line77" href="#6_line77">77</a> 
<a name="6_line78" href="#6_line78">78</a> <font color="0000ff"><strong>#endif</strong></font>
</pre><!-- code2html delete stop -->
    </div>
    <a name="provider_schema_mods">
    <h3>Provider Schema Modifications</h3></a>
    <p>
      I derived the <code>eServer_ProviderModule</code> schema from
      the <code>PG_ProviderModule</code> schema that we are using. I
      only made a three additions. I 
      <a href="#7_line161">added the new provider type</a>; I added
      <a href="#7_line39"> some new provider interface types</a> (looking ahead); 
      and I <a href="#7_line87">added the <code>OperationalStatus</code> 
	attributes</a> to the provider. This last is important because providers
      are now handling indications. 
    </p>
    <div class="source">
      <!-- code2html add -lcc -N Schemas/Pegasus/InterOp/VER20/eServer_ProviderModule20.mof
      --><!-- code2html delete start --><pre><a name="7_line1" href="#7_line1">  1</a> <font color="#444444">//=================================================================</font>
<a name="7_line2" href="#7_line2">  2</a> <font color="#444444">// eServer_ProviderModule</font>
<a name="7_line3" href="#7_line3">  3</a> <font color="#444444">//</font>
<a name="7_line4" href="#7_line4">  4</a> <font color="#444444">// This schema is derived from PG_ProviderModule. It adds some </font>
<a name="7_line5" href="#7_line5">  5</a> <font color="#444444">// qualifiers to support remote and out-of-proc providers.</font>
<a name="7_line6" href="#7_line6">  6</a> <font color="#444444">// It also defines some new provider types. </font>
<a name="7_line7" href="#7_line7">  7</a> <font color="#444444">//</font>
<a name="7_line8" href="#7_line8">  8</a> <font color="#444444">//=================================================================</font>
<a name="7_line9" href="#7_line9">  9</a> 
<a name="7_line10" href="#7_line10"> 10</a> <font color="#444444">// Named (meta) elements:</font>
<a name="7_line11" href="#7_line11"> 11</a> <font color="#444444">// Class, Property, Method, Association, Reference, Property, Parameter, </font>
<a name="7_line12" href="#7_line12"> 12</a> <font color="#444444">// Indication, Schema, Trigger</font>
<a name="7_line13" href="#7_line13"> 13</a> 
<a name="7_line14" href="#7_line14"> 14</a> <font color="0000ff"><strong>#pragma local (<font color="#008000">&quot;en_US&quot;</font>)</strong></font>
<a name="7_line15" href="#7_line15"> 15</a> 
<a name="7_line16" href="#7_line16"> 16</a> <font color="#2040a0">Qualifier</font> <font color="#2040a0">Remote</font> <font color="4444FF">:</font> <font color="#2040a0">boolean</font> <font color="4444FF">=</font> <strong>false</strong> , <font color="#2040a0">Scope</font><font color="4444FF">(</font><strong>class</strong>, <font color="#2040a0">reference</font>, <font color="#2040a0">property</font>, <font color="#2040a0">method</font><font color="4444FF">)</font> <font color="4444FF">;</font>
<a name="7_line17" href="#7_line17"> 17</a> <font color="#2040a0">Qualifier</font> <font color="#2040a0">Out_of_Proc</font> <font color="4444FF">:</font> <font color="#2040a0">boolean</font> <font color="4444FF">=</font> <strong>false</strong>, <font color="#2040a0">Scope</font><font color="4444FF">(</font><strong>class</strong>, <font color="#2040a0">reference</font>, <font color="#2040a0">property</font>, <font color="#2040a0">method</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="7_line18" href="#7_line18"> 18</a> <font color="#2040a0">Qualifier</font> <font color="#2040a0">Trusted</font> <font color="4444FF">:</font> <font color="#2040a0">boolean</font> <font color="4444FF">=</font> <strong>false</strong>, <font color="#2040a0">Scope</font><font color="4444FF">(</font><strong>class</strong>, <font color="#2040a0">reference</font>, <font color="#2040a0">property</font>, <font color="#2040a0">method</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="7_line19" href="#7_line19"> 19</a> <font color="#2040a0">Qualifier</font> <font color="#2040a0">isURL</font> <font color="4444FF">:</font> <font color="#2040a0">boolean</font> <font color="4444FF">=</font> <strong>false</strong>, <font color="#2040a0">Scope</font><font color="4444FF">(</font><font color="#2040a0">reference</font>, <font color="#2040a0">property</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="7_line20" href="#7_line20"> 20</a> 
<a name="7_line21" href="#7_line21"> 21</a> <font color="#444444">//=================================================================</font>
<a name="7_line22" href="#7_line22"> 22</a> <font color="#444444">// eServer_ProviderModule</font>
<a name="7_line23" href="#7_line23"> 23</a> <font color="#444444">//=================================================================</font>
<a name="7_line24" href="#7_line24"> 24</a> 
<a name="7_line25" href="#7_line25"> 25</a> <font color="4444FF">[</font><font color="#2040a0">Version</font><font color="4444FF">(</font><font color="#008000">&quot;2.0.0.&quot;</font><font color="4444FF">)</font>, <font color="#2040a0">Description</font><font color="4444FF">(</font><font color="#008000">&quot;Derived from PG_ProviderModule &quot;</font>
<a name="7_line26" href="#7_line26"> 26</a> 	<font color="#008000">&quot;modified to support additional provider types and additional &quot;</font>
<a name="7_line27" href="#7_line27"> 27</a> 	<font color="#008000">&quot;provider qualifications. &quot;</font><font color="4444FF">)</font><font color="4444FF">]</font>
<a name="7_line28" href="#7_line28"> 28</a> <strong>class</strong> <font color="#2040a0">eServer_ProviderModule</font> <font color="4444FF">:</font> <font color="#2040a0">PG_ProviderModule</font> <font color="4444FF"><strong>{</strong></font>
<a name="7_line29" href="#7_line29"> 29</a> 	<font color="4444FF">[</font><font color="#2040a0">Key</font>, <font color="#2040a0">Override</font><font color="4444FF">(</font><font color="#008000">&quot;Name&quot;</font><font color="4444FF">)</font>, <font color="#2040a0">Description</font><font color="4444FF">(</font><font color="#008000">&quot;A human-readable name that uniquely &quot;</font>
<a name="7_line30" href="#7_line30"> 30</a> 		<font color="#008000">&quot;identifies the Provider Module, inherited from PG_ProviderModule.&quot;</font><font color="4444FF">)</font><font color="4444FF">]</font>	
<a name="7_line31" href="#7_line31"> 31</a> 	<font color="#2040a0">string</font> <font color="#2040a0">Name</font><font color="4444FF">;</font>
<a name="7_line32" href="#7_line32"> 32</a> 
<a name="7_line33" href="#7_line33"> 33</a> 	<font color="4444FF">[</font> <font color="#2040a0">Override</font><font color="4444FF">(</font><font color="#008000">&quot;Location&quot;</font><font color="4444FF">)</font>, <font color="#2040a0">Description</font><font color="4444FF">(</font><font color="#008000">&quot;The file path to the module. &quot;</font> 
<a name="7_line34" href="#7_line34"> 34</a> 		<font color="#008000">&quot; If the usURL qualifier is present, indicates that the &quot;</font>
<a name="7_line35" href="#7_line35"> 35</a> 		<font color="#008000">&quot;path is a URL. Otherwise the path is a string that represents &quot;</font>
<a name="7_line36" href="#7_line36"> 36</a> 		<font color="#008000">&quot; the location of the module in the local host's file system.&quot;</font><font color="4444FF">)</font> <font color="4444FF">]</font>
<a name="7_line37" href="#7_line37"> 37</a> 	<font color="#2040a0">string</font> <font color="#2040a0">Location</font><font color="4444FF">;</font>
<a name="7_line38" href="#7_line38"> 38</a> 
<a name="7_line39" href="#7_line39"> 39</a> 	<font color="4444FF">[</font> <font color="#2040a0">Override</font><font color="4444FF">(</font><font color="#008000">&quot;InterfaceType&quot;</font><font color="4444FF">)</font>, <font color="#2040a0">Description</font> <font color="4444FF">(</font><font color="#008000">&quot;The interface definition &quot;</font>
<a name="7_line40" href="#7_line40"> 40</a> 	  	<font color="#008000">&quot;supported by this module. Implies both a method signature and &quot;</font>
<a name="7_line41" href="#7_line41"> 41</a> 		<font color="#008000">&quot; a binary specification for linking to the module and executing its code. &quot;</font>
<a name="7_line42" href="#7_line42"> 42</a> 		<font color="#008000">&quot;In Pegasus 2.01 the InterfaceType also implies a specific &quot;</font>
<a name="7_line43" href="#7_line43"> 43</a> 		<font color="#008000">&quot;ProviderManagerService, although this link will be broken in the &quot;</font>
<a name="7_line44" href="#7_line44"> 44</a> 		<font color="#008000">&quot;future. &quot;</font><font color="4444FF">)</font>,
<a name="7_line45" href="#7_line45"> 45</a> 		<font color="#2040a0">Values</font> <font color="4444FF"><strong>{</strong></font><font color="#008000">&quot;C++Default&quot;</font>, <font color="#008000">&quot;CMPI&quot;</font>, <font color="#008000">&quot;Java_Default&quot;</font>, <font color="#008000">&quot;Java_SNIA&quot;</font>, 
<a name="7_line46" href="#7_line46"> 46</a> 			<font color="#008000">&quot;Java_Wbem_Services&quot;</font>, <font color="#008000">&quot;Perl&quot;</font>, <font color="#008000">&quot;Unix_Domain&quot;</font>, 
<a name="7_line47" href="#7_line47"> 47</a> 			<font color="#008000">&quot;Named_Pipe&quot;</font>, <font color="#008000">&quot;WSDL_SOAP&quot;</font><font color="4444FF"><strong>}</strong></font><font color="4444FF">]</font>
<a name="7_line48" href="#7_line48"> 48</a> 	<font color="#2040a0">string</font> <font color="#2040a0">InterfaceType</font><font color="4444FF">;</font>
<a name="7_line49" href="#7_line49"> 49</a> 	
<a name="7_line50" href="#7_line50"> 50</a> 	<font color="4444FF">[</font> <font color="#2040a0">Description</font> <font color="4444FF">(</font><font color="#008000">&quot;The host of the computer upon which this module resides. &quot;</font>
<a name="7_line51" href="#7_line51"> 51</a> 	    	<font color="#008000">&quot;For local providers this will be <font color="#77dd77">\&quot;</font>localhost<font color="#77dd77">\&quot;</font>. For remote &quot;</font>
<a name="7_line52" href="#7_line52"> 52</a> 		<font color="#008000">&quot;providers this property should contain the DNS name of the &quot;</font>
<a name="7_line53" href="#7_line53"> 53</a> 		<font color="#008000">&quot;remote host. &quot;</font><font color="4444FF">)</font> <font color="4444FF">]</font>
<a name="7_line54" href="#7_line54"> 54</a> 	<font color="#2040a0">string</font> <font color="#2040a0">host</font><font color="4444FF">;</font>
<a name="7_line55" href="#7_line55"> 55</a> 
<a name="7_line56" href="#7_line56"> 56</a> 	<font color="4444FF">[</font> <font color="#2040a0">Description</font> <font color="4444FF">(</font><font color="#008000">&quot;The PGP Signature of the module's file. &quot;</font>
<a name="7_line57" href="#7_line57"> 57</a> 		<font color="#008000">&quot;The provider manager or any other module can use this &quot;</font>
<a name="7_line58" href="#7_line58"> 58</a> 		<font color="#008000">&quot; signature to determine the authenticity if the module &quot;</font> 
<a name="7_line59" href="#7_line59"> 59</a> 		<font color="#008000">&quot; and the integrity of the module's image. &quot;</font><font color="4444FF">)</font><font color="4444FF">]</font>
<a name="7_line60" href="#7_line60"> 60</a> 	<font color="#2040a0">string</font> <font color="#2040a0">pgp_Signature</font><font color="4444FF">;</font>
<a name="7_line61" href="#7_line61"> 61</a> 
<a name="7_line62" href="#7_line62"> 62</a> <font color="4444FF"><strong>}</strong></font><font color="4444FF">;</font>
<a name="7_line63" href="#7_line63"> 63</a> 
<a name="7_line64" href="#7_line64"> 64</a> 
<a name="7_line65" href="#7_line65"> 65</a> <font color="#444444">//=================================================================</font>
<a name="7_line66" href="#7_line66"> 66</a> <font color="#444444">// eServer_Provider</font>
<a name="7_line67" href="#7_line67"> 67</a> <font color="#444444">// </font>
<a name="7_line68" href="#7_line68"> 68</a> <font color="#444444">// Derived from the PG_Provider class. The operational status </font>
<a name="7_line69" href="#7_line69"> 69</a> <font color="#444444">// properties from PG_ProviderModule are present in the eServer_Provider</font>
<a name="7_line70" href="#7_line70"> 70</a> <font color="#444444">// class. This is to recognize that providers may have operational </font>
<a name="7_line71" href="#7_line71"> 71</a> <font color="#444444">// states that are distinct from the states of their modules.</font>
<a name="7_line72" href="#7_line72"> 72</a> <font color="#444444">//</font>
<a name="7_line73" href="#7_line73"> 73</a> <font color="#444444">//=================================================================</font>
<a name="7_line74" href="#7_line74"> 74</a> 
<a name="7_line75" href="#7_line75"> 75</a> <font color="4444FF">[</font> <font color="#2040a0">Version</font><font color="4444FF">(</font><font color="#008000">&quot;2.0.0&quot;</font><font color="4444FF">)</font>, <font color="#2040a0">Description</font><font color="4444FF">(</font><font color="#008000">&quot;eServer_Provider is derived from &quot;</font>
<a name="7_line76" href="#7_line76"> 76</a> 	<font color="#008000">&quot;PG_Provider. &quot;</font><font color="4444FF">)</font> <font color="4444FF">]</font>
<a name="7_line77" href="#7_line77"> 77</a> 
<a name="7_line78" href="#7_line78"> 78</a> <strong>class</strong> <font color="#2040a0">eServer_Provider</font> <font color="4444FF">:</font> <font color="#2040a0">PG_Provider</font> <font color="4444FF"><strong>{</strong></font>
<a name="7_line79" href="#7_line79"> 79</a> 	<font color="4444FF">[</font><font color="#2040a0">Key</font>, <font color="#2040a0">Description</font><font color="4444FF">(</font><font color="#008000">&quot;The scoping eServer_ProviderModule name. &quot;</font>
<a name="7_line80" href="#7_line80"> 80</a>  		<font color="#008000">&quot;Inherited as a propagated key from PG_Provider, having &quot;</font>
<a name="7_line81" href="#7_line81"> 81</a> 		<font color="#008000">&quot;the syntax PG_ProviderModule.name&quot;</font><font color="4444FF">)</font><font color="4444FF">]</font>
<a name="7_line82" href="#7_line82"> 82</a> 	<font color="#2040a0">string</font> <font color="#2040a0">ProviderModuleName</font><font color="4444FF">;</font>
<a name="7_line83" href="#7_line83"> 83</a> 	<font color="4444FF">[</font><font color="#2040a0">Key</font>, <font color="#2040a0">Override</font><font color="4444FF">(</font><font color="#008000">&quot;Name&quot;</font><font color="4444FF">)</font>, <font color="#2040a0">Description</font><font color="4444FF">(</font><font color="#008000">&quot;A human-readable name that:
<a name="7_line84" href="#7_line84"> 84</a> 		&quot;</font><font color="#2040a0">uniquely</font> <font color="#2040a0">identifies</font> <font color="#2040a0">the</font> <font color="#2040a0">provider</font> <font color="#2040a0">within</font> <font color="#2040a0">the</font> <font color="#2040a0">Provider</font> <font color="#2040a0">Module</font>.<font color="#008000">&quot; 
<a name="7_line85" href="#7_line85"> 85</a> 		&quot;</font><font color="#2040a0">Inherited</font> <font color="#2040a0">from</font> <font color="#2040a0">PG_Provider</font>.<font color="#008000">&quot;)]
<a name="7_line86" href="#7_line86"> 86</a> 	string Name;
<a name="7_line87" href="#7_line87"> 87</a>       [Description ( 
<a name="7_line88" href="#7_line88"> 88</a>         &quot;</font>   <font color="#2040a0">Indicates</font> <font color="#2040a0">the</font> <font color="#2040a0">current</font> <font color="#2040a0">status</font><font color="4444FF">(</font><font color="#2040a0">es</font><font color="4444FF">)</font> <font color="#2040a0">of</font> <font color="#2040a0">the</font> <font color="#2040a0">element</font>. <font color="#008000">&quot;
<a name="7_line89" href="#7_line89"> 89</a>         &quot;</font><font color="#2040a0">Various</font> <font color="#2040a0">health</font> <font color="#2040a0">and</font> <font color="#2040a0">operational</font> <font color="#2040a0">statuses</font> <font color="#2040a0">are</font> <font color="#008000">&quot;
<a name="7_line90" href="#7_line90"> 90</a>         &quot;</font><font color="#2040a0">defined</font>. <font color="#2040a0">Many</font> <font color="#2040a0">of</font> <font color="#2040a0">the</font> <font color="#2040a0">enumeration</font>'<font color="#2040a0">s</font> <font color="#2040a0">values</font> <font color="#2040a0">are</font> <font color="#2040a0">self</font><font color="4444FF">-</font><font color="#008000">&quot;
<a name="7_line91" href="#7_line91"> 91</a>         &quot;</font><font color="#2040a0">explanatory</font>.  <font color="#2040a0">However</font>, <font color="#2040a0">a</font> <font color="#2040a0">few</font> <font color="#2040a0">are</font> <font color="#2040a0">not</font> <font color="#2040a0">and</font> <font color="#2040a0">are</font> <font color="#2040a0">described</font> <font color="#008000">&quot;
<a name="7_line92" href="#7_line92"> 92</a>         &quot;</font><font color="#2040a0">in</font> <font color="#2040a0">more</font> <font color="#2040a0">detail</font>. \<font color="#008000">&quot;Stressed<font color="#77dd77">\&quot;</font> indicates that the element &quot;</font>
<a name="7_line93" href="#7_line93"> 93</a>         <font color="#008000">&quot;is functioning, but needs attention. Examples of &quot;</font>
<a name="7_line94" href="#7_line94"> 94</a>         <font color="#008000">&quot;<font color="#77dd77">\&quot;</font>Stressed<font color="#77dd77">\&quot;</font> states are overload, overheated, etc. &quot;</font>
<a name="7_line95" href="#7_line95"> 95</a>         <font color="#008000">&quot;<font color="#77dd77">\&quot;</font>Predictive Failure<font color="#77dd77">\&quot;</font> indicates that an element is &quot;</font>
<a name="7_line96" href="#7_line96"> 96</a>         <font color="#008000">&quot;functioning nominally but predicting a failure in the &quot;</font>
<a name="7_line97" href="#7_line97"> 97</a>         <font color="#008000">&quot;near future. <font color="#77dd77">\&quot;</font>In Service<font color="#77dd77">\&quot;</font> describes an element being &quot;</font>
<a name="7_line98" href="#7_line98"> 98</a>         <font color="#008000">&quot;configured, maintained, cleaned, or otherwise administered. &quot;</font>
<a name="7_line99" href="#7_line99"> 99</a>         <font color="#008000">&quot;<font color="#77dd77">\&quot;</font>No Contact<font color="#77dd77">\&quot;</font> indicates that the monitoring system &quot;</font>
<a name="7_line100" href="#7_line100">100</a>         <font color="#008000">&quot;has knowledge of this element, but has never been able to &quot;</font>
<a name="7_line101" href="#7_line101">101</a>         <font color="#008000">&quot;establish communications with it. <font color="#77dd77">\&quot;</font>Lost Communication<font color="#77dd77">\&quot;</font> &quot;</font>
<a name="7_line102" href="#7_line102">102</a>         <font color="#008000">&quot;indicates that the ManagedSystemElement is known to exist &quot;</font>
<a name="7_line103" href="#7_line103">103</a>         <font color="#008000">&quot;and has been contacted successfully in the past, but is &quot;</font>
<a name="7_line104" href="#7_line104">104</a>         <font color="#008000">&quot;currently unreachable. <font color="#77dd77">\&quot;</font>Stopped<font color="#77dd77">\&quot;</font> indicates that the &quot;</font>	
<a name="7_line105" href="#7_line105">105</a>         <font color="#008000">&quot;element is known to exist, is not operational (e.g., it &quot;</font>
<a name="7_line106" href="#7_line106">106</a>         <font color="#008000">&quot;is unable to provide service to users), but it has not &quot;</font>
<a name="7_line107" href="#7_line107">107</a>         <font color="#008000">&quot;failed. It has purposely been made non-operational. <font color="#77dd77">\n</font>&quot;</font>
<a name="7_line108" href="#7_line108">108</a>         <font color="#008000">&quot;  OperationalStatus replaces the Status property on &quot;</font>
<a name="7_line109" href="#7_line109">109</a>         <font color="#008000">&quot;ManagedSystemElement to provide a consistent approach to &quot;</font>
<a name="7_line110" href="#7_line110">110</a>         <font color="#008000">&quot;enumerations, to address implementation needs for an &quot;</font>
<a name="7_line111" href="#7_line111">111</a>         <font color="#008000">&quot;array property, and to provide a migration path from today's &quot;</font>
<a name="7_line112" href="#7_line112">112</a>         <font color="#008000">&quot;environment to the future. This change was not made earlier &quot;</font>
<a name="7_line113" href="#7_line113">113</a>         <font color="#008000">&quot;since it required the DEPRECATED qualifier. Due to the &quot;</font>
<a name="7_line114" href="#7_line114">114</a>         <font color="#008000">&quot;widespread use of the existing Status property in &quot;</font>
<a name="7_line115" href="#7_line115">115</a>         <font color="#008000">&quot;management applications, it is strongly recommended that &quot;</font>
<a name="7_line116" href="#7_line116">116</a>         <font color="#008000">&quot;providers/instrumentation provide BOTH the Status and &quot;</font>
<a name="7_line117" href="#7_line117">117</a>         <font color="#008000">&quot;OperationalStatus properties. As always, Status (since it &quot;</font>
<a name="7_line118" href="#7_line118">118</a>         <font color="#008000">&quot;is single-valued) provides the primary status of the &quot;</font>
<a name="7_line119" href="#7_line119">119</a>         <font color="#008000">&quot;element.&quot;</font><font color="4444FF">)</font>,
<a name="7_line120" href="#7_line120">120</a>        <font color="#2040a0">ValueMap</font> <font color="4444FF"><strong>{</strong></font><font color="#008000">&quot;0&quot;</font>, <font color="#008000">&quot;1&quot;</font>, <font color="#008000">&quot;2&quot;</font>, <font color="#008000">&quot;3&quot;</font>, <font color="#008000">&quot;4&quot;</font>, <font color="#008000">&quot;5&quot;</font>, <font color="#008000">&quot;6&quot;</font>, <font color="#008000">&quot;7&quot;</font>, <font color="#008000">&quot;8&quot;</font>, 
<a name="7_line121" href="#7_line121">121</a>              <font color="#008000">&quot;9&quot;</font>, <font color="#008000">&quot;10&quot;</font>, <font color="#008000">&quot;11&quot;</font>, <font color="#008000">&quot;12&quot;</font>, <font color="#008000">&quot;13&quot;</font><font color="4444FF"><strong>}</strong></font>, 
<a name="7_line122" href="#7_line122">122</a>        <font color="#2040a0">Values</font> <font color="4444FF"><strong>{</strong></font><font color="#008000">&quot;Unknown&quot;</font>, <font color="#008000">&quot;Other&quot;</font>, <font color="#008000">&quot;OK&quot;</font>, <font color="#008000">&quot;Degraded&quot;</font>, <font color="#008000">&quot;Stressed&quot;</font>,
<a name="7_line123" href="#7_line123">123</a>              <font color="#008000">&quot;Predictive Failure&quot;</font>, <font color="#008000">&quot;Error&quot;</font>, <font color="#008000">&quot;Non-Recoverable Error&quot;</font>, 
<a name="7_line124" href="#7_line124">124</a>              <font color="#008000">&quot;Starting&quot;</font>, <font color="#008000">&quot;Stopping&quot;</font>, <font color="#008000">&quot;Stopped&quot;</font>, <font color="#008000">&quot;In Service&quot;</font>, 
<a name="7_line125" href="#7_line125">125</a>              <font color="#008000">&quot;No Contact&quot;</font>, <font color="#008000">&quot;Lost Communication&quot;</font><font color="4444FF"><strong>}</strong></font>, 
<a name="7_line126" href="#7_line126">126</a>        <font color="#2040a0">ModelCorrespondence</font> <font color="4444FF"><strong>{</strong></font>
<a name="7_line127" href="#7_line127">127</a>         <font color="#008000">&quot;CIM_ManagedSystemElement.OtherStatusDescription&quot;</font><font color="4444FF"><strong>}</strong></font> <font color="4444FF">]</font> 
<a name="7_line128" href="#7_line128">128</a>     <font color="#2040a0">uint16</font> <font color="#2040a0">OperationalStatus</font><font color="4444FF">[</font><font color="4444FF">]</font><font color="4444FF">;</font>
<a name="7_line129" href="#7_line129">129</a>       <font color="4444FF">[</font><font color="#2040a0">Description</font> <font color="4444FF">(</font>
<a name="7_line130" href="#7_line130">130</a>         <font color="#008000">&quot;A string describing the status - used when the &quot;</font>
<a name="7_line131" href="#7_line131">131</a>         <font color="#008000">&quot;OperationalStatus property is set to 1 (<font color="#77dd77">\&quot;</font>Other<font color="#77dd77">\&quot;</font>).&quot;</font><font color="4444FF">)</font>, 
<a name="7_line132" href="#7_line132">132</a>        <font color="#2040a0">ModelCorrespondence</font> <font color="4444FF"><strong>{</strong></font>
<a name="7_line133" href="#7_line133">133</a>         <font color="#008000">&quot;CIM_ManagedSystemElement.OperationalStatus&quot;</font><font color="4444FF"><strong>}</strong></font> <font color="4444FF">]</font>
<a name="7_line134" href="#7_line134">134</a>     <font color="#2040a0">string</font> <font color="#2040a0">OtherStatusDescription</font><font color="4444FF">;</font>
<a name="7_line135" href="#7_line135">135</a> <font color="4444FF"><strong>}</strong></font><font color="4444FF">;</font>
<a name="7_line136" href="#7_line136">136</a> 
<a name="7_line137" href="#7_line137">137</a> 
<a name="7_line138" href="#7_line138">138</a> <font color="#444444">//=================================================================</font>
<a name="7_line139" href="#7_line139">139</a> <font color="#444444">// eServer_ProviderCapabilities</font>
<a name="7_line140" href="#7_line140">140</a> <font color="#444444">// </font>
<a name="7_line141" href="#7_line141">141</a> <font color="#444444">// Derived from the PG_ProviderCapabilities class</font>
<a name="7_line142" href="#7_line142">142</a> <font color="#444444">//</font>
<a name="7_line143" href="#7_line143">143</a> <font color="#444444">//=================================================================</font>
<a name="7_line144" href="#7_line144">144</a> 
<a name="7_line145" href="#7_line145">145</a> 	<font color="4444FF">[</font><font color="#2040a0">Version</font> <font color="4444FF">(</font><font color="#008000">&quot;2.0.0&quot;</font><font color="4444FF">)</font>, <font color="#2040a0">Description</font><font color="4444FF">(</font><font color="#008000">&quot;An instance of ProviderCapabilities &quot;</font>
<a name="7_line146" href="#7_line146">146</a> 	<font color="#008000">&quot;describes a set of abilities for a specific provider.&quot;</font><font color="4444FF">)</font> <font color="4444FF">]</font>
<a name="7_line147" href="#7_line147">147</a> <strong>class</strong> <font color="#2040a0">eServer_ProviderCapabilities</font> <font color="4444FF">:</font> <font color="#2040a0">PG_ProviderCapabilities</font> <font color="4444FF"><strong>{</strong></font>
<a name="7_line148" href="#7_line148">148</a> 	<font color="4444FF">[</font><font color="#2040a0">Key</font>, <font color="#2040a0">Description</font><font color="4444FF">(</font><font color="#008000">&quot;The scoping eServer_ProviderModuleName. &quot;</font>
<a name="7_line149" href="#7_line149">149</a> 	<font color="#008000">&quot;Inherited as a Propagated key from PG_ProviderCapabilities, &quot;</font>
<a name="7_line150" href="#7_line150">150</a> 	<font color="#008000">&quot;having the syntax PG_Provider.ProviderModuleName&quot;</font><font color="4444FF">)</font> <font color="4444FF">]</font>
<a name="7_line151" href="#7_line151">151</a>    <font color="#2040a0">string</font> <font color="#2040a0">ProviderModuleName</font><font color="4444FF">;</font>
<a name="7_line152" href="#7_line152">152</a> 	<font color="4444FF">[</font><font color="#2040a0">Key</font>, <font color="#2040a0">Description</font><font color="4444FF">(</font><font color="#008000">&quot;The scoping eServer_Provider Name.&quot;</font>
<a name="7_line153" href="#7_line153">153</a> 	<font color="#008000">&quot;Inherited as a Propagated key from PG_ProviderCapabilities, &quot;</font>
<a name="7_line154" href="#7_line154">154</a> 	<font color="#008000">&quot;having the syntax PG_Provider.Name&quot;</font><font color="4444FF">)</font> <font color="4444FF">]</font>
<a name="7_line155" href="#7_line155">155</a>    <font color="#2040a0">string</font> <font color="#2040a0">ProviderName</font><font color="4444FF">;</font>
<a name="7_line156" href="#7_line156">156</a> 
<a name="7_line157" href="#7_line157">157</a> 	<font color="4444FF">[</font><font color="#2040a0">Key</font>, <font color="#2040a0">Description</font><font color="4444FF">(</font><font color="#008000">&quot;A value that uniquely identifies this &quot;</font>
<a name="7_line158" href="#7_line158">158</a> 		<font color="#008000">&quot; set of abilities for the designated Providers.&quot;</font><font color="4444FF">)</font> <font color="4444FF">]</font>
<a name="7_line159" href="#7_line159">159</a>    <font color="#2040a0">string</font> <font color="#2040a0">CapabilityID</font><font color="4444FF">;</font>
<a name="7_line160" href="#7_line160">160</a> 
<a name="7_line161" href="#7_line161">161</a> 	<font color="4444FF">[</font><font color="#2040a0">Override</font><font color="4444FF">(</font><font color="#008000">&quot;ProviderType&quot;</font><font color="4444FF">)</font>, <font color="#2040a0">Description</font><font color="4444FF">(</font><font color="#008000">&quot;ProviderType enumerates &quot;</font> 
<a name="7_line162" href="#7_line162">162</a> 		<font color="#008000">&quot; the specific method types that the provider supports. &quot;</font><font color="4444FF">)</font>,
<a name="7_line163" href="#7_line163">163</a> 		<font color="#2040a0">ArrayType</font><font color="4444FF">(</font><font color="#008000">&quot;Indexed&quot;</font><font color="4444FF">)</font>, 
<a name="7_line164" href="#7_line164">164</a> 		<font color="#2040a0">ValueMap</font> <font color="4444FF"><strong>{</strong></font> <font color="#008000">&quot;2&quot;</font>, <font color="#008000">&quot;3&quot;</font>, <font color="#008000">&quot;4&quot;</font>, <font color="#008000">&quot;5&quot;</font>, <font color="#008000">&quot;6&quot;</font> <font color="4444FF"><strong>}</strong></font>,
<a name="7_line165" href="#7_line165">165</a> 		<font color="#2040a0">Values</font><font color="4444FF"><strong>{</strong></font> <font color="#008000">&quot;Instance&quot;</font>, <font color="#008000">&quot;Association&quot;</font>, <font color="#008000">&quot;Indication&quot;</font>, <font color="#008000">&quot;Method&quot;</font>, 
<a name="7_line166" href="#7_line166">166</a> 			<font color="#008000">&quot;Indication_Consumer&quot;</font> <font color="4444FF"><strong>}</strong></font> <font color="4444FF">]</font>
<a name="7_line167" href="#7_line167">167</a>      <font color="#2040a0">uint16</font> <font color="#2040a0">ProviderType</font><font color="4444FF">[</font><font color="4444FF">]</font><font color="4444FF">;</font>
<a name="7_line168" href="#7_line168">168</a> <font color="4444FF"><strong>}</strong></font><font color="4444FF">;</font>
<a name="7_line169" href="#7_line169">169</a> 	
</pre><!-- code2html delete stop -->
    </div>
<a name="provider_reg_mgr">
    <h3>Provider Registration Manager Modifications</h3></a>

    <p>
      After creating a new type of provider, I needed to modify the
      <code>ProviderRegistrationManager</code> to load, find, and
      dispatch the new provider type. This was pretty simple. I wrote 
      some additional routines that are basically copies of what is 
      already there. 
    </p>

    <div class="source">
      <p class="comment">
	Here is one of the new routines I wrote for the <code>
	  ProviderRegistrationManager</code>. There are several others. 
      </p>

      <!-- code2html add -lcc -N consumer.cpp
      --><!-- code2html delete start --><pre><a name="8_line1" href="#8_line1">  1</a> <font color="#2040a0">Boolean</font> <font color="#2040a0">ProviderRegistrationManager</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">lookupConsumerProvider</font><font color="4444FF">(</font>
<a name="8_line2" href="#8_line2">  2</a>     <strong>const</strong> <font color="#2040a0">String</font> <font color="4444FF">&amp;</font> <font color="#2040a0">nameSpace</font>, 
<a name="8_line3" href="#8_line3">  3</a>     <strong>const</strong> <font color="#2040a0">String</font> <font color="4444FF">&amp;</font> <font color="#2040a0">className</font>,
<a name="8_line4" href="#8_line4">  4</a>     <font color="#2040a0">CIMInstance</font> <font color="4444FF">&amp;</font> <font color="#2040a0">provider</font>,
<a name="8_line5" href="#8_line5">  5</a>     <font color="#2040a0">CIMInstance</font> <font color="4444FF">&amp;</font> <font color="#2040a0">providerModule</font><font color="4444FF">)</font>
<a name="8_line6" href="#8_line6">  6</a> <font color="4444FF"><strong>{</strong></font>
<a name="8_line7" href="#8_line7">  7</a>     <font color="#2040a0">String</font> <font color="#2040a0">providerName</font><font color="4444FF">;</font>
<a name="8_line8" href="#8_line8">  8</a>     <font color="#2040a0">String</font> <font color="#2040a0">providerModuleName</font><font color="4444FF">;</font>
<a name="8_line9" href="#8_line9">  9</a> 
<a name="8_line10" href="#8_line10"> 10</a>     <font color="#2040a0">PEG_METHOD_ENTER</font><font color="4444FF">(</font><font color="#2040a0">TRC_PROVIDERMANAGER</font>,
<a name="8_line11" href="#8_line11"> 11</a> 		     <font color="#008000">&quot;ProviderRegistrationManager::lookupConsumerProvider&quot;</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line12" href="#8_line12"> 12</a>     
<a name="8_line13" href="#8_line13"> 13</a>     <font color="#2040a0">ProviderRegistrationTable</font><font color="4444FF">*</font> <font color="#2040a0">providerCapability</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font>
<a name="8_line14" href="#8_line14"> 14</a>     <font color="#2040a0">ProviderRegistrationTable</font><font color="4444FF">*</font> <font color="#2040a0">_provider</font><font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font>
<a name="8_line15" href="#8_line15"> 15</a>     <font color="#2040a0">ProviderRegistrationTable</font><font color="4444FF">*</font> <font color="#2040a0">_providerModule</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font>
<a name="8_line16" href="#8_line16"> 16</a>     
<a name="8_line17" href="#8_line17"> 17</a>     <font color="#444444">//</font>
<a name="8_line18" href="#8_line18"> 18</a>     <font color="#444444">// create the key by using nameSpace, className, and providerType</font>
<a name="8_line19" href="#8_line19"> 19</a>     <font color="#444444">//</font>
<a name="8_line20" href="#8_line20"> 20</a>     <font color="#2040a0">String</font> <font color="#2040a0">capabilityKey</font> <font color="4444FF">=</font> <font color="#2040a0">_generateKey</font><font color="4444FF">(</font><font color="#2040a0">nameSpace</font>, <font color="#2040a0">className</font>, <font color="#2040a0">CONSUMER_PROVIDER</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line21" href="#8_line21"> 21</a>     <font color="#2040a0">PEG_TRACE_STRING</font><font color="4444FF">(</font><font color="#2040a0">TRC_PROVIDERMANAGER</font>, <font color="#2040a0">Tracer</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">LEVEL4</font>,
<a name="8_line22" href="#8_line22"> 22</a> 		     <font color="#008000">&quot;<font color="#77dd77">\n</font>nameSpace = &quot;</font> <font color="4444FF">+</font> <font color="#2040a0">nameSpace</font> <font color="4444FF">+</font> <font color="#008000">&quot;; className = &quot;</font> <font color="4444FF">+</font>
<a name="8_line23" href="#8_line23"> 23</a> 			<font color="#2040a0">className</font> <font color="4444FF">+</font>  <font color="#008000">&quot;; capabilityKey = &quot;</font> <font color="4444FF">+</font> <font color="#2040a0">capabilityKey</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line24" href="#8_line24"> 24</a> 
<a name="8_line25" href="#8_line25"> 25</a>     <font color="#2040a0">try</font>
<a name="8_line26" href="#8_line26"> 26</a>     <font color="4444FF"><strong>{</strong></font>
<a name="8_line27" href="#8_line27"> 27</a>         <font color="#444444">// </font>
<a name="8_line28" href="#8_line28"> 28</a>         <font color="#444444">// get provider capability instance from the table</font>
<a name="8_line29" href="#8_line29"> 29</a>         <font color="#444444">//</font>
<a name="8_line30" href="#8_line30"> 30</a>         <strong>if</strong> <font color="4444FF">(</font><font color="4444FF">!</font><font color="#2040a0">_registrationTable</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">table</font>.<font color="#2040a0">lookup</font><font color="4444FF">(</font>
<a name="8_line31" href="#8_line31"> 31</a>                   <font color="#2040a0">capabilityKey</font>, <font color="#2040a0">providerCapability</font><font color="4444FF">)</font><font color="4444FF">)</font>
<a name="8_line32" href="#8_line32"> 32</a>         <font color="4444FF"><strong>{</strong></font>
<a name="8_line33" href="#8_line33"> 33</a>             <font color="#2040a0">PEG_METHOD_EXIT</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line34" href="#8_line34"> 34</a>             <strong>throw</strong> <font color="#2040a0">CIMException</font><font color="4444FF">(</font><font color="#2040a0">CIM_ERR_FAILED</font>, <font color="#2040a0">CAPABILITY_NOT_REGISTERED</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line35" href="#8_line35"> 35</a>         <font color="4444FF"><strong>}</strong></font>
<a name="8_line36" href="#8_line36"> 36</a> 
<a name="8_line37" href="#8_line37"> 37</a>         <font color="#2040a0">Array</font><font color="4444FF">&lt;</font><font color="#2040a0">CIMInstance</font><font color="4444FF">&gt;</font> <font color="#2040a0">instances</font> <font color="4444FF">=</font> <font color="#2040a0">providerCapability</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">getInstances</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line38" href="#8_line38"> 38</a> 
<a name="8_line39" href="#8_line39"> 39</a>         <font color="#2040a0">Uint32</font> <font color="#2040a0">pos</font> <font color="4444FF">=</font> <font color="#2040a0">instances</font><font color="4444FF">[</font><font color="#FF0000">0</font><font color="4444FF">]</font>.<font color="#2040a0">findProperty</font><font color="4444FF">(</font><font color="#2040a0">_PROPERTY_PROVIDERNAME</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line40" href="#8_line40"> 40</a> 
<a name="8_line41" href="#8_line41"> 41</a>         <strong>if</strong> <font color="4444FF">(</font><font color="#2040a0">pos</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#2040a0">PEG_NOT_FOUND</font><font color="4444FF">)</font>
<a name="8_line42" href="#8_line42"> 42</a>         <font color="4444FF"><strong>{</strong></font>
<a name="8_line43" href="#8_line43"> 43</a>             <font color="#2040a0">PEG_METHOD_EXIT</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line44" href="#8_line44"> 44</a>     	    <strong>throw</strong> <font color="#2040a0">CIMException</font><font color="4444FF">(</font><font color="#2040a0">CIM_ERR_FAILED</font>, 
<a name="8_line45" href="#8_line45"> 45</a> 		<font color="#008000">&quot;Missing ProviderName which is key in PG_ProviderCapabilities class.&quot;</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line46" href="#8_line46"> 46</a>         <font color="4444FF"><strong>}</strong></font>
<a name="8_line47" href="#8_line47"> 47</a> 
<a name="8_line48" href="#8_line48"> 48</a>         <font color="#444444">//</font>
<a name="8_line49" href="#8_line49"> 49</a>         <font color="#444444">// get provider name</font>
<a name="8_line50" href="#8_line50"> 50</a>         <font color="#444444">//</font>
<a name="8_line51" href="#8_line51"> 51</a>         <font color="#2040a0">instances</font><font color="4444FF">[</font><font color="#FF0000">0</font><font color="4444FF">]</font>.<font color="#2040a0">getProperty</font><font color="4444FF">(</font><font color="#2040a0">pos</font><font color="4444FF">)</font>.<font color="#2040a0">getValue</font><font color="4444FF">(</font><font color="4444FF">)</font>.<font color="#2040a0">get</font><font color="4444FF">(</font><font color="#2040a0">providerName</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line52" href="#8_line52"> 52</a> 
<a name="8_line53" href="#8_line53"> 53</a>         <font color="#444444">//</font>
<a name="8_line54" href="#8_line54"> 54</a>         <font color="#444444">// get provider module name</font>
<a name="8_line55" href="#8_line55"> 55</a>         <font color="#444444">//</font>
<a name="8_line56" href="#8_line56"> 56</a>         <font color="#2040a0">Uint32</font> <font color="#2040a0">pos2</font> <font color="4444FF">=</font> <font color="#2040a0">instances</font><font color="4444FF">[</font><font color="#FF0000">0</font><font color="4444FF">]</font>.<font color="#2040a0">findProperty</font><font color="4444FF">(</font><font color="#2040a0">_PROPERTY_PROVIDERMODULENAME</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line57" href="#8_line57"> 57</a>         <strong>if</strong> <font color="4444FF">(</font><font color="#2040a0">pos2</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#2040a0">PEG_NOT_FOUND</font><font color="4444FF">)</font>
<a name="8_line58" href="#8_line58"> 58</a>         <font color="4444FF"><strong>{</strong></font>
<a name="8_line59" href="#8_line59"> 59</a> 	   
<a name="8_line60" href="#8_line60"> 60</a>             <font color="#2040a0">PEG_METHOD_EXIT</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line61" href="#8_line61"> 61</a>     	    <strong>throw</strong> <font color="#2040a0">CIMException</font><font color="4444FF">(</font><font color="#2040a0">CIM_ERR_FAILED</font>, 
<a name="8_line62" href="#8_line62"> 62</a> 		<font color="#008000">&quot;Missing ProviderModuleName which is key in PG_ProviderCapabilities class.&quot;</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line63" href="#8_line63"> 63</a>         <font color="4444FF"><strong>}</strong></font>
<a name="8_line64" href="#8_line64"> 64</a> 
<a name="8_line65" href="#8_line65"> 65</a>         <font color="#2040a0">instances</font><font color="4444FF">[</font><font color="#FF0000">0</font><font color="4444FF">]</font>.<font color="#2040a0">getProperty</font><font color="4444FF">(</font><font color="#2040a0">pos2</font><font color="4444FF">)</font>.<font color="#2040a0">getValue</font><font color="4444FF">(</font><font color="4444FF">)</font>.<font color="#2040a0">get</font><font color="4444FF">(</font><font color="#2040a0">providerModuleName</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line66" href="#8_line66"> 66</a> 
<a name="8_line67" href="#8_line67"> 67</a> 	<font color="#444444">//</font>
<a name="8_line68" href="#8_line68"> 68</a> 	<font color="#444444">// create the key by using providerModuleName and providerName</font>
<a name="8_line69" href="#8_line69"> 69</a> 	<font color="#444444">//</font>
<a name="8_line70" href="#8_line70"> 70</a> 	<font color="#2040a0">String</font> <font color="#2040a0">_providerKey</font> <font color="4444FF">=</font> <font color="#2040a0">_generateKey</font><font color="4444FF">(</font><font color="#2040a0">providerModuleName</font>, <font color="#2040a0">providerName</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line71" href="#8_line71"> 71</a> 
<a name="8_line72" href="#8_line72"> 72</a> 	<font color="#444444">//</font>
<a name="8_line73" href="#8_line73"> 73</a> 	<font color="#444444">// create the key by using providerModuleName and MODULE_KEY</font>
<a name="8_line74" href="#8_line74"> 74</a> 	<font color="#444444">//</font>
<a name="8_line75" href="#8_line75"> 75</a> 	<font color="#2040a0">String</font> <font color="#2040a0">_moduleKey</font> <font color="4444FF">=</font> <font color="#2040a0">_generateKey</font><font color="4444FF">(</font><font color="#2040a0">providerModuleName</font>, <font color="#2040a0">MODULE_KEY</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line76" href="#8_line76"> 76</a> 
<a name="8_line77" href="#8_line77"> 77</a>         <font color="#444444">// </font>
<a name="8_line78" href="#8_line78"> 78</a>         <font color="#444444">// get provider instance from the table </font>
<a name="8_line79" href="#8_line79"> 79</a>         <font color="#444444">//</font>
<a name="8_line80" href="#8_line80"> 80</a>         <strong>if</strong> <font color="4444FF">(</font><font color="4444FF">!</font><font color="#2040a0">_registrationTable</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">table</font>.<font color="#2040a0">lookup</font><font color="4444FF">(</font><font color="#2040a0">_providerKey</font>, <font color="#2040a0">_provider</font><font color="4444FF">)</font><font color="4444FF">)</font>
<a name="8_line81" href="#8_line81"> 81</a>         <font color="4444FF"><strong>{</strong></font>
<a name="8_line82" href="#8_line82"> 82</a>             <font color="#2040a0">PEG_METHOD_EXIT</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line83" href="#8_line83"> 83</a> 	    <strong>throw</strong> <font color="#2040a0">CIMException</font><font color="4444FF">(</font><font color="#2040a0">CIM_ERR_FAILED</font>, <font color="#2040a0">PROVIDER_NOT_FOUND</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line84" href="#8_line84"> 84</a>         <font color="4444FF"><strong>}</strong></font>
<a name="8_line85" href="#8_line85"> 85</a> 
<a name="8_line86" href="#8_line86"> 86</a>         <font color="#2040a0">Array</font><font color="4444FF">&lt;</font><font color="#2040a0">CIMInstance</font><font color="4444FF">&gt;</font> <font color="#2040a0">providerInstances</font> <font color="4444FF">=</font> <font color="#2040a0">_provider</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">getInstances</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line87" href="#8_line87"> 87</a>         <font color="#2040a0">provider</font> <font color="4444FF">=</font> <font color="#2040a0">providerInstances</font><font color="4444FF">[</font><font color="#FF0000">0</font><font color="4444FF">]</font><font color="4444FF">;</font>
<a name="8_line88" href="#8_line88"> 88</a> 
<a name="8_line89" href="#8_line89"> 89</a>         <font color="#444444">// </font>
<a name="8_line90" href="#8_line90"> 90</a>         <font color="#444444">// get provider module instance from the table </font>
<a name="8_line91" href="#8_line91"> 91</a>         <font color="#444444">//</font>
<a name="8_line92" href="#8_line92"> 92</a>         <strong>if</strong> <font color="4444FF">(</font><font color="4444FF">!</font><font color="#2040a0">_registrationTable</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">table</font>.<font color="#2040a0">lookup</font><font color="4444FF">(</font><font color="#2040a0">_moduleKey</font>, <font color="#2040a0">_providerModule</font><font color="4444FF">)</font><font color="4444FF">)</font>
<a name="8_line93" href="#8_line93"> 93</a>         <font color="4444FF"><strong>{</strong></font>
<a name="8_line94" href="#8_line94"> 94</a>             <font color="#2040a0">PEG_METHOD_EXIT</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line95" href="#8_line95"> 95</a> 	    <strong>throw</strong> <font color="#2040a0">CIMException</font><font color="4444FF">(</font><font color="#2040a0">CIM_ERR_FAILED</font>, <font color="#2040a0">MODULE_NOT_FOUND</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line96" href="#8_line96"> 96</a>         <font color="4444FF"><strong>}</strong></font>
<a name="8_line97" href="#8_line97"> 97</a> 
<a name="8_line98" href="#8_line98"> 98</a>         <font color="#2040a0">Array</font><font color="4444FF">&lt;</font><font color="#2040a0">CIMInstance</font><font color="4444FF">&gt;</font> <font color="#2040a0">providerModuleInstances</font> <font color="4444FF">=</font> <font color="#2040a0">_providerModule</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">getInstances</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line99" href="#8_line99"> 99</a>         <font color="#2040a0">providerModule</font> <font color="4444FF">=</font> <font color="#2040a0">providerModuleInstances</font><font color="4444FF">[</font><font color="#FF0000">0</font><font color="4444FF">]</font><font color="4444FF">;</font>
<a name="8_line100" href="#8_line100">100</a>     
<a name="8_line101" href="#8_line101">101</a>     <font color="4444FF"><strong>}</strong></font>
<a name="8_line102" href="#8_line102">102</a>     <strong>catch</strong><font color="4444FF">(</font><font color="#2040a0">CIMException</font> <font color="4444FF">&amp;</font> <font color="#2040a0">exception</font><font color="4444FF">)</font>
<a name="8_line103" href="#8_line103">103</a>     <font color="4444FF"><strong>{</strong></font>
<a name="8_line104" href="#8_line104">104</a> 	<font color="#2040a0">Tracer</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">traceCIMException</font><font color="4444FF">(</font><font color="#2040a0">TRC_PROVIDERMANAGER</font>, <font color="#2040a0">Tracer</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">LEVEL4</font>, <font color="#2040a0">exception</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line105" href="#8_line105">105</a> 	<font color="#2040a0">PEG_METHOD_EXIT</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line106" href="#8_line106">106</a> 	<strong>return</strong> <font color="4444FF">(</font><strong>false</strong><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line107" href="#8_line107">107</a>     <font color="4444FF"><strong>}</strong></font>
<a name="8_line108" href="#8_line108">108</a> 
<a name="8_line109" href="#8_line109">109</a>     <font color="#2040a0">PEG_METHOD_EXIT</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line110" href="#8_line110">110</a>     <strong>return</strong> <font color="4444FF">(</font><strong>true</strong><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="8_line111" href="#8_line111">111</a> <font color="4444FF"><strong>}</strong></font>
</pre><!-- code2html delete stop -->
    </div>

<a name="instantiate_providers">
    <h3>Instantiating the Modified Schema and Providers</h3></a>
    <p>
      This was also pretty simple. I piggybacked off the compilation and 
      installation scripts that are already part of the project. 
    </p>
    <p>
      A couple of items to note in the MOF below. <a
      href="#9_line47">Line 47</a> shows a <code>Type 6</code>
      provider, which is an Indication Consumer provider. Also, the
      Indication provider and the Indication Consumer provider are both
      part of the same module. 
    </p>

    <p>
      Here is the registration mof: 
    </p>
    <div class="source">
      <div class="comment">
      <p >
	You can see that I simplified the <code>PG_Subscription</code> class
	in <a href="#9_line53">line 53</a> below. There are no policy attributes, 
	no attribute list, and no filter.
      </p>
	<p>
	  To get things working, I assumed that every subscription
	  includes all attributes every time it is fired. I assumed that 
	  the subscription was created with valid class references and 
	  that providers were registered correctly. 
	</p>
	<p>
	  In the schema, however, I left the filter in the
	  Subscription definition. I just didn't make it a required
	  attribute. I think it is viable to want to test Indication
	  delivery without having to have filters defined and working. 
	</p>
      </div>
      <!-- code2html add -lcc -N Schemas/Pegasus/InterOp/VER20/eServer_Indication20R.mof
      --><!-- code2html delete start --><pre><a name="9_line1" href="#9_line1"> 1</a> <font color="#2040a0">instance</font> <font color="#2040a0">of</font> <font color="#2040a0">eServer_ProviderModule</font>
<a name="9_line2" href="#9_line2"> 2</a> <font color="4444FF"><strong>{</strong></font>
<a name="9_line3" href="#9_line3"> 3</a> 	<font color="#2040a0">Name</font> <font color="4444FF">=</font> <font color="#008000">&quot;ProcessIndicationProvider&quot;</font><font color="4444FF">;</font>
<a name="9_line4" href="#9_line4"> 4</a> 	<font color="#2040a0">Location</font> <font color="4444FF">=</font> <font color="#008000">&quot;ProcessIndicationProvider&quot;</font><font color="4444FF">;</font>
<a name="9_line5" href="#9_line5"> 5</a> 	<font color="#2040a0">Vendor</font> <font color="4444FF">=</font> <font color="#008000">&quot;Pegasus Community&quot;</font><font color="4444FF">;</font>
<a name="9_line6" href="#9_line6"> 6</a> 	<font color="#2040a0">Version</font> <font color="4444FF">=</font> <font color="#008000">&quot;2.0.0&quot;</font><font color="4444FF">;</font>
<a name="9_line7" href="#9_line7"> 7</a> 	<font color="#2040a0">InterfaceType</font> <font color="4444FF">=</font> <font color="#008000">&quot;C++Default&quot;</font><font color="4444FF">;</font>
<a name="9_line8" href="#9_line8"> 8</a> 	<font color="#2040a0">InterfaceVersion</font> <font color="4444FF">=</font> <font color="#008000">&quot;2.0.0&quot;</font><font color="4444FF">;</font>
<a name="9_line9" href="#9_line9"> 9</a> 	<font color="#2040a0">host</font> <font color="4444FF">=</font> <font color="#008000">&quot;localhost&quot;</font><font color="4444FF">;</font>
<a name="9_line10" href="#9_line10">10</a> 	<font color="#2040a0">OperationalStatus</font> <font color="4444FF">=</font> <font color="4444FF"><strong>{</strong></font><font color="#FF0000">2</font><font color="4444FF"><strong>}</strong></font><font color="4444FF">;</font>
<a name="9_line11" href="#9_line11">11</a> <font color="4444FF"><strong>}</strong></font><font color="4444FF">;</font>
<a name="9_line12" href="#9_line12">12</a> 	
<a name="9_line13" href="#9_line13">13</a> <font color="#2040a0">instance</font> <font color="#2040a0">of</font> <font color="#2040a0">eServer_Provider</font>
<a name="9_line14" href="#9_line14">14</a> <font color="4444FF"><strong>{</strong></font>
<a name="9_line15" href="#9_line15">15</a> 	<font color="#2040a0">ProviderModuleName</font> <font color="4444FF">=</font> <font color="#008000">&quot;ProcessIndicationProvider&quot;</font><font color="4444FF">;</font>
<a name="9_line16" href="#9_line16">16</a> 	<font color="#2040a0">Name</font> <font color="4444FF">=</font> <font color="#008000">&quot;eServer_ProcessIndicationProvider&quot;</font><font color="4444FF">;</font>
<a name="9_line17" href="#9_line17">17</a> 	<font color="#2040a0">OperationalStatus</font> <font color="4444FF">=</font> <font color="4444FF"><strong>{</strong></font><font color="#FF0000">2</font><font color="4444FF"><strong>}</strong></font><font color="4444FF">;</font>
<a name="9_line18" href="#9_line18">18</a> <font color="4444FF"><strong>}</strong></font><font color="4444FF">;</font>
<a name="9_line19" href="#9_line19">19</a> 
<a name="9_line20" href="#9_line20">20</a> <font color="#2040a0">instance</font> <font color="#2040a0">of</font> <font color="#2040a0">eServer_ProviderCapabilities</font>
<a name="9_line21" href="#9_line21">21</a> <font color="4444FF"><strong>{</strong></font>
<a name="9_line22" href="#9_line22">22</a> 	<font color="#2040a0">ProviderModuleName</font> <font color="4444FF">=</font> <font color="#008000">&quot;ProcessIndicationProvider&quot;</font><font color="4444FF">;</font>
<a name="9_line23" href="#9_line23">23</a> 	<font color="#2040a0">ProviderName</font> <font color="4444FF">=</font> <font color="#008000">&quot;eServer_ProcessIndicationProvider&quot;</font><font color="4444FF">;</font>
<a name="9_line24" href="#9_line24">24</a> 	<font color="#2040a0">CapabilityID</font> <font color="4444FF">=</font> <font color="#008000">&quot;1&quot;</font><font color="4444FF">;</font>
<a name="9_line25" href="#9_line25">25</a> 	<font color="#2040a0">ClassName</font> <font color="4444FF">=</font> <font color="#008000">&quot;CIM_ProcessIndication&quot;</font><font color="4444FF">;</font>
<a name="9_line26" href="#9_line26">26</a> 	<font color="#2040a0">Namespaces</font> <font color="4444FF">=</font> <font color="4444FF"><strong>{</strong></font><font color="#008000">&quot;root/PG_Interop&quot;</font><font color="4444FF"><strong>}</strong></font><font color="4444FF">;</font>
<a name="9_line27" href="#9_line27">27</a> 	<font color="#2040a0">ProviderType</font> <font color="4444FF">=</font> <font color="4444FF"><strong>{</strong></font> <font color="#FF0000">4</font> <font color="4444FF"><strong>}</strong></font><font color="4444FF">;</font> <font color="#444444">// indication</font>
<a name="9_line28" href="#9_line28">28</a> 	<font color="#2040a0">SupportedProperties</font> <font color="4444FF">=</font> <font color="#2040a0">NULL</font><font color="4444FF">;</font>
<a name="9_line29" href="#9_line29">29</a> 	<font color="#2040a0">SupportedMethods</font> <font color="4444FF">=</font> <font color="#2040a0">NULL</font><font color="4444FF">;</font>
<a name="9_line30" href="#9_line30">30</a> <font color="4444FF"><strong>}</strong></font><font color="4444FF">;</font>
<a name="9_line31" href="#9_line31">31</a> 
<a name="9_line32" href="#9_line32">32</a> 
<a name="9_line33" href="#9_line33">33</a> <font color="#2040a0">instance</font> <font color="#2040a0">of</font> <font color="#2040a0">eServer_Provider</font>
<a name="9_line34" href="#9_line34">34</a> <font color="4444FF"><strong>{</strong></font>
<a name="9_line35" href="#9_line35">35</a> 	<font color="#2040a0">ProviderModuleName</font> <font color="4444FF">=</font> <font color="#008000">&quot;ProcessIndicationProvider&quot;</font><font color="4444FF">;</font>
<a name="9_line36" href="#9_line36">36</a> 	<font color="#2040a0">Name</font> <font color="4444FF">=</font> <font color="#008000">&quot;eServer_ProcessIndicationConsumer&quot;</font><font color="4444FF">;</font>
<a name="9_line37" href="#9_line37">37</a> 	<font color="#2040a0">OperationalStatus</font> <font color="4444FF">=</font> <font color="4444FF"><strong>{</strong></font><font color="#FF0000">2</font><font color="4444FF"><strong>}</strong></font><font color="4444FF">;</font>
<a name="9_line38" href="#9_line38">38</a> <font color="4444FF"><strong>}</strong></font><font color="4444FF">;</font>
<a name="9_line39" href="#9_line39">39</a> 
<a name="9_line40" href="#9_line40">40</a> <font color="#2040a0">instance</font> <font color="#2040a0">of</font> <font color="#2040a0">eServer_ProviderCapabilities</font>
<a name="9_line41" href="#9_line41">41</a> <font color="4444FF"><strong>{</strong></font>
<a name="9_line42" href="#9_line42">42</a> 	<font color="#2040a0">ProviderModuleName</font> <font color="4444FF">=</font> <font color="#008000">&quot;ProcessIndicationProvider&quot;</font><font color="4444FF">;</font>
<a name="9_line43" href="#9_line43">43</a> 	<font color="#2040a0">ProviderName</font> <font color="4444FF">=</font> <font color="#008000">&quot;eServer_ProcessIndicationConsumer&quot;</font><font color="4444FF">;</font>
<a name="9_line44" href="#9_line44">44</a> 	<font color="#2040a0">CapabilityID</font> <font color="4444FF">=</font> <font color="#008000">&quot;2&quot;</font><font color="4444FF">;</font>
<a name="9_line45" href="#9_line45">45</a> 	<font color="#2040a0">ClassName</font> <font color="4444FF">=</font> <font color="#008000">&quot;eServer_ProcessIndicationConsumer&quot;</font><font color="4444FF">;</font>
<a name="9_line46" href="#9_line46">46</a> 	<font color="#2040a0">Namespaces</font> <font color="4444FF">=</font> <font color="4444FF"><strong>{</strong></font><font color="#008000">&quot;root/PG_Interop&quot;</font><font color="4444FF"><strong>}</strong></font><font color="4444FF">;</font>
<a name="9_line47" href="#9_line47">47</a> 	<font color="#2040a0">ProviderType</font> <font color="4444FF">=</font> <font color="4444FF"><strong>{</strong></font> <font color="#FF0000">6</font> <font color="4444FF"><strong>}</strong></font><font color="4444FF">;</font> <font color="#444444">// consumer</font>
<a name="9_line48" href="#9_line48">48</a> 	<font color="#2040a0">SupportedProperties</font> <font color="4444FF">=</font> <font color="#2040a0">NULL</font><font color="4444FF">;</font>
<a name="9_line49" href="#9_line49">49</a> 	<font color="#2040a0">SupportedMethods</font> <font color="4444FF">=</font> <font color="#2040a0">NULL</font><font color="4444FF">;</font>
<a name="9_line50" href="#9_line50">50</a> <font color="4444FF"><strong>}</strong></font><font color="4444FF">;</font>
<a name="9_line51" href="#9_line51">51</a> 
<a name="9_line52" href="#9_line52">52</a> 
<a name="9_line53" href="#9_line53">53</a> <font color="#2040a0">instance</font> <font color="#2040a0">of</font> <font color="#2040a0">eServer_IndicationSubscription</font>
<a name="9_line54" href="#9_line54">54</a> <font color="4444FF"><strong>{</strong></font>
<a name="9_line55" href="#9_line55">55</a> 	<font color="#2040a0">Indication_Class</font>  <font color="4444FF">=</font> <font color="#008000">&quot;CIM_ProcessIndication&quot;</font><font color="4444FF">;</font>
<a name="9_line56" href="#9_line56">56</a> 	<font color="#2040a0">Handler</font> <font color="4444FF">=</font> <font color="#008000">&quot;eServer_ProcessIndicationConsumer&quot;</font><font color="4444FF">;</font>
<a name="9_line57" href="#9_line57">57</a> <font color="4444FF"><strong>}</strong></font><font color="4444FF">;</font>
</pre><!-- code2html delete stop -->      
    </div>

    <a name="indication_provider">
    <h3>Indication Provider</h3></a>
    <p>
      To test Indications, I modified the provider in
      <code>$(PEGASUS_HOME)/src/Providers/sample/ProcessIndicationProvider</code>.
      The biggest mod is the <code>_monitor</code> routine, which runs
      as an independent thread.
    </p>
    <h4>Independent Indication Thread</h4>
    <p>
      Most providers that generate indications will need to have an
      independent thread. I chose to start and stop the thread in the
      <a href="#10_line17"><code>enableIndications</code></a> and 
	<a href="#10_line36"><code>disableIndications</code></a> 
      methods, respectively. 
    </p>

<div class="source">
      <!-- code2html add -lcc -N

void ProcessIndicationProvider::enableIndications (
    ResponseHandler <CIMIndication> & handler)
{
   cout << "eServer_ProcessIndicationProvider: enableIndications" << endl;

   _enable_disable.lock(pegasus_thread_self());
   if(_indications_enabled.value())
   {
      _enable_disable.unlock();
      return;
   }
   _response_handler = &handler;
   _response_handler->processing ();   
   _indications_enabled = 1;
   _indication_thread.run();
   _enable_disable.unlock();
   
}

void ProcessIndicationProvider::disableIndications (void)
{
   cout << "eServer_ProcessIndicationProvider: disableIndications" << endl;
   _enable_disable.lock(pegasus_thread_self());
   
   if(_indications_enabled.value() == 0 )
   {
      _enable_disable.unlock();
      return;
   }

   _indications_enabled = 0;
   _response_handler = 0;
   _indication_thread.join();
   _enable_disable.unlock();

}
      --><!-- code2html delete start --><pre><a name="10_line1" href="#10_line1"> 1</a> 
<a name="10_line2" href="#10_line2"> 2</a> 
<a name="10_line3" href="#10_line3"> 3</a> <strong>void</strong> <font color="#2040a0">ProcessIndicationProvider</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">enableIndications</font> <font color="4444FF">(</font>
<a name="10_line4" href="#10_line4"> 4</a>     <font color="#2040a0">ResponseHandler</font> <font color="4444FF">&lt;</font><font color="#2040a0">CIMIndication</font><font color="4444FF">&gt;</font> <font color="4444FF">&amp;</font> <font color="#2040a0">handler</font><font color="4444FF">)</font>
<a name="10_line5" href="#10_line5"> 5</a> <font color="4444FF"><strong>{</strong></font>
<a name="10_line6" href="#10_line6"> 6</a>    <font color="#2040a0">cout</font> <font color="4444FF">&lt;</font><font color="4444FF">&lt;</font> <font color="#008000">&quot;eServer_ProcessIndicationProvider: enableIndications&quot;</font> <font color="4444FF">&lt;</font><font color="4444FF">&lt;</font> <font color="#2040a0">endl</font><font color="4444FF">;</font>
<a name="10_line7" href="#10_line7"> 7</a> 
<a name="10_line8" href="#10_line8"> 8</a>    <font color="#2040a0">_enable_disable</font>.<font color="#2040a0">lock</font><font color="4444FF">(</font><font color="#2040a0">pegasus_thread_self</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="10_line9" href="#10_line9"> 9</a>    <strong>if</strong><font color="4444FF">(</font><font color="#2040a0">_indications_enabled</font>.<font color="#2040a0">value</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font>
<a name="10_line10" href="#10_line10">10</a>    <font color="4444FF"><strong>{</strong></font>
<a name="10_line11" href="#10_line11">11</a>       <font color="#2040a0">_enable_disable</font>.<font color="#2040a0">unlock</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="10_line12" href="#10_line12">12</a>       <strong>return</strong><font color="4444FF">;</font>
<a name="10_line13" href="#10_line13">13</a>    <font color="4444FF"><strong>}</strong></font>
<a name="10_line14" href="#10_line14">14</a>    <font color="#2040a0">_response_handler</font> <font color="4444FF">=</font> <font color="4444FF">&amp;</font><font color="#2040a0">handler</font><font color="4444FF">;</font>
<a name="10_line15" href="#10_line15">15</a>    <font color="#2040a0">_response_handler</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">processing</font> <font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>   
<a name="10_line16" href="#10_line16">16</a>    <font color="#2040a0">_indications_enabled</font> <font color="4444FF">=</font> <font color="#FF0000">1</font><font color="4444FF">;</font>
<a name="10_line17" href="#10_line17">17</a>    <font color="#2040a0">_indication_thread</font>.<font color="#2040a0">run</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="10_line18" href="#10_line18">18</a>    <font color="#2040a0">_enable_disable</font>.<font color="#2040a0">unlock</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="10_line19" href="#10_line19">19</a>    
<a name="10_line20" href="#10_line20">20</a> <font color="4444FF"><strong>}</strong></font>
<a name="10_line21" href="#10_line21">21</a> 
<a name="10_line22" href="#10_line22">22</a> <strong>void</strong> <font color="#2040a0">ProcessIndicationProvider</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">disableIndications</font> <font color="4444FF">(</font><strong>void</strong><font color="4444FF">)</font>
<a name="10_line23" href="#10_line23">23</a> <font color="4444FF"><strong>{</strong></font>
<a name="10_line24" href="#10_line24">24</a>    <font color="#2040a0">cout</font> <font color="4444FF">&lt;</font><font color="4444FF">&lt;</font> <font color="#008000">&quot;eServer_ProcessIndicationProvider: disableIndications&quot;</font> <font color="4444FF">&lt;</font><font color="4444FF">&lt;</font> <font color="#2040a0">endl</font><font color="4444FF">;</font>
<a name="10_line25" href="#10_line25">25</a>    <font color="#2040a0">_enable_disable</font>.<font color="#2040a0">lock</font><font color="4444FF">(</font><font color="#2040a0">pegasus_thread_self</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="10_line26" href="#10_line26">26</a>    
<a name="10_line27" href="#10_line27">27</a>    <strong>if</strong><font color="4444FF">(</font><font color="#2040a0">_indications_enabled</font>.<font color="#2040a0">value</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#FF0000">0</font> <font color="4444FF">)</font>
<a name="10_line28" href="#10_line28">28</a>    <font color="4444FF"><strong>{</strong></font>
<a name="10_line29" href="#10_line29">29</a>       <font color="#2040a0">_enable_disable</font>.<font color="#2040a0">unlock</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="10_line30" href="#10_line30">30</a>       <strong>return</strong><font color="4444FF">;</font>
<a name="10_line31" href="#10_line31">31</a>    <font color="4444FF"><strong>}</strong></font>
<a name="10_line32" href="#10_line32">32</a> 
<a name="10_line33" href="#10_line33">33</a>    <font color="#2040a0">_indications_enabled</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font>
<a name="10_line34" href="#10_line34">34</a>    <font color="#2040a0">_response_handler</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font>
<a name="10_line35" href="#10_line35">35</a>    <font color="#2040a0">_indication_thread</font>.<font color="#2040a0">join</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="10_line36" href="#10_line36">36</a>    <font color="#2040a0">_enable_disable</font>.<font color="#2040a0">unlock</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="10_line37" href="#10_line37">37</a> 
<a name="10_line38" href="#10_line38">38</a> <font color="4444FF"><strong>}</strong></font>
<a name="10_line39" href="#10_line39">39</a>       
</pre><!-- code2html delete stop -->
    </div>
    <h4>Delivering the Indication</h4>
    <p>
      To deliver the indication, the <code>_monitor</code> thread
      calls <a href="#11_line45"><code>deliver(CIMInstance)</code></a>
      using its response handler.
    </p>
    <p>
      The importance of allocating the response handler on the heap in 
      the <code>ProviderManagerService</code> and preserving it for the 
      life of the indication thread is demonstrated pretty clearly in the 
      code below. It should be obvious that the response handler must 
      not be destroyed after the subscription is enabled. 
    </p>
<div class="source">
      <!-- code2html add -lcc -N
PEGASUS_THREAD_RETURN 
PEGASUS_THREAD_CDECL 
ProcessIndicationProvider::_monitor(void *parm)
{
   PEGASUS_ASSERT(parm != 0);
   
   Thread *th = static_cast<Thread *>(parm);
   ProcessIndicationProvider *myself = 
      static_cast<ProcessIndicationProvider *>(th->get_parm());

   while(true)
   {
      pegasus_sleep(1000);
      try
      {
	 myself->_enable_disable.try_lock(pegasus_thread_self());
      }
      catch(...)
      {
	 if(myself->_indications_enabled.value() == 0  || 
             myself->_response_handler == 0 )
	    exit_thread((PEGASUS_THREAD_RETURN)0);
	 else
	    continue;
      }
      try
      {
	 
	 CIMInstance indicationInstance ("root/PG_Interop:CIM_ProcessIndication");
	 
	 indicationInstance.addProperty
	    (CIMProperty ("IndicationTime", CIMValue (CIMDateTime ())));
	 
	 indicationInstance.addProperty
	    (CIMProperty ("IndicationIdentifier", "ProcessIndication01"));
	 
	 Array <String> correlatedIndications;
	 indicationInstance.addProperty (
                 CIMProperty ("CorrelatedIndications", 
		 CIMValue (correlatedIndications)));
	 
	 CIMIndication cimIndication (indicationInstance);
	 
	 myself->_response_handler->deliver (cimIndication);
	 
      }
      catch(...)
      {
	
      }
      myself->_enable_disable.unlock();
   }
   exit_thread((PEGASUS_THREAD_RETURN)0);
   return(PEGASUS_THREAD_RETURN)0;
}

--><!-- code2html delete start --><pre><a name="11_line1" href="#11_line1"> 1</a> 
<a name="11_line2" href="#11_line2"> 2</a> <font color="#2040a0">PEGASUS_THREAD_RETURN</font> 
<a name="11_line3" href="#11_line3"> 3</a> <font color="#2040a0">PEGASUS_THREAD_CDECL</font> 
<a name="11_line4" href="#11_line4"> 4</a> <font color="#2040a0">ProcessIndicationProvider</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">_monitor</font><font color="4444FF">(</font><strong>void</strong> <font color="4444FF">*</font><font color="#2040a0">parm</font><font color="4444FF">)</font>
<a name="11_line5" href="#11_line5"> 5</a> <font color="4444FF"><strong>{</strong></font>
<a name="11_line6" href="#11_line6"> 6</a>    <font color="#2040a0">PEGASUS_ASSERT</font><font color="4444FF">(</font><font color="#2040a0">parm</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="11_line7" href="#11_line7"> 7</a>    
<a name="11_line8" href="#11_line8"> 8</a>    <font color="#2040a0">Thread</font> <font color="4444FF">*</font><font color="#2040a0">th</font> <font color="4444FF">=</font> <strong>static_cast</strong><font color="4444FF">&lt;</font><font color="#2040a0">Thread</font> <font color="4444FF">*</font><font color="4444FF">&gt;</font><font color="4444FF">(</font><font color="#2040a0">parm</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="11_line9" href="#11_line9"> 9</a>    <font color="#2040a0">ProcessIndicationProvider</font> <font color="4444FF">*</font><font color="#2040a0">myself</font> <font color="4444FF">=</font> 
<a name="11_line10" href="#11_line10">10</a>       <strong>static_cast</strong><font color="4444FF">&lt;</font><font color="#2040a0">ProcessIndicationProvider</font> <font color="4444FF">*</font><font color="4444FF">&gt;</font><font color="4444FF">(</font><font color="#2040a0">th</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">get_parm</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="11_line11" href="#11_line11">11</a> 
<a name="11_line12" href="#11_line12">12</a>    <strong>while</strong><font color="4444FF">(</font><strong>true</strong><font color="4444FF">)</font>
<a name="11_line13" href="#11_line13">13</a>    <font color="4444FF"><strong>{</strong></font>
<a name="11_line14" href="#11_line14">14</a>       <font color="#2040a0">pegasus_sleep</font><font color="4444FF">(</font><font color="#FF0000">1000</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="11_line15" href="#11_line15">15</a>       <font color="#2040a0">try</font>
<a name="11_line16" href="#11_line16">16</a>       <font color="4444FF"><strong>{</strong></font>
<a name="11_line17" href="#11_line17">17</a> 	 <font color="#2040a0">myself</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">_enable_disable</font>.<font color="#2040a0">try_lock</font><font color="4444FF">(</font><font color="#2040a0">pegasus_thread_self</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="11_line18" href="#11_line18">18</a>       <font color="4444FF"><strong>}</strong></font>
<a name="11_line19" href="#11_line19">19</a>       <strong>catch</strong><font color="4444FF">(</font>...<font color="4444FF">)</font>
<a name="11_line20" href="#11_line20">20</a>       <font color="4444FF"><strong>{</strong></font>
<a name="11_line21" href="#11_line21">21</a> 	 <strong>if</strong><font color="4444FF">(</font><font color="#2040a0">myself</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">_indications_enabled</font>.<font color="#2040a0">value</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#FF0000">0</font>  <font color="4444FF">|</font><font color="4444FF">|</font> 
<a name="11_line22" href="#11_line22">22</a>              <font color="#2040a0">myself</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">_response_handler</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#FF0000">0</font> <font color="4444FF">)</font>
<a name="11_line23" href="#11_line23">23</a> 	    <font color="#2040a0">exit_thread</font><font color="4444FF">(</font><font color="4444FF">(</font><font color="#2040a0">PEGASUS_THREAD_RETURN</font><font color="4444FF">)</font><font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="11_line24" href="#11_line24">24</a> 	 <strong>else</strong>
<a name="11_line25" href="#11_line25">25</a> 	    <strong>continue</strong><font color="4444FF">;</font>
<a name="11_line26" href="#11_line26">26</a>       <font color="4444FF"><strong>}</strong></font>
<a name="11_line27" href="#11_line27">27</a>       <font color="#2040a0">try</font>
<a name="11_line28" href="#11_line28">28</a>       <font color="4444FF"><strong>{</strong></font>
<a name="11_line29" href="#11_line29">29</a> 	 
<a name="11_line30" href="#11_line30">30</a> 	 <font color="#2040a0">CIMInstance</font> <font color="#2040a0">indicationInstance</font> <font color="4444FF">(</font><font color="#008000">&quot;root/PG_Interop:CIM_ProcessIndication&quot;</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="11_line31" href="#11_line31">31</a> 	 
<a name="11_line32" href="#11_line32">32</a> 	 <font color="#2040a0">indicationInstance</font>.<font color="#2040a0">addProperty</font>
<a name="11_line33" href="#11_line33">33</a> 	    <font color="4444FF">(</font><font color="#2040a0">CIMProperty</font> <font color="4444FF">(</font><font color="#008000">&quot;IndicationTime&quot;</font>, <font color="#2040a0">CIMValue</font> <font color="4444FF">(</font><font color="#2040a0">CIMDateTime</font> <font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="11_line34" href="#11_line34">34</a> 	 
<a name="11_line35" href="#11_line35">35</a> 	 <font color="#2040a0">indicationInstance</font>.<font color="#2040a0">addProperty</font>
<a name="11_line36" href="#11_line36">36</a> 	    <font color="4444FF">(</font><font color="#2040a0">CIMProperty</font> <font color="4444FF">(</font><font color="#008000">&quot;IndicationIdentifier&quot;</font>, <font color="#008000">&quot;ProcessIndication01&quot;</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="11_line37" href="#11_line37">37</a> 	 
<a name="11_line38" href="#11_line38">38</a> 	 <font color="#2040a0">Array</font> <font color="4444FF">&lt;</font><font color="#2040a0">String</font><font color="4444FF">&gt;</font> <font color="#2040a0">correlatedIndications</font><font color="4444FF">;</font>
<a name="11_line39" href="#11_line39">39</a> 	 <font color="#2040a0">indicationInstance</font>.<font color="#2040a0">addProperty</font> <font color="4444FF">(</font>
<a name="11_line40" href="#11_line40">40</a>                  <font color="#2040a0">CIMProperty</font> <font color="4444FF">(</font><font color="#008000">&quot;CorrelatedIndications&quot;</font>, 
<a name="11_line41" href="#11_line41">41</a> 		 <font color="#2040a0">CIMValue</font> <font color="4444FF">(</font><font color="#2040a0">correlatedIndications</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="11_line42" href="#11_line42">42</a> 	 
<a name="11_line43" href="#11_line43">43</a> 	 <font color="#2040a0">CIMIndication</font> <font color="#2040a0">cimIndication</font> <font color="4444FF">(</font><font color="#2040a0">indicationInstance</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="11_line44" href="#11_line44">44</a> 	 
<a name="11_line45" href="#11_line45">45</a> 	 <font color="#2040a0">myself</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">_response_handler</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">deliver</font> <font color="4444FF">(</font><font color="#2040a0">cimIndication</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="11_line46" href="#11_line46">46</a> 	 
<a name="11_line47" href="#11_line47">47</a>       <font color="4444FF"><strong>}</strong></font>
<a name="11_line48" href="#11_line48">48</a>       <strong>catch</strong><font color="4444FF">(</font>...<font color="4444FF">)</font>
<a name="11_line49" href="#11_line49">49</a>       <font color="4444FF"><strong>{</strong></font>
<a name="11_line50" href="#11_line50">50</a> 	
<a name="11_line51" href="#11_line51">51</a>       <font color="4444FF"><strong>}</strong></font>
<a name="11_line52" href="#11_line52">52</a>       <font color="#2040a0">myself</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">_enable_disable</font>.<font color="#2040a0">unlock</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="11_line53" href="#11_line53">53</a>    <font color="4444FF"><strong>}</strong></font>
<a name="11_line54" href="#11_line54">54</a>    <font color="#2040a0">exit_thread</font><font color="4444FF">(</font><font color="4444FF">(</font><font color="#2040a0">PEGASUS_THREAD_RETURN</font><font color="4444FF">)</font><font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="11_line55" href="#11_line55">55</a>    <strong>return</strong><font color="4444FF">(</font><font color="#2040a0">PEGASUS_THREAD_RETURN</font><font color="4444FF">)</font><font color="#FF0000">0</font><font color="4444FF">;</font>
<a name="11_line56" href="#11_line56">56</a> <font color="4444FF"><strong>}</strong></font>
</pre><!-- code2html delete stop -->
</div>
<a name="indication_consumer_provider">
<h3>Indication Consumer Provider</h3></a>
      <p>
	Toe receive Indications, I added an additional provider to the
	module at
	<code>$(PEGASUS_HOME)/src/Providers/sample/ProcessIndicationProvider</code>.
	The following code in the <code>PegasusCreateProvider</code> symbol
	shows how the module creates the different types of providers. 
   </p>
<div class="source">
      <!-- code2html add -lcc -N

extern "C" PEGASUS_EXPORT CIMBaseProvider * PegasusCreateProvider
    (const String & providerName)
{
   
    if ((String::equalNoCase (providerName, "ProcessIndicationProvider")) ||
        (String::equalNoCase (providerName, "ProcessIndicationProvider2")) || 
	(String::equalNoCase (providerName, "eServer_ProcessIndicationProvider")))
    {
	return (new ProcessIndicationProvider ());
    }
    if(String::equalNoCase(providerName, "eServer_ProcessIndicationConsumer"))
    {
       return new ProcessIndicationConsumer();
    }

    return (0);
}
--><!-- code2html delete start --><pre><a name="12_line1" href="#12_line1"> 1</a> 
<a name="12_line2" href="#12_line2"> 2</a> 
<a name="12_line3" href="#12_line3"> 3</a> <strong>extern</strong> <font color="#008000">&quot;C&quot;</font> <font color="#2040a0">PEGASUS_EXPORT</font> <font color="#2040a0">CIMBaseProvider</font> <font color="4444FF">*</font> <font color="#2040a0">PegasusCreateProvider</font>
<a name="12_line4" href="#12_line4"> 4</a>     <font color="4444FF">(</font><strong>const</strong> <font color="#2040a0">String</font> <font color="4444FF">&amp;</font> <font color="#2040a0">providerName</font><font color="4444FF">)</font>
<a name="12_line5" href="#12_line5"> 5</a> <font color="4444FF"><strong>{</strong></font>
<a name="12_line6" href="#12_line6"> 6</a>    
<a name="12_line7" href="#12_line7"> 7</a>     <strong>if</strong> <font color="4444FF">(</font><font color="4444FF">(</font><font color="#2040a0">String</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">equalNoCase</font> <font color="4444FF">(</font><font color="#2040a0">providerName</font>, <font color="#008000">&quot;ProcessIndicationProvider&quot;</font><font color="4444FF">)</font><font color="4444FF">)</font> <font color="4444FF">|</font><font color="4444FF">|</font>
<a name="12_line8" href="#12_line8"> 8</a>         <font color="4444FF">(</font><font color="#2040a0">String</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">equalNoCase</font> <font color="4444FF">(</font><font color="#2040a0">providerName</font>, <font color="#008000">&quot;ProcessIndicationProvider2&quot;</font><font color="4444FF">)</font><font color="4444FF">)</font> <font color="4444FF">|</font><font color="4444FF">|</font> 
<a name="12_line9" href="#12_line9"> 9</a> 	<font color="4444FF">(</font><font color="#2040a0">String</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">equalNoCase</font> <font color="4444FF">(</font><font color="#2040a0">providerName</font>, <font color="#008000">&quot;eServer_ProcessIndicationProvider&quot;</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">)</font>
<a name="12_line10" href="#12_line10">10</a>     <font color="4444FF"><strong>{</strong></font>
<a name="12_line11" href="#12_line11">11</a> 	<strong>return</strong> <font color="4444FF">(</font><strong>new</strong> <font color="#2040a0">ProcessIndicationProvider</font> <font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="12_line12" href="#12_line12">12</a>     <font color="4444FF"><strong>}</strong></font>
<a name="12_line13" href="#12_line13">13</a>     <strong>if</strong><font color="4444FF">(</font><font color="#2040a0">String</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">equalNoCase</font><font color="4444FF">(</font><font color="#2040a0">providerName</font>, <font color="#008000">&quot;eServer_ProcessIndicationConsumer&quot;</font><font color="4444FF">)</font><font color="4444FF">)</font>
<a name="12_line14" href="#12_line14">14</a>     <font color="4444FF"><strong>{</strong></font>
<a name="12_line15" href="#12_line15">15</a>        <strong>return</strong> <strong>new</strong> <font color="#2040a0">ProcessIndicationConsumer</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="12_line16" href="#12_line16">16</a>     <font color="4444FF"><strong>}</strong></font>
<a name="12_line17" href="#12_line17">17</a> 
<a name="12_line18" href="#12_line18">18</a>     <strong>return</strong> <font color="4444FF">(</font><font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="12_line19" href="#12_line19">19</a> <font color="4444FF"><strong>}</strong></font>
</pre><!-- code2html delete stop -->
</div>
   <h4>Handling the Indication</h4>
    <p>
      The code to handle the Indication in the Consumer Provider is 
      straightforward. Note that the consumer clones the indication immediately. 
    </p>
<div class="source">
      <!-- code2html add -lcc -N

void ProcessIndicationConsumer::handleIndication(
      const OperationContext & context, 
      const CIMInstance & indication,
      ResponseHandler<void> & handler)
{
   
   CIMInstance indication_copy = indication.clone();
   PEGASUS_STD(cout) << 
      "Indication Consumer: recieved indication of class: " << 
      indication_copy.getClassName() << PEGASUS_STD(endl);
    
}

--><!-- code2html delete start --><pre><a name="13_line1" href="#13_line1"> 1</a> 
<a name="13_line2" href="#13_line2"> 2</a> 
<a name="13_line3" href="#13_line3"> 3</a> <strong>void</strong> <font color="#2040a0">ProcessIndicationConsumer</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">handleIndication</font><font color="4444FF">(</font>
<a name="13_line4" href="#13_line4"> 4</a>       <strong>const</strong> <font color="#2040a0">OperationContext</font> <font color="4444FF">&amp;</font> <font color="#2040a0">context</font>, 
<a name="13_line5" href="#13_line5"> 5</a>       <strong>const</strong> <font color="#2040a0">CIMInstance</font> <font color="4444FF">&amp;</font> <font color="#2040a0">indication</font>,
<a name="13_line6" href="#13_line6"> 6</a>       <font color="#2040a0">ResponseHandler</font><font color="4444FF">&lt;</font><strong>void</strong><font color="4444FF">&gt;</font> <font color="4444FF">&amp;</font> <font color="#2040a0">handler</font><font color="4444FF">)</font>
<a name="13_line7" href="#13_line7"> 7</a> <font color="4444FF"><strong>{</strong></font>
<a name="13_line8" href="#13_line8"> 8</a>    
<a name="13_line9" href="#13_line9"> 9</a>    <font color="#2040a0">CIMInstance</font> <font color="#2040a0">indication_copy</font> <font color="4444FF">=</font> <font color="#2040a0">indication</font>.<font color="#2040a0">clone</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="13_line10" href="#13_line10">10</a>    <font color="#2040a0">PEGASUS_STD</font><font color="4444FF">(</font><font color="#2040a0">cout</font><font color="4444FF">)</font> <font color="4444FF">&lt;</font><font color="4444FF">&lt;</font> 
<a name="13_line11" href="#13_line11">11</a>       <font color="#008000">&quot;Indication Consumer: recieved indication of class: &quot;</font> <font color="4444FF">&lt;</font><font color="4444FF">&lt;</font> 
<a name="13_line12" href="#13_line12">12</a>       <font color="#2040a0">indication_copy</font>.<font color="#2040a0">getClassName</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF">&lt;</font><font color="4444FF">&lt;</font> <font color="#2040a0">PEGASUS_STD</font><font color="4444FF">(</font><font color="#2040a0">endl</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="13_line13" href="#13_line13">13</a>     
<a name="13_line14" href="#13_line14">14</a> <font color="4444FF"><strong>}</strong></font>
</pre><!-- code2html delete stop -->
</div>
<a name="indication_processing">
<h3>Indication Processing Pathway</h3></a>
    <p>
      Now we can show the entire pathway of an Indication as it is generated,
      moved through Pegasus, and handled. 
    </p>
    <ol class="enumerated">
      <li>When a subscription is created, the
      <code>IndicationService</code> sends a
      <code>CIMEnableIndicationsRequestMessage</code> to the
      <code>ProviderManagerService</code>.<br><br></li> 

      <li>The <code>ProviderManagerService</code> creates a 
	response handler <a href="#1_line32">from the heap</a> 
	and <a href="#1_line58">stores the handler in a hashtable</a>. 
	It then calls the provider's <code>enableIndications</code> method. 
	 <br><br></li>
     

      <li>The <code>CIMIndicationProvider</code> handles the 
	call to <code>enableIndications</code> by 
	<a href="#10_line3">creating an independent monitor 
	  thread and storing the response handler.</a>
	<br><br></li>

      <li>The <a href="#11_line30">indication is
      created</a> by the CIMIndicationProvider and <a href="#11_line45">passed to the
      response handler</a>.<br><br></li>

      <li>The response handler <a href="#14_line2">sends a
      <code>CIMProcessIndicationRequestMessage</code></a>, which
      contains the indication, to the
      <code>IndicationService</code>.<br><br></li>

      <li>
	The <code>IndicationService</code> <a
	href="#15_line20">retrieves subscriptions that match the
	indication</a> and creates a list of consumers. <br><br></li>

	<li> For each consumer in the list the
	<code>IndicationService</code><a href="#16_line36"> creates a
	<code>CIMConsumeIndicationRequestMessage</code></a> and sends 
	that message to the consumer. 
	<br><br></li>

      <li>When the <code>CIMIndicationConsumer</code> <a
      href="#13_line2">recieves the
      <code>CIMConsumeIndicationRequestMessage</code> message</a> it
      clones the indication and processes it.
	<br><br></li>
    </ol>



<div class="source">
      
<!-- code2html add -lcc -N 
virtual void deliver(const OperationContext & context, const CIMIndication & cimIndication)
{
     // ATTN: temporarily convert indication to instance
     CIMInstance cimInstance(cimIndication);

     // create message
     CIMProcessIndicationRequestMessage * request =
         new CIMProcessIndicationRequestMessage(
           _request_copy.messageId,
           cimInstance.getPath().getNameSpace(),
           cimInstance,
           QueueIdStack(_target->getQueueId(), _source->getQueueId()));

     AsyncLegacyOperationStart * asyncRequest =
         new AsyncLegacyOperationStart(
         _source->get_next_xid(),
         0,
         _target->getQueueId(),
         request,
         _target->getQueueId());

    PEGASUS_ASSERT(asyncRequest != 0);

     _source->SendForget(asyncRequest);
}

--><!-- code2html delete start --><pre><a name="14_line1" href="#14_line1"> 1</a> 
<a name="14_line2" href="#14_line2"> 2</a> <strong>virtual</strong> <strong>void</strong> <font color="#2040a0">deliver</font><font color="4444FF">(</font><strong>const</strong> <font color="#2040a0">OperationContext</font> <font color="4444FF">&amp;</font> <font color="#2040a0">context</font>, <strong>const</strong> <font color="#2040a0">CIMIndication</font> <font color="4444FF">&amp;</font> <font color="#2040a0">cimIndication</font><font color="4444FF">)</font>
<a name="14_line3" href="#14_line3"> 3</a> <font color="4444FF"><strong>{</strong></font>
<a name="14_line4" href="#14_line4"> 4</a>      <font color="#444444">// ATTN: temporarily convert indication to instance</font>
<a name="14_line5" href="#14_line5"> 5</a>      <font color="#2040a0">CIMInstance</font> <font color="#2040a0">cimInstance</font><font color="4444FF">(</font><font color="#2040a0">cimIndication</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="14_line6" href="#14_line6"> 6</a> 
<a name="14_line7" href="#14_line7"> 7</a>      <font color="#444444">// create message</font>
<a name="14_line8" href="#14_line8"> 8</a>      <font color="#2040a0">CIMProcessIndicationRequestMessage</font> <font color="4444FF">*</font> <font color="#2040a0">request</font> <font color="4444FF">=</font>
<a name="14_line9" href="#14_line9"> 9</a>          <strong>new</strong> <font color="#2040a0">CIMProcessIndicationRequestMessage</font><font color="4444FF">(</font>
<a name="14_line10" href="#14_line10">10</a>            <font color="#2040a0">_request_copy</font>.<font color="#2040a0">messageId</font>,
<a name="14_line11" href="#14_line11">11</a>            <font color="#2040a0">cimInstance</font>.<font color="#2040a0">getPath</font><font color="4444FF">(</font><font color="4444FF">)</font>.<font color="#2040a0">getNameSpace</font><font color="4444FF">(</font><font color="4444FF">)</font>,
<a name="14_line12" href="#14_line12">12</a>            <font color="#2040a0">cimInstance</font>,
<a name="14_line13" href="#14_line13">13</a>            <font color="#2040a0">QueueIdStack</font><font color="4444FF">(</font><font color="#2040a0">_target</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">getQueueId</font><font color="4444FF">(</font><font color="4444FF">)</font>, <font color="#2040a0">_source</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">getQueueId</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="14_line14" href="#14_line14">14</a> 
<a name="14_line15" href="#14_line15">15</a>      <font color="#2040a0">AsyncLegacyOperationStart</font> <font color="4444FF">*</font> <font color="#2040a0">asyncRequest</font> <font color="4444FF">=</font>
<a name="14_line16" href="#14_line16">16</a>          <strong>new</strong> <font color="#2040a0">AsyncLegacyOperationStart</font><font color="4444FF">(</font>
<a name="14_line17" href="#14_line17">17</a>          <font color="#2040a0">_source</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">get_next_xid</font><font color="4444FF">(</font><font color="4444FF">)</font>,
<a name="14_line18" href="#14_line18">18</a>          <font color="#FF0000">0</font>,
<a name="14_line19" href="#14_line19">19</a>          <font color="#2040a0">_target</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">getQueueId</font><font color="4444FF">(</font><font color="4444FF">)</font>,
<a name="14_line20" href="#14_line20">20</a>          <font color="#2040a0">request</font>,
<a name="14_line21" href="#14_line21">21</a>          <font color="#2040a0">_target</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">getQueueId</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="14_line22" href="#14_line22">22</a> 
<a name="14_line23" href="#14_line23">23</a>     <font color="#2040a0">PEGASUS_ASSERT</font><font color="4444FF">(</font><font color="#2040a0">asyncRequest</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="14_line24" href="#14_line24">24</a> 
<a name="14_line25" href="#14_line25">25</a>      <font color="#2040a0">_source</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">SendForget</font><font color="4444FF">(</font><font color="#2040a0">asyncRequest</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="14_line26" href="#14_line26">26</a> <font color="4444FF"><strong>}</strong></font>
</pre><!-- code2html delete stop -->
</div>


<div class="source">
      
<!-- code2html add -lcc -N 
void eServerIndicationService::_handleProcessIndicationRequest(
      const Message *message)
{
   PEG_METHOD_ENTER (TRC_INDICATION_SERVICE,
		     "eServerIndicationService::_handleProcessIndicationRequest");

   CIMProcessIndicationRequestMessage* request =
      (CIMProcessIndicationRequestMessage*) message;
   
   CIMException cimException;

   CIMProcessIndicationResponseMessage* response =
      new CIMProcessIndicationResponseMessage(
	 request->messageId,
	 cimException,
	 request->queueIds.copyAndPop());
   try 
   {
      /* get each name space */
      Array<String> nameSpaceNames;
      _getNameSpaceNames(nameSpaceNames);

      Array<CIMInstance> subscriptions;
      CIMInstance indication = request->indicationInstance.clone();

      _getMatchingSubscriptions(indication, subscriptions);

      // keep this super simple
      // always deliver all properties of the indication class to the consumer
      // every subscription has one indication class and one consumer
      // the consumer is responsible for filtering and multiplexing

      Array<CIMObjectPath> absent_consumers;

      _deliverIndication(subscriptions, 
			 indication,
			 absent_consumers);
   
   }
   catch(CIMException & e)
   {
      response->cimException = e;
   }
   catch(Exception & e)
   {
      response->cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, 
						     e.getMessage());
   }
   catch(...)
   {
   response->cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, 
						  "Internal Error");
   }
   _enqueueResponse(request, response);

   PEG_METHOD_EXIT();
}

--><!-- code2html delete start --><pre><a name="15_line1" href="#15_line1"> 1</a> 
<a name="15_line2" href="#15_line2"> 2</a> <strong>void</strong> <font color="#2040a0">eServerIndicationService</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">_handleProcessIndicationRequest</font><font color="4444FF">(</font>
<a name="15_line3" href="#15_line3"> 3</a>       <strong>const</strong> <font color="#2040a0">Message</font> <font color="4444FF">*</font><font color="#2040a0">message</font><font color="4444FF">)</font>
<a name="15_line4" href="#15_line4"> 4</a> <font color="4444FF"><strong>{</strong></font>
<a name="15_line5" href="#15_line5"> 5</a>    <font color="#2040a0">PEG_METHOD_ENTER</font> <font color="4444FF">(</font><font color="#2040a0">TRC_INDICATION_SERVICE</font>,
<a name="15_line6" href="#15_line6"> 6</a> 		     <font color="#008000">&quot;eServerIndicationService::_handleProcessIndicationRequest&quot;</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="15_line7" href="#15_line7"> 7</a> 
<a name="15_line8" href="#15_line8"> 8</a>    <font color="#2040a0">CIMProcessIndicationRequestMessage</font><font color="4444FF">*</font> <font color="#2040a0">request</font> <font color="4444FF">=</font>
<a name="15_line9" href="#15_line9"> 9</a>       <font color="4444FF">(</font><font color="#2040a0">CIMProcessIndicationRequestMessage</font><font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">message</font><font color="4444FF">;</font>
<a name="15_line10" href="#15_line10">10</a>    
<a name="15_line11" href="#15_line11">11</a>    <font color="#2040a0">CIMException</font> <font color="#2040a0">cimException</font><font color="4444FF">;</font>
<a name="15_line12" href="#15_line12">12</a> 
<a name="15_line13" href="#15_line13">13</a>    <font color="#2040a0">CIMProcessIndicationResponseMessage</font><font color="4444FF">*</font> <font color="#2040a0">response</font> <font color="4444FF">=</font>
<a name="15_line14" href="#15_line14">14</a>       <strong>new</strong> <font color="#2040a0">CIMProcessIndicationResponseMessage</font><font color="4444FF">(</font>
<a name="15_line15" href="#15_line15">15</a> 	 <font color="#2040a0">request</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">messageId</font>,
<a name="15_line16" href="#15_line16">16</a> 	 <font color="#2040a0">cimException</font>,
<a name="15_line17" href="#15_line17">17</a> 	 <font color="#2040a0">request</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">queueIds</font>.<font color="#2040a0">copyAndPop</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="15_line18" href="#15_line18">18</a>    <font color="#2040a0">try</font> 
<a name="15_line19" href="#15_line19">19</a>    <font color="4444FF"><strong>{</strong></font>
<a name="15_line20" href="#15_line20">20</a>       <font color="#444444">/* get each name space */</font>
<a name="15_line21" href="#15_line21">21</a>       <font color="#2040a0">Array</font><font color="4444FF">&lt;</font><font color="#2040a0">String</font><font color="4444FF">&gt;</font> <font color="#2040a0">nameSpaceNames</font><font color="4444FF">;</font>
<a name="15_line22" href="#15_line22">22</a>       <font color="#2040a0">_getNameSpaceNames</font><font color="4444FF">(</font><font color="#2040a0">nameSpaceNames</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="15_line23" href="#15_line23">23</a> 
<a name="15_line24" href="#15_line24">24</a>       <font color="#2040a0">Array</font><font color="4444FF">&lt;</font><font color="#2040a0">CIMInstance</font><font color="4444FF">&gt;</font> <font color="#2040a0">subscriptions</font><font color="4444FF">;</font>
<a name="15_line25" href="#15_line25">25</a>       <font color="#2040a0">CIMInstance</font> <font color="#2040a0">indication</font> <font color="4444FF">=</font> <font color="#2040a0">request</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">indicationInstance</font>.<font color="#2040a0">clone</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="15_line26" href="#15_line26">26</a> 
<a name="15_line27" href="#15_line27">27</a>       <font color="#2040a0">_getMatchingSubscriptions</font><font color="4444FF">(</font><font color="#2040a0">indication</font>, <font color="#2040a0">subscriptions</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="15_line28" href="#15_line28">28</a> 
<a name="15_line29" href="#15_line29">29</a>       <font color="#444444">// keep this super simple</font>
<a name="15_line30" href="#15_line30">30</a>       <font color="#444444">// always deliver all properties of the indication class to the consumer</font>
<a name="15_line31" href="#15_line31">31</a>       <font color="#444444">// every subscription has one indication class and one consumer</font>
<a name="15_line32" href="#15_line32">32</a>       <font color="#444444">// the consumer is responsible for filtering and multiplexing</font>
<a name="15_line33" href="#15_line33">33</a> 
<a name="15_line34" href="#15_line34">34</a>       <font color="#2040a0">Array</font><font color="4444FF">&lt;</font><font color="#2040a0">CIMObjectPath</font><font color="4444FF">&gt;</font> <font color="#2040a0">absent_consumers</font><font color="4444FF">;</font>
<a name="15_line35" href="#15_line35">35</a> 
<a name="15_line36" href="#15_line36">36</a>       <font color="#2040a0">_deliverIndication</font><font color="4444FF">(</font><font color="#2040a0">subscriptions</font>, 
<a name="15_line37" href="#15_line37">37</a> 			 <font color="#2040a0">indication</font>,
<a name="15_line38" href="#15_line38">38</a> 			 <font color="#2040a0">absent_consumers</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="15_line39" href="#15_line39">39</a>    
<a name="15_line40" href="#15_line40">40</a>    <font color="4444FF"><strong>}</strong></font>
<a name="15_line41" href="#15_line41">41</a>    <strong>catch</strong><font color="4444FF">(</font><font color="#2040a0">CIMException</font> <font color="4444FF">&amp;</font> <font color="#2040a0">e</font><font color="4444FF">)</font>
<a name="15_line42" href="#15_line42">42</a>    <font color="4444FF"><strong>{</strong></font>
<a name="15_line43" href="#15_line43">43</a>       <font color="#2040a0">response</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">cimException</font> <font color="4444FF">=</font> <font color="#2040a0">e</font><font color="4444FF">;</font>
<a name="15_line44" href="#15_line44">44</a>    <font color="4444FF"><strong>}</strong></font>
<a name="15_line45" href="#15_line45">45</a>    <strong>catch</strong><font color="4444FF">(</font><font color="#2040a0">Exception</font> <font color="4444FF">&amp;</font> <font color="#2040a0">e</font><font color="4444FF">)</font>
<a name="15_line46" href="#15_line46">46</a>    <font color="4444FF"><strong>{</strong></font>
<a name="15_line47" href="#15_line47">47</a>       <font color="#2040a0">response</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">cimException</font> <font color="4444FF">=</font> <font color="#2040a0">PEGASUS_CIM_EXCEPTION</font><font color="4444FF">(</font><font color="#2040a0">CIM_ERR_FAILED</font>, 
<a name="15_line48" href="#15_line48">48</a> 						     <font color="#2040a0">e</font>.<font color="#2040a0">getMessage</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="15_line49" href="#15_line49">49</a>    <font color="4444FF"><strong>}</strong></font>
<a name="15_line50" href="#15_line50">50</a>    <strong>catch</strong><font color="4444FF">(</font>...<font color="4444FF">)</font>
<a name="15_line51" href="#15_line51">51</a>    <font color="4444FF"><strong>{</strong></font>
<a name="15_line52" href="#15_line52">52</a>    <font color="#2040a0">response</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">cimException</font> <font color="4444FF">=</font> <font color="#2040a0">PEGASUS_CIM_EXCEPTION</font><font color="4444FF">(</font><font color="#2040a0">CIM_ERR_FAILED</font>, 
<a name="15_line53" href="#15_line53">53</a> 						  <font color="#008000">&quot;Internal Error&quot;</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="15_line54" href="#15_line54">54</a>    <font color="4444FF"><strong>}</strong></font>
<a name="15_line55" href="#15_line55">55</a>    <font color="#2040a0">_enqueueResponse</font><font color="4444FF">(</font><font color="#2040a0">request</font>, <font color="#2040a0">response</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="15_line56" href="#15_line56">56</a> 
<a name="15_line57" href="#15_line57">57</a>    <font color="#2040a0">PEG_METHOD_EXIT</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="15_line58" href="#15_line58">58</a> <font color="4444FF"><strong>}</strong></font>
</pre><!-- code2html delete stop -->
</div>


<div class="source">
      
<!-- code2html add -lcc -N 
// will return true if ONE subscription is successful. 
// e.g., if one out of three subscriptions results in a 
// successful delivery, will return true. if zero are 
// successful, returns false. 
// consumers that are absent; i.e., not found by the provider registration 
// manager are returned in the absent_consumer
Boolean  eServerIndicationService::_deliverIndication(
   const Array<CIMInstance> & subscriptions, 
   const CIMInstance & indication,
   Array<CIMObjectPath> & absent_consumers)
{
   
   PEG_METHOD_ENTER (TRC_INDICATION_SERVICE, 
      "eServerIndicationService::_deliverIndication");
   CIMObjectPath consumer;
   CIMInstance provider, providerModule;   
   Boolean ccode = false;
   try 
   {
      for(Uint8 i = 0 ; i < subscriptions.size(); ++i, consumer.clear())
      {
	 if(true == _get_object_path_from_association("Handler", 
						      subscriptions[i],
						      consumer))
	 {

	    // get the name space 
	    if(true == _providerRegManager->lookupConsumerProvider(
		  subscriptions[i].getPath().getNameSpace(),
		  consumer.getClassName(),
		  provider, 
		  providerModule))
	    {
	       
	       CIMConsumeIndicationRequestMessage *request = 
		  new CIMConsumeIndicationRequestMessage(
		     XmlWriter::getNextMessageId (),
		     indication.getPath().getNameSpace(), 
		     indication, 
		     provider, 
		     providerModule, 
		     QueueIdStack(_providerManager, _queueId));
	    
	       AsyncOpNode *op = get_op();
	    
	       AsyncLegacyOperationStart *async_req  = 
		  new AsyncLegacyOperationStart(
		     get_next_xid(), 
		     op, 
		     _providerManager, 
		     request, 
		     _queueId);
	       try 
	       {
		  if( false == SendForget(async_req) )
		  {
		     async_req = static_cast<AsyncLegacyOperationStart *>(op->get_request());
		     if(async_req)
			delete async_req->get_action();
		     delete async_req;
		     delete op;
		     // the consumer may not truly be absent, but we couldn't get 
		     // the message to him. Maybe the service can do something 
		     // with this information. 
		     absent_consumers.append(consumer);
		  }
		  else 
		  {
		     ccode = true;
		  }
	       }
	       catch(...)
	       {

		  async_req = static_cast<AsyncLegacyOperationStart *>(op->get_request());
		  if(async_req)
		     delete async_req->get_action();
		  delete async_req;
		  delete op;
		  // the consumer may not truly be absent, but we couldn't get 
		  // the message to him. Maybe the service can do something 
		  // with this information. 
		  absent_consumers.append(consumer);
	       }
	    } // handler is registered as a consumer provider 
	    else 
	    {
	       absent_consumers.append(consumer);
	    }
	 
	 } // found the handler path 
      } // for each subscription
   } // try 
   catch(...)
   {
      throw;
   }
   
   // each subscription contains a reference to a provider 
   // that can handle the subscription. extract the handler
   // instance from the reference 
   PEG_METHOD_EXIT();
   return ccode;
}
--><!-- code2html delete start --><pre><a name="16_line1" href="#16_line1">  1</a> 
<a name="16_line2" href="#16_line2">  2</a> <font color="#444444">// will return true if ONE subscription is successful. </font>
<a name="16_line3" href="#16_line3">  3</a> <font color="#444444">// e.g., if one out of three subscriptions results in a </font>
<a name="16_line4" href="#16_line4">  4</a> <font color="#444444">// successful delivery, will return true. if zero are </font>
<a name="16_line5" href="#16_line5">  5</a> <font color="#444444">// successful, returns false. </font>
<a name="16_line6" href="#16_line6">  6</a> <font color="#444444">// consumers that are absent; i.e., not found by the provider registration </font>
<a name="16_line7" href="#16_line7">  7</a> <font color="#444444">// manager are returned in the absent_consumer</font>
<a name="16_line8" href="#16_line8">  8</a> <font color="#2040a0">Boolean</font>  <font color="#2040a0">eServerIndicationService</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">_deliverIndication</font><font color="4444FF">(</font>
<a name="16_line9" href="#16_line9">  9</a>    <strong>const</strong> <font color="#2040a0">Array</font><font color="4444FF">&lt;</font><font color="#2040a0">CIMInstance</font><font color="4444FF">&gt;</font> <font color="4444FF">&amp;</font> <font color="#2040a0">subscriptions</font>, 
<a name="16_line10" href="#16_line10"> 10</a>    <strong>const</strong> <font color="#2040a0">CIMInstance</font> <font color="4444FF">&amp;</font> <font color="#2040a0">indication</font>,
<a name="16_line11" href="#16_line11"> 11</a>    <font color="#2040a0">Array</font><font color="4444FF">&lt;</font><font color="#2040a0">CIMObjectPath</font><font color="4444FF">&gt;</font> <font color="4444FF">&amp;</font> <font color="#2040a0">absent_consumers</font><font color="4444FF">)</font>
<a name="16_line12" href="#16_line12"> 12</a> <font color="4444FF"><strong>{</strong></font>
<a name="16_line13" href="#16_line13"> 13</a>    
<a name="16_line14" href="#16_line14"> 14</a>    <font color="#2040a0">PEG_METHOD_ENTER</font> <font color="4444FF">(</font><font color="#2040a0">TRC_INDICATION_SERVICE</font>, 
<a name="16_line15" href="#16_line15"> 15</a>       <font color="#008000">&quot;eServerIndicationService::_deliverIndication&quot;</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="16_line16" href="#16_line16"> 16</a>    <font color="#2040a0">CIMObjectPath</font> <font color="#2040a0">consumer</font><font color="4444FF">;</font>
<a name="16_line17" href="#16_line17"> 17</a>    <font color="#2040a0">CIMInstance</font> <font color="#2040a0">provider</font>, <font color="#2040a0">providerModule</font><font color="4444FF">;</font>   
<a name="16_line18" href="#16_line18"> 18</a>    <font color="#2040a0">Boolean</font> <font color="#2040a0">ccode</font> <font color="4444FF">=</font> <strong>false</strong><font color="4444FF">;</font>
<a name="16_line19" href="#16_line19"> 19</a>    <font color="#2040a0">try</font> 
<a name="16_line20" href="#16_line20"> 20</a>    <font color="4444FF"><strong>{</strong></font>
<a name="16_line21" href="#16_line21"> 21</a>       <strong>for</strong><font color="4444FF">(</font><font color="#2040a0">Uint8</font> <font color="#2040a0">i</font> <font color="4444FF">=</font> <font color="#FF0000">0</font> <font color="4444FF">;</font> <font color="#2040a0">i</font> <font color="4444FF">&lt;</font> <font color="#2040a0">subscriptions</font>.<font color="#2040a0">size</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font> <font color="4444FF">+</font><font color="4444FF">+</font><font color="#2040a0">i</font>, <font color="#2040a0">consumer</font>.<font color="#2040a0">clear</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font>
<a name="16_line22" href="#16_line22"> 22</a>       <font color="4444FF"><strong>{</strong></font>
<a name="16_line23" href="#16_line23"> 23</a> 	 <strong>if</strong><font color="4444FF">(</font><strong>true</strong> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#2040a0">_get_object_path_from_association</font><font color="4444FF">(</font><font color="#008000">&quot;Handler&quot;</font>, 
<a name="16_line24" href="#16_line24"> 24</a> 						      <font color="#2040a0">subscriptions</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font>,
<a name="16_line25" href="#16_line25"> 25</a> 						      <font color="#2040a0">consumer</font><font color="4444FF">)</font><font color="4444FF">)</font>
<a name="16_line26" href="#16_line26"> 26</a> 	 <font color="4444FF"><strong>{</strong></font>
<a name="16_line27" href="#16_line27"> 27</a> 
<a name="16_line28" href="#16_line28"> 28</a> 	    <font color="#444444">// get the name space </font>
<a name="16_line29" href="#16_line29"> 29</a> 	    <strong>if</strong><font color="4444FF">(</font><strong>true</strong> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#2040a0">_providerRegManager</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">lookupConsumerProvider</font><font color="4444FF">(</font>
<a name="16_line30" href="#16_line30"> 30</a> 		  <font color="#2040a0">subscriptions</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font>.<font color="#2040a0">getPath</font><font color="4444FF">(</font><font color="4444FF">)</font>.<font color="#2040a0">getNameSpace</font><font color="4444FF">(</font><font color="4444FF">)</font>,
<a name="16_line31" href="#16_line31"> 31</a> 		  <font color="#2040a0">consumer</font>.<font color="#2040a0">getClassName</font><font color="4444FF">(</font><font color="4444FF">)</font>,
<a name="16_line32" href="#16_line32"> 32</a> 		  <font color="#2040a0">provider</font>, 
<a name="16_line33" href="#16_line33"> 33</a> 		  <font color="#2040a0">providerModule</font><font color="4444FF">)</font><font color="4444FF">)</font>
<a name="16_line34" href="#16_line34"> 34</a> 	    <font color="4444FF"><strong>{</strong></font>
<a name="16_line35" href="#16_line35"> 35</a> 	       
<a name="16_line36" href="#16_line36"> 36</a> 	       <font color="#2040a0">CIMConsumeIndicationRequestMessage</font> <font color="4444FF">*</font><font color="#2040a0">request</font> <font color="4444FF">=</font> 
<a name="16_line37" href="#16_line37"> 37</a> 		  <strong>new</strong> <font color="#2040a0">CIMConsumeIndicationRequestMessage</font><font color="4444FF">(</font>
<a name="16_line38" href="#16_line38"> 38</a> 		     <font color="#2040a0">XmlWriter</font><font color="4444FF">:</font><font color="4444FF">:</font><font color="#2040a0">getNextMessageId</font> <font color="4444FF">(</font><font color="4444FF">)</font>,
<a name="16_line39" href="#16_line39"> 39</a> 		     <font color="#2040a0">indication</font>.<font color="#2040a0">getPath</font><font color="4444FF">(</font><font color="4444FF">)</font>.<font color="#2040a0">getNameSpace</font><font color="4444FF">(</font><font color="4444FF">)</font>, 
<a name="16_line40" href="#16_line40"> 40</a> 		     <font color="#2040a0">indication</font>, 
<a name="16_line41" href="#16_line41"> 41</a> 		     <font color="#2040a0">provider</font>, 
<a name="16_line42" href="#16_line42"> 42</a> 		     <font color="#2040a0">providerModule</font>, 
<a name="16_line43" href="#16_line43"> 43</a> 		     <font color="#2040a0">QueueIdStack</font><font color="4444FF">(</font><font color="#2040a0">_providerManager</font>, <font color="#2040a0">_queueId</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="16_line44" href="#16_line44"> 44</a> 	    
<a name="16_line45" href="#16_line45"> 45</a> 	       <font color="#2040a0">AsyncOpNode</font> <font color="4444FF">*</font><font color="#2040a0">op</font> <font color="4444FF">=</font> <font color="#2040a0">get_op</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="16_line46" href="#16_line46"> 46</a> 	    
<a name="16_line47" href="#16_line47"> 47</a> 	       <font color="#2040a0">AsyncLegacyOperationStart</font> <font color="4444FF">*</font><font color="#2040a0">async_req</font>  <font color="4444FF">=</font> 
<a name="16_line48" href="#16_line48"> 48</a> 		  <strong>new</strong> <font color="#2040a0">AsyncLegacyOperationStart</font><font color="4444FF">(</font>
<a name="16_line49" href="#16_line49"> 49</a> 		     <font color="#2040a0">get_next_xid</font><font color="4444FF">(</font><font color="4444FF">)</font>, 
<a name="16_line50" href="#16_line50"> 50</a> 		     <font color="#2040a0">op</font>, 
<a name="16_line51" href="#16_line51"> 51</a> 		     <font color="#2040a0">_providerManager</font>, 
<a name="16_line52" href="#16_line52"> 52</a> 		     <font color="#2040a0">request</font>, 
<a name="16_line53" href="#16_line53"> 53</a> 		     <font color="#2040a0">_queueId</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="16_line54" href="#16_line54"> 54</a> 	       <font color="#2040a0">try</font> 
<a name="16_line55" href="#16_line55"> 55</a> 	       <font color="4444FF"><strong>{</strong></font>
<a name="16_line56" href="#16_line56"> 56</a> 		  <strong>if</strong><font color="4444FF">(</font> <strong>false</strong> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#2040a0">SendForget</font><font color="4444FF">(</font><font color="#2040a0">async_req</font><font color="4444FF">)</font> <font color="4444FF">)</font>
<a name="16_line57" href="#16_line57"> 57</a> 		  <font color="4444FF"><strong>{</strong></font>
<a name="16_line58" href="#16_line58"> 58</a> 		     <font color="#2040a0">async_req</font> <font color="4444FF">=</font> <strong>static_cast</strong><font color="4444FF">&lt;</font><font color="#2040a0">AsyncLegacyOperationStart</font> <font color="4444FF">*</font><font color="4444FF">&gt;</font><font color="4444FF">(</font><font color="#2040a0">op</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">get_request</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="16_line59" href="#16_line59"> 59</a> 		     <strong>if</strong><font color="4444FF">(</font><font color="#2040a0">async_req</font><font color="4444FF">)</font>
<a name="16_line60" href="#16_line60"> 60</a> 			<strong>delete</strong> <font color="#2040a0">async_req</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">get_action</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="16_line61" href="#16_line61"> 61</a> 		     <strong>delete</strong> <font color="#2040a0">async_req</font><font color="4444FF">;</font>
<a name="16_line62" href="#16_line62"> 62</a> 		     <strong>delete</strong> <font color="#2040a0">op</font><font color="4444FF">;</font>
<a name="16_line63" href="#16_line63"> 63</a> 		     <font color="#444444">// the consumer may not truly be absent, but we couldn't get </font>
<a name="16_line64" href="#16_line64"> 64</a> 		     <font color="#444444">// the message to him. Maybe the service can do something </font>
<a name="16_line65" href="#16_line65"> 65</a> 		     <font color="#444444">// with this information. </font>
<a name="16_line66" href="#16_line66"> 66</a> 		     <font color="#2040a0">absent_consumers</font>.<font color="#2040a0">append</font><font color="4444FF">(</font><font color="#2040a0">consumer</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="16_line67" href="#16_line67"> 67</a> 		  <font color="4444FF"><strong>}</strong></font>
<a name="16_line68" href="#16_line68"> 68</a> 		  <strong>else</strong> 
<a name="16_line69" href="#16_line69"> 69</a> 		  <font color="4444FF"><strong>{</strong></font>
<a name="16_line70" href="#16_line70"> 70</a> 		     <font color="#2040a0">ccode</font> <font color="4444FF">=</font> <strong>true</strong><font color="4444FF">;</font>
<a name="16_line71" href="#16_line71"> 71</a> 		  <font color="4444FF"><strong>}</strong></font>
<a name="16_line72" href="#16_line72"> 72</a> 	       <font color="4444FF"><strong>}</strong></font>
<a name="16_line73" href="#16_line73"> 73</a> 	       <strong>catch</strong><font color="4444FF">(</font>...<font color="4444FF">)</font>
<a name="16_line74" href="#16_line74"> 74</a> 	       <font color="4444FF"><strong>{</strong></font>
<a name="16_line75" href="#16_line75"> 75</a> 
<a name="16_line76" href="#16_line76"> 76</a> 		  <font color="#2040a0">async_req</font> <font color="4444FF">=</font> <strong>static_cast</strong><font color="4444FF">&lt;</font><font color="#2040a0">AsyncLegacyOperationStart</font> <font color="4444FF">*</font><font color="4444FF">&gt;</font><font color="4444FF">(</font><font color="#2040a0">op</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">get_request</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="16_line77" href="#16_line77"> 77</a> 		  <strong>if</strong><font color="4444FF">(</font><font color="#2040a0">async_req</font><font color="4444FF">)</font>
<a name="16_line78" href="#16_line78"> 78</a> 		     <strong>delete</strong> <font color="#2040a0">async_req</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">get_action</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="16_line79" href="#16_line79"> 79</a> 		  <strong>delete</strong> <font color="#2040a0">async_req</font><font color="4444FF">;</font>
<a name="16_line80" href="#16_line80"> 80</a> 		  <strong>delete</strong> <font color="#2040a0">op</font><font color="4444FF">;</font>
<a name="16_line81" href="#16_line81"> 81</a> 		  <font color="#444444">// the consumer may not truly be absent, but we couldn't get </font>
<a name="16_line82" href="#16_line82"> 82</a> 		  <font color="#444444">// the message to him. Maybe the service can do something </font>
<a name="16_line83" href="#16_line83"> 83</a> 		  <font color="#444444">// with this information. </font>
<a name="16_line84" href="#16_line84"> 84</a> 		  <font color="#2040a0">absent_consumers</font>.<font color="#2040a0">append</font><font color="4444FF">(</font><font color="#2040a0">consumer</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="16_line85" href="#16_line85"> 85</a> 	       <font color="4444FF"><strong>}</strong></font>
<a name="16_line86" href="#16_line86"> 86</a> 	    <font color="4444FF"><strong>}</strong></font> <font color="#444444">// handler is registered as a consumer provider </font>
<a name="16_line87" href="#16_line87"> 87</a> 	    <strong>else</strong> 
<a name="16_line88" href="#16_line88"> 88</a> 	    <font color="4444FF"><strong>{</strong></font>
<a name="16_line89" href="#16_line89"> 89</a> 	       <font color="#2040a0">absent_consumers</font>.<font color="#2040a0">append</font><font color="4444FF">(</font><font color="#2040a0">consumer</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="16_line90" href="#16_line90"> 90</a> 	    <font color="4444FF"><strong>}</strong></font>
<a name="16_line91" href="#16_line91"> 91</a> 	 
<a name="16_line92" href="#16_line92"> 92</a> 	 <font color="4444FF"><strong>}</strong></font> <font color="#444444">// found the handler path </font>
<a name="16_line93" href="#16_line93"> 93</a>       <font color="4444FF"><strong>}</strong></font> <font color="#444444">// for each subscription</font>
<a name="16_line94" href="#16_line94"> 94</a>    <font color="4444FF"><strong>}</strong></font> <font color="#444444">// try </font>
<a name="16_line95" href="#16_line95"> 95</a>    <strong>catch</strong><font color="4444FF">(</font>...<font color="4444FF">)</font>
<a name="16_line96" href="#16_line96"> 96</a>    <font color="4444FF"><strong>{</strong></font>
<a name="16_line97" href="#16_line97"> 97</a>       <strong>throw</strong><font color="4444FF">;</font>
<a name="16_line98" href="#16_line98"> 98</a>    <font color="4444FF"><strong>}</strong></font>
<a name="16_line99" href="#16_line99"> 99</a>    
<a name="16_line100" href="#16_line100">100</a>    <font color="#444444">// each subscription contains a reference to a provider </font>
<a name="16_line101" href="#16_line101">101</a>    <font color="#444444">// that can handle the subscription. extract the handler</font>
<a name="16_line102" href="#16_line102">102</a>    <font color="#444444">// instance from the reference </font>
<a name="16_line103" href="#16_line103">103</a>    <font color="#2040a0">PEG_METHOD_EXIT</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
<a name="16_line104" href="#16_line104">104</a>    <strong>return</strong> <font color="#2040a0">ccode</font><font color="4444FF">;</font>
<a name="16_line105" href="#16_line105">105</a> <font color="4444FF"><strong>}</strong></font>
</pre><!-- code2html delete stop -->
</div>
    <hr>
    <address><a href="mailto:mdday@us.ibm.com">Michael Day (work)</a></address>
    <address><a href="mailto:md@soft-hackle.net">Michael Day (home)</a></address>
    <!-- Created: Fri Dec 27 16:05:58 EST 2002 -->

<!-- hhmts start -->
Last modified: Thu Feb 13 11:46:43 EST 2003
<!-- hhmts end -->
  </body>
</html>

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2